diff --git a/.gitignore b/.gitignore index 6525a7973e..ebbf26dc2f 100644 --- a/.gitignore +++ b/.gitignore @@ -58,6 +58,7 @@ iphone/*/build/* xcode/**/xcuserdata xcode/**/xcshareddata tools/emacsmode/build +**/DerivedData/* # GeneratedFiles version/version.hpp @@ -76,7 +77,7 @@ bada/Maps/*.zip # data data/intermediate_data -data/*.mwm +data/**/*.mwm !data/World.mwm !data/WorldCoasts.mwm # temporary files for downloader diff --git a/3party/fribidi/config.h b/3party/fribidi/config.h index 76e7b8d642..80280a1c88 100644 --- a/3party/fribidi/config.h +++ b/3party/fribidi/config.h @@ -1,4 +1,4 @@ -#include "../../std/target_os.hpp" +#include "std/target_os.hpp" #if defined(OMIM_OS_MAC) #include "config_mac.h" diff --git a/3party/jansson/jansson_handle.hpp b/3party/jansson/jansson_handle.hpp index 1eb5efedbe..efdeccb168 100644 --- a/3party/jansson/jansson_handle.hpp +++ b/3party/jansson/jansson_handle.hpp @@ -1,6 +1,6 @@ #pragma once -#include "../../std/algorithm.hpp" +#include "std/algorithm.hpp" struct json_struct_t; diff --git a/3party/jansson/myjansson.hpp b/3party/jansson/myjansson.hpp index 0f9c2b0ecc..d64f213477 100644 --- a/3party/jansson/myjansson.hpp +++ b/3party/jansson/myjansson.hpp @@ -2,7 +2,7 @@ #include "jansson_handle.hpp" -#include "../../base/exception.hpp" +#include "base/exception.hpp" #include diff --git a/3party/sdf_image/sdf_image.cpp b/3party/sdf_image/sdf_image.cpp index 9e259dc644..912a0185ad 100644 --- a/3party/sdf_image/sdf_image.cpp +++ b/3party/sdf_image/sdf_image.cpp @@ -1,16 +1,13 @@ /* Copyright (C) 2009 by Stefan Gustavson - 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 @@ -20,7 +17,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include "drape/sdf_image.h" +#include "sdf_image.h" #include "base/math.hpp" #include "base/scope_guard.hpp" @@ -28,7 +25,7 @@ THE SOFTWARE. #include "std/limits.hpp" #include "std/bind.hpp" -namespace dp +namespace sdf_image { namespace @@ -508,4 +505,4 @@ bool SdfImage::Transform(int baseIndex, int offset, int dx, int dy, vector m_data; }; -} // namespace dp +} // namespace sdf_image diff --git a/android/UnitTests/jni/mock.cpp b/android/UnitTests/jni/mock.cpp index 2177ea92a2..6004160caf 100644 --- a/android/UnitTests/jni/mock.cpp +++ b/android/UnitTests/jni/mock.cpp @@ -189,11 +189,6 @@ namespace android_tests bool HasAvailableSpaceForWriting(uint64_t size) const{ return true; } - static void RunOnGuiThreadImpl(TFunctor const & fn, bool blocking = false) - { - ASSERT(false, ()); - } - static Platform & Instance() { static Platform platform; diff --git a/android/assets/colors.txt b/android/assets/colors.txt new file mode 120000 index 0000000000..ab5dad0420 --- /dev/null +++ b/android/assets/colors.txt @@ -0,0 +1 @@ +../../data/colors.txt \ No newline at end of file diff --git a/android/assets/patterns.txt b/android/assets/patterns.txt new file mode 120000 index 0000000000..ca0c3453a9 --- /dev/null +++ b/android/assets/patterns.txt @@ -0,0 +1 @@ +../../data/patterns.txt \ No newline at end of file diff --git a/android/assets/resources-default b/android/assets/resources-default new file mode 120000 index 0000000000..1b95aa04a1 --- /dev/null +++ b/android/assets/resources-default @@ -0,0 +1 @@ +../../data/resources-default \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 092624c03d..93f7d67d92 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -256,7 +256,7 @@ android { // We don't compress these extensions in assets/ because our random FileReader can't read zip-compressed files from apk aaptOptions { - noCompress 'txt', 'bin', 'skn', 'html', 'png', 'json', 'mwm', 'ttf' + noCompress 'txt', 'bin', 'html', 'png', 'json', 'mwm', 'ttf', 'sdf', 'ui' ignoreAssetsPattern "!.svn:!.git:!.DS_Store:!*.scc:.*:_*:!CVS:!thumbs.db:!picasa.ini:!*~" } diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 67ec496d72..1291ef652b 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -25,7 +25,7 @@ define add_prebuild_static_lib include $(PREBUILT_STATIC_LIBRARY) endef -prebuild_static_libs := osrm protobuf tomcrypt jansson minizip fribidi freetype expat base coding geometry anim platform graphics indexer storage search routing gui render map stats_client succinct opening_hours +prebuild_static_libs := osrm protobuf tomcrypt jansson minizip fribidi freetype expat base coding geometry platform indexer storage search routing drape drape_frontend map stats_client succinct opening_hours $(foreach item,$(prebuild_static_libs),$(eval $(call add_prebuild_static_lib,$(item)))) @@ -40,7 +40,7 @@ LOCAL_CPP_FEATURES += exceptions rtti LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../ LOCAL_MODULE := mapswithme -LOCAL_STATIC_LIBRARIES := map render gui routing search storage indexer graphics platform anim geometry coding base expat freetype fribidi minizip jansson tomcrypt protobuf osrm stats_client succinct opening_hours +LOCAL_STATIC_LIBRARIES := map drape_frontend routing search storage indexer drape platform geometry coding base expat freetype fribidi minizip jansson tomcrypt protobuf osrm stats_client succinct opening_hours LOCAL_CFLAGS := -ffunction-sections -fdata-sections -Wno-extern-c-compat ifneq ($(NDK_DEBUG),1) @@ -60,21 +60,18 @@ LOCAL_HEADER_FILES := \ ../../private.h \ com/mapswithme/core/jni_helper.hpp \ com/mapswithme/core/logging.hpp \ - com/mapswithme/core/render_context.hpp \ com/mapswithme/maps/Framework.hpp \ com/mapswithme/maps/MapStorage.hpp \ com/mapswithme/platform/Platform.hpp \ + com/mapswithme/platform/MethodRef.hpp \ com/mapswithme/platform/http_thread_android.hpp \ - nv_thread/nv_thread.hpp \ - nv_event/nv_event_queue.hpp \ - nv_event/nv_event.hpp \ - nv_event/nv_keycode_mapping.hpp \ - nv_event/scoped_profiler.hpp + com/mapswithme/opengl/android_gl_utils.hpp \ + com/mapswithme/opengl/androidoglcontext.hpp \ + com/mapswithme/opengl/androidoglcontextfactory.hpp \ LOCAL_SRC_FILES := \ com/mapswithme/core/jni_helper.cpp \ com/mapswithme/core/logging.cpp \ - com/mapswithme/core/render_context.cpp \ com/mapswithme/country/country_helper.cpp \ com/mapswithme/country/CountryTree.cpp \ com/mapswithme/country/ActiveCountryTree.cpp \ @@ -83,10 +80,8 @@ LOCAL_SRC_FILES := \ com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp \ com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp \ com/mapswithme/maps/sound/tts.cpp \ - com/mapswithme/maps/VideoTimer.cpp \ com/mapswithme/maps/MapFragment.cpp \ com/mapswithme/maps/MwmApplication.cpp \ - com/mapswithme/maps/Lifecycle.cpp \ com/mapswithme/maps/LocationState.cpp \ com/mapswithme/maps/MapStorage.cpp \ com/mapswithme/maps/DownloadResourcesActivity.cpp \ @@ -97,15 +92,15 @@ LOCAL_SRC_FILES := \ com/mapswithme/platform/Platform.cpp \ com/mapswithme/platform/HttpThread.cpp \ com/mapswithme/platform/Language.cpp \ + com/mapswithme/platform/MethodRef.cpp \ com/mapswithme/platform/PThreadImpl.cpp \ com/mapswithme/util/StringUtils.cpp \ - com/mapswithme/util/Config.cpp \ - nv_thread/nv_thread.cpp \ - nv_event/nv_event_queue.cpp \ - nv_event/nv_event.cpp \ - nv_time/nv_time.cpp \ + com/mapswithme/util/Config.cpp \ + com/mapswithme/opengl/android_gl_utils.cpp \ + com/mapswithme/opengl/androidoglcontext.cpp \ + com/mapswithme/opengl/androidoglcontextfactory.cpp \ -LOCAL_LDLIBS := -llog -lGLESv2 -latomic -lz +LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2 -latomic -lz LOCAL_LDLIBS += -Wl,--gc-sections diff --git a/android/jni/Application.mk b/android/jni/Application.mk index 6a02286c25..e7de93f3c8 100644 --- a/android/jni/Application.mk +++ b/android/jni/Application.mk @@ -15,7 +15,8 @@ endif LOCAL_PATH := $(call my-dir) APP_CFLAGS += -I$(LOCAL_PATH)/../../3party/boost \ - -I$(LOCAL_PATH)/../../3party/protobuf/src + -I$(LOCAL_PATH)/../../3party/protobuf/src \ + -I$(LOCAL_PATH)/../../3party/glm APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti diff --git a/android/jni/com/mapswithme/core/jni_helper.cpp b/android/jni/com/mapswithme/core/jni_helper.cpp index 70b2db95cd..904b49224b 100644 --- a/android/jni/com/mapswithme/core/jni_helper.cpp +++ b/android/jni/com/mapswithme/core/jni_helper.cpp @@ -30,8 +30,6 @@ extern "C" g_jvm = jvm; jni::InitSystemLog(); jni::InitAssertLog(); - // @TODO remove line below after refactoring - InitNVEvent(jvm); JNIEnv * env = jni::GetEnv(); // TODO diff --git a/android/jni/com/mapswithme/country/ActiveCountryTree.cpp b/android/jni/com/mapswithme/country/ActiveCountryTree.cpp index 3434a6585f..461986a53f 100644 --- a/android/jni/com/mapswithme/country/ActiveCountryTree.cpp +++ b/android/jni/com/mapswithme/country/ActiveCountryTree.cpp @@ -103,8 +103,10 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_country_ActiveCountryTree_showOnMap(JNIEnv * env, jclass clazz, jint group, jint position) { - GetMapLayout().ShowMap(ToGroup(group), position); - g_framework->DontLoadState(); + g_framework->PostDrapeTask([group, position]() + { + GetMapLayout().ShowMap(ToGroup(group), position); + }); } JNIEXPORT void JNICALL diff --git a/android/jni/com/mapswithme/country/CountryTree.cpp b/android/jni/com/mapswithme/country/CountryTree.cpp index e78cad39b1..ce534974be 100644 --- a/android/jni/com/mapswithme/country/CountryTree.cpp +++ b/android/jni/com/mapswithme/country/CountryTree.cpp @@ -92,8 +92,10 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_country_CountryTree_showLeafOnMap(JNIEnv * env, jclass clazz, jint position) { - GetTree().ShowLeafOnMap(position); - g_framework->DontLoadState(); + g_framework->PostDrapeTask([position]() + { + GetTree().ShowLeafOnMap(position); + }); } JNIEXPORT jlong JNICALL diff --git a/android/jni/com/mapswithme/maps/DownloadResourcesActivity.cpp b/android/jni/com/mapswithme/maps/DownloadResourcesActivity.cpp index 08d15d6457..9406a39ba3 100644 --- a/android/jni/com/mapswithme/maps/DownloadResourcesActivity.cpp +++ b/android/jni/com/mapswithme/maps/DownloadResourcesActivity.cpp @@ -55,9 +55,9 @@ extern "C" { switch (pl.GetWritableStorageStatus(fileSize)) { - case Platform::STORAGE_DISCONNECTED: return ERR_STORAGE_DISCONNECTED; - case Platform::NOT_ENOUGH_SPACE: return ERR_NOT_ENOUGH_FREE_SPACE; - default: return fileSize; + case Platform::STORAGE_DISCONNECTED: return ERR_STORAGE_DISCONNECTED; + case Platform::NOT_ENOUGH_SPACE: return ERR_NOT_ENOUGH_FREE_SPACE; + default: return fileSize; } } diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 14515c25aa..92ca2a8b39 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -1,21 +1,20 @@ #include "Framework.hpp" -#include "VideoTimer.hpp" #include "MapStorage.hpp" +#include "../opengl/androidoglcontextfactory.hpp" + #include "../core/jni_helper.hpp" -#include "../core/render_context.hpp" #include "../country/country_helper.hpp" #include "../platform/Platform.hpp" -#include "map/information_display.hpp" #include "map/user_mark.hpp" -#include "gui/controller.hpp" - -#include "graphics/opengl/framebuffer.hpp" -#include "graphics/opengl/opengl.hpp" +#include "drape_frontend/visual_params.hpp" +#include "drape_frontend/user_event_stream.hpp" +#include "drape/pointers.hpp" +#include "drape/visual_scale.hpp" #include "coding/file_container.hpp" #include "coding/file_name_utils.hpp" @@ -34,15 +33,6 @@ #include "base/math.hpp" #include "base/logging.hpp" -#include "std/chrono.hpp" - -namespace -{ -const unsigned LONG_TOUCH_MS = 1000; -const unsigned SHORT_TOUCH_MS = 250; -const double DOUBLE_TOUCH_S = SHORT_TOUCH_MS / 1000.0; -} - android::Framework * g_framework = 0; using namespace storage; @@ -57,712 +47,519 @@ namespace return g_framework->NativeFramework(); } -} +} // namespace namespace android { - void Framework::CallRepaint() {} - Framework::Framework() - : m_mask(0), - m_isCleanSingleClick(false), - m_doLoadState(true), - m_lastCompass(0.0), - m_wasLongClick(false), - m_densityDpi(0), - m_screenWidth(0), - m_screenHeight(0), - m_currentSlotID(0) +enum MultiTouchAction +{ + MULTITOUCH_UP = 0x00000001, + MULTITOUCH_DOWN = 0x00000002, + MULTITOUCH_MOVE = 0x00000003, + MULTITOUCH_CANCEL = 0x00000004 +}; + +Framework::Framework() + : m_lastCompass(0.0) + , m_currentMode(location::MODE_UNKNOWN_POSITION) + , m_isCurrentModeInitialized(false) +{ + ASSERT_EQUAL ( g_framework, 0, () ); + g_framework = this; + m_activeMapsConnectionID = m_work.GetCountryTree().GetActiveMapLayout().AddListener(this); +} + +Framework::~Framework() +{ + m_work.GetCountryTree().GetActiveMapLayout().RemoveListener(m_activeMapsConnectionID); +} + +void Framework::OnLocationError(int errorCode) +{ + m_work.OnLocationError(static_cast(errorCode)); +} + +void Framework::OnLocationUpdated(location::GpsInfo const & info) +{ + m_work.OnLocationUpdate(info); +} + +void Framework::OnCompassUpdated(location::CompassInfo const & info, bool forceRedraw) +{ + static double const COMPASS_THRESHOLD = my::DegToRad(1.0); + + /// @todo Do not emit compass bearing too often while we are passing it through nv-queue. + /// Need to make more experiments in future. + if (forceRedraw || fabs(ang::GetShortestDistance(m_lastCompass, info.m_bearing)) >= COMPASS_THRESHOLD) { - ASSERT_EQUAL ( g_framework, 0, () ); - g_framework = this; - - m_videoTimer = new VideoTimer(bind(&Framework::CallRepaint, this)); - m_activeMapsConnectionID = m_work.GetCountryTree().GetActiveMapLayout().AddListener(this); - } - - Framework::~Framework() - { - m_work.GetCountryTree().GetActiveMapLayout().RemoveListener(m_activeMapsConnectionID); - delete m_videoTimer; - } - - void Framework::OnLocationError(int errorCode) - { - m_work.OnLocationError(static_cast(errorCode)); - } - - void Framework::OnLocationUpdated(location::GpsInfo const & info) - { - Platform::RunOnGuiThreadImpl(bind(&::Framework::OnLocationUpdate, ref(m_work), info)); - } - - void Framework::OnCompassUpdated(location::CompassInfo const & info, bool force) - { - static double const COMPASS_THRESHOLD = my::DegToRad(1.0); - - /// @todo Do not emit compass bearing too often while we are passing it through nv-queue. - /// Need to make more experiments in future. - if (force || fabs(ang::GetShortestDistance(m_lastCompass, info.m_bearing)) >= COMPASS_THRESHOLD) - { - m_lastCompass = info.m_bearing; - Platform::RunOnGuiThreadImpl(bind(&::Framework::OnCompassUpdate, ref(m_work), info)); - } - } - - void Framework::UpdateCompassSensor(int ind, float * arr) - { - m_sensors[ind].Next(arr); - } - - void Framework::DeleteRenderPolicy() - { - m_work.SaveState(); - LOG(LINFO, ("Clearing current render policy.")); - m_work.SetRenderPolicy(nullptr); - m_work.EnterBackground(); - } - - void Framework::SetBestDensity(int densityDpi, RenderPolicy::Params & params) - { - typedef pair P; - P dens[] = { - P(120, graphics::EDensityLDPI), - P(160, graphics::EDensityMDPI), - P(240, graphics::EDensityHDPI), - P(320, graphics::EDensityXHDPI), - P(480, graphics::EDensityXXHDPI) - }; - - int prevRange = numeric_limits::max(); - int bestRangeIndex = 0; - for (int i = 0; i < ARRAY_SIZE(dens); i++) - { - int currRange = abs(densityDpi - dens[i].first); - if (currRange <= prevRange) - { - // it is better, take index - bestRangeIndex = i; - prevRange = currRange; - } - else - break; - } - - params.m_density = dens[bestRangeIndex].second; - params.m_exactDensityDPI = densityDpi; - } - - bool Framework::InitRenderPolicyImpl(int densityDpi, int screenWidth, int screenHeight) - { - graphics::ResourceManager::Params rmParams; - - rmParams.m_videoMemoryLimit = 30 * 1024 * 1024; - rmParams.m_texFormat = graphics::Data4Bpp; - rmParams.m_exactDensityDPI = densityDpi; - - RenderPolicy::Params rpParams; - - rpParams.m_videoTimer = m_videoTimer; - rpParams.m_useDefaultFB = true; - rpParams.m_rmParams = rmParams; - rpParams.m_primaryRC = make_shared(); - - SetBestDensity(densityDpi, rpParams); - - rpParams.m_skinName = "basic.skn"; - LOG(LINFO, ("Using", graphics::convert(rpParams.m_density), "resources")); - - rpParams.m_screenWidth = screenWidth; - rpParams.m_screenHeight = screenHeight; - - try - { - m_work.SetRenderPolicy(CreateRenderPolicy(rpParams)); - m_work.InitGuiSubsystem(); - } - catch (graphics::gl::platform_unsupported const & e) - { - LOG(LINFO, ("This android platform is unsupported, reason:", e.what())); - return false; - } - - return true; - } - - bool Framework::InitRenderPolicy(int densityDpi, int screenWidth, int screenHeight) - { - if (!InitRenderPolicyImpl(densityDpi, screenWidth, screenHeight)) - return false; - - if (m_doLoadState) - LoadState(); - else - m_doLoadState = true; - - m_work.SetUpdatesEnabled(true); - m_work.EnterForeground(); - - m_densityDpi = densityDpi; - m_screenWidth = screenWidth; - m_screenHeight = screenHeight; - - return true; - } - - void Framework::SetMapStyle(MapStyle mapStyle) - { - if (m_work.GetMapStyle() == mapStyle) - return; - - bool const hasRenderPolicy = (nullptr != m_work.GetRenderPolicy()); - - if (hasRenderPolicy) - { - // Drop old render policy. - m_work.SetRenderPolicy(nullptr); - - m_work.SetMapStyle(mapStyle); - - // Construct new render policy. - if (!InitRenderPolicyImpl(m_densityDpi, m_screenWidth, m_screenHeight)) - return; - - m_work.SetUpdatesEnabled(true); - } - else - { - // Just set the flag, a new render policy will be initialized with this flag. - m_work.SetMapStyle(mapStyle); - } - } - - MapStyle Framework::GetMapStyle() const - { - return m_work.GetMapStyle(); - } - - Storage & Framework::Storage() - { - return m_work.Storage(); - } - - CountryStatusDisplay * Framework::GetCountryStatusDisplay() - { - return m_work.GetCountryStatusDisplay(); - } - - void Framework::ShowCountry(TIndex const & idx, bool zoomToDownloadButton) - { - m_doLoadState = false; - - if (zoomToDownloadButton) - { - m2::RectD const rect = m_work.GetCountryBounds(idx); - double const lon = MercatorBounds::XToLon(rect.Center().x); - double const lat = MercatorBounds::YToLat(rect.Center().y); - m_work.ShowRect(lat, lon, 10); - } - else - m_work.ShowCountry(idx); - } - - TStatus Framework::GetCountryStatus(TIndex const & idx) const - { - return m_work.GetCountryStatus(idx); - } - - void Framework::Resize(int w, int h) - { - m_work.OnSize(w, h); - } - - void Framework::DrawFrame() - { - if (m_work.NeedRedraw()) - { - m_work.SetNeedRedraw(false); - - shared_ptr paintEvent(new PaintEvent(m_work.GetRenderPolicy()->GetDrawer().get())); - - m_work.BeginPaint(paintEvent); - m_work.DoPaint(paintEvent); - - NVEventSwapBuffersEGL(); - - m_work.EndPaint(paintEvent); - } - } - - void Framework::Move(int mode, double x, double y) - { - DragEvent e(x, y); - switch (mode) - { - case 0: m_work.StartDrag(e); break; - case 1: m_work.DoDrag(e); break; - case 2: m_work.StopDrag(e); break; - } - } - - void Framework::Zoom(int mode, double x1, double y1, double x2, double y2) - { - ScaleEvent e(x1, y1, x2, y2); - switch (mode) - { - case 0: m_work.StartScale(e); break; - case 1: m_work.DoScale(e); break; - case 2: m_work.StopScale(e); break; - } - } - - void Framework::StartTouchTask(double x, double y, unsigned ms) - { - KillTouchTask(); - m_deferredTask.reset(new DeferredTask( - bind(&android::Framework::OnProcessTouchTask, this, x, y, ms), milliseconds(ms))); - } - - void Framework::KillTouchTask() { m_deferredTask.reset(); } - - /// @param[in] mask Active pointers bits : 0x0 - no, 0x1 - (x1, y1), 0x2 - (x2, y2), 0x3 - (x1, y1)(x2, y2). - void Framework::Touch(int action, int mask, double x1, double y1, double x2, double y2) - { - NVMultiTouchEventType eventType = static_cast(action); - - // Check if we touch is canceled or we get coordinates NOT from the first pointer. - if ((mask != 0x1) || (eventType == NV_MULTITOUCH_CANCEL)) - { - if (mask == 0x1) - m_work.GetGuiController()->OnTapCancelled(m2::PointD(x1, y1)); - - m_isCleanSingleClick = false; - KillTouchTask(); - } - else - { - ASSERT_EQUAL(mask, 0x1, ()); - - if (eventType == NV_MULTITOUCH_DOWN) - { - KillTouchTask(); - - m_wasLongClick = false; - m_isCleanSingleClick = true; - m_lastX1 = x1; - m_lastY1 = y1; - - if (m_work.GetGuiController()->OnTapStarted(m2::PointD(x1, y1))) - return; - - StartTouchTask(x1, y1, LONG_TOUCH_MS); - } - - if (eventType == NV_MULTITOUCH_MOVE) - { - double const minDist = m_work.GetVisualScale() * 10.0; - if ((fabs(x1 - m_lastX1) > minDist) || (fabs(y1 - m_lastY1) > minDist)) - { - m_isCleanSingleClick = false; - KillTouchTask(); - } - - if (m_work.GetGuiController()->OnTapMoved(m2::PointD(x1, y1))) - return; - } - - if (eventType == NV_MULTITOUCH_UP) - { - KillTouchTask(); - - if (m_work.GetGuiController()->OnTapEnded(m2::PointD(x1, y1))) - return; - - if (!m_wasLongClick && m_isCleanSingleClick) - { - if (m_doubleClickTimer.ElapsedSeconds() <= DOUBLE_TOUCH_S) - { - // performing double-click - m_work.ScaleToPoint(ScaleToPointEvent(x1, y1, 1.5)); - } - else - { - // starting single touch task - StartTouchTask(x1, y1, SHORT_TOUCH_MS); - - // starting double click - m_doubleClickTimer.Reset(); - } - } - else - m_wasLongClick = false; - } - } - - // general case processing - if (m_mask != mask) - { - if (m_mask == 0x0) - { - if (mask == 0x1) - m_work.StartDrag(DragEvent(x1, y1)); - - if (mask == 0x2) - m_work.StartDrag(DragEvent(x2, y2)); - - if (mask == 0x3) - m_work.StartScale(ScaleEvent(x1, y1, x2, y2)); - } - - if (m_mask == 0x1) - { - m_work.StopDrag(DragEvent(x1, y1)); - - if (mask == 0x0) - { - if ((eventType != NV_MULTITOUCH_UP) && (eventType != NV_MULTITOUCH_CANCEL)) - LOG(LWARNING, ("should be NV_MULTITOUCH_UP or NV_MULTITOUCH_CANCEL")); - } - - if (m_mask == 0x2) - m_work.StartDrag(DragEvent(x2, y2)); - - if (mask == 0x3) - m_work.StartScale(ScaleEvent(x1, y1, x2, y2)); - } - - if (m_mask == 0x2) - { - m_work.StopDrag(DragEvent(x2, y2)); - - if (mask == 0x0) - { - if ((eventType != NV_MULTITOUCH_UP) && (eventType != NV_MULTITOUCH_CANCEL)) - LOG(LWARNING, ("should be NV_MULTITOUCH_UP or NV_MULTITOUCH_CANCEL")); - } - - if (mask == 0x1) - m_work.StartDrag(DragEvent(x1, y1)); - - if (mask == 0x3) - m_work.StartScale(ScaleEvent(x1, y1, x2, y2)); - } - - if (m_mask == 0x3) - { - m_work.StopScale(ScaleEvent(m_x1, m_y1, m_x2, m_y2)); - - if (eventType == NV_MULTITOUCH_MOVE) - { - if (mask == 0x1) - m_work.StartDrag(DragEvent(x1, y1)); - - if (mask == 0x2) - m_work.StartDrag(DragEvent(x2, y2)); - } - else - mask = 0; - } - } - else - { - if (eventType == NV_MULTITOUCH_MOVE) - { - if (m_mask == 0x1) - m_work.DoDrag(DragEvent(x1, y1)); - if (m_mask == 0x2) - m_work.DoDrag(DragEvent(x2, y2)); - if (m_mask == 0x3) - m_work.DoScale(ScaleEvent(x1, y1, x2, y2)); - } - - if ((eventType == NV_MULTITOUCH_CANCEL) || (eventType == NV_MULTITOUCH_UP)) - { - if (m_mask == 0x1) - m_work.StopDrag(DragEvent(x1, y1)); - if (m_mask == 0x2) - m_work.StopDrag(DragEvent(x2, y2)); - if (m_mask == 0x3) - m_work.StopScale(ScaleEvent(m_x1, m_y1, m_x2, m_y2)); - mask = 0; - } - } - - m_x1 = x1; - m_y1 = y1; - m_x2 = x2; - m_y2 = y2; - m_mask = mask; - } - - void Framework::LoadState() - { - if (!m_work.LoadState()) - m_work.ShowAll(); - } - - void Framework::SaveState() - { - m_work.SaveState(); - } - - void Framework::Invalidate() - { - m_work.Invalidate(); - } - - void Framework::SetupMeasurementSystem() - { - m_work.SetupMeasurementSystem(); - } - - void Framework::AddLocalMaps() - { - m_work.RegisterAllMaps(); - } - - void Framework::RemoveLocalMaps() - { - m_work.DeregisterAllMaps(); - } - - TIndex Framework::GetCountryIndex(double lat, double lon) const - { - return m_work.GetCountryIndex(MercatorBounds::FromLatLon(lat, lon)); - } - - string Framework::GetCountryCode(double lat, double lon) const - { - return m_work.GetCountryCode(MercatorBounds::FromLatLon(lat, lon)); - } - - string Framework::GetCountryNameIfAbsent(m2::PointD const & pt) const - { - TIndex const idx = m_work.GetCountryIndex(pt); - TStatus const status = m_work.GetCountryStatus(idx); - if (status != TStatus::EOnDisk && status != TStatus::EOnDiskOutOfDate) - return m_work.GetCountryName(idx); - else - return string(); - } - - m2::PointD Framework::GetViewportCenter() const - { - return m_work.GetViewportCenter(); - } - - void Framework::AddString(string const & name, string const & value) - { - m_work.AddString(name, value); - } - - void Framework::Scale(double k) - { - m_work.Scale(k); - } - - ::Framework * Framework::NativeFramework() - { - return &m_work; - } - - void Framework::OnProcessTouchTask(double x, double y, unsigned ms) - { - m_wasLongClick = (ms == LONG_TOUCH_MS); - GetPinClickManager().OnShowMark(m_work.GetUserMark(m2::PointD(x, y), m_wasLongClick)); - } - - BookmarkAndCategory Framework::AddBookmark(size_t cat, m2::PointD const & pt, BookmarkData & bm) - { - return BookmarkAndCategory(cat, m_work.AddBookmark(cat, pt, bm)); - } - - void Framework::ReplaceBookmark(BookmarkAndCategory const & ind, BookmarkData & bm) - { - m_work.ReplaceBookmark(ind.first, ind.second, bm); - } - - size_t Framework::ChangeBookmarkCategory(BookmarkAndCategory const & ind, size_t newCat) - { - BookmarkCategory * pOld = m_work.GetBmCategory(ind.first); - Bookmark const * oldBm = pOld->GetBookmark(ind.second); - m2::PointD pt = oldBm->GetOrg(); - BookmarkData bm(oldBm->GetName(), oldBm->GetType(), oldBm->GetDescription(), - oldBm->GetScale(), oldBm->GetTimeStamp()); - - pOld->DeleteBookmark(ind.second); - pOld->SaveToKMLFile(); - - return AddBookmark(newCat, pt, bm).second; - } - - bool Framework::ShowMapForURL(string const & url) - { - /// @todo this is weird hack, we should reconsider Android lifecycle handling design - m_doLoadState = false; - - return m_work.ShowMapForURL(url); - } - - void Framework::DeactivatePopup() - { - GetPinClickManager().RemovePin(); - } - - string Framework::GetOutdatedCountriesString() - { - vector countries; - Storage().GetOutdatedCountries(countries); - - string res; - for (size_t i = 0; i < countries.size(); ++i) - { - res += countries[i]->Name(); - if (i < countries.size() - 1) - res += ", "; - } - return res; - } - - void Framework::ShowTrack(int category, int track) - { - Track const * nTrack = NativeFramework()->GetBmCategory(category)->GetTrack(track); - m_doLoadState = false; - NativeFramework()->ShowTrack(*nTrack); - } - - void Framework::SetCountryTreeListener(shared_ptr objPtr) - { - m_javaCountryListener = objPtr; - m_work.GetCountryTree().SetListener(this); - } - - void Framework::ResetCountryTreeListener() - { - m_work.GetCountryTree().ResetListener(); - m_javaCountryListener.reset(); - } - - int Framework::AddActiveMapsListener(shared_ptr obj) - { - m_javaActiveMapListeners[m_currentSlotID] = obj; - return m_currentSlotID++; - } - - void Framework::RemoveActiveMapsListener(int slotID) - { - m_javaActiveMapListeners.erase(slotID); - } - ////////////////////////////////////////////////////////////////////////////////////////// - void Framework::ItemStatusChanged(int childPosition) - { - if (m_javaCountryListener == NULL) - return; - - JNIEnv * env = jni::GetEnv(); - jmethodID const methodID = jni::GetJavaMethodID(env, - *m_javaCountryListener, - "onItemStatusChanged", - "(I)V"); - ASSERT ( methodID, () ); - - env->CallVoidMethod(*m_javaCountryListener, methodID, childPosition); - } - - void Framework::ItemProgressChanged(int childPosition, LocalAndRemoteSizeT const & sizes) - { - if (m_javaCountryListener == NULL) - return; - - JNIEnv * env = jni::GetEnv(); - jmethodID const methodID = jni::GetJavaMethodID(env, - *m_javaCountryListener, - "onItemProgressChanged", - "(I[J)V"); - ASSERT ( methodID, () ); - - env->CallVoidMethod(*m_javaCountryListener, methodID, childPosition, storage_utils::ToArray(env, sizes)); - } - - void Framework::CountryGroupChanged(ActiveMapsLayout::TGroup const & oldGroup, int oldPosition, - ActiveMapsLayout::TGroup const & newGroup, int newPosition) - { - JNIEnv * env = jni::GetEnv(); - for (TListenerMap::const_iterator it = m_javaActiveMapListeners.begin(); it != m_javaActiveMapListeners.end(); ++it) - { - jmethodID const methodID = jni::GetJavaMethodID(env, *(it->second), "onCountryGroupChanged", "(IIII)V"); - ASSERT ( methodID, () ); - - env->CallVoidMethod(*(it->second), methodID, oldGroup, oldPosition, newGroup, newPosition); - } - } - - void Framework::CountryStatusChanged(ActiveMapsLayout::TGroup const & group, int position, - TStatus const & oldStatus, TStatus const & newStatus) - { - JNIEnv * env = jni::GetEnv(); - for (TListenerMap::const_iterator it = m_javaActiveMapListeners.begin(); it != m_javaActiveMapListeners.end(); ++it) - { - jmethodID const methodID = jni::GetJavaMethodID(env, *(it->second), "onCountryStatusChanged", "(IIII)V"); - ASSERT ( methodID, () ); - - env->CallVoidMethod(*(it->second), methodID, group, position, - static_cast(oldStatus), static_cast(newStatus)); - } - } - - void Framework::CountryOptionsChanged(ActiveMapsLayout::TGroup const & group, int position, - MapOptions const & oldOpt, MapOptions const & newOpt) - { - JNIEnv * env = jni::GetEnv(); - for (TListenerMap::const_iterator it = m_javaActiveMapListeners.begin(); it != m_javaActiveMapListeners.end(); ++it) - { - jmethodID const methodID = jni::GetJavaMethodID(env, *(it->second), "onCountryOptionsChanged", "(IIII)V"); - ASSERT ( methodID, () ); - - env->CallVoidMethod(*(it->second), methodID, group, position, - static_cast(oldOpt), static_cast(newOpt)); - } - } - - void Framework::DownloadingProgressUpdate(ActiveMapsLayout::TGroup const & group, int position, - LocalAndRemoteSizeT const & progress) - { - JNIEnv * env = jni::GetEnv(); - for (TListenerMap::const_iterator it = m_javaActiveMapListeners.begin(); it != m_javaActiveMapListeners.end(); ++it) - { - jmethodID const methodID = jni::GetJavaMethodID(env, *(it->second), "onCountryProgressChanged", "(II[J)V"); - ASSERT ( methodID, () ); - - env->CallVoidMethod(*(it->second), methodID, group, position, storage_utils::ToArray(env, progress)); - } - } - - // Fills mapobject's metadata from UserMark - void Framework::InjectMetadata(JNIEnv * env, jclass const clazz, jobject const mapObject, UserMark const * userMark) - { - using feature::Metadata; - - Metadata metadata; - frm()->FindClosestPOIMetadata(userMark->GetOrg(), metadata); - - static jmethodID const addId = env->GetMethodID(clazz, "addMetadata", "(ILjava/lang/String;)V"); - ASSERT ( addId, () ); - - for (auto const t : metadata.GetPresentTypes()) - { - // TODO: It is not a good idea to pass raw strings to UI. Calling separate getters should be a better way. - // Upcoming change: how to pass opening hours (parsed) into Editor's UI? How to get edited changes back? - jstring metaString = t == Metadata::FMD_WIKIPEDIA ? - jni::ToJavaString(env, metadata.GetWikiURL()) : - jni::ToJavaString(env, metadata.Get(t)); - env->CallVoidMethod(mapObject, addId, t, metaString); - // TODO use unique_ptrs for autoallocation of local refs - env->DeleteLocalRef(metaString); - } + m_lastCompass = info.m_bearing; + m_work.OnCompassUpdate(info); } } +void Framework::UpdateCompassSensor(int ind, float * arr) +{ + m_sensors[ind].Next(arr); +} + +void Framework::MyPositionModeChanged(location::EMyPositionMode mode) +{ + if (m_myPositionModeSignal != nullptr) + m_myPositionModeSignal(mode); +} + +bool Framework::CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi) +{ + m_contextFactory = make_unique_dp(new AndroidOGLContextFactory(env, jSurface)); + AndroidOGLContextFactory const * factory = m_contextFactory->CastFactory(); + if (!factory->IsValid()) + return false; + + ::Framework::DrapeCreationParams p; + p.m_surfaceWidth = factory->GetWidth(); + p.m_surfaceHeight = factory->GetHeight(); + p.m_visualScale = dp::VisualScale(densityDpi); + p.m_hasMyPositionState = m_isCurrentModeInitialized; + p.m_initialMyPositionState = m_currentMode; + ASSERT(!m_guiPositions.empty(), ("GUI elements must be set-up before engine is created")); + p.m_widgetsInitInfo = m_guiPositions; + + m_work.LoadBookmarks(); + m_work.SetMyPositionModeListener(bind(&Framework::MyPositionModeChanged, this, _1)); + + m_work.CreateDrapeEngine(make_ref(m_contextFactory), move(p)); + m_work.EnterForeground(); + + // Load initial state of the map or execute drape tasks which set up custom state. + { + lock_guard lock(m_drapeQueueMutex); + if (m_drapeTasksQueue.empty()) + LoadState(); + else + ExecuteDrapeTasks(); + } + + return true; +} + +void Framework::DeleteDrapeEngine() +{ + SaveState(); + m_work.DestroyDrapeEngine(); +} + +bool Framework::IsDrapeEngineCreated() +{ + return m_work.GetDrapeEngine() != nullptr; +} + +void Framework::Resize(int w, int h) +{ + m_contextFactory->CastFactory()->UpdateSurfaceSize(); + m_work.OnSize(w, h); +} + +void Framework::DetachSurface() +{ + m_work.EnterBackground(); + + ASSERT(m_contextFactory != nullptr, ()); + AndroidOGLContextFactory * factory = m_contextFactory->CastFactory(); + factory->ResetSurface(); +} + +void Framework::AttachSurface(JNIEnv * env, jobject jSurface) +{ + ASSERT(m_contextFactory != nullptr, ()); + AndroidOGLContextFactory * factory = m_contextFactory->CastFactory(); + factory->SetSurface(env, jSurface); + + m_work.EnterForeground(); +} + +void Framework::SetMapStyle(MapStyle mapStyle) +{ + m_work.SetMapStyle(mapStyle); +} + +MapStyle Framework::GetMapStyle() const +{ + return m_work.GetMapStyle(); +} + +Storage & Framework::Storage() +{ + return m_work.Storage(); +} + +void Framework::ShowCountry(TIndex const & idx, bool zoomToDownloadButton) +{ + if (zoomToDownloadButton) + { + m2::RectD const rect = m_work.GetCountryBounds(idx); + double const lon = MercatorBounds::XToLon(rect.Center().x); + double const lat = MercatorBounds::YToLat(rect.Center().y); + m_work.ShowRect(lat, lon, 10); + } + else + m_work.ShowCountry(idx); +} + +TStatus Framework::GetCountryStatus(TIndex const & idx) const +{ + return m_work.GetCountryStatus(idx); +} + +void Framework::Touch(int action, Finger const & f1, Finger const & f2, uint8_t maskedPointer) +{ + MultiTouchAction eventType = static_cast(action); + df::TouchEvent event; + + switch(eventType) + { + case MULTITOUCH_DOWN: + event.m_type = df::TouchEvent::TOUCH_DOWN; + break; + case MULTITOUCH_MOVE: + event.m_type = df::TouchEvent::TOUCH_MOVE; + break; + case MULTITOUCH_UP: + event.m_type = df::TouchEvent::TOUCH_UP; + break; + case MULTITOUCH_CANCEL: + event.m_type = df::TouchEvent::TOUCH_CANCEL; + break; + default: + return; + } + + event.m_touches[0].m_location = m2::PointD(f1.m_x, f1.m_y); + event.m_touches[0].m_id = f1.m_id; + event.m_touches[1].m_location = m2::PointD(f2.m_x, f2.m_y); + event.m_touches[1].m_id = f2.m_id; + + event.SetFirstMaskedPointer(maskedPointer); + m_work.TouchEvent(event); +} + +void Framework::ShowSearchResult(search::Result const & r) +{ + m_work.ShowSearchResult(r); +} + +void Framework::ShowAllSearchResults(search::Results const & results) +{ + m_work.ShowAllSearchResults(results); +} + +TIndex Framework::GetCountryIndex(double lat, double lon) const +{ + return m_work.GetCountryIndex(MercatorBounds::FromLatLon(lat, lon)); +} + +string Framework::GetCountryCode(double lat, double lon) const +{ + return m_work.GetCountryCode(MercatorBounds::FromLatLon(lat, lon)); +} + +string Framework::GetCountryNameIfAbsent(m2::PointD const & pt) const +{ + TIndex const idx = m_work.GetCountryIndex(pt); + TStatus const status = m_work.GetCountryStatus(idx); + if (status != TStatus::EOnDisk && status != TStatus::EOnDiskOutOfDate) + return m_work.GetCountryName(idx); + else + return string(); +} + +m2::PointD Framework::GetViewportCenter() const +{ + return m_work.GetViewportCenter(); +} + +void Framework::AddString(string const & name, string const & value) +{ + m_work.AddString(name, value); +} + +void Framework::Scale(::Framework::EScaleMode mode) +{ + m_work.Scale(mode, true); +} + +::Framework * Framework::NativeFramework() +{ + return &m_work; +} + +bool Framework::Search(search::SearchParams const & params) +{ + m_searchQuery = params.m_query; + return m_work.Search(params); +} + +void Framework::LoadState() +{ + m_work.LoadState(); +} + +void Framework::SaveState() +{ + m_work.SaveState(); +} + +void Framework::AddLocalMaps() +{ + m_work.RegisterAllMaps(); +} + +void Framework::RemoveLocalMaps() +{ + m_work.DeregisterAllMaps(); +} + +BookmarkAndCategory Framework::AddBookmark(size_t cat, m2::PointD const & pt, BookmarkData & bm) +{ + return BookmarkAndCategory(cat, m_work.AddBookmark(cat, pt, bm)); +} + +void Framework::ReplaceBookmark(BookmarkAndCategory const & ind, BookmarkData & bm) +{ + m_work.ReplaceBookmark(ind.first, ind.second, bm); +} + +size_t Framework::ChangeBookmarkCategory(BookmarkAndCategory const & ind, size_t newCat) +{ + return m_work.MoveBookmark(ind.second, ind.first, newCat); +} + +bool Framework::ShowMapForURL(string const & url) +{ + return m_work.ShowMapForURL(url); +} + +void Framework::DeactivatePopup() +{ + m_work.ResetLastTapEvent(); + m_work.DeactivateUserMark(); +} + +string Framework::GetOutdatedCountriesString() +{ + vector countries; + Storage().GetOutdatedCountries(countries); + + string res; + for (size_t i = 0; i < countries.size(); ++i) + { + res += countries[i]->Name(); + if (i < countries.size() - 1) + res += ", "; + } + return res; +} + +void Framework::ShowTrack(int category, int track) +{ + Track const * nTrack = NativeFramework()->GetBmCategory(category)->GetTrack(track); + NativeFramework()->ShowTrack(*nTrack); +} + +void Framework::SetCountryTreeListener(shared_ptr objPtr) +{ + m_javaCountryListener = objPtr; + m_work.GetCountryTree().SetListener(this); +} + +void Framework::ResetCountryTreeListener() +{ + m_work.GetCountryTree().ResetListener(); + m_javaCountryListener.reset(); +} + +int Framework::AddActiveMapsListener(shared_ptr obj) +{ + m_javaActiveMapListeners[m_currentSlotID] = obj; + return m_currentSlotID++; +} + +void Framework::RemoveActiveMapsListener(int slotID) +{ + m_javaActiveMapListeners.erase(slotID); +} + +void Framework::SetMyPositionModeListener(location::TMyPositionModeChanged const & fn) +{ + m_myPositionModeSignal = fn; +} + +location::EMyPositionMode Framework::GetMyPositionMode() const +{ + if (!m_isCurrentModeInitialized) + return location::MODE_UNKNOWN_POSITION; + + return m_currentMode; +} + +void Framework::SetMyPositionMode(location::EMyPositionMode mode) +{ + m_currentMode = mode; + m_isCurrentModeInitialized = true; +} + +void Framework::SetupWidget(gui::EWidget widget, float x, float y, dp::Anchor anchor) +{ + m_guiPositions[widget] = gui::Position(m2::PointF(x, y), anchor); +} + +void Framework::ApplyWidgets() +{ + gui::TWidgetsLayoutInfo layout; + for (auto const & widget : m_guiPositions) + layout[widget.first] = widget.second.m_pixelPivot; + + m_work.SetWidgetLayout(move(layout)); +} + +void Framework::CleanWidgets() +{ + m_guiPositions.clear(); +} + +void Framework::SetupMeasurementSystem() +{ + m_work.SetupMeasurementSystem(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +void Framework::ItemStatusChanged(int childPosition) +{ + if (m_javaCountryListener == NULL) + return; + + JNIEnv * env = jni::GetEnv(); + static jmethodID const methodID = jni::GetJavaMethodID(env, + *m_javaCountryListener, + "onItemStatusChanged", + "(I)V"); + ASSERT ( methodID, () ); + + env->CallVoidMethod(*m_javaCountryListener, methodID, childPosition); +} + +void Framework::ItemProgressChanged(int childPosition, LocalAndRemoteSizeT const & sizes) +{ + if (m_javaCountryListener == NULL) + return; + + JNIEnv * env = jni::GetEnv(); + static jmethodID const methodID = jni::GetJavaMethodID(env, + *m_javaCountryListener, + "onItemProgressChanged", + "(I[J)V"); + ASSERT ( methodID, () ); + + env->CallVoidMethod(*m_javaCountryListener, methodID, childPosition, storage_utils::ToArray(env, sizes)); +} + +void Framework::CountryGroupChanged(ActiveMapsLayout::TGroup const & oldGroup, int oldPosition, + ActiveMapsLayout::TGroup const & newGroup, int newPosition) +{ + JNIEnv * env = jni::GetEnv(); + for (TListenerMap::const_iterator it = m_javaActiveMapListeners.begin(); it != m_javaActiveMapListeners.end(); ++it) + { + jmethodID const methodID = jni::GetJavaMethodID(env, *(it->second), "onCountryGroupChanged", "(IIII)V"); + ASSERT ( methodID, () ); + + env->CallVoidMethod(*(it->second), methodID, oldGroup, oldPosition, newGroup, newPosition); + } +} + +void Framework::CountryStatusChanged(ActiveMapsLayout::TGroup const & group, int position, + TStatus const & oldStatus, TStatus const & newStatus) +{ + JNIEnv * env = jni::GetEnv(); + for (TListenerMap::const_iterator it = m_javaActiveMapListeners.begin(); it != m_javaActiveMapListeners.end(); ++it) + { + jmethodID const methodID = jni::GetJavaMethodID(env, *(it->second), "onCountryStatusChanged", "(IIII)V"); + ASSERT ( methodID, () ); + + env->CallVoidMethod(*(it->second), methodID, group, position, + static_cast(oldStatus), static_cast(newStatus)); + } +} + +void Framework::CountryOptionsChanged(ActiveMapsLayout::TGroup const & group, int position, + MapOptions const & oldOpt, MapOptions const & newOpt) +{ + JNIEnv * env = jni::GetEnv(); + for (TListenerMap::const_iterator it = m_javaActiveMapListeners.begin(); it != m_javaActiveMapListeners.end(); ++it) + { + jmethodID const methodID = jni::GetJavaMethodID(env, *(it->second), "onCountryOptionsChanged", "(IIII)V"); + ASSERT ( methodID, () ); + + env->CallVoidMethod(*(it->second), methodID, group, position, + static_cast(oldOpt), static_cast(newOpt)); + } +} + +void Framework::DownloadingProgressUpdate(ActiveMapsLayout::TGroup const & group, int position, + LocalAndRemoteSizeT const & progress) +{ + JNIEnv * env = jni::GetEnv(); + for (TListenerMap::const_iterator it = m_javaActiveMapListeners.begin(); it != m_javaActiveMapListeners.end(); ++it) + { + jmethodID const methodID = jni::GetJavaMethodID(env, *(it->second), "onCountryProgressChanged", "(II[J)V"); + ASSERT ( methodID, () ); + + env->CallVoidMethod(*(it->second), methodID, group, position, storage_utils::ToArray(env, progress)); + } +} + +// Fills mapobject's metadata from UserMark +void Framework::InjectMetadata(JNIEnv * env, jclass const clazz, jobject const mapObject, UserMark const * userMark) +{ + using feature::Metadata; + + Metadata metadata; + frm()->FindClosestPOIMetadata(userMark->GetPivot(), metadata); + + static jmethodID const addId = env->GetMethodID(clazz, "addMetadata", "(ILjava/lang/String;)V"); + ASSERT ( addId, () ); + + for (auto const t : metadata.GetPresentTypes()) + { + // TODO: It is not a good idea to pass raw strings to UI. Calling separate getters should be a better way. + // Upcoming change: how to pass opening hours (parsed) into Editor's UI? How to get edited changes back? + jstring metaString = t == Metadata::FMD_WIKIPEDIA ? + jni::ToJavaString(env, metadata.GetWikiURL()) : + jni::ToJavaString(env, metadata.Get(t)); + env->CallVoidMethod(mapObject, addId, t, metaString); + // TODO use unique_ptrs for autoallocation of local refs + env->DeleteLocalRef(metaString); + } +} + +void Framework::PostDrapeTask(TDrapeTask && task) +{ + ASSERT(task != nullptr, ()); + lock_guard lock(m_drapeQueueMutex); + if (IsDrapeEngineCreated()) + task(); + else + m_drapeTasksQueue.push_back(move(task)); +} + +void Framework::ExecuteDrapeTasks() +{ + for (auto & task : m_drapeTasksQueue) + task(); + m_drapeTasksQueue.clear(); +} + +} // namespace android + template T const * CastMark(UserMark const * data) { @@ -896,12 +693,25 @@ extern "C" env->CallVoidMethod(*obj.get(), methodId, lat, lon); } + // Dismiss information box + void CallOnDismissListener(shared_ptr obj) + { + JNIEnv * env = jni::GetEnv(); + static jmethodID const methodId = jni::GetJavaMethodID(env, *obj.get(), "onDismiss", "()V"); + ASSERT(methodId, ()); + env->CallVoidMethod(*obj.get(), methodId); + } + void CallOnUserMarkActivated(shared_ptr obj, unique_ptr markCopy) { + if (markCopy == nullptr) + { + CallOnDismissListener(obj); + return; + } + ::Framework * fm = frm(); UserMark const * mark = markCopy->GetUserMark(); - fm->ActivateUserMark(mark); - switch (mark->GetMarkType()) { case UserMark::Type::API: @@ -923,7 +733,7 @@ extern "C" case UserMark::Type::POI: { PoiMarkPoint const * poiMark = CastMark(mark); - CallOnPoiActivatedListener(obj, mark->GetOrg(), poiMark->GetInfo(), poiMark->GetMetadata()); + CallOnPoiActivatedListener(obj, mark->GetPivot(), poiMark->GetInfo(), poiMark->GetMetadata()); break; } @@ -931,8 +741,8 @@ extern "C" { SearchMarkPoint const * searchMark = CastMark(mark); feature::Metadata metadata; - fm->FindClosestPOIMetadata(mark->GetOrg(), metadata); - CallOnAdditionalLayerActivatedListener(obj, searchMark->GetOrg(), searchMark->GetInfo(), metadata); + fm->FindClosestPOIMetadata(mark->GetPivot(), metadata); + CallOnAdditionalLayerActivatedListener(obj, searchMark->GetPivot(), searchMark->GetInfo(), metadata); break; } @@ -949,15 +759,6 @@ extern "C" } } - // Dismiss information box - void CallOnDismissListener(shared_ptr obj) - { - JNIEnv * env = jni::GetEnv(); - static jmethodID const methodId = jni::GetJavaMethodID(env, *obj.get(), "onDismiss", "()V"); - ASSERT(methodId, ()); - env->CallVoidMethod(*obj.get(), methodId); - } - void CallRoutingListener(shared_ptr obj, int errorCode, vector const & absentCountries, vector const & absentRoutes) { JNIEnv * env = jni::GetEnv(); @@ -1011,23 +812,20 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeClearApiPoints(JNIEnv * env, jclass clazz) { - frm()->GetBookmarkManager().UserMarksClear(UserMarkContainer::API_MARK); + UserMarkControllerGuard guard(frm()->GetBookmarkManager(), UserMarkType::API_MARK); + guard.m_controller.Clear(); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeSetBalloonListener(JNIEnv * env, jclass clazz, jobject l) { - PinClickManager & manager = g_framework->GetPinClickManager(); - shared_ptr obj = jni::make_global_ref(l); - - manager.ConnectUserMarkListener(bind(&CallOnUserMarkActivated, obj, _1)); - manager.ConnectDismissListener(bind(&CallOnDismissListener, obj)); + frm()->SetUserMarkActivationListener(bind(&CallOnUserMarkActivated, jni::make_global_ref(l), _1)); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeRemoveBalloonListener(JNIEnv * env, jobject thiz) { - g_framework->GetPinClickManager().ClearListeners(); + frm()->SetUserMarkActivationListener(::Framework::TActivateCallbackFn()); } JNIEXPORT jstring JNICALL @@ -1152,10 +950,9 @@ extern "C" { const size_t nIndex = static_cast(index); - BookmarkManager & m = frm()->GetBookmarkManager(); - UserMarkContainer::Controller & c = m.UserMarksGetController(UserMarkContainer::SEARCH_MARK); - ASSERT_LESS(nIndex , c.GetUserMarkCount(), ("Invalid index", nIndex)); - UserMark const * mark = c.GetUserMark(nIndex); + UserMarkControllerGuard guard(frm()->GetBookmarkManager(), UserMarkType::SEARCH_MARK); + ASSERT_LESS(nIndex , guard.m_controller.GetUserMarkCount(), ("Invalid index", nIndex)); + UserMark const * mark = guard.m_controller.GetUserMark(nIndex); search::AddressInfo const & info= CastMark(mark)->GetInfo(); jclass const javaClazz = env->GetObjectClass(jsearchResult); @@ -1167,20 +964,14 @@ extern "C" env->SetObjectField(jsearchResult, typeId, jni::ToJavaString(env, info.GetPinType())); static jfieldID const latId = env->GetFieldID(javaClazz, "mLat", "D"); - env->SetDoubleField(jsearchResult, latId, MercatorBounds::YToLat(mark->GetOrg().y)); + env->SetDoubleField(jsearchResult, latId, MercatorBounds::YToLat(mark->GetPivot().y)); static jfieldID const lonId = env->GetFieldID(javaClazz, "mLon", "D"); - env->SetDoubleField(jsearchResult, lonId, MercatorBounds::XToLon(mark->GetOrg().x)); + env->SetDoubleField(jsearchResult, lonId, MercatorBounds::XToLon(mark->GetPivot().x)); g_framework->InjectMetadata(env, javaClazz, jsearchResult, mark); } - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_Framework_invalidate(JNIEnv * env, jclass clazz) - { - g_framework->Invalidate(); - } - JNIEXPORT jstring JNICALL Java_com_mapswithme_maps_Framework_nativeGetBookmarkDir(JNIEnv * env, jclass thiz) { @@ -1232,7 +1023,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeLoadBookmarks(JNIEnv * env, jclass thiz) { - android::Platform::RunOnGuiThreadImpl(bind(&::Framework::LoadBookmarks, frm())); + frm()->LoadBookmarks(); } JNIEXPORT jboolean JNICALL @@ -1256,7 +1047,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeCloseRouting(JNIEnv * env, jclass thiz) { - android::Platform::RunOnGuiThreadImpl(bind(&::Framework::CloseRouting, frm())); + frm()->CloseRouting(); } JNIEXPORT void JNICALL @@ -1264,24 +1055,20 @@ extern "C" jdouble startLon, jdouble finishLat, jdouble finishLon) { - android::Platform::RunOnGuiThreadImpl(bind(&::Framework::BuildRoute, frm(), - MercatorBounds::FromLatLon(startLat, startLon), - MercatorBounds::FromLatLon(finishLat, finishLon), 0 /* timeoutSec */ )); + frm()->BuildRoute(MercatorBounds::FromLatLon(startLat, startLon), + MercatorBounds::FromLatLon(finishLat, finishLon), 0 /* timeoutSec */); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeFollowRoute(JNIEnv * env, jclass thiz) { - android::Platform::RunOnGuiThreadImpl(bind(&::Framework::FollowRoute, frm())); + frm()->FollowRoute(); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeDisableFollowing(JNIEnv * env, jclass thiz) { - android::Platform::RunOnGuiThreadImpl([]() - { - (void)g_framework->NativeFramework()->DisableFollowMode(); - }); + frm()->DisableFollowMode(); } JNIEXPORT jobjectArray JNICALL @@ -1392,15 +1179,6 @@ extern "C" return mapObject; } - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_Framework_nativeActivateUserMark(JNIEnv * env, jclass clazz, jdouble lat, jdouble lon) - { - ::Framework * fr = frm(); - m2::PointD pxPoint = fr->GtoP(MercatorBounds::FromLatLon(lat, lon)); - UserMark const * mark = fr->GetUserMark(pxPoint, true); - fr->GetBalloonManager().OnShowMark(mark); - } - JNIEXPORT jstring JNICALL Java_com_mapswithme_maps_Framework_nativeGetCountryNameIfAbsent(JNIEnv * env, jobject thiz, jdouble lat, jdouble lon) @@ -1478,7 +1256,7 @@ extern "C" Java_com_mapswithme_maps_Framework_setMapStyle(JNIEnv * env, jclass thiz, jint mapStyle) { MapStyle const val = static_cast(mapStyle); - android::Platform::RunOnGuiThreadImpl(bind(&android::Framework::SetMapStyle, g_framework, val)); + g_framework->SetMapStyle(val); } JNIEXPORT jint JNICALL @@ -1490,8 +1268,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeSetRouter(JNIEnv * env, jclass thiz, jint routerType) { - routing::RouterType const val = static_cast(routerType); - android::Platform::RunOnGuiThreadImpl(bind(&android::Framework::SetRouter, g_framework, val)); + g_framework->SetRouter(static_cast(routerType)); } JNIEXPORT jint JNICALL @@ -1524,15 +1301,6 @@ extern "C" frm()->SetRouteFinishPoint(m2::PointD(MercatorBounds::FromLatLon(lat, lon)), static_cast(valid)); } - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_Framework_setWidgetPivot(JNIEnv * env, jclass thiz, jint widget, jint pivotX, jint pivotY) - { - using WidgetType = InformationDisplay::WidgetType; - WidgetType const widgetType = static_cast(widget); - m2::PointD const pivot = m2::PointD(pivotX, pivotY); - android::Platform::RunOnGuiThreadImpl(bind(&Framework::SetWidgetPivot, frm(), widgetType, pivot)); - } - JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeRegisterMaps(JNIEnv * env, jclass thiz) { diff --git a/android/jni/com/mapswithme/maps/Framework.hpp b/android/jni/com/mapswithme/maps/Framework.hpp index 2e0d1d4df9..7d1ffe9700 100644 --- a/android/jni/com/mapswithme/maps/Framework.hpp +++ b/android/jni/com/mapswithme/maps/Framework.hpp @@ -6,23 +6,25 @@ #include "search/result.hpp" +#include "drape_frontend/gui/skin.hpp" + +#include "drape/pointers.hpp" +#include "drape/oglcontextfactory.hpp" + #include "platform/country_defines.hpp" +#include "platform/location.hpp" #include "geometry/avg_vector.hpp" -#include "base/deferred_task.hpp" #include "base/timer.hpp" #include "indexer/map_style.hpp" #include "std/map.hpp" +#include "std/mutex.hpp" #include "std/shared_ptr.hpp" #include "std/unique_ptr.hpp" - -#include "../../../nv_event/nv_event.hpp" - - -class CountryStatusDisplay; +#include "std/cstdint.hpp" namespace android { @@ -30,11 +32,10 @@ namespace android public storage::ActiveMapsLayout::ActiveMapsListener { private: + drape_ptr m_contextFactory; ::Framework m_work; - VideoTimer * m_videoTimer; typedef shared_ptr TJobject; - TJobject m_javaCountryListener; typedef map TListenerMap; TListenerMap m_javaActiveMapListeners; @@ -42,86 +43,80 @@ namespace android int m_activeMapsConnectionID; - void CallRepaint(); - - double m_x1; - double m_y1; - double m_x2; - double m_y2; - int m_mask; - - bool m_doLoadState; - - /// @name Single click processing parameters. - //@{ - my::Timer m_doubleClickTimer; - bool m_isCleanSingleClick; - double m_lastX1; - double m_lastY1; - //@} - math::LowPassVector m_sensors[2]; double m_lastCompass; - unique_ptr m_deferredTask; - bool m_wasLongClick; - - int m_densityDpi; - int m_screenWidth; - int m_screenHeight; - - void StartTouchTask(double x, double y, unsigned ms); - void KillTouchTask(); - void OnProcessTouchTask(double x, double y, unsigned ms); - string m_searchQuery; - void SetBestDensity(int densityDpi, RenderPolicy::Params & params); + map m_guiPositions; - bool InitRenderPolicyImpl(int densityDpi, int screenWidth, int screenHeight); + void MyPositionModeChanged(location::EMyPositionMode mode); + + location::TMyPositionModeChanged m_myPositionModeSignal; + location::EMyPositionMode m_currentMode; + bool m_isCurrentModeInitialized; public: Framework(); ~Framework(); storage::Storage & Storage(); - CountryStatusDisplay * GetCountryStatusDisplay(); - - void DontLoadState() { m_doLoadState = false; } void ShowCountry(storage::TIndex const & idx, bool zoomToDownloadButton); storage::TStatus GetCountryStatus(storage::TIndex const & idx) const; void OnLocationError(int/* == location::TLocationStatus*/ newStatus); void OnLocationUpdated(location::GpsInfo const & info); - void OnCompassUpdated(location::CompassInfo const & info, bool force); + void OnCompassUpdated(location::CompassInfo const & info, bool forceRedraw); void UpdateCompassSensor(int ind, float * arr); void Invalidate(); - bool InitRenderPolicy(int densityDpi, int screenWidth, int screenHeight); - void DeleteRenderPolicy(); + bool CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi); + void DeleteDrapeEngine(); + bool IsDrapeEngineCreated(); + + void DetachSurface(); + void AttachSurface(JNIEnv * env, jobject jSurface); void SetMapStyle(MapStyle mapStyle); MapStyle GetMapStyle() const; + void SetupMeasurementSystem(); + void SetRouter(routing::RouterType type) { m_work.SetRouter(type); } routing::RouterType GetRouter() const { return m_work.GetRouter(); } routing::RouterType GetLastUsedRouter() const { return m_work.GetLastUsedRouter(); } void Resize(int w, int h); - void DrawFrame(); + struct Finger + { + Finger(int64_t id, float x, float y) + : m_id(id) + , m_x(x) + , m_y(y) + { + } - void Move(int mode, double x, double y); - void Zoom(int mode, double x1, double y1, double x2, double y2); - void Touch(int action, int mask, double x1, double y1, double x2, double y2); + int64_t m_id; + float m_x, m_y; + }; + + void Touch(int action, Finger const & f1, Finger const & f2, uint8_t maskedPointer); + + /// Show rect from another activity. Ensure that no LoadState will be called, + /// when main map activity will become active. + void ShowSearchResult(search::Result const & r); + void ShowAllSearchResults(search::Results const & results); + + bool Search(search::SearchParams const & params); + string GetLastSearchQuery() { return m_searchQuery; } + void ClearLastSearchQuery() { m_searchQuery.clear(); } void LoadState(); void SaveState(); - void SetupMeasurementSystem(); - void AddLocalMaps(); void RemoveLocalMaps(); @@ -133,14 +128,13 @@ namespace android void AddString(string const & name, string const & value); - void Scale(double k); + void Scale(::Framework::EScaleMode mode); BookmarkAndCategory AddBookmark(size_t category, m2::PointD const & pt, BookmarkData & bm); void ReplaceBookmark(BookmarkAndCategory const & ind, BookmarkData & bm); size_t ChangeBookmarkCategory(BookmarkAndCategory const & ind, size_t newCat); ::Framework * NativeFramework(); - PinClickManager & GetPinClickManager() { return m_work.GetBalloonManager(); } bool IsDownloadingActive(); @@ -158,9 +152,21 @@ namespace android int AddActiveMapsListener(shared_ptr obj); void RemoveActiveMapsListener(int slotID); + void SetMyPositionModeListener(location::TMyPositionModeChanged const & fn); + location::EMyPositionMode GetMyPositionMode() const; + void SetMyPositionMode(location::EMyPositionMode mode); + + void SetupWidget(gui::EWidget widget, float x, float y, dp::Anchor anchor); + void ApplyWidgets(); + void CleanWidgets(); + // Fills mapobject's metadata from UserMark void InjectMetadata(JNIEnv * env, jclass clazz, jobject const mapObject, UserMark const * userMark); + using TDrapeTask = function; + // Posts a task which must be executed when Drape Engine is alive. + void PostDrapeTask(TDrapeTask && task); + public: virtual void ItemStatusChanged(int childPosition); virtual void ItemProgressChanged(int childPosition, storage::LocalAndRemoteSizeT const & sizes); @@ -174,6 +180,13 @@ namespace android MapOptions const & newOpt); virtual void DownloadingProgressUpdate(storage::ActiveMapsLayout::TGroup const & group, int position, storage::LocalAndRemoteSizeT const & progress); + + private: + vector m_drapeTasksQueue; + mutex m_drapeQueueMutex; + + // This method must be executed under mutex m_drapeQueueMutex. + void ExecuteDrapeTasks(); }; } diff --git a/android/jni/com/mapswithme/maps/Lifecycle.cpp b/android/jni/com/mapswithme/maps/Lifecycle.cpp deleted file mode 100644 index 59ae344c58..0000000000 --- a/android/jni/com/mapswithme/maps/Lifecycle.cpp +++ /dev/null @@ -1,290 +0,0 @@ -#include -#include -#include "../../../nv_event/nv_event.hpp" -#include "base/logging.hpp" -#include "graphics/opengl/opengl.hpp" -#include "Framework.hpp" -#include "../platform/Platform.hpp" - -#define MODULE "MapsWithMe" -#define NVDEBUG(args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, ## args) - -static int32_t s_winWidth = 1; -static int32_t s_winHeight = 1; -static int32_t s_densityDpi = 1; - -static bool s_glesLoaded = false; - -bool SetupGLESResources() -{ - if (s_glesLoaded) - return true; - - if (!g_framework->InitRenderPolicy(s_densityDpi, s_winWidth, s_winHeight)) - { - NVEventReportUnsupported(); - return false; - } - else - NVEventOnRenderingInitialized(); - - s_glesLoaded = true; - - return true; -} - -bool ShutdownGLESResources() -{ - if (!s_glesLoaded) - return true; - - // We cannot use GLES calls to release the resources if the context is - // not bound. In that case, we simply shut down EGL, which has code to - // explicitly delete the context - if (!NVEventStatusEGLIsBound()) - { - NVDEBUG("ShutdownGLESResources: GLES not bound, shutting down EGL to release"); - - graphics::gl::g_hasContext = false; - - g_framework->DeleteRenderPolicy(); - - graphics::gl::g_hasContext = true; - - NVDEBUG("Cleaning up EGL"); - - if (NVEventCleanupEGL()) - { - s_glesLoaded = false; - return true; - } - else - { - return false; - } - } - - NVDEBUG("ShutdownGLESResources event: GLES bound, manually deleting GLES resources"); - - g_framework->DeleteRenderPolicy(); - - s_glesLoaded = false; - - return true; -} - -bool renderFrame(bool allocateIfNeeded) -{ - if (!NVEventReadyToRenderEGL(allocateIfNeeded)) - return false; - - // We've gotten this far, so EGL is ready for us. Have we loaded our assets? - // Note that we cannot use APP_STATUS_GLES_LOADED to imply that EGL is - // ready to render. We can have a valid context with all GLES resources loaded - // into it but no surface and thus the context not bound. These are semi- - // independent states. - if (!s_glesLoaded) - { - if (!allocateIfNeeded) - return false; - - if (!SetupGLESResources()) - return false; - } - - g_framework->DrawFrame(); - - return true; -} - -namespace -{ - -const int32_t TIMEOUT_FOREGROUND_IN_FOCUS = 1; // msec -const int32_t TIMEOUT_FOREGROUND_NOT_IN_FOCUS = 100; // msec - -int32_t GetEventQueueTimeout(bool isAppInBackground) -{ - if (isAppInBackground) - return NV_EVENT_WAIT_FOREVER; - else - return (NVEventStatusIsFocused() ? TIMEOUT_FOREGROUND_IN_FOCUS : TIMEOUT_FOREGROUND_NOT_IN_FOCUS); -} - -} // namespace - -// Add any initialization that requires the app Java classes -// to be accessible (such as nv_shader_init, NvAPKInit, etc, -// as listed in the docs) -int32_t NVEventAppInit(int32_t argc, char** argv) -{ - return 0; -} - -int32_t NVEventAppMain(int32_t argc, char** argv) -{ - s_glesLoaded = false; - - bool isAppInBackground = true; - - NVDEBUG("Application entering main loop"); - - while (NVEventStatusIsRunning()) - { - const NVEvent* ev = NULL; - while (NVEventStatusIsRunning() && - (ev = NVEventGetNextEvent(GetEventQueueTimeout(isAppInBackground)))) - { - switch (ev->m_type) - { - case NV_EVENT_KEY: - NVDEBUG( "Key event: 0x%02x %s", - ev->m_data.m_key.m_code, - (ev->m_data.m_key.m_action == NV_KEYACTION_DOWN) ? "down" : "up"); - - if ((ev->m_data.m_key.m_code == NV_KEYCODE_BACK)) - { - renderFrame(false); - NVEventDoneWithEvent(true); - } - else - { - NVEventDoneWithEvent(false); - } - ev = NULL; - break; - - case NV_EVENT_CHAR: - NVDEBUG("Char event: 0x%02x", ev->m_data.m_char.m_unichar); - ev = NULL; - NVEventDoneWithEvent(false); - break; - case NV_EVENT_LONG_CLICK: - break; - case NV_EVENT_TOUCH: - { - switch (ev->m_data.m_touch.m_action) - { - case NV_TOUCHACTION_DOWN: - g_framework->Move(0, ev->m_data.m_touch.m_x, ev->m_data.m_touch.m_y); - break; - case NV_TOUCHACTION_MOVE: - g_framework->Move(1, ev->m_data.m_touch.m_x, ev->m_data.m_touch.m_y); - break; - case NV_TOUCHACTION_UP: - g_framework->Move(2, ev->m_data.m_touch.m_x, ev->m_data.m_touch.m_y); - break; - } - } - break; - - case NV_EVENT_MULTITOUCH: - { - int maskOnly = (ev->m_data.m_multi.m_action & NV_MULTITOUCH_POINTER_MASK) >> (NV_MULTITOUCH_POINTER_SHIFT); - int action = ev->m_data.m_multi.m_action & NV_MULTITOUCH_ACTION_MASK; - - g_framework->Touch(action, maskOnly, ev->m_data.m_multi.m_x1, ev->m_data.m_multi.m_y1, - ev->m_data.m_multi.m_x2, ev->m_data.m_multi.m_y2); - } - break; - - case NV_EVENT_SURFACE_CREATED: - case NV_EVENT_SURFACE_SIZE: - s_winWidth = ev->m_data.m_size.m_w; - s_winHeight = ev->m_data.m_size.m_h; - s_densityDpi = ev->m_data.m_size.m_density; - - g_framework->Resize(s_winWidth, s_winHeight); - g_framework->NativeFramework()->Invalidate(true); - - NVDEBUG( "Surface create/resize event: %d x %d", s_winWidth, s_winHeight); - break; - - case NV_EVENT_SURFACE_DESTROYED: - NVDEBUG("Surface destroyed event"); - NVEventDestroySurfaceEGL(); - break; - - case NV_EVENT_FOCUS_LOST: - NVDEBUG("Focus lost event"); - - renderFrame(false); - break; - - case NV_EVENT_PAUSE: - NVDEBUG("Pause event"); - - renderFrame(false); - break; - - case NV_EVENT_STOP: - NVDEBUG("Stop event"); - - // As per Google's recommendation, we release GLES resources here - ShutdownGLESResources(); - isAppInBackground = true; - break; - - case NV_EVENT_QUIT: - NVDEBUG("Quit event"); - - break; - - case NV_EVENT_START: - case NV_EVENT_RESTART: - NVDEBUG("Start/restart event: %s", NVEventGetEventStr(ev->m_type)); - isAppInBackground = false; - break; - - case NV_EVENT_ACCEL: - case NV_EVENT_RESUME: - case NV_EVENT_FOCUS_GAINED: - NVDEBUG("%s event: no specific app action", NVEventGetEventStr(ev->m_type)); - break; - - case NV_EVENT_MWM: - { - typedef function FnT; - FnT * pFn = reinterpret_cast(ev->m_data.m_mwm.m_pFn); - (*pFn)(); - delete pFn; - break; - } - - default: - NVDEBUG("UNKNOWN event"); - break; - }; - - // if we do not NULL out the event, then we return that - // we handled it by default - if (ev) - NVEventDoneWithEvent(true); - } - - // Do not bother to initialize _any_ of EGL, much less go ahead - // and render to the screen unless we have all we need to go - // ahead and do our thing. In many cases, - // devices will bring us part-way up and then take us down. - // So, before we bother to init EGL (much less the rendering - // surface, check that: - // - we are focused - // - we have a rendering surface - // - the surface size is not 0x0 - // - we are resumed, not paused - if (NVEventStatusIsInteractable()) - { - // This will try to set up EGL if it isn't set up - // When we first set up EGL completely, we also load our GLES resources - // If these are already set up or we succeed at setting them all up now, then - // we go ahead and render. - renderFrame(true); - } - } - - NVDEBUG("cleanup!!!"); - - NVEventCleanupEGL(); - - return 0; -} diff --git a/android/jni/com/mapswithme/maps/LocationState.cpp b/android/jni/com/mapswithme/maps/LocationState.cpp index 5dca30f266..319261b198 100644 --- a/android/jni/com/mapswithme/maps/LocationState.cpp +++ b/android/jni/com/mapswithme/maps/LocationState.cpp @@ -4,53 +4,43 @@ #include "../platform/Platform.hpp" - -location::State * GetLocationState() -{ - return g_framework->NativeFramework()->GetLocationState().get(); -} - extern "C" { JNIEXPORT void JNICALL Java_com_mapswithme_maps_LocationState_switchToNextMode(JNIEnv * env, jobject thiz) { - android::Platform::RunOnGuiThreadImpl(bind(&location::State::SwitchToNextMode, GetLocationState()), false); + g_framework->NativeFramework()->SwitchMyPositionNextMode(); } JNIEXPORT jint JNICALL Java_com_mapswithme_maps_LocationState_getLocationStateMode(JNIEnv * env, jobject thiz) { - return GetLocationState()->GetMode(); + return g_framework->GetMyPositionMode(); } - void LocationStateModeChanged(location::State::Mode mode, shared_ptr const & obj) + void LocationStateModeChanged(location::EMyPositionMode mode, shared_ptr const & obj) { + g_framework->SetMyPositionMode(mode); + JNIEnv * env = jni::GetEnv(); - env->CallVoidMethod(*obj.get(), jni::GetJavaMethodID(env, *obj.get(), "onLocationStateModeChangedCallback", "(I)V"), static_cast(mode)); - } - - JNIEXPORT jint JNICALL - Java_com_mapswithme_maps_LocationState_addLocationStateModeListener(JNIEnv * env, jobject thiz, jobject obj) - { - return GetLocationState()->AddStateModeListener(bind(&LocationStateModeChanged, _1, jni::make_global_ref(obj))); + env->CallVoidMethod(*obj.get(), jni::GetJavaMethodID(env, *obj.get(), "onMyPositionModeChangedCallback", "(I)V"), static_cast(mode)); } JNIEXPORT void JNICALL - Java_com_mapswithme_maps_LocationState_removeLocationStateModeListener(JNIEnv * env, jobject thiz, jint slotID) + Java_com_mapswithme_maps_LocationState_setMyPositionModeListener(JNIEnv * env, jobject thiz, jobject obj) { - GetLocationState()->RemoveStateModeListener(slotID); + g_framework->SetMyPositionModeListener(bind(&LocationStateModeChanged, _1, jni::make_global_ref(obj))); } JNIEXPORT void JNICALL - Java_com_mapswithme_maps_LocationState_turnOff(JNIEnv * env, jobject thiz) + Java_com_mapswithme_maps_LocationState_removeMyPositionModeListener(JNIEnv * env, jobject thiz, jint slotID) { - GetLocationState()->TurnOff(); + g_framework->SetMyPositionModeListener(location::TMyPositionModeChanged()); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_LocationState_invalidatePosition(JNIEnv * env, jobject thiz) { - android::Platform::RunOnGuiThreadImpl(bind(&location::State::InvalidatePosition, GetLocationState()), false); + g_framework->NativeFramework()->InvalidateMyPosition(); } } diff --git a/android/jni/com/mapswithme/maps/MapFragment.cpp b/android/jni/com/mapswithme/maps/MapFragment.cpp index 420aea8dbd..bb6a62b2df 100644 --- a/android/jni/com/mapswithme/maps/MapFragment.cpp +++ b/android/jni/com/mapswithme/maps/MapFragment.cpp @@ -7,10 +7,6 @@ #include "../platform/Platform.hpp" -#include "../../../nv_event/nv_event.hpp" - -#include "map/country_status_display.hpp" - #include "storage/index.hpp" #include "base/logging.hpp" @@ -63,40 +59,33 @@ extern "C" #pragma clang optimize off JNIEXPORT void JNICALL - Java_com_mapswithme_maps_MapFragment_nativeCompassUpdated(JNIEnv * env, jobject thiz, - jdouble magneticNorth, jdouble trueNorth, jboolean force) + Java_com_mapswithme_maps_MapFragment_nativeCompassUpdated(JNIEnv * env, jclass clazz, jdouble magneticNorth, jdouble trueNorth, jboolean forceRedraw) { location::CompassInfo info; info.m_bearing = (trueNorth >= 0.0) ? trueNorth : magneticNorth; - g_framework->OnCompassUpdated(info, force); + g_framework->OnCompassUpdated(info, forceRedraw); } #pragma clang pop_options JNIEXPORT jfloatArray JNICALL - Java_com_mapswithme_maps_location_LocationHelper_nativeUpdateCompassSensor( - JNIEnv * env, jobject thiz, jint ind, jfloatArray arr) + Java_com_mapswithme_maps_location_LocationHelper_nativeUpdateCompassSensor(JNIEnv * env, jclass clazz, jint ind, jfloatArray arr) { - int const count = 3; + int const kCoordsCount = 3; - // get Java array - jfloat buffer[3]; - env->GetFloatArrayRegion(arr, 0, count, buffer); + // Extract coords + jfloat coords[kCoordsCount]; + env->GetFloatArrayRegion(arr, 0, kCoordsCount, coords); + g_framework->UpdateCompassSensor(ind, coords); - // get the result - g_framework->UpdateCompassSensor(ind, buffer); - - // pass result back to Java - jfloatArray ret = (jfloatArray)env->NewFloatArray(count); - env->SetFloatArrayRegion(ret, 0, count, buffer); + // Put coords back to java result array + jfloatArray ret = (jfloatArray)env->NewFloatArray(kCoordsCount); + env->SetFloatArrayRegion(ret, 0, kCoordsCount, coords); return ret; } - void CallOnDownloadCountryClicked(shared_ptr const & obj, - storage::TIndex const & idx, - int options, - jmethodID methodID) + static void CallOnDownloadCountryClicked(shared_ptr const & obj, storage::TIndex const & idx, int options, jmethodID methodID) { JNIEnv * env = jni::GetEnv(); env->CallVoidMethod(*obj.get(), methodID, idx.m_group, idx.m_country, idx.m_region, options); @@ -105,19 +94,13 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_MapFragment_nativeConnectDownloadButton(JNIEnv * env, jobject thiz) { - CountryStatusDisplay * display = g_framework->GetCountryStatusDisplay(); - - jmethodID methodID = jni::GetJavaMethodID(env, thiz, "OnDownloadCountryClicked", "(IIII)V"); - - display->SetDownloadCountryListener(bind(&CallOnDownloadCountryClicked, - jni::make_global_ref(thiz), - _1, - _2, - methodID)); + jmethodID methodID = jni::GetJavaMethodID(env, thiz, "onDownloadCountryClicked", "(IIII)V"); + g_framework->NativeFramework()->SetDownloadCountryListener(bind(&CallOnDownloadCountryClicked, + jni::make_global_ref(thiz), _1, _2, methodID)); } JNIEXPORT void JNICALL - Java_com_mapswithme_maps_MapFragment_nativeDownloadCountry(JNIEnv * env, jobject thiz, jobject idx, jint options) + Java_com_mapswithme_maps_MapFragment_nativeDownloadCountry(JNIEnv * env, jclass clazz, jobject idx, jint options) { storage::TIndex index = storage::ToNative(idx); storage::ActiveMapsLayout & layout = storage_utils::GetMapLayout(); @@ -128,14 +111,99 @@ extern "C" } JNIEXPORT void JNICALL - Java_com_mapswithme_maps_MapFragment_nativeScale(JNIEnv * env, jobject thiz, jdouble k) + Java_com_mapswithme_maps_MapFragment_nativeStorageConnected(JNIEnv * env, jclass clazz) { - g_framework->Scale(static_cast(k)); + android::Platform::Instance().OnExternalStorageStatusChanged(true); + g_framework->AddLocalMaps(); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeStorageDisconnected(JNIEnv * env, jclass clazz) + { + android::Platform::Instance().OnExternalStorageStatusChanged(false); + g_framework->RemoveLocalMaps(); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeScalePlus(JNIEnv * env, jclass clazz) + { + g_framework->Scale(::Framework::SCALE_MAG); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeScaleMinus(JNIEnv * env, jclass clazz) + { + g_framework->Scale(::Framework::SCALE_MIN); } JNIEXPORT jboolean JNICALL - Java_com_mapswithme_maps_MapFragment_showMapForUrl(JNIEnv * env, jobject thiz, jstring url) + Java_com_mapswithme_maps_MapFragment_nativeShowMapForUrl(JNIEnv * env, jclass clazz, jstring url) { return g_framework->ShowMapForURL(jni::ToNativeString(env, url)); } + + JNIEXPORT jboolean JNICALL + Java_com_mapswithme_maps_MapFragment_nativeCreateEngine(JNIEnv * env, jclass clazz, jobject surface, jint density) + { + return static_cast(g_framework->CreateDrapeEngine(env, surface, static_cast(density))); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeDestroyEngine(JNIEnv * env, jclass clazz) + { + g_framework->DeleteDrapeEngine(); + } + + JNIEXPORT jboolean JNICALL + Java_com_mapswithme_maps_MapFragment_nativeIsEngineCreated(JNIEnv * env, jclass clazz) + { + return static_cast(g_framework->IsDrapeEngineCreated()); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeAttachSurface(JNIEnv * env, jclass clazz, jobject surface) + { + g_framework->AttachSurface(env, surface); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeDetachSurface(JNIEnv * env, jclass clazz) + { + g_framework->DetachSurface(); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeSurfaceChanged(JNIEnv * env, jclass clazz, jint w, jint h) + { + g_framework->Resize(static_cast(w), static_cast(h)); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeOnTouch(JNIEnv * env, jclass clazz, jint action, + jint id1, jfloat x1, jfloat y1, + jint id2, jfloat x2, jfloat y2, + jint maskedPointer) + { + g_framework->Touch(static_cast(action), + android::Framework::Finger(id1, x1, y1), + android::Framework::Finger(id2, x2, y2), maskedPointer); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeSetupWidget(JNIEnv * env, jclass clazz, jint widget, jfloat x, jfloat y, jint anchor) + { + g_framework->SetupWidget(static_cast(widget), static_cast(x), static_cast(y), static_cast(anchor)); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeApplyWidgets(JNIEnv * env, jclass clazz) + { + g_framework->ApplyWidgets(); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MapFragment_nativeCleanWidgets(JNIEnv * env, jclass clazz) + { + g_framework->CleanWidgets(); + } } // extern "C" diff --git a/android/jni/com/mapswithme/maps/MwmApplication.cpp b/android/jni/com/mapswithme/maps/MwmApplication.cpp index 8436ec1c9d..0e7e73f689 100644 --- a/android/jni/com/mapswithme/maps/MwmApplication.cpp +++ b/android/jni/com/mapswithme/maps/MwmApplication.cpp @@ -4,10 +4,6 @@ #include "../platform/Platform.hpp" -#include "map/information_display.hpp" -#include "map/location_state.hpp" - - extern "C" { JNIEXPORT void JNICALL @@ -16,6 +12,7 @@ extern "C" jstring apkPath, jstring storagePath, jstring tmpPath, jstring obbGooglePath, jstring flavorName, jstring buildType, jboolean isYota, jboolean isTablet) { + android::Platform::Instance().InitAppMethodRefs(thiz); android::Platform::Instance().Initialize( env, apkPath, storagePath, tmpPath, obbGooglePath, flavorName, buildType, isYota, isTablet); } @@ -27,10 +24,10 @@ extern "C" g_framework = new android::Framework(); } - JNIEXPORT jboolean JNICALL - Java_com_mapswithme_maps_MwmApplication_nativeIsBenchmarking(JNIEnv * env, jobject thiz) + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MwmApplication_runNativeFunctor(JNIEnv * env, jobject thiz, jlong functorPointer) { - return static_cast(g_framework->NativeFramework()->IsBenchmarking()); + android::Platform::Instance().CallNativeFunctor(functorPointer); } JNIEXPORT jboolean JNICALL diff --git a/android/jni/com/mapswithme/maps/SearchEngine.cpp b/android/jni/com/mapswithme/maps/SearchEngine.cpp index 0dd6f178ff..63e23d0aa6 100644 --- a/android/jni/com/mapswithme/maps/SearchEngine.cpp +++ b/android/jni/com/mapswithme/maps/SearchEngine.cpp @@ -201,10 +201,8 @@ extern "C" Java_com_mapswithme_maps_search_SearchEngine_nativeShowResult(JNIEnv * env, jclass clazz, jint index) { lock_guard guard(g_resultsMutex); - g_framework->DontLoadState(); - Result const & result = g_results.GetResult(index); - android::Platform::RunOnGuiThreadImpl([result]() + g_framework->PostDrapeTask([result]() { g_framework->NativeFramework()->ShowSearchResult(result); }); @@ -214,9 +212,8 @@ extern "C" Java_com_mapswithme_maps_search_SearchEngine_nativeShowAllResults(JNIEnv * env, jclass clazz) { lock_guard guard(g_resultsMutex); - g_framework->DontLoadState(); - - android::Platform::RunOnGuiThreadImpl([results=g_results]() + auto results = g_results; + g_framework->PostDrapeTask([results]() { g_framework->NativeFramework()->ShowAllSearchResults(results); }); @@ -225,7 +222,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_search_SearchEngine_nativeCancelInteractiveSearch(JNIEnv * env, jclass clazz) { - android::Platform::RunOnGuiThreadImpl([]() + GetPlatform().RunOnGuiThread([]() { g_framework->NativeFramework()->CancelInteractiveSearch(); }); diff --git a/android/jni/com/mapswithme/maps/bookmarks/data/Bookmark.cpp b/android/jni/com/mapswithme/maps/bookmarks/data/Bookmark.cpp index f75ff92851..9102e6fe56 100644 --- a/android/jni/com/mapswithme/maps/bookmarks/data/Bookmark.cpp +++ b/android/jni/com/mapswithme/maps/bookmarks/data/Bookmark.cpp @@ -11,8 +11,7 @@ namespace { BookmarkCategory const * pCat = frm()->GetBmCategory(c); ASSERT(pCat, ("Category not found", c)); - Bookmark const * pBmk = pCat->GetBookmark(b); - ASSERT(pBmk, ("Bookmark not found", c, b)); + Bookmark const * pBmk = static_cast(pCat->GetUserMark(b)); return pBmk; } } @@ -68,7 +67,7 @@ extern "C" Java_com_mapswithme_maps_bookmarks_data_Bookmark_getXY( JNIEnv * env, jobject thiz, jint cat, jlong bmk) { - return jni::GetNewParcelablePointD(env, getBookmark(cat, bmk)->GetOrg()); + return jni::GetNewParcelablePointD(env, getBookmark(cat, bmk)->GetPivot()); } JNIEXPORT jdouble JNICALL diff --git a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp index 4421543bdc..115aae4989 100644 --- a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp +++ b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkCategory.cpp @@ -31,7 +31,10 @@ extern "C" JNIEnv * env, jobject thiz, jint id, jboolean b) { BookmarkCategory * pCat = getBmCategory(id); - pCat->SetVisible(b); + { + BookmarkCategory::Guard guard(*pCat); + guard.m_controller.SetIsVisible(b); + } pCat->SaveToKMLFile(); } @@ -56,14 +59,14 @@ extern "C" JNIEnv * env, jobject thiz, jint id) { BookmarkCategory * category = getBmCategory(id); - return category->GetBookmarksCount() + category->GetTracksCount(); + return category->GetUserMarkCount() + category->GetTracksCount(); } JNIEXPORT jint JNICALL Java_com_mapswithme_maps_bookmarks_data_BookmarkCategory_getBookmarksCount( JNIEnv * env, jobject thiz, jint id) { - return getBmCategory(id)->GetBookmarksCount(); + return getBmCategory(id)->GetUserMarkCount(); } JNIEXPORT jint JNICALL @@ -81,7 +84,7 @@ extern "C" jmethodID static const cId = env->GetMethodID(bookmarkClazz, "", "(IILjava/lang/String;)V"); BookmarkCategory * category = getBmCategory(id); - Bookmark const * nBookmark = category->GetBookmark(index); + Bookmark const * nBookmark = static_cast(category->GetUserMark(index)); ASSERT(nBookmark, ("Bookmark must not be null with index:)", index)); @@ -111,12 +114,12 @@ extern "C" string formattedLenght; MeasurementUtils::FormatDistance(nTrack->GetLengthMeters(), formattedLenght); - graphics::Color nColor = nTrack->GetMainColor(); + dp::Color nColor = nTrack->GetColor(0); - jint androidColor = shift(nColor.a, 24) + - shift(nColor.r, 16) + - shift(nColor.g, 8) + - nColor.b; + jint androidColor = shift(nColor.GetAlfa(), 24) + + shift(nColor.GetRed(), 16) + + shift(nColor.GetGreen(), 8) + + nColor.GetBlue(); return env->NewObject(trackClazz, cId, index, id, jni::ToJavaString(env, nTrack->GetName()), diff --git a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp index 1c6cc879d2..f907429d09 100644 --- a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp +++ b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp @@ -17,8 +17,11 @@ extern "C" JNIEnv * env, jobject thiz, jint c, jint b) { BookmarkAndCategory bnc = BookmarkAndCategory(c,b); - frm()->ShowBookmark(bnc); - frm()->SaveState(); + g_framework->PostDrapeTask([bnc]() + { + frm()->ShowBookmark(bnc); + frm()->SaveState(); + }); } JNIEXPORT void JNICALL @@ -54,7 +57,8 @@ extern "C" BookmarkCategory * pCat = frm()->GetBmCategory(cat); if (pCat) { - pCat->DeleteBookmark(bmk); + BookmarkCategory::Guard guard(*pCat); + guard.m_controller.DeleteUserMark(bmk); pCat->SaveToKMLFile(); } } diff --git a/android/jni/com/mapswithme/opengl/android_gl_utils.cpp b/android/jni/com/mapswithme/opengl/android_gl_utils.cpp new file mode 100644 index 0000000000..300187db05 --- /dev/null +++ b/android/jni/com/mapswithme/opengl/android_gl_utils.cpp @@ -0,0 +1,74 @@ +#include "android_gl_utils.hpp" + +#include "../../../../../base/logging.hpp" +#include "../../../../../base/string_utils.hpp" + +namespace android +{ + +ConfigComparator::ConfigComparator(EGLDisplay display) + : m_display(display) +{ +} + +int ConfigComparator::operator()(EGLConfig const & l, EGLConfig const & r) const +{ + return configWeight(l) - configWeight(r); +} + +int ConfigComparator::configWeight(EGLConfig const & config) const +{ + int val = -1; + eglGetConfigAttrib(m_display, config, EGL_CONFIG_CAVEAT, &val); + + switch (val) + { + case EGL_NONE: + return 0; + case EGL_SLOW_CONFIG: + return 1; + case EGL_NON_CONFORMANT_CONFIG: + return 2; + default: + return 0; + } +} + +namespace +{ + +string GetEglError(EGLint error) +{ + switch (error) + { + case EGL_NOT_INITIALIZED : return "EGL_NOT_INITIALIZED"; + case EGL_BAD_ACCESS : return "EGL_BAD_ACCESS"; + case EGL_BAD_ALLOC : return "EGL_BAD_ALLOC"; + case EGL_BAD_ATTRIBUTE : return "EGL_BAD_ATTRIBUTE"; + case EGL_BAD_CONFIG : return "EGL_BAD_CONFIG"; + case EGL_BAD_CONTEXT : return "EGL_BAD_CONTEXT"; + case EGL_BAD_CURRENT_SURFACE : return "EGL_BAD_CURRENT_SURFACE"; + case EGL_BAD_DISPLAY : return "EGL_BAD_DISPLAY"; + case EGL_BAD_MATCH : return "EGL_BAD_MATCH"; + case EGL_BAD_NATIVE_PIXMAP : return "EGL_BAD_NATIVE_PIXMAP"; + case EGL_BAD_NATIVE_WINDOW : return "EGL_BAD_NATIVE_WINDOW"; + case EGL_BAD_PARAMETER : return "EGL_BAD_PARAMETER"; + case EGL_BAD_SURFACE : return "EGL_BAD_SURFACE"; + case EGL_CONTEXT_LOST : return "EGL_CONTEXT_LOST"; + default: return strings::to_string(error); + } +} + +} // namespace + +void CheckEGL(my::SrcPoint const & src) +{ + EGLint error = eglGetError(); + while (error != EGL_SUCCESS) + { + LOG(LERROR, ("SrcPoint : ", src, ". EGL error : ", GetEglError(error))); + error = eglGetError(); + } +} + +} // namespace android \ No newline at end of file diff --git a/android/jni/com/mapswithme/opengl/android_gl_utils.hpp b/android/jni/com/mapswithme/opengl/android_gl_utils.hpp new file mode 100644 index 0000000000..b48f689585 --- /dev/null +++ b/android/jni/com/mapswithme/opengl/android_gl_utils.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "../../../../../base/src_point.hpp" + +#include +#include + +namespace android +{ + +class ConfigComparator +{ +public: + ConfigComparator(EGLDisplay display); + + int operator()(EGLConfig const & l, EGLConfig const & r) const; + int configWeight(EGLConfig const & config) const; + +private: + EGLDisplay m_display; +}; + +void CheckEGL(my::SrcPoint const & src); + +#define CHECK_EGL(x) do { (x); CheckEGL(SRC());} while(false); +#define CHECK_EGL_CALL() do { CheckEGL(SRC());} while (false); + +} // namespace android + diff --git a/android/jni/opengl/androidoglcontext.cpp b/android/jni/com/mapswithme/opengl/androidoglcontext.cpp similarity index 57% rename from android/jni/opengl/androidoglcontext.cpp rename to android/jni/com/mapswithme/opengl/androidoglcontext.cpp index 9928be8887..58cd2a1f9f 100644 --- a/android/jni/opengl/androidoglcontext.cpp +++ b/android/jni/com/mapswithme/opengl/androidoglcontext.cpp @@ -1,8 +1,10 @@ #include "androidoglcontext.hpp" +#include "android_gl_utils.hpp" #include "base/assert.hpp" #include "base/logging.hpp" - +namespace android +{ static EGLint * getContextAttributesList() { @@ -23,14 +25,14 @@ AndroidOGLContext::AndroidOGLContext(EGLDisplay display, EGLSurface surface, EGL EGLContext sharedContext = (contextToShareWith == NULL) ? EGL_NO_CONTEXT : contextToShareWith->m_nativeContext; m_nativeContext = eglCreateContext(m_display, config, sharedContext, getContextAttributesList()); - CHECK(m_nativeContext != EGL_NO_CONTEXT, ()); } AndroidOGLContext::~AndroidOGLContext() { // Native context must exist - eglDestroyContext(m_display, m_nativeContext); + if (eglDestroyContext(m_display, m_nativeContext) == EGL_FALSE) + CHECK_EGL_CALL(); } void AndroidOGLContext::setDefaultFramebuffer() @@ -40,12 +42,41 @@ void AndroidOGLContext::setDefaultFramebuffer() void AndroidOGLContext::makeCurrent() { - if (eglMakeCurrent(m_display, m_surface, m_surface, m_nativeContext) != EGL_TRUE) - LOG(LINFO, ("Failed to set current context:", eglGetError())); + ASSERT(m_surface != EGL_NO_SURFACE, ()); + if (eglMakeCurrent(m_display, m_surface, m_surface, m_nativeContext) == EGL_FALSE) + CHECK_EGL_CALL(); +} + +void AndroidOGLContext::clearCurrent() +{ + if (eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) == EGL_FALSE) + CHECK_EGL_CALL(); +} + +void AndroidOGLContext::setRenderingEnabled(bool enabled) +{ + if (enabled) + makeCurrent(); + else + clearCurrent(); } void AndroidOGLContext::present() { - if(eglSwapBuffers(m_display, m_surface) != EGL_TRUE) - LOG(LINFO, ("Failed to swap buffers:", eglGetError())); + ASSERT(m_surface != EGL_NO_SURFACE, ()); + if (eglSwapBuffers(m_display, m_surface) == EGL_FALSE) + CHECK_EGL_CALL(); } + +void AndroidOGLContext::setSurface(EGLSurface surface) +{ + m_surface = surface; + ASSERT(m_surface != EGL_NO_SURFACE, ()); +} + +void AndroidOGLContext::resetSurface() +{ + m_surface = EGL_NO_SURFACE; +} + +} // namespace android diff --git a/android/jni/opengl/androidoglcontext.hpp b/android/jni/com/mapswithme/opengl/androidoglcontext.hpp similarity index 55% rename from android/jni/opengl/androidoglcontext.hpp rename to android/jni/com/mapswithme/opengl/androidoglcontext.hpp index a7dc49ac03..98a4da3a80 100644 --- a/android/jni/opengl/androidoglcontext.hpp +++ b/android/jni/com/mapswithme/opengl/androidoglcontext.hpp @@ -4,18 +4,25 @@ #include #include -#include +namespace android +{ -class AndroidOGLContext : public OGLContext +class AndroidOGLContext : public dp::OGLContext { public: AndroidOGLContext(EGLDisplay display, EGLSurface surface, EGLConfig config, AndroidOGLContext * contextToShareWith); ~AndroidOGLContext(); - virtual void makeCurrent(); - virtual void present(); - virtual void setDefaultFramebuffer(); + void makeCurrent() override; + void present() override; + void setDefaultFramebuffer() override; + void setRenderingEnabled(bool enabled) override; + + void setSurface(EGLSurface surface); + void resetSurface(); + + void clearCurrent(); private: // {@ Owned by Context @@ -28,3 +35,4 @@ private: // @} }; +} // namespace android diff --git a/android/jni/com/mapswithme/opengl/androidoglcontextfactory.cpp b/android/jni/com/mapswithme/opengl/androidoglcontextfactory.cpp new file mode 100644 index 0000000000..893ff45c18 --- /dev/null +++ b/android/jni/com/mapswithme/opengl/androidoglcontextfactory.cpp @@ -0,0 +1,293 @@ +#include "androidoglcontextfactory.hpp" +#include "android_gl_utils.hpp" + +#include "base/assert.hpp" +#include "base/logging.hpp" + +#include "std/algorithm.hpp" + +#include +#include +#include + +namespace android +{ + +static EGLint * getConfigAttributesListRGB8() +{ + static EGLint attr_list[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_STENCIL_SIZE, 0, + EGL_DEPTH_SIZE, 16, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT, + EGL_NONE + }; + return attr_list; +} + +static EGLint * getConfigAttributesListR5G6B5() +{ + static EGLint attr_list[] = { + EGL_RED_SIZE, 5, + EGL_GREEN_SIZE, 6, + EGL_BLUE_SIZE, 5, + EGL_STENCIL_SIZE, 0, + EGL_DEPTH_SIZE, 16, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT, + EGL_NONE + }; + return attr_list; +} + +AndroidOGLContextFactory::AndroidOGLContextFactory(JNIEnv * env, jobject jsurface) + : m_drawContext(NULL) + , m_uploadContext(NULL) + , m_windowSurface(EGL_NO_SURFACE) + , m_pixelbufferSurface(EGL_NO_SURFACE) + , m_config(NULL) + , m_nativeWindow(NULL) + , m_display(EGL_NO_DISPLAY) + , m_surfaceWidth(0) + , m_surfaceHeight(0) + , m_windowSurfaceValid(false) +{ + m_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (m_display == EGL_NO_DISPLAY) + { + CHECK_EGL_CALL(); + return; + } + + EGLint version[2] = {0}; + if (!eglInitialize(m_display, &version[0], &version[1])) + { + CHECK_EGL_CALL(); + return; + } + + SetSurface(env, jsurface); + + if (!createPixelbufferSurface()) + { + CHECK_EGL(eglTerminate(m_display)); + return; + } +} + +AndroidOGLContextFactory::~AndroidOGLContextFactory() +{ + if (m_drawContext != nullptr) + { + delete m_drawContext; + m_drawContext = nullptr; + } + + if (m_uploadContext != nullptr) + { + delete m_uploadContext; + m_uploadContext = nullptr; + } + + ResetSurface(); + + if (m_pixelbufferSurface != EGL_NO_SURFACE) + { + eglDestroySurface(m_display, m_pixelbufferSurface); + CHECK_EGL_CALL(); + m_pixelbufferSurface = EGL_NO_SURFACE; + } + + if (m_display != EGL_NO_DISPLAY) + { + eglTerminate(m_display); + CHECK_EGL_CALL(); + } +} + +void AndroidOGLContextFactory::SetSurface(JNIEnv * env, jobject jsurface) +{ + if (!jsurface) + return; + + m_nativeWindow = ANativeWindow_fromSurface(env, jsurface); + if (!m_nativeWindow) + { + LOG(LINFO, ("Can't get native window from Java surface")); + return; + } + + if (!createWindowSurface()) + { + CHECK_EGL(eglTerminate(m_display)); + return; + } + + if (!QuerySurfaceSize()) + return; + + if (m_drawContext != nullptr) + m_drawContext->setSurface(m_windowSurface); + + m_windowSurfaceValid = true; +} + +void AndroidOGLContextFactory::ResetSurface() +{ + if (m_drawContext != nullptr) + m_drawContext->resetSurface(); + + if (IsValid()) + { + eglDestroySurface(m_display, m_windowSurface); + CHECK_EGL_CALL(); + m_windowSurface = EGL_NO_SURFACE; + + ANativeWindow_release(m_nativeWindow); + m_nativeWindow = NULL; + + m_windowSurfaceValid = false; + } +} + +bool AndroidOGLContextFactory::IsValid() const +{ + return m_windowSurfaceValid && m_pixelbufferSurface != EGL_NO_SURFACE; +} + +int AndroidOGLContextFactory::GetWidth() const +{ + ASSERT(IsValid(), ()); + return m_surfaceWidth; +} + +int AndroidOGLContextFactory::GetHeight() const +{ + ASSERT(IsValid(), ()); + return m_surfaceHeight; +} + +void AndroidOGLContextFactory::UpdateSurfaceSize() +{ + ASSERT(IsValid(), ()); + QuerySurfaceSize(); +} + +bool AndroidOGLContextFactory::QuerySurfaceSize() +{ + EGLint queryResult; + if (eglQuerySurface(m_display, m_windowSurface, EGL_WIDTH, &queryResult) == EGL_FALSE) + { + CHECK_EGL_CALL(); + return false; + } + + m_surfaceWidth = static_cast(queryResult); + if (eglQuerySurface(m_display, m_windowSurface, EGL_HEIGHT, &queryResult) == EGL_FALSE) + { + CHECK_EGL_CALL(); + return false; + } + + m_surfaceHeight = static_cast(queryResult); + return true; +} + +dp::OGLContext * AndroidOGLContextFactory::getDrawContext() +{ + ASSERT(IsValid(), ()); + ASSERT(m_windowSurface != EGL_NO_SURFACE, ()); + if (m_drawContext == nullptr) + m_drawContext = new AndroidOGLContext(m_display, m_windowSurface, m_config, m_uploadContext); + return m_drawContext; +} + +dp::OGLContext * AndroidOGLContextFactory::getResourcesUploadContext() +{ + ASSERT(IsValid(), ()); + ASSERT(m_pixelbufferSurface != EGL_NO_SURFACE, ()); + if (m_uploadContext == nullptr) + m_uploadContext = new AndroidOGLContext(m_display, m_pixelbufferSurface, m_config, m_drawContext); + return m_uploadContext; +} + +bool AndroidOGLContextFactory::isDrawContextCreated() const +{ + return m_drawContext != nullptr; +} + +bool AndroidOGLContextFactory::isUploadContextCreated() const +{ + return m_uploadContext != nullptr; +} + +bool AndroidOGLContextFactory::createWindowSurface() +{ + int const kMaxConfigCount = 40; + EGLConfig configs[kMaxConfigCount]; + int count = 0; + if (eglChooseConfig(m_display, getConfigAttributesListRGB8(), configs, kMaxConfigCount, &count) != EGL_TRUE) + { + VERIFY(eglChooseConfig(m_display, getConfigAttributesListR5G6B5(), configs, kMaxConfigCount, &count) == EGL_TRUE, ()); + LOG(LDEBUG, ("Backbuffer format: R5G6B5")); + } + else + { + LOG(LDEBUG, ("Backbuffer format: RGB8")); + } + ASSERT(count > 0, ("Didn't find any configs.")); + + sort(&configs[0], &configs[count], ConfigComparator(m_display)); + for (int i = 0; i < count; ++i) + { + EGLConfig currentConfig = configs[i]; + + EGLint format; + eglGetConfigAttrib(m_display, currentConfig, EGL_NATIVE_VISUAL_ID, &format); + ANativeWindow_setBuffersGeometry(m_nativeWindow, 0, 0, format); + + EGLint surfaceAttributes[] = { EGL_RENDER_BUFFER, EGL_BACK_BUFFER, EGL_NONE }; + m_windowSurface = eglCreateWindowSurface(m_display, currentConfig, m_nativeWindow, surfaceAttributes); + if (m_windowSurface == EGL_NO_SURFACE) + continue; + else + m_config = currentConfig; + + break; + } + + if (m_windowSurface == EGL_NO_SURFACE) + { + CHECK_EGL_CALL(); + return false; + } + + return true; +} + +bool AndroidOGLContextFactory::createPixelbufferSurface() +{ + //ASSERT(m_config != NULL, ()); + + const GLuint size = 1; // yes, 1 is the correct size, we dont really draw on it + static EGLint surfaceConfig[] = { + EGL_WIDTH, size, + EGL_HEIGHT, size, + EGL_NONE + }; + + m_pixelbufferSurface = eglCreatePbufferSurface(m_display, m_config, surfaceConfig); + + if (m_pixelbufferSurface == EGL_NO_SURFACE) + { + CHECK_EGL_CALL(); + return false; + } + + return true; +} + +} // namespace android diff --git a/android/jni/com/mapswithme/opengl/androidoglcontextfactory.hpp b/android/jni/com/mapswithme/opengl/androidoglcontextfactory.hpp new file mode 100644 index 0000000000..4de3bdfe69 --- /dev/null +++ b/android/jni/com/mapswithme/opengl/androidoglcontextfactory.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include "../core/jni_helper.hpp" +#include "androidoglcontext.hpp" +#include "drape/oglcontextfactory.hpp" + +namespace android +{ + +class AndroidOGLContextFactory : public dp::OGLContextFactory +{ +public: + AndroidOGLContextFactory(JNIEnv * env, jobject jsurface); + ~AndroidOGLContextFactory(); + + bool IsValid() const; + + virtual dp::OGLContext * getDrawContext(); + virtual dp::OGLContext * getResourcesUploadContext(); + virtual bool isDrawContextCreated() const; + virtual bool isUploadContextCreated() const; + + void SetSurface(JNIEnv * env, jobject jsurface); + void ResetSurface(); + + int GetWidth() const; + int GetHeight() const; + void UpdateSurfaceSize(); + +private: + bool QuerySurfaceSize(); + +private: + bool createWindowSurface(); + bool createPixelbufferSurface(); + + AndroidOGLContext * m_drawContext; + AndroidOGLContext * m_uploadContext; + + EGLSurface m_windowSurface; + EGLSurface m_pixelbufferSurface; + EGLConfig m_config; + + ANativeWindow * m_nativeWindow; + EGLDisplay m_display; + + int m_surfaceWidth; + int m_surfaceHeight; + + bool m_windowSurfaceValid; +}; + +} // namespace android diff --git a/android/jni/com/mapswithme/platform/Language.cpp b/android/jni/com/mapswithme/platform/Language.cpp index 22abe1bde3..b332ae2846 100644 --- a/android/jni/com/mapswithme/platform/Language.cpp +++ b/android/jni/com/mapswithme/platform/Language.cpp @@ -8,7 +8,6 @@ #include "std/string.hpp" - string ReplaceDeprecatedLanguageCode(string const & lang) { // in* -> id diff --git a/android/jni/com/mapswithme/platform/MethodRef.cpp b/android/jni/com/mapswithme/platform/MethodRef.cpp new file mode 100644 index 0000000000..94717cabbe --- /dev/null +++ b/android/jni/com/mapswithme/platform/MethodRef.cpp @@ -0,0 +1,38 @@ +#include "MethodRef.hpp" + +#include +#include + +MethodRef::MethodRef(char const * name, char const * signature) + : m_name(name) + , m_signature(signature) + , m_methodID(nullptr) + , m_object(nullptr) +{ + LOG(LDEBUG, ("Name = ", name)); +} + +MethodRef::~MethodRef() +{ + if (m_object != nullptr) + jni::GetEnv()->DeleteGlobalRef(m_object); +} + +void MethodRef::Init(jobject obj) +{ + JNIEnv * env = jni::GetEnv(); + m_object = env->NewGlobalRef(obj); + jclass const k = env->GetObjectClass(m_object); + m_methodID = env->GetMethodID(k, m_name, m_signature); + ASSERT(m_object != nullptr, ()); + ASSERT(m_methodID != nullptr, ()); +} + +void MethodRef::CallVoid(jlong arg) +{ + JNIEnv * jniEnv = jni::GetEnv(); + ASSERT(jniEnv != nullptr, ()); + ASSERT(m_object != nullptr, ()); + ASSERT(m_methodID != nullptr, ()); + jniEnv->CallVoidMethod(m_object, m_methodID, arg); +} diff --git a/android/jni/com/mapswithme/platform/MethodRef.hpp b/android/jni/com/mapswithme/platform/MethodRef.hpp new file mode 100644 index 0000000000..a52eb073aa --- /dev/null +++ b/android/jni/com/mapswithme/platform/MethodRef.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "../core/jni_helper.hpp" + +class MethodRef +{ +public: + MethodRef(char const * name, char const * signature); + ~MethodRef(); + + void Init(jobject obj); + void CallVoid(jlong arg); + +private: + char const * m_name; + char const * m_signature; + jmethodID m_methodID; + jobject m_object; +}; diff --git a/android/jni/com/mapswithme/platform/Platform.cpp b/android/jni/com/mapswithme/platform/Platform.cpp index 157823629e..b93a28b5bb 100644 --- a/android/jni/com/mapswithme/platform/Platform.cpp +++ b/android/jni/com/mapswithme/platform/Platform.cpp @@ -2,8 +2,6 @@ #include "../core/jni_helper.hpp" -#include "../../../nv_event/nv_event.hpp" - #include "platform/settings.hpp" #include "base/logging.hpp" @@ -72,7 +70,7 @@ string Platform::GetMemoryInfo() const void Platform::RunOnGuiThread(TFunctor const & fn) { - android::Platform::RunOnGuiThreadImpl(fn); + android::Platform::Instance().RunOnGuiThread(fn); } Platform::EConnectionType Platform::ConnectionStatus() @@ -92,6 +90,11 @@ Platform::EConnectionType Platform::ConnectionStatus() namespace android { + Platform::Platform() + : m_runOnUI("runNativeFunctorOnUiThread", "(J)V") + { + } + void Platform::Initialize(JNIEnv * env, jstring apkPath, jstring storagePath, jstring tmpPath, jstring obbGooglePath, @@ -142,6 +145,22 @@ namespace android (void) ConnectionStatus(); } + void Platform::InitAppMethodRefs(jobject appObject) + { + m_runOnUI.Init(appObject); + } + + void Platform::CallNativeFunctor(jlong functionPointer) + { + TFunctor * fn = reinterpret_cast(functionPointer); + (*fn)(); + delete fn; + } + + void Platform::OnExternalStorageStatusChanged(bool isAvailable) + { + } + string Platform::GetStoragePathPrefix() const { size_t const count = m_writableDir.size(); @@ -170,9 +189,9 @@ namespace android return platform; } - void Platform::RunOnGuiThreadImpl(TFunctor const & fn, bool blocking) + void Platform::RunOnGuiThread(TFunctor const & fn) { - postMWMEvent(new TFunctor(fn), blocking); + m_runOnUI.CallVoid(reinterpret_cast(new TFunctor(fn))); } } diff --git a/android/jni/com/mapswithme/platform/Platform.hpp b/android/jni/com/mapswithme/platform/Platform.hpp index 63d39ec52c..f80f8128c8 100644 --- a/android/jni/com/mapswithme/platform/Platform.hpp +++ b/android/jni/com/mapswithme/platform/Platform.hpp @@ -2,29 +2,38 @@ #include -#include "platform/platform.hpp" +#include "MethodRef.hpp" +#include "platform/platform.hpp" namespace android { class Platform : public ::Platform { public: + Platform(); void Initialize(JNIEnv * env, jstring apkPath, jstring storagePath, jstring tmpPath, jstring obbGooglePath, jstring flavorName, jstring buildType, bool isYota, bool isTablet); + void InitAppMethodRefs(jobject appObject); + void CallNativeFunctor(jlong functionPointer); + + void OnExternalStorageStatusChanged(bool isAvailable); + /// get storage path without ending "/MapsWithMe/" string GetStoragePathPrefix() const; /// assign storage path (should contain ending "/MapsWithMe/") void SetStoragePath(string const & path); bool HasAvailableSpaceForWriting(uint64_t size) const; - - static void RunOnGuiThreadImpl(TFunctor const & fn, bool blocking = false); + void RunOnGuiThread(TFunctor const & fn); static Platform & Instance(); + + private: + MethodRef m_runOnUI; }; } diff --git a/android/jni/nv_debug/nv_debug.hpp b/android/jni/nv_debug/nv_debug.hpp deleted file mode 100644 index f404c212ca..0000000000 --- a/android/jni/nv_debug/nv_debug.hpp +++ /dev/null @@ -1,77 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_debug.h -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA® Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- -#ifndef __INCLUDED_NV_DEBUG_H -#define __INCLUDED_NV_DEBUG_H - -#define CT_ASSERT(tag,cond) \ -enum { COMPILE_TIME_ASSERT__ ## tag = 1/(cond) } - -#define dimof( x ) ( sizeof(x) / sizeof(x[0]) ) -#include - -#define DBG_DETAILED 0 - -#if 0 - - // the detailed prefix can be customised by setting DBG_DETAILED_PREFIX. See - // below as a reference. - // NOTE: fmt is the desired format string and must be in the prefix. - //#ifndef DBG_DETAILED_PREFIX - // #define DBG_DETAILED_PREFIX "%s, %s, line %d: " fmt, __FILE__, __FUNCTION__, __LINE__, - //#endif - //#define DEBUG_D_(fmt, args...) - //#define DEBUG_D(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, (DBG_DETAILED_PREFIX) ## args) - -#else - - #ifdef STRINGIFY - #pragma push_macro("STRINGIFY") - #undef STRINGIFY - #define STRINGIFYPUSHED_____ - #endif - #define STRINGIFY(x) #x - - // debug macro, includes file name function name and line number - #define TO(x) typeof(x) - #define DEBUG_D_(file, line, fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, file ", %s, line(" STRINGIFY(line) "): " fmt, __FUNCTION__, ## args) - #define DEBUG_D(fmt, args...) DEBUG_D_( __FILE__ , __LINE__ , fmt, ## args) - - #ifdef STRINGIFYPUSHED_____ - #undef STRINGIFYPUSHED_____ - #pragma pop_macro("STRINGIFY") - #endif - -#endif - -// basic debug macro -#define NVDEBUG_(fmt, args...) (__android_log_print(ANDROID_LOG_DEBUG, MODULE, fmt, ## args)) - -// Debug macro that can be switched to spew a file name, -// function and line number using DEBUG_DETAILED -#if DBG_DETAILED == 1 - #define NVDEBUG(fmt, args...) NVDEBUG_D(fmt, ## args) -#else - #define NVDEBUG(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, fmt, ## args) -#endif - - -#endif diff --git a/android/jni/nv_event/nv_event.cpp b/android/jni/nv_event/nv_event.cpp deleted file mode 100644 index 23355e7018..0000000000 --- a/android/jni/nv_event/nv_event.cpp +++ /dev/null @@ -1,925 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_event\nv_event.cpp -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA� Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- - -#define MODULE "NVEvent" -#define DBG_DETAILED 0 - -#include "nv_event.hpp" - -#include -#include -#include -#include -#include -//#include - -#include "../nv_time/nv_time.hpp" -#include "../nv_thread/nv_thread.hpp" -#include "../nv_debug/nv_debug.hpp" -#include "scoped_profiler.hpp" -#include "nv_keycode_mapping.hpp" -#include "nv_event_queue.hpp" - -#define CT_ASSERT(tag,cond) \ -enum { COMPILE_TIME_ASSERT__ ## tag = 1/(cond) } - -enum -{ - // Android lifecycle status flags. Not app-specific - // Set between onCreate and onDestroy - NVEVENT_STATUS_RUNNING = 0x00000001, - // Set between onResume and onPause - NVEVENT_STATUS_ACTIVE = 0x00000002, - // Set between onWindowFocusChanged(true) and (false) - NVEVENT_STATUS_FOCUSED = 0x00000004, - // Set when the app's SurfaceHolder points to a - // valid, nonzero-sized surface - NVEVENT_STATUS_HAS_REAL_SURFACE = 0x00000008, - - // Mask of all app lifecycle status flags, useful for checking when is it - // a reasonable time to be setting up EGL and rendering - NVEVENT_STATUS_INTERACTABLE = 0x0000000f, - - // NvEvent EGL status flags. Not app-specific - // Set between calls to NVEventInitEGL and NVEventCleanupEGL - NVEVENT_STATUS_EGL_INITIALIZED = 0x00000010, - // Set when the EGL surface is allocated - NVEVENT_STATUS_EGL_HAS_SURFACE = 0x00000020, - // Set when a surface and context are available and bound - NVEVENT_STATUS_EGL_BOUND = 0x00000040, -}; - -static unsigned int s_appStatus = 0; - -static void ZeroAppFlags() -{ - s_appStatus = 0; -} - -static void SetAppFlag(unsigned int status) -{ - s_appStatus |= status; -} - -static void ClearAppFlag(unsigned int status) -{ - s_appStatus &= ~status; -} - -static bool QueryAppFlag(unsigned int status) -{ - return (s_appStatus & status) ? true : false; -} - -static bool QueryAppFlagsEqualMasked(unsigned int status, unsigned int mask) -{ - return ((s_appStatus & mask) == status) ? true : false; -} - -static NVKeyCodeMapping s_keyMapping; -static NVEventQueue s_eventQueue; -static jobject s_globalThiz; -static jfieldID s_lengthId; -static jfieldID s_dataId; -static jfieldID s_widthId; -static jfieldID s_heightId; -static jfieldID s_texDataId; -static pthread_t s_mainThread; -static bool s_appThreadExited = false; -static bool s_javaPostedQuit = false; - -static int NVEVENT_ACTION_DOWN = 0; -static int NVEVENT_ACTION_UP = 0; -static int NVEVENT_ACTION_CANCEL = 0; -static int NVEVENT_ACTION_POINTER_INDEX_MASK = 0; -static int NVEVENT_ACTION_POINTER_INDEX_SHIFT = 0; -static int NVEVENT_ACTION_KEY_UP = 0; - -class MethodRef -{ -public: - MethodRef(const char* name, - const char* signature) : - m_name(name), - m_signature(signature), - m_index(NULL) - {} - - bool QueryID(JNIEnv *env, jclass k) - { - m_index = env->GetMethodID(k, m_name, m_signature); - return true; - } - - bool CallBoolean() - { - JNIEnv* jniEnv = NVThreadGetCurrentJNIEnv(); - - if (!jniEnv || !s_globalThiz) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Error: No valid JNI env in %s", m_name); - return false; - } - if (!m_index) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Error: No valid function pointer in %s", m_name); - return false; - } -// __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Calling JNI up to %s", m_name); - return jniEnv->CallBooleanMethod(s_globalThiz, m_index); - } - - bool CallInt() - { - JNIEnv* jniEnv = NVThreadGetCurrentJNIEnv(); - - if (!jniEnv || !s_globalThiz) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Error: No valid JNI env in %s", m_name); - return 0; - } - - if (!m_index) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Error: No valid function pointer in %s", m_name); - return false; - } - - return (int)jniEnv->CallIntMethod(s_globalThiz, m_index); - } - - void CallVoid() - { - JNIEnv * jniEnv = NVThreadGetCurrentJNIEnv(); - - if (!jniEnv || !s_globalThiz) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Error: No valid JNI env in %s", m_name); - return; - } - - if (!m_index) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Error: No valid function pointer in %s", m_name); - return; - } - - jniEnv->CallVoidMethod(s_globalThiz, m_index); - } - - const char* m_name; - const char* m_signature; - jmethodID m_index; - -}; - -static MethodRef s_InitEGL("InitEGL", "()Z"); -static MethodRef s_CleanupEGL("CleanupEGL", "()Z"); -static MethodRef s_CreateSurfaceEGL("CreateSurfaceEGL", "()Z"); -static MethodRef s_DestroySurfaceEGL("DestroySurfaceEGL", "()Z"); -static MethodRef s_SwapBuffersEGL("SwapBuffersEGL", "()Z"); -static MethodRef s_BindSurfaceAndContextEGL("BindSurfaceAndContextEGL", "()Z"); -static MethodRef s_UnbindSurfaceAndContextEGL("UnbindSurfaceAndContextEGL", "()Z"); -static MethodRef s_GetErrorEGL("GetErrorEGL", "()I"); -static MethodRef s_finish("finish", "()V"); -static MethodRef s_ReportUnsupported("ReportUnsupported", "()V"); -static MethodRef s_OnRenderingInitialized("OnRenderingInitialized", "()V"); - -// True between onCreate and onDestroy -bool NVEventStatusIsRunning() -{ - // TBD - need to lock a mutex? - return QueryAppFlag(NVEVENT_STATUS_RUNNING); -} - -// True between onResume and onPause -bool NVEventStatusIsActive() -{ - // TBD - need to lock a mutex? - return QueryAppFlag(NVEVENT_STATUS_ACTIVE); -} - -// True between onWindowFocusChanged(true) and (false) -bool NVEventStatusIsFocused() -{ - // TBD - need to lock a mutex? - return QueryAppFlag(NVEVENT_STATUS_FOCUSED); -} - -// True when the app's SurfaceHolder points to a -// valid, nonzero-sized window -bool NVEventStatusHasRealSurface() -{ - // TBD - need to lock a mutex? - return QueryAppFlag(NVEVENT_STATUS_HAS_REAL_SURFACE); -} - -// True when all of IsRunning, IsActive, IsFocused, HasRealSurface are true -// useful for checking when is it a reasonable time to be setting up EGL and rendering -bool NVEventStatusIsInteractable() -{ - // TBD - need to lock a mutex? - return QueryAppFlagsEqualMasked(NVEVENT_STATUS_INTERACTABLE, NVEVENT_STATUS_INTERACTABLE); -} - -// True between calls to NVEventInitEGL and NVEventCleanupEGL -bool NVEventStatusEGLInitialized() -{ - // TBD - need to lock a mutex? - return QueryAppFlag(NVEVENT_STATUS_EGL_INITIALIZED); -} - -// True when the EGL surface is allocated -bool NVEventStatusEGLHasSurface() -{ - // TBD - need to lock a mutex? - return QueryAppFlag(NVEVENT_STATUS_EGL_HAS_SURFACE); -} - -// True when a surface and context are available and bound -bool NVEventStatusEGLIsBound() -{ - // TBD - need to lock a mutex? - return QueryAppFlag(NVEVENT_STATUS_EGL_BOUND); -} - -static void NVEventInitInputFields(JNIEnv *env) -{ - jclass Motion_class = env->FindClass("android/view/MotionEvent"); - jfieldID ACTION_DOWN_id = env->GetStaticFieldID(Motion_class, "ACTION_DOWN", "I"); - jfieldID ACTION_UP_id = env->GetStaticFieldID(Motion_class, "ACTION_UP", "I"); - jfieldID ACTION_CANCEL_id = env->GetStaticFieldID(Motion_class, "ACTION_CANCEL", "I"); - jfieldID ACTION_POINTER_INDEX_SHIFT_id = env->GetStaticFieldID(Motion_class, "ACTION_POINTER_ID_SHIFT", "I"); - jfieldID ACTION_POINTER_INDEX_MASK_id = env->GetStaticFieldID(Motion_class, "ACTION_POINTER_ID_MASK", "I"); - NVEVENT_ACTION_DOWN = env->GetStaticIntField(Motion_class, ACTION_DOWN_id); - NVEVENT_ACTION_UP = env->GetStaticIntField(Motion_class, ACTION_UP_id); - NVEVENT_ACTION_CANCEL = env->GetStaticIntField(Motion_class, ACTION_CANCEL_id); - NVEVENT_ACTION_POINTER_INDEX_MASK = env->GetStaticIntField(Motion_class, ACTION_POINTER_INDEX_MASK_id); - NVEVENT_ACTION_POINTER_INDEX_SHIFT = env->GetStaticIntField(Motion_class, ACTION_POINTER_INDEX_SHIFT_id); - - jclass KeyCode_class = env->FindClass("android/view/KeyEvent"); - jfieldID ACTION_KEY_UP_id = env->GetStaticFieldID(KeyCode_class, "ACTION_UP", "I"); - NVEVENT_ACTION_KEY_UP = env->GetStaticIntField(KeyCode_class, ACTION_KEY_UP_id); -} - -static void* NVEventMainLoopThreadFunc(void*) -{ - NVEventAppMain(0, NULL); - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "NvEvent native app Main returned"); - - // signal the condition variable to unblock - // java from waiting on pause or quit - s_eventQueue.UnblockProducer(); - - s_appThreadExited = true; - - // IF that app main returned because we posted a QUIT, then Java knows what to - // do regarding lifecycle. But, if the app returned from main of its own accord, - // we need to call finish. - if (!s_javaPostedQuit) - { - JNIEnv* env = NVThreadGetCurrentJNIEnv(); - env->CallVoidMethod(s_globalThiz, s_finish.m_index); - } - - return NULL; -} - -NVEventPlatformAppHandle NVEventGetPlatformAppHandle() -{ - return s_globalThiz; -} - -/////////////////////////////////////////////////////////////////////////////// -// Native event-handling functions - -const char* NVEventGetEventStr(NVEventType eventType) -{ - switch(eventType) - { - case NV_EVENT_KEY: return "NV_EVENT_KEY"; - case NV_EVENT_CHAR: return "NV_EVENT_CHAR"; - case NV_EVENT_TOUCH: return "NV_EVENT_TOUCH"; - case NV_EVENT_MULTITOUCH: return "NV_EVENT_MULTITOUCH"; - case NV_EVENT_ACCEL: return "NV_EVENT_ACCEL"; - case NV_EVENT_START: return "NV_EVENT_START"; - case NV_EVENT_RESTART: return "NV_EVENT_RESTART"; - case NV_EVENT_RESUME: return "NV_EVENT_RESUME"; - case NV_EVENT_FOCUS_GAINED: return "NV_EVENT_FOCUS_GAINED"; - case NV_EVENT_SURFACE_CREATED: return "NV_EVENT_SURFACE_CREATED"; - case NV_EVENT_SURFACE_SIZE: return "NV_EVENT_SURFACE_SIZE"; - case NV_EVENT_SURFACE_DESTROYED: return "NV_EVENT_SURFACE_DESTROYED"; - case NV_EVENT_FOCUS_LOST: return "NV_EVENT_FOCUS_LOST"; - case NV_EVENT_PAUSE: return "NV_EVENT_PAUSE"; - case NV_EVENT_STOP: return "NV_EVENT_STOP"; - case NV_EVENT_QUIT: return "NV_EVENT_QUIT"; - case NV_EVENT_USER: return "NV_EVENT_USER"; - case NV_EVENT_LONG_CLICK: return "NV_EVENT_LONG_CLICK"; - case NV_EVENT_MWM: return "NV_EVENT_MWM"; - } - - // update this if you end up having to edit something. - CT_ASSERT(NEED_TO_ADD_STRING_HERE, NV_EVENT_NUM_EVENTS == 19); - return "unknown event type!"; -} - -const NVEvent* NVEventGetNextEvent(int waitMSecs) -{ - return s_eventQueue.RemoveOldest(waitMSecs); -} - -void NVEventDoneWithEvent(bool handled) -{ - return s_eventQueue.DoneWithEvent(handled); -} - -static void NVEventInsert(NVEvent* ev) -{ - if(!s_appThreadExited) - s_eventQueue.Insert(ev); -} - -static bool NVEventInsertBlocking(NVEvent* ev) -{ - if(!s_appThreadExited) - return s_eventQueue.InsertBlocking(ev); - - return false; -} - -/////////////////////////////////////////////////////////////////////////////// -// Native to Java EGL call-up functions - -bool NVEventInitEGL() -{ - if(s_InitEGL.CallBoolean()) - { - SetAppFlag(NVEVENT_STATUS_EGL_INITIALIZED); - return true; - } - else - return false; -} - -bool NVEventCleanupEGL() -{ - ClearAppFlag(NVEVENT_STATUS_EGL_BOUND); - ClearAppFlag(NVEVENT_STATUS_EGL_HAS_SURFACE); - ClearAppFlag(NVEVENT_STATUS_EGL_INITIALIZED); - return s_CleanupEGL.CallBoolean(); -} - -bool NVEventCreateSurfaceEGL() -{ - if (s_CreateSurfaceEGL.CallBoolean()) - { - SetAppFlag(NVEVENT_STATUS_EGL_HAS_SURFACE); - return true; - } - else - return false; -} - -bool NVEventDestroySurfaceEGL() -{ - if (!QueryAppFlag(NVEVENT_STATUS_EGL_HAS_SURFACE)) - return true; - - if (QueryAppFlag(NVEVENT_STATUS_EGL_BOUND)) - NVEventUnbindSurfaceAndContextEGL(); - - ClearAppFlag(NVEVENT_STATUS_EGL_HAS_SURFACE); - return s_DestroySurfaceEGL.CallBoolean(); -} - -bool NVEventBindSurfaceAndContextEGL() -{ - if (s_BindSurfaceAndContextEGL.CallBoolean()) - { - SetAppFlag(NVEVENT_STATUS_EGL_BOUND); - return true; - } - else - return false; -} - -bool NVEventUnbindSurfaceAndContextEGL() -{ - ClearAppFlag(NVEVENT_STATUS_EGL_BOUND); - return s_UnbindSurfaceAndContextEGL.CallBoolean(); -} - -bool NVEventSwapBuffersEGL() -{ - if (!s_SwapBuffersEGL.CallBoolean()) - return false; - RESET_PROFILING(); - return true; -} - -int NVEventGetErrorEGL() -{ - return s_GetErrorEGL.CallInt(); -} - -bool NVEventReadyToRenderEGL(bool allocateIfNeeded) -{ - // If we have a bound context and surface, then EGL is ready - if (!NVEventStatusEGLIsBound()) - { - if (!allocateIfNeeded) - return false; - - // If we have not bound the context and surface, do we even _have_ a surface? - if (!NVEventStatusEGLHasSurface()) - { - // No surface, so we need to check if EGL is set up at all - if (!NVEventStatusEGLInitialized()) - { - if (!NVEventInitEGL()) - return false; - } - - // Create the rendering surface now that we have a context - if (!NVEventCreateSurfaceEGL()) - return false; - - } - - // We have a surface and context, so bind them - if (NVEventBindSurfaceAndContextEGL()) - return false; - } - - return true; -} - -bool NVEventRepaint() -{ - NVEvent ev; - ev.m_type = NV_EVENT_USER; - ev.m_data.m_user.m_u0 = 1; - NVEventInsert(&ev); - - return true; -} - -void NVEventReportUnsupported() -{ - /// to prevent from rendering - ClearAppFlag(NVEVENT_STATUS_FOCUSED); - s_ReportUnsupported.CallVoid(); -} - -void NVEventOnRenderingInitialized() -{ - s_OnRenderingInitialized.CallVoid(); -} - -/////////////////////////////////////////////////////////////////////////////// -// Input event-related Java to Native callback functions - - -static jboolean NVEventMultiTouchEvent(JNIEnv* env, jobject thiz, jint action, - jboolean hasFirst, jboolean hasSecond, jint mx1, jint my1, jint mx2, jint my2) -{ - { - NVEvent ev; - - int actionOnly = action & (~NVEVENT_ACTION_POINTER_INDEX_MASK); - - int maskOnly = 0; - - if (hasFirst) - maskOnly |= 0x1; - if (hasSecond) - maskOnly |= 0x2; - - ev.m_type = NV_EVENT_MULTITOUCH; - - if (actionOnly == NVEVENT_ACTION_UP) - { - ev.m_data.m_multi.m_action = NV_MULTITOUCH_UP; - } - else if (actionOnly == NVEVENT_ACTION_DOWN) - { - ev.m_data.m_multi.m_action = NV_MULTITOUCH_DOWN; - } - else if (actionOnly == NVEVENT_ACTION_CANCEL) - { - ev.m_data.m_multi.m_action = NV_MULTITOUCH_CANCEL; - } - else - { - ev.m_data.m_multi.m_action = NV_MULTITOUCH_MOVE; - } - ev.m_data.m_multi.m_action = - (NVMultiTouchEventType)(ev.m_data.m_multi.m_action | (maskOnly << NV_MULTITOUCH_POINTER_SHIFT)); - ev.m_data.m_multi.m_x1 = mx1; - ev.m_data.m_multi.m_y1 = my1; - ev.m_data.m_multi.m_x2 = mx2; - ev.m_data.m_multi.m_y2 = my2; - NVEventInsert(&ev); - } - - return JNI_TRUE; -} - -static jboolean NVEventKeyEvent(JNIEnv* env, jobject thiz, jint action, jint keycode, jint unichar) -{ - // TBD - remove these or make them resettable for safety... - static int lastKeyAction = 0; - static int lastKeyCode = 0; - bool ret = false; - - NVKeyCode code = NV_KEYCODE_NULL; - - if (s_keyMapping.MapKey((int)keycode, code)) - { - if ((code != NV_KEYCODE_NULL) && - ((code != lastKeyCode) || (action != lastKeyAction))) - { - NVEvent ev; - ev.m_type = NV_EVENT_KEY; - ev.m_data.m_key.m_action = (NVEVENT_ACTION_UP == action) - ? NV_KEYACTION_UP : NV_KEYACTION_DOWN; - ev.m_data.m_key.m_code = code; - ret = NVEventInsertBlocking(&ev); - } - - lastKeyAction = action; - lastKeyCode = code; - } - - if (unichar && (NVEVENT_ACTION_UP != action)) - { - NVEvent ev; - ev.m_type = NV_EVENT_CHAR; - ev.m_data.m_char.m_unichar = unichar; - NVEventInsert(&ev); - } - - return ret; -} - -static jboolean NVEventAccelerometerEvent(JNIEnv* env, jobject thiz, jfloat values0, jfloat values1, jfloat values2) -{ - NVEvent ev; - ev.m_type = NV_EVENT_ACCEL; - ev.m_data.m_accel.m_x = values0; - ev.m_data.m_accel.m_y = values1; - ev.m_data.m_accel.m_z = values2; - NVEventInsert(&ev); - return JNI_TRUE; -} - -/////////////////////////////////////////////////////////////////////////////// -// Java to Native app lifecycle callback functions - -static jboolean onDestroyNative(JNIEnv* env, jobject thiz); - - - -static jboolean onCreateNative(JNIEnv* env, jobject thiz) -{ - if (s_globalThiz) - onDestroyNative(env, thiz); - - ZeroAppFlags(); - - if (!s_globalThiz) - { - s_globalThiz = env->NewGlobalRef(thiz); - if (!s_globalThiz) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Error: Thiz NewGlobalRef failed!"); - } - - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Thiz NewGlobalRef: 0x%p", s_globalThiz); - } - - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Init KeyCode Map"); - s_keyMapping.Init(env, thiz); - - NVEventInitInputFields(env); - - s_eventQueue.Init(); - - s_javaPostedQuit = false; - - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Calling NVEventAppInit"); - - if (NVEventAppInit(0, NULL)) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "NVEventAppInit error"); - return JNI_FALSE; - } - - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "spawning thread"); - - s_appThreadExited = false; - SetAppFlag(NVEVENT_STATUS_RUNNING); - - /* Launch thread with main loop */ - NVThreadSpawnJNIThread(&s_mainThread, NULL, NVEventMainLoopThreadFunc, NULL); - - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "thread spawned"); - - return JNI_TRUE; -} - -static jboolean onStartNative(JNIEnv* env, jobject thiz) -{ - NVEvent ev; - ev.m_type = NV_EVENT_START; - return NVEventInsertBlocking(&ev); -} - -static jboolean onRestartNative(JNIEnv* env, jobject thiz) -{ - NVEvent ev; - ev.m_type = NV_EVENT_RESTART; - return NVEventInsertBlocking(&ev); -} - -static jboolean onResumeNative(JNIEnv* env, jobject thiz) -{ - NVEvent ev; - ev.m_type = NV_EVENT_RESUME; - SetAppFlag(NVEVENT_STATUS_ACTIVE); - return NVEventInsertBlocking(&ev); -} - -static jboolean onSurfaceCreatedNative(JNIEnv* env, jobject thiz, int w, int h, int density) -{ - NVEvent ev; - ev.m_type = NV_EVENT_SURFACE_CREATED; - ev.m_data.m_size.m_w = w; - ev.m_data.m_size.m_h = h; - ev.m_data.m_size.m_density = density; - if ((w > 0) && (h > 0)) - SetAppFlag(NVEVENT_STATUS_HAS_REAL_SURFACE); - else - ClearAppFlag(NVEVENT_STATUS_HAS_REAL_SURFACE); - return NVEventInsertBlocking(&ev); -} - -static jboolean onFocusChangedNative(JNIEnv* env, jobject thiz, jboolean focused) -{ - NVEvent ev; - ev.m_type = (focused == JNI_TRUE) ? NV_EVENT_FOCUS_GAINED : NV_EVENT_FOCUS_LOST; - if (focused) - SetAppFlag(NVEVENT_STATUS_FOCUSED); - else - ClearAppFlag(NVEVENT_STATUS_FOCUSED); - return NVEventInsertBlocking(&ev); -} - -static jboolean onSurfaceChangedNative(JNIEnv* env, jobject thiz, int w, int h, int density) -{ - NVEvent ev; - ev.m_type = NV_EVENT_SURFACE_SIZE; - ev.m_data.m_size.m_w = w; - ev.m_data.m_size.m_h = h; - ev.m_data.m_size.m_density = density; - if (w * h) - SetAppFlag(NVEVENT_STATUS_HAS_REAL_SURFACE); - else - ClearAppFlag(NVEVENT_STATUS_HAS_REAL_SURFACE); - return NVEventInsertBlocking(&ev); -} - -static jboolean onSurfaceDestroyedNative(JNIEnv* env, jobject thiz) -{ - NVEvent ev; - ev.m_type = NV_EVENT_SURFACE_DESTROYED; - ClearAppFlag(NVEVENT_STATUS_HAS_REAL_SURFACE); - return NVEventInsertBlocking(&ev); -} - -static jboolean onPauseNative(JNIEnv* env, jobject thiz) -{ - // TODO: we could selectively flush here to - // improve responsiveness to the pause - s_eventQueue.Flush(); - NVEvent ev; - ev.m_type = NV_EVENT_PAUSE; - ClearAppFlag(NVEVENT_STATUS_ACTIVE); - return NVEventInsertBlocking(&ev); -} - -static jboolean onStopNative(JNIEnv* env, jobject thiz) -{ - NVEvent ev; - ev.m_type = NV_EVENT_STOP; - return NVEventInsertBlocking(&ev); -} - -static jboolean onDestroyNative(JNIEnv* env, jobject thiz) -{ - if (!env || !s_globalThiz) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Error: DestroyingRegisteredObjectInstance no TLS data!"); - } - - if (!s_appThreadExited) - { - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Posting quit event"); - - // flush ALL events - s_eventQueue.Flush(); - - NVEvent ev; - ev.m_type = NV_EVENT_QUIT; - ClearAppFlag(NVEVENT_STATUS_RUNNING); - - // We're posting quit, so we need to mark that; when the main loop - // thread exits, we check this flag to ensure that we only call "finish" - // if the app returned of its own accord, not if we posted it - s_javaPostedQuit = true; - NVEventInsert(&ev); - - // ensure that the native side - // isn't blocked waiting for an event -- since we've flushed - // all the events save quit, we must artificially unblock native - s_eventQueue.UnblockConsumer(); - - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Waiting for main loop exit"); - pthread_join(s_mainThread, NULL); - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Main loop exited"); - } - - env->DeleteGlobalRef(s_globalThiz); - s_globalThiz = NULL; - - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "Released global thiz!"); - - s_eventQueue.Shutdown(); - - return JNI_TRUE; -} - -static jboolean postUserEvent(JNIEnv* env, jobject thiz, - jint u0, jint u1, jint u2, jint u3, - jboolean blocking) -{ - NVEvent ev; - ev.m_type = NV_EVENT_USER; - ev.m_data.m_user.m_u0 = u0; - ev.m_data.m_user.m_u1 = u1; - ev.m_data.m_user.m_u2 = u2; - ev.m_data.m_user.m_u3 = u3; - if (blocking == JNI_TRUE) - { - return NVEventInsertBlocking(&ev); - } - else - { - NVEventInsert(&ev); - return true; - } -} - -void postMWMEvent(void * pFn, bool blocking) -{ - NVEvent ev; - ev.m_type = NV_EVENT_MWM; - ev.m_data.m_mwm.m_pFn = pFn; - - if (blocking) - (void) NVEventInsertBlocking(&ev); - else - NVEventInsert(&ev); -} - -/////////////////////////////////////////////////////////////////////////////// -// File and APK handling functions - -char* NVEventLoadFile(const char* file) -{ - __android_log_print(ANDROID_LOG_DEBUG, MODULE, "loadFile is not implemented"); - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// JVM Initialization functions - -void InitNVEvent(JavaVM* vm) -{ - JNIEnv *env; - - NVThreadInit(vm); - - NVDEBUG("InitNVEvent called"); - - if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) - { - NVDEBUG("Failed to get the environment using GetEnv()"); - return; - } - - JNINativeMethod methods[] = - { - { - "onCreateNative", - "()Z", - (void *) onCreateNative - }, - { - "onStartNative", - "()Z", - (void *) onStartNative - }, - { - "onRestartNative", - "()Z", - (void *) onRestartNative - }, - { - "onResumeNative", - "()Z", - (void *) onResumeNative - }, - { - "onSurfaceCreatedNative", - "(III)Z", - (void *) onSurfaceCreatedNative - }, - { - "onFocusChangedNative", - "(Z)Z", - (void *) onFocusChangedNative - }, - { - "onSurfaceChangedNative", - "(III)Z", - (void *) onSurfaceChangedNative - }, - { - "onSurfaceDestroyedNative", - "()Z", - (void *) onSurfaceDestroyedNative - }, - { - "onPauseNative", - "()Z", - (void *) onPauseNative - }, - { - "onStopNative", - "()Z", - (void *) onStopNative - }, - { - "onDestroyNative", - "()Z", - (void *) onDestroyNative - }, - { - "multiTouchEvent", - "(IZZIIIILandroid/view/MotionEvent;)Z", - (void *) NVEventMultiTouchEvent - }/*, - { - "onLongClickNative", - "(II)Z", - (void *) NVEventLongClickEvent - }*/ - }; - - jclass k; - k = (env)->FindClass ("com/nvidia/devtech/NvEventQueueFragment"); - (env)->RegisterNatives(k, methods, dimof(methods)); - - s_InitEGL.QueryID(env, k); - s_CleanupEGL.QueryID(env, k); - s_CreateSurfaceEGL.QueryID(env, k); - s_DestroySurfaceEGL.QueryID(env, k); - s_SwapBuffersEGL.QueryID(env, k); - s_BindSurfaceAndContextEGL.QueryID(env, k); - s_UnbindSurfaceAndContextEGL.QueryID(env, k); - s_GetErrorEGL.QueryID(env, k); - s_finish.QueryID(env, k); - s_ReportUnsupported.QueryID(env, k); - s_OnRenderingInitialized.QueryID(env, k); -} - diff --git a/android/jni/nv_event/nv_event.hpp b/android/jni/nv_event/nv_event.hpp deleted file mode 100644 index eea19d3bc1..0000000000 --- a/android/jni/nv_event/nv_event.hpp +++ /dev/null @@ -1,547 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_event\nv_event.h -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA® Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- -#ifndef _NV_EVENT_H -#define _NV_EVENT_H -#include -#include - -/** @file nv_event.h -Contains a framework for event loop-based applications. This library replaces -most or all of the normally-required JNI code for Android NDK applications, -presenting the application developer with two callbacks into which they can -write their application. The framework runs in a natively-created thread, -allowing the application to implement a classic "event loop and render" structure -without having to return to Java code to avoid ANR warnings. The library -includes support for input and system event passing as well as JNI initialization -and exposes basic EGL functionality to native as well. Put together, the library -can form the basis of a simple interactive 3D application. All applications that -are based on this library must also be subclassed on the Java side from the -provided NvEventQueueActivity. Additional external documentation on the use of -this library, the related Java code and the tool provided to create a template -application based on the library are provided with the SDK. -@see NvEventQueueActivity -*/ - -#ifdef ANDROID - -#include -typedef jobject NVEventPlatformAppHandle; - -#else // unknown platform - -typedef void * NVEventPlatformAppHandle; - -#endif - - -enum -{ - /** Timeout argument to NVEventGetNextEvent() that indicates the function should - block until there is an event pending or the app exits - @see NVEventGetNextEvent() - */ - NV_EVENT_WAIT_FOREVER = -1 -}; - -/** Event type values -*/ -typedef enum NVEventType -{ - /** Key up/down events */ - NV_EVENT_KEY = 1, - /** Translated character events */ - NV_EVENT_CHAR, - /** Single-touch pointer events */ - NV_EVENT_TOUCH, - /** Multi-touch events */ - NV_EVENT_MULTITOUCH, - /** Long Click Event */ - NV_EVENT_LONG_CLICK, - /** Accelerometer events */ - NV_EVENT_ACCEL, - /** onStart lifecycle events */ - NV_EVENT_START, - /** onRestart lifecycle events */ - NV_EVENT_RESTART, - /** onResume lifecycle events */ - NV_EVENT_RESUME, - /** onWindowFocusChanged(TRUE) lifecycle events */ - NV_EVENT_FOCUS_GAINED, - /** Surface created events */ - NV_EVENT_SURFACE_CREATED, - /** Surface size changed events */ - NV_EVENT_SURFACE_SIZE, - /** Surface destroyed events */ - NV_EVENT_SURFACE_DESTROYED, - /** onWindowFocusChanged(FALSE) lifecycle events */ - NV_EVENT_FOCUS_LOST, - /** onPause lifecycle events */ - NV_EVENT_PAUSE, - /** onStop lifecycle events */ - NV_EVENT_STOP, - /** (onDestroy) Quit request events */ - NV_EVENT_QUIT, - /** App-specific events */ - NV_EVENT_USER, - NV_EVENT_MWM, - /* a dummy enum value used to compute num_events */ - NV_EVENT_NUM_EVENT_DUMMY_DONTUSEME, - /* total number of events */ - NV_EVENT_NUM_EVENTS = NV_EVENT_NUM_EVENT_DUMMY_DONTUSEME - 1, - NV_EVENT_FORCE_32BITS = 0x7fffffff -} NVEventType; - -/** Touch event actions -*/ -typedef enum NVTouchEventType -{ - /** Pointer has just left the screen */ - NV_TOUCHACTION_UP, - /** Pointer has just gone down onto the screen */ - NV_TOUCHACTION_DOWN, - /** Pointer is moving on the screen */ - NV_TOUCHACTION_MOVE, - NV_TOUCHACTION_FORCE_32BITS = 0x7fffffff -} NVTouchEventType; - -/** Multitouch event flags -*/ -typedef enum NVMultiTouchEventType -{ - /** Indicated pointers are leaving the screen */ - NV_MULTITOUCH_UP = 0x00000001, - /** Indicated pointers have just touched the screen */ - NV_MULTITOUCH_DOWN = 0x00000002, - /** Indicated pointers are moving on the screen */ - NV_MULTITOUCH_MOVE = 0x00000003, - /** Indicated pointers have halted the current gesture - app should cancel any actions implied by the gesture */ - NV_MULTITOUCH_CANCEL = 0x00000004, - /** Mask to be AND'ed with the flag value - to get the active pointer bits */ - NV_MULTITOUCH_POINTER_MASK = 0x0000ff00, - /** Number of bits to right-shift the masked value - to get the active pointer bits */ - NV_MULTITOUCH_POINTER_SHIFT = 0x00000008, - /** Mask to be AND'ed with the flag value - to get the event action */ - NV_MULTITOUCH_ACTION_MASK = 0x000000ff, - NV_MULTITOUCH_FORCE_32BITS = 0x7fffffff -} NVMultiTouchEventType; - -/** Key event types -*/ -typedef enum NVKeyEventType -{ - /** Key has just been pressed (no repeats) */ - NV_KEYACTION_UP, - /** Key has just been released */ - NV_KEYACTION_DOWN, - NV_KEYACTION_FORCE_32BITS = 0x7fffffff -} NVKeyEventType; - -/** Key event key codes -*/ -#define NV_MAX_KEYCODE 256 -typedef enum NVKeyCode -{ - NV_KEYCODE_NULL = 0, - NV_KEYCODE_BACK, - NV_KEYCODE_TAB, - NV_KEYCODE_ENTER, - NV_KEYCODE_DEL, - NV_KEYCODE_SPACE, - NV_KEYCODE_ENDCALL, - NV_KEYCODE_HOME, - - NV_KEYCODE_STAR, - NV_KEYCODE_PLUS, - NV_KEYCODE_MINUS, - NV_KEYCODE_NUM, - - NV_KEYCODE_DPAD_LEFT, - NV_KEYCODE_DPAD_UP, - NV_KEYCODE_DPAD_RIGHT, - NV_KEYCODE_DPAD_DOWN, - - NV_KEYCODE_0, - NV_KEYCODE_1, - NV_KEYCODE_2, - NV_KEYCODE_3, - NV_KEYCODE_4, - NV_KEYCODE_5, - NV_KEYCODE_6, - NV_KEYCODE_7, - NV_KEYCODE_8, - NV_KEYCODE_9, - - NV_KEYCODE_A, - NV_KEYCODE_B, - NV_KEYCODE_C, - NV_KEYCODE_D, - NV_KEYCODE_E, - NV_KEYCODE_F, - NV_KEYCODE_G, - NV_KEYCODE_H, - NV_KEYCODE_I, - NV_KEYCODE_J, - NV_KEYCODE_K, - NV_KEYCODE_L, - NV_KEYCODE_M, - NV_KEYCODE_N, - NV_KEYCODE_O, - NV_KEYCODE_P, - NV_KEYCODE_Q, - NV_KEYCODE_R, - NV_KEYCODE_S, - NV_KEYCODE_T, - NV_KEYCODE_U, - NV_KEYCODE_V, - NV_KEYCODE_W, - NV_KEYCODE_X, - NV_KEYCODE_Y, - NV_KEYCODE_Z, - - NV_KEYCODE_ALT_LEFT, - NV_KEYCODE_ALT_RIGHT, - - NV_KEYCODE_SHIFT_LEFT, - NV_KEYCODE_SHIFT_RIGHT, - - NV_KEYCODE_APOSTROPHE, - NV_KEYCODE_SEMICOLON, - NV_KEYCODE_EQUALS, - NV_KEYCODE_COMMA, - NV_KEYCODE_PERIOD, - NV_KEYCODE_SLASH, - NV_KEYCODE_GRAVE, - NV_KEYCODE_BACKSLASH, - - NV_KEYCODE_LEFT_BRACKET, - NV_KEYCODE_RIGHT_BRACKET, - - NV_KEYCODE_FORCE_32BIT = 0x7fffffff -} NVKeyCode; - -/** Single-touch event data -*/ -typedef struct NVEventTouch -{ - /** The action code */ - NVTouchEventType m_action; - /** The window-relative X position (in pixels) */ - float m_x; - /** The window-relative Y position (in pixels) */ - float m_y; -} NVEventTouch; - -/** Multi-touch event data -*/ -typedef struct NVEventMultiTouch -{ - /** The action flags */ - NVMultiTouchEventType m_action; - /** The window-relative X position of the first pointer (in pixels) - only valid if bit 0 of the pointer bits is set */ - float m_x1; - /** The window-relative Y position of the first pointer (in pixels) - only valid if bit 0 of the pointer bits is set */ - float m_y1; - /** The window-relative X position of the second pointer (in pixels) - only valid if bit 1 of the pointer bits is set */ - float m_x2; - /** The window-relative Y position of the second pointer (in pixels) - only valid if bit 1 of the pointer bits is set */ - float m_y2; -} NVEventMultiTouch; - -/** Key down/up event data -*/ -typedef struct NVEventKey -{ - /** The action flags */ - NVKeyEventType m_action; - /** The code of the key pressed or released */ - NVKeyCode m_code; -} NVEventKey; - -/** Translated character event data -*/ -typedef struct NVEventChar -{ - /** The UNICODE character represented */ - int32_t m_unichar; -} NVEventChar; - -/** Accelerometer event data -*/ -typedef struct NVEventAccel -{ - /** Signed X magnitude of the force vector */ - float m_x; - /** Signed Y magnitude of the force vector */ - float m_y; - /** Signed Z magnitude of the force vector */ - float m_z; -} NVEventAccel; - -/** Surface size change event data -*/ -typedef struct NVEventSurfaceSize -{ - /** New surface client area width (in pixels) */ - int32_t m_w; - /** New surface client area height (in pixels) */ - int32_t m_h; - /** Screen density for the screen at which this surface was created*/ - int32_t m_density; -} NVEventSurfaceSize; - -/** User/App-specific event data -*/ -typedef struct NVEventUser -{ - /** First 32-bit user data item */ - int32_t m_u0; - /** Second 32-bit user data item */ - int32_t m_u1; - /** Third 32-bit user data item */ - int32_t m_u2; - /** Fourth 32-bit user data item */ - int32_t m_u3; -} NVEventUser; - -typedef struct NVEventMWM -{ - void * m_pFn; -} NVEventMWM; - -/** All-encompassing event structure -*/ -typedef struct NVEvent -{ - /** The type of the event, which also indicates which m_data union holds the data */ - NVEventType m_type; - /** Union containing all possible event type data */ - union NVEventData - { - /** Data for single-touch events */ - NVEventTouch m_touch; - /** Data for multi-touch events */ - NVEventMultiTouch m_multi; - /** Data for key up/down events */ - NVEventKey m_key; - /** Data for charcter events */ - NVEventChar m_char; - /** Data for accelerometer events */ - NVEventAccel m_accel; - /** Data for surface size events */ - NVEventSurfaceSize m_size; - /** Data for user/app events */ - NVEventUser m_user; - NVEventMWM m_mwm; - } m_data; -} NVEvent; - -/** Returns a string describing the event -@param eventType The event type -@return Returns a string containing a description of the event. Do not free or delete this memory. -@see NVEvent */ -const char * NVEventGetEventStr(NVEventType eventType); - -/** Returns the next pending event for the application to process. Can return immediately if there -is no event, or can wait a fixed number of milisecs (or "forever") if desired. -The application should always pair calls to this function that return non-NULL events with calls -to NVEventDoneWithEvent() -@param waitMSecs The maximum time (in milisecs) to wait for an event before returning "no event". - Pass NV_EVENT_WAIT_FOREVER to wait indefinitely for an event. Note that NV_EVENT_WAIT_FOREVER - does not guarantee an event on return. The function can still return on error or if the - app is exiting. Default is to return immediately, event or not. -@return Non-NULL pointer to a constant event structure if an event was pending, NULL if no event was - pending in the requested timeout period -@see NVEvent -@see NVEventDoneWithEvent -*/ -const NVEvent * NVEventGetNextEvent(int waitMSecs = 0); - -/** Indicates that the application has finished handling the event returned from the last -call to NVEventGetNextEvent. This function should always be called prior to the next call -to NVEventGetNextEvent. If the current event is a blocking event, this call will unblock -the posting thread (normally in Java). This is particularly important for application -lifecycle events like onPause, as calling this function indicates that the native code has -completed the handling of the lifecycle callback. Failure to call this function promptly -for all events can lead to Application Not Responding errors. -@param handled The return value that should be passed back to Java for blocking events. For non-blocking -events, this parameter is discard. -@see NVEvent -@see NVEventGetNextEvent -*/ -void NVEventDoneWithEvent(bool handled); - -/** The app-supplied "callback" for initialization during JNI_OnLoad. -Declares the application's pre-main initialization function. Does not define the -function. The app must define this in its own code, even if the function is empty. -JNI init code can be safely called from here, as it WILL be called from -within a JNI function thread -@parm argc Passes the number of command line arguments. - This is currently unsupported and is always passed 0 -@parm argv Passes the array of command line arguments. - This is currently unsupported and is always passed NULL -@return The function should return 0 on success and nonzero on failure. -*/ -extern int32_t NVEventAppInit(int32_t argc, char** argv); - -/** The app-supplied "callback" for running the application's main loop. -Declares the application's main loop function. Does not define the -function. The app must define this in its own code -This function will be spawned in its own thread. -@parm argc Passes the number of command line arguments. - This is currently unsupported and is always passed 0 -@parm argv Passes the array of command line arguments. - This is currently unsupported and is always passed NULL -@return The function should return 0 on success and nonzero on failure. -*/ -extern int32_t NVEventAppMain(int32_t argc, char** argv); - - -/** Initializes EGL, queries a valid ES1 config and creates (but does not bind) - an ES1-compatible EGLContext -@return true on success, false on failure -*/ -bool NVEventInitEGL(); - -/** Releases any existing EGLSurface and EGLContext and terminates EGL -@return true on success, false on failure -*/ -bool NVEventCleanupEGL(); - -/** Creates an EGLSurface for the current Android surface. Will attempt to initialize - EGL and an EGLContext if not already done. Fails if there is no valid Android surface - or if there is an EGL error. -@return true on success, false on failure -*/ -bool NVEventCreateSurfaceEGL(); - -/** Unbinds (if needed) and releases the app's EGLSurface -@return true on success, false on failure -*/ -bool NVEventDestroySurfaceEGL(); - -/** Binds the app's EGLSurface and EGLContext to the calling thread. The EGLSurface and - EGLContext must both exist already, or else the function will fail. -@return true on success, false on failure -*/ -bool NVEventBindSurfaceAndContextEGL(); - -/** Un-binds the app's EGLSurface and EGLContext from the calling thread. -@return true on success, false on failure -*/ -bool NVEventUnbindSurfaceAndContextEGL(); - -/** Swaps the currently-bound EGLSurface -@return true on success, false on failure -*/ -bool NVEventSwapBuffersEGL(); - -/** Accessor for the last EGL error -@return the EGL error -*/ -int NVEventGetErrorEGL(); - -/** Utility function: checks if EGl is completely ready to render, including - initialization, surface creation and context/surface binding. -@parm allocateIfNeeded If the parameter is false, then the function immediately returns if any - part of the requirements have not already been satisfied. If the parameter is - true, then the function attempts to initialize any of the steps needed, failing - and returning false only if a step cannot be completed at this time. -@return The function returns true if EGL/GLES is ready to render/load content (i.e. - a context and surface are bound) and false it not -*/ -bool NVEventReadyToRenderEGL(bool allocateIfNeeded); - -/** Convenience conditional function to determine if the app is between onCreate - and onDestroy callbacks (i.e. the app is in a running state). -@return true if the application is between onCreate and onDestroy and false after - an onDestroy event has been delivered. -*/ -bool NVEventStatusIsRunning(); - -/** Convenience conditional function to determine if the app is between onResume and onPause - callbacks (i.e. the app is in a "resumed" state). -@return true if the application is between onResume and onPause and false if the application - has not yet been resumed, or is currently paused. -*/ -bool NVEventStatusIsActive(); - -/** Convenience conditional function to determine if the app's window is focused (between - calls to onWindowFocusChanged(true) and onWindowFocusChanged(false)) -@return true between onWindowFocusChanged(true) and onWindowFocusChanged(false) -*/ -bool NVEventStatusIsFocused(); - -/** Convenience conditional function to determine if the app has a surface and that surface - has non-zero area -@return true if the app is between surfaceCreated and surfaceDestroyed callbacks and - the surface has non-zero pixel area (not 0x0 pixels) -*/ -bool NVEventStatusHasRealSurface(); - -/** Convenience conditional function to determine if the app is in a fully-focused, visible - state. This is a logical "AND" of IsRunning, IsActive, IsFocused and HasRealSurface -@return true if IsRunning, IsActive, IsFocused and HasRealSurface are all currently true, -false otherwise -*/ -bool NVEventStatusIsInteractable(); - -/** Convenience conditional function to determine if the app has active EGL -@return true between successful calls to NVEventInitEGL and NVEventCleanupEGL, -false otherwise -*/ -bool NVEventStatusEGLInitialized(); - -/** Convenience conditional function to determine if the app has an EGLSurface (need not be bound) -@return true if the EGLSurface for the app is allocated, false otherwise -*/ -bool NVEventStatusEGLHasSurface(); - -/** Convenience conditional function to determine if the app has an EGLSurface and EGLContext - and they are bound -@return true if the EGLSurface and EGLContext for the app are allocated and bound, false otherwise -*/ -bool NVEventStatusEGLIsBound(); - -bool NVEventRepaint(); - -void NVEventReportUnsupported(); - -void NVEventOnRenderingInitialized(); - -/** Returns the platform-specific handle to the application instance, if supported. This -function is, by definition platform-specific. -@return A platform-specific handle to the application. */ -NVEventPlatformAppHandle NVEventGetPlatformAppHandle(); - -void InitNVEvent(JavaVM * jvm); - -void postMWMEvent(void * pFn, bool blocking); - -#endif diff --git a/android/jni/nv_event/nv_event_queue.cpp b/android/jni/nv_event/nv_event_queue.cpp deleted file mode 100644 index 4172040dd7..0000000000 --- a/android/jni/nv_event/nv_event_queue.cpp +++ /dev/null @@ -1,276 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_event\nv_event_queue.cpp -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA� Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- -#define MODULE "NVEventQueue" -#include "../nv_debug/nv_debug.hpp" - -#include "nv_event_queue.hpp" -#include -#include -#include -#include -#include - -#define NVNextWrapped(index) (((index) + 1) & QUEUE_MASK) -#define NVPrevWrapped(index) (((index) - 1) & QUEUE_MASK) - -/* you must be inside a m_accessLock lock to invoke this! */ -static void unlockAll(NVEventSync * sem) -{ - sem->m_block = false; - pthread_cond_broadcast(&(sem->m_cond)); -} - -/* you must be inside mutex lock to invoke this! */ -static int32_t wait(NVEventSync * sem, pthread_mutex_t * mutex, int waitMS) -{ - // TBD - spec is dodgy; do we definitely release the mutex even if - // wait fails? - if(sem->m_block) - { - if( waitMS < 0 ) - return pthread_cond_wait(&sem->m_cond, mutex); - else - return pthread_cond_timeout_np(&sem->m_cond, mutex, (unsigned)waitMS); - } - else - { - // must release this, as failure assumes no lock - pthread_mutex_unlock(mutex); - return 1; // do not return 0 - we do not own the lock! - } -} - -static void signal(NVEventSync * sem) -{ - pthread_cond_signal(&sem->m_cond); -} - -static void broadcast(NVEventSync * sem) -{ - pthread_cond_broadcast(&sem->m_cond); -} - -static void syncInit(NVEventSync * sync) -{ - pthread_cond_init(&sync->m_cond, NULL); - sync->m_block = true; -} - -static void syncDestroy(NVEventSync * sync) -{ - pthread_cond_destroy(&sync->m_cond); -} - -/* you must be inside a m_accessLock lock to invoke this! */ -bool NVEventQueue::insert(NVEvent const * ev) -{ - // Is the queue full? - int32_t nextNext = NVNextWrapped(m_nextInsertIndex); - if (nextNext == m_headIndex) - { - // TBD - what to do when we cannot insert (full queue) - return false; - } - - NVEvent * evDest = m_events + m_nextInsertIndex; - memcpy(evDest, ev, sizeof(NVEvent)); - - m_nextInsertIndex = nextNext; - return true; -} - -void NVEventQueue::Init() -{ - m_nextInsertIndex = 0; - m_headIndex = 0; - pthread_mutex_init(&m_accessLock, NULL); - syncInit(&m_consumerSync); - syncInit(&m_blockerSync); - - m_blocker = NULL; - m_blockerState = NO_BLOCKER; - m_blockerReturnVal = false; -} - -void NVEventQueue::Shutdown() -{ - pthread_mutex_destroy(&m_accessLock); - - // free everyone... - unlockAll(&m_consumerSync); - unlockAll(&m_blockerSync); - syncDestroy(&m_consumerSync); - syncDestroy(&m_blockerSync); -} - -void NVEventQueue::Flush() -{ - // TBD: Lock the mutex???? - m_headIndex = m_nextInsertIndex; -} - -void NVEventQueue::UnblockConsumer() -{ - unlockAll(&m_consumerSync); -} - -void NVEventQueue::UnblockProducer() -{ - unlockAll(&m_blockerSync); -} - -void NVEventQueue::Insert(const NVEvent* ev) -{ - pthread_mutex_lock(&m_accessLock); - - // insert the event and unblock a waiter - insert(ev); - signal(&m_consumerSync); - pthread_mutex_unlock(&m_accessLock); -} - -bool NVEventQueue::InsertBlocking(const NVEvent* ev) -{ - // TBD - how to handle the destruction of these mutexes - - pthread_mutex_lock(&m_accessLock); - while (m_blocker) - { - if (wait(&m_blockerSync, &m_accessLock, NV_EVENT_WAIT_FOREVER)) - return false; - } - - assert(!m_blocker); - assert(m_blockerState == NO_BLOCKER); - - // we have the mutex _and_ the blocking event is NULL - // So now we can push a new one - m_blocker = ev; - m_blockerState = PENDING_BLOCKER; - - // Release the consumer, as we just posted a new event - signal(&m_consumerSync); - - // Loop on the condition variable until we find out that - // there is a return value waiting for us. Since only we - // will null the blocker pointer, we will not let anyone - // else start to post a blocking event - while (m_blockerState != RETURNED_BLOCKER) - { - if (wait(&m_blockerSync, &m_accessLock, NV_EVENT_WAIT_FOREVER)) - return false; - } - - bool handled = m_blockerReturnVal; - m_blocker = NULL; - m_blockerState = NO_BLOCKER; - - NVDEBUG("producer unblocking from consumer handling blocking event (%s)", handled ? "true" : "false"); - - // We've handled the event, so the producer can release the - // next thread to potentially post a blocking event - signal(&m_blockerSync); - pthread_mutex_unlock(&m_accessLock); - - return handled; -} - - -const NVEvent* NVEventQueue::RemoveOldest(int waitMSecs) -{ - pthread_mutex_lock(&m_accessLock); - - // Hmm - the last event we got from RemoveOldest was a - // blocker, and DoneWithEvent not called. - // Default to "false" as a return value - if (m_blockerState == PROCESSING_BLOCKER) - { - m_blockerReturnVal = false; - m_blockerState = RETURNED_BLOCKER; - broadcast(&m_blockerSync); - } - - // Blocker is waiting - return it - // And push the blocker pipeline forward - if(m_blockerState == PENDING_BLOCKER) - { - m_blockerState = PROCESSING_BLOCKER; - const NVEvent* ev = m_blocker; - pthread_mutex_unlock(&m_accessLock); - - return ev; - } - else if (m_nextInsertIndex == m_headIndex) - { - // We're empty - so what do we do? - if (waitMSecs == 0) - { - goto no_event; - } - else - { - // wait for the specified time - wait(&m_consumerSync, &m_accessLock, (unsigned)waitMSecs); - } - - // check again after exiting cond waits, either we had a timeout - if(m_blockerState == PENDING_BLOCKER) - { - m_blockerState = PROCESSING_BLOCKER; - const NVEvent* ev = m_blocker; - pthread_mutex_unlock(&(m_accessLock)); - - return ev; - } - else if (m_nextInsertIndex == m_headIndex) - { - goto no_event; - } - } - - { - // One way or another, we have an event... - NVEvent const * ev = m_events + m_headIndex; - m_headIndex = NVNextWrapped(m_headIndex); - - pthread_mutex_unlock(&m_accessLock); - return ev; - } - -no_event: - pthread_mutex_unlock(&m_accessLock); - return NULL; -} - -void NVEventQueue::DoneWithEvent(bool ret) -{ - // We only care about blockers for now. - // All other events just NOP - pthread_mutex_lock(&m_accessLock); - if (m_blockerState == PROCESSING_BLOCKER) - { - m_blockerReturnVal = ret; - m_blockerState = RETURNED_BLOCKER; - broadcast(&m_blockerSync); - } - pthread_mutex_unlock(&m_accessLock); -} diff --git a/android/jni/nv_event/nv_event_queue.hpp b/android/jni/nv_event/nv_event_queue.hpp deleted file mode 100644 index b6d0c113c4..0000000000 --- a/android/jni/nv_event/nv_event_queue.hpp +++ /dev/null @@ -1,89 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_event\nv_event_queue.h -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA� Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- - -#ifndef NV_EVENT_QUEUE -#define NV_EVENT_QUEUE - -#include "nv_event.hpp" -#include - -class NVEventSync -{ -public: - pthread_cond_t m_cond; - bool m_block; -}; - -class NVEventQueue { -public: - void Init(); - void Shutdown(); - void Flush(); - void UnblockConsumer(); - void UnblockProducer(); - // Events are copied, so caller can reuse ev immediately - void Insert(NVEvent const * ev); - // Waits until the event is consumed. Returns whether the - // consumer indicates handling the event or ignoring it - bool InsertBlocking(NVEvent const * ev); - - // Returned event is valid only until the next call to - // RemoveOldest or until a call to DoneWithEvent - // Calling RemoveOldest again without calling DoneWithEvent - // indicates that the last event returned was NOT handled, and - // thus InsertNewestAndWait for that even would return false - const NVEvent* RemoveOldest(int waitMSecs); - - // Indicates that all processing of the last event returned - // from RemoveOldest is complete. Also allows the app to indicate - // whether it handled the event or not. - // Do not dereference the last event pointer after calling this function - void DoneWithEvent(bool ret); - -protected: - bool insert(NVEvent const * ev); - - enum { QUEUE_ELEMS = 256 }; - enum { QUEUE_MASK = 0x000000ff }; - - int32_t m_nextInsertIndex; - int32_t m_headIndex; - - pthread_mutex_t m_accessLock; - - NVEventSync m_blockerSync; - NVEventSync m_consumerSync; - - NVEvent m_events[QUEUE_ELEMS]; - NVEvent const * m_blocker; - enum BlockerState - { - NO_BLOCKER, - PENDING_BLOCKER, - PROCESSING_BLOCKER, - RETURNED_BLOCKER - }; - BlockerState m_blockerState; - bool m_blockerReturnVal; -}; - -#endif // #ifndef NV_EVENT_QUEUE diff --git a/android/jni/nv_event/nv_keycode_mapping.hpp b/android/jni/nv_event/nv_keycode_mapping.hpp deleted file mode 100644 index 0434240c39..0000000000 --- a/android/jni/nv_event/nv_keycode_mapping.hpp +++ /dev/null @@ -1,147 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_event\nv_keycode_mapping.h -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA® Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- - -class NVKeyCodeMapping -{ -public: - NVKeyCodeMapping() - { - memset(m_keyMapping, 0, sizeof(NVKeyCode) * NV_MAX_KEYCODE); - } - - void Init(JNIEnv* env, jobject thiz); - - bool MapKey(int key, NVKeyCode& code); - -protected: - void AddKeyMapping(JNIEnv* env, jobject thiz, jclass KeyCode_class, const char* name, NVKeyCode value); - NVKeyCode m_keyMapping[NV_MAX_KEYCODE]; -}; - -/* Init the mapping array, set up the event queue */ -void NVKeyCodeMapping::AddKeyMapping(JNIEnv* env, jobject thiz, jclass KeyCode_class, const char* name, NVKeyCode value) -{ - // Add a new mapping... - jfieldID id = env->GetStaticFieldID(KeyCode_class, name, "I"); - int keyID = env->GetStaticIntField(KeyCode_class, id); - - if (keyID < NV_MAX_KEYCODE) - { - /* TODO TBD Should check for collision */ - m_keyMapping[keyID] = value; - } -} - -#define AddKeymappingMacro(name, value) \ - AddKeyMapping(env, thiz, KeyCode_class, name, value) - -void NVKeyCodeMapping::Init(JNIEnv* env, jobject thiz) -{ - jclass KeyCode_class = env->FindClass("android/view/KeyEvent"); - - AddKeymappingMacro("KEYCODE_BACK",NV_KEYCODE_BACK); - AddKeymappingMacro("KEYCODE_TAB",NV_KEYCODE_TAB); - AddKeymappingMacro("KEYCODE_ENTER",NV_KEYCODE_ENTER); - - AddKeymappingMacro("KEYCODE_SPACE",NV_KEYCODE_SPACE); - AddKeymappingMacro("KEYCODE_ENDCALL",NV_KEYCODE_ENDCALL); - AddKeymappingMacro("KEYCODE_HOME",NV_KEYCODE_HOME); - - AddKeymappingMacro("KEYCODE_DPAD_LEFT",NV_KEYCODE_DPAD_LEFT); - AddKeymappingMacro("KEYCODE_DPAD_UP",NV_KEYCODE_DPAD_UP); - AddKeymappingMacro("KEYCODE_DPAD_RIGHT",NV_KEYCODE_DPAD_RIGHT); - AddKeymappingMacro("KEYCODE_DPAD_DOWN",NV_KEYCODE_DPAD_DOWN); - - AddKeymappingMacro("KEYCODE_DEL",NV_KEYCODE_DEL); - - AddKeymappingMacro("KEYCODE_0",NV_KEYCODE_0); - AddKeymappingMacro("KEYCODE_1",NV_KEYCODE_1); - AddKeymappingMacro("KEYCODE_2",NV_KEYCODE_2); - AddKeymappingMacro("KEYCODE_3",NV_KEYCODE_3); - AddKeymappingMacro("KEYCODE_4",NV_KEYCODE_4); - AddKeymappingMacro("KEYCODE_5",NV_KEYCODE_5); - AddKeymappingMacro("KEYCODE_6",NV_KEYCODE_6); - AddKeymappingMacro("KEYCODE_7",NV_KEYCODE_7); - AddKeymappingMacro("KEYCODE_8",NV_KEYCODE_8); - AddKeymappingMacro("KEYCODE_9",NV_KEYCODE_9); - - AddKeymappingMacro("KEYCODE_A",NV_KEYCODE_A); - AddKeymappingMacro("KEYCODE_B",NV_KEYCODE_B); - AddKeymappingMacro("KEYCODE_C",NV_KEYCODE_C); - AddKeymappingMacro("KEYCODE_D",NV_KEYCODE_D); - AddKeymappingMacro("KEYCODE_E",NV_KEYCODE_E); - AddKeymappingMacro("KEYCODE_F",NV_KEYCODE_F); - AddKeymappingMacro("KEYCODE_G",NV_KEYCODE_G); - AddKeymappingMacro("KEYCODE_H",NV_KEYCODE_H); - AddKeymappingMacro("KEYCODE_I",NV_KEYCODE_I); - AddKeymappingMacro("KEYCODE_J",NV_KEYCODE_J); - AddKeymappingMacro("KEYCODE_K",NV_KEYCODE_K); - AddKeymappingMacro("KEYCODE_L",NV_KEYCODE_L); - AddKeymappingMacro("KEYCODE_M",NV_KEYCODE_M); - AddKeymappingMacro("KEYCODE_N",NV_KEYCODE_N); - AddKeymappingMacro("KEYCODE_O",NV_KEYCODE_O); - AddKeymappingMacro("KEYCODE_P",NV_KEYCODE_P); - AddKeymappingMacro("KEYCODE_Q",NV_KEYCODE_Q); - AddKeymappingMacro("KEYCODE_R",NV_KEYCODE_R); - AddKeymappingMacro("KEYCODE_S",NV_KEYCODE_S); - AddKeymappingMacro("KEYCODE_T",NV_KEYCODE_T); - AddKeymappingMacro("KEYCODE_U",NV_KEYCODE_U); - AddKeymappingMacro("KEYCODE_V",NV_KEYCODE_V); - AddKeymappingMacro("KEYCODE_W",NV_KEYCODE_W); - AddKeymappingMacro("KEYCODE_X",NV_KEYCODE_X); - AddKeymappingMacro("KEYCODE_Y",NV_KEYCODE_Y); - AddKeymappingMacro("KEYCODE_Z",NV_KEYCODE_Z); - - AddKeymappingMacro("KEYCODE_STAR",NV_KEYCODE_STAR); - AddKeymappingMacro("KEYCODE_PLUS",NV_KEYCODE_PLUS); - AddKeymappingMacro("KEYCODE_MINUS",NV_KEYCODE_MINUS); - - AddKeymappingMacro("KEYCODE_NUM",NV_KEYCODE_NUM); - - AddKeymappingMacro("KEYCODE_ALT_LEFT",NV_KEYCODE_ALT_LEFT); - AddKeymappingMacro("KEYCODE_ALT_RIGHT",NV_KEYCODE_ALT_RIGHT); - - AddKeymappingMacro("KEYCODE_SHIFT_LEFT",NV_KEYCODE_SHIFT_LEFT); - AddKeymappingMacro("KEYCODE_SHIFT_RIGHT",NV_KEYCODE_SHIFT_RIGHT); - - AddKeymappingMacro("KEYCODE_APOSTROPHE",NV_KEYCODE_APOSTROPHE); - AddKeymappingMacro("KEYCODE_SEMICOLON",NV_KEYCODE_SEMICOLON); - AddKeymappingMacro("KEYCODE_EQUALS",NV_KEYCODE_EQUALS); - AddKeymappingMacro("KEYCODE_COMMA",NV_KEYCODE_COMMA); - AddKeymappingMacro("KEYCODE_PERIOD",NV_KEYCODE_PERIOD); - AddKeymappingMacro("KEYCODE_SLASH",NV_KEYCODE_SLASH); - AddKeymappingMacro("KEYCODE_GRAVE",NV_KEYCODE_GRAVE); - AddKeymappingMacro("KEYCODE_LEFT_BRACKET",NV_KEYCODE_LEFT_BRACKET); - AddKeymappingMacro("KEYCODE_BACKSLASH",NV_KEYCODE_BACKSLASH); - AddKeymappingMacro("KEYCODE_RIGHT_BRACKET",NV_KEYCODE_RIGHT_BRACKET); -} - -bool NVKeyCodeMapping::MapKey(int key, NVKeyCode& code) -{ - if (key < NV_MAX_KEYCODE) - { - code = m_keyMapping[key]; - return true; - } - else - return false; -} diff --git a/android/jni/nv_event/scoped_profiler.hpp b/android/jni/nv_event/scoped_profiler.hpp deleted file mode 100644 index 1c3d2f2aae..0000000000 --- a/android/jni/nv_event/scoped_profiler.hpp +++ /dev/null @@ -1,82 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_event\scoped_profiler.h -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA® Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- - -#ifndef SCOPED_PROFILER_H -#define SCOPED_PROFILER_H - -#define PERF_STMTS 0 -#if PERF_STMTS == 1 -#include "../nv_time/nv_time.hpp" -#include "stdio.h" -#include "stdlib.h" - -static char s_bigString[4096]; -static int s_bigStringSize; - -static char s_tmpBuf[1024]; - -class ScopedProfiler -{ -public: - ScopedProfiler(const char* text) - { - _text = text; - _startTime = nvGetSystemTime(); - __last = this; - } - ~ScopedProfiler() - { - stop(); - } - inline void stop() - { - if(_text) - { - int size = snprintf(s_tmpBuf, dimof(s_tmpBuf)-1, "%d ms spent in %s" , (int)(nvGetSystemTime() - _startTime), _text); - strcat(s_bigString + s_bigStringSize, s_tmpBuf); - s_bigStringSize += size; - _text = 0; - } - static void stopLast() - { - if(__last) - __last->stop(); - __last = 0; - } - const char* _text; - long _startTime; - static ScopedProfiler* __last; -}; -ScopedProfiler* ScopedProfiler::__last = 0; - -#define STRINGIFIER(s) #s -#define CONCAT_(a,b) a ## b -#define CONCAT(a,b) CONCAT_(a,b) -#define PERFBLURB(s) static const char CONCAT(___str,__LINE__)[] = s "\n"; ScopedProfiler CONCAT(SCOPED_PROFILER,__LINE__)(CONCAT(___str,__LINE__)); -#define RESET_PROFILING() { DEBUG_D("%s", s_bigString); s_bigString[0] = 0; s_bigStringSize = 0; } -#else -#define PERFBLURB(s) -#define RESET_PROFILING() -#endif - -#endif // SCOPED_PROFILER_H - diff --git a/android/jni/nv_thread/nv_thread.cpp b/android/jni/nv_thread/nv_thread.cpp deleted file mode 100644 index f7d1a87d39..0000000000 --- a/android/jni/nv_thread/nv_thread.cpp +++ /dev/null @@ -1,136 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_thread\nv_thread.c -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA� Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- - -#include - -#include "nv_thread.hpp" -#include -#include - -static JavaVM* s_vm = NULL; -static pthread_key_t s_jniEnvKey = 0; - -#define MODULE "NVThread" - -#include "../nv_debug/nv_debug.hpp" -#include "../com/mapswithme/core/jni_helper.hpp" - -void NVThreadInit(JavaVM* vm) -{ - s_vm = vm; -} - -JNIEnv* NVThreadGetCurrentJNIEnv() -{ - return jni::GetEnv(); -} - -typedef void * (*StartRoutine)(void *); - -typedef struct NVThreadInitStruct -{ - void* m_arg; - StartRoutine m_startRoutine; -} NVThreadInitStruct; - -// Implementations are in PThreadImpl.cpp -// They're used automatically if thread is created with base/thread.hpp -// @TODO: refactor and remove -void AndroidThreadAttachToJVM(); -void AndroidThreadDetachFromJVM(); - -static void * NVThreadSpawnProc(void* arg) -{ - NVThreadInitStruct * init = (NVThreadInitStruct *)arg; - StartRoutine startRoutine = init->m_startRoutine; - void * data = init->m_arg; - void * ret; - - free(arg); - - AndroidThreadAttachToJVM(); - - ret = startRoutine(data); - - AndroidThreadDetachFromJVM(); - - return ret; -} - -int NVThreadSpawnJNIThread(pthread_t * thread, pthread_attr_t const * attr, - StartRoutine startRoutine, void * arg) -{ - if (!startRoutine) - return -1; - - NVThreadInitStruct * initData = new NVThreadInitStruct; - - initData->m_startRoutine = startRoutine; - initData->m_arg = arg; - - int err = pthread_create(thread, attr, NVThreadSpawnProc, initData); - - // If the thread was not started, then we need to delete the init data ourselves - if (err) - free(initData); - - return err; -} - -// on linuces, signals can interrupt sleep functions, so you might need to -// retry to get the full sleep going. I'm not entirely sure this is necessary -// *here* clients could retry themselves when the exposed function returns -// nonzero -inline int __sleep(const struct timespec *req, struct timespec *rem) -{ - int ret = 1; - int i; - static const int sleepTries = 2; - - struct timespec req_tmp={0}, rem_tmp={0}; - - rem_tmp = *req; - for(i = 0; i < sleepTries; ++i) - { - req_tmp = rem_tmp; - int ret = nanosleep(&req_tmp, &rem_tmp); - if(ret == 0) - { - ret = 0; - break; - } - } - if(rem) - *rem = rem_tmp; - return ret; -} - -int NVThreadSleep(unsigned long millisec) -{ - struct timespec req={0},rem={0}; - time_t sec =(int)(millisec/1000); - - millisec = millisec-(sec*1000); - req.tv_sec = sec; - req.tv_nsec = millisec*1000000L; - return __sleep(&req,&rem); -} diff --git a/android/jni/nv_thread/nv_thread.hpp b/android/jni/nv_thread/nv_thread.hpp deleted file mode 100644 index 20e03f5a4a..0000000000 --- a/android/jni/nv_thread/nv_thread.hpp +++ /dev/null @@ -1,97 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_thread\nv_thread.h -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA® Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- - -#ifndef __INCLUDED_NV_THREAD_H -#define __INCLUDED_NV_THREAD_H - -#include -#include -#include - -#if defined(__cplusplus) -extern "C" -{ -#endif - -/** @file nv_thread.h - The NVThread library makes it easy to create native threads that can acess - JNI objects. By default, pthreads created in the Android NDK are NOT connected - to the JVM and JNI calls will fail. This library wraps thread creation in - such a way that pthreads created using it will connect to and disconnect from - the JVM as appropriate. Applications creating all of their threads with these - interfaces can use the provided NVThreadGetCurrentJNIEnv() function to - get the current thread's JNI context at any time. - - Note that native-created threads still have JNI limitations over threads - that are calls down to native from Java. The JNI function FindClass will - NOT find application-specific classes when called from native threads. - Native code that needs to call FindClass and record the indices of Java - class members for later access must call FindClass and Get*FieldID/Get*MethodID - in threads calling from Java, such as JNI_OnLoad - */ - -/** - Initializes the nv_thread system by connecting it to the JVM. This - function must be called as early as possible in the native code's - JNI_OnLoad function, so that the thread system is prepared for any - JNI-dependent library initialization calls. - @param vm The VM pointer - should be the JavaVM pointer sent to JNI_OnLoad. - */ -void NVThreadInit(JavaVM* vm); - -/** - Retrieves the JNIEnv object associated with the current thread, allowing - any thread that was creating with NVThreadSpawnJNIThread() to access the - JNI at will. This JNIEnv is NOT usable across multiple calls or threads - The function should be called in each function that requires a JNIEnv - @return The current thread's JNIEnv, or NULL if the thread was not created - by NVThreadSpawnJNIThread - @see NVThreadSpawnJNIThread - */ -JNIEnv* NVThreadGetCurrentJNIEnv(); - -/** - Spwans a new native thread that is registered for use with JNI. Threads - created with this function will have access to JNI data via the JNIEnv - available from NVThreadGetCurrentJNIEnv(). - @param thread is the same as in pthread_create - @param attr is the same as in pthread_create - @param start_routine is the same as in pthread_create - @param arg is the same as in pthread_create - @return 0 on success, -1 on failure - @see NVThreadGetCurrentJNIEnv -*/ -int NVThreadSpawnJNIThread(pthread_t *thread, pthread_attr_t const * attr, - void *(*start_routine)(void *), void * arg); - -/** - Sleeps the current thread for the specified number of milliseconds - @param millisec Sleep time in ms - @return 0 on success, -1 on failure -*/ -int NVThreadSleep(unsigned long millisec); - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/android/jni/nv_time/nv_time.cpp b/android/jni/nv_time/nv_time.cpp deleted file mode 100644 index 441d4442da..0000000000 --- a/android/jni/nv_time/nv_time.cpp +++ /dev/null @@ -1,47 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_time\nv_time.cpp -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA® Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- - -#include "nv_time.hpp" -#include "../nv_thread/nv_thread.hpp" -#include -#include -#include -#include -#include - -long nvGetSystemTime() -{ - static struct timeval start_time, end_time; - static int isinit = 0; - jlong curr_time = 0; - - if (!isinit) - { - gettimeofday(&start_time, 0); - isinit = 1; - } - gettimeofday(&end_time, 0); - curr_time = (end_time.tv_sec - start_time.tv_sec) * 1000; - curr_time += (end_time.tv_usec - start_time.tv_usec) / 1000; - - return curr_time; -} diff --git a/android/jni/nv_time/nv_time.hpp b/android/jni/nv_time/nv_time.hpp deleted file mode 100644 index f1b16a45ef..0000000000 --- a/android/jni/nv_time/nv_time.hpp +++ /dev/null @@ -1,30 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: libs\jni\nv_time\nv_time.h -// Samples Version: NVIDIA Android Lifecycle samples 1_0beta -// Email: tegradev@nvidia.com -// Web: http://developer.nvidia.com/category/zone/mobile-development -// -// Copyright 2009-2011 NVIDIA® Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//---------------------------------------------------------------------------------- - -#ifndef __INCLUDED_NV_TIME_H -#define __INCLUDED_NV_TIME_H - -#include - -long nvGetSystemTime(); - -#endif diff --git a/android/jni/opengl/android_gl_utils.h b/android/jni/opengl/android_gl_utils.h deleted file mode 100644 index df743426b2..0000000000 --- a/android/jni/opengl/android_gl_utils.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include -#include - -class ConfigComparator -{ -public: - ConfigComparator(EGLDisplay display) - : m_display(display) - {} - - int operator()(EGLConfig const & l, EGLConfig const & r) const - { - return configWeight(l) - configWeight(r); - } - - int configWeight(EGLConfig const & config) const - { - int val = -1; - eglGetConfigAttrib(m_display, config, EGL_CONFIG_CAVEAT, &val); - - switch (val) - { - case EGL_NONE: - return 0; - case EGL_SLOW_CONFIG: - return 1; - case EGL_NON_CONFORMANT_CONFIG: - return 2; - default: - return 0; - } - } - -private: - EGLDisplay m_display; -}; - diff --git a/android/jni/opengl/androidoglcontextfactory.cpp b/android/jni/opengl/androidoglcontextfactory.cpp deleted file mode 100644 index 23fffa3160..0000000000 --- a/android/jni/opengl/androidoglcontextfactory.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "androidoglcontextfactory.h" -#include "android_gl_utils.h" - -#include "base/assert.hpp" - -#include "std/algorithm.hpp" - -static EGLint * getConfigAttributesList() -{ - static EGLint attr_list[] = { - EGL_RED_SIZE, 5, - EGL_GREEN_SIZE, 6, - EGL_BLUE_SIZE, 5, - EGL_STENCIL_SIZE, 0, - EGL_DEPTH_SIZE, 16, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT, - EGL_NONE - }; - return attr_list; -} - -AndroidOGLContextFactory::AndroidOGLContextFactory(JNIEnv * env, jobject jsurface) - : m_drawContext(NULL) - , m_uploadContext(NULL) - , m_windowSurface(EGL_NO_SURFACE) - , m_pixelbufferSurface(EGL_NO_SURFACE) - , m_config(NULL) - , m_nativeWindow(NULL) - , m_display(EGL_NO_DISPLAY) -{ - CHECK(jsurface, ()); - - m_nativeWindow = ANativeWindow_fromSurface(env, jsurface); - ASSERT(m_nativeWindow, ()); - - m_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - ASSERT(m_display != EGL_NO_DISPLAY, ()); - - EGLint version[2] = {0}; - VERIFY(eglInitialize(m_display, &version[0], &version[1]), ()); - - createWindowSurface(); - createPixelbufferSurface(); -} - -AndroidOGLContextFactory::~AndroidOGLContextFactory() -{ - delete m_drawContext; - delete m_uploadContext; - - eglDestroySurface(m_display, m_windowSurface); - eglDestroySurface(m_display, m_pixelbufferSurface); - eglTerminate(m_display); - - ANativeWindow_release(m_nativeWindow); -} - -OGLContext * AndroidOGLContextFactory::getDrawContext() -{ - ASSERT(m_windowSurface != EGL_NO_SURFACE, ()); - if (m_drawContext == NULL) - m_drawContext = new AndroidOGLContext(m_display, m_windowSurface, m_config, m_uploadContext); - return m_drawContext; -} - -OGLContext * AndroidOGLContextFactory::getResourcesUploadContext() -{ - ASSERT(m_pixelbufferSurface != EGL_NO_SURFACE, ()); - if (m_uploadContext == NULL) - m_uploadContext = new AndroidOGLContext(m_display, m_pixelbufferSurface, m_config, m_drawContext); - return m_uploadContext; -} - -void AndroidOGLContextFactory::createWindowSurface() -{ - EGLConfig configs[40]; - int count = 0; - VERIFY(eglChooseConfig(m_display, getConfigAttributesList(), configs, 40, &count) == EGL_TRUE, ()); - ASSERT(count > 0, ("Didn't find any configs.")); - - sort(&configs[0], &configs[count], ConfigComparator(m_display)); - for (int i = 0; i < count; ++i) - { - EGLConfig currentConfig = configs[i]; - - m_windowSurface = eglCreateWindowSurface(m_display, currentConfig, m_nativeWindow, EGL_BACK_BUFFER); - if (m_windowSurface == EGL_NO_SURFACE) - continue; - else - m_config = currentConfig; - - EGLint configId = 0; - eglGetConfigAttrib(m_display, m_config, EGL_CONFIG_ID, &configId); - LOG(LINFO, ("Choosen config id:", configId)); - - break; - } - - CHECK(m_config != NULL, ()); - CHECK(m_windowSurface != EGL_NO_SURFACE, ()); -} - -void AndroidOGLContextFactory::createPixelbufferSurface() -{ - ASSERT(m_config != NULL, ()); - - const GLuint size = 1; // yes, 1 is the correct size, we dont really draw on it - static EGLint surfaceConfig[] = { - EGL_WIDTH, size, EGL_HEIGHT, size, EGL_NONE - }; - m_pixelbufferSurface = eglCreatePbufferSurface(m_display, m_config, surfaceConfig); - - CHECK(m_pixelbufferSurface != EGL_NO_SURFACE, ()); -} - - diff --git a/android/jni/opengl/androidoglcontextfactory.h b/android/jni/opengl/androidoglcontextfactory.h deleted file mode 100644 index 42d50b0bb2..0000000000 --- a/android/jni/opengl/androidoglcontextfactory.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "androidoglcontext.hpp" -#include "drape/oglcontextfactory.hpp" - - -class AndroidOGLContextFactory : public OGLContextFactory -{ -public: - AndroidOGLContextFactory(JNIEnv * env, jobject jsurface); - ~AndroidOGLContextFactory(); - - virtual OGLContext * getDrawContext(); - virtual OGLContext * getResourcesUploadContext(); - -private: - void createWindowSurface(); - void createPixelbufferSurface(); - - - AndroidOGLContext * m_drawContext; - AndroidOGLContext * m_uploadContext; - - EGLSurface m_windowSurface; - EGLSurface m_pixelbufferSurface; - EGLConfig m_config; - - ANativeWindow * m_nativeWindow; - EGLDisplay m_display; -}; diff --git a/android/res/anim/slide_appear_down.xml b/android/res/anim/slide_appear_down.xml deleted file mode 100644 index 3c4502cb29..0000000000 --- a/android/res/anim/slide_appear_down.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/res/anim/slide_disappear_up.xml b/android/res/anim/slide_disappear_up.xml deleted file mode 100644 index fbe4136682..0000000000 --- a/android/res/anim/slide_disappear_up.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/res/values-ar/strings.xml b/android/res/values-ar/strings.xml index 188bf65af7..e50e8546e8 100644 --- a/android/res/values-ar/strings.xml +++ b/android/res/values-ar/strings.xml @@ -92,7 +92,7 @@ ^\nقد تم إضاÙته الى ص٠الانتظار لعملية التنزيل - جاري التنزيل\n^\n^% + جاري التنزيل\n^\n^ (^ ^)\nتحميل الخريطة diff --git a/android/res/values-cs/strings.xml b/android/res/values-cs/strings.xml index 8e7798c9e2..933068e7d7 100644 --- a/android/res/values-cs/strings.xml +++ b/android/res/values-cs/strings.xml @@ -89,7 +89,7 @@ ^\npÅ™idáno do fronty stahování - Stahování\n^\n^% + Stahování\n^\n^ Stáhnout mapu\n(^ ^) diff --git a/android/res/values-da/strings.xml b/android/res/values-da/strings.xml index 77fd784b2d..b4c8e90824 100644 --- a/android/res/values-da/strings.xml +++ b/android/res/values-da/strings.xml @@ -90,7 +90,7 @@ ^\ner tilføjet til download-køen - Downloader\n^\n^% + Downloader\n^\n^ Download kort\n(^ ^) diff --git a/android/res/values-de/strings.xml b/android/res/values-de/strings.xml index 3e6c47a4e0..b8f9017d4e 100644 --- a/android/res/values-de/strings.xml +++ b/android/res/values-de/strings.xml @@ -89,7 +89,7 @@ ^\nwird zur Download-Warteschleife hinzugefügt - Wird heruntergeladen\n^\n^% + Wird heruntergeladen\n^\n^ Karte herunterladen\n(^ ^) diff --git a/android/res/values-es/strings.xml b/android/res/values-es/strings.xml index e11cf487d6..deb206586a 100644 --- a/android/res/values-es/strings.xml +++ b/android/res/values-es/strings.xml @@ -87,7 +87,7 @@ ^\nañadido a la cola de descarga - Descargando\n^\n^% + Descargando\n^\n^ Descargar mapa\n(^ ^) diff --git a/android/res/values-fi/strings.xml b/android/res/values-fi/strings.xml index fb4cfcdfdc..34cc68e575 100644 --- a/android/res/values-fi/strings.xml +++ b/android/res/values-fi/strings.xml @@ -94,7 +94,7 @@ ^\non lisätty latausjonoon. - Ladataan\n^\n^% + Ladataan\n^\n^ Lataa kartta\n(^ ^) diff --git a/android/res/values-fr/strings.xml b/android/res/values-fr/strings.xml index 7786d66f6a..af9ae1bc58 100644 --- a/android/res/values-fr/strings.xml +++ b/android/res/values-fr/strings.xml @@ -93,7 +93,7 @@ ^\nest ajouté à la file de téléchargement - Téléchargement de\n^\n^% + Téléchargement de\n^\n^ Téléchargez la carte\n(^ ^) diff --git a/android/res/values-hu/strings.xml b/android/res/values-hu/strings.xml index 3c55b06ff7..573ec4e944 100644 --- a/android/res/values-hu/strings.xml +++ b/android/res/values-hu/strings.xml @@ -89,7 +89,7 @@ ^\n-t hozzáadtuk a letöltési sorhoz - ^\n^%\nletöltése folyamatban + ^\n^\nletöltése folyamatban Térkép letöltése\n(^ ^) diff --git a/android/res/values-in/strings.xml b/android/res/values-in/strings.xml index 500507ee72..5d74294e50 100644 --- a/android/res/values-in/strings.xml +++ b/android/res/values-in/strings.xml @@ -94,7 +94,7 @@ ^\ntelah ditambahkan ke antrean pengunduhan. - Sedang mengunduh\n^\n^% + Sedang mengunduh\n^\n^ Unduh Peta\n(^ ^) diff --git a/android/res/values-it/strings.xml b/android/res/values-it/strings.xml index f701e1a202..1457c95bf0 100644 --- a/android/res/values-it/strings.xml +++ b/android/res/values-it/strings.xml @@ -87,7 +87,7 @@ ^\naggiunto alla coda di download - Sto scaricando\n^\n^% + Sto scaricando\n^\n^ Scarica Map\n(^ ^) diff --git a/android/res/values-ja/strings.xml b/android/res/values-ja/strings.xml index b77ca2e446..bc231e685e 100644 --- a/android/res/values-ja/strings.xml +++ b/android/res/values-ja/strings.xml @@ -87,7 +87,7 @@ ^\nをダウンロードキューã«è¿½åŠ ã—ã¾ã—㟠- ^\n^%\nをダウンロード中 + ^\n^\nをダウンロード中 地図をダウンロード\n(^ ^) diff --git a/android/res/values-ko/strings.xml b/android/res/values-ko/strings.xml index d5a946dfe1..7e43283681 100644 --- a/android/res/values-ko/strings.xml +++ b/android/res/values-ko/strings.xml @@ -86,7 +86,7 @@ ^\n는 다운로드 대기열ì—추가ë©ë‹ˆë‹¤ - 다운로드 중\n^\n^% + 다운로드 중\n^\n^ ì§€ë„ ë‹¤ìš´ë¡œë“œ\n(^ ^) diff --git a/android/res/values-nb/strings.xml b/android/res/values-nb/strings.xml index 7aee535c05..329e2a24be 100644 --- a/android/res/values-nb/strings.xml +++ b/android/res/values-nb/strings.xml @@ -94,7 +94,7 @@ ^\ner lagt til i nedlastingskøen. - Laster ned\n^\n^% + Laster ned\n^\n^ Last ned kart\n(^ ^) diff --git a/android/res/values-nl/strings.xml b/android/res/values-nl/strings.xml index 6c116a2f43..0ac4b16fa4 100644 --- a/android/res/values-nl/strings.xml +++ b/android/res/values-nl/strings.xml @@ -85,7 +85,7 @@ ^\nis toegevoegd aan de download wachtrij - aan het downloaden\n^\n^% + aan het downloaden\n^\n^ Kaart downloaden\n(^ ^) diff --git a/android/res/values-pl/strings.xml b/android/res/values-pl/strings.xml index e35861966f..1567040160 100644 --- a/android/res/values-pl/strings.xml +++ b/android/res/values-pl/strings.xml @@ -89,7 +89,7 @@ ^\ndodano do kolejki pobierania - Pobieranie\n^\n^% + Pobieranie\n^\n^ Pobierz mapÄ™\n(^ ^) diff --git a/android/res/values-pt/strings.xml b/android/res/values-pt/strings.xml index cf862b3af8..5c70cb9e48 100644 --- a/android/res/values-pt/strings.xml +++ b/android/res/values-pt/strings.xml @@ -87,7 +87,7 @@ ^\né adicionado à fila de descargas - A descarregar\n^\n^% + A descarregar\n^\n^ Descarregar Mapa\n(^ ^) diff --git a/android/res/values-ro/strings.xml b/android/res/values-ro/strings.xml index 10c0e993cc..33527f9095 100644 --- a/android/res/values-ro/strings.xml +++ b/android/res/values-ro/strings.xml @@ -94,7 +94,7 @@ ^\neste adăugată la coada de descărcare. - Se descarcă\n^\n^% + Se descarcă\n^\n^ Descărcare hartă\n(^ ^) diff --git a/android/res/values-ru/strings.xml b/android/res/values-ru/strings.xml index ec0dbfa684..478513e98d 100644 --- a/android/res/values-ru/strings.xml +++ b/android/res/values-ru/strings.xml @@ -93,7 +93,7 @@ ^\nдобавлено в очередь загрузки - ЗагружаетÑÑ\n^\n^% + ЗагружаетÑÑ\n^\n^ Загрузить карту\n(^ ^) diff --git a/android/res/values-sk/strings.xml b/android/res/values-sk/strings.xml index 325e3215ca..5a7efa815b 100644 --- a/android/res/values-sk/strings.xml +++ b/android/res/values-sk/strings.xml @@ -89,7 +89,7 @@ ^\npridané do zoznamu sÅ¥ahovania - SÅ¥ahovanie\n^\n^% + SÅ¥ahovanie\n^\n^ Stiahnite si Mapu\n(^ ^) diff --git a/android/res/values-sv/strings.xml b/android/res/values-sv/strings.xml index a8399d4751..48760954f2 100644 --- a/android/res/values-sv/strings.xml +++ b/android/res/values-sv/strings.xml @@ -88,7 +88,7 @@ ^\när tillagd till nedladdningskön - Laddar ner\n^\n^% + Laddar ner\n^\n^ Ladda ner karta\n(^ ^) diff --git a/android/res/values-th/strings.xml b/android/res/values-th/strings.xml index 9e52a2fd78..b95942b9ed 100644 --- a/android/res/values-th/strings.xml +++ b/android/res/values-th/strings.xml @@ -92,7 +92,7 @@ มีà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡ ^\nไปยังลำดับà¸à¸²à¸£à¸”าวน์โหลดà¹à¸¥à¹‰à¸§ - à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด\n^\n^% + à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด\n^\n^ ดาวน์โหลดà¹à¸œà¸™à¸—ี่\n(^ ^) diff --git a/android/res/values-tr/strings.xml b/android/res/values-tr/strings.xml index 5fed4dcd71..8ef9ec0d11 100644 --- a/android/res/values-tr/strings.xml +++ b/android/res/values-tr/strings.xml @@ -92,7 +92,7 @@ ^\nindirme kuyruÄŸuna eklendi - ^\n^%\nindiriliyor + ^\n^\nindiriliyor Haritayı Ä°ndir\n(^ ^) diff --git a/android/res/values-uk/strings.xml b/android/res/values-uk/strings.xml index e334240078..98528f4f07 100644 --- a/android/res/values-uk/strings.xml +++ b/android/res/values-uk/strings.xml @@ -93,7 +93,7 @@ ^\nдобавлено в чергу Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ - ЗавантажуєтьÑÑ\n^\n^% + ЗавантажуєтьÑÑ\n^\n^ Завантажити мапу\n(^ ^) diff --git a/android/res/values-vi/strings.xml b/android/res/values-vi/strings.xml index 88023fbe5e..4d54085ce8 100644 --- a/android/res/values-vi/strings.xml +++ b/android/res/values-vi/strings.xml @@ -94,7 +94,7 @@ ^\nđã được thêm vào danh sách đợi tải xuống. - Äang tải xuống\n^\n^% + Äang tải xuống\n^\n^ Tải xuống Bản đồ\n(^ ^) diff --git a/android/res/values-zh-rTW/strings.xml b/android/res/values-zh-rTW/strings.xml index d6fb3b2f79..f24add9a89 100644 --- a/android/res/values-zh-rTW/strings.xml +++ b/android/res/values-zh-rTW/strings.xml @@ -90,7 +90,7 @@ ^\n已加入到下載佇列中 - 下載中\n^\n^% + 下載中\n^\n^ 下載地圖\n(^ ^) diff --git a/android/res/values-zh/strings.xml b/android/res/values-zh/strings.xml index 9136f5c72e..822f37eac0 100644 --- a/android/res/values-zh/strings.xml +++ b/android/res/values-zh/strings.xml @@ -88,7 +88,7 @@ ^\n添加至下载åºåˆ— - 下载 \n^\n^%中 + 下载 \n^\n^中 下载地图\n(^ ^) diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index 189344d4fc..e1b6c5891b 100644 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -94,7 +94,7 @@ ^\nis added to the downloading queue. - Downloading\n^\n^% + Downloading\n^\n^ Download Map\n(^ ^) diff --git a/android/src/com/mapswithme/country/DownloadActivity.java b/android/src/com/mapswithme/country/DownloadActivity.java index 8398c1c1b2..743400063d 100644 --- a/android/src/com/mapswithme/country/DownloadActivity.java +++ b/android/src/com/mapswithme/country/DownloadActivity.java @@ -3,6 +3,7 @@ package com.mapswithme.country; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; +import android.util.Log; import com.mapswithme.maps.base.BaseMwmFragmentActivity; diff --git a/android/src/com/mapswithme/maps/Framework.java b/android/src/com/mapswithme/maps/Framework.java index 392cc4c894..5cd6e3ce8e 100644 --- a/android/src/com/mapswithme/maps/Framework.java +++ b/android/src/com/mapswithme/maps/Framework.java @@ -20,13 +20,6 @@ public class Framework public static final int ROUTER_TYPE_VEHICLE = 0; public static final int ROUTER_TYPE_PEDESTRIAN = 1; - // should correspond to values from 'information_display.hpp' in core - public static final int MAP_WIDGET_RULER = 0; - public static final int MAP_WIDGET_COPYRIGHT = 1; - public static final int MAP_WIDGET_COUNTRY_STATUS = 2; - public static final int MAP_WIDGET_COMPASS = 3; - public static final int MAP_WIDGET_DEBUG_LABEL = 4; - @SuppressWarnings("unused") public interface OnBalloonListener { @@ -87,8 +80,6 @@ public class Framework public native static MapObject nativeGetMapObjectForPoint(double lat, double lon); - public native static void nativeActivateUserMark(double lat, double lon); - public native static void nativeSetBalloonListener(OnBalloonListener listener); public native static void nativeRemoveBalloonListener(); @@ -103,8 +94,6 @@ public class Framework public native static void injectData(SearchResult searchResult, long index); - public native static void invalidate(); - public native static void deactivatePopup(); public native static String[] nativeGetMovableFilesExts(); @@ -182,8 +171,6 @@ public class Framework public native static void nativeSetRouteEndPoint(double lat, double lon, boolean valid); - public native static void setWidgetPivot(int widget, int pivotX, int pivotY); - /** * Registers all maps(.mwms). Adds them to the models, generates indexes and does all necessary stuff. */ diff --git a/android/src/com/mapswithme/maps/LocationState.java b/android/src/com/mapswithme/maps/LocationState.java index f2563baca8..6578d102d8 100644 --- a/android/src/com/mapswithme/maps/LocationState.java +++ b/android/src/com/mapswithme/maps/LocationState.java @@ -4,32 +4,20 @@ public enum LocationState { INSTANCE; - // These values should correspond to values of location::State::Mode defined in map/location_state.hpp + /// These values should correspond to values of + /// location::EMyPositionMode defined in platform/location.hpp public static final int UNKNOWN_POSITION = 0x0; public static final int PENDING_POSITION = 0x1; public static final int NOT_FOLLOW = 0x2; public static final int FOLLOW = 0x3; public static final int ROTATE_AND_FOLLOW = 0x4; - public static final int SLOT_UNDEFINED = -1; - public native void switchToNextMode(); public native int getLocationStateMode(); - /* - * Adds listener - * @param l - * @return slotId of added listener - */ - public native int addLocationStateModeListener(Object l); - - /** - * Removes listener with slotId - * - * @param slotId slotId of listener to remove - */ - public native void removeLocationStateModeListener(int slotId); + public native void setMyPositionModeListener(Object l); + public native void removeMyPositionModeListener(); public native void turnOff(); diff --git a/android/src/com/mapswithme/maps/MapFragment.java b/android/src/com/mapswithme/maps/MapFragment.java index 717358d604..95e7e4acce 100644 --- a/android/src/com/mapswithme/maps/MapFragment.java +++ b/android/src/com/mapswithme/maps/MapFragment.java @@ -2,18 +2,54 @@ package com.mapswithme.maps; import android.app.Activity; import android.content.DialogInterface; +import android.graphics.Rect; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; +import android.util.DisplayMetrics; +import android.view.*; +import com.mapswithme.maps.base.BaseMwmFragment; import com.mapswithme.maps.downloader.DownloadHelper; import com.mapswithme.util.UiUtils; -import com.nvidia.devtech.NvEventQueueFragment; +import com.mapswithme.util.concurrency.UiThread; -public class MapFragment extends NvEventQueueFragment +public class MapFragment extends BaseMwmFragment + implements View.OnTouchListener, + SurfaceHolder.Callback { + // Should correspond to android::MultiTouchAction from Framework.cpp + private static final int NATIVE_ACTION_UP = 0x01; + private static final int NATIVE_ACTION_DOWN = 0x02; + private static final int NATIVE_ACTION_MOVE = 0x03; + private static final int NATIVE_ACTION_CANCEL = 0x04; + + // Should correspond to gui::EWidget from skin.hpp + private static final int WIDGET_RULER = 0x01; + private static final int WIDGET_COMPASS = 0x02; + private static final int WIDGET_COPYRIGHT = 0x04; + private static final int WIDGET_SCALE_LABEL = 0x08; + + // Should correspond to dp::Anchor from drape_global.hpp + private static final int ANCHOR_CENTER = 0x00; + private static final int ANCHOR_LEFT = 0x01; + private static final int ANCHOR_RIGHT = (ANCHOR_LEFT << 1); + private static final int ANCHOR_TOP = (ANCHOR_RIGHT << 1); + private static final int ANCHOR_BOTTOM = (ANCHOR_TOP << 1); + private static final int ANCHOR_LEFT_TOP = (ANCHOR_LEFT | ANCHOR_TOP); + private static final int ANCHOR_RIGHT_TOP = (ANCHOR_RIGHT | ANCHOR_TOP); + private static final int ANCHOR_LEFT_BOTTOM = (ANCHOR_LEFT | ANCHOR_BOTTOM); + private static final int ANCHOR_RIGHT_BOTTOM = (ANCHOR_RIGHT | ANCHOR_BOTTOM); + + // Should correspond to df::TouchEvent::INVALID_MASKED_POINTER from user_event_stream.cpp + private static final int INVALID_POINTER_MASK = 0xFF; + private static final int INVALID_TOUCH_ID = -1; + + private int mHeight; + private int mWidth; + private boolean mRequireResize; + private boolean mEngineCreated; + private static boolean sWasCopyrightDisplayed; + public interface MapRenderingListener { void onRenderingInitialized(); @@ -21,24 +57,139 @@ public class MapFragment extends NvEventQueueFragment public static final String FRAGMENT_TAG = MapFragment.class.getName(); - protected native void nativeConnectDownloadButton(); + private void setupWidgets(int width, int height) + { + mHeight = height; + mWidth = width; - protected native void nativeDownloadCountry(MapStorage.Index index, int options); + nativeCleanWidgets(); + if (!sWasCopyrightDisplayed) + { + nativeSetupWidget(WIDGET_COPYRIGHT, + mWidth - UiUtils.dimen(R.dimen.margin_ruler_right), + mHeight - UiUtils.dimen(R.dimen.margin_ruler_bottom), + ANCHOR_RIGHT_BOTTOM); + sWasCopyrightDisplayed = true; + } - protected native void nativeOnLocationError(int errorCode); + nativeSetupWidget(WIDGET_RULER, + mWidth - UiUtils.dimen(R.dimen.margin_ruler_right), + mHeight - UiUtils.dimen(R.dimen.margin_ruler_bottom), + ANCHOR_RIGHT_BOTTOM); - protected native void nativeLocationUpdated(long time, double lat, double lon, float accuracy, double altitude, float speed, float bearing); + if (BuildConfig.DEBUG) + { + nativeSetupWidget(WIDGET_SCALE_LABEL, + UiUtils.dimen(R.dimen.margin_base), + UiUtils.dimen(R.dimen.margin_base), + ANCHOR_LEFT_TOP); + } - protected native void nativeCompassUpdated(double magneticNorth, double trueNorth, boolean force); + setupCompass(0, 0, false); + } - protected native void nativeScale(double k); + void setupCompass(int offsetX, int offsetY, boolean forceRedraw) + { + nativeSetupWidget(WIDGET_COMPASS, + UiUtils.dimen(R.dimen.margin_compass_left) + offsetX, + mHeight - UiUtils.dimen(R.dimen.margin_compass_bottom) + offsetY, + ANCHOR_CENTER); + if (forceRedraw) + nativeApplyWidgets(); + } - public native boolean showMapForUrl(String url); + void setupRuler(int offsetX, int offsetY, boolean forceRedraw) + { + nativeSetupWidget(WIDGET_RULER, + mWidth - UiUtils.dimen(R.dimen.margin_ruler_right) + offsetX, + mHeight - UiUtils.dimen(R.dimen.margin_ruler_bottom) + offsetY, + ANCHOR_RIGHT_BOTTOM); + if (forceRedraw) + nativeApplyWidgets(); + } + + private void onRenderingInitialized() + { + final Activity activity = getActivity(); + if (isAdded() && activity instanceof MapRenderingListener) + ((MapRenderingListener) activity).onRenderingInitialized(); + } + + private void reportUnsupported() + { + new AlertDialog.Builder(getActivity()) + .setMessage(getString(R.string.unsupported_phone)) + .setCancelable(false) + .setPositiveButton(getString(R.string.close), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dlg, int which) + { + getActivity().moveTaskToBack(true); + } + }).show(); + } @Override - public void onCreate(Bundle savedInstanceState) + public void surfaceCreated(SurfaceHolder surfaceHolder) { - super.onCreate(savedInstanceState); + final Surface surface = surfaceHolder.getSurface(); + if (nativeIsEngineCreated()) + { + nativeAttachSurface(surface); + mRequireResize = true; + return; + } + + mRequireResize = false; + final Rect rect = surfaceHolder.getSurfaceFrame(); + setupWidgets(rect.width(), rect.height()); + + final DisplayMetrics dm = getActivity().getResources().getDisplayMetrics(); + final float exactDensityDpi = (dm.xdpi + dm.ydpi) / 2; + + mEngineCreated = nativeCreateEngine(surface, (int)exactDensityDpi); + if (mEngineCreated) + onRenderingInitialized(); + else + reportUnsupported(); + } + + @Override + public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) + { + if (!mEngineCreated || + (!mRequireResize && surfaceHolder.isCreating())) + return; + + nativeSurfaceChanged(width, height); + + mRequireResize = false; + setupWidgets(width, height); + nativeApplyWidgets(); + } + + @Override + public void surfaceDestroyed(SurfaceHolder surfaceHolder) + { + if (!mEngineCreated) + return; + + if (getActivity() == null || !getActivity().isChangingConfigurations()) + { + // We're in the main thread here. So nothing from the queue will be run between these two calls. + // Destroy engine first, then clear the queue that theoretically can be filled by nativeDestroyEngine(). + nativeDestroyEngine(); + MwmApplication.get().clearFunctorsOnUiThread(); + } + else + nativeDetachSurface(); + } + + @Override + public void onCreate(Bundle b) + { + super.onCreate(b); setRetainInstance(true); } @@ -52,92 +203,103 @@ public class MapFragment extends NvEventQueueFragment public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + final SurfaceView surfaceView = (SurfaceView) view.findViewById(R.id.map_surfaceview); + surfaceView.getHolder().addCallback(this); nativeConnectDownloadButton(); } @Override - protected void applyWidgetPivots() + public boolean onTouch(View view, MotionEvent event) { - Framework.setWidgetPivot(Framework.MAP_WIDGET_RULER, - mSurfaceWidth - UiUtils.dimen(R.dimen.margin_ruler_right), - mSurfaceHeight - UiUtils.dimen(R.dimen.margin_ruler_bottom)); - Framework.setWidgetPivot(Framework.MAP_WIDGET_COPYRIGHT, - mSurfaceWidth - UiUtils.dimen(R.dimen.margin_ruler_right), - mSurfaceHeight - UiUtils.dimen(R.dimen.margin_ruler_bottom)); + final int count = event.getPointerCount(); - adjustCompass(0); - } + if (count == 0) + return false; - public void adjustCompass(int offset) - { - Framework.setWidgetPivot(Framework.MAP_WIDGET_COMPASS, - UiUtils.dimen(R.dimen.margin_compass_left) + offset, - mSurfaceHeight - UiUtils.dimen(R.dimen.margin_compass_bottom)); - } - - @Override - public void OnRenderingInitialized() - { - final Activity host = getActivity(); - if (isAdded() && host instanceof MapRenderingListener) + int action = event.getActionMasked(); + int pointerIndex = event.getActionIndex(); + switch (action) { - final MapRenderingListener listener = (MapRenderingListener) host; - listener.onRenderingInitialized(); + case MotionEvent.ACTION_POINTER_UP: + action = NATIVE_ACTION_UP; + break; + case MotionEvent.ACTION_UP: + action = NATIVE_ACTION_UP; + pointerIndex = 0; + break; + case MotionEvent.ACTION_POINTER_DOWN: + action = NATIVE_ACTION_DOWN; + break; + case MotionEvent.ACTION_DOWN: + action = NATIVE_ACTION_DOWN; + pointerIndex = 0; + break; + case MotionEvent.ACTION_MOVE: + action = NATIVE_ACTION_MOVE; + pointerIndex = INVALID_POINTER_MASK; + break; + case MotionEvent.ACTION_CANCEL: + action = NATIVE_ACTION_CANCEL; + break; } - super.OnRenderingInitialized(); - } - - @Override - public void ReportUnsupported() - { - getActivity().runOnUiThread(new Runnable() + switch (count) { - @Override - public void run() - { - new AlertDialog.Builder(getActivity()) - .setMessage(getString(R.string.unsupported_phone)) - .setCancelable(false) - .setPositiveButton(getString(R.string.close), new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dlg, int which) - { - getActivity().moveTaskToBack(true); - dlg.dismiss(); - } - }) - .create() - .show(); - } - }); + case 1: + nativeOnTouch(action, event.getPointerId(0), event.getX(), event.getY(), INVALID_TOUCH_ID, 0, 0, 0); + return true; + default: + nativeOnTouch(action, + event.getPointerId(0), event.getX(0), event.getY(0), + event.getPointerId(1), event.getX(1), event.getY(1), pointerIndex); + return true; + } } @SuppressWarnings("UnusedDeclaration") - public void OnDownloadCountryClicked(final int group, final int country, final int region, final int options) + public void onDownloadCountryClicked(final int group, final int country, final int region, final int options) { - getActivity().runOnUiThread(new Runnable() + UiThread.run(new Runnable() { @Override public void run() { final MapStorage.Index index = new MapStorage.Index(group, country, region); if (options == -1) - nativeDownloadCountry(index, options); - else { - long size = MapStorage.INSTANCE.countryRemoteSizeInBytes(index, options); - DownloadHelper.downloadWithCellularCheck(getActivity(), size, MapStorage.INSTANCE.countryName(index), new DownloadHelper.OnDownloadListener() - { - @Override - public void onDownload() - { - nativeDownloadCountry(index, options); - } - }); + nativeDownloadCountry(index, options); + return; } + + final long size = MapStorage.INSTANCE.countryRemoteSizeInBytes(index, options); + DownloadHelper.downloadWithCellularCheck(getActivity(), size, MapStorage.INSTANCE.countryName(index), new DownloadHelper.OnDownloadListener() + { + @Override + public void onDownload() + { + nativeDownloadCountry(index, options); + } + }); } }); } + + private native void nativeConnectDownloadButton(); + private static native void nativeDownloadCountry(MapStorage.Index index, int options); + static native void nativeOnLocationError(int errorCode); + static native void nativeLocationUpdated(long time, double lat, double lon, float accuracy, double altitude, float speed, float bearing); + static native void nativeCompassUpdated(double magneticNorth, double trueNorth, boolean forceRedraw); + static native void nativeScalePlus(); + static native void nativeScaleMinus(); + static native boolean nativeShowMapForUrl(String url); + static native boolean nativeIsEngineCreated(); + private static native boolean nativeCreateEngine(Surface surface, int density); + private static native void nativeDestroyEngine(); + private static native void nativeAttachSurface(Surface surface); + private static native void nativeDetachSurface(); + private static native void nativeSurfaceChanged(int w, int h); + private static native void nativeOnTouch(int actionType, int id1, float x1, float y1, int id2, float x2, float y2, int maskedPointer); + private static native void nativeSetupWidget(int widget, float x, float y, int anchor); + private static native void nativeApplyWidgets(); + private static native void nativeCleanWidgets(); } diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 0a45d5c2c2..9fe4dc72f2 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -60,6 +60,7 @@ import com.mapswithme.maps.widget.menu.MainMenu; import com.mapswithme.maps.widget.placepage.BasePlacePageAnimationController; import com.mapswithme.maps.widget.placepage.PlacePageView; import com.mapswithme.maps.widget.placepage.PlacePageView.State; +import com.mapswithme.util.Animations; import com.mapswithme.util.BottomSheetHelper; import com.mapswithme.util.Config; import com.mapswithme.util.InputUtils; @@ -75,7 +76,6 @@ import com.mapswithme.util.statistics.Statistics; import ru.mail.android.mytarget.nativeads.NativeAppwallAd; import ru.mail.android.mytarget.nativeads.banners.NativeAppwallBanner; - public class MwmActivity extends BaseMwmFragmentActivity implements LocationHelper.LocationListener, OnBalloonListener, @@ -88,7 +88,7 @@ public class MwmActivity extends BaseMwmFragmentActivity RoutingController.Container { public static final String EXTRA_TASK = "map_task"; - private final static String EXTRA_CONSUMED = "mwm.extra.intent.processed"; + private static final String EXTRA_CONSUMED = "mwm.extra.intent.processed"; private static final String EXTRA_UPDATE_COUNTRIES = ".extra.update.countries"; private static final String[] DOCKED_FRAGMENTS = { SearchFragment.class.getName(), @@ -116,14 +116,13 @@ public class MwmActivity extends BaseMwmFragmentActivity private PanelAnimator mPanelAnimator; private MytargetHelper mMytargetHelper; - private int mLocationStateModeListenerId = LocationState.SLOT_UNDEFINED; - private FadeView mFadeView; private ImageButton mBtnZoomIn; private ImageButton mBtnZoomOut; private boolean mIsFragmentContainer; + private boolean mIsFullscreen; private LocationPredictor mLocationPredictor; private FloatingSearchToolbarController mSearchController; @@ -168,15 +167,8 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void onRenderingInitialized() { - runOnUiThread(new Runnable() - { - @Override - public void run() - { - checkMeasurementSystem(); - checkKitkatMigrationMove(); - } - }); + checkMeasurementSystem(); + checkKitkatMigrationMove(); runTasks(); } @@ -304,9 +296,6 @@ public class MwmActivity extends BaseMwmFragmentActivity Statistics.INSTANCE.trackConnectionState(); - if (MwmApplication.get().nativeIsBenchmarking()) - Utils.keepScreenOn(true, getWindow()); - Framework.nativeSetBalloonListener(this); mSearchController = new FloatingSearchToolbarController(this); @@ -340,11 +329,9 @@ public class MwmActivity extends BaseMwmFragmentActivity mFrame = findViewById(R.id.map_fragment_container); mFadeView = (FadeView) findViewById(R.id.fade_view); - mFadeView.setListener(new FadeView.Listener() - { + mFadeView.setListener(new FadeView.Listener() { @Override - public void onTouch() - { + public void onTouch() { mMainMenu.close(true); } }); @@ -419,11 +406,9 @@ public class MwmActivity extends BaseMwmFragmentActivity private void startLocationToPoint(String statisticsEvent, String alohaEvent, final @Nullable MapObject endPoint) { - closeMenu(statisticsEvent, alohaEvent, new Runnable() - { + closeMenu(statisticsEvent, alohaEvent, new Runnable() { @Override - public void run() - { + public void run() { RoutingController.get().prepare(endPoint); if (mPlacePage.isDocked() || !mPlacePage.isFloating()) @@ -629,7 +614,7 @@ public class MwmActivity extends BaseMwmFragmentActivity mTasks.add(mapTask); intent.removeExtra(EXTRA_TASK); - if (mMapFragment.isRenderingInitialized()) + if (MapFragment.nativeIsEngineCreated()) runTasks(); // mark intent as consumed @@ -640,7 +625,7 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void onLocationError(int errorCode) { - mMapFragment.nativeOnLocationError(errorCode); + MapFragment.nativeOnLocationError(errorCode); if (errorCode == LocationHelper.ERROR_DENIED) { @@ -717,22 +702,10 @@ public class MwmActivity extends BaseMwmFragmentActivity // Callback from native location state mode element processing. @SuppressWarnings("unused") - public void onLocationStateModeChangedCallback(final int newMode) - { - runOnUiThread(new Runnable() - { - @Override - public void run() - { - refreshLocationState(newMode); - } - }); - } - - private void refreshLocationState(int newMode) + public void onMyPositionModeChangedCallback(final int newMode) { + mLocationPredictor.myPositionModeChanged(newMode); mMainMenu.getMyPositionButton().update(newMode); - switch (newMode) { case LocationState.UNKNOWN_POSITION: @@ -749,7 +722,7 @@ public class MwmActivity extends BaseMwmFragmentActivity { super.onResume(); - mLocationStateModeListenerId = LocationState.INSTANCE.addLocationStateModeListener(this); + LocationState.INSTANCE.setMyPositionModeListener(this); invalidateLocationState(); mSearchController.refreshToolbar(); @@ -832,7 +805,7 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override protected void onPause() { - LocationState.INSTANCE.removeLocationStateModeListener(mLocationStateModeListenerId); + LocationState.INSTANCE.removeMyPositionModeListener(); pauseLocation(); TtsPlayer.INSTANCE.stop(); LikesManager.INSTANCE.cancelDialogs(); @@ -855,6 +828,23 @@ public class MwmActivity extends BaseMwmFragmentActivity mLocationPredictor.pause(); } + private void refreshLocationState(int newMode) + { + mMainMenu.getMyPositionButton().update(newMode); + + switch (newMode) + { + case LocationState.UNKNOWN_POSITION: + pauseLocation(); + break; + case LocationState.PENDING_POSITION: + resumeLocation(); + break; + default: + break; + } + } + /** * Invalidates location state in core. * Updates location button accordingly. @@ -954,7 +944,7 @@ public class MwmActivity extends BaseMwmFragmentActivity return true; } - // Callbacks from native map objects touch event. + // Callbacks from native touch events on map objects. @Override public void onApiPointActivated(final double lat, final double lon, final String name, final String id) { @@ -981,28 +971,13 @@ public class MwmActivity extends BaseMwmFragmentActivity { final MapObject poi = new MapObject.Poi(name, lat, lon, type); poi.addMetadata(metaTypes, metaValues); - - runOnUiThread(new Runnable() - { - @Override - public void run() - { - activateMapObject(poi); - } - }); + activateMapObject(poi); } @Override public void onBookmarkActivated(final int category, final int bookmarkIndex) { - runOnUiThread(new Runnable() - { - @Override - public void run() - { - activateMapObject(BookmarkManager.INSTANCE.getBookmark(category, bookmarkIndex)); - } - }); + activateMapObject(BookmarkManager.INSTANCE.getBookmark(category, bookmarkIndex)); } @Override @@ -1026,20 +1001,14 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void onAdditionalLayerActivated(final String name, final String type, final double lat, final double lon, final int[] metaTypes, final String[] metaValues) { - runOnUiThread(new Runnable() - { - @Override - public void run() - { - final MapObject sr = new MapObject.SearchResult(name, type, lat, lon); - sr.addMetadata(metaTypes, metaValues); - activateMapObject(sr); - } - }); + final MapObject sr = new MapObject.SearchResult(name, type, lat, lon); + sr.addMetadata(metaTypes, metaValues); + activateMapObject(sr); } private void activateMapObject(MapObject object) { + setFullscreen(false); if (!mPlacePage.hasMapObject(object)) { mPlacePage.setMapObject(object); @@ -1054,16 +1023,48 @@ public class MwmActivity extends BaseMwmFragmentActivity public void onDismiss() { if (!mPlacePage.hasMapObject(null)) + mPlacePage.hide(); + else { - runOnUiThread(new Runnable() + if ((mPanelAnimator != null && mPanelAnimator.isVisible()) || + UiUtils.isVisible(mSearchController.getToolbar())) + return; + + setFullscreen(!mIsFullscreen); + } + } + + private void setFullscreen(boolean isFullscreen) + { + mIsFullscreen = isFullscreen; + if (isFullscreen) + { + Animations.disappearSliding(mMainMenu.getFrame(), Animations.BOTTOM, new Runnable() { @Override public void run() { - mPlacePage.hide(); - Framework.deactivatePopup(); + final int menuHeight = mMainMenu.getFrame().getHeight(); + adjustCompass(0, menuHeight); + adjustRuler(0, menuHeight); } }); + Animations.disappearSliding(mBtnZoomOut, Animations.RIGHT, null); + Animations.disappearSliding(mBtnZoomIn, Animations.RIGHT, null); + } + else + { + Animations.appearSliding(mMainMenu.getFrame(), Animations.BOTTOM, new Runnable() + { + @Override + public void run() + { + adjustCompass(0, 0); + adjustRuler(0, 0); + } + }); + Animations.appearSliding(mBtnZoomOut, Animations.RIGHT, null); + Animations.appearSliding(mBtnZoomIn, Animations.RIGHT, null); } } @@ -1098,12 +1099,12 @@ public class MwmActivity extends BaseMwmFragmentActivity case R.id.map_button_plus: Statistics.INSTANCE.trackEvent(Statistics.EventName.ZOOM_IN); AlohaHelper.logClick(AlohaHelper.ZOOM_IN); - mMapFragment.nativeScale(3.0 / 2); + MapFragment.nativeScalePlus(); break; case R.id.map_button_minus: Statistics.INSTANCE.trackEvent(Statistics.EventName.ZOOM_OUT); AlohaHelper.logClick(AlohaHelper.ZOOM_OUT); - mMapFragment.nativeScale(2 / 3.0); + MapFragment.nativeScaleMinus(); break; } } @@ -1144,7 +1145,7 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public boolean run(MwmActivity target) { - return target.mMapFragment.showMapForUrl(mUrl); + return MapFragment.nativeShowMapForUrl(mUrl); } } @@ -1164,27 +1165,29 @@ public class MwmActivity extends BaseMwmFragmentActivity public boolean run(MwmActivity target) { if (mDoAutoDownload) - { Framework.downloadCountry(mIndex); - // set zoom level so that download process is visible - Framework.nativeShowCountry(mIndex, true); - } - else - Framework.nativeShowCountry(mIndex, false); - + Framework.nativeShowCountry(mIndex, mDoAutoDownload); return true; } } - public void adjustCompass(int offset) + public void adjustCompass(int offsetX, int offsetY) { - if (mMapFragment != null && mMapFragment.isAdded()) - { - mMapFragment.adjustCompass(mPanelAnimator.isVisible() ? offset : 0); + if (mMapFragment == null || !mMapFragment.isAdded()) + return; - if (mLastCompassData != null) - mMapFragment.nativeCompassUpdated(mLastCompassData.magneticNorth, mLastCompassData.trueNorth, true); - } + mMapFragment.setupCompass((mPanelAnimator != null && mPanelAnimator.isVisible()) ? offsetX : 0, offsetY, true); + + if (mLastCompassData != null) + MapFragment.nativeCompassUpdated(mLastCompassData.magneticNorth, mLastCompassData.trueNorth, true); + } + + public void adjustRuler(int offsetX, int offsetY) + { + if (mMapFragment == null || !mMapFragment.isAdded()) + return; + + mMapFragment.setupRuler(offsetX, offsetY, true); } @Override diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index dbe8b55ed0..9ab3e0ecaa 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -4,6 +4,8 @@ import android.app.Application; import android.content.SharedPreferences; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Environment; +import android.os.Handler; +import android.os.Message; import android.preference.PreferenceManager; import android.util.Log; @@ -42,6 +44,9 @@ public class MwmApplication extends Application private boolean mAreCountersInitialized; private boolean mIsFrameworkInitialized; + private Handler mMainLoopHandler; + private Object mMainQueueToken = new Object(); + public MwmApplication() { super(); @@ -93,6 +98,7 @@ public class MwmApplication extends Application public void onCreate() { super.onCreate(); + mMainLoopHandler = new Handler(getMainLooper()); initPaths(); nativeInitPlatform(getApkPath(), getDataStoragePath(), getTempPath(), getObbGooglePath(), @@ -169,7 +175,7 @@ public class MwmApplication extends Application return cacheDir.getAbsolutePath(); return Environment.getExternalStorageDirectory().getAbsolutePath() + - String.format(Constants.STORAGE_PATH, BuildConfig.APPLICATION_ID, Constants.CACHE_DIR); + String.format(Constants.STORAGE_PATH, BuildConfig.APPLICATION_ID, Constants.CACHE_DIR); } private String getObbGooglePath() @@ -191,10 +197,15 @@ public class MwmApplication extends Application private native void nativeInitFramework(); - public native boolean nativeIsBenchmarking(); - private native void nativeAddLocalization(String name, String value); + /** + * Check if device have at least {@code size} bytes free. + */ + public native boolean hasFreeSpace(long size); + + private native void runNativeFunctor(final long functorPointer); + /* * init Parse SDK */ @@ -217,8 +228,8 @@ public class MwmApplication extends Application org.alohalytics.Statistics.logEvent(AlohaHelper.PARSE_INSTALLATION_ID, newId); org.alohalytics.Statistics.logEvent(AlohaHelper.PARSE_DEVICE_TOKEN, newToken); prefs.edit() - .putString(PREF_PARSE_INSTALLATION_ID, newId) - .putString(PREF_PARSE_DEVICE_TOKEN, newToken).apply(); + .putString(PREF_PARSE_INSTALLATION_ID, newId) + .putString(PREF_PARSE_DEVICE_TOKEN, newToken).apply(); } } }); @@ -238,4 +249,23 @@ public class MwmApplication extends Application { Config.resetAppSessionCounters(); } -} + + public void runNativeFunctorOnUiThread(final long functorPointer) + { + Message m = Message.obtain(mMainLoopHandler, new Runnable() + { + @Override + public void run() + { + runNativeFunctor(functorPointer); + } + }); + m.obj = mMainQueueToken; + mMainLoopHandler.sendMessage(m); + } + + public void clearFunctorsOnUiThread() + { + mMainLoopHandler.removeCallbacksAndMessages(mMainQueueToken); + } +} \ No newline at end of file diff --git a/android/src/com/mapswithme/maps/PanelAnimator.java b/android/src/com/mapswithme/maps/PanelAnimator.java index bd5382f04a..5413737ced 100644 --- a/android/src/com/mapswithme/maps/PanelAnimator.java +++ b/android/src/com/mapswithme/maps/PanelAnimator.java @@ -82,7 +82,7 @@ class PanelAnimator public void onAnimationEnd(Animator animation) { mAnimationTrackListener.onTrackFinished(true); - mActivity.adjustCompass(WIDTH); + mActivity.adjustCompass(WIDTH, 0); } }); @@ -118,7 +118,7 @@ class PanelAnimator { UiUtils.hide(mPanel); mAnimationTrackListener.onTrackFinished(false); - mActivity.adjustCompass(0); + mActivity.adjustCompass(0, 0); if (completionListener != null) completionListener.run(); diff --git a/android/src/com/mapswithme/maps/location/LocationPredictor.java b/android/src/com/mapswithme/maps/location/LocationPredictor.java index f94623e4ee..5a548ede7c 100644 --- a/android/src/com/mapswithme/maps/location/LocationPredictor.java +++ b/android/src/com/mapswithme/maps/location/LocationPredictor.java @@ -18,7 +18,6 @@ public class LocationPredictor private Location mLastLocation; private boolean mGeneratePredictions; private int mPredictionCount; - private int mConnectionSlot = LocationState.SLOT_UNDEFINED; public LocationPredictor(Handler handler, LocationHelper.LocationListener listener) { @@ -38,18 +37,25 @@ public class LocationPredictor public void resume() { - mConnectionSlot = LocationState.INSTANCE.addLocationStateModeListener(this); - onLocationStateModeChangedCallback(LocationState.INSTANCE.getLocationStateMode()); + myPositionModeChanged(LocationState.INSTANCE.getLocationStateMode()); } public void pause() { - LocationState.INSTANCE.removeLocationStateModeListener(mConnectionSlot); mGeneratePredictions = false; mLastLocation = null; resetHandler(); } + public void myPositionModeChanged(final int mode) + { + if (mode < LocationState.NOT_FOLLOW) + mLastLocation = null; + + mGeneratePredictions = (mode == LocationState.ROTATE_AND_FOLLOW); + resetHandler(); + } + public void reset(Location location) { if (location.hasBearing() && location.hasSpeed()) @@ -64,27 +70,6 @@ public class LocationPredictor resetHandler(); } - private void onLocationStateModeChangedCallback(final int mode) - { - mHandler.post(new Runnable() - { - @Override - public void run() - { - onLocationStateModeChangedCallbackImpl(mode); - } - }); - } - - private void onLocationStateModeChangedCallbackImpl(int mode) - { - if (mode < LocationState.NOT_FOLLOW) - mLastLocation = null; - - mGeneratePredictions = (mode == LocationState.ROTATE_AND_FOLLOW); - resetHandler(); - } - private boolean isPredict() { return mLastLocation != null && mGeneratePredictions; diff --git a/android/src/com/mapswithme/maps/routing/NavigationController.java b/android/src/com/mapswithme/maps/routing/NavigationController.java index fd000c341c..a9fcfc00f2 100644 --- a/android/src/com/mapswithme/maps/routing/NavigationController.java +++ b/android/src/com/mapswithme/maps/routing/NavigationController.java @@ -10,6 +10,7 @@ import com.mapswithme.maps.R; import com.mapswithme.maps.bookmarks.data.DistanceAndAzimut; import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.widget.FlatProgressView; +import com.mapswithme.util.Animations; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; import com.mapswithme.util.statistics.AlohaHelper; @@ -75,11 +76,11 @@ public class NavigationController if (info.vehicleNextTurnDirection.containsNextTurn()) { - UiUtils.appearSlidingDown(mNextTurnFrame, null); + Animations.appearSliding(mNextTurnFrame, Animations.TOP, null); info.vehicleNextTurnDirection.setNextTurnDrawable(mNextTurnImage); } else - UiUtils.disappearSlidingUp(mNextTurnFrame, null); + Animations.disappearSliding(mNextTurnFrame, Animations.BOTTOM, null); } private void updatePedestrian(RoutingInfo info) diff --git a/android/src/com/mapswithme/maps/routing/SlotFrame.java b/android/src/com/mapswithme/maps/routing/SlotFrame.java index 561b147af9..7273af7072 100644 --- a/android/src/com/mapswithme/maps/routing/SlotFrame.java +++ b/android/src/com/mapswithme/maps/routing/SlotFrame.java @@ -223,7 +223,7 @@ public class SlotFrame extends LinearLayout setClipToPadding(false); setClickable(true); - int padding = UiUtils.dp(8); + int padding = UiUtils.toPx(8); setPadding(padding, padding / 4, padding, padding); mSlotFrom = new Slot(this, R.id.from, 1); diff --git a/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java b/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java index e1031b659b..44e8bea1ee 100644 --- a/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java +++ b/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java @@ -5,6 +5,7 @@ import android.text.TextUtils; import com.mapswithme.maps.MwmActivity; import com.mapswithme.maps.api.ParsedMwmRequest; import com.mapswithme.maps.widget.SearchToolbarController; +import com.mapswithme.util.Animations; import com.mapswithme.util.UiUtils; public class FloatingSearchToolbarController extends SearchToolbarController @@ -42,12 +43,12 @@ public class FloatingSearchToolbarController extends SearchToolbarController if (ParsedMwmRequest.hasRequest()) { - UiUtils.appearSlidingDown(mToolbar, null); + Animations.appearSliding(mToolbar, Animations.TOP, null); setQuery(ParsedMwmRequest.getCurrentRequest().getTitle()); } else if (!TextUtils.isEmpty(SearchEngine.getQuery())) { - UiUtils.appearSlidingDown(mToolbar, null); + Animations.appearSliding(mToolbar, Animations.TOP, null); setQuery(SearchEngine.getQuery()); } else @@ -73,7 +74,7 @@ public class FloatingSearchToolbarController extends SearchToolbarController if (!UiUtils.isVisible(mToolbar)) return false; - UiUtils.disappearSlidingUp(mToolbar, null); + Animations.disappearSliding(mToolbar, Animations.TOP, null); return true; } } diff --git a/android/src/com/mapswithme/maps/widget/WebViewShadowController.java b/android/src/com/mapswithme/maps/widget/WebViewShadowController.java index f2431d8bc7..99cb0f82e4 100644 --- a/android/src/com/mapswithme/maps/widget/WebViewShadowController.java +++ b/android/src/com/mapswithme/maps/widget/WebViewShadowController.java @@ -18,7 +18,7 @@ public class WebViewShadowController extends BaseShadowController 0); case BOTTOM: - return (mList.getScrollY() + mList.getHeight() < UiUtils.dp(mList.getContentHeight() - 1)); + return (mList.getScrollY() + mList.getHeight() < UiUtils.toPx(mList.getContentHeight() - 1)); default: throw new IllegalArgumentException("Invalid shadow id: " + id); diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageBottomAnimationController.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageBottomAnimationController.java index 7558f35f39..a6262043e9 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageBottomAnimationController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageBottomAnimationController.java @@ -103,8 +103,8 @@ class PlacePageBottomAnimationController extends BasePlacePageAnimationControlle { mGestureDetector = new GestureDetectorCompat(mPlacePage.getContext(), new GestureDetector.SimpleOnGestureListener() { - private final int Y_MIN = UiUtils.dp(10); - private final int Y_MAX = UiUtils.dp(50); + private final int Y_MIN = UiUtils.toPx(10); + private final int Y_MAX = UiUtils.toPx(50); private static final int X_TO_Y_SCROLL_RATIO = 2; @Override diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageLeftAnimationController.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageLeftAnimationController.java index c5eb40949f..1ff768bb20 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageLeftAnimationController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageLeftAnimationController.java @@ -61,8 +61,8 @@ class PlacePageLeftAnimationController extends BasePlacePageAnimationController { mGestureDetector = new GestureDetectorCompat(mPlacePage.getContext(), new GestureDetector.SimpleOnGestureListener() { - private final int X_MIN = UiUtils.dp(30); - private final int X_MAX = UiUtils.dp(100); + private final int X_MIN = UiUtils.toPx(30); + private final int X_MAX = UiUtils.toPx(100); private static final int X_TO_Y_SCROLL_RATIO = 2; @Override diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java index a21b145230..4234e7f4f2 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java @@ -818,7 +818,6 @@ public class PlacePageView extends RelativeLayout implements View.OnClickListene } }); } - Framework.invalidate(); } private void selectBookmarkSet() diff --git a/android/src/com/mapswithme/util/Animations.java b/android/src/com/mapswithme/util/Animations.java new file mode 100644 index 0000000000..5b241c8ad4 --- /dev/null +++ b/android/src/com/mapswithme/util/Animations.java @@ -0,0 +1,112 @@ +package com.mapswithme.util; + +import android.animation.Animator; +import android.support.annotation.IntDef; +import android.support.annotation.Nullable; +import android.view.View; +import android.view.ViewPropertyAnimator; + +import com.mapswithme.maps.MwmApplication; +import com.mapswithme.maps.R; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +public final class Animations +{ + private Animations() {} + + @IntDef({LEFT, RIGHT, TOP, BOTTOM}) + @Retention(RetentionPolicy.SOURCE) + public @interface AnimationDirection {} + public static final int LEFT = 0; + public static final int RIGHT = 1; + public static final int TOP = 2; + public static final int BOTTOM = 3; + + private static final int DURATION_DEFAULT = MwmApplication.get().getResources().getInteger(R.integer.anim_default); + + public static void appearSliding(final View view, @AnimationDirection int appearFrom, @Nullable final Runnable completionListener) + { + if (UiUtils.isVisible(view)) + { + if (completionListener != null) + completionListener.run(); + return; + } + + final ViewPropertyAnimator animator = view.animate().setDuration(DURATION_DEFAULT).alpha(1).setListener(new UiUtils.SimpleAnimatorListener() + { + @Override + public void onAnimationEnd(Animator animation) + { + if (completionListener != null) + completionListener.run(); + } + }); + + switch (appearFrom) + { + case LEFT: + case RIGHT: + animator.translationX(0); + break; + case TOP: + case BOTTOM: + animator.translationY(0); + break; + } + + UiUtils.show(view); + } + + public static void disappearSliding(final View view, @AnimationDirection int disappearTo, @Nullable final Runnable completionListener) + { + if (!UiUtils.isVisible(view)) + { + if (completionListener != null) + completionListener.run(); + return; + } + + final ViewPropertyAnimator animator = view.animate().setDuration(DURATION_DEFAULT).alpha(0).setListener(new UiUtils.SimpleAnimatorListener() + { + @Override + public void onAnimationEnd(Animator animation) + { + UiUtils.hide(view); + if (completionListener != null) + completionListener.run(); + } + }); + + switch (disappearTo) + { + case RIGHT: + animator.translationX(view.getWidth()); + break; + case LEFT: + animator.translationX(-view.getWidth()); + break; + case BOTTOM: + animator.translationY(view.getHeight()); + break; + case TOP: + animator.translationY(-view.getHeight()); + break; + } + } + + public static void exchangeViews(final View viewToHide, final @AnimationDirection int disappearTo, + final View viewToShow, final @AnimationDirection int appearFrom, @Nullable final Runnable completionListener) + { + disappearSliding(viewToHide, disappearTo, new Runnable() + { + @Override + public void run() + { + appearSliding(viewToShow, appearFrom, completionListener); + } + }); + } +} diff --git a/android/src/com/mapswithme/util/UiUtils.java b/android/src/com/mapswithme/util/UiUtils.java index 5eed8d2304..fac9afa552 100644 --- a/android/src/com/mapswithme/util/UiUtils.java +++ b/android/src/com/mapswithme/util/UiUtils.java @@ -10,7 +10,6 @@ import android.provider.Settings; import android.support.annotation.DimenRes; import android.support.annotation.IdRes; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.text.TextUtils; @@ -19,7 +18,6 @@ import android.view.View; import android.view.ViewTreeObserver; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; -import android.view.animation.AnimationUtils; import android.widget.TextView; import com.mapswithme.maps.MwmApplication; @@ -29,7 +27,6 @@ public final class UiUtils { private static float sScreenDensity; - public static class SimpleAnimationListener implements AnimationListener { @Override @@ -65,19 +62,11 @@ public final class UiUtils void onViewMeasured(int width, int height); } - - public static void waitLayout(final View view, @NonNull final ViewTreeObserver.OnGlobalLayoutListener callback) - { - ViewTreeObserver observer = view.getViewTreeObserver(); - if (!observer.isAlive()) - throw new IllegalArgumentException("ViewTreeObserver is not alive"); - - observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() - { + public static void waitLayout(final View view, @NonNull final ViewTreeObserver.OnGlobalLayoutListener callback) { + view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @SuppressWarnings("deprecation") @Override - public void onGlobalLayout() - { + public void onGlobalLayout() { // viewTreeObserver can be dead(isAlive() == false), we should get a new one here. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) view.getViewTreeObserver().removeGlobalOnLayoutListener(this); @@ -171,6 +160,21 @@ public final class UiUtils invisible(frame, id); } + public static boolean isHidden(View view) + { + return view.getVisibility() == View.GONE; + } + + public static boolean isInvisible(View view) + { + return view.getVisibility() == View.INVISIBLE; + } + + public static boolean isVisible(View view) + { + return view.getVisibility() == View.VISIBLE; + } + public static void visibleIf(boolean condition, View view) { view.setVisibility(condition ? View.VISIBLE : View.INVISIBLE); @@ -197,11 +201,6 @@ public final class UiUtils hide(views); } - public static boolean isVisible(View view) - { - return (view.getVisibility() == View.VISIBLE); - } - public static void setTextAndShow(TextView tv, CharSequence text) { tv.setText(text); @@ -224,34 +223,34 @@ public final class UiUtils public void run() { new AlertDialog.Builder(activity) - .setCancelable(false) - .setMessage(message) - .setPositiveButton(activity.getString(R.string.connection_settings), new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dlg, int which) - { - try + .setCancelable(false) + .setMessage(message) + .setPositiveButton(activity.getString(R.string.connection_settings), new DialogInterface.OnClickListener() { - activity.startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); - } catch (final Exception ex) - { - ex.printStackTrace(); - } + @Override + public void onClick(DialogInterface dlg, int which) + { + try + { + activity.startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); + } catch (final Exception ex) + { + ex.printStackTrace(); + } - dlg.dismiss(); - } - }) - .setNegativeButton(activity.getString(R.string.close), new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dlg, int which) - { - dlg.dismiss(); - } - }) - .create() - .show(); + dlg.dismiss(); + } + }) + .setNegativeButton(activity.getString(R.string.close), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dlg, int which) + { + dlg.dismiss(); + } + }) + .create() + .show(); } }); } @@ -265,14 +264,13 @@ public final class UiUtils public static AlertDialog buildAlertDialog(Activity activity, int titleId) { return new AlertDialog.Builder(activity) - .setCancelable(false) - .setMessage(titleId) - .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dlg, int which) { dlg.dismiss(); } - }) - .create(); + .setCancelable(false) + .setMessage(titleId) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dlg, int which) { dlg.dismiss(); } + }) + .create(); } public static void showAlertDialog(Activity activity, int titleId) @@ -286,18 +284,18 @@ public final class UiUtils String rotation = activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? "|" : "-"; switch (activity.getWindowManager().getDefaultDisplay().getRotation()) { - case Surface.ROTATION_0: - rotation += "0"; - break; - case Surface.ROTATION_90: - rotation += "90"; - break; - case Surface.ROTATION_180: - rotation += "180"; - break; - case Surface.ROTATION_270: - rotation += "270"; - break; + case Surface.ROTATION_0: + rotation += "0"; + break; + case Surface.ROTATION_90: + rotation += "90"; + break; + case Surface.ROTATION_180: + rotation += "180"; + break; + case Surface.ROTATION_270: + rotation += "270"; + break; } return rotation; } @@ -317,80 +315,17 @@ public final class UiUtils return isSmallTablet() || isBigTablet(); } - public static void appearSlidingDown(final View view, @Nullable final Runnable completionListener) - { - if (isVisible(view) || view.getAnimation() != null) - { - if (completionListener != null) - completionListener.run(); - return; - } - - show(view); - - Animation a = AnimationUtils.loadAnimation(view.getContext(), R.anim.slide_appear_down); - if (completionListener != null) - a.setAnimationListener(new UiUtils.SimpleAnimationListener() - { - @Override - public void onAnimationEnd(Animation animation) - { - completionListener.run(); - } - }); - - view.startAnimation(a); - } - - public static void disappearSlidingUp(final View view, @Nullable final Runnable completionListener) - { - if (!isVisible(view) || view.getAnimation() != null) - { - if (completionListener != null) - completionListener.run(); - return; - } - - Animation a = AnimationUtils.loadAnimation(view.getContext(), R.anim.slide_disappear_up); - a.setAnimationListener(new UiUtils.SimpleAnimationListener() - { - @Override - public void onAnimationEnd(Animation animation) - { - hide(view); - view.clearAnimation(); - - if (completionListener != null) - completionListener.run(); - } - }); - - view.startAnimation(a); - } - - public static void exchangeViewsAnimatedDown(final View toHide, final View toShow, @Nullable final Runnable completionListener) - { - disappearSlidingUp(toHide, new Runnable() - { - @Override - public void run() - { - appearSlidingDown(toShow, completionListener); - } - }); - } - public static int dimen(@DimenRes int id) { return MwmApplication.get().getResources().getDimensionPixelSize(id); } - public static int dp(int v) + public static int toPx(int dp) { if (sScreenDensity == 0) sScreenDensity = MwmApplication.get().getResources().getDisplayMetrics().density; - return (int) (v * sScreenDensity + 0.5); + return (int) (dp * sScreenDensity + 0.5); } // utility class diff --git a/android/src/com/nvidia/devtech/BaseEglWrapper.java b/android/src/com/nvidia/devtech/BaseEglWrapper.java deleted file mode 100644 index 2c8156f50f..0000000000 --- a/android/src/com/nvidia/devtech/BaseEglWrapper.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.nvidia.devtech; - -import android.opengl.EGL14; - -import javax.microedition.khronos.egl.EGL10; - -abstract public class BaseEglWrapper extends EglWrapper -{ - private static final int EGL_RENDERABLE_TYPE = 0x3040; - private static final int EGL_OPENGL_ES2_BIT = 0x0004; - private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; - - // The number of bits requested for the red component - private static int redSize = 5; - // The number of bits requested for the green component - private static int greenSize = 6; - // The number of bits requested for the blue component - private static int blueSize = 5; - // The number of bits requested for the alpha component - private static int alphaSize = 0; - // The number of bits requested for the stencil component - private static int stencilSize = 0; - // The number of bits requested for the depth component - private static int depthSize = 16; - - protected int[] GetConfigAttributes10() - { - final int[] configAttributes = new int[]{EGL10.EGL_RED_SIZE, redSize, - EGL10.EGL_GREEN_SIZE, greenSize, - EGL10.EGL_BLUE_SIZE, blueSize, - EGL10.EGL_ALPHA_SIZE, alphaSize, - EGL10.EGL_STENCIL_SIZE, stencilSize, - EGL10.EGL_DEPTH_SIZE, depthSize, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL10.EGL_NONE}; - - return configAttributes; - } - - protected int[] GetSurfaceAttributes10() - { - return new int[]{EGL10.EGL_NONE}; - } - - protected int[] GetContextAttributes10() - { - return new int[]{EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE}; - } - - protected int[] GetConfigAttributes14() - { - final int[] configAttributes = new int[]{EGL14.EGL_RED_SIZE, redSize, - EGL14.EGL_GREEN_SIZE, greenSize, - EGL14.EGL_BLUE_SIZE, blueSize, - EGL14.EGL_ALPHA_SIZE, alphaSize, - EGL14.EGL_STENCIL_SIZE, stencilSize, - EGL14.EGL_DEPTH_SIZE, depthSize, - EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, - EGL14.EGL_NONE}; - - return configAttributes; - } - - protected int[] GetSurfaceAttributes14() - { - return new int[]{EGL14.EGL_NONE}; - } - - protected int[] GetContextAttributes14() - { - return new int[]{EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE}; - } - - protected boolean ValidateSurfaceSize() - { - return GetSurfaceWidth() * GetSurfaceWidth() != 0; - } - - public class ConfigComparatorBase - { - private int EglNone; - private int EglSlowConfig; - private int EglNonConformantConfig; - - public ConfigComparatorBase(int eglNone, int eglSlow, int eglNonComformant) - { - EglNone = eglNone; - EglSlowConfig = eglSlow; - EglNonConformantConfig = eglNonComformant; - } - - public int CompareConfigs(int rCav, int lCav) - { - if (lCav != rCav) - return GetCaveatValue(lCav) - GetCaveatValue(rCav); - - return 0; - } - - int GetCaveatValue(int cav) - { - if (cav == EglSlowConfig) - return 1; - else if (cav == EglNonConformantConfig) - return 2; - - return 0; - } - } -} diff --git a/android/src/com/nvidia/devtech/Egl10Wrapper.java b/android/src/com/nvidia/devtech/Egl10Wrapper.java deleted file mode 100644 index 1f4b6c8d9d..0000000000 --- a/android/src/com/nvidia/devtech/Egl10Wrapper.java +++ /dev/null @@ -1,383 +0,0 @@ -package com.nvidia.devtech; - -import android.os.Build; -import android.view.SurfaceHolder; - -import com.mapswithme.util.log.Logger; - -import java.util.Arrays; -import java.util.Comparator; - -import javax.microedition.khronos.egl.EGL10; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.egl.EGLContext; -import javax.microedition.khronos.egl.EGLDisplay; -import javax.microedition.khronos.egl.EGLSurface; - -public class Egl10Wrapper extends BaseEglWrapper -{ - private static final String TAG = "Egl10Wrapper"; - - final private EGL10 mEgl = (EGL10) EGLContext.getEGL(); - - private EGLDisplay mDisplay = EGL10.EGL_NO_DISPLAY; - private EGLContext mContext = EGL10.EGL_NO_CONTEXT; - private EGLSurface mSurface = EGL10.EGL_NO_SURFACE; - private EGLConfig mConfig = null; - - private EGLConfig[] mConfigs = new EGLConfig[40]; - - private int mChoosenConfigIndex = 0; - private int mActualConfigsNumber[] = new int[]{0}; - - private Logger mLog = null; - - public Egl10Wrapper(Logger logger) - { - mLog = logger; - } - - private class EGLConfigComparator extends ConfigComparatorBase - implements Comparator - { - EGLConfigComparator() - { - super(EGL10.EGL_NONE, EGL10.EGL_SLOW_CONFIG, EGL10.EGL_NON_CONFORMANT_CONFIG); - } - - @Override - public int compare(EGLConfig l, EGLConfig r) - { - final int[] value = new int[1]; - - /// splitting by EGL_CONFIG_CAVEAT, - /// firstly selecting EGL_NONE, then EGL_SLOW_CONFIG - /// and then EGL_NON_CONFORMANT_CONFIG - mEgl.eglGetConfigAttrib(mDisplay, l, EGL10.EGL_CONFIG_CAVEAT, value); - final int lcav = value[0]; - - mEgl.eglGetConfigAttrib(mDisplay, r, EGL10.EGL_CONFIG_CAVEAT, value); - final int rcav = value[0]; - - return CompareConfigs(rcav, lcav); - } - } - - ; - - @Override - public boolean InitEGL() - { - mDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - if (mDisplay == EGL10.EGL_NO_DISPLAY) - { - LogIt("eglGetDisplay failed"); - return false; - } - - int[] version = new int[2]; - if (!mEgl.eglInitialize(mDisplay, version)) - { - LogIt("eglInitialize failed"); - return false; - } - - if (version[0] != 1 && version[1] >= 4 && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) - { - LogIt("Incorrect EGL wrapper choosed"); - return false; - } - - if (!mEgl.eglChooseConfig(mDisplay, GetConfigAttributes10(), mConfigs, mConfigs.length, mActualConfigsNumber)) - { - LogEgl("eglChooseConfig failed with error "); - return false; - } - - if (mActualConfigsNumber[0] == 0) - { - LogIt("eglChooseConfig returned zero configs"); - return false; - } - - Arrays.sort(mConfigs, 0, mActualConfigsNumber[0], new EGLConfigComparator()); - mChoosenConfigIndex = 0; - - while (true) - { - mConfig = mConfigs[mChoosenConfigIndex]; - - // Debug print - LogIt("Matched egl configs:"); - for (int i = 0; i < mActualConfigsNumber[0]; ++i) - LogIt((i == mChoosenConfigIndex ? "*" : " ") + i + ": " + eglConfigToString(mConfigs[i])); - - mContext = mEgl.eglCreateContext(mDisplay, mConfig, EGL10.EGL_NO_CONTEXT, GetContextAttributes10()); - if (mContext == EGL10.EGL_NO_CONTEXT) - { - LogEgl("eglCreateContext failed with error "); - mChoosenConfigIndex++; - } - else - break; - - if (mChoosenConfigIndex == mConfigs.length) - { - LogIt("No more configs left to choose"); - return false; - } - } - - return true; - } - - @Override - public boolean IsInitialized() - { - return mContext != EGL10.EGL_NO_CONTEXT; - } - - @Override - public boolean TerminateEGL() - { - LogIt("CleanupEGL"); - - if (!IsInitialized()) - return false; - - if (!DestroySurfaceEGL()) - return false; - - if (mDisplay != EGL10.EGL_NO_DISPLAY) - mEgl.eglMakeCurrent(mDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); - - if (mContext != EGL10.EGL_NO_CONTEXT) - mEgl.eglDestroyContext(mDisplay, mContext); - - mEgl.eglTerminate(mDisplay); - - mDisplay = EGL10.EGL_NO_DISPLAY; - mContext = EGL10.EGL_NO_CONTEXT; - mConfig = null; - - return true; - } - - @Override - public boolean CreateSurfaceEGL(SurfaceHolder holder) - { - if (holder == null) - { - LogIt("createEGLSurface failed, mCachedSurfaceHolder is null"); - return false; - } - - if (!IsInitialized()) - InitEGL(); - - if (!IsInitialized()) - { - LogIt("createEGLSurface failed, cannot initialize EGL"); - return false; - } - - if (mDisplay == EGL10.EGL_NO_DISPLAY) - { - LogIt("createEGLSurface: display is null"); - return false; - } - else if (mConfig == null) - { - LogIt("createEGLSurface: config is null"); - return false; - } - - int choosenSurfaceConfigIndex = mChoosenConfigIndex; - - while (true) - { - /// trying to create window surface with one of the EGL configs, recreating the m_eglConfig if necessary - - mSurface = mEgl.eglCreateWindowSurface(mDisplay, mConfigs[choosenSurfaceConfigIndex], holder, GetSurfaceAttributes10()); - - final boolean surfaceCreated = (mSurface != EGL10.EGL_NO_SURFACE); - final boolean surfaceValidated = surfaceCreated ? ValidateSurfaceSize() : false; - - if (surfaceCreated && !surfaceValidated) - mEgl.eglDestroySurface(mDisplay, mSurface); - - if (!surfaceCreated || !surfaceValidated) - { - LogIt("eglCreateWindowSurface failed for config : " + eglConfigToString(mConfigs[choosenSurfaceConfigIndex])); - choosenSurfaceConfigIndex += 1; - if (choosenSurfaceConfigIndex == mActualConfigsNumber[0]) - { - mSurface = EGL10.EGL_NO_SURFACE; - LogIt("no eglConfigs left"); - break; - } - else - LogIt("trying : " + eglConfigToString(mConfigs[choosenSurfaceConfigIndex])); - } - else - break; - } - - if ((choosenSurfaceConfigIndex != mChoosenConfigIndex) && (mSurface != null)) - { - LogIt("window surface is created for eglConfig : " + eglConfigToString(mConfigs[choosenSurfaceConfigIndex])); - - // unbinding context - if (mDisplay != null) - mEgl.eglMakeCurrent(mDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); - - // destroying context - if (mContext != null) - mEgl.eglDestroyContext(mDisplay, mContext); - - // recreating context with same eglConfig as eglWindowSurface has - mContext = mEgl.eglCreateContext(mDisplay, mConfigs[choosenSurfaceConfigIndex], EGL10.EGL_NO_CONTEXT, GetContextAttributes10()); - if (mContext == EGL10.EGL_NO_CONTEXT) - { - LogEgl("context recreation failed with error "); - return false; - } - - mChoosenConfigIndex = choosenSurfaceConfigIndex; - mConfig = mConfigs[mChoosenConfigIndex]; - } - - return true; - } - - @Override - public boolean DestroySurfaceEGL() - { - if (mDisplay != EGL10.EGL_NO_DISPLAY && mSurface != EGL10.EGL_NO_SURFACE) - mEgl.eglMakeCurrent(mDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, mContext); - if (mSurface != EGL10.EGL_NO_SURFACE) - mEgl.eglDestroySurface(mDisplay, mSurface); - mSurface = EGL10.EGL_NO_SURFACE; - - return true; - } - - @Override - public boolean SwapBuffersEGL() - { - if (mSurface == EGL10.EGL_NO_SURFACE) - { - LogIt("Surface is NULL"); - return false; - } - - if (mDisplay == EGL10.EGL_NO_DISPLAY) - { - LogIt("Display is NULL"); - return false; - } - - if (!mEgl.eglSwapBuffers(mDisplay, mSurface)) - { - LogEgl("eglSwapBuffer: "); - return false; - } - return true; - } - - @Override - public int GetSurfaceWidth() - { - final int sizes[] = new int[1]; - mEgl.eglQuerySurface(mDisplay, mSurface, EGL10.EGL_WIDTH, sizes); - return sizes[0]; - } - - @Override - public int GetSurfaceHeight() - { - final int sizes[] = new int[1]; - mEgl.eglQuerySurface(mDisplay, mSurface, EGL10.EGL_HEIGHT, sizes); - return sizes[0]; - } - - @Override - public boolean Bind() - { - if (mContext == EGL10.EGL_NO_CONTEXT) - { - LogIt("m_eglContext is NULL"); - return false; - } - else if (mSurface == EGL10.EGL_NO_SURFACE) - { - LogIt("m_eglSurface is NULL"); - return false; - } - else if (!mEgl.eglMakeCurrent(mDisplay, mSurface, mSurface, mContext)) - { - LogEgl("eglMakeCurrent err: "); - return false; - } - - return true; - } - - @Override - public boolean Unbind() - { - if (mDisplay == EGL10.EGL_NO_DISPLAY) - return false; - - return mEgl.eglMakeCurrent(mDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); - } - - @Override - public int GetErrorEGL() - { - return mEgl.eglGetError(); - } - - private void LogIt(String message) - { - mLog.d(TAG, message); - } - - private void LogEgl(String message) - { - mLog.d(TAG, message + mEgl.eglGetError()); - } - - String eglConfigToString(final EGLConfig config) - { - final int[] value = new int[1]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_RED_SIZE, value); - final int red = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_GREEN_SIZE, value); - final int green = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_BLUE_SIZE, value); - final int blue = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_ALPHA_SIZE, value); - final int alpha = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_STENCIL_SIZE, value); - final int stencil = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_DEPTH_SIZE, value); - final int depth = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_CONFIG_CAVEAT, value); - final String caveat = (value[0] == EGL10.EGL_NONE) ? "EGL_NONE" : - (value[0] == EGL10.EGL_SLOW_CONFIG) ? "EGL_SLOW_CONFIG" : "EGL_NON_CONFORMANT_CONFIG"; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_BUFFER_SIZE, value); - final int buffer = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_LEVEL, value); - final int level = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_SAMPLE_BUFFERS, value); - final int sampleBuffers = value[0]; - mEgl.eglGetConfigAttrib(mDisplay, config, EGL10.EGL_SAMPLES, value); - final int samples = value[0]; - - return "R" + red + "G" + green + "B" + blue + "A" + alpha + - " Stencil:" + stencil + " Depth:" + depth + " Caveat:" + caveat + - " BufferSize:" + buffer + " Level:" + level + " SampleBuffers:" + sampleBuffers + - " Samples:" + samples; - } -} diff --git a/android/src/com/nvidia/devtech/Egl14Wrapper.java b/android/src/com/nvidia/devtech/Egl14Wrapper.java deleted file mode 100644 index e5918e62a1..0000000000 --- a/android/src/com/nvidia/devtech/Egl14Wrapper.java +++ /dev/null @@ -1,361 +0,0 @@ -package com.nvidia.devtech; - -import android.opengl.EGL14; -import android.opengl.EGLConfig; -import android.opengl.EGLContext; -import android.opengl.EGLDisplay; -import android.opengl.EGLSurface; -import android.view.SurfaceHolder; - -import com.mapswithme.util.log.Logger; - -import java.util.Arrays; -import java.util.Comparator; - -public class Egl14Wrapper extends BaseEglWrapper -{ - private static final String TAG = "Egl14Wrapper"; - private Logger mLog = null; - - private EGLDisplay mDisplay = EGL14.EGL_NO_DISPLAY; - private EGLContext mContext = EGL14.EGL_NO_CONTEXT; - private EGLSurface mSurface = EGL14.EGL_NO_SURFACE; - private EGLConfig mConfig = null; - - private EGLConfig[] mConfigs = new EGLConfig[40]; - - private int mChoosenConfigIndex = 0; - private int mActualConfigsNumber[] = new int[]{0}; - - private class EGLConfigComparator extends ConfigComparatorBase - implements Comparator - { - EGLConfigComparator() - { - super(EGL14.EGL_NONE, EGL14.EGL_SLOW_CONFIG, EGL14.EGL_NON_CONFORMANT_CONFIG); - } - - @Override - public int compare(EGLConfig l, EGLConfig r) - { - final int[] value = new int[2]; - - EGL14.eglGetConfigAttrib(mDisplay, l, EGL14.EGL_CONFIG_CAVEAT, value, 0); - EGL14.eglGetConfigAttrib(mDisplay, r, EGL14.EGL_CONFIG_CAVEAT, value, 1); - - return CompareConfigs(value[1], value[0]); - } - } - - ; - - public Egl14Wrapper(Logger logger) - { - mLog = logger; - } - - @Override - public boolean IsInitialized() - { - return mContext != EGL14.EGL_NO_CONTEXT; - } - - @Override - public boolean InitEGL() - { - mDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); - if (mDisplay == EGL14.EGL_NO_DISPLAY) - { - LogIt("eglGetDisplay failed"); - return false; - } - - int[] version = new int[2]; - if (!EGL14.eglInitialize(mDisplay, version, 0, version, 1)) - { - LogIt("eglInitialize failed"); - return false; - } - - if (version[0] != 1 && version[1] < 4) - { - LogIt("Incorrect EGL wrapper choosed"); - return false; - } - - if (!EGL14.eglChooseConfig(mDisplay, GetConfigAttributes14(), 0, mConfigs, 0, mConfigs.length, mActualConfigsNumber, 0)) - { - LogEgl("eglChooseConfig failed with error "); - return false; - } - - if (mActualConfigsNumber[0] == 0) - { - LogIt("eglChooseConfig returned zero configs"); - return false; - } - - Arrays.sort(mConfigs, 0, mActualConfigsNumber[0], new EGLConfigComparator()); - mChoosenConfigIndex = 0; - - while (true) - { - mConfig = mConfigs[mChoosenConfigIndex]; - - // Debug print - LogIt("Matched egl configs:"); - for (int i = 0; i < mActualConfigsNumber[0]; ++i) - LogIt((i == mChoosenConfigIndex ? "*" : " ") + i + ": " + eglConfigToString(mConfigs[i])); - - mContext = EGL14.eglCreateContext(mDisplay, mConfig, EGL14.EGL_NO_CONTEXT, GetContextAttributes14(), 0); - if (mContext == EGL14.EGL_NO_CONTEXT) - { - LogEgl("eglCreateContext failed with error "); - mChoosenConfigIndex++; - } - else - break; - - if (mChoosenConfigIndex == mConfigs.length) - { - LogIt("No more configs left to choose"); - return false; - } - } - - return true; - } - - @Override - public boolean TerminateEGL() - { - LogIt("CleanupEGL"); - - if (!IsInitialized()) - return false; - if (!DestroySurfaceEGL()) - return false; - - if (mDisplay != EGL14.EGL_NO_DISPLAY) - EGL14.eglMakeCurrent(mDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT); - - if (mContext != EGL14.EGL_NO_CONTEXT) - EGL14.eglDestroyContext(mDisplay, mContext); - - EGL14.eglTerminate(mDisplay); - - mDisplay = EGL14.EGL_NO_DISPLAY; - mContext = EGL14.EGL_NO_CONTEXT; - mConfig = null; - - return true; - } - - @Override - public boolean CreateSurfaceEGL(SurfaceHolder holder) - { - if (holder == null) - { - LogIt("createEGLSurface failed, mCachedSurfaceHolder is null"); - return false; - } - - if (!IsInitialized()) - InitEGL(); - - if (!IsInitialized()) - { - LogIt("createEGLSurface failed, cannot initialize EGL"); - return false; - } - - if (mDisplay == EGL14.EGL_NO_DISPLAY) - { - LogIt("createEGLSurface: display is null"); - return false; - } - else if (mConfig == null) - { - LogIt("createEGLSurface: config is null"); - return false; - } - - int choosenSurfaceConfigIndex = mChoosenConfigIndex; - - while (true) - { - /// trying to create window surface with one of the EGL configs, recreating the mEglConfig if necessary - mSurface = EGL14.eglCreateWindowSurface(mDisplay, mConfigs[choosenSurfaceConfigIndex], holder, GetSurfaceAttributes14(), 0); - - final boolean surfaceCreated = (mSurface != EGL14.EGL_NO_SURFACE); - final boolean surfaceValidated = surfaceCreated ? ValidateSurfaceSize() : false; - - if (surfaceCreated && !surfaceValidated) - EGL14.eglDestroySurface(mDisplay, mSurface); - - if (!surfaceCreated || !surfaceValidated) - { - LogIt("eglCreateWindowSurface failed for config : " + eglConfigToString(mConfigs[choosenSurfaceConfigIndex])); - choosenSurfaceConfigIndex += 1; - if (choosenSurfaceConfigIndex == mActualConfigsNumber[0]) - { - mSurface = EGL14.EGL_NO_SURFACE; - LogIt("no eglConfigs left"); - break; - } - else - LogIt("trying : " + eglConfigToString(mConfigs[choosenSurfaceConfigIndex])); - } - else - break; - } - - if ((choosenSurfaceConfigIndex != mChoosenConfigIndex) && (mSurface != EGL14.EGL_NO_SURFACE)) - { - LogIt("window surface is created for eglConfig : " + eglConfigToString(mConfigs[choosenSurfaceConfigIndex])); - - // unbinding context - if (mDisplay != null) - EGL14.eglMakeCurrent(mDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT); - - // destroying context - if (mContext != null) - EGL14.eglDestroyContext(mDisplay, mContext); - - // recreating context with same eglConfig as eglWindowSurface has - mContext = EGL14.eglCreateContext(mDisplay, mConfigs[choosenSurfaceConfigIndex], EGL14.EGL_NO_CONTEXT, GetContextAttributes14(), 0); - if (mContext == EGL14.EGL_NO_CONTEXT) - { - LogEgl("context recreation failed with error "); - return false; - } - - mChoosenConfigIndex = choosenSurfaceConfigIndex; - mConfig = mConfigs[mChoosenConfigIndex]; - } - - return true; - } - - @Override - public boolean DestroySurfaceEGL() - { - if (mDisplay != EGL14.EGL_NO_DISPLAY && mSurface != EGL14.EGL_NO_SURFACE) - EGL14.eglMakeCurrent(mDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, mContext); - if (mSurface != EGL14.EGL_NO_SURFACE) - EGL14.eglDestroySurface(mDisplay, mSurface); - - mSurface = EGL14.EGL_NO_SURFACE; - - return true; - } - - @Override - public boolean SwapBuffersEGL() - { - if (mSurface == EGL14.EGL_NO_SURFACE) - { - LogIt("Surface is NULL"); - return false; - } - - if (mDisplay == EGL14.EGL_NO_DISPLAY) - { - LogIt("Display is NULL"); - return false; - } - - if (!EGL14.eglSwapBuffers(mDisplay, mSurface)) - { - LogEgl("eglSwapBuffer: "); - return false; - } - return true; - } - - @Override - public boolean Bind() - { - if (mContext == EGL14.EGL_NO_CONTEXT) - { - LogIt("m_eglContext is NULL"); - return false; - } - else if (mSurface == EGL14.EGL_NO_SURFACE) - { - LogIt("m_eglSurface is NULL"); - return false; - } - else if (!EGL14.eglMakeCurrent(mDisplay, mSurface, mSurface, mContext)) - { - LogEgl("eglMakeCurrent err: "); - return false; - } - - return true; - } - - @Override - public boolean Unbind() - { - if (mDisplay == EGL14.EGL_NO_DISPLAY) - return false; - - return EGL14.eglMakeCurrent(mDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT); - } - - @Override - public int GetErrorEGL() - { - return EGL14.eglGetError(); - } - - @Override - public int GetSurfaceWidth() - { - final int sizes[] = new int[1]; - EGL14.eglQuerySurface(mDisplay, mSurface, EGL14.EGL_WIDTH, sizes, 0); - return sizes[0]; - } - - @Override - public int GetSurfaceHeight() - { - final int sizes[] = new int[1]; - EGL14.eglQuerySurface(mDisplay, mSurface, EGL14.EGL_HEIGHT, sizes, 0); - return sizes[0]; - } - - private void LogIt(String message) - { - mLog.d(message); - } - - private void LogEgl(String message) - { - mLog.d(message + EGL14.eglGetError()); - } - - String eglConfigToString(final EGLConfig config) - { - final int[] value = new int[11]; - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_RED_SIZE, value, 0); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_GREEN_SIZE, value, 1); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_BLUE_SIZE, value, 2); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_ALPHA_SIZE, value, 3); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_STENCIL_SIZE, value, 4); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_DEPTH_SIZE, value, 5); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_CONFIG_CAVEAT, value, 6); - final String caveat = (value[6] == EGL14.EGL_NONE) ? "EGL_NONE" : - (value[6] == EGL14.EGL_SLOW_CONFIG) ? "EGL_SLOW_CONFIG" : "EGL_NON_CONFORMANT_CONFIG"; - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_BUFFER_SIZE, value, 7); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_LEVEL, value, 8); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_SAMPLE_BUFFERS, value, 9); - EGL14.eglGetConfigAttrib(mDisplay, config, EGL14.EGL_SAMPLES, value, 10); - - return "R" + value[0] + "G" + value[1] + "B" + value[2] + "A" + value[3] + - " Stencil:" + value[4] + " Depth:" + value[5] + " Caveat:" + caveat + - " BufferSize:" + value[7] + " Level:" + value[8] + " SampleBuffers:" + value[9] + - " Samples:" + value[10]; - } -} diff --git a/android/src/com/nvidia/devtech/EglWrapper.java b/android/src/com/nvidia/devtech/EglWrapper.java deleted file mode 100644 index 315c812a81..0000000000 --- a/android/src/com/nvidia/devtech/EglWrapper.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.nvidia.devtech; - -import android.opengl.EGL14; -import android.opengl.EGLDisplay; -import android.os.Build; -import android.view.SurfaceHolder; - -import com.mapswithme.util.Utils; -import com.mapswithme.util.log.Logger; - -abstract public class EglWrapper -{ - public abstract boolean InitEGL(); - - public abstract boolean TerminateEGL(); - - public abstract boolean CreateSurfaceEGL(SurfaceHolder holder); - - public abstract boolean DestroySurfaceEGL(); - - public abstract boolean SwapBuffersEGL(); - - public abstract int GetSurfaceWidth(); - - public abstract int GetSurfaceHeight(); - - public abstract boolean IsInitialized(); - - public abstract boolean Bind(); - - public abstract boolean Unbind(); - - public abstract int GetErrorEGL(); - - enum EglVersion - { - NonEgl, - Egl, - Egl14 - } - - static public EglWrapper GetEgl(Logger logger) - { - EglVersion version = QueryEglVersion(); - switch (version) - { - case Egl: - return new Egl10Wrapper(logger); - case Egl14: - return new Egl14Wrapper(logger); - } - - return null; - } - - static private EglVersion QueryEglVersion() - { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) - return EglVersion.Egl; - - EglVersion result = EglVersion.NonEgl; - EGLDisplay display = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); - if (display != EGL14.EGL_NO_DISPLAY) - { - final int[] version = new int[2]; - if (EGL14.eglInitialize(display, version, 0, version, 1)) - { - if (version[0] >= 1) - { - if (version[1] < 4) - result = EglVersion.Egl; - else - result = EglVersion.Egl14; - } - } - - EGL14.eglTerminate(display); - } - - return result; - } -} diff --git a/android/src/com/nvidia/devtech/NvEventQueueFragment.java b/android/src/com/nvidia/devtech/NvEventQueueFragment.java deleted file mode 100644 index 05dec223bb..0000000000 --- a/android/src/com/nvidia/devtech/NvEventQueueFragment.java +++ /dev/null @@ -1,316 +0,0 @@ -package com.nvidia.devtech; - -import android.annotation.SuppressLint; -import android.os.Build; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.util.DisplayMetrics; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.SurfaceHolder; -import android.view.SurfaceHolder.Callback; -import android.view.SurfaceView; -import android.view.View; -import android.view.ViewGroup; - -import com.mapswithme.maps.R; -import com.mapswithme.maps.base.BaseMwmFragment; -import com.mapswithme.util.log.Logger; -import com.mapswithme.util.log.StubLogger; - -public abstract class NvEventQueueFragment extends BaseMwmFragment implements View.OnTouchListener, View.OnFocusChangeListener -{ - private static final String TAG = NvEventQueueFragment.class.getSimpleName(); - - private final Logger mLog = StubLogger.get(); - - private boolean mIsRenderingInitialized; - private EglWrapper mEglWrapper; - protected SurfaceHolder mCachedSurfaceHolder; - protected int mSurfaceWidth; - protected int mSurfaceHeight; - - private int mDisplayDensity; - - private boolean mIsNativeLaunched; - - private int mLastPointerId; - - public int getSurfaceWidth() - { - return mSurfaceWidth; - } - - public int getSurfaceHeight() - { - return mSurfaceHeight; - } - - protected native boolean onCreateNative(); - - protected native boolean onStartNative(); - - protected native boolean onRestartNative(); - - protected native boolean onResumeNative(); - - protected native boolean onSurfaceCreatedNative(int w, int h, int density); - - protected native boolean onFocusChangedNative(boolean focused); - - protected native boolean onSurfaceChangedNative(int w, int h, int density); - - protected native boolean onSurfaceDestroyedNative(); - - protected native boolean onPauseNative(); - - protected native boolean onStopNative(); - - protected native boolean onDestroyNative(); - - public native boolean multiTouchEvent(int action, boolean hasFirst, - boolean hasSecond, int x0, int y0, int x1, int y1, MotionEvent event); - - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - final DisplayMetrics dm = getActivity().getResources().getDisplayMetrics(); - final float exactDensityDpi = (dm.xdpi + dm.ydpi) / 2; - mDisplayDensity = (int)exactDensityDpi; - - mIsNativeLaunched = true; - onCreateNative(); - if (getActivity().isChangingConfigurations()) - mIsRenderingInitialized = true; - } - - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) - { - return super.onCreateView(inflater, container, savedInstanceState); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) - { - super.onViewCreated(view, savedInstanceState); - final SurfaceView surfaceView = (SurfaceView) view.findViewById(R.id.map_surfaceview); - surfaceView.setOnFocusChangeListener(this); - - final SurfaceHolder holder = surfaceView.getHolder(); - holder.addCallback(new Callback() - { - @Override - public void surfaceCreated(SurfaceHolder holder) - { - mCachedSurfaceHolder = holder; - onSurfaceCreatedNative(mSurfaceWidth, mSurfaceHeight, mDisplayDensity); - } - - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) - { - mCachedSurfaceHolder = holder; - mSurfaceWidth = width; - mSurfaceHeight = height; - onSurfaceChangedNative(mSurfaceWidth, mSurfaceHeight, mDisplayDensity); - if (mIsRenderingInitialized) - applyWidgetPivots(); - } - - @Override - public void surfaceDestroyed(SurfaceHolder holder) - { - mCachedSurfaceHolder = null; - onSurfaceDestroyedNative(); - } - }); - } - - /** - * Implement to position map widgets. - */ - protected abstract void applyWidgetPivots(); - - @Override - public void onStart() - { - super.onStart(); - onStartNative(); - } - - @Override - public void onResume() - { - super.onResume(); - onResumeNative(); - onFocusChangedNative(true); - } - - @Override - public void onFocusChange(View v, boolean hasFocus) - { - onFocusChangedNative(hasFocus); - } - - @Override - public void onPause() - { - super.onPause(); - onPauseNative(); - onFocusChangedNative(getActivity().hasWindowFocus()); - } - - @Override - public void onStop() - { - super.onStop(); - if (!getActivity().isChangingConfigurations()) - { - // if configuration is changed - EGL shouldn't be reinitialized - mIsRenderingInitialized = false; - onStopNative(); - } - } - - @Override - public void onDestroy() - { - super.onDestroy(); - onStopNative(); - onDestroyNative(); - CleanupEGL(); - } - - @Override - public boolean onTouch(View v, MotionEvent event) - { - // TODO refactor ? - final int count = event.getPointerCount(); - - if (!mIsNativeLaunched || count == 0) - return false; - - switch (count) - { - case 1: - { - mLastPointerId = event.getPointerId(0); - - final int x0 = (int) event.getX(); - final int y0 = (int) event.getY(); - - return multiTouchEvent(event.getAction(), true, false, x0, y0, 0, 0, event); - } - default: - { - final int x0 = (int) event.getX(0); - final int y0 = (int) event.getY(0); - - final int x1 = (int) event.getX(1); - final int y1 = (int) event.getY(1); - - if (event.getPointerId(0) == mLastPointerId) - return multiTouchEvent(event.getAction(), true, true, - x0, y0, x1, y1, event); - else - return multiTouchEvent(event.getAction(), true, true, x1, y1, x0, y0, event); - } - } - } - - /** - * Called to initialize EGL. This function should not be called by the - * inheriting activity, but can be overridden if needed. - * - * @return True if successful - */ - @SuppressWarnings("UnusedDeclaration") - protected boolean InitEGL() - { - mEglWrapper = EglWrapper.GetEgl(mLog); - return mEglWrapper.InitEGL(); - } - - /** - * Called to clean up EGL. This function should not be called by the - * inheriting fragment, but can be overridden if needed. - */ - protected boolean CleanupEGL() - { - return mEglWrapper != null && mEglWrapper.TerminateEGL(); - } - - @SuppressWarnings("UnusedDeclaration") - protected boolean CreateSurfaceEGL() - { - if (!mEglWrapper.CreateSurfaceEGL(mCachedSurfaceHolder)) - return false; - - mSurfaceHeight = mEglWrapper.GetSurfaceHeight(); - mSurfaceWidth = mEglWrapper.GetSurfaceWidth(); - return true; - } - - /** - * Destroys the EGLSurface used for rendering. This function should not be - * called by the inheriting activity, but can be overridden if needed. - */ - @SuppressWarnings("UnusedDeclaration") - protected boolean DestroySurfaceEGL() - { - return mEglWrapper.DestroySurfaceEGL(); - } - - @SuppressWarnings("UnusedDeclaration") - public boolean BindSurfaceAndContextEGL() - { - return mEglWrapper.Bind(); - } - - @SuppressWarnings("UnusedDeclaration") - public boolean UnbindSurfaceAndContextEGL() - { - return mEglWrapper.Unbind(); - } - - @SuppressWarnings("UnusedDeclaration") - public boolean SwapBuffersEGL() - { - return mEglWrapper.SwapBuffersEGL(); - } - - @SuppressWarnings("UnusedDeclaration") - public int GetErrorEGL() - { - return mEglWrapper.GetErrorEGL(); - } - - @SuppressWarnings("UnusedDeclaration") - public void OnRenderingInitialized() - { - mIsRenderingInitialized = true; - applyWidgetPivots(); - } - - public boolean isRenderingInitialized() - { - return mIsRenderingInitialized; - } - - @SuppressWarnings("UnusedDeclaration") - public void ReportUnsupported() - { - Log.i(TAG, "this phone GPU is unsupported"); - } - - @SuppressWarnings("UnusedDeclaration") - public void finish() - { - if (isAdded()) - getActivity().finish(); - } -} diff --git a/anim/angle_interpolation.cpp b/anim/angle_interpolation.cpp deleted file mode 100644 index bdc13ce620..0000000000 --- a/anim/angle_interpolation.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include "anim/angle_interpolation.hpp" -#include "anim/controller.hpp" - -#include "geometry/angles.hpp" - -#include "base/logging.hpp" - - -namespace anim -{ - AngleInterpolation::AngleInterpolation(double start, - double end, - double speed, - double & out) - : m_outAngle(out) - { - CalcParams(start, end, speed); - } - - void AngleInterpolation::Reset(double start, double end, double speed) - { - CalcParams(start, end, speed); - m_startTime = GetController()->GetCurrentTime(); - m_outAngle = m_startAngle; - SetState(EReady); - } - - void AngleInterpolation::OnStart(double ts) - { - m_startTime = ts; - m_outAngle = m_startAngle; - Task::OnStart(ts); - } - - void AngleInterpolation::OnStep(double ts) - { - if (!IsRunning()) - return; - - double const elapsed = ts - m_startTime; - if (elapsed >= m_interval) - { - End(); - return; - } - - m_curAngle = m_outAngle = m_startAngle + elapsed * m_speed; - - Task::OnStep(ts); - } - - void AngleInterpolation::OnEnd(double ts) - { - // ensuring that the final value was reached - m_outAngle = m_endAngle; - Task::OnEnd(ts); - } - - void AngleInterpolation::SetEndAngle(double val) - { - CalcParams(m_curAngle, val, fabs(m_speed)); - m_startTime = GetController()->GetCurrentTime(); - } - - void AngleInterpolation::CalcParams(double start, double end, double speed) - { - ASSERT_GREATER(speed, 0.0, ()); - - m_startAngle = start; - m_speed = speed; - m_startTime = 0.0; - - double const dist = ang::GetShortestDistance(start, end); - if (dist < 0.0) - m_speed = -m_speed; - - m_curAngle = m_startAngle; - m_endAngle = m_startAngle + dist; - m_interval = dist / m_speed; - } - - SafeAngleInterpolation::SafeAngleInterpolation(double start, double end, double speed) - : TBase(start, end, speed, m_angle) - { - m_angle = start; - } - - void SafeAngleInterpolation::ResetDestParams(double dstAngle, double speed) - { - Reset(GetCurrentValue(), dstAngle, speed); - } - - double SafeAngleInterpolation::GetCurrentValue() const - { - return m_angle; - } -} diff --git a/anim/angle_interpolation.hpp b/anim/angle_interpolation.hpp deleted file mode 100644 index 3e1c30102e..0000000000 --- a/anim/angle_interpolation.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "anim/task.hpp" - -namespace anim -{ - class AngleInterpolation : public Task - { - double m_startAngle; - double m_curAngle; - double & m_outAngle; - double m_startTime; - double m_endAngle; - double m_interval; - double m_speed; - - public: - AngleInterpolation(double start, - double end, - double speed, - double & out); - - void Reset(double start, double end, double speed); - - void OnStart(double ts); - void OnStep(double ts); - void OnEnd(double ts); - - void SetEndAngle(double val); - - private: - void CalcParams(double start, double end, double speed); - }; - - class SafeAngleInterpolation : public AngleInterpolation - { - typedef AngleInterpolation TBase; - - public: - SafeAngleInterpolation(double start, double end, double speed); - - void ResetDestParams(double dstAngle, double speed); - double GetCurrentValue() const; - - private: - double m_angle; - }; -} diff --git a/anim/anim.pro b/anim/anim.pro deleted file mode 100644 index 068320af0c..0000000000 --- a/anim/anim.pro +++ /dev/null @@ -1,25 +0,0 @@ -# Animation library - -TARGET = anim -TEMPLATE = lib -CONFIG += staticlib warn_on - -ROOT_DIR = .. - -include($$ROOT_DIR/common.pri) - -HEADERS += \ - controller.hpp \ - task.hpp \ - angle_interpolation.hpp \ - segment_interpolation.hpp \ - anyrect_interpolation.hpp \ - value_interpolation.hpp \ - -SOURCES += \ - controller.cpp \ - task.cpp \ - angle_interpolation.cpp \ - segment_interpolation.cpp \ - value_interpolation.cpp \ - anyrect_interpolation.cpp \ diff --git a/anim/anyrect_interpolation.cpp b/anim/anyrect_interpolation.cpp deleted file mode 100644 index 19d3fbe3cb..0000000000 --- a/anim/anyrect_interpolation.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "anim/anyrect_interpolation.hpp" - -#include "base/logging.hpp" - -namespace anim -{ - AnyRectInterpolation::AnyRectInterpolation(m2::AnyRectD const & startRect, - m2::AnyRectD const & endRect, - double rotationSpeed, - m2::AnyRectD & outRect) - : m_interval(max(0.5, rotationSpeed * fabs(ang::GetShortestDistance(startRect.Angle().val(), - endRect.Angle().val())) / (2 * math::pi))), - m_angleInt(startRect.Angle().val(), - endRect.Angle().val(), - rotationSpeed, - m_curAngle), - m_segmentInt(startRect.GlobalCenter(), - endRect.GlobalCenter(), - m_interval, - m_curCenter), - m_sizeXInt(startRect.GetLocalRect().SizeX(), - endRect.GetLocalRect().SizeX(), - m_interval, - m_curSizeX), - m_sizeYInt(startRect.GetLocalRect().SizeY(), - endRect.GetLocalRect().SizeY(), - m_interval, - m_curSizeY), - m_startRect(startRect), - m_endRect(endRect), - m_outRect(outRect) - { - } - - void AnyRectInterpolation::OnStart(double ts) - { - m_startTime = ts; - - m_angleInt.OnStart(ts); - m_angleInt.Start(); - - m_segmentInt.OnStart(ts); - m_segmentInt.Start(); - - m_sizeXInt.OnStart(ts); - m_sizeXInt.Start(); - - m_sizeYInt.OnStart(ts); - m_sizeYInt.Start(); - - m_outRect = m_startRect; - - anim::Task::OnStart(ts); - } - - void AnyRectInterpolation::OnStep(double ts) - { - if (!IsRunning()) - return; - - if (ts - m_startTime >= m_interval) - { - End(); - return; - } - - if (m_angleInt.IsRunning()) - m_angleInt.OnStep(ts); - - if (m_segmentInt.IsRunning()) - m_segmentInt.OnStep(ts); - - if (m_sizeXInt.IsRunning()) - m_sizeXInt.OnStep(ts); - - if (m_sizeYInt.IsRunning()) - m_sizeYInt.OnStep(ts); - - m_outRect = m2::AnyRectD(m_curCenter, - m_curAngle, - m2::RectD(-m_curSizeX / 2, -m_curSizeY / 2, - m_curSizeX / 2, m_curSizeY / 2)); - - anim::Task::OnStep(ts); - } - - void AnyRectInterpolation::OnEnd(double ts) - { - if (m_angleInt.IsRunning()) - m_angleInt.OnEnd(ts); - - if (m_segmentInt.IsRunning()) - m_segmentInt.OnEnd(ts); - - if (m_sizeXInt.IsRunning()) - m_sizeXInt.OnEnd(ts); - - if (m_sizeYInt.IsRunning()) - m_sizeYInt.OnEnd(ts); - - m_outRect = m_endRect; - - anim::Task::OnEnd(ts); - } - - void AnyRectInterpolation::OnCancel(double ts) - { - if (m_angleInt.IsRunning()) - m_angleInt.Cancel(); - - if (m_segmentInt.IsRunning()) - m_segmentInt.Cancel(); - - if (m_sizeXInt.IsRunning()) - m_sizeXInt.Cancel(); - - if (m_sizeYInt.IsRunning()) - m_sizeYInt.Cancel(); - - anim::Task::OnCancel(ts); - } -} diff --git a/anim/anyrect_interpolation.hpp b/anim/anyrect_interpolation.hpp deleted file mode 100644 index 170d2f0875..0000000000 --- a/anim/anyrect_interpolation.hpp +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include "geometry/any_rect2d.hpp" -#include "anim/angle_interpolation.hpp" -#include "anim/segment_interpolation.hpp" -#include "anim/value_interpolation.hpp" - -namespace anim -{ - class AnyRectInterpolation : public Task - { - private: - - double m_interval; - - AngleInterpolation m_angleInt; - double m_curAngle; - - SegmentInterpolation m_segmentInt; - m2::PointD m_curCenter; - - ValueInterpolation m_sizeXInt; - double m_curSizeX; - - ValueInterpolation m_sizeYInt; - double m_curSizeY; - - m2::AnyRectD m_startRect; - m2::AnyRectD m_endRect; - m2::AnyRectD & m_outRect; - - double m_startTime; - - public: - - AnyRectInterpolation(m2::AnyRectD const & startRect, - m2::AnyRectD const & endRect, - double rotationSpeed, - m2::AnyRectD & outRect); - - void OnStart(double ts); - void OnStep(double ts); - void OnEnd(double ts); - void OnCancel(double ts); - }; -} diff --git a/anim/controller.cpp b/anim/controller.cpp deleted file mode 100644 index ef8022078f..0000000000 --- a/anim/controller.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "anim/controller.hpp" -#include "anim/task.hpp" - -#include "base/assert.hpp" -#include "base/timer.hpp" - -#include "std/algorithm.hpp" - - -namespace anim -{ - Controller::Guard::Guard(Controller * controller) - : m_controller(controller) - { - m_controller->Lock(); - } - - Controller::Guard::~Guard() - { - m_controller->Unlock(); - } - - void Controller::AddTask(TTaskPtr const & task) - { - m_tasks.ProcessList([&] (TTasks & taskList) - { - taskList.push_back(task); - task->SetController(this); - }); - } - - bool Controller::HasTasks() - { - return !m_tasks.Empty(); - } - - bool Controller::HasVisualTasks() - { - return m_hasVisualTasks; - } - - void Controller::Lock() - { - ++m_LockCount; - } - - void Controller::Unlock() - { - --m_LockCount; - } - - int Controller::LockCount() - { - ASSERT(m_LockCount >=0, ("Lock/Unlock is unbalanced! LockCount < 0!")); - return m_LockCount; - } - - void Controller::PerformStep() - { - m_tasks.ProcessList([this] (TTasks & from) - { - m_tasksList.clear(); - swap(from, m_tasksList); - }); - - double ts = GetCurrentTime(); - - TTasks resultList; - - for (TTaskPtr const & task : m_tasksList) - { - task->Lock(); - - if (task->IsReady()) - { - task->Start(); - task->OnStart(ts); - } - if (task->IsRunning()) - task->OnStep(ts); - - if (task->IsRunning()) - resultList.push_back(task); - else - { - if (task->IsCancelled()) - task->OnCancel(ts); - if (task->IsEnded()) - task->OnEnd(ts); - } - - task->Unlock(); - } - - m_hasVisualTasks = false; - m_tasks.ProcessList([&] (TTasks & to) - { - for_each(resultList.begin(), resultList.end(), [&] (TTaskPtr const & task) - { - m_hasVisualTasks |= task->IsVisual(); - to.push_back(task); - }); - }); - } - - double Controller::GetCurrentTime() const - { - return my::Timer::LocalTime(); - } -} diff --git a/anim/controller.hpp b/anim/controller.hpp deleted file mode 100644 index 4326624dcd..0000000000 --- a/anim/controller.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" - -#include "base/thread.hpp" -#include "base/threaded_list.hpp" - -namespace anim -{ - class Task; - - // Animation controller class. - class Controller - { - private: - - typedef shared_ptr TTaskPtr; - // Container for tasks - typedef list TTasks; - - ThreadedList m_tasks; - // Task for the current step. - TTasks m_tasksList; - - int m_LockCount = 0; - bool m_hasVisualTasks = false; - - public: - - struct Guard - { - Controller * m_controller; - Guard(Controller * controller); - ~Guard(); - }; - - // Adding animation task to the controller - void AddTask(TTaskPtr const & task); - // Do we have animation tasks, which are currently running? - bool HasTasks(); - // Do we have visual animation tasks, which are currently running? - bool HasVisualTasks(); - // Lock/Unlock controller. Locked controller - // is considered to be in "transition" mode from one task to another - // and this situation is taken into account into RenderPolicy when - // checking for "need redraw" status. - void Lock(); - void Unlock(); - // Getting current lock count - int LockCount(); - // Perform single animation step - void PerformStep(); - // Getting current simulation time - double GetCurrentTime() const; - }; -} diff --git a/anim/segment_interpolation.cpp b/anim/segment_interpolation.cpp deleted file mode 100644 index df4b328be4..0000000000 --- a/anim/segment_interpolation.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "anim/segment_interpolation.hpp" -#include "anim/controller.hpp" - - -namespace anim -{ - SegmentInterpolation::SegmentInterpolation(m2::PointD const & startPt, - m2::PointD const & endPt, - double interval, - m2::PointD & outPt) - : m_startPt(startPt), - m_endPt(endPt), - m_outPt(outPt), - m_interval(interval) - { - m_speed = (m_endPt - m_startPt) / m_interval; - } - - void SegmentInterpolation::Reset(m2::PointD const & start, m2::PointD const & end, double interval) - { - ASSERT_GREATER(interval, 0.0, ()); - - m_startPt = start; - m_endPt = end; - m_outPt = m_startPt; - m_interval = interval; - - m_speed = (m_endPt - m_startPt) / m_interval; - m_startTime = GetController()->GetCurrentTime(); - SetState(EReady); - } - - void SegmentInterpolation::OnStart(double ts) - { - m_startTime = ts; - m_outPt = m_startPt; - Task::OnStart(ts); - } - - void SegmentInterpolation::OnStep(double ts) - { - double const elapsed = ts - m_startTime; - if (elapsed >= m_interval) - { - End(); - return; - } - - if (!IsRunning()) - return; - - m_outPt = m_startPt + m_speed * elapsed; - - Task::OnStep(ts); - } - - void SegmentInterpolation::OnEnd(double ts) - { - // ensuring that the final value was reached - m_outPt = m_endPt; - Task::OnEnd(ts); - } - - SafeSegmentInterpolation::SafeSegmentInterpolation(m2::PointD const & startPt, m2::PointD const & endPt, - double interval) - : TBase(startPt, endPt, interval, m_pt) - { - m_pt = startPt; - } - - void SafeSegmentInterpolation::ResetDestParams(m2::PointD const & dstPt, double interval) - { - Reset(GetCurrentValue(), dstPt, interval); - } - - m2::PointD const & SafeSegmentInterpolation::GetCurrentValue() const - { - return m_pt; - } -} diff --git a/anim/segment_interpolation.hpp b/anim/segment_interpolation.hpp deleted file mode 100644 index 771d1c7964..0000000000 --- a/anim/segment_interpolation.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "anim/task.hpp" - -#include "geometry/point2d.hpp" - - -namespace anim -{ - class SegmentInterpolation : public Task - { - m2::PointD m_startPt; - m2::PointD m_endPt; - m2::PointD & m_outPt; - double m_interval; - - m2::PointD m_speed; - double m_startTime; - - public: - SegmentInterpolation(m2::PointD const & startPt, - m2::PointD const & endPt, - double interval, - m2::PointD & outPt); - - void Reset(m2::PointD const & start, m2::PointD const & end, double interval); - - void OnStart(double ts); - void OnStep(double ts); - void OnEnd(double ts); - }; - - class SafeSegmentInterpolation : public SegmentInterpolation - { - typedef SegmentInterpolation TBase; - - public: - SafeSegmentInterpolation(m2::PointD const & startPt, - m2::PointD const & endPt, - double interval); - - void ResetDestParams(m2::PointD const & dstPt, double interval); - m2::PointD const & GetCurrentValue() const; - - private: - m2::PointD m_pt; - }; -} diff --git a/anim/task.cpp b/anim/task.cpp deleted file mode 100644 index 2045fc0c4d..0000000000 --- a/anim/task.cpp +++ /dev/null @@ -1,120 +0,0 @@ -#include "anim/task.hpp" - -#include "base/assert.hpp" - -#include "std/algorithm.hpp" - - -namespace anim -{ - Task::Task() - : m_State(EReady) - {} - - Task::~Task() - {} - - Task::EState Task::State() const - { - return m_State; - } - - void Task::Lock() - { - m_mutex.Lock(); - } - - void Task::Unlock() - { - m_mutex.Unlock(); - } - - void Task::SetState(EState State) - { - m_State = State; - } - - void Task::PerformCallbacks(EState state) - { - list const & cb = m_Callbacks[state]; - for_each(cb.begin(), cb.end(), [] (TCallback const & el) { el(); }); - } - - void Task::OnStart(double ts) - { - PerformCallbacks(EReady); - } - - void Task::OnStep(double ts) - { - PerformCallbacks(EInProgress); - } - - void Task::OnCancel(double ts) - { - PerformCallbacks(ECancelled); - } - - void Task::OnEnd(double ts) - { - PerformCallbacks(EEnded); - } - - void Task::Start() - { - ASSERT(IsReady(), ()); - SetState(EInProgress); - } - - void Task::Cancel() - { - ASSERT(IsRunning() || IsReady(), ()); - SetState(ECancelled); - } - - void Task::End() - { - ASSERT(IsRunning() || IsReady(), ()); - SetState(EEnded); - } - - bool Task::IsEnded() const - { - return State() == EEnded; - } - - bool Task::IsCancelled() const - { - return State() == ECancelled; - } - - bool Task::IsRunning() const - { - return State() == EInProgress; - } - - bool Task::IsReady() const - { - return State() == EReady; - } - - bool Task::IsVisual() const - { - return false; - } - - void Task::AddCallback(EState state, TCallback const & cb) - { - m_Callbacks[state].push_back(cb); - } - - void Task::SetController(Controller * controller) - { - m_controller = controller; - } - - Controller * Task::GetController() const - { - return m_controller; - } -} diff --git a/anim/task.hpp b/anim/task.hpp deleted file mode 100644 index 714de4cfc0..0000000000 --- a/anim/task.hpp +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include "std/map.hpp" -#include "std/list.hpp" -#include "std/function.hpp" - -#include "base/mutex.hpp" - -namespace anim -{ - class Controller; - - // Interface for single animation task - class Task - { - public: - - typedef function TCallback; - - enum EState - { - EReady, - EInProgress, - ECancelled, - EEnded - }; - - private: - - EState m_State; - - map > m_Callbacks; - - void PerformCallbacks(EState state); - - threads::Mutex m_mutex; - - Controller * m_controller; - - protected: - - void SetState(EState state); - friend class Controller; - void SetController(Controller * controller); - - public: - - Task(); - virtual ~Task(); - - Controller * GetController() const; - - EState State() const; - - virtual void OnStart(double ts); - virtual void OnStep(double ts); - virtual void OnEnd(double ts); - virtual void OnCancel(double ts); - - void Start(); - void Cancel(); - void End(); - - bool IsCancelled() const; - bool IsEnded() const; - bool IsRunning() const; - bool IsReady() const; - - void Lock(); - void Unlock(); - - /// is this animation task animate something, - /// which is directly changing visual appearance. - virtual bool IsVisual() const; - - void AddCallback(EState state, TCallback const & cb); - }; -} diff --git a/anim/value_interpolation.cpp b/anim/value_interpolation.cpp deleted file mode 100644 index 86c4218841..0000000000 --- a/anim/value_interpolation.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "anim/value_interpolation.hpp" - -namespace anim -{ - ValueInterpolation::ValueInterpolation(double start, - double end, - double interval, - double & out) - : m_startValue(start), - m_outValue(out), - m_endValue(end) - { - m_dist = end - start; - m_interval = interval; - } - - void ValueInterpolation::OnStart(double ts) - { - m_startTime = ts; - m_outValue = m_startValue; - Task::OnStart(ts); - } - - void ValueInterpolation::OnStep(double ts) - { - if (ts - m_startTime >= m_interval) - { - End(); - return; - } - - if (!IsRunning()) - return; - - double elapsedSec = ts - m_startTime; - m_outValue = m_startValue + m_dist * elapsedSec / m_interval; - - Task::OnStep(ts); - } - - void ValueInterpolation::OnEnd(double ts) - { - // ensuring that the final value was reached - m_outValue = m_endValue; - Task::OnEnd(ts); - } -} - diff --git a/anim/value_interpolation.hpp b/anim/value_interpolation.hpp deleted file mode 100644 index 3da01d76e0..0000000000 --- a/anim/value_interpolation.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "anim/task.hpp" - -namespace anim -{ - class ValueInterpolation : public Task - { - private: - - double m_startValue; - double & m_outValue; - double m_endValue; - - double m_startTime; - double m_interval; - double m_dist; - - public: - - ValueInterpolation(double start, - double end, - double interval, - double & out); - - void OnStart(double ts); - void OnStep(double ts); - void OnEnd(double ts); - }; -} diff --git a/base/base_tests/observer_list_test.cpp b/base/base_tests/observer_list_test.cpp index 6e3a4ba48f..342c3254e0 100644 --- a/base/base_tests/observer_list_test.cpp +++ b/base/base_tests/observer_list_test.cpp @@ -1,8 +1,8 @@ -#include "../../testing/testing.hpp" +#include "testing/testing.hpp" -#include "../observer_list.hpp" +#include "base/observer_list.hpp" -#include "../../std/string.hpp" +#include "std/string.hpp" namespace { diff --git a/base/buffer_vector.hpp b/base/buffer_vector.hpp index df303b12a5..a8b121e145 100644 --- a/base/buffer_vector.hpp +++ b/base/buffer_vector.hpp @@ -184,9 +184,16 @@ public: void clear() { if (IsDynamic()) + { m_dynamic.clear(); + } else + { + // here we have to call destructors of objects inside + for (size_t i = 0; i < m_size; ++i) + m_static[i] = T(); m_size = 0; + } } /// @todo Here is some inconsistencies: diff --git a/base/internal/message.hpp b/base/internal/message.hpp index 969cba34aa..d75096c62d 100644 --- a/base/internal/message.hpp +++ b/base/internal/message.hpp @@ -1,14 +1,16 @@ #pragma once #include "std/array.hpp" +#include "std/functional.hpp" +#include "std/initializer_list.hpp" #include "std/iterator.hpp" #include "std/list.hpp" #include "std/map.hpp" #include "std/set.hpp" #include "std/sstream.hpp" #include "std/string.hpp" +#include "std/unique_ptr.hpp" #include "std/utility.hpp" #include "std/vector.hpp" -#include "std/initializer_list.hpp" /// @name Declarations. @@ -19,12 +21,13 @@ string DebugPrint(string const & t); inline string DebugPrint(char const * t); inline string DebugPrint(char t); -template inline string DebugPrint(pair const & p); +template inline string DebugPrint(pair const & p); template inline string DebugPrint(list const & v); template inline string DebugPrint(vector const & v); -template inline string DebugPrint(set const & v); -template inline string DebugPrint(map const & v); +template > inline string DebugPrint(set const & v); +template > inline string DebugPrint(map const & v); template inline string DebugPrint(initializer_list const & v); +template inline string DebugPrint(unique_ptr const & v); //@} @@ -94,12 +97,12 @@ template inline string DebugPrint(list const & v) return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } -template inline string DebugPrint(set const & v) +template inline string DebugPrint(set const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } -template inline string DebugPrint(map const & v) +template inline string DebugPrint(map const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } @@ -116,6 +119,16 @@ template inline string DebugPrint(T const & t) return out.str(); } +template inline string DebugPrint(unique_ptr const & v) +{ + ostringstream out; + if (v.get() != nullptr) + out << DebugPrint(*v); + else + out << DebugPrint("null"); + return out.str(); +} + namespace my { namespace impl diff --git a/base/math.hpp b/base/math.hpp index 78b59dd335..92ac40ab06 100644 --- a/base/math.hpp +++ b/base/math.hpp @@ -103,6 +103,16 @@ inline T clamp(T x, TMin xmin, TMax xmax) return x; } +template +inline T cyclicClamp(T x, T xmin, T xmax) +{ + if (x > xmax) + return xmin; + if (x < xmin) + return xmax; + return x; +} + template inline bool between_s(T a, T b, T x) { return (a <= x && x <= b); diff --git a/base/mutex.hpp b/base/mutex.hpp index 1bf626a18a..76cf67d1eb 100644 --- a/base/mutex.hpp +++ b/base/mutex.hpp @@ -5,7 +5,7 @@ #include "std/target_os.hpp" #if defined(OMIM_OS_WINDOWS_NATIVE) - #include "../std/windows.hpp" + #include "std/windows.hpp" #else #include #endif diff --git a/base/object_tracker.cpp b/base/object_tracker.cpp index 1362725e09..acad6d0a15 100644 --- a/base/object_tracker.cpp +++ b/base/object_tracker.cpp @@ -8,7 +8,7 @@ #include #include #else - #include "../std/windows.hpp" + #include "std/windows.hpp" #endif diff --git a/base/observer_list.hpp b/base/observer_list.hpp index 0afe6de7c3..04aab44b9b 100644 --- a/base/observer_list.hpp +++ b/base/observer_list.hpp @@ -1,10 +1,10 @@ #pragma once -#include "../base/logging.hpp" +#include "base/logging.hpp" -#include "../std/algorithm.hpp" -#include "../std/mutex.hpp" -#include "../std/vector.hpp" +#include "std/algorithm.hpp" +#include "std/mutex.hpp" +#include "std/vector.hpp" namespace my { diff --git a/base/shared_buffer_manager.cpp b/base/shared_buffer_manager.cpp index 3c6f1d5f1a..0e530e627f 100644 --- a/base/shared_buffer_manager.cpp +++ b/base/shared_buffer_manager.cpp @@ -7,6 +7,12 @@ SharedBufferManager & SharedBufferManager::instance() return i; } +void SharedBufferManager::clearReserved() +{ + threads::MutexGuard g(m_mutex); + m_sharedBuffers.clear(); +} + SharedBufferManager::shared_buffer_ptr_t SharedBufferManager::reserveSharedBuffer(size_t s) { threads::MutexGuard g(m_mutex); diff --git a/base/shared_buffer_manager.hpp b/base/shared_buffer_manager.hpp index 297d469d53..c73b9d9215 100644 --- a/base/shared_buffer_manager.hpp +++ b/base/shared_buffer_manager.hpp @@ -21,6 +21,8 @@ private: public: static SharedBufferManager & instance(); + void clearReserved(); + shared_buffer_ptr_t reserveSharedBuffer(size_t s); void freeSharedBuffer(size_t s, shared_buffer_ptr_t buf); diff --git a/base/string_utils.cpp b/base/string_utils.cpp index 0e11c47ae9..2a310404c8 100644 --- a/base/string_utils.cpp +++ b/base/string_utils.cpp @@ -138,6 +138,11 @@ void Trim(string & s) boost::trim(s); } +void Trim(string & s, char const * anyOf) +{ + boost::trim_if(s, boost::is_any_of(anyOf)); +} + bool EqualNoCase(string const & s1, string const & s2) { return MakeLowerCase(s1) == MakeLowerCase(s2); diff --git a/base/string_utils.hpp b/base/string_utils.hpp index 850a7c8f61..9030b1ef82 100644 --- a/base/string_utils.hpp +++ b/base/string_utils.hpp @@ -53,6 +53,8 @@ void AsciiToLower(string & s); // TODO(AlexZ): current boost impl uses default std::locale() to trim. // In general, it does not work for any unicode whitespace except ASCII U+0020 one. void Trim(string & s); +/// Remove any characters that contain in "anyOf" on left and right side of string s +void Trim(string & s, char const * anyOf); void MakeLowerCaseInplace(string & s); string MakeLowerCase(string const & s); diff --git a/base/thread.hpp b/base/thread.hpp index c24f9e4deb..c5bc84bcd5 100644 --- a/base/thread.hpp +++ b/base/thread.hpp @@ -16,7 +16,7 @@ #include "std/vector.hpp" #ifdef OMIM_OS_WINDOWS -#include "../std/windows.hpp" // for DWORD +#include "std/windows.hpp" // for DWORD #endif namespace threads diff --git a/base/timer.cpp b/base/timer.cpp index 6962cd9c27..cd14828ed5 100644 --- a/base/timer.cpp +++ b/base/timer.cpp @@ -144,4 +144,14 @@ uint64_t HighResTimer::ElapsedNano() const return duration_cast(high_resolution_clock::now() - m_start).count(); } +uint64_t HighResTimer::ElapsedMillis() const +{ + return duration_cast(high_resolution_clock::now() - m_start).count(); +} + +double HighResTimer::ElapsedSeconds() const +{ + return duration_cast>(high_resolution_clock::now() - m_start).count(); +} + } diff --git a/base/timer.hpp b/base/timer.hpp index 8b65e31a1c..0ff9a0a1e6 100644 --- a/base/timer.hpp +++ b/base/timer.hpp @@ -67,6 +67,8 @@ public: void Reset(); uint64_t ElapsedNano() const; + uint64_t ElapsedMillis() const; + double ElapsedSeconds() const; }; } diff --git a/coding/internal/file_data.cpp b/coding/internal/file_data.cpp index 785fd9b53f..c02650f47e 100644 --- a/coding/internal/file_data.cpp +++ b/coding/internal/file_data.cpp @@ -1,7 +1,7 @@ #include "coding/internal/file_data.hpp" -#include "../reader.hpp" // For Reader exceptions. -#include "../writer.hpp" // For Writer exceptions. +#include "reader.hpp" // For Reader exceptions. +#include "writer.hpp" // For Writer exceptions. #include "coding/constants.hpp" #include "base/exception.hpp" diff --git a/coding/read_write_utils.hpp b/coding/read_write_utils.hpp index 1a894b0bde..9c0ecd2362 100644 --- a/coding/read_write_utils.hpp +++ b/coding/read_write_utils.hpp @@ -8,7 +8,6 @@ #include "std/vector.hpp" #include "std/type_traits.hpp" - namespace rw { template diff --git a/common.pri b/common.pri index c643eed621..305b420302 100644 --- a/common.pri +++ b/common.pri @@ -3,12 +3,6 @@ # To use it, define ROOT_DIR variable and include($$ROOT_DIR/common.pri) -#CONFIG *= drape - -drape { - DEFINES *= USE_DRAPE -} - CONFIG(map_designer) { DEFINES *= STANDALONE_APP DEFINES *= BUILD_DESIGNER diff --git a/data/classificator.txt b/data/classificator.txt index fea4da2f41..0887fb853d 100644 --- a/data/classificator.txt +++ b/data/classificator.txt @@ -88,6 +88,10 @@ world + toilets - townhall - university - + vending_machine + + parking_tickets - + public_transport_tickets - + {} waste_disposal - {} area:highway + diff --git a/data/colors.txt b/data/colors.txt new file mode 100644 index 0000000000..285e5cbc3f --- /dev/null +++ b/data/colors.txt @@ -0,0 +1,270 @@ +0 +68 +255 +4369 +8738 +17408 +17510 +23522 +25600 +26112 +401446 +469129 +612617 +1002511 +1052688 +1118464 +1118481 +1170688 +1315840 +1778944 +1786635 +2105376 +2171161 +2236945 +2236962 +2631706 +2757700 +2770241 +2894359 +3026460 +3158064 +3166424 +3355426 +3355443 +3584191 +3832097 +3878179 +4011550 +4210752 +4259648 +4456448 +4473924 +4495803 +4820806 +4984591 +4984652 +5095245 +5131837 +5175627 +5217717 +5263440 +5271760 +5274858 +5592388 +5592405 +5835017 +5835097 +5855577 +6052945 +6072320 +6316128 +6373439 +6510384 +6513500 +6645093 +6710886 +7368816 +7565931 +7829367 +8355446 +8355711 +8421488 +8421504 +8947848 +9130140 +9163744 +9211020 +9420621 +9474176 +9474192 +9485456 +9487572 +9490576 +9498256 +9849600 +9868678 +10008808 +10066329 +10526864 +10526880 +10535864 +11061464 +11129685 +11190117 +11393254 +11453035 +11579552 +11579560 +11579568 +11584112 +11710882 +11720357 +11781233 +11899980 +12052198 +12090372 +12171925 +12285696 +12303274 +12303291 +12372094 +12434877 +12500670 +12582912 +12626044 +12632240 +12632256 +12763315 +12876543 +13029267 +13155550 +13158496 +13158575 +13224123 +13484259 +13487540 +13487565 +13615592 +13620648 +13626551 +13664384 +13683884 +13683900 +13684816 +13684944 +13691076 +13746411 +13749671 +13757137 +13880216 +13942770 +13944980 +13950141 +14127921 +14196816 +14211268 +14212302 +14483456 +14529176 +14539465 +14540236 +14671767 +14803429 +14934482 +15000299 +15000804 +15120311 +15120358 +15132390 +15262932 +15326578 +15453902 +15456432 +15527148 +15591634 +15592411 +15631086 +15649877 +15652006 +15658717 +15658734 +15701793 +15711086 +15761648 +15763456 +15786204 +15855336 +15921870 +16154634 +16178442 +16238080 +16241558 +16280377 +16284746 +16313580 +16314600 +16316632 +16316664 +16317695 +16340811 +16553815 +16557154 +16575614 +16638054 +16645629 +16711680 +16728128 +16737830 +16741158 +16742144 +16746062 +16746278 +16746413 +16749632 +16752972 +16761924 +16776064 +16776960 +16777104 +16777164 +16777215 +656090368 +666683518 +857874978 +860094464 +861230404 +862011455 +862151516 +863203947 +868862139 +871954680 +872349696 +872384429 +1297438020 +1298359132 +1300267136 +1307767538 +1712394496 +1713512994 +1716407869 +1719105399 +1724500155 +1726868443 +1727592696 +2148602112 +2149720610 +2155905152 +2158010528 +2160707771 +2162418130 +2163076059 +2163245296 +2163800312 +2164260863 +2566914048 +2578625202 +2583691263 +3003121664 +3003130402 +3003147264 +3003147776 +3003590793 +3004108620 +3004240128 +3011543168 +3012251804 +3012285408 +3012619920 +3014514918 +3014832818 +3015407360 +3015885506 +3017605120 +3018714075 +3018752750 +3019359744 +3019863808 +3019898879 +4280427042 +4294506744 diff --git a/data/drules_proto.bin b/data/drules_proto.bin index f386322da1..ffee432881 100644 Binary files a/data/drules_proto.bin and b/data/drules_proto.bin differ diff --git a/data/drules_proto.txt b/data/drules_proto.txt index f4a0c84449..5e1fb02957 100644 --- a/data/drules_proto.txt +++ b/data/drules_proto.txt @@ -4,7 +4,7 @@ cont { scale: 15 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1596 join: ROUNDJOIN cap: ROUNDCAP @@ -14,7 +14,7 @@ cont { scale: 16 lines { width: 1.6 - color: 2236962 + color: 2105376 priority: 1776 join: ROUNDJOIN cap: ROUNDCAP @@ -24,7 +24,7 @@ cont { scale: 17 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1837 join: ROUNDJOIN cap: ROUNDCAP @@ -34,7 +34,7 @@ cont { scale: 18 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1837 join: ROUNDJOIN cap: ROUNDCAP @@ -44,7 +44,7 @@ cont { scale: 19 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1837 join: ROUNDJOIN cap: ROUNDCAP @@ -57,7 +57,7 @@ cont { scale: 15 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1602 join: ROUNDJOIN cap: ROUNDCAP @@ -67,7 +67,7 @@ cont { scale: 16 lines { width: 1.6 - color: 2236962 + color: 2105376 priority: 1782 join: ROUNDJOIN cap: ROUNDCAP @@ -77,7 +77,7 @@ cont { scale: 17 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -87,7 +87,7 @@ cont { scale: 18 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -97,7 +97,7 @@ cont { scale: 19 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -110,7 +110,7 @@ cont { scale: 15 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1599 join: ROUNDJOIN cap: ROUNDCAP @@ -120,7 +120,7 @@ cont { scale: 16 lines { width: 1.6 - color: 2236962 + color: 2105376 priority: 1779 join: ROUNDJOIN cap: ROUNDCAP @@ -130,7 +130,7 @@ cont { scale: 17 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1840 join: ROUNDJOIN cap: ROUNDCAP @@ -140,7 +140,7 @@ cont { scale: 18 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1840 join: ROUNDJOIN cap: ROUNDCAP @@ -150,7 +150,7 @@ cont { scale: 19 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1840 join: ROUNDJOIN cap: ROUNDCAP @@ -163,7 +163,7 @@ cont { scale: 15 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1605 join: ROUNDJOIN cap: ROUNDCAP @@ -173,7 +173,7 @@ cont { scale: 16 lines { width: 1.6 - color: 2236962 + color: 2105376 priority: 1785 join: ROUNDJOIN cap: ROUNDCAP @@ -183,7 +183,7 @@ cont { scale: 17 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1844 join: ROUNDJOIN cap: ROUNDCAP @@ -193,7 +193,7 @@ cont { scale: 18 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1844 join: ROUNDJOIN cap: ROUNDCAP @@ -203,7 +203,7 @@ cont { scale: 19 lines { width: 3.2 - color: 2236962 + color: 2105376 priority: 1844 join: ROUNDJOIN cap: ROUNDCAP @@ -216,7 +216,7 @@ cont { scale: 13 circle { radius: 2.0 - color: 2236962 + color: 2105376 priority: 14000 } } @@ -224,7 +224,7 @@ cont { scale: 14 circle { radius: 2.0 - color: 3364317 + color: 3166424 priority: 14000 } } @@ -232,7 +232,7 @@ cont { scale: 15 circle { radius: 3.0 - color: 3364317 + color: 3166424 priority: 14000 } } @@ -241,14 +241,14 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 15000 } circle { radius: 4.0 - color: 3364317 + color: 3166424 priority: 14000 } } @@ -257,14 +257,14 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 15000 } circle { radius: 3.2 - color: 3364317 + color: 3166424 priority: 14000 } } @@ -273,14 +273,14 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 15000 } circle { radius: 3.2 - color: 3364317 + color: 3166424 priority: 14000 } } @@ -289,14 +289,14 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 15000 } circle { radius: 3.2 - color: 3364317 + color: 3166424 priority: 14000 } } @@ -306,14 +306,14 @@ cont { element { scale: 11 area { - color: 14540236 + color: 14212302 priority: -16001 } } element { scale: 12 area { - color: 14540236 + color: 14212302 priority: -16002 } symbol { @@ -323,13 +323,13 @@ cont { caption { primary { height: 10 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 9 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -340,7 +340,7 @@ cont { element { scale: 13 area { - color: 14540236 + color: 14212302 priority: -16003 } symbol { @@ -350,13 +350,13 @@ cont { caption { primary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -367,7 +367,7 @@ cont { element { scale: 14 area { - color: 14540236 + color: 14212302 priority: -16004 } symbol { @@ -377,13 +377,13 @@ cont { caption { primary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -394,7 +394,7 @@ cont { element { scale: 15 area { - color: 14540236 + color: 14212302 priority: -16005 } symbol { @@ -404,13 +404,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -421,7 +421,7 @@ cont { element { scale: 16 area { - color: 14540236 + color: 14212302 priority: -16006 } symbol { @@ -431,13 +431,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -448,7 +448,7 @@ cont { element { scale: 17 area { - color: 14540236 + color: 14212302 priority: -16007 } symbol { @@ -458,13 +458,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -475,7 +475,7 @@ cont { element { scale: 18 area { - color: 14540236 + color: 14212302 priority: -16008 } symbol { @@ -485,13 +485,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -502,7 +502,7 @@ cont { element { scale: 19 area { - color: 14540236 + color: 14212302 priority: -16009 } symbol { @@ -512,13 +512,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -532,14 +532,14 @@ cont { element { scale: 11 area { - color: 14540236 + color: 14212302 priority: -16010 } } element { scale: 12 area { - color: 14540236 + color: 14212302 priority: -16011 } symbol { @@ -549,13 +549,13 @@ cont { caption { primary { height: 10 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 9 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -566,7 +566,7 @@ cont { element { scale: 13 area { - color: 14540236 + color: 14212302 priority: -16012 } symbol { @@ -576,13 +576,13 @@ cont { caption { primary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -593,7 +593,7 @@ cont { element { scale: 14 area { - color: 14540236 + color: 14212302 priority: -16013 } symbol { @@ -603,13 +603,13 @@ cont { caption { primary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -620,7 +620,7 @@ cont { element { scale: 15 area { - color: 14540236 + color: 14212302 priority: -16014 } symbol { @@ -630,13 +630,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -647,7 +647,7 @@ cont { element { scale: 16 area { - color: 14540236 + color: 14212302 priority: -16015 } symbol { @@ -657,13 +657,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -674,7 +674,7 @@ cont { element { scale: 17 area { - color: 14540236 + color: 14212302 priority: -16016 } symbol { @@ -684,13 +684,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -701,7 +701,7 @@ cont { element { scale: 18 area { - color: 14540236 + color: 14212302 priority: -16017 } symbol { @@ -711,13 +711,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -728,7 +728,7 @@ cont { element { scale: 19 area { - color: 14540236 + color: 14212302 priority: -16018 } symbol { @@ -738,13 +738,13 @@ cont { caption { primary { height: 12 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 21998 + color: 23522 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -826,7 +826,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -836,7 +836,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -846,7 +846,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -896,14 +896,14 @@ cont { scale: 12 lines { width: 3.0 - color: 2236962 + color: 2105376 priority: 1240 join: BEVELJOIN cap: BUTTCAP } lines { width: 2.0 - color: 14540219 + color: 13950141 priority: 1241 join: BEVELJOIN cap: BUTTCAP @@ -913,14 +913,14 @@ cont { scale: 13 lines { width: 3.5 - color: 2236962 + color: 2105376 priority: 1255 join: BEVELJOIN cap: BUTTCAP } lines { width: 2.5 - color: 14540219 + color: 13950141 priority: 1256 join: BEVELJOIN cap: BUTTCAP @@ -930,14 +930,14 @@ cont { scale: 14 lines { width: 14.0 - color: 2236962 + color: 2105376 priority: 1335 join: BEVELJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540219 + color: 13950141 priority: 1336 join: BEVELJOIN cap: BUTTCAP @@ -947,14 +947,14 @@ cont { scale: 15 lines { width: 28.0 - color: 2236962 + color: 2105376 priority: 999 join: BEVELJOIN cap: BUTTCAP } lines { width: 20.0 - color: 14540219 + color: 13950141 priority: 1000 join: BEVELJOIN cap: BUTTCAP @@ -964,14 +964,14 @@ cont { scale: 16 lines { width: 28.0 - color: 2236962 + color: 2105376 priority: 999 join: BEVELJOIN cap: BUTTCAP } lines { width: 20.0 - color: 14540219 + color: 13950141 priority: 1000 join: BEVELJOIN cap: BUTTCAP @@ -981,14 +981,14 @@ cont { scale: 17 lines { width: 28.0 - color: 2236962 + color: 2105376 priority: 999 join: BEVELJOIN cap: BUTTCAP } lines { width: 20.0 - color: 14540219 + color: 13950141 priority: 1000 join: BEVELJOIN cap: BUTTCAP @@ -998,14 +998,14 @@ cont { scale: 18 lines { width: 28.0 - color: 2236962 + color: 2105376 priority: 999 join: BEVELJOIN cap: BUTTCAP } lines { width: 20.0 - color: 14540219 + color: 13950141 priority: 1000 join: BEVELJOIN cap: BUTTCAP @@ -1015,14 +1015,14 @@ cont { scale: 19 lines { width: 28.0 - color: 2236962 + color: 2105376 priority: 999 join: BEVELJOIN cap: BUTTCAP } lines { width: 20.0 - color: 14540219 + color: 13950141 priority: 1000 join: BEVELJOIN cap: BUTTCAP @@ -1035,14 +1035,14 @@ cont { scale: 12 lines { width: 0.74 - color: 2236962 + color: 2105376 priority: 1243 join: BEVELJOIN cap: BUTTCAP } lines { width: 0.5 - color: 14540219 + color: 13950141 priority: 1244 join: BEVELJOIN cap: BUTTCAP @@ -1052,14 +1052,14 @@ cont { scale: 13 lines { width: 1.5 - color: 2236962 + color: 2105376 priority: 1258 join: BEVELJOIN cap: BUTTCAP } lines { width: 1.0 - color: 14540219 + color: 13950141 priority: 1259 join: BEVELJOIN cap: BUTTCAP @@ -1069,14 +1069,14 @@ cont { scale: 14 lines { width: 6.0 - color: 2236962 + color: 2105376 priority: 1338 join: BEVELJOIN cap: BUTTCAP } lines { width: 4.0 - color: 14540219 + color: 13950141 priority: 1339 join: BEVELJOIN cap: BUTTCAP @@ -1086,14 +1086,14 @@ cont { scale: 15 lines { width: 12.0 - color: 2236962 + color: 2105376 priority: 1414 join: BEVELJOIN cap: BUTTCAP } lines { width: 8.0 - color: 14540219 + color: 13950141 priority: 1415 join: BEVELJOIN cap: BUTTCAP @@ -1103,14 +1103,14 @@ cont { scale: 16 lines { width: 12.0 - color: 2236962 + color: 2105376 priority: 1414 join: BEVELJOIN cap: BUTTCAP } lines { width: 8.0 - color: 14540219 + color: 13950141 priority: 1415 join: BEVELJOIN cap: BUTTCAP @@ -1120,14 +1120,14 @@ cont { scale: 17 lines { width: 12.0 - color: 2236962 + color: 2105376 priority: 1414 join: BEVELJOIN cap: BUTTCAP } lines { width: 8.0 - color: 14540219 + color: 13950141 priority: 1415 join: BEVELJOIN cap: BUTTCAP @@ -1137,14 +1137,14 @@ cont { scale: 18 lines { width: 12.0 - color: 2236962 + color: 2105376 priority: 1414 join: BEVELJOIN cap: BUTTCAP } lines { width: 8.0 - color: 14540219 + color: 13950141 priority: 1415 join: BEVELJOIN cap: BUTTCAP @@ -1154,14 +1154,14 @@ cont { scale: 19 lines { width: 12.0 - color: 2236962 + color: 2105376 priority: 1414 join: BEVELJOIN cap: BUTTCAP } lines { width: 8.0 - color: 14540219 + color: 13950141 priority: 1415 join: BEVELJOIN cap: BUTTCAP @@ -1173,56 +1173,56 @@ cont { element { scale: 12 area { - color: 14535833 + color: 13944980 priority: -16019 } } element { scale: 13 area { - color: 14535833 + color: 13944980 priority: -16020 } } element { scale: 14 area { - color: 14535833 + color: 13944980 priority: -16021 } } element { scale: 15 area { - color: 14535833 + color: 13944980 priority: -16022 } } element { scale: 16 area { - color: 14535833 + color: 13944980 priority: -16023 } } element { scale: 17 area { - color: 14535833 + color: 13944980 priority: -16024 } } element { scale: 18 area { - color: 14535833 + color: 13944980 priority: -16025 } } element { scale: 19 area { - color: 14535833 + color: 13944980 priority: -16026 } } @@ -1234,7 +1234,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1246,7 +1246,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1258,7 +1258,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1277,7 +1277,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1293,7 +1293,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1309,7 +1309,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1335,7 +1335,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1351,7 +1351,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1367,7 +1367,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1393,7 +1393,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1409,7 +1409,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1425,7 +1425,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1444,7 +1444,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1460,7 +1460,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1476,7 +1476,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1502,7 +1502,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1518,7 +1518,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1534,7 +1534,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1560,7 +1560,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1576,7 +1576,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1592,7 +1592,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1607,7 +1607,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1619,7 +1619,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1631,7 +1631,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1657,7 +1657,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1673,7 +1673,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1689,7 +1689,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1715,13 +1715,13 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -1738,13 +1738,13 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -1761,13 +1761,13 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -1794,7 +1794,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1810,7 +1810,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1826,7 +1826,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1852,7 +1852,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1868,7 +1868,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1884,7 +1884,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1910,7 +1910,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1926,7 +1926,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1942,7 +1942,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1957,7 +1957,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1969,7 +1969,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -1981,7 +1981,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2007,7 +2007,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2023,7 +2023,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2039,7 +2039,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2054,7 +2054,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2066,7 +2066,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2078,7 +2078,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2091,35 +2091,35 @@ cont { element { scale: 13 area { - color: 16772829 + color: 15786204 priority: -16027 } } element { scale: 14 area { - color: 16772829 + color: 15786204 priority: -16028 } } element { scale: 15 area { - color: 16772829 + color: 15786204 priority: -16029 } } element { scale: 16 area { - color: 16772829 + color: 15786204 priority: -16030 } } element { scale: 17 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -2129,7 +2129,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2139,7 +2139,7 @@ cont { element { scale: 18 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -2149,7 +2149,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2159,7 +2159,7 @@ cont { element { scale: 19 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -2169,7 +2169,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2184,7 +2184,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2196,7 +2196,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2208,7 +2208,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2234,7 +2234,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2250,7 +2250,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2266,7 +2266,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2285,7 +2285,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2301,7 +2301,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2317,7 +2317,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2343,7 +2343,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2359,7 +2359,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2375,7 +2375,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2401,7 +2401,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2417,7 +2417,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2433,7 +2433,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2459,7 +2459,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2475,7 +2475,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2491,7 +2491,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2517,7 +2517,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2533,7 +2533,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2549,7 +2549,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2562,7 +2562,7 @@ cont { element { scale: 16 area { - color: 10079453 + color: 9487572 priority: 1095 } symbol { @@ -2573,7 +2573,7 @@ cont { element { scale: 17 area { - color: 10079453 + color: 9487572 priority: 1004 } symbol { @@ -2583,7 +2583,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2593,7 +2593,7 @@ cont { element { scale: 18 area { - color: 10079453 + color: 9487572 priority: 1004 } symbol { @@ -2603,7 +2603,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2613,7 +2613,7 @@ cont { element { scale: 19 area { - color: 10079453 + color: 9487572 priority: 1004 } symbol { @@ -2623,7 +2623,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2656,7 +2656,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2672,7 +2672,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2688,7 +2688,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2701,41 +2701,41 @@ cont { element { scale: 13 area { - color: 14544588 + color: 13691076 priority: 1001 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: 1001 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: 1001 } } element { scale: 16 area { - color: 14544588 + color: 13691076 priority: 1001 } } element { scale: 17 area { - color: 14544588 + color: 13691076 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2745,13 +2745,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2761,13 +2761,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2780,41 +2780,41 @@ cont { element { scale: 13 area { - color: 14544588 + color: 13691076 priority: 1001 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: 1001 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: 1001 } } element { scale: 16 area { - color: 14544588 + color: 13691076 priority: 1001 } } element { scale: 17 area { - color: 14544588 + color: 13691076 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2824,13 +2824,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2840,13 +2840,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2865,7 +2865,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2881,7 +2881,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2897,7 +2897,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2923,7 +2923,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2939,7 +2939,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2955,7 +2955,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -2968,35 +2968,35 @@ cont { element { scale: 13 area { - color: 16772829 + color: 15786204 priority: -16031 } } element { scale: 14 area { - color: 16772829 + color: 15786204 priority: -16032 } } element { scale: 15 area { - color: 16772829 + color: 15786204 priority: -16033 } } element { scale: 16 area { - color: 16772829 + color: 15786204 priority: -16034 } } element { scale: 17 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -3006,7 +3006,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3016,7 +3016,7 @@ cont { element { scale: 18 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -3026,7 +3026,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3036,7 +3036,7 @@ cont { element { scale: 19 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -3046,7 +3046,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3072,7 +3072,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3088,7 +3088,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3104,7 +3104,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3130,7 +3130,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3146,7 +3146,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3162,7 +3162,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3188,7 +3188,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3204,7 +3204,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3220,7 +3220,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3233,14 +3233,14 @@ cont { element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -16035 } } element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -16036 } symbol { @@ -3251,7 +3251,7 @@ cont { element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3261,7 +3261,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3271,7 +3271,7 @@ cont { element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3281,7 +3281,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3291,7 +3291,7 @@ cont { element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3301,7 +3301,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3314,14 +3314,14 @@ cont { element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -16037 } } element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -16038 } symbol { @@ -3332,7 +3332,7 @@ cont { element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3342,7 +3342,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3352,7 +3352,7 @@ cont { element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3362,7 +3362,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3372,7 +3372,7 @@ cont { element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3382,7 +3382,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3395,14 +3395,14 @@ cont { element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -16039 } } element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -16040 } symbol { @@ -3413,7 +3413,7 @@ cont { element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3423,7 +3423,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3433,7 +3433,7 @@ cont { element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3443,7 +3443,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3453,7 +3453,7 @@ cont { element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3463,7 +3463,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3476,14 +3476,14 @@ cont { element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -16041 } } element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -16042 } symbol { @@ -3494,7 +3494,7 @@ cont { element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3504,7 +3504,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3514,7 +3514,7 @@ cont { element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3524,7 +3524,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3534,7 +3534,7 @@ cont { element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3544,7 +3544,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3559,7 +3559,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3571,7 +3571,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3583,7 +3583,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3596,14 +3596,14 @@ cont { element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -16043 } } element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -16044 } symbol { @@ -3614,7 +3614,7 @@ cont { element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3624,7 +3624,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3634,7 +3634,7 @@ cont { element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3644,7 +3644,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3654,7 +3654,7 @@ cont { element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3664,7 +3664,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3690,7 +3690,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3706,7 +3706,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3722,7 +3722,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3748,7 +3748,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3764,7 +3764,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3780,7 +3780,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3806,7 +3806,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3822,7 +3822,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3838,7 +3838,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3851,14 +3851,14 @@ cont { element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -16045 } } element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -16046 } symbol { @@ -3869,7 +3869,7 @@ cont { element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3879,7 +3879,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3889,7 +3889,7 @@ cont { element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3899,7 +3899,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3909,7 +3909,7 @@ cont { element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3919,7 +3919,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3932,14 +3932,14 @@ cont { element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -16047 } } element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -16048 } symbol { @@ -3950,7 +3950,7 @@ cont { element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3960,7 +3960,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3970,7 +3970,7 @@ cont { element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -3980,7 +3980,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -3990,7 +3990,7 @@ cont { element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15997 } symbol { @@ -4000,7 +4000,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4026,7 +4026,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4042,7 +4042,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4058,7 +4058,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4084,7 +4084,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4100,7 +4100,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4116,7 +4116,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4135,7 +4135,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4151,7 +4151,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4167,7 +4167,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4186,7 +4186,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4202,7 +4202,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4218,7 +4218,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4244,7 +4244,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4260,7 +4260,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4276,7 +4276,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4302,7 +4302,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4318,7 +4318,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4334,7 +4334,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4354,7 +4354,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4371,7 +4371,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4388,7 +4388,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4414,7 +4414,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4430,7 +4430,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4446,7 +4446,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4472,7 +4472,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4488,7 +4488,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4504,7 +4504,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4530,7 +4530,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4546,7 +4546,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4562,7 +4562,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4575,35 +4575,35 @@ cont { element { scale: 13 area { - color: 16772829 + color: 15786204 priority: -16049 } } element { scale: 14 area { - color: 16772829 + color: 15786204 priority: -16050 } } element { scale: 15 area { - color: 16772829 + color: 15786204 priority: -16051 } } element { scale: 16 area { - color: 16772829 + color: 15786204 priority: -16052 } } element { scale: 17 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -4613,7 +4613,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4623,7 +4623,7 @@ cont { element { scale: 18 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -4633,7 +4633,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4643,7 +4643,7 @@ cont { element { scale: 19 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -4653,7 +4653,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4693,7 +4693,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4709,7 +4709,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4725,7 +4725,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4751,7 +4751,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4767,7 +4767,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4783,7 +4783,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4809,7 +4809,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4825,7 +4825,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4841,7 +4841,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4869,7 +4869,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4886,7 +4886,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4903,7 +4903,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4929,7 +4929,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4945,7 +4945,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4961,7 +4961,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4980,7 +4980,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -4996,7 +4996,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5012,7 +5012,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5027,7 +5027,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -5038,7 +5038,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5050,7 +5050,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5062,7 +5062,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5075,35 +5075,35 @@ cont { element { scale: 13 area { - color: 16772829 + color: 15786204 priority: -16053 } } element { scale: 14 area { - color: 16772829 + color: 15786204 priority: -16054 } } element { scale: 15 area { - color: 16772829 + color: 15786204 priority: -16055 } } element { scale: 16 area { - color: 16772829 + color: 15786204 priority: -16056 } } element { scale: 17 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -5113,7 +5113,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5123,7 +5123,7 @@ cont { element { scale: 18 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -5133,7 +5133,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5143,7 +5143,7 @@ cont { element { scale: 19 area { - color: 16772829 + color: 15786204 priority: -15997 } symbol { @@ -5153,7 +5153,85 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } +} +cont { + name: "amenity-vending_machine-parking_tickets" + element { + scale: 17 + caption { + primary { + height: 11 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } + element { + scale: 18 + caption { + primary { + height: 11 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } + element { + scale: 19 + caption { + primary { + height: 11 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } +} +cont { + name: "amenity-vending_machine-public_transport_tickets" + element { + scale: 17 + caption { + primary { + height: 11 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } + element { + scale: 18 + caption { + primary { + height: 11 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } + element { + scale: 19 + caption { + primary { + height: 11 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5173,7 +5251,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5190,7 +5268,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5207,7 +5285,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -5220,13 +5298,13 @@ cont { element { scale: 15 area { - color: 14535867 + color: 13683900 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5234,13 +5312,13 @@ cont { element { scale: 16 area { - color: 14535867 + color: 13683900 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5248,13 +5326,13 @@ cont { element { scale: 17 area { - color: 14535867 + color: 13683900 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5262,13 +5340,13 @@ cont { element { scale: 18 area { - color: 14535867 + color: 13683900 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5276,13 +5354,13 @@ cont { element { scale: 19 area { - color: 14535867 + color: 13683900 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5293,35 +5371,35 @@ cont { element { scale: 15 area { - color: 14535867 + color: 13683900 priority: 1383 } } element { scale: 16 area { - color: 14535867 + color: 13683900 priority: 1383 } } element { scale: 17 area { - color: 14535867 + color: 13683900 priority: 1383 } } element { scale: 18 area { - color: 14535867 + color: 13683900 priority: 1383 } } element { scale: 19 area { - color: 14535867 + color: 13683900 priority: 1383 } } @@ -5331,13 +5409,13 @@ cont { element { scale: 15 area { - color: 12303257 + color: 12171925 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5345,13 +5423,13 @@ cont { element { scale: 16 area { - color: 12303257 + color: 12171925 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5359,13 +5437,13 @@ cont { element { scale: 17 area { - color: 12303257 + color: 12171925 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5373,13 +5451,13 @@ cont { element { scale: 18 area { - color: 12303257 + color: 12171925 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5387,13 +5465,13 @@ cont { element { scale: 19 area { - color: 12303257 + color: 12171925 priority: 1383 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15382 } @@ -5404,35 +5482,35 @@ cont { element { scale: 15 area { - color: 14535867 + color: 13683900 priority: 1383 } } element { scale: 16 area { - color: 14535867 + color: 13683900 priority: 1383 } } element { scale: 17 area { - color: 14535867 + color: 13683900 priority: 1383 } } element { scale: 18 area { - color: 14535867 + color: 13683900 priority: 1383 } } element { scale: 19 area { - color: 14535867 + color: 13683900 priority: 1383 } } @@ -5443,7 +5521,7 @@ cont { scale: 16 circle { radius: 1.2 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5451,7 +5529,7 @@ cont { scale: 17 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5459,7 +5537,7 @@ cont { scale: 18 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5467,7 +5545,7 @@ cont { scale: 19 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5478,7 +5556,7 @@ cont { scale: 16 circle { radius: 1.2 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5486,7 +5564,7 @@ cont { scale: 17 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5494,7 +5572,7 @@ cont { scale: 18 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5502,7 +5580,7 @@ cont { scale: 19 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5544,7 +5622,7 @@ cont { scale: 16 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5554,7 +5632,7 @@ cont { scale: 17 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5564,7 +5642,7 @@ cont { scale: 18 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5574,7 +5652,7 @@ cont { scale: 19 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5611,7 +5689,7 @@ cont { scale: 16 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5621,7 +5699,7 @@ cont { scale: 17 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5631,7 +5709,7 @@ cont { scale: 18 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5641,7 +5719,7 @@ cont { scale: 19 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5678,7 +5756,7 @@ cont { scale: 16 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5688,7 +5766,7 @@ cont { scale: 17 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5698,7 +5776,7 @@ cont { scale: 18 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5708,7 +5786,7 @@ cont { scale: 19 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5752,7 +5830,7 @@ cont { scale: 16 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5762,7 +5840,7 @@ cont { scale: 17 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5772,7 +5850,7 @@ cont { scale: 18 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5782,7 +5860,7 @@ cont { scale: 19 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5795,7 +5873,7 @@ cont { scale: 16 circle { radius: 1.2 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5803,7 +5881,7 @@ cont { scale: 17 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5811,7 +5889,7 @@ cont { scale: 18 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5819,7 +5897,7 @@ cont { scale: 19 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5830,7 +5908,7 @@ cont { scale: 16 circle { radius: 1.2 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5838,7 +5916,7 @@ cont { scale: 17 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5846,7 +5924,7 @@ cont { scale: 18 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5854,7 +5932,7 @@ cont { scale: 19 circle { radius: 1.6 - color: 7829367 + color: 7368816 priority: 14000 } } @@ -5865,7 +5943,7 @@ cont { scale: 16 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5875,7 +5953,7 @@ cont { scale: 17 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5885,7 +5963,7 @@ cont { scale: 18 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5895,7 +5973,7 @@ cont { scale: 19 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -5908,7 +5986,7 @@ cont { scale: 15 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -5922,7 +6000,7 @@ cont { scale: 16 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -5936,7 +6014,7 @@ cont { scale: 17 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -5950,7 +6028,7 @@ cont { scale: 18 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -5964,7 +6042,7 @@ cont { scale: 19 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -5981,7 +6059,7 @@ cont { scale: 17 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 1.0 dd: 5.2 @@ -5995,7 +6073,7 @@ cont { scale: 18 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 1.0 dd: 5.2 @@ -6009,7 +6087,7 @@ cont { scale: 19 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 1.0 dd: 5.2 @@ -6026,7 +6104,7 @@ cont { scale: 1 lines { width: 0.5 - color: 13421772 + color: 13487565 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6036,7 +6114,7 @@ cont { scale: 2 lines { width: 0.5 - color: 13421772 + color: 13487565 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6046,7 +6124,7 @@ cont { scale: 3 lines { width: 0.5 - color: 13421772 + color: 13487565 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6056,7 +6134,7 @@ cont { scale: 4 lines { width: 1.0 - color: 13421772 + color: 13487565 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6066,7 +6144,7 @@ cont { scale: 5 lines { width: 1.0 - color: 12303291 + color: 12434877 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6076,7 +6154,7 @@ cont { scale: 6 lines { width: 1.0 - color: 10066329 + color: 9474192 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6086,7 +6164,7 @@ cont { scale: 7 lines { width: 1.5 - color: 10066329 + color: 9474192 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6096,7 +6174,7 @@ cont { scale: 8 lines { width: 2.0 - color: 8947848 + color: 8421504 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6106,7 +6184,7 @@ cont { scale: 9 lines { width: 2.0 - color: 7829367 + color: 7368816 priority: 1382 join: ROUNDJOIN cap: ROUNDCAP @@ -6123,7 +6201,7 @@ cont { } lines { width: 2.34 - color: 16733508 + color: 16340811 dashdot { dd: 3.12 dd: 3.12 @@ -6144,7 +6222,7 @@ cont { } lines { width: 2.34 - color: 16733508 + color: 16340811 dashdot { dd: 3.12 dd: 3.12 @@ -6165,7 +6243,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6186,7 +6264,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6207,7 +6285,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6228,7 +6306,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6249,7 +6327,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6270,7 +6348,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6291,7 +6369,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6312,7 +6390,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6329,7 +6407,7 @@ cont { scale: 4 lines { width: 0.75 - color: 13421772 + color: 13487565 dashdot { dd: 2.0 dd: 2.0 @@ -6343,7 +6421,7 @@ cont { scale: 5 lines { width: 0.75 - color: 13421772 + color: 13487565 dashdot { dd: 2.0 dd: 2.0 @@ -6357,7 +6435,7 @@ cont { scale: 6 lines { width: 0.75 - color: 12303291 + color: 12434877 dashdot { dd: 2.0 dd: 2.0 @@ -6374,7 +6452,7 @@ cont { scale: 4 lines { width: 0.75 - color: 13421772 + color: 13487565 dashdot { dd: 2.0 dd: 2.0 @@ -6388,7 +6466,7 @@ cont { scale: 5 lines { width: 0.75 - color: 13421772 + color: 13487565 dashdot { dd: 2.0 dd: 2.0 @@ -6402,7 +6480,7 @@ cont { scale: 6 lines { width: 0.75 - color: 12303291 + color: 12434877 dashdot { dd: 2.0 dd: 2.0 @@ -6416,7 +6494,7 @@ cont { scale: 10 lines { width: 1.5 - color: 10066329 + color: 9474192 dashdot { dd: 1.0 dd: 1.0 @@ -6437,7 +6515,7 @@ cont { scale: 11 lines { width: 1.5 - color: 10066329 + color: 9474192 dashdot { dd: 1.0 dd: 1.0 @@ -6461,7 +6539,7 @@ cont { scale: 4 lines { width: 0.75 - color: 13421772 + color: 13487565 dashdot { dd: 2.0 dd: 2.0 @@ -6475,7 +6553,7 @@ cont { scale: 5 lines { width: 0.75 - color: 13421772 + color: 13487565 dashdot { dd: 2.0 dd: 2.0 @@ -6489,7 +6567,7 @@ cont { scale: 6 lines { width: 0.75 - color: 12303291 + color: 12434877 dashdot { dd: 2.0 dd: 2.0 @@ -6503,7 +6581,7 @@ cont { scale: 10 lines { width: 1.5 - color: 10066329 + color: 9474192 dashdot { dd: 1.0 dd: 1.0 @@ -6514,7 +6592,7 @@ cont { } lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 5.0 dd: 1.0 @@ -6530,7 +6608,7 @@ cont { scale: 11 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 10.0 dd: 2.0 @@ -6553,7 +6631,7 @@ cont { scale: 12 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6569,7 +6647,7 @@ cont { scale: 13 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6585,7 +6663,7 @@ cont { scale: 14 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6601,7 +6679,7 @@ cont { scale: 15 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6617,7 +6695,7 @@ cont { scale: 16 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6633,7 +6711,7 @@ cont { scale: 17 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6649,7 +6727,7 @@ cont { scale: 18 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6665,7 +6743,7 @@ cont { scale: 19 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6684,7 +6762,7 @@ cont { scale: 14 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6698,7 +6776,7 @@ cont { scale: 15 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6712,7 +6790,7 @@ cont { scale: 16 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6726,7 +6804,7 @@ cont { scale: 17 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6740,7 +6818,7 @@ cont { scale: 18 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6754,7 +6832,7 @@ cont { scale: 19 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -6771,7 +6849,7 @@ cont { scale: 14 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -6785,7 +6863,7 @@ cont { scale: 15 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -6799,7 +6877,7 @@ cont { scale: 16 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -6813,7 +6891,7 @@ cont { scale: 17 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -6827,7 +6905,7 @@ cont { scale: 18 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -6841,7 +6919,7 @@ cont { scale: 19 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -6858,7 +6936,7 @@ cont { scale: 15 lines { width: 1.0 - color: 16733508 + color: 16340811 priority: 16713 join: ROUNDJOIN cap: ROUNDCAP @@ -6868,7 +6946,7 @@ cont { scale: 16 lines { width: 1.0 - color: 16733508 + color: 16340811 priority: 16875 join: ROUNDJOIN cap: ROUNDCAP @@ -6878,7 +6956,7 @@ cont { scale: 17 lines { width: 0.8 - color: 16733508 + color: 16340811 priority: 16942 join: ROUNDJOIN cap: ROUNDCAP @@ -6888,7 +6966,7 @@ cont { scale: 18 lines { width: 0.8 - color: 16733508 + color: 16340811 priority: 16942 join: ROUNDJOIN cap: ROUNDCAP @@ -6898,7 +6976,7 @@ cont { scale: 19 lines { width: 0.8 - color: 16733508 + color: 16340811 priority: 16942 join: ROUNDJOIN cap: ROUNDCAP @@ -6911,7 +6989,7 @@ cont { scale: 15 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6927,7 +7005,7 @@ cont { scale: 16 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6943,7 +7021,7 @@ cont { scale: 17 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6959,7 +7037,7 @@ cont { scale: 18 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6975,7 +7053,7 @@ cont { scale: 19 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -6994,7 +7072,7 @@ cont { scale: 15 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7008,7 +7086,7 @@ cont { scale: 16 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7022,7 +7100,7 @@ cont { scale: 17 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7036,7 +7114,7 @@ cont { scale: 18 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7050,7 +7128,7 @@ cont { scale: 19 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7067,7 +7145,7 @@ cont { scale: 15 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7083,7 +7161,7 @@ cont { scale: 16 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7099,7 +7177,7 @@ cont { scale: 17 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7115,7 +7193,7 @@ cont { scale: 18 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7131,7 +7209,7 @@ cont { scale: 19 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7157,7 +7235,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7178,7 +7256,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7199,7 +7277,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7220,7 +7298,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7241,7 +7319,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7262,7 +7340,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7283,7 +7361,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7304,7 +7382,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7321,7 +7399,7 @@ cont { scale: 14 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -7335,7 +7413,7 @@ cont { scale: 15 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -7349,7 +7427,7 @@ cont { scale: 16 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -7363,7 +7441,7 @@ cont { scale: 17 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -7377,7 +7455,7 @@ cont { scale: 18 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -7391,7 +7469,7 @@ cont { scale: 19 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -7408,7 +7486,7 @@ cont { scale: 15 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7424,7 +7502,7 @@ cont { scale: 16 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7440,7 +7518,7 @@ cont { scale: 17 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7456,7 +7534,7 @@ cont { scale: 18 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7472,7 +7550,7 @@ cont { scale: 19 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7498,7 +7576,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7519,7 +7597,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7540,7 +7618,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7561,7 +7639,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7582,7 +7660,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7603,7 +7681,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7624,7 +7702,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7645,7 +7723,7 @@ cont { } lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 12.0 @@ -7662,7 +7740,7 @@ cont { scale: 12 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7678,7 +7756,7 @@ cont { scale: 13 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7694,7 +7772,7 @@ cont { scale: 14 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7710,7 +7788,7 @@ cont { scale: 15 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7726,7 +7804,7 @@ cont { scale: 16 lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7742,7 +7820,7 @@ cont { scale: 17 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7758,7 +7836,7 @@ cont { scale: 18 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7774,7 +7852,7 @@ cont { scale: 19 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7800,7 +7878,7 @@ cont { } lines { width: 1.0 - color: 16733508 + color: 16340811 dashdot { dd: 5.0 dd: 1.0 @@ -7816,7 +7894,7 @@ cont { scale: 11 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 10.0 dd: 2.0 @@ -7832,7 +7910,7 @@ cont { scale: 12 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7848,7 +7926,7 @@ cont { scale: 13 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7864,7 +7942,7 @@ cont { scale: 14 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7880,7 +7958,7 @@ cont { scale: 15 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7896,7 +7974,7 @@ cont { scale: 16 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7912,7 +7990,7 @@ cont { scale: 17 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7928,7 +8006,7 @@ cont { scale: 18 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7944,7 +8022,7 @@ cont { scale: 19 lines { width: 2.0 - color: 16733508 + color: 16340811 dashdot { dd: 12.0 dd: 4.0 @@ -7963,7 +8041,7 @@ cont { scale: 15 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -7977,7 +8055,7 @@ cont { scale: 16 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -7991,7 +8069,7 @@ cont { scale: 17 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -8005,7 +8083,7 @@ cont { scale: 18 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -8019,7 +8097,7 @@ cont { scale: 19 lines { width: 0.8 - color: 16733508 + color: 16340811 dashdot { dd: 4.0 dd: 20.0 @@ -8036,7 +8114,7 @@ cont { scale: 10 lines { width: 1.0 - color: 4521796 + color: 5175627 dashdot { dd: 5.0 dd: 1.0 @@ -8052,7 +8130,7 @@ cont { scale: 11 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 10.0 dd: 2.0 @@ -8068,7 +8146,7 @@ cont { scale: 12 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 12.0 dd: 4.0 @@ -8084,7 +8162,7 @@ cont { scale: 13 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 12.0 dd: 4.0 @@ -8100,7 +8178,7 @@ cont { scale: 14 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 12.0 dd: 4.0 @@ -8116,7 +8194,7 @@ cont { scale: 15 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 12.0 dd: 4.0 @@ -8132,7 +8210,7 @@ cont { scale: 16 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 12.0 dd: 4.0 @@ -8148,7 +8226,7 @@ cont { scale: 17 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 12.0 dd: 4.0 @@ -8164,7 +8242,7 @@ cont { scale: 18 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 12.0 dd: 4.0 @@ -8180,7 +8258,7 @@ cont { scale: 19 lines { width: 2.0 - color: 4521796 + color: 5175627 dashdot { dd: 12.0 dd: 4.0 @@ -8198,24 +8276,24 @@ cont { element { scale: 15 area { - color: 13421755 + color: 13487540 priority: 1001 } } element { scale: 16 area { - color: 13421755 + color: 13487540 priority: 1001 } caption { primary { height: 10 - color: 8947831 + color: 8421488 } secondary { height: 11 - color: 8947831 + color: 8421488 offset_y: 20 text: "int_name" } @@ -8225,17 +8303,17 @@ cont { element { scale: 17 area { - color: 13421755 + color: 13487540 priority: 1001 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } secondary { height: 11 - color: 4473924 + color: 4210752 offset_y: 20 text: "int_name" } @@ -8245,17 +8323,17 @@ cont { element { scale: 18 area { - color: 13421755 + color: 13487540 priority: 1001 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } secondary { height: 11 - color: 4473924 + color: 4210752 offset_y: 20 text: "int_name" } @@ -8265,17 +8343,17 @@ cont { element { scale: 19 area { - color: 13421755 + color: 13487540 priority: 1001 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } secondary { height: 11 - color: 4473924 + color: 4210752 offset_y: 20 text: "int_name" } @@ -8290,7 +8368,7 @@ cont { caption { primary { height: 10 - color: 8947831 + color: 8421488 } priority: 15000 } @@ -8300,7 +8378,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -8310,7 +8388,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -8320,7 +8398,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -8353,7 +8431,7 @@ cont { } lines { width: 0.8 - color: 16746751 + color: 15761648 dashdot { dd: 8.0 dd: 4.0 @@ -8374,7 +8452,7 @@ cont { } lines { width: 0.8 - color: 16746751 + color: 15761648 dashdot { dd: 8.0 dd: 4.0 @@ -8395,7 +8473,7 @@ cont { } lines { width: 0.8 - color: 16746751 + color: 15761648 dashdot { dd: 8.0 dd: 4.0 @@ -8430,7 +8508,7 @@ cont { scale: 17 lines { width: 0.8 - color: 2164230399 + color: 2163245296 dashdot { dd: 1.2 dd: 2.0 @@ -8445,7 +8523,7 @@ cont { } lines { width: 0.8 - color: 16746751 + color: 15761648 dashdot { dd: 8.0 dd: 4.0 @@ -8459,7 +8537,7 @@ cont { scale: 18 lines { width: 0.8 - color: 2164230399 + color: 2163245296 dashdot { dd: 1.2 dd: 2.0 @@ -8474,7 +8552,7 @@ cont { } lines { width: 0.8 - color: 16746751 + color: 15761648 dashdot { dd: 8.0 dd: 4.0 @@ -8488,7 +8566,7 @@ cont { scale: 19 lines { width: 0.8 - color: 2164230399 + color: 2163245296 dashdot { dd: 1.2 dd: 2.0 @@ -8503,7 +8581,7 @@ cont { } lines { width: 0.8 - color: 16746751 + color: 15761648 dashdot { dd: 8.0 dd: 4.0 @@ -8521,7 +8599,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8533,7 +8611,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8545,7 +8623,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8560,7 +8638,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8572,7 +8650,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8584,7 +8662,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8599,7 +8677,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8611,7 +8689,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8623,7 +8701,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8638,7 +8716,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8650,7 +8728,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8662,7 +8740,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8677,7 +8755,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8689,7 +8767,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8701,7 +8779,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8716,7 +8794,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8728,7 +8806,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8740,7 +8818,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8755,7 +8833,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8767,7 +8845,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8779,7 +8857,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8794,7 +8872,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8806,7 +8884,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8818,7 +8896,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8833,7 +8911,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8845,7 +8923,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8857,7 +8935,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8872,7 +8950,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8884,7 +8962,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8896,7 +8974,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8911,7 +8989,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8923,7 +9001,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -8935,7 +9013,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -9003,7 +9081,7 @@ cont { } circle { radius: 2.0 - color: 2236962 + color: 2105376 priority: 14018 } } @@ -9020,7 +9098,7 @@ cont { } circle { radius: 2.0 - color: 2236962 + color: 2105376 priority: 14018 } } @@ -9043,7 +9121,7 @@ cont { } circle { radius: 2.0 - color: 2236962 + color: 2105376 priority: 14018 } } @@ -9054,14 +9132,14 @@ cont { scale: 13 lines { width: 2.5 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.9 - color: 11197781 + color: 11129685 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9071,14 +9149,14 @@ cont { scale: 14 lines { width: 3.2 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.6 - color: 8960836 + color: 9420621 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9088,14 +9166,14 @@ cont { scale: 15 lines { width: 4.8 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.2 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9103,7 +9181,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9112,14 +9190,14 @@ cont { scale: 16 lines { width: 8.0 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9127,7 +9205,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9136,14 +9214,14 @@ cont { scale: 17 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9151,7 +9229,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9160,14 +9238,14 @@ cont { scale: 18 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9175,7 +9253,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9184,14 +9262,14 @@ cont { scale: 19 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9199,7 +9277,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9211,14 +9289,14 @@ cont { scale: 13 lines { width: 2.5 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.9 - color: 11197781 + color: 11129685 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9228,14 +9306,14 @@ cont { scale: 14 lines { width: 3.2 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.6 - color: 8960836 + color: 9420621 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9245,14 +9323,14 @@ cont { scale: 15 lines { width: 4.8 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.2 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9266,7 +9344,7 @@ cont { } lines { width: 13.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -9274,7 +9352,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9283,14 +9361,14 @@ cont { scale: 16 lines { width: 8.0 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9304,7 +9382,7 @@ cont { } lines { width: 16.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -9312,7 +9390,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9321,14 +9399,14 @@ cont { scale: 17 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9342,7 +9420,7 @@ cont { } lines { width: 16.8 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -9350,7 +9428,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9359,14 +9437,14 @@ cont { scale: 18 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9380,7 +9458,7 @@ cont { } lines { width: 16.8 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -9388,7 +9466,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9397,14 +9475,14 @@ cont { scale: 19 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9418,7 +9496,7 @@ cont { } lines { width: 16.8 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -9426,7 +9504,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9438,14 +9516,14 @@ cont { scale: 13 lines { width: 2.5 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.9 - color: 11197781 + color: 11129685 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9455,14 +9533,14 @@ cont { scale: 14 lines { width: 3.2 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.6 - color: 8960836 + color: 9420621 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9472,14 +9550,14 @@ cont { scale: 15 lines { width: 4.8 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.2 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9487,7 +9565,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9496,14 +9574,14 @@ cont { scale: 16 lines { width: 8.0 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9511,7 +9589,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9520,14 +9598,14 @@ cont { scale: 17 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9535,7 +9613,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9544,14 +9622,14 @@ cont { scale: 18 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9559,7 +9637,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9568,14 +9646,14 @@ cont { scale: 19 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9583,7 +9661,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9595,14 +9673,14 @@ cont { scale: 13 lines { width: 2.5 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.9 - color: 11197781 + color: 11129685 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9612,14 +9690,14 @@ cont { scale: 14 lines { width: 3.2 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.6 - color: 8960836 + color: 9420621 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9629,14 +9707,14 @@ cont { scale: 15 lines { width: 4.8 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.2 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9650,7 +9728,7 @@ cont { } lines { width: 13.2 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -9662,7 +9740,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9671,14 +9749,14 @@ cont { scale: 16 lines { width: 8.0 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9692,7 +9770,7 @@ cont { } lines { width: 16.4 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -9704,7 +9782,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9713,14 +9791,14 @@ cont { scale: 17 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9734,7 +9812,7 @@ cont { } lines { width: 16.8 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -9746,7 +9824,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9755,14 +9833,14 @@ cont { scale: 18 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9776,7 +9854,7 @@ cont { } lines { width: 16.8 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -9788,7 +9866,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9797,14 +9875,14 @@ cont { scale: 19 lines { width: 8.4 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 14535833 + color: 13880216 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -9818,7 +9896,7 @@ cont { } lines { width: 16.8 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -9830,7 +9908,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -9847,13 +9925,13 @@ cont { caption { primary { height: 10 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 9 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -9870,13 +9948,13 @@ cont { caption { primary { height: 11 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -9893,13 +9971,13 @@ cont { caption { primary { height: 11 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -9916,13 +9994,13 @@ cont { caption { primary { height: 11 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -9937,7 +10015,7 @@ cont { scale: 13 lines { width: 2.75 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -9951,7 +10029,7 @@ cont { scale: 14 lines { width: 3.5 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -9965,7 +10043,7 @@ cont { scale: 15 lines { width: 7.0 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -9979,7 +10057,7 @@ cont { scale: 16 lines { width: 9.0 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -9993,7 +10071,7 @@ cont { scale: 17 lines { width: 10.0 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -10007,7 +10085,7 @@ cont { scale: 18 lines { width: 10.0 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -10021,7 +10099,7 @@ cont { scale: 19 lines { width: 10.0 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -10038,7 +10116,7 @@ cont { scale: 14 lines { width: 1.0 - color: 4504388 + color: 5095245 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10048,7 +10126,7 @@ cont { scale: 15 lines { width: 1.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10056,7 +10134,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10065,7 +10143,7 @@ cont { scale: 16 lines { width: 2.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10073,7 +10151,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10082,7 +10160,7 @@ cont { scale: 17 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10090,7 +10168,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10099,7 +10177,7 @@ cont { scale: 18 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10107,7 +10185,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10116,7 +10194,7 @@ cont { scale: 19 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10124,7 +10202,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10136,7 +10214,7 @@ cont { scale: 14 lines { width: 1.0 - color: 4504388 + color: 5095245 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10146,7 +10224,7 @@ cont { scale: 15 lines { width: 1.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10160,7 +10238,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -10168,7 +10246,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10177,7 +10255,7 @@ cont { scale: 16 lines { width: 2.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10191,7 +10269,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -10199,7 +10277,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10208,7 +10286,7 @@ cont { scale: 17 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10222,7 +10300,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -10230,7 +10308,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10239,7 +10317,7 @@ cont { scale: 18 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10253,7 +10331,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -10261,7 +10339,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10270,7 +10348,7 @@ cont { scale: 19 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10284,7 +10362,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -10292,7 +10370,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10304,7 +10382,7 @@ cont { scale: 14 lines { width: 1.0 - color: 4504388 + color: 5095245 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10314,7 +10392,7 @@ cont { scale: 15 lines { width: 1.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10322,7 +10400,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10331,7 +10409,7 @@ cont { scale: 16 lines { width: 2.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10339,7 +10417,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10348,7 +10426,7 @@ cont { scale: 17 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10356,7 +10434,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10365,7 +10443,7 @@ cont { scale: 18 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10373,7 +10451,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10382,7 +10460,7 @@ cont { scale: 19 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10390,7 +10468,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10402,7 +10480,7 @@ cont { scale: 14 lines { width: 1.0 - color: 4504388 + color: 5095245 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10412,7 +10490,7 @@ cont { scale: 15 lines { width: 1.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10426,7 +10504,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -10438,7 +10516,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10447,7 +10525,7 @@ cont { scale: 16 lines { width: 2.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10461,7 +10539,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -10473,7 +10551,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10482,7 +10560,7 @@ cont { scale: 17 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10496,7 +10574,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -10508,7 +10586,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10517,7 +10595,7 @@ cont { scale: 18 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10531,7 +10609,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -10543,7 +10621,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10552,7 +10630,7 @@ cont { scale: 19 lines { width: 3.0 - color: 10075033 + color: 9485456 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -10566,7 +10644,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -10578,7 +10656,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -10590,7 +10668,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10604,7 +10682,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10618,7 +10696,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10630,7 +10708,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10639,7 +10717,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -10647,7 +10725,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10656,14 +10734,14 @@ cont { scale: 17 lines { width: 5.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -10675,7 +10753,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10684,14 +10762,14 @@ cont { scale: 18 lines { width: 9.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -10703,7 +10781,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10712,14 +10790,14 @@ cont { scale: 19 lines { width: 17.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 16.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 4.0 @@ -10731,7 +10809,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10743,7 +10821,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10757,7 +10835,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10771,7 +10849,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10783,7 +10861,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10800,7 +10878,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10817,7 +10895,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10834,7 +10912,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10851,7 +10929,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -10862,27 +10940,27 @@ cont { element { scale: 13 area { - color: 14535867 + color: 13683900 priority: 1034 } } element { scale: 14 area { - color: 14535867 + color: 13683900 priority: 1034 } } element { scale: 15 area { - color: 14535867 + color: 13683900 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -10890,13 +10968,13 @@ cont { element { scale: 16 area { - color: 14535867 + color: 13683900 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -10904,13 +10982,13 @@ cont { element { scale: 17 area { - color: 16777198 + color: 16314600 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -10918,13 +10996,13 @@ cont { element { scale: 18 area { - color: 16777198 + color: 16314600 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -10932,13 +11010,13 @@ cont { element { scale: 19 area { - color: 16777198 + color: 16314600 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -10950,7 +11028,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10964,7 +11042,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10978,7 +11056,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -10996,7 +11074,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -11004,7 +11082,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11013,7 +11091,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -11027,7 +11105,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -11035,7 +11113,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11044,7 +11122,7 @@ cont { scale: 17 lines { width: 5.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -11058,7 +11136,7 @@ cont { } lines { width: 4.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -11069,7 +11147,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -11077,7 +11155,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11086,7 +11164,7 @@ cont { scale: 18 lines { width: 9.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -11100,7 +11178,7 @@ cont { } lines { width: 8.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -11111,7 +11189,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -11119,7 +11197,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11128,7 +11206,7 @@ cont { scale: 19 lines { width: 17.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -11142,7 +11220,7 @@ cont { } lines { width: 16.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 4.0 @@ -11153,7 +11231,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -11161,7 +11239,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11173,7 +11251,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11187,7 +11265,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11201,7 +11279,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11213,7 +11291,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11234,7 +11312,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11255,7 +11333,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11276,7 +11354,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11297,7 +11375,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11309,7 +11387,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11323,7 +11401,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11337,7 +11415,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11349,7 +11427,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11358,7 +11436,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 2.4 @@ -11370,7 +11448,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11391,7 +11469,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11412,7 +11490,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11433,7 +11511,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11445,7 +11523,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11459,7 +11537,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11473,7 +11551,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11485,7 +11563,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11494,7 +11572,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 2.4 @@ -11506,7 +11584,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11527,7 +11605,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11548,7 +11626,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11569,7 +11647,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11581,7 +11659,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11595,7 +11673,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11609,7 +11687,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11621,7 +11699,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11630,7 +11708,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -11638,7 +11716,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11655,7 +11733,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11672,7 +11750,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11689,7 +11767,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11701,7 +11779,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11715,7 +11793,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11729,7 +11807,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11741,7 +11819,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11750,7 +11828,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 dashdot { dd: 2.0 dd: 2.0 @@ -11762,7 +11840,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11783,7 +11861,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11804,7 +11882,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11825,7 +11903,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11837,7 +11915,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11851,7 +11929,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11865,7 +11943,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -11877,7 +11955,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11886,7 +11964,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -11894,7 +11972,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11903,14 +11981,14 @@ cont { scale: 17 lines { width: 5.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -11922,7 +12000,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11931,14 +12009,14 @@ cont { scale: 18 lines { width: 9.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -11950,7 +12028,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11959,14 +12037,14 @@ cont { scale: 19 lines { width: 17.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 16.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 4.0 @@ -11978,7 +12056,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -11990,7 +12068,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -12004,7 +12082,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -12018,7 +12096,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -12030,7 +12108,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12039,7 +12117,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -12047,7 +12125,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12056,14 +12134,14 @@ cont { scale: 17 lines { width: 5.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -12075,7 +12153,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12084,14 +12162,14 @@ cont { scale: 18 lines { width: 9.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -12103,7 +12181,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12112,14 +12190,14 @@ cont { scale: 19 lines { width: 17.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 16.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 4.0 @@ -12131,7 +12209,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12143,7 +12221,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -12157,7 +12235,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -12171,7 +12249,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14535867 + color: 13683900 dashdot { dd: 4.0 dd: 4.0 @@ -12189,7 +12267,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -12201,7 +12279,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12210,7 +12288,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -12224,7 +12302,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -12236,7 +12314,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12252,14 +12330,14 @@ cont { } lines { width: 5.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -12270,7 +12348,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -12282,7 +12360,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12298,14 +12376,14 @@ cont { } lines { width: 9.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 3.0 @@ -12316,7 +12394,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -12328,7 +12406,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12344,14 +12422,14 @@ cont { } lines { width: 17.0 - color: 14535867 + color: 13683900 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 16.0 - color: 14535867 + color: 13683900 dashdot { dd: 1.0 dd: 4.0 @@ -12362,7 +12440,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -12374,7 +12452,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -12386,14 +12464,14 @@ cont { scale: 13 lines { width: 4.35 - color: 2236962 + color: 2105376 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.75 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -12403,14 +12481,14 @@ cont { scale: 14 lines { width: 5.1 - color: 1118481 + color: 1052688 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.5 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -12420,14 +12498,14 @@ cont { scale: 15 lines { width: 8.6 - color: 7829367 + color: 7368816 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -12437,14 +12515,14 @@ cont { scale: 16 lines { width: 10.6 - color: 7829367 + color: 7368816 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -12454,14 +12532,14 @@ cont { scale: 17 lines { width: 11.6 - color: 7829367 + color: 7368816 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -12471,14 +12549,14 @@ cont { scale: 18 lines { width: 11.6 - color: 7829367 + color: 7368816 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -12488,14 +12566,14 @@ cont { scale: 19 lines { width: 11.6 - color: 7829367 + color: 7368816 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -12508,7 +12586,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12525,7 +12603,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12542,7 +12620,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12557,7 +12635,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 stroke_color: 16777215 } priority: 16033 @@ -12567,7 +12645,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12582,7 +12660,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -12591,7 +12669,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12606,7 +12684,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -12615,7 +12693,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12630,7 +12708,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -12639,7 +12717,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12654,7 +12732,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -12666,7 +12744,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12683,7 +12761,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12700,7 +12778,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12721,7 +12799,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -12729,7 +12807,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 stroke_color: 16777215 } priority: 16033 @@ -12739,7 +12817,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12760,7 +12838,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -12768,7 +12846,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -12777,7 +12855,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12798,7 +12876,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -12806,7 +12884,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -12815,7 +12893,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12836,7 +12914,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -12844,7 +12922,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -12853,7 +12931,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12874,7 +12952,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -12882,7 +12960,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -12894,7 +12972,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12911,7 +12989,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12928,7 +13006,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12949,7 +13027,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -12961,7 +13039,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 stroke_color: 16777215 } priority: 16033 @@ -12971,7 +13049,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -12992,7 +13070,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -13004,7 +13082,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -13013,7 +13091,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -13034,7 +13112,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -13046,7 +13124,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -13055,7 +13133,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -13076,7 +13154,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -13088,7 +13166,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -13097,7 +13175,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1032 join: ROUNDJOIN cap: BUTTCAP @@ -13118,7 +13196,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -13130,7 +13208,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -13142,7 +13220,7 @@ cont { scale: 7 lines { width: 1.0 - color: 15645542 + color: 15711086 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13152,14 +13230,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 15636770 + color: 15701793 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13169,14 +13247,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13186,14 +13264,14 @@ cont { scale: 10 lines { width: 5.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13201,8 +13279,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } @@ -13211,14 +13289,14 @@ cont { scale: 11 lines { width: 5.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13226,8 +13304,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } @@ -13236,14 +13314,14 @@ cont { scale: 12 lines { width: 7.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13251,14 +13329,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13267,14 +13345,14 @@ cont { scale: 13 lines { width: 9.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13282,14 +13360,14 @@ cont { path_text { primary { height: 16 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13298,14 +13376,14 @@ cont { scale: 14 lines { width: 13.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13313,14 +13391,14 @@ cont { path_text { primary { height: 16 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13329,14 +13407,14 @@ cont { scale: 15 lines { width: 17.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13344,14 +13422,14 @@ cont { path_text { primary { height: 17 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13360,14 +13438,14 @@ cont { scale: 16 lines { width: 17.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13375,14 +13453,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13391,14 +13469,14 @@ cont { scale: 17 lines { width: 18.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 17.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13406,14 +13484,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13422,14 +13500,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13437,14 +13515,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13453,14 +13531,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13468,14 +13546,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13487,7 +13565,7 @@ cont { scale: 7 lines { width: 1.0 - color: 15645542 + color: 15711086 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13497,14 +13575,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 15636770 + color: 15701793 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13514,14 +13592,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13531,14 +13609,14 @@ cont { scale: 10 lines { width: 5.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13546,8 +13624,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } @@ -13556,14 +13634,14 @@ cont { scale: 11 lines { width: 5.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13571,8 +13649,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } @@ -13581,14 +13659,14 @@ cont { scale: 12 lines { width: 7.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13596,14 +13674,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13612,14 +13690,14 @@ cont { scale: 13 lines { width: 9.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13627,14 +13705,14 @@ cont { path_text { primary { height: 16 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13643,14 +13721,14 @@ cont { scale: 14 lines { width: 13.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13658,14 +13736,14 @@ cont { path_text { primary { height: 16 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13674,14 +13752,14 @@ cont { scale: 15 lines { width: 17.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13695,7 +13773,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -13703,14 +13781,14 @@ cont { path_text { primary { height: 17 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13719,14 +13797,14 @@ cont { scale: 16 lines { width: 17.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13740,7 +13818,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -13748,14 +13826,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13764,14 +13842,14 @@ cont { scale: 17 lines { width: 18.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 17.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13785,7 +13863,7 @@ cont { } lines { width: 27.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -13793,14 +13871,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13809,14 +13887,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13830,7 +13908,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -13838,14 +13916,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13854,14 +13932,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13875,7 +13953,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -13883,14 +13961,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -13902,7 +13980,7 @@ cont { scale: 7 lines { width: 1.0 - color: 15645542 + color: 15711086 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13912,14 +13990,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 15636770 + color: 15701793 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13929,14 +14007,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13946,14 +14024,14 @@ cont { scale: 10 lines { width: 5.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13961,8 +14039,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } @@ -13971,14 +14049,14 @@ cont { scale: 11 lines { width: 5.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -13986,8 +14064,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } @@ -13996,14 +14074,14 @@ cont { scale: 12 lines { width: 7.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14011,14 +14089,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16746496 + color: 3158064 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -14027,14 +14105,14 @@ cont { scale: 13 lines { width: 9.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14042,14 +14120,14 @@ cont { path_text { primary { height: 16 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -14058,14 +14136,14 @@ cont { scale: 14 lines { width: 13.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14073,14 +14151,14 @@ cont { path_text { primary { height: 16 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -14089,14 +14167,14 @@ cont { scale: 15 lines { width: 17.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14110,7 +14188,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -14122,14 +14200,14 @@ cont { path_text { primary { height: 17 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -14138,14 +14216,14 @@ cont { scale: 16 lines { width: 17.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14159,7 +14237,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -14171,14 +14249,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -14187,14 +14265,14 @@ cont { scale: 17 lines { width: 18.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 17.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14208,7 +14286,7 @@ cont { } lines { width: 27.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -14220,14 +14298,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -14236,14 +14314,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14257,7 +14335,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -14269,14 +14347,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -14285,14 +14363,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12285696 + color: 12090372 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14306,7 +14384,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -14318,14 +14396,14 @@ cont { path_text { primary { height: 18 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16055 } @@ -14338,7 +14416,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -14349,7 +14427,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -14360,7 +14438,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -14371,7 +14449,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -14382,7 +14460,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -14393,7 +14471,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -14404,7 +14482,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -14417,14 +14495,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14434,14 +14512,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14451,14 +14529,14 @@ cont { scale: 14 lines { width: 5.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14466,8 +14544,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14476,14 +14554,14 @@ cont { scale: 15 lines { width: 9.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14491,8 +14569,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14501,14 +14579,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14516,8 +14594,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14526,14 +14604,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14541,8 +14619,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14551,14 +14629,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14566,8 +14644,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14576,14 +14654,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14591,8 +14669,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14604,14 +14682,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14621,14 +14699,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14638,14 +14716,14 @@ cont { scale: 14 lines { width: 5.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14653,8 +14731,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14663,14 +14741,14 @@ cont { scale: 15 lines { width: 9.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14684,7 +14762,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -14692,8 +14770,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14702,14 +14780,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14723,7 +14801,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -14731,8 +14809,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14741,14 +14819,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14762,7 +14840,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -14770,8 +14848,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14780,14 +14858,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14801,7 +14879,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -14809,8 +14887,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14819,14 +14897,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14840,7 +14918,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -14848,8 +14926,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14861,14 +14939,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14878,14 +14956,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14895,14 +14973,14 @@ cont { scale: 14 lines { width: 5.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14910,8 +14988,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14920,14 +14998,14 @@ cont { scale: 15 lines { width: 9.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14941,7 +15019,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -14953,8 +15031,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -14963,14 +15041,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -14984,7 +15062,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -14996,8 +15074,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -15006,14 +15084,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -15027,7 +15105,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -15039,8 +15117,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -15049,14 +15127,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -15070,7 +15148,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -15082,8 +15160,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -15092,14 +15170,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1054 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16746496 + color: 15763456 priority: 1055 join: ROUNDJOIN cap: ROUNDCAP @@ -15113,7 +15191,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -15125,8 +15203,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16746496 + color: 2105376 + stroke_color: 15763456 } priority: 16055 } @@ -15138,7 +15216,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15152,7 +15230,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15166,7 +15244,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15178,7 +15256,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15187,7 +15265,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15199,7 +15277,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15208,7 +15286,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15220,7 +15298,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15229,7 +15307,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15241,7 +15319,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15250,7 +15328,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15262,7 +15340,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15274,7 +15352,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15288,7 +15366,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15302,7 +15380,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15314,7 +15392,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15335,7 +15413,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15356,7 +15434,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15377,7 +15455,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15398,7 +15476,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15410,7 +15488,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15424,7 +15502,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15438,7 +15516,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15450,7 +15528,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15459,7 +15537,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15471,7 +15549,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15480,7 +15558,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15492,7 +15570,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15501,7 +15579,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15513,7 +15591,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15522,7 +15600,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15534,7 +15612,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15546,7 +15624,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15560,7 +15638,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15574,7 +15652,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15592,7 +15670,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -15600,7 +15678,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15609,7 +15687,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15627,7 +15705,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -15635,7 +15713,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15644,7 +15722,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15662,7 +15740,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -15670,7 +15748,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15679,7 +15757,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15697,7 +15775,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -15705,7 +15783,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15714,7 +15792,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15732,7 +15810,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -15740,7 +15818,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15752,7 +15830,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15766,7 +15844,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15780,7 +15858,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15798,7 +15876,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -15810,7 +15888,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15819,7 +15897,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15837,7 +15915,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -15849,7 +15927,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15858,7 +15936,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15876,7 +15954,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -15888,7 +15966,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15897,7 +15975,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15915,7 +15993,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -15927,7 +16005,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15936,7 +16014,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15954,7 +16032,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -15966,7 +16044,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -15978,7 +16056,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -15992,7 +16070,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16006,7 +16084,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16024,7 +16102,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -16032,7 +16110,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16041,7 +16119,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16059,7 +16137,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -16067,7 +16145,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16076,7 +16154,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16094,7 +16172,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -16102,7 +16180,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16111,7 +16189,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16129,7 +16207,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -16137,7 +16215,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16146,7 +16224,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16164,7 +16242,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -16172,7 +16250,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16184,7 +16262,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16198,7 +16276,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16212,7 +16290,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16224,7 +16302,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16245,7 +16323,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16266,7 +16344,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16287,7 +16365,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16308,7 +16386,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16320,7 +16398,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16334,7 +16412,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16348,7 +16426,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16360,7 +16438,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16381,7 +16459,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16402,7 +16480,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16423,7 +16501,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16444,7 +16522,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16456,7 +16534,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16470,7 +16548,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16484,7 +16562,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16496,7 +16574,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16517,7 +16595,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16538,7 +16616,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16559,7 +16637,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16580,7 +16658,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16592,7 +16670,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16606,7 +16684,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16620,7 +16698,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16632,7 +16710,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16653,7 +16731,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16674,7 +16752,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16695,7 +16773,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16716,7 +16794,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16728,7 +16806,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16742,7 +16820,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16756,7 +16834,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16768,7 +16846,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16777,7 +16855,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16789,7 +16867,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16798,7 +16876,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16810,7 +16888,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16819,7 +16897,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16831,7 +16909,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16840,7 +16918,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16852,7 +16930,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16864,7 +16942,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16878,7 +16956,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16892,7 +16970,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -16904,7 +16982,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16925,7 +17003,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16946,7 +17024,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16967,7 +17045,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -16988,7 +17066,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17000,7 +17078,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17014,7 +17092,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17028,7 +17106,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17040,7 +17118,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17049,7 +17127,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17061,7 +17139,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17070,7 +17148,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17082,7 +17160,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17091,7 +17169,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17103,7 +17181,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17112,7 +17190,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17124,7 +17202,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17136,7 +17214,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17150,7 +17228,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17164,7 +17242,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17176,7 +17254,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17185,7 +17263,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17197,7 +17275,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17206,7 +17284,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17218,7 +17296,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17227,7 +17305,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17239,7 +17317,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17248,7 +17326,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17260,7 +17338,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17272,7 +17350,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17286,7 +17364,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17300,7 +17378,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17318,7 +17396,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17330,7 +17408,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17339,7 +17417,7 @@ cont { scale: 16 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17357,7 +17435,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17369,7 +17447,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17378,7 +17456,7 @@ cont { scale: 17 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17396,7 +17474,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17408,7 +17486,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17417,7 +17495,7 @@ cont { scale: 18 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17435,7 +17513,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17447,7 +17525,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17456,7 +17534,7 @@ cont { scale: 19 lines { width: 1.0 - color: 14522675 + color: 14127921 dashdot { dd: 4.0 dd: 4.0 @@ -17474,7 +17552,7 @@ cont { } lines { width: 11.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17486,7 +17564,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16033 } @@ -17498,7 +17576,7 @@ cont { scale: 15 lines { width: 2.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17506,7 +17584,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17515,7 +17593,7 @@ cont { scale: 16 lines { width: 3.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17523,7 +17601,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17532,7 +17610,7 @@ cont { scale: 17 lines { width: 7.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17540,7 +17618,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17549,7 +17627,7 @@ cont { scale: 18 lines { width: 9.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17557,7 +17635,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17566,7 +17644,7 @@ cont { scale: 19 lines { width: 17.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17574,7 +17652,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17585,13 +17663,13 @@ cont { element { scale: 15 area { - color: 12303257 + color: 12171925 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -17599,13 +17677,13 @@ cont { element { scale: 16 area { - color: 12303257 + color: 12171925 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -17613,13 +17691,13 @@ cont { element { scale: 17 area { - color: 12303257 + color: 12171925 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -17627,13 +17705,13 @@ cont { element { scale: 18 area { - color: 12303257 + color: 12171925 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -17641,13 +17719,13 @@ cont { element { scale: 19 area { - color: 12303257 + color: 12171925 priority: 1034 } caption { primary { height: 11 - color: 4473924 + color: 4210752 } priority: 15033 } @@ -17659,7 +17737,7 @@ cont { scale: 15 lines { width: 2.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17673,7 +17751,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -17681,7 +17759,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17690,7 +17768,7 @@ cont { scale: 16 lines { width: 3.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17704,7 +17782,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -17712,7 +17790,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17721,7 +17799,7 @@ cont { scale: 17 lines { width: 7.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17735,7 +17813,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -17743,7 +17821,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17752,7 +17830,7 @@ cont { scale: 18 lines { width: 9.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17766,7 +17844,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -17774,7 +17852,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17783,7 +17861,7 @@ cont { scale: 19 lines { width: 17.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17797,7 +17875,7 @@ cont { } lines { width: 27.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -17805,7 +17883,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17817,7 +17895,7 @@ cont { scale: 15 lines { width: 2.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17831,7 +17909,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17843,7 +17921,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17852,7 +17930,7 @@ cont { scale: 16 lines { width: 3.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17866,7 +17944,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17878,7 +17956,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17887,7 +17965,7 @@ cont { scale: 17 lines { width: 7.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17901,7 +17979,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17913,7 +17991,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17922,7 +18000,7 @@ cont { scale: 18 lines { width: 9.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17936,7 +18014,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17948,7 +18026,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17957,7 +18035,7 @@ cont { scale: 19 lines { width: 17.0 - color: 12303257 + color: 12171925 priority: 1033 join: ROUNDJOIN cap: ROUNDCAP @@ -17971,7 +18049,7 @@ cont { } lines { width: 27.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -17983,7 +18061,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16033 } @@ -17995,7 +18073,7 @@ cont { scale: 16 lines { width: 5.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP @@ -18016,7 +18094,7 @@ cont { scale: 17 lines { width: 9.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP @@ -18037,7 +18115,7 @@ cont { scale: 18 lines { width: 9.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP @@ -18058,7 +18136,7 @@ cont { scale: 19 lines { width: 9.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP @@ -18082,14 +18160,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18099,14 +18177,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18116,14 +18194,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18131,8 +18209,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } @@ -18141,14 +18219,14 @@ cont { scale: 11 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18156,8 +18234,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } @@ -18166,14 +18244,14 @@ cont { scale: 12 lines { width: 4.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18181,14 +18259,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18197,14 +18275,14 @@ cont { scale: 13 lines { width: 6.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18212,14 +18290,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18228,14 +18306,14 @@ cont { scale: 14 lines { width: 8.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18243,14 +18321,14 @@ cont { path_text { primary { height: 14 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18259,14 +18337,14 @@ cont { scale: 15 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18274,14 +18352,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18290,14 +18368,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18305,14 +18383,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18321,14 +18399,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18336,14 +18414,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18352,14 +18430,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18367,14 +18445,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18383,14 +18461,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18398,14 +18476,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18417,14 +18495,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18434,14 +18512,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18451,14 +18529,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18466,8 +18544,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } @@ -18476,14 +18554,14 @@ cont { scale: 11 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18491,8 +18569,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } @@ -18501,14 +18579,14 @@ cont { scale: 12 lines { width: 4.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18516,14 +18594,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18532,14 +18610,14 @@ cont { scale: 13 lines { width: 6.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18547,14 +18625,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18563,14 +18641,14 @@ cont { scale: 14 lines { width: 8.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18578,14 +18656,14 @@ cont { path_text { primary { height: 14 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18594,14 +18672,14 @@ cont { scale: 15 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18615,7 +18693,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -18623,14 +18701,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18639,14 +18717,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18660,7 +18738,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -18668,14 +18746,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18684,14 +18762,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18705,7 +18783,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -18713,14 +18791,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18729,14 +18807,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18750,7 +18828,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -18758,14 +18836,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18774,14 +18852,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18795,7 +18873,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -18803,14 +18881,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18822,14 +18900,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18839,14 +18917,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18856,14 +18934,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18871,8 +18949,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } @@ -18881,14 +18959,14 @@ cont { scale: 11 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18896,8 +18974,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } @@ -18906,14 +18984,14 @@ cont { scale: 12 lines { width: 4.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18921,14 +18999,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18937,14 +19015,14 @@ cont { scale: 13 lines { width: 6.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18952,14 +19030,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18968,14 +19046,14 @@ cont { scale: 14 lines { width: 8.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -18983,14 +19061,14 @@ cont { path_text { primary { height: 14 - color: 3355443 - stroke_color: 16772710 + color: 3158064 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -18999,14 +19077,14 @@ cont { scale: 15 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19020,7 +19098,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -19032,14 +19110,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -19048,14 +19126,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19069,7 +19147,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -19081,14 +19159,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -19097,14 +19175,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19118,7 +19196,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -19130,14 +19208,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -19146,14 +19224,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19167,7 +19245,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -19179,14 +19257,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -19195,14 +19273,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19216,7 +19294,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -19228,14 +19306,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16772710 + color: 4210752 + stroke_color: 16638054 } priority: 16051 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16051 } @@ -19247,14 +19325,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19264,14 +19342,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19281,14 +19359,14 @@ cont { scale: 12 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19298,14 +19376,14 @@ cont { scale: 13 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19315,14 +19393,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19330,8 +19408,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19340,14 +19418,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19355,8 +19433,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19365,14 +19443,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19380,8 +19458,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19390,14 +19468,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19405,8 +19483,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19415,14 +19493,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19430,8 +19508,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19440,14 +19518,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19455,8 +19533,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19468,14 +19546,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19485,14 +19563,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19502,14 +19580,14 @@ cont { scale: 12 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19519,14 +19597,14 @@ cont { scale: 13 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19536,14 +19614,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19551,8 +19629,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19561,14 +19639,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19582,7 +19660,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -19590,8 +19668,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19600,14 +19678,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19621,7 +19699,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -19629,8 +19707,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19639,14 +19717,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19660,7 +19738,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -19668,8 +19746,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19678,14 +19756,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19699,7 +19777,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -19707,8 +19785,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19717,14 +19795,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19738,7 +19816,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -19746,8 +19824,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19759,14 +19837,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19776,14 +19854,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19793,14 +19871,14 @@ cont { scale: 12 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19810,14 +19888,14 @@ cont { scale: 13 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19827,14 +19905,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19842,8 +19920,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19852,14 +19930,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19873,7 +19951,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -19885,8 +19963,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19895,14 +19973,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19916,7 +19994,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -19928,8 +20006,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19938,14 +20016,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -19959,7 +20037,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -19971,8 +20049,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -19981,14 +20059,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -20002,7 +20080,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -20014,8 +20092,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -20024,14 +20102,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1050 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16772710 + color: 16638054 priority: 1051 join: ROUNDJOIN cap: ROUNDCAP @@ -20045,7 +20123,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -20057,8 +20135,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16772710 + color: 2105376 + stroke_color: 16638054 } priority: 16051 } @@ -20070,7 +20148,7 @@ cont { scale: 17 lines { width: 11.6 - color: 12294468 + color: 11899980 dashdot { dd: 4.0 dd: 4.0 @@ -20081,7 +20159,7 @@ cont { } lines { width: 10.0 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -20095,7 +20173,7 @@ cont { scale: 18 lines { width: 11.6 - color: 12294468 + color: 11899980 dashdot { dd: 4.0 dd: 4.0 @@ -20106,7 +20184,7 @@ cont { } lines { width: 10.0 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -20120,7 +20198,7 @@ cont { scale: 19 lines { width: 11.6 - color: 12294468 + color: 11899980 dashdot { dd: 4.0 dd: 4.0 @@ -20131,7 +20209,7 @@ cont { } lines { width: 10.0 - color: 14540253 + color: 13684944 dashdot { dd: 4.0 dd: 4.0 @@ -20148,14 +20226,14 @@ cont { scale: 12 lines { width: 1.98 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.38 - color: 15658717 + color: 15262932 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -20165,14 +20243,14 @@ cont { scale: 13 lines { width: 2.35 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.75 - color: 15658717 + color: 15262932 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -20182,14 +20260,14 @@ cont { scale: 14 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 15658717 + color: 15262932 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -20199,7 +20277,7 @@ cont { scale: 15 lines { width: 5.0 - color: 12294468 + color: 11899980 priority: 1176 join: ROUNDJOIN cap: BUTTCAP @@ -20213,7 +20291,7 @@ cont { } lines { width: 6.0 - color: 15658717 + color: 15262932 priority: 1342 join: ROUNDJOIN cap: ROUNDCAP @@ -20234,14 +20312,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1583 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 15658717 + color: 15262932 priority: 1584 join: ROUNDJOIN cap: ROUNDCAP @@ -20259,7 +20337,7 @@ cont { } lines { width: 6.0 - color: 15658717 + color: 15262932 priority: 1587 join: ROUNDJOIN cap: ROUNDCAP @@ -20269,14 +20347,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1454 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 15658717 + color: 15262932 priority: 1455 join: ROUNDJOIN cap: ROUNDCAP @@ -20294,7 +20372,7 @@ cont { } lines { width: 12.0 - color: 15658717 + color: 15262932 priority: 1629 join: ROUNDJOIN cap: ROUNDCAP @@ -20304,14 +20382,14 @@ cont { scale: 18 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1454 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 15658717 + color: 15262932 priority: 1455 join: ROUNDJOIN cap: ROUNDCAP @@ -20329,7 +20407,7 @@ cont { } lines { width: 12.0 - color: 15658717 + color: 15262932 priority: 1629 join: ROUNDJOIN cap: ROUNDCAP @@ -20339,14 +20417,14 @@ cont { scale: 19 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1454 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 15658717 + color: 15262932 priority: 1455 join: ROUNDJOIN cap: ROUNDCAP @@ -20364,7 +20442,7 @@ cont { } lines { width: 12.0 - color: 15658717 + color: 15262932 priority: 1629 join: ROUNDJOIN cap: ROUNDCAP @@ -20377,7 +20455,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20394,7 +20472,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20409,7 +20487,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20419,7 +20497,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20434,7 +20512,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20444,7 +20522,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20459,7 +20537,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20469,7 +20547,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20484,7 +20562,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20494,7 +20572,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20509,7 +20587,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20519,7 +20597,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20534,7 +20612,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20599,7 +20677,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20616,7 +20694,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20631,7 +20709,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20641,7 +20719,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20662,7 +20740,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -20670,7 +20748,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20680,7 +20758,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20701,7 +20779,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -20709,7 +20787,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20719,7 +20797,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20740,7 +20818,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -20748,7 +20826,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20758,7 +20836,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20779,7 +20857,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -20787,7 +20865,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20797,7 +20875,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20818,7 +20896,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -20826,7 +20904,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20839,7 +20917,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20856,7 +20934,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20871,7 +20949,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20881,7 +20959,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20902,7 +20980,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -20914,7 +20992,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20924,7 +21002,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20945,7 +21023,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -20957,7 +21035,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -20967,7 +21045,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -20988,7 +21066,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -21000,7 +21078,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -21010,7 +21088,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -21031,7 +21109,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -21043,7 +21121,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -21053,7 +21131,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -21074,7 +21152,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -21086,7 +21164,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -21099,14 +21177,14 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21116,14 +21194,14 @@ cont { scale: 14 lines { width: 5.1 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.5 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21131,8 +21209,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 14540253 + color: 2105376 + stroke_color: 13684944 } priority: 16000 } @@ -21141,14 +21219,14 @@ cont { scale: 15 lines { width: 8.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21156,8 +21234,8 @@ cont { path_text { primary { height: 10 - color: 7829367 - stroke_color: 14540253 + color: 7368816 + stroke_color: 13684944 } priority: 16000 } @@ -21166,14 +21244,14 @@ cont { scale: 16 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21181,7 +21259,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21190,14 +21268,14 @@ cont { scale: 17 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21205,7 +21283,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21214,14 +21292,14 @@ cont { scale: 18 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21229,7 +21307,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21238,14 +21316,14 @@ cont { scale: 19 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21253,7 +21331,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21265,14 +21343,14 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21282,14 +21360,14 @@ cont { scale: 14 lines { width: 5.1 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.5 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21297,8 +21375,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 14540253 + color: 2105376 + stroke_color: 13684944 } priority: 16000 } @@ -21307,14 +21385,14 @@ cont { scale: 15 lines { width: 8.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21328,7 +21406,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -21336,8 +21414,8 @@ cont { path_text { primary { height: 10 - color: 7829367 - stroke_color: 14540253 + color: 7368816 + stroke_color: 13684944 } priority: 16000 } @@ -21346,14 +21424,14 @@ cont { scale: 16 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21367,7 +21445,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -21375,7 +21453,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21384,14 +21462,14 @@ cont { scale: 17 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21405,7 +21483,7 @@ cont { } lines { width: 20.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -21413,7 +21491,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21422,14 +21500,14 @@ cont { scale: 18 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21443,7 +21521,7 @@ cont { } lines { width: 20.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -21451,7 +21529,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21460,14 +21538,14 @@ cont { scale: 19 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21481,7 +21559,7 @@ cont { } lines { width: 20.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -21489,7 +21567,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21501,14 +21579,14 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21518,14 +21596,14 @@ cont { scale: 14 lines { width: 5.1 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.5 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21533,8 +21611,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 14540253 + color: 2105376 + stroke_color: 13684944 } priority: 16000 } @@ -21543,14 +21621,14 @@ cont { scale: 15 lines { width: 8.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21564,7 +21642,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -21576,8 +21654,8 @@ cont { path_text { primary { height: 10 - color: 7829367 - stroke_color: 14540253 + color: 7368816 + stroke_color: 13684944 } priority: 16000 } @@ -21586,14 +21664,14 @@ cont { scale: 16 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21607,7 +21685,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -21619,7 +21697,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21628,14 +21706,14 @@ cont { scale: 17 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21649,7 +21727,7 @@ cont { } lines { width: 20.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -21661,7 +21739,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21670,14 +21748,14 @@ cont { scale: 18 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21691,7 +21769,7 @@ cont { } lines { width: 20.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -21703,7 +21781,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21712,14 +21790,14 @@ cont { scale: 19 lines { width: 11.6 - color: 12294468 + color: 11899980 priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -21733,7 +21811,7 @@ cont { } lines { width: 20.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -21745,7 +21823,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16000 } @@ -21757,14 +21835,14 @@ cont { scale: 9 lines { width: 2.0 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -21774,14 +21852,14 @@ cont { scale: 10 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -21791,14 +21869,14 @@ cont { scale: 11 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -21808,21 +21886,21 @@ cont { scale: 12 lines { width: 4.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -21831,14 +21909,14 @@ cont { scale: 13 lines { width: 5.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -21846,14 +21924,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -21862,14 +21940,14 @@ cont { scale: 14 lines { width: 6.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -21877,14 +21955,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -21893,14 +21971,14 @@ cont { scale: 15 lines { width: 8.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -21908,14 +21986,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -21924,14 +22002,14 @@ cont { scale: 16 lines { width: 12.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 11.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -21939,14 +22017,14 @@ cont { path_text { primary { height: 14 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -21955,14 +22033,14 @@ cont { scale: 17 lines { width: 15.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -21970,14 +22048,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -21986,14 +22064,14 @@ cont { scale: 18 lines { width: 24.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22001,14 +22079,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22017,14 +22095,14 @@ cont { scale: 19 lines { width: 42.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22032,14 +22110,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22051,14 +22129,14 @@ cont { scale: 9 lines { width: 2.0 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22068,14 +22146,14 @@ cont { scale: 10 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22085,14 +22163,14 @@ cont { scale: 11 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22102,21 +22180,21 @@ cont { scale: 12 lines { width: 4.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22125,14 +22203,14 @@ cont { scale: 13 lines { width: 5.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22140,14 +22218,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22156,14 +22234,14 @@ cont { scale: 14 lines { width: 6.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22171,14 +22249,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22187,14 +22265,14 @@ cont { scale: 15 lines { width: 8.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22208,7 +22286,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -22216,14 +22294,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22232,14 +22310,14 @@ cont { scale: 16 lines { width: 12.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 11.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22253,7 +22331,7 @@ cont { } lines { width: 21.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -22261,14 +22339,14 @@ cont { path_text { primary { height: 14 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22277,14 +22355,14 @@ cont { scale: 17 lines { width: 15.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22298,7 +22376,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -22306,14 +22384,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22322,14 +22400,14 @@ cont { scale: 18 lines { width: 24.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22343,7 +22421,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -22351,14 +22429,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22367,14 +22445,14 @@ cont { scale: 19 lines { width: 42.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22388,7 +22466,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -22396,14 +22474,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22415,14 +22493,14 @@ cont { scale: 9 lines { width: 2.0 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22432,14 +22510,14 @@ cont { scale: 10 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22449,14 +22527,14 @@ cont { scale: 11 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22466,21 +22544,21 @@ cont { scale: 12 lines { width: 4.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22489,14 +22567,14 @@ cont { scale: 13 lines { width: 5.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22504,14 +22582,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22520,14 +22598,14 @@ cont { scale: 14 lines { width: 6.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22535,14 +22613,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22551,14 +22629,14 @@ cont { scale: 15 lines { width: 8.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22572,7 +22650,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -22584,14 +22662,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22600,14 +22678,14 @@ cont { scale: 16 lines { width: 12.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 11.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22621,7 +22699,7 @@ cont { } lines { width: 21.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -22633,14 +22711,14 @@ cont { path_text { primary { height: 14 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22649,14 +22727,14 @@ cont { scale: 17 lines { width: 15.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22670,7 +22748,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -22682,14 +22760,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22698,14 +22776,14 @@ cont { scale: 18 lines { width: 24.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22719,7 +22797,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -22731,14 +22809,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22747,14 +22825,14 @@ cont { scale: 19 lines { width: 42.6 - color: 13421670 + color: 13158496 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22768,7 +22846,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -22780,14 +22858,14 @@ cont { path_text { primary { height: 16 - color: 4473924 - stroke_color: 16777096 + color: 4210752 + stroke_color: 16776064 } priority: 16048 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16048 } @@ -22799,14 +22877,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22816,14 +22894,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22833,14 +22911,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22850,14 +22928,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22867,14 +22945,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22882,8 +22960,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -22892,14 +22970,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22907,8 +22985,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -22917,14 +22995,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22932,8 +23010,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -22942,14 +23020,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22957,8 +23035,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -22967,14 +23045,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -22982,8 +23060,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -22992,14 +23070,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23007,8 +23085,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23020,14 +23098,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23037,14 +23115,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23054,14 +23132,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23071,14 +23149,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23088,14 +23166,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23103,8 +23181,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23113,14 +23191,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23134,7 +23212,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -23142,8 +23220,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23152,14 +23230,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23173,7 +23251,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -23181,8 +23259,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23191,14 +23269,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23212,7 +23290,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -23220,8 +23298,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23230,14 +23308,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23251,7 +23329,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -23259,8 +23337,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23269,14 +23347,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23290,7 +23368,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -23298,8 +23376,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23311,14 +23389,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23328,14 +23406,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23345,14 +23423,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23362,14 +23440,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23379,14 +23457,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23394,8 +23472,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23404,14 +23482,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23425,7 +23503,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -23437,8 +23515,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23447,14 +23525,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23468,7 +23546,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -23480,8 +23558,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23490,14 +23568,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23511,7 +23589,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -23523,8 +23601,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23533,14 +23611,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23554,7 +23632,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -23566,8 +23644,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23576,14 +23654,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1047 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777096 + color: 16776064 priority: 1048 join: ROUNDJOIN cap: ROUNDCAP @@ -23597,7 +23675,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -23609,8 +23687,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777096 + color: 2105376 + stroke_color: 16776064 } priority: 16048 } @@ -23622,7 +23700,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23639,7 +23717,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23656,14 +23734,14 @@ cont { scale: 15 lines { width: 4.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777215 + color: 16645629 priority: 1042 join: ROUNDJOIN cap: ROUNDCAP @@ -23671,7 +23749,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -23680,7 +23758,7 @@ cont { scale: 16 lines { width: 6.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23695,7 +23773,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -23704,7 +23782,7 @@ cont { scale: 17 lines { width: 8.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23719,7 +23797,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -23728,7 +23806,7 @@ cont { scale: 18 lines { width: 10.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23743,7 +23821,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -23752,7 +23830,7 @@ cont { scale: 19 lines { width: 18.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23767,7 +23845,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -23792,7 +23870,7 @@ cont { element { scale: 15 area { - color: 16777215 + color: 16645629 priority: 1043 } } @@ -23831,7 +23909,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23848,7 +23926,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23865,14 +23943,14 @@ cont { scale: 15 lines { width: 4.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777215 + color: 16645629 priority: 1042 join: ROUNDJOIN cap: ROUNDCAP @@ -23886,7 +23964,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -23894,7 +23972,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -23903,7 +23981,7 @@ cont { scale: 16 lines { width: 6.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23924,7 +24002,7 @@ cont { } lines { width: 15.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -23932,7 +24010,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -23941,7 +24019,7 @@ cont { scale: 17 lines { width: 8.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -23962,7 +24040,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -23970,7 +24048,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -23979,7 +24057,7 @@ cont { scale: 18 lines { width: 10.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24000,7 +24078,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -24008,7 +24086,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24017,7 +24095,7 @@ cont { scale: 19 lines { width: 18.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24038,7 +24116,7 @@ cont { } lines { width: 27.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -24046,7 +24124,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24058,7 +24136,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24075,7 +24153,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24092,14 +24170,14 @@ cont { scale: 15 lines { width: 4.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777215 + color: 16645629 priority: 1042 join: ROUNDJOIN cap: ROUNDCAP @@ -24107,7 +24185,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24116,7 +24194,7 @@ cont { scale: 16 lines { width: 6.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24131,7 +24209,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24140,7 +24218,7 @@ cont { scale: 17 lines { width: 8.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24155,7 +24233,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24164,7 +24242,7 @@ cont { scale: 18 lines { width: 10.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24179,7 +24257,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24188,7 +24266,7 @@ cont { scale: 19 lines { width: 18.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24203,7 +24281,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24228,7 +24306,7 @@ cont { element { scale: 15 area { - color: 16777215 + color: 16645629 priority: 1043 } } @@ -24267,7 +24345,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24284,7 +24362,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24301,14 +24379,14 @@ cont { scale: 15 lines { width: 4.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777215 + color: 16645629 priority: 1042 join: ROUNDJOIN cap: ROUNDCAP @@ -24322,7 +24400,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -24330,7 +24408,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24339,7 +24417,7 @@ cont { scale: 16 lines { width: 6.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24360,7 +24438,7 @@ cont { } lines { width: 15.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -24368,7 +24446,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24377,7 +24455,7 @@ cont { scale: 17 lines { width: 8.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24398,7 +24476,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -24406,7 +24484,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24415,7 +24493,7 @@ cont { scale: 18 lines { width: 10.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24436,7 +24514,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -24444,7 +24522,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24453,7 +24531,7 @@ cont { scale: 19 lines { width: 18.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24474,7 +24552,7 @@ cont { } lines { width: 27.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -24482,7 +24560,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24494,7 +24572,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24511,7 +24589,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24528,14 +24606,14 @@ cont { scale: 15 lines { width: 4.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777215 + color: 16645629 priority: 1042 join: ROUNDJOIN cap: ROUNDCAP @@ -24549,7 +24627,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -24561,7 +24639,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24570,7 +24648,7 @@ cont { scale: 16 lines { width: 6.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24591,7 +24669,7 @@ cont { } lines { width: 15.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -24603,7 +24681,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24612,7 +24690,7 @@ cont { scale: 17 lines { width: 8.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24633,7 +24711,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -24645,7 +24723,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24654,7 +24732,7 @@ cont { scale: 18 lines { width: 10.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24675,7 +24753,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -24687,7 +24765,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24696,7 +24774,7 @@ cont { scale: 19 lines { width: 18.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24717,7 +24795,7 @@ cont { } lines { width: 27.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -24729,7 +24807,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24741,7 +24819,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24758,7 +24836,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24775,14 +24853,14 @@ cont { scale: 15 lines { width: 4.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777215 + color: 16645629 priority: 1042 join: ROUNDJOIN cap: ROUNDCAP @@ -24790,7 +24868,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24799,7 +24877,7 @@ cont { scale: 16 lines { width: 6.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24814,7 +24892,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24823,7 +24901,7 @@ cont { scale: 17 lines { width: 8.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24838,7 +24916,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24847,7 +24925,7 @@ cont { scale: 18 lines { width: 10.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24862,7 +24940,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24871,7 +24949,7 @@ cont { scale: 19 lines { width: 18.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24886,7 +24964,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24898,7 +24976,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24915,7 +24993,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24932,14 +25010,14 @@ cont { scale: 15 lines { width: 4.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777215 + color: 16645629 priority: 1042 join: ROUNDJOIN cap: ROUNDCAP @@ -24953,7 +25031,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -24965,7 +25043,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -24974,7 +25052,7 @@ cont { scale: 16 lines { width: 6.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -24995,7 +25073,7 @@ cont { } lines { width: 15.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -25007,7 +25085,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -25016,7 +25094,7 @@ cont { scale: 17 lines { width: 8.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -25037,7 +25115,7 @@ cont { } lines { width: 17.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -25049,7 +25127,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -25058,7 +25136,7 @@ cont { scale: 18 lines { width: 10.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -25079,7 +25157,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -25091,7 +25169,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -25100,7 +25178,7 @@ cont { scale: 19 lines { width: 18.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -25121,7 +25199,7 @@ cont { } lines { width: 27.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -25133,7 +25211,7 @@ cont { path_text { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 16042 } @@ -25184,7 +25262,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25193,7 +25271,7 @@ cont { scale: 16 lines { width: 4.0 - color: 14535850 + color: 13683884 dashdot { dd: 2.4 dd: 1.0 @@ -25205,7 +25283,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25214,14 +25292,14 @@ cont { scale: 17 lines { width: 6.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 14535850 + color: 13683884 dashdot { dd: 2.4 dd: 1.0 @@ -25233,7 +25311,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25242,14 +25320,14 @@ cont { scale: 18 lines { width: 10.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 14535850 + color: 13683884 dashdot { dd: 3.0 dd: 1.0 @@ -25261,7 +25339,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25270,14 +25348,14 @@ cont { scale: 19 lines { width: 18.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 14535850 + color: 13683884 dashdot { dd: 4.0 dd: 1.0 @@ -25289,7 +25367,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25302,7 +25380,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25311,7 +25389,7 @@ cont { scale: 16 lines { width: 4.0 - color: 14535850 + color: 13683884 dashdot { dd: 2.4 dd: 1.0 @@ -25329,7 +25407,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -25337,7 +25415,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25346,7 +25424,7 @@ cont { scale: 17 lines { width: 6.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP @@ -25360,7 +25438,7 @@ cont { } lines { width: 4.0 - color: 14535850 + color: 13683884 dashdot { dd: 2.4 dd: 1.0 @@ -25371,7 +25449,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -25379,7 +25457,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25388,7 +25466,7 @@ cont { scale: 18 lines { width: 10.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP @@ -25402,7 +25480,7 @@ cont { } lines { width: 8.0 - color: 14535850 + color: 13683884 dashdot { dd: 3.0 dd: 1.0 @@ -25413,7 +25491,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -25421,7 +25499,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25430,7 +25508,7 @@ cont { scale: 19 lines { width: 18.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP @@ -25444,7 +25522,7 @@ cont { } lines { width: 16.0 - color: 14535850 + color: 13683884 dashdot { dd: 4.0 dd: 1.0 @@ -25455,7 +25533,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -25463,7 +25541,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25476,7 +25554,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25485,7 +25563,7 @@ cont { scale: 16 lines { width: 4.0 - color: 14535850 + color: 13683884 dashdot { dd: 2.4 dd: 1.0 @@ -25503,7 +25581,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -25515,7 +25593,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25524,7 +25602,7 @@ cont { scale: 17 lines { width: 6.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP @@ -25538,7 +25616,7 @@ cont { } lines { width: 4.0 - color: 14535850 + color: 13683884 dashdot { dd: 2.4 dd: 1.0 @@ -25549,7 +25627,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -25561,7 +25639,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25570,7 +25648,7 @@ cont { scale: 18 lines { width: 10.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP @@ -25584,7 +25662,7 @@ cont { } lines { width: 8.0 - color: 14535850 + color: 13683884 dashdot { dd: 3.0 dd: 1.0 @@ -25595,7 +25673,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -25607,7 +25685,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25616,7 +25694,7 @@ cont { scale: 19 lines { width: 18.0 - color: 11184793 + color: 10526864 priority: 1039 join: ROUNDJOIN cap: BUTTCAP @@ -25630,7 +25708,7 @@ cont { } lines { width: 16.0 - color: 14535850 + color: 13683884 dashdot { dd: 4.0 dd: 1.0 @@ -25641,7 +25719,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -25653,7 +25731,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16039 } @@ -25665,21 +25743,21 @@ cont { scale: 12 lines { width: 2.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25688,21 +25766,21 @@ cont { scale: 13 lines { width: 3.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25711,14 +25789,14 @@ cont { scale: 14 lines { width: 4.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -25726,14 +25804,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25742,14 +25820,14 @@ cont { scale: 15 lines { width: 5.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -25757,14 +25835,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25773,14 +25851,14 @@ cont { scale: 16 lines { width: 7.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -25788,14 +25866,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25804,14 +25882,14 @@ cont { scale: 17 lines { width: 13.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -25819,14 +25897,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25835,14 +25913,14 @@ cont { scale: 18 lines { width: 24.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -25850,14 +25928,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25866,14 +25944,14 @@ cont { scale: 19 lines { width: 42.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -25881,14 +25959,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25900,21 +25978,21 @@ cont { scale: 12 lines { width: 2.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25923,21 +26001,21 @@ cont { scale: 13 lines { width: 3.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25946,14 +26024,14 @@ cont { scale: 14 lines { width: 4.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -25961,14 +26039,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -25977,14 +26055,14 @@ cont { scale: 15 lines { width: 5.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -25998,7 +26076,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26006,14 +26084,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26022,14 +26100,14 @@ cont { scale: 16 lines { width: 7.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26043,7 +26121,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26051,14 +26129,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26067,14 +26145,14 @@ cont { scale: 17 lines { width: 13.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26088,7 +26166,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26096,14 +26174,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26112,14 +26190,14 @@ cont { scale: 18 lines { width: 24.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26133,7 +26211,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26141,14 +26219,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26157,14 +26235,14 @@ cont { scale: 19 lines { width: 42.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26178,7 +26256,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26186,14 +26264,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26205,21 +26283,21 @@ cont { scale: 12 lines { width: 2.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26228,21 +26306,21 @@ cont { scale: 13 lines { width: 3.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26251,14 +26329,14 @@ cont { scale: 14 lines { width: 4.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26266,14 +26344,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26282,14 +26360,14 @@ cont { scale: 15 lines { width: 5.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26303,7 +26381,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -26315,14 +26393,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26331,14 +26409,14 @@ cont { scale: 16 lines { width: 7.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26352,7 +26430,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -26364,14 +26442,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26380,14 +26458,14 @@ cont { scale: 17 lines { width: 13.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26401,7 +26479,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -26413,14 +26491,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26429,14 +26507,14 @@ cont { scale: 18 lines { width: 24.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26450,7 +26528,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -26462,14 +26540,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26478,14 +26556,14 @@ cont { scale: 19 lines { width: 42.6 - color: 13421670 + color: 13158496 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26499,7 +26577,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -26511,14 +26589,14 @@ cont { path_text { primary { height: 12 - color: 4473924 - stroke_color: 16777113 + color: 4210752 + stroke_color: 16777104 } priority: 16045 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16045 } @@ -26530,14 +26608,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26547,14 +26625,14 @@ cont { scale: 13 lines { width: 4.35 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.75 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26564,14 +26642,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26581,14 +26659,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26596,8 +26674,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26606,14 +26684,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26621,8 +26699,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26631,14 +26709,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26646,8 +26724,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26656,14 +26734,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26671,8 +26749,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26681,14 +26759,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26696,8 +26774,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26709,14 +26787,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26726,14 +26804,14 @@ cont { scale: 13 lines { width: 4.35 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.75 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26743,14 +26821,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26760,14 +26838,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26781,7 +26859,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26789,8 +26867,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26799,14 +26877,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26820,7 +26898,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26828,8 +26906,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26838,14 +26916,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26859,7 +26937,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26867,8 +26945,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26877,14 +26955,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26898,7 +26976,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26906,8 +26984,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26916,14 +26994,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26937,7 +27015,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -26945,8 +27023,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -26958,14 +27036,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26975,14 +27053,14 @@ cont { scale: 13 lines { width: 4.35 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.75 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -26992,14 +27070,14 @@ cont { scale: 14 lines { width: 6.1 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -27009,14 +27087,14 @@ cont { scale: 15 lines { width: 10.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -27030,7 +27108,7 @@ cont { } lines { width: 19.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -27042,8 +27120,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -27052,14 +27130,14 @@ cont { scale: 16 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -27073,7 +27151,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -27085,8 +27163,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -27095,14 +27173,14 @@ cont { scale: 17 lines { width: 13.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -27116,7 +27194,7 @@ cont { } lines { width: 22.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -27128,8 +27206,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -27138,14 +27216,14 @@ cont { scale: 18 lines { width: 24.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -27159,7 +27237,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -27171,8 +27249,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -27181,14 +27259,14 @@ cont { scale: 19 lines { width: 42.6 - color: 12294468 + color: 11899980 priority: 1044 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16777113 + color: 16777104 priority: 1045 join: ROUNDJOIN cap: ROUNDCAP @@ -27202,7 +27280,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -27214,8 +27292,8 @@ cont { path_text { primary { height: 12 - color: 2236962 - stroke_color: 16777113 + color: 2105376 + stroke_color: 16777104 } priority: 16045 } @@ -27227,7 +27305,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27237,7 +27315,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27247,7 +27325,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27255,7 +27333,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27264,7 +27342,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27272,7 +27350,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27281,7 +27359,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27289,7 +27367,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27298,7 +27376,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27306,7 +27384,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27315,7 +27393,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27323,7 +27401,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27334,49 +27412,49 @@ cont { element { scale: 13 area { - color: 14522675 + color: 14127921 priority: 1037 } } element { scale: 14 area { - color: 14522675 + color: 14127921 priority: 1037 } } element { scale: 15 area { - color: 13412983 + color: 12626044 priority: 1037 } } element { scale: 16 area { - color: 13412983 + color: 12626044 priority: 1037 } } element { scale: 17 area { - color: 13412983 + color: 12626044 priority: 1037 } } element { scale: 18 area { - color: 13412983 + color: 12626044 priority: 1037 } } element { scale: 19 area { - color: 13412983 + color: 12626044 priority: 1037 } } @@ -27387,7 +27465,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27397,7 +27475,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27407,7 +27485,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27421,7 +27499,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -27429,7 +27507,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27438,7 +27516,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27452,7 +27530,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -27460,7 +27538,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27469,7 +27547,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27483,7 +27561,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -27491,7 +27569,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27500,7 +27578,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27514,7 +27592,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -27522,7 +27600,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27531,7 +27609,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27545,7 +27623,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -27553,7 +27631,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27565,7 +27643,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27575,7 +27653,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27585,7 +27663,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27593,7 +27671,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27602,7 +27680,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27610,7 +27688,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27619,7 +27697,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27627,7 +27705,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27636,7 +27714,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27644,7 +27722,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27653,7 +27731,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27661,7 +27739,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27673,7 +27751,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27683,7 +27761,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27693,7 +27771,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27701,7 +27779,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27710,7 +27788,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27718,7 +27796,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27727,7 +27805,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27735,7 +27813,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27744,7 +27822,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27752,7 +27830,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27761,7 +27839,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27769,7 +27847,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27781,7 +27859,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27791,7 +27869,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27801,7 +27879,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27809,7 +27887,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27818,7 +27896,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27826,7 +27904,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27835,7 +27913,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27843,7 +27921,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27852,7 +27930,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27860,7 +27938,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27869,7 +27947,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27877,7 +27955,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27889,7 +27967,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27899,7 +27977,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27909,7 +27987,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27917,7 +27995,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27926,7 +28004,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27934,7 +28012,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27943,7 +28021,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27951,7 +28029,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27960,7 +28038,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27968,7 +28046,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27977,7 +28055,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -27985,7 +28063,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -27997,7 +28075,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28007,7 +28085,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28017,7 +28095,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28025,7 +28103,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28034,7 +28112,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28042,7 +28120,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28051,7 +28129,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28059,7 +28137,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28068,7 +28146,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28076,7 +28154,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28085,7 +28163,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28093,7 +28171,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28105,7 +28183,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28115,7 +28193,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28125,7 +28203,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28133,7 +28211,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28142,7 +28220,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28150,7 +28228,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28159,7 +28237,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28167,7 +28245,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28176,7 +28254,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28184,7 +28262,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28193,7 +28271,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28201,7 +28279,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28213,7 +28291,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28223,7 +28301,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28233,7 +28311,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28241,7 +28319,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28250,7 +28328,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28258,7 +28336,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28267,7 +28345,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28275,7 +28353,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28284,7 +28362,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28292,7 +28370,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28301,7 +28379,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28309,7 +28387,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28321,7 +28399,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28331,7 +28409,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28341,7 +28419,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28349,7 +28427,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28358,7 +28436,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28366,7 +28444,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28375,7 +28453,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28383,7 +28461,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28392,7 +28470,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28400,7 +28478,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28409,7 +28487,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28417,7 +28495,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28429,7 +28507,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28439,7 +28517,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28449,7 +28527,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28457,7 +28535,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28466,7 +28544,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28474,7 +28552,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28483,7 +28561,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28491,7 +28569,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28500,7 +28578,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28508,7 +28586,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28517,7 +28595,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28525,7 +28603,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28537,7 +28615,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28547,7 +28625,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28557,7 +28635,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28565,7 +28643,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28574,7 +28652,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28582,7 +28660,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28591,7 +28669,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28599,7 +28677,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28608,7 +28686,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28616,7 +28694,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28625,7 +28703,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28633,7 +28711,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28645,7 +28723,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28655,7 +28733,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28665,7 +28743,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28673,7 +28751,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28682,7 +28760,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28690,7 +28768,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28699,7 +28777,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28707,7 +28785,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28716,7 +28794,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28724,7 +28802,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28733,7 +28811,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28741,7 +28819,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28753,7 +28831,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28763,7 +28841,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28773,7 +28851,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28781,7 +28859,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28790,7 +28868,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28798,7 +28876,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28807,7 +28885,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28815,7 +28893,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28824,7 +28902,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28832,7 +28910,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28841,7 +28919,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28849,7 +28927,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28861,7 +28939,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28871,7 +28949,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28881,7 +28959,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28889,7 +28967,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28898,7 +28976,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28906,7 +28984,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28915,7 +28993,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28923,7 +29001,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28932,7 +29010,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28940,7 +29018,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28949,7 +29027,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28957,7 +29035,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -28969,7 +29047,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28979,7 +29057,7 @@ cont { scale: 14 lines { width: 1.0 - color: 14522675 + color: 14127921 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -28989,7 +29067,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -29003,7 +29081,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -29015,7 +29093,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -29024,7 +29102,7 @@ cont { scale: 16 lines { width: 4.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -29038,7 +29116,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -29050,7 +29128,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -29059,7 +29137,7 @@ cont { scale: 17 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -29073,7 +29151,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -29085,7 +29163,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -29094,7 +29172,7 @@ cont { scale: 18 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -29108,7 +29186,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -29120,7 +29198,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -29129,7 +29207,7 @@ cont { scale: 19 lines { width: 6.0 - color: 13412983 + color: 12626044 priority: 1036 join: ROUNDJOIN cap: ROUNDCAP @@ -29143,7 +29221,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -29155,7 +29233,7 @@ cont { path_text { primary { height: 10 - color: 5592405 + color: 5263440 } priority: 16036 } @@ -29167,7 +29245,7 @@ cont { scale: 7 lines { width: 1.0 - color: 15654314 + color: 15652006 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29177,14 +29255,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16768409 + color: 16241558 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29194,14 +29272,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29211,14 +29289,14 @@ cont { scale: 10 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29226,8 +29304,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } @@ -29236,14 +29314,14 @@ cont { scale: 11 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29251,8 +29329,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } @@ -29261,14 +29339,14 @@ cont { scale: 12 lines { width: 4.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29276,14 +29354,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29292,14 +29370,14 @@ cont { scale: 13 lines { width: 6.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29307,14 +29385,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29323,14 +29401,14 @@ cont { scale: 14 lines { width: 8.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29338,14 +29416,14 @@ cont { path_text { primary { height: 14 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29354,14 +29432,14 @@ cont { scale: 15 lines { width: 9.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29369,14 +29447,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29385,14 +29463,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29400,14 +29478,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29416,14 +29494,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29431,14 +29509,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29447,14 +29525,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29462,14 +29540,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29478,14 +29556,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29493,14 +29571,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29512,7 +29590,7 @@ cont { scale: 7 lines { width: 1.0 - color: 15654314 + color: 15652006 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29522,14 +29600,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16768409 + color: 16241558 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29539,14 +29617,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29556,14 +29634,14 @@ cont { scale: 10 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29571,8 +29649,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } @@ -29581,14 +29659,14 @@ cont { scale: 11 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29596,8 +29674,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } @@ -29606,14 +29684,14 @@ cont { scale: 12 lines { width: 4.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29621,14 +29699,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29637,14 +29715,14 @@ cont { scale: 13 lines { width: 6.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29652,14 +29730,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29668,14 +29746,14 @@ cont { scale: 14 lines { width: 8.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29683,14 +29761,14 @@ cont { path_text { primary { height: 14 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29699,14 +29777,14 @@ cont { scale: 15 lines { width: 9.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29720,7 +29798,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -29728,14 +29806,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29744,14 +29822,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29765,7 +29843,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -29773,14 +29851,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29789,14 +29867,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29810,7 +29888,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -29818,14 +29896,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29834,14 +29912,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29855,7 +29933,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -29863,14 +29941,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29879,14 +29957,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29900,7 +29978,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -29908,14 +29986,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -29927,7 +30005,7 @@ cont { scale: 7 lines { width: 1.0 - color: 15654314 + color: 15652006 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29937,14 +30015,14 @@ cont { scale: 8 lines { width: 1.2 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 0.8 - color: 16768409 + color: 16241558 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29954,14 +30032,14 @@ cont { scale: 9 lines { width: 2.0 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29971,14 +30049,14 @@ cont { scale: 10 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -29986,8 +30064,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } @@ -29996,14 +30074,14 @@ cont { scale: 11 lines { width: 4.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30011,8 +30089,8 @@ cont { path_text { primary { height: 10 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } @@ -30021,14 +30099,14 @@ cont { scale: 12 lines { width: 4.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30036,14 +30114,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -30052,14 +30130,14 @@ cont { scale: 13 lines { width: 6.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30067,14 +30145,14 @@ cont { path_text { primary { height: 12 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -30083,14 +30161,14 @@ cont { scale: 14 lines { width: 8.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30098,14 +30176,14 @@ cont { path_text { primary { height: 14 - color: 3355443 - stroke_color: 16763972 + color: 3158064 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -30114,14 +30192,14 @@ cont { scale: 15 lines { width: 9.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30135,7 +30213,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -30147,14 +30225,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -30163,14 +30241,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30184,7 +30262,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -30196,14 +30274,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -30212,14 +30290,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30233,7 +30311,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -30245,14 +30323,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -30261,14 +30339,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30282,7 +30360,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -30294,14 +30372,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -30310,14 +30388,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30331,7 +30409,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -30343,14 +30421,14 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } shield { height: 11 - color: 10044416 + color: 9849600 stroke_color: 16777215 priority: 16058 } @@ -30362,14 +30440,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30379,14 +30457,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30396,14 +30474,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30413,14 +30491,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30430,14 +30508,14 @@ cont { scale: 14 lines { width: 5.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30447,14 +30525,14 @@ cont { scale: 15 lines { width: 9.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30462,8 +30540,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30472,14 +30550,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30487,8 +30565,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30497,14 +30575,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30512,8 +30590,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30522,14 +30600,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30537,8 +30615,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30547,14 +30625,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30562,8 +30640,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30575,14 +30653,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30592,14 +30670,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30609,14 +30687,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30626,14 +30704,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30643,14 +30721,14 @@ cont { scale: 14 lines { width: 5.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30660,14 +30738,14 @@ cont { scale: 15 lines { width: 9.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30681,7 +30759,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -30689,8 +30767,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30699,14 +30777,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30720,7 +30798,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -30728,8 +30806,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30738,14 +30816,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30759,7 +30837,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -30767,8 +30845,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30777,14 +30855,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30798,7 +30876,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -30806,8 +30884,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30816,14 +30894,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30837,7 +30915,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -30845,8 +30923,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30858,14 +30936,14 @@ cont { scale: 10 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30875,14 +30953,14 @@ cont { scale: 11 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30892,14 +30970,14 @@ cont { scale: 12 lines { width: 2.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 1.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30909,14 +30987,14 @@ cont { scale: 13 lines { width: 3.6 - color: 12294468 + color: 11899980 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30926,14 +31004,14 @@ cont { scale: 14 lines { width: 5.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30943,14 +31021,14 @@ cont { scale: 15 lines { width: 9.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 8.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -30964,7 +31042,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -30976,8 +31054,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -30986,14 +31064,14 @@ cont { scale: 16 lines { width: 15.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 14.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -31007,7 +31085,7 @@ cont { } lines { width: 24.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31019,8 +31097,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -31029,14 +31107,14 @@ cont { scale: 17 lines { width: 17.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 16.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -31050,7 +31128,7 @@ cont { } lines { width: 26.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31062,8 +31140,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -31072,14 +31150,14 @@ cont { scale: 18 lines { width: 24.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 23.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -31093,7 +31171,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31105,8 +31183,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -31115,14 +31193,14 @@ cont { scale: 19 lines { width: 42.6 - color: 14527061 + color: 14196816 priority: 1057 join: ROUNDJOIN cap: BUTTCAP } lines { width: 41.0 - color: 16763972 + color: 16761924 priority: 1058 join: ROUNDJOIN cap: ROUNDCAP @@ -31136,7 +31214,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31148,8 +31226,8 @@ cont { path_text { primary { height: 17 - color: 4473924 - stroke_color: 16763972 + color: 4210752 + stroke_color: 16761924 } priority: 16058 } @@ -31161,7 +31239,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31178,7 +31256,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31193,7 +31271,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31203,7 +31281,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31218,7 +31296,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31228,7 +31306,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31243,7 +31321,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31253,7 +31331,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31268,7 +31346,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31278,7 +31356,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31293,7 +31371,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31303,7 +31381,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31318,7 +31396,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31383,7 +31461,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31400,7 +31478,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31415,7 +31493,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31425,7 +31503,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31446,7 +31524,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -31454,7 +31532,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31464,7 +31542,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31485,7 +31563,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -31493,7 +31571,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31503,7 +31581,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31524,7 +31602,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -31532,7 +31610,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31542,7 +31620,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31563,7 +31641,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -31571,7 +31649,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31581,7 +31659,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31602,7 +31680,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -31610,7 +31688,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31623,7 +31701,7 @@ cont { scale: 13 lines { width: 2.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31640,7 +31718,7 @@ cont { scale: 14 lines { width: 3.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31655,7 +31733,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31665,7 +31743,7 @@ cont { scale: 15 lines { width: 5.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31686,7 +31764,7 @@ cont { } lines { width: 14.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31698,7 +31776,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31708,7 +31786,7 @@ cont { scale: 16 lines { width: 7.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31729,7 +31807,7 @@ cont { } lines { width: 16.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31741,7 +31819,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31751,7 +31829,7 @@ cont { scale: 17 lines { width: 9.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31772,7 +31850,7 @@ cont { } lines { width: 18.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31784,7 +31862,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31794,7 +31872,7 @@ cont { scale: 18 lines { width: 24.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31815,7 +31893,7 @@ cont { } lines { width: 33.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31827,7 +31905,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31837,7 +31915,7 @@ cont { scale: 19 lines { width: 42.6 - color: 13421738 + color: 13158575 priority: 1041 join: ROUNDJOIN cap: BUTTCAP @@ -31858,7 +31936,7 @@ cont { } lines { width: 51.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -31870,7 +31948,7 @@ cont { path_text { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 16777215 } priority: 16042 @@ -31895,7 +31973,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -31911,7 +31989,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -31927,7 +32005,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -31953,7 +32031,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -31969,7 +32047,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -31985,7 +32063,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32000,7 +32078,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32012,7 +32090,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32024,7 +32102,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32050,7 +32128,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32066,7 +32144,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32082,7 +32160,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32096,7 +32174,7 @@ cont { scale: 16 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1926 join: ROUNDJOIN cap: ROUNDCAP @@ -32106,7 +32184,7 @@ cont { scale: 17 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1003 join: ROUNDJOIN cap: ROUNDCAP @@ -32114,7 +32192,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32125,7 +32203,7 @@ cont { scale: 18 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1003 join: ROUNDJOIN cap: ROUNDCAP @@ -32133,7 +32211,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32144,7 +32222,7 @@ cont { scale: 19 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1003 join: ROUNDJOIN cap: ROUNDCAP @@ -32152,7 +32230,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32178,7 +32256,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32194,7 +32272,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32210,7 +32288,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32236,7 +32314,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32252,7 +32330,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32268,7 +32346,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32294,7 +32372,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32310,7 +32388,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32326,7 +32404,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32352,7 +32430,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32368,7 +32446,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32384,7 +32462,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32397,7 +32475,7 @@ cont { element { scale: 15 area { - color: 13421755 + color: 13487540 priority: 1001 } caption { @@ -32411,7 +32489,7 @@ cont { element { scale: 16 area { - color: 13421755 + color: 13487540 priority: 1001 } caption { @@ -32425,13 +32503,13 @@ cont { element { scale: 17 area { - color: 13421755 + color: 13487540 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32441,13 +32519,13 @@ cont { element { scale: 18 area { - color: 13421755 + color: 13487540 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32457,13 +32535,13 @@ cont { element { scale: 19 area { - color: 13421755 + color: 13487540 priority: 1004 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32478,7 +32556,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32490,7 +32568,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32502,7 +32580,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32517,7 +32595,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32529,7 +32607,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32541,7 +32619,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32556,7 +32634,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32568,7 +32646,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32580,7 +32658,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32650,7 +32728,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32662,7 +32740,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32674,7 +32752,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32689,7 +32767,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32701,7 +32779,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32713,7 +32791,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -32726,34 +32804,34 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16057 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16058 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16059 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16060 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -32761,13 +32839,13 @@ cont { element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16061 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -32775,13 +32853,13 @@ cont { element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16062 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -32789,13 +32867,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16063 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -32803,13 +32881,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16064 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -32820,34 +32898,34 @@ cont { element { scale: 12 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 13 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 14 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 15 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -32855,13 +32933,13 @@ cont { element { scale: 16 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -32869,13 +32947,13 @@ cont { element { scale: 17 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -32883,13 +32961,13 @@ cont { element { scale: 18 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -32897,13 +32975,13 @@ cont { element { scale: 19 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -32941,7 +33019,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -32955,7 +33033,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -32969,7 +33047,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -32983,7 +33061,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -32997,7 +33075,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33035,7 +33113,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33049,7 +33127,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33063,7 +33141,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33077,7 +33155,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33091,7 +33169,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33129,7 +33207,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33143,7 +33221,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33157,7 +33235,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33171,7 +33249,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33185,7 +33263,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33196,34 +33274,34 @@ cont { element { scale: 12 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 13 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 14 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -15994 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -33231,13 +33309,13 @@ cont { element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -15994 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -33245,13 +33323,13 @@ cont { element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15994 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -33259,13 +33337,13 @@ cont { element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15994 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -33273,13 +33351,13 @@ cont { element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15994 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -33317,7 +33395,7 @@ cont { caption { primary { height: 12 - color: 8947831 + color: 8421488 } priority: 15003 } @@ -33331,7 +33409,7 @@ cont { caption { primary { height: 12 - color: 8947831 + color: 8421488 } priority: 15003 } @@ -33345,7 +33423,7 @@ cont { caption { primary { height: 14 - color: 4473924 + color: 4210752 } priority: 15003 } @@ -33359,7 +33437,7 @@ cont { caption { primary { height: 14 - color: 4473924 + color: 4210752 } priority: 15003 } @@ -33373,7 +33451,7 @@ cont { caption { primary { height: 14 - color: 4473924 + color: 4210752 } priority: 15003 } @@ -33384,34 +33462,34 @@ cont { element { scale: 12 area { - color: 14540185 + color: 14671767 priority: -16065 } } element { scale: 13 area { - color: 14540185 + color: 14671767 priority: -16066 } } element { scale: 14 area { - color: 14540185 + color: 14671767 priority: -16067 } } element { scale: 15 area { - color: 14540185 + color: 14671767 priority: -16068 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33419,13 +33497,13 @@ cont { element { scale: 16 area { - color: 14540185 + color: 14671767 priority: -16069 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33433,13 +33511,13 @@ cont { element { scale: 17 area { - color: 14540185 + color: 14671767 priority: -16070 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33447,13 +33525,13 @@ cont { element { scale: 18 area { - color: 14540185 + color: 14671767 priority: -16071 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33461,13 +33539,13 @@ cont { element { scale: 19 area { - color: 14540185 + color: 14671767 priority: -16072 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33478,34 +33556,34 @@ cont { element { scale: 12 area { - color: 14540185 + color: 14671767 priority: -16073 } } element { scale: 13 area { - color: 14540185 + color: 14671767 priority: -16074 } } element { scale: 14 area { - color: 14540185 + color: 14671767 priority: -16075 } } element { scale: 15 area { - color: 14540185 + color: 14671767 priority: -16076 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33513,13 +33591,13 @@ cont { element { scale: 16 area { - color: 14540185 + color: 14671767 priority: -16077 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33527,13 +33605,13 @@ cont { element { scale: 17 area { - color: 14540185 + color: 14671767 priority: -16078 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33541,13 +33619,13 @@ cont { element { scale: 18 area { - color: 14540185 + color: 14671767 priority: -16079 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33555,13 +33633,13 @@ cont { element { scale: 19 area { - color: 14540185 + color: 14671767 priority: -16080 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33579,27 +33657,27 @@ cont { element { scale: 13 area { - color: 15658734 + color: 15000804 priority: -15997 } } element { scale: 14 area { - color: 15658734 + color: 15000804 priority: -15997 } } element { scale: 15 area { - color: 15658734 + color: 15000804 priority: -15997 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33607,13 +33685,13 @@ cont { element { scale: 16 area { - color: 15658734 + color: 15000804 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33621,13 +33699,13 @@ cont { element { scale: 17 area { - color: 15658734 + color: 15000804 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33635,13 +33713,13 @@ cont { element { scale: 18 area { - color: 15658734 + color: 15000804 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33649,13 +33727,13 @@ cont { element { scale: 19 area { - color: 15658734 + color: 15000804 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -33666,27 +33744,27 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16081 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16082 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16083 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33694,13 +33772,13 @@ cont { element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16084 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33708,13 +33786,13 @@ cont { element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16085 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33722,13 +33800,13 @@ cont { element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16086 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33736,13 +33814,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16087 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33750,13 +33828,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16088 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33767,48 +33845,48 @@ cont { element { scale: 10 area { - color: 12311978 + color: 11720357 priority: -16089 } } element { scale: 11 area { - color: 12311978 + color: 11720357 priority: -16090 } } element { scale: 12 area { - color: 12311978 + color: 11720357 priority: -16091 } } element { scale: 13 area { - color: 12311978 + color: 11720357 priority: -16092 } } element { scale: 14 area { - color: 12311978 + color: 11720357 priority: -16093 } } element { scale: 15 area { - color: 12311978 + color: 11720357 priority: -16094 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33816,13 +33894,13 @@ cont { element { scale: 16 area { - color: 12311978 + color: 11720357 priority: -16095 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -33831,13 +33909,13 @@ cont { element { scale: 17 area { - color: 12311978 + color: 11720357 priority: -16096 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -33846,13 +33924,13 @@ cont { element { scale: 18 area { - color: 12311978 + color: 11720357 priority: -16097 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -33861,13 +33939,13 @@ cont { element { scale: 19 area { - color: 12311978 + color: 11720357 priority: -16098 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -33879,48 +33957,48 @@ cont { element { scale: 10 area { - color: 12311978 + color: 11720357 priority: -16099 } } element { scale: 11 area { - color: 12311978 + color: 11720357 priority: -16100 } } element { scale: 12 area { - color: 12311978 + color: 11720357 priority: -16101 } } element { scale: 13 area { - color: 12311978 + color: 11720357 priority: -16102 } } element { scale: 14 area { - color: 12311978 + color: 11720357 priority: -16103 } } element { scale: 15 area { - color: 12311978 + color: 11720357 priority: -16104 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -33928,13 +34006,13 @@ cont { element { scale: 16 area { - color: 12311978 + color: 11720357 priority: -16105 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -33943,13 +34021,13 @@ cont { element { scale: 17 area { - color: 12311978 + color: 11720357 priority: -16106 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -33958,13 +34036,13 @@ cont { element { scale: 18 area { - color: 12311978 + color: 11720357 priority: -16107 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -33973,13 +34051,13 @@ cont { element { scale: 19 area { - color: 12311978 + color: 11720357 priority: -16108 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -33991,48 +34069,48 @@ cont { element { scale: 10 area { - color: 12311978 + color: 11720357 priority: -16109 } } element { scale: 11 area { - color: 12311978 + color: 11720357 priority: -16110 } } element { scale: 12 area { - color: 12311978 + color: 11720357 priority: -16111 } } element { scale: 13 area { - color: 12311978 + color: 11720357 priority: -16112 } } element { scale: 14 area { - color: 12311978 + color: 11720357 priority: -16113 } } element { scale: 15 area { - color: 12311978 + color: 11720357 priority: -16114 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34040,13 +34118,13 @@ cont { element { scale: 16 area { - color: 12311978 + color: 11720357 priority: -16115 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -34055,13 +34133,13 @@ cont { element { scale: 17 area { - color: 12311978 + color: 11720357 priority: -16116 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -34070,13 +34148,13 @@ cont { element { scale: 18 area { - color: 12311978 + color: 11720357 priority: -16117 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -34085,13 +34163,13 @@ cont { element { scale: 19 area { - color: 12311978 + color: 11720357 priority: -16118 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -34103,48 +34181,48 @@ cont { element { scale: 10 area { - color: 12311978 + color: 11720357 priority: -16119 } } element { scale: 11 area { - color: 12311978 + color: 11720357 priority: -16120 } } element { scale: 12 area { - color: 12311978 + color: 11720357 priority: -16121 } } element { scale: 13 area { - color: 12311978 + color: 11720357 priority: -16122 } } element { scale: 14 area { - color: 12311978 + color: 11720357 priority: -16123 } } element { scale: 15 area { - color: 12311978 + color: 11720357 priority: -16124 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34152,13 +34230,13 @@ cont { element { scale: 16 area { - color: 12311978 + color: 11720357 priority: -16125 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -34167,13 +34245,13 @@ cont { element { scale: 17 area { - color: 12311978 + color: 11720357 priority: -16126 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -34182,13 +34260,13 @@ cont { element { scale: 18 area { - color: 12311978 + color: 11720357 priority: -16127 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -34197,13 +34275,13 @@ cont { element { scale: 19 area { - color: 12311978 + color: 11720357 priority: -16128 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -34215,13 +34293,13 @@ cont { element { scale: 15 area { - color: 15658734 + color: 14803429 priority: -15988 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15012 } @@ -34229,13 +34307,13 @@ cont { element { scale: 16 area { - color: 15658734 + color: 14803429 priority: -15988 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15012 } @@ -34243,13 +34321,13 @@ cont { element { scale: 17 area { - color: 15658734 + color: 14803429 priority: -15988 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15012 } @@ -34257,13 +34335,13 @@ cont { element { scale: 18 area { - color: 15658734 + color: 14803429 priority: -15988 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15012 } @@ -34271,13 +34349,13 @@ cont { element { scale: 19 area { - color: 15658734 + color: 14803429 priority: -15988 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15012 } @@ -34288,34 +34366,34 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16129 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16130 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16131 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16132 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34323,13 +34401,13 @@ cont { element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16133 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34337,13 +34415,13 @@ cont { element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16134 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34351,13 +34429,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16135 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34365,13 +34443,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16136 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34409,7 +34487,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34423,7 +34501,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34437,7 +34515,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34451,7 +34529,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34465,7 +34543,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34478,7 +34556,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34488,7 +34566,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34498,7 +34576,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34508,7 +34586,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34518,7 +34596,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34556,7 +34634,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34570,7 +34648,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34584,7 +34662,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34598,7 +34676,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34612,7 +34690,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34623,27 +34701,27 @@ cont { element { scale: 13 area { - color: 15654263 + color: 15326578 priority: -15997 } } element { scale: 14 area { - color: 15654263 + color: 15326578 priority: -15997 } } element { scale: 15 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34651,13 +34729,13 @@ cont { element { scale: 16 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34665,13 +34743,13 @@ cont { element { scale: 17 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34679,13 +34757,13 @@ cont { element { scale: 18 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34693,13 +34771,13 @@ cont { element { scale: 19 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34710,34 +34788,34 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16137 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16138 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16139 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16140 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34745,13 +34823,13 @@ cont { element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16141 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34759,13 +34837,13 @@ cont { element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16142 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34773,13 +34851,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16143 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34787,13 +34865,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16144 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34804,34 +34882,34 @@ cont { element { scale: 12 area { - color: 14540117 + color: 13684816 priority: -15982 } } element { scale: 13 area { - color: 14540117 + color: 13684816 priority: -15982 } } element { scale: 14 area { - color: 14540117 + color: 13684816 priority: -15982 } } element { scale: 15 area { - color: 14540117 + color: 13684816 priority: -15982 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15018 } @@ -34839,13 +34917,13 @@ cont { element { scale: 16 area { - color: 14540117 + color: 13684816 priority: -15982 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15018 } @@ -34853,13 +34931,13 @@ cont { element { scale: 17 area { - color: 14540117 + color: 13684816 priority: -15982 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15018 } @@ -34867,13 +34945,13 @@ cont { element { scale: 18 area { - color: 14540117 + color: 13684816 priority: -15982 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15018 } @@ -34881,13 +34959,13 @@ cont { element { scale: 19 area { - color: 14540117 + color: 13684816 priority: -15982 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15018 } @@ -34900,7 +34978,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34910,7 +34988,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34920,7 +34998,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34930,7 +35008,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34940,7 +35018,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -34958,27 +35036,27 @@ cont { element { scale: 13 area { - color: 15654263 + color: 15326578 priority: -15997 } } element { scale: 14 area { - color: 15654263 + color: 15326578 priority: -15997 } } element { scale: 15 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -34986,13 +35064,13 @@ cont { element { scale: 16 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35000,13 +35078,13 @@ cont { element { scale: 17 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35014,13 +35092,13 @@ cont { element { scale: 18 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35028,13 +35106,13 @@ cont { element { scale: 19 area { - color: 15654263 + color: 15326578 priority: -15997 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35072,7 +35150,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35086,7 +35164,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35100,7 +35178,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35114,7 +35192,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35128,7 +35206,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15003 } @@ -35139,34 +35217,34 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16145 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16146 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16147 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16148 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35174,13 +35252,13 @@ cont { element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16149 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35188,13 +35266,13 @@ cont { element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16150 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35202,13 +35280,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16151 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35216,13 +35294,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16152 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35233,34 +35311,34 @@ cont { element { scale: 12 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 13 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 14 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 15 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -35268,13 +35346,13 @@ cont { element { scale: 16 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -35282,13 +35360,13 @@ cont { element { scale: 17 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -35296,13 +35374,13 @@ cont { element { scale: 18 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -35310,13 +35388,13 @@ cont { element { scale: 19 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -35327,34 +35405,34 @@ cont { element { scale: 12 area { - color: 15658717 + color: 15591634 priority: -16706 } } element { scale: 13 area { - color: 15658717 + color: 15591634 priority: -16706 } } element { scale: 14 area { - color: 15658717 + color: 15591634 priority: -16706 } } element { scale: 15 area { - color: 15658717 + color: 15591634 priority: -16706 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14994 } @@ -35362,13 +35440,13 @@ cont { element { scale: 16 area { - color: 15658717 + color: 15591634 priority: -16706 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14994 } @@ -35376,13 +35454,13 @@ cont { element { scale: 17 area { - color: 15658717 + color: 15591634 priority: -16706 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14994 } @@ -35390,13 +35468,13 @@ cont { element { scale: 18 area { - color: 15658717 + color: 15591634 priority: -16706 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14994 } @@ -35404,13 +35482,13 @@ cont { element { scale: 19 area { - color: 15658717 + color: 15591634 priority: -16706 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14994 } @@ -35448,7 +35526,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35462,7 +35540,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35476,7 +35554,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35490,7 +35568,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35504,7 +35582,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35542,7 +35620,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35556,7 +35634,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35570,7 +35648,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35584,7 +35662,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35598,7 +35676,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 14997 } @@ -35609,34 +35687,34 @@ cont { element { scale: 12 area { - color: 16772846 + color: 16313580 priority: -15991 } } element { scale: 13 area { - color: 16772846 + color: 16313580 priority: -15991 } } element { scale: 14 area { - color: 16772846 + color: 16313580 priority: -15991 } } element { scale: 15 area { - color: 16772846 + color: 16313580 priority: -15991 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15009 } @@ -35644,13 +35722,13 @@ cont { element { scale: 16 area { - color: 16772846 + color: 16313580 priority: -15991 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15009 } @@ -35658,13 +35736,13 @@ cont { element { scale: 17 area { - color: 16772846 + color: 16313580 priority: -15991 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15009 } @@ -35672,13 +35750,13 @@ cont { element { scale: 18 area { - color: 16772846 + color: 16313580 priority: -15991 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15009 } @@ -35686,13 +35764,13 @@ cont { element { scale: 19 area { - color: 16772846 + color: 16313580 priority: -15991 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15009 } @@ -35705,7 +35783,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35715,7 +35793,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35725,7 +35803,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35735,7 +35813,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35745,7 +35823,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35756,34 +35834,34 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16153 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16154 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16155 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16156 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35791,13 +35869,13 @@ cont { element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16157 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35805,13 +35883,13 @@ cont { element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16158 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35819,13 +35897,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16159 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35833,13 +35911,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16160 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -35850,27 +35928,27 @@ cont { element { scale: 13 area { - color: 14544605 + color: 13757137 priority: -15994 } } element { scale: 14 area { - color: 14544605 + color: 13757137 priority: -15994 } } element { scale: 15 area { - color: 14544605 + color: 13757137 priority: -15994 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -35878,13 +35956,13 @@ cont { element { scale: 16 area { - color: 14544605 + color: 13757137 priority: -15994 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -35892,13 +35970,13 @@ cont { element { scale: 17 area { - color: 14544605 + color: 13757137 priority: -15994 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -35906,13 +35984,13 @@ cont { element { scale: 18 area { - color: 14544605 + color: 13757137 priority: -15994 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -35920,13 +35998,13 @@ cont { element { scale: 19 area { - color: 14544605 + color: 13757137 priority: -15994 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15006 } @@ -35937,56 +36015,56 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16161 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16162 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16163 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16164 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16165 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16166 } } element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16167 } } element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16168 } } @@ -35996,56 +36074,56 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16169 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16170 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16171 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16172 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16173 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16174 } } element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16175 } } element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16176 } } @@ -36055,42 +36133,42 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16177 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16178 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16179 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16180 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16181 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16182 } symbol { @@ -36101,7 +36179,7 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16183 } symbol { @@ -36112,7 +36190,7 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16184 } symbol { @@ -36126,53 +36204,53 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16185 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16186 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16187 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16188 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16189 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16190 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } secondary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36183,18 +36261,18 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16191 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } secondary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36205,18 +36283,18 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16192 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } secondary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36230,42 +36308,42 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16193 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16194 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16195 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16196 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16197 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16198 } symbol { @@ -36276,7 +36354,7 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16199 } symbol { @@ -36287,7 +36365,7 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16200 } symbol { @@ -36339,38 +36417,38 @@ cont { element { scale: 10 area { - color: 13430459 + color: 13626551 priority: -16201 } } element { scale: 11 area { - color: 13430459 + color: 13626551 priority: -16202 } } element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16203 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16204 } caption { primary { height: 12 - color: 5614080 + color: 6072320 } secondary { height: 11 - color: 5614080 + color: 6072320 offset_y: 20 text: "int_name" } @@ -36380,17 +36458,17 @@ cont { element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16205 } caption { primary { height: 12 - color: 5614080 + color: 6072320 } secondary { height: 11 - color: 5614080 + color: 6072320 offset_y: 20 text: "int_name" } @@ -36400,18 +36478,18 @@ cont { element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16206 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36422,18 +36500,18 @@ cont { element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16207 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36444,18 +36522,18 @@ cont { element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16208 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36466,18 +36544,18 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16209 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36488,18 +36566,18 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16210 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36513,38 +36591,38 @@ cont { element { scale: 10 area { - color: 13430459 + color: 13626551 priority: -16211 } } element { scale: 11 area { - color: 13430459 + color: 13626551 priority: -16212 } } element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16213 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16214 } caption { primary { height: 12 - color: 5614080 + color: 6072320 } secondary { height: 11 - color: 5614080 + color: 6072320 offset_y: 20 text: "int_name" } @@ -36554,17 +36632,17 @@ cont { element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16215 } caption { primary { height: 12 - color: 5614080 + color: 6072320 } secondary { height: 11 - color: 5614080 + color: 6072320 offset_y: 20 text: "int_name" } @@ -36574,18 +36652,18 @@ cont { element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16216 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36596,18 +36674,18 @@ cont { element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16217 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36618,18 +36696,18 @@ cont { element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16218 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36640,18 +36718,18 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16219 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36662,18 +36740,18 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16220 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36687,38 +36765,38 @@ cont { element { scale: 10 area { - color: 13430459 + color: 13626551 priority: -16221 } } element { scale: 11 area { - color: 13430459 + color: 13626551 priority: -16222 } } element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16223 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16224 } caption { primary { height: 12 - color: 5614080 + color: 6072320 } secondary { height: 11 - color: 5614080 + color: 6072320 offset_y: 20 text: "int_name" } @@ -36728,17 +36806,17 @@ cont { element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16225 } caption { primary { height: 12 - color: 5614080 + color: 6072320 } secondary { height: 11 - color: 5614080 + color: 6072320 offset_y: 20 text: "int_name" } @@ -36748,18 +36826,18 @@ cont { element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16226 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36770,18 +36848,18 @@ cont { element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16227 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36792,18 +36870,18 @@ cont { element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16228 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36814,18 +36892,18 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16229 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36836,18 +36914,18 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16230 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36861,38 +36939,38 @@ cont { element { scale: 10 area { - color: 13430459 + color: 13626551 priority: -16231 } } element { scale: 11 area { - color: 13430459 + color: 13626551 priority: -16232 } } element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16233 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16234 } caption { primary { height: 12 - color: 5614080 + color: 6072320 } secondary { height: 11 - color: 5614080 + color: 6072320 offset_y: 20 text: "int_name" } @@ -36902,17 +36980,17 @@ cont { element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16235 } caption { primary { height: 12 - color: 5614080 + color: 6072320 } secondary { height: 11 - color: 5614080 + color: 6072320 offset_y: 20 text: "int_name" } @@ -36922,18 +37000,18 @@ cont { element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16236 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36944,18 +37022,18 @@ cont { element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16237 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36966,18 +37044,18 @@ cont { element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16238 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -36988,18 +37066,18 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16239 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -37010,18 +37088,18 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16240 } caption { primary { height: 12 - color: 5614080 + color: 6072320 stroke_color: 16777215 } secondary { height: 11 - color: 5614080 + color: 6072320 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -37035,56 +37113,56 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16241 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16242 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16243 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16244 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16245 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16246 } } element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16247 } } element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16248 } } @@ -37094,42 +37172,42 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16249 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16250 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16251 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16252 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16253 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16254 } symbol { @@ -37140,7 +37218,7 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16255 } symbol { @@ -37151,7 +37229,7 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16256 } symbol { @@ -37165,42 +37243,42 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16257 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16258 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16259 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16260 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16261 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16262 } symbol { @@ -37211,7 +37289,7 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16263 } symbol { @@ -37222,7 +37300,7 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16264 } symbol { @@ -37236,42 +37314,42 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16265 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16266 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16267 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16268 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16269 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -16270 } symbol { @@ -37282,7 +37360,7 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -16271 } symbol { @@ -37293,7 +37371,7 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -16272 } symbol { @@ -37307,35 +37385,35 @@ cont { element { scale: 13 area { - color: 14531481 + color: 14529176 priority: -16273 } } element { scale: 14 area { - color: 14531481 + color: 14529176 priority: -16274 } } element { scale: 15 area { - color: 14531481 + color: 14529176 priority: -16275 } } element { scale: 16 area { - color: 14531481 + color: 14529176 priority: -16276 } } element { scale: 17 area { - color: 14531481 + color: 14529176 priority: -16277 } symbol { @@ -37346,7 +37424,7 @@ cont { element { scale: 18 area { - color: 14531481 + color: 14529176 priority: -16278 } symbol { @@ -37357,7 +37435,7 @@ cont { element { scale: 19 area { - color: 14531481 + color: 14529176 priority: -16279 } symbol { @@ -37371,34 +37449,34 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16280 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16281 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16282 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16283 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -37406,13 +37484,13 @@ cont { element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16284 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -37420,13 +37498,13 @@ cont { element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16285 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -37434,13 +37512,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16286 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -37448,13 +37526,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16287 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -37489,48 +37567,48 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16288 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16289 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16290 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16291 } } element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16292 } } element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16293 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -37539,13 +37617,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16294 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -37554,13 +37632,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16295 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -37572,48 +37650,48 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16296 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16297 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16298 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16299 } } element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16300 } } element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16301 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -37622,13 +37700,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16302 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -37637,13 +37715,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16303 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 } priority: 15000 @@ -37655,49 +37733,49 @@ cont { element { scale: 13 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 14 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 15 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 16 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 17 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 18 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 19 area { - color: 10079453 + color: 9487572 priority: -15906 } } @@ -37707,56 +37785,56 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16304 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16305 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16306 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16307 } } element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16308 } } element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16309 } } element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16310 } } element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16311 } } @@ -37767,7 +37845,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37777,7 +37855,7 @@ cont { scale: 14 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37787,7 +37865,7 @@ cont { scale: 15 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37797,7 +37875,7 @@ cont { scale: 16 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37807,7 +37885,7 @@ cont { scale: 17 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37817,7 +37895,7 @@ cont { scale: 18 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37827,7 +37905,7 @@ cont { scale: 19 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37840,7 +37918,7 @@ cont { scale: 15 lines { width: 2.0 - color: 7829367 + color: 7368816 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37850,7 +37928,7 @@ cont { scale: 16 lines { width: 4.0 - color: 7829367 + color: 7368816 priority: 1788 join: ROUNDJOIN cap: ROUNDCAP @@ -37860,7 +37938,7 @@ cont { scale: 17 lines { width: 6.4 - color: 7829367 + color: 7368816 priority: 1847 join: ROUNDJOIN cap: ROUNDCAP @@ -37870,7 +37948,7 @@ cont { scale: 18 lines { width: 6.4 - color: 7829367 + color: 7368816 priority: 1847 join: ROUNDJOIN cap: ROUNDCAP @@ -37880,7 +37958,7 @@ cont { scale: 19 lines { width: 6.4 - color: 7829367 + color: 7368816 priority: 1847 join: ROUNDJOIN cap: ROUNDCAP @@ -37920,7 +37998,7 @@ cont { scale: 12 lines { width: 1.0 - color: 16772846 + color: 15855336 priority: 1174 join: ROUNDJOIN cap: BUTTCAP @@ -37930,7 +38008,7 @@ cont { scale: 13 lines { width: 2.0 - color: 16772846 + color: 15855336 priority: 1174 join: ROUNDJOIN cap: BUTTCAP @@ -37940,7 +38018,7 @@ cont { scale: 14 lines { width: 4.0 - color: 16772846 + color: 15855336 priority: 1262 join: ROUNDJOIN cap: BUTTCAP @@ -37950,7 +38028,7 @@ cont { scale: 15 lines { width: 5.0 - color: 16772846 + color: 15855336 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37960,7 +38038,7 @@ cont { scale: 16 lines { width: 5.0 - color: 16772846 + color: 15855336 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -37970,7 +38048,7 @@ cont { scale: 17 lines { width: 6.0 - color: 16772846 + color: 15855336 priority: 1266 join: ROUNDJOIN cap: ROUNDCAP @@ -37980,7 +38058,7 @@ cont { scale: 18 lines { width: 6.0 - color: 16772846 + color: 15855336 priority: 1266 join: ROUNDJOIN cap: ROUNDCAP @@ -37990,7 +38068,7 @@ cont { scale: 19 lines { width: 6.0 - color: 16772846 + color: 15855336 priority: 1266 join: ROUNDJOIN cap: ROUNDCAP @@ -38027,20 +38105,20 @@ cont { scale: 14 lines { width: 0.1 - color: 14540253 + color: 13684944 priority: 1461 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.6 - color: 15658734 + color: 15000804 priority: 1464 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 16772846 + color: 15855336 priority: 1462 } } @@ -38048,20 +38126,20 @@ cont { scale: 15 lines { width: 1.6 - color: 14540253 + color: 13684944 priority: 1620 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.2 - color: 15658734 + color: 15000804 priority: 1623 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 16772846 + color: 15855336 priority: 1621 } } @@ -38069,27 +38147,27 @@ cont { scale: 16 lines { width: 0.4 - color: 14540253 + color: 13684944 priority: 1792 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.4 - color: 15658734 + color: 15000804 priority: 1795 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 3.2 - color: 14540253 + color: 13684944 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 16772846 + color: 15855336 priority: 1793 } } @@ -38097,27 +38175,27 @@ cont { scale: 17 lines { width: 0.4 - color: 14540253 + color: 13684944 priority: 1850 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.4 - color: 15658734 + color: 15000804 priority: 1856 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 3.2 - color: 14540253 + color: 13684944 priority: 1853 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 16772846 + color: 15855336 priority: 1851 } } @@ -38125,27 +38203,27 @@ cont { scale: 18 lines { width: 0.4 - color: 14540253 + color: 13684944 priority: 1850 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.4 - color: 15658734 + color: 15000804 priority: 1856 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 3.2 - color: 14540253 + color: 13684944 priority: 1853 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 16772846 + color: 15855336 priority: 1851 } } @@ -38153,27 +38231,27 @@ cont { scale: 19 lines { width: 0.4 - color: 14540253 + color: 13684944 priority: 1850 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.4 - color: 15658734 + color: 15000804 priority: 1856 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 3.2 - color: 14540253 + color: 13684944 priority: 1853 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 16772846 + color: 15855336 priority: 1851 } } @@ -38191,7 +38269,7 @@ cont { } lines { width: 0.8 - color: 11184810 + color: 10526880 dashdot { dd: 1.2 dd: 2.0 @@ -38216,7 +38294,7 @@ cont { } lines { width: 0.8 - color: 11184810 + color: 10526880 dashdot { dd: 1.2 dd: 2.0 @@ -38241,7 +38319,7 @@ cont { } lines { width: 0.8 - color: 11184810 + color: 10526880 dashdot { dd: 1.2 dd: 2.0 @@ -38266,7 +38344,7 @@ cont { } lines { width: 0.8 - color: 11184810 + color: 10526880 dashdot { dd: 1.2 dd: 2.0 @@ -38298,7 +38376,7 @@ cont { } lines { width: 0.8 - color: 11184810 + color: 10526880 dashdot { dd: 1.2 dd: 2.0 @@ -38316,7 +38394,7 @@ cont { scale: 17 lines { width: 0.8 - color: 2158668458 + color: 2158010528 dashdot { dd: 8.0 dd: 4.0 @@ -38327,7 +38405,7 @@ cont { } lines { width: 0.8 - color: 11184810 + color: 10526880 dashdot { dd: 1.2 dd: 2.0 @@ -38345,7 +38423,7 @@ cont { scale: 18 lines { width: 0.8 - color: 2158668458 + color: 2158010528 dashdot { dd: 8.0 dd: 4.0 @@ -38356,7 +38434,7 @@ cont { } lines { width: 0.8 - color: 11184810 + color: 10526880 dashdot { dd: 1.2 dd: 2.0 @@ -38374,7 +38452,7 @@ cont { scale: 19 lines { width: 0.8 - color: 2158668458 + color: 2158010528 dashdot { dd: 8.0 dd: 4.0 @@ -38385,7 +38463,7 @@ cont { } lines { width: 0.8 - color: 11184810 + color: 10526880 dashdot { dd: 1.2 dd: 2.0 @@ -38405,56 +38483,56 @@ cont { element { scale: 12 area { - color: 15658734 + color: 15000804 priority: -16312 } } element { scale: 13 area { - color: 15658734 + color: 15000804 priority: -16313 } } element { scale: 14 area { - color: 15658734 + color: 15000804 priority: -16314 } } element { scale: 15 area { - color: 15658734 + color: 15000804 priority: -16315 } } element { scale: 16 area { - color: 15658734 + color: 15000804 priority: -16316 } } element { scale: 17 area { - color: 15658734 + color: 15000804 priority: -16317 } } element { scale: 18 area { - color: 15658734 + color: 15000804 priority: -16318 } } element { scale: 19 area { - color: 15658734 + color: 15000804 priority: -16319 } } @@ -38489,7 +38567,7 @@ cont { scale: 12 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 1.0 @@ -38503,7 +38581,7 @@ cont { scale: 13 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 1.0 @@ -38517,7 +38595,7 @@ cont { scale: 14 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 1.0 @@ -38531,7 +38609,7 @@ cont { scale: 15 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 1.0 @@ -38545,7 +38623,7 @@ cont { scale: 16 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 1.0 @@ -38559,7 +38637,7 @@ cont { scale: 17 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 1.0 @@ -38573,7 +38651,7 @@ cont { scale: 18 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 1.0 @@ -38587,7 +38665,7 @@ cont { scale: 19 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 1.0 @@ -38898,7 +38976,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -38913,7 +38991,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -38928,7 +39006,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -38943,7 +39021,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -38958,7 +39036,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -38973,7 +39051,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -38988,7 +39066,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -39000,13 +39078,13 @@ cont { element { scale: 14 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -39014,13 +39092,13 @@ cont { element { scale: 15 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -39028,13 +39106,13 @@ cont { element { scale: 16 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -39042,13 +39120,13 @@ cont { element { scale: 17 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -39056,13 +39134,13 @@ cont { element { scale: 18 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -39070,13 +39148,13 @@ cont { element { scale: 19 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15094 } @@ -39093,7 +39171,7 @@ cont { caption { primary { height: 11 - color: 2236962 + color: 2105376 stroke_color: 15649877 } priority: 15000 @@ -39108,7 +39186,7 @@ cont { caption { primary { height: 11 - color: 2236962 + color: 2105376 stroke_color: 15649877 } priority: 15000 @@ -39123,7 +39201,7 @@ cont { caption { primary { height: 11 - color: 2236962 + color: 2105376 stroke_color: 15649877 } priority: 15000 @@ -39138,7 +39216,7 @@ cont { caption { primary { height: 11 - color: 2236962 + color: 2105376 stroke_color: 15649877 } priority: 15000 @@ -39153,7 +39231,7 @@ cont { caption { primary { height: 11 - color: 2236962 + color: 2105376 stroke_color: 15649877 } priority: 15000 @@ -39168,7 +39246,7 @@ cont { caption { primary { height: 11 - color: 2236962 + color: 2105376 stroke_color: 15649877 } priority: 15000 @@ -39182,7 +39260,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39193,7 +39271,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39204,7 +39282,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39215,7 +39293,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39226,7 +39304,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39237,7 +39315,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39255,7 +39333,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39270,7 +39348,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39285,7 +39363,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39300,7 +39378,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39315,7 +39393,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39330,7 +39408,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -39342,140 +39420,140 @@ cont { element { scale: 0 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 1 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 2 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 3 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 4 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 5 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 6 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 7 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 8 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 9 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 10 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 11 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 12 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 13 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 14 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 15 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 16 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 17 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 18 area { - color: 10079453 + color: 9487572 priority: -16712 } } element { scale: 19 area { - color: 10079453 + color: 9487572 priority: -16712 } } @@ -39628,34 +39706,34 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16346 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16347 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16348 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16349 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -39663,13 +39741,13 @@ cont { element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16350 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -39677,13 +39755,13 @@ cont { element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16351 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -39691,13 +39769,13 @@ cont { element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16352 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -39705,13 +39783,13 @@ cont { element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16353 } caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -39722,56 +39800,56 @@ cont { element { scale: 12 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 13 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 14 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 15 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 16 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 17 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 18 area { - color: 16777181 + color: 16316632 priority: -15994 } } element { scale: 19 area { - color: 16777181 + color: 16316632 priority: -15994 } } @@ -39781,90 +39859,90 @@ cont { element { scale: 0 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 1 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 2 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 3 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 4 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 5 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 6 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 7 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 8 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 9 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 10 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 11 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -39872,13 +39950,13 @@ cont { element { scale: 12 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -39886,13 +39964,13 @@ cont { element { scale: 13 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -39900,13 +39978,13 @@ cont { element { scale: 14 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -39914,13 +39992,13 @@ cont { element { scale: 15 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -39928,13 +40006,13 @@ cont { element { scale: 16 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -39942,13 +40020,13 @@ cont { element { scale: 17 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -39956,13 +40034,13 @@ cont { element { scale: 18 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -39970,13 +40048,13 @@ cont { element { scale: 19 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -40090,7 +40168,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40100,7 +40178,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40110,7 +40188,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40120,7 +40198,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40130,7 +40208,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40143,7 +40221,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40153,7 +40231,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40163,7 +40241,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40173,7 +40251,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40183,7 +40261,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40207,7 +40285,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40222,7 +40300,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40237,7 +40315,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40252,7 +40330,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40267,7 +40345,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40282,7 +40360,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40297,7 +40375,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40309,97 +40387,97 @@ cont { element { scale: 0 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 1 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 2 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 3 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 4 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 5 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 6 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 7 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 8 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 9 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 10 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 11 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 12 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -40407,13 +40485,13 @@ cont { element { scale: 13 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -40421,13 +40499,13 @@ cont { element { scale: 14 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601245 + color: 5271760 } priority: 15094 } @@ -40435,35 +40513,35 @@ cont { element { scale: 15 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 16 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 17 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 18 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 19 area { - color: 10079453 + color: 9487572 priority: -15906 } } @@ -40486,7 +40564,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40501,7 +40579,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40516,7 +40594,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40531,7 +40609,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40546,7 +40624,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40561,7 +40639,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40576,7 +40654,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 offset_y: 10 } priority: 15000 @@ -40590,7 +40668,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40600,7 +40678,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40610,7 +40688,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40620,7 +40698,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40630,7 +40708,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40641,56 +40719,56 @@ cont { element { scale: 12 area { - color: 14544588 + color: 13691076 priority: -16354 } } element { scale: 13 area { - color: 14544588 + color: 13691076 priority: -16355 } } element { scale: 14 area { - color: 14544588 + color: 13691076 priority: -16356 } } element { scale: 15 area { - color: 14544588 + color: 13691076 priority: -16357 } } element { scale: 16 area { - color: 14544588 + color: 13691076 priority: -16358 } } element { scale: 17 area { - color: 14544588 + color: 13691076 priority: -16359 } } element { scale: 18 area { - color: 14544588 + color: 13691076 priority: -16360 } } element { scale: 19 area { - color: 14544588 + color: 13691076 priority: -16361 } } @@ -40701,7 +40779,7 @@ cont { scale: 14 lines { width: 4.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -40709,7 +40787,7 @@ cont { caption { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 15000 } @@ -40718,7 +40796,7 @@ cont { scale: 15 lines { width: 5.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -40726,7 +40804,7 @@ cont { caption { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 15000 } @@ -40735,7 +40813,7 @@ cont { scale: 16 lines { width: 8.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -40743,7 +40821,7 @@ cont { caption { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 15000 } @@ -40752,7 +40830,7 @@ cont { scale: 17 lines { width: 16.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -40760,7 +40838,7 @@ cont { caption { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 15000 } @@ -40769,7 +40847,7 @@ cont { scale: 18 lines { width: 16.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -40777,7 +40855,7 @@ cont { caption { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 15000 } @@ -40786,7 +40864,7 @@ cont { scale: 19 lines { width: 16.0 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -40794,7 +40872,7 @@ cont { caption { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 15000 } @@ -40897,7 +40975,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40907,7 +40985,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40917,7 +40995,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40927,7 +41005,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40937,7 +41015,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -40968,7 +41046,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -40983,7 +41061,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -40998,7 +41076,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -41013,7 +41091,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -41028,7 +41106,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -41043,7 +41121,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 offset_y: 10 } priority: 15000 @@ -41055,90 +41133,90 @@ cont { element { scale: 0 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 1 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 2 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 3 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 4 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 5 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 6 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 7 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 8 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 9 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 10 area { - color: 10079453 + color: 9487572 priority: -15906 } } element { scale: 11 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 10 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41146,13 +41224,13 @@ cont { element { scale: 12 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 10 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41160,13 +41238,13 @@ cont { element { scale: 13 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 10 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41174,13 +41252,13 @@ cont { element { scale: 14 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 11 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41188,13 +41266,13 @@ cont { element { scale: 15 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41202,13 +41280,13 @@ cont { element { scale: 16 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41216,13 +41294,13 @@ cont { element { scale: 17 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41230,13 +41308,13 @@ cont { element { scale: 18 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41244,13 +41322,13 @@ cont { element { scale: 19 area { - color: 10079453 + color: 9487572 priority: -15906 } caption { primary { height: 16 - color: 5601262 + color: 5274858 } priority: 15094 } @@ -41360,42 +41438,42 @@ cont { element { scale: 14 area { - color: 11193531 + color: 10535864 priority: -16362 } } element { scale: 15 area { - color: 11193531 + color: 10535864 priority: -16363 } } element { scale: 16 area { - color: 11193531 + color: 10535864 priority: -16364 } } element { scale: 17 area { - color: 11193531 + color: 10535864 priority: -16365 } } element { scale: 18 area { - color: 11193531 + color: 10535864 priority: -16366 } } element { scale: 19 area { - color: 11193531 + color: 10535864 priority: -16367 } } @@ -41405,56 +41483,56 @@ cont { element { scale: 12 area { - color: 11193531 + color: 10535864 priority: -16368 } } element { scale: 13 area { - color: 11193531 + color: 10535864 priority: -16369 } } element { scale: 14 area { - color: 11193531 + color: 10535864 priority: -16370 } } element { scale: 15 area { - color: 11193531 + color: 10535864 priority: -16371 } } element { scale: 16 area { - color: 11193531 + color: 10535864 priority: -16372 } } element { scale: 17 area { - color: 11193531 + color: 10535864 priority: -16373 } } element { scale: 18 area { - color: 11193531 + color: 10535864 priority: -16374 } } element { scale: 19 area { - color: 11193531 + color: 10535864 priority: -16375 } } @@ -41464,48 +41542,48 @@ cont { element { scale: 10 area { - color: 12311978 + color: 11720357 priority: -16376 } } element { scale: 11 area { - color: 12311978 + color: 11720357 priority: -16377 } } element { scale: 12 area { - color: 12311978 + color: 11720357 priority: -16378 } } element { scale: 13 area { - color: 12311978 + color: 11720357 priority: -16379 } } element { scale: 14 area { - color: 12311978 + color: 11720357 priority: -16380 } } element { scale: 15 area { - color: 12311978 + color: 11720357 priority: -16381 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -41513,13 +41591,13 @@ cont { element { scale: 16 area { - color: 12311978 + color: 11720357 priority: -16382 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41528,13 +41606,13 @@ cont { element { scale: 17 area { - color: 12311978 + color: 11720357 priority: -16383 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41543,13 +41621,13 @@ cont { element { scale: 18 area { - color: 12311978 + color: 11720357 priority: -16384 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41558,13 +41636,13 @@ cont { element { scale: 19 area { - color: 12311978 + color: 11720357 priority: -16385 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41576,48 +41654,48 @@ cont { element { scale: 10 area { - color: 12311978 + color: 11720357 priority: -16386 } } element { scale: 11 area { - color: 12311978 + color: 11720357 priority: -16387 } } element { scale: 12 area { - color: 12311978 + color: 11720357 priority: -16388 } } element { scale: 13 area { - color: 12311978 + color: 11720357 priority: -16389 } } element { scale: 14 area { - color: 12311978 + color: 11720357 priority: -16390 } } element { scale: 15 area { - color: 12311978 + color: 11720357 priority: -16391 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -41625,13 +41703,13 @@ cont { element { scale: 16 area { - color: 12311978 + color: 11720357 priority: -16392 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41640,13 +41718,13 @@ cont { element { scale: 17 area { - color: 12311978 + color: 11720357 priority: -16393 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41655,13 +41733,13 @@ cont { element { scale: 18 area { - color: 12311978 + color: 11720357 priority: -16394 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41670,13 +41748,13 @@ cont { element { scale: 19 area { - color: 12311978 + color: 11720357 priority: -16395 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41688,48 +41766,48 @@ cont { element { scale: 10 area { - color: 12311978 + color: 11720357 priority: -16396 } } element { scale: 11 area { - color: 12311978 + color: 11720357 priority: -16397 } } element { scale: 12 area { - color: 12311978 + color: 11720357 priority: -16398 } } element { scale: 13 area { - color: 12311978 + color: 11720357 priority: -16399 } } element { scale: 14 area { - color: 12311978 + color: 11720357 priority: -16400 } } element { scale: 15 area { - color: 12311978 + color: 11720357 priority: -16401 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -41737,13 +41815,13 @@ cont { element { scale: 16 area { - color: 12311978 + color: 11720357 priority: -16402 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41752,13 +41830,13 @@ cont { element { scale: 17 area { - color: 12311978 + color: 11720357 priority: -16403 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41767,13 +41845,13 @@ cont { element { scale: 18 area { - color: 12311978 + color: 11720357 priority: -16404 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41782,13 +41860,13 @@ cont { element { scale: 19 area { - color: 12311978 + color: 11720357 priority: -16405 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41800,48 +41878,48 @@ cont { element { scale: 10 area { - color: 12311978 + color: 11720357 priority: -16406 } } element { scale: 11 area { - color: 12311978 + color: 11720357 priority: -16407 } } element { scale: 12 area { - color: 12311978 + color: 11720357 priority: -16408 } } element { scale: 13 area { - color: 12311978 + color: 11720357 priority: -16409 } } element { scale: 14 area { - color: 12311978 + color: 11720357 priority: -16410 } } element { scale: 15 area { - color: 12311978 + color: 11720357 priority: -16411 } caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -41849,13 +41927,13 @@ cont { element { scale: 16 area { - color: 12311978 + color: 11720357 priority: -16412 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41864,13 +41942,13 @@ cont { element { scale: 17 area { - color: 12311978 + color: 11720357 priority: -16413 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41879,13 +41957,13 @@ cont { element { scale: 18 area { - color: 12311978 + color: 11720357 priority: -16414 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41894,13 +41972,13 @@ cont { element { scale: 19 area { - color: 12311978 + color: 11720357 priority: -16415 } caption { primary { height: 16 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -41914,7 +41992,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -41926,7 +42004,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -41938,7 +42016,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -41953,7 +42031,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -41965,7 +42043,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -41977,7 +42055,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -41992,7 +42070,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42004,7 +42082,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42016,7 +42094,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42031,7 +42109,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42043,7 +42121,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42055,7 +42133,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42070,7 +42148,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42082,7 +42160,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42094,7 +42172,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42109,7 +42187,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42121,7 +42199,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42133,7 +42211,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -42147,14 +42225,14 @@ cont { scale: 14 lines { width: 0.4 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 20.0 @@ -42168,14 +42246,14 @@ cont { scale: 15 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42189,14 +42267,14 @@ cont { scale: 16 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42210,14 +42288,14 @@ cont { scale: 17 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42231,14 +42309,14 @@ cont { scale: 18 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42252,14 +42330,14 @@ cont { scale: 19 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42276,7 +42354,7 @@ cont { scale: 15 lines { width: 1.6 - color: 1118481 + color: 1052688 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42286,7 +42364,7 @@ cont { scale: 16 lines { width: 3.2 - color: 1118481 + color: 1052688 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42296,7 +42374,7 @@ cont { scale: 17 lines { width: 6.4 - color: 1118481 + color: 1052688 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42306,7 +42384,7 @@ cont { scale: 18 lines { width: 6.4 - color: 1118481 + color: 1052688 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42316,7 +42394,7 @@ cont { scale: 19 lines { width: 6.4 - color: 1118481 + color: 1052688 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42329,7 +42407,7 @@ cont { scale: 14 lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 20.0 @@ -42340,7 +42418,7 @@ cont { } lines { width: 0.4 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42350,14 +42428,14 @@ cont { scale: 15 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42371,14 +42449,14 @@ cont { scale: 16 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42392,14 +42470,14 @@ cont { scale: 17 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42413,14 +42491,14 @@ cont { scale: 18 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42434,14 +42512,14 @@ cont { scale: 19 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42458,7 +42536,7 @@ cont { scale: 15 lines { width: 1.0 - color: 14540236 + color: 14211268 dashdot { dd: 2.0 dd: 2.0 @@ -42472,7 +42550,7 @@ cont { scale: 16 lines { width: 2.0 - color: 14540236 + color: 14211268 dashdot { dd: 4.0 dd: 4.0 @@ -42486,7 +42564,7 @@ cont { scale: 17 lines { width: 4.0 - color: 14540236 + color: 14211268 dashdot { dd: 8.0 dd: 8.0 @@ -42500,7 +42578,7 @@ cont { scale: 18 lines { width: 4.0 - color: 14540236 + color: 14211268 dashdot { dd: 8.0 dd: 8.0 @@ -42514,7 +42592,7 @@ cont { scale: 19 lines { width: 4.0 - color: 14540236 + color: 14211268 dashdot { dd: 8.0 dd: 8.0 @@ -42531,14 +42609,14 @@ cont { scale: 14 lines { width: 0.4 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 20.0 @@ -42552,14 +42630,14 @@ cont { scale: 15 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42573,14 +42651,14 @@ cont { scale: 16 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42594,14 +42672,14 @@ cont { scale: 17 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42615,14 +42693,14 @@ cont { scale: 18 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42636,14 +42714,14 @@ cont { scale: 19 lines { width: 0.8 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 8.0 - color: 2236962 + color: 2105376 dashdot { dd: 1.0 dd: 40.0 @@ -42660,7 +42738,7 @@ cont { scale: 13 lines { width: 2.5 - color: 5592405 + color: 5263440 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42670,7 +42748,7 @@ cont { scale: 14 lines { width: 5.0 - color: 5592405 + color: 5263440 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42680,7 +42758,7 @@ cont { scale: 15 lines { width: 5.0 - color: 5592405 + color: 5263440 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42690,7 +42768,7 @@ cont { scale: 16 lines { width: 5.0 - color: 5592405 + color: 5263440 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42700,7 +42778,7 @@ cont { scale: 17 lines { width: 5.0 - color: 5592405 + color: 5263440 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42710,7 +42788,7 @@ cont { scale: 18 lines { width: 5.0 - color: 5592405 + color: 5263440 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42720,7 +42798,7 @@ cont { scale: 19 lines { width: 5.0 - color: 5592405 + color: 5263440 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42733,7 +42811,7 @@ cont { scale: 13 lines { width: 2.5 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42743,7 +42821,7 @@ cont { scale: 14 lines { width: 5.0 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42753,7 +42831,7 @@ cont { scale: 15 lines { width: 5.0 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42763,7 +42841,7 @@ cont { scale: 16 lines { width: 5.0 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42773,7 +42851,7 @@ cont { scale: 17 lines { width: 5.0 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42783,7 +42861,7 @@ cont { scale: 18 lines { width: 5.0 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42793,7 +42871,7 @@ cont { scale: 19 lines { width: 5.0 - color: 2236962 + color: 2105376 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42879,7 +42957,7 @@ cont { scale: 13 lines { width: 2.5 - color: 16746496 + color: 16154634 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42889,7 +42967,7 @@ cont { scale: 14 lines { width: 5.0 - color: 16746496 + color: 16154634 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42899,7 +42977,7 @@ cont { scale: 15 lines { width: 5.0 - color: 16746496 + color: 16154634 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42909,7 +42987,7 @@ cont { scale: 16 lines { width: 5.0 - color: 16746496 + color: 16154634 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42919,7 +42997,7 @@ cont { scale: 17 lines { width: 5.0 - color: 16746496 + color: 16154634 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42929,7 +43007,7 @@ cont { scale: 18 lines { width: 5.0 - color: 16746496 + color: 16154634 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42939,7 +43017,7 @@ cont { scale: 19 lines { width: 5.0 - color: 16746496 + color: 16154634 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42952,7 +43030,7 @@ cont { scale: 13 lines { width: 2.5 - color: 16768256 + color: 16178442 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42962,7 +43040,7 @@ cont { scale: 14 lines { width: 5.0 - color: 16768256 + color: 16178442 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42972,7 +43050,7 @@ cont { scale: 15 lines { width: 5.0 - color: 16768256 + color: 16178442 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42982,7 +43060,7 @@ cont { scale: 16 lines { width: 5.0 - color: 16768256 + color: 16178442 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -42992,7 +43070,7 @@ cont { scale: 17 lines { width: 5.0 - color: 16768256 + color: 16178442 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43002,7 +43080,7 @@ cont { scale: 18 lines { width: 5.0 - color: 16768256 + color: 16178442 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43012,7 +43090,7 @@ cont { scale: 19 lines { width: 5.0 - color: 16768256 + color: 16178442 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43025,7 +43103,7 @@ cont { scale: 13 lines { width: 2.5 - color: 16729156 + color: 16728128 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43035,7 +43113,7 @@ cont { scale: 14 lines { width: 5.0 - color: 16729156 + color: 16728128 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43045,7 +43123,7 @@ cont { scale: 15 lines { width: 5.0 - color: 16729156 + color: 16728128 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43055,7 +43133,7 @@ cont { scale: 16 lines { width: 5.0 - color: 16729156 + color: 16728128 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43065,7 +43143,7 @@ cont { scale: 17 lines { width: 5.0 - color: 16729156 + color: 16728128 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43075,7 +43153,7 @@ cont { scale: 18 lines { width: 5.0 - color: 16729156 + color: 16728128 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43085,7 +43163,7 @@ cont { scale: 19 lines { width: 5.0 - color: 16729156 + color: 16728128 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43098,7 +43176,7 @@ cont { scale: 13 lines { width: 2.5 - color: 4521796 + color: 4259648 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43108,7 +43186,7 @@ cont { scale: 14 lines { width: 5.0 - color: 4521796 + color: 4259648 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43118,7 +43196,7 @@ cont { scale: 15 lines { width: 5.0 - color: 4521796 + color: 4259648 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43128,7 +43206,7 @@ cont { scale: 16 lines { width: 5.0 - color: 4521796 + color: 4259648 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43138,7 +43216,7 @@ cont { scale: 17 lines { width: 5.0 - color: 4521796 + color: 4259648 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43148,7 +43226,7 @@ cont { scale: 18 lines { width: 5.0 - color: 4521796 + color: 4259648 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43158,7 +43236,7 @@ cont { scale: 19 lines { width: 5.0 - color: 4521796 + color: 4259648 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43171,7 +43249,7 @@ cont { scale: 13 lines { width: 0.5 - color: 13369344 + color: 12582912 dashdot { dd: 1.5 dd: 1.0 @@ -43185,7 +43263,7 @@ cont { scale: 14 lines { width: 1.0 - color: 13369344 + color: 12582912 dashdot { dd: 3.0 dd: 1.0 @@ -43199,7 +43277,7 @@ cont { scale: 15 lines { width: 2.0 - color: 13369344 + color: 12582912 dashdot { dd: 6.0 dd: 1.0 @@ -43213,7 +43291,7 @@ cont { scale: 16 lines { width: 2.0 - color: 13369344 + color: 12582912 dashdot { dd: 6.0 dd: 1.0 @@ -43227,7 +43305,7 @@ cont { scale: 17 lines { width: 2.0 - color: 13369344 + color: 12582912 dashdot { dd: 6.0 dd: 1.0 @@ -43241,7 +43319,7 @@ cont { scale: 18 lines { width: 2.0 - color: 13369344 + color: 12582912 dashdot { dd: 6.0 dd: 1.0 @@ -43255,7 +43333,7 @@ cont { scale: 19 lines { width: 2.0 - color: 13369344 + color: 12582912 dashdot { dd: 6.0 dd: 1.0 @@ -43272,7 +43350,7 @@ cont { scale: 13 lines { width: 1.25 - color: 16772829 + color: 15786204 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43282,7 +43360,7 @@ cont { scale: 14 lines { width: 2.5 - color: 16772829 + color: 15786204 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43292,7 +43370,7 @@ cont { scale: 15 lines { width: 5.0 - color: 16772829 + color: 15786204 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43302,7 +43380,7 @@ cont { scale: 16 lines { width: 10.0 - color: 16772829 + color: 15786204 priority: 1773 join: ROUNDJOIN cap: ROUNDCAP @@ -43312,7 +43390,7 @@ cont { scale: 17 lines { width: 20.0 - color: 16772829 + color: 15786204 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43322,7 +43400,7 @@ cont { scale: 18 lines { width: 20.0 - color: 16772829 + color: 15786204 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43332,7 +43410,7 @@ cont { scale: 19 lines { width: 20.0 - color: 16772829 + color: 15786204 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -43346,12 +43424,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43364,12 +43442,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43382,12 +43460,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43400,12 +43478,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43418,12 +43496,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43436,12 +43514,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43454,12 +43532,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -43472,12 +43550,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43490,12 +43568,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43508,12 +43586,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43529,12 +43607,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43547,12 +43625,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43565,12 +43643,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43583,12 +43661,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43601,12 +43679,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43619,12 +43697,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43637,12 +43715,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -43655,12 +43733,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43673,12 +43751,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43691,12 +43769,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43712,12 +43790,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43730,12 +43808,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43748,12 +43826,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43766,12 +43844,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43784,12 +43862,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43802,12 +43880,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43820,12 +43898,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -43838,12 +43916,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43856,12 +43934,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43874,12 +43952,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43895,12 +43973,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43913,12 +43991,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43931,12 +44009,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43949,12 +44027,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43967,12 +44045,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -43985,12 +44063,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44003,12 +44081,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -44021,12 +44099,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44039,12 +44117,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44057,12 +44135,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44078,12 +44156,12 @@ cont { caption { primary { height: 11 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 10 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44096,12 +44174,12 @@ cont { caption { primary { height: 12 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 11 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44114,12 +44192,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44132,12 +44210,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44150,12 +44228,12 @@ cont { caption { primary { height: 16 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44168,12 +44246,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44186,12 +44264,12 @@ cont { caption { primary { height: 18 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44204,12 +44282,12 @@ cont { caption { primary { height: 18 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44222,12 +44300,12 @@ cont { caption { primary { height: 22 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44240,12 +44318,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 18 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44258,12 +44336,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44276,12 +44354,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44297,12 +44375,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44315,12 +44393,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44333,12 +44411,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44351,12 +44429,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44369,12 +44447,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44387,12 +44465,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44405,12 +44483,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -44423,12 +44501,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44441,12 +44519,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44459,12 +44537,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44480,12 +44558,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44498,12 +44576,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44516,12 +44594,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44534,12 +44612,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44552,12 +44630,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44570,12 +44648,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44588,12 +44666,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -44606,12 +44684,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44624,12 +44702,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44642,12 +44720,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44663,12 +44741,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44681,12 +44759,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44699,12 +44777,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44717,12 +44795,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44735,12 +44813,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44753,12 +44831,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44771,12 +44849,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -44789,12 +44867,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44807,12 +44885,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44825,12 +44903,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44846,12 +44924,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44864,12 +44942,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44882,12 +44960,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44900,12 +44978,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44918,12 +44996,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44936,12 +45014,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44954,12 +45032,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -44972,12 +45050,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -44990,12 +45068,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45008,12 +45086,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45029,12 +45107,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45047,12 +45125,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45065,12 +45143,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45083,12 +45161,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45101,12 +45179,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45119,12 +45197,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45137,12 +45215,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -45155,12 +45233,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45173,12 +45251,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45191,12 +45269,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45212,12 +45290,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45230,12 +45308,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45248,12 +45326,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45266,12 +45344,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45284,12 +45362,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45302,12 +45380,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45320,12 +45398,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -45338,12 +45416,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45356,12 +45434,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45374,12 +45452,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45395,12 +45473,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 11 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45413,12 +45491,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45431,12 +45509,12 @@ cont { caption { primary { height: 14 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45449,12 +45527,12 @@ cont { caption { primary { height: 17 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45467,12 +45545,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45485,12 +45563,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45503,12 +45581,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -45521,12 +45599,12 @@ cont { caption { primary { height: 20 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45539,12 +45617,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45557,12 +45635,12 @@ cont { caption { primary { height: 22 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 16 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45578,7 +45656,7 @@ cont { caption { primary { height: 18 - color: 7829367 + color: 7368816 } priority: 15000 } @@ -45588,7 +45666,7 @@ cont { caption { primary { height: 18 - color: 7829367 + color: 7368816 } priority: 15000 } @@ -45598,7 +45676,7 @@ cont { caption { primary { height: 18 - color: 7829367 + color: 7368816 } priority: 15000 } @@ -45611,11 +45689,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 7368816 } secondary { height: 12 - color: 6710886 + color: 6316128 offset_y: 20 text: "int_name" } @@ -45627,12 +45705,12 @@ cont { caption { primary { height: 14 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45645,12 +45723,12 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -45663,11 +45741,11 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 8421504 } secondary { height: 12 - color: 11184793 + color: 10526864 offset_y: 20 text: "int_name" } @@ -45679,11 +45757,11 @@ cont { caption { primary { height: 26 - color: 10066312 + color: 9474176 } secondary { height: 14 - color: 11184793 + color: 10526864 text: "int_name" } priority: 15000 @@ -45694,11 +45772,11 @@ cont { caption { primary { height: 28 - color: 11184793 + color: 10526864 } secondary { height: 14 - color: 12303274 + color: 11579552 offset_y: 20 text: "int_name" } @@ -45710,11 +45788,11 @@ cont { caption { primary { height: 28 - color: 11184793 + color: 10526864 } secondary { height: 14 - color: 12303274 + color: 11579552 offset_y: 20 text: "int_name" } @@ -45729,7 +45807,7 @@ cont { caption { primary { height: 14 - color: 11184810 + color: 10526880 } priority: 15000 } @@ -45739,7 +45817,7 @@ cont { caption { primary { height: 14 - color: 11184810 + color: 10526880 stroke_color: 15658717 } priority: 15000 @@ -45750,7 +45828,7 @@ cont { caption { primary { height: 16 - color: 11184793 + color: 10526864 stroke_color: 15658717 } priority: 15000 @@ -45761,7 +45839,7 @@ cont { caption { primary { height: 16 - color: 11184793 + color: 10526864 stroke_color: 15658717 } priority: 15000 @@ -45775,7 +45853,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -45785,7 +45863,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45795,7 +45873,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45805,7 +45883,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45815,7 +45893,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45825,7 +45903,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45838,7 +45916,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45848,7 +45926,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45856,13 +45934,13 @@ cont { element { scale: 14 area { - color: 14540236 + color: 14539465 priority: -16416 } caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45870,13 +45948,13 @@ cont { element { scale: 15 area { - color: 14540236 + color: 14539465 priority: -16417 } caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45884,13 +45962,13 @@ cont { element { scale: 16 area { - color: 14540236 + color: 14539465 priority: -16418 } caption { primary { height: 16 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45898,13 +45976,13 @@ cont { element { scale: 17 area { - color: 14540236 + color: 14539465 priority: -16419 } caption { primary { height: 16 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45912,13 +45990,13 @@ cont { element { scale: 18 area { - color: 14540236 + color: 14539465 priority: -16420 } caption { primary { height: 16 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45926,13 +46004,13 @@ cont { element { scale: 19 area { - color: 14540236 + color: 14539465 priority: -16421 } caption { primary { height: 16 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -45945,7 +46023,7 @@ cont { caption { primary { height: 12 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -45955,7 +46033,7 @@ cont { caption { primary { height: 12 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -45965,7 +46043,7 @@ cont { caption { primary { height: 12 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -45975,7 +46053,7 @@ cont { caption { primary { height: 12 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -45985,7 +46063,7 @@ cont { caption { primary { height: 12 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -45995,7 +46073,7 @@ cont { caption { primary { height: 16 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -46005,7 +46083,7 @@ cont { caption { primary { height: 16 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -46015,7 +46093,7 @@ cont { caption { primary { height: 16 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -46025,7 +46103,7 @@ cont { caption { primary { height: 16 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -46035,7 +46113,7 @@ cont { caption { primary { height: 16 - color: 5592405 + color: 5263440 } priority: 15000 } @@ -46048,7 +46126,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -46058,7 +46136,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -46068,7 +46146,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -46078,7 +46156,7 @@ cont { caption { primary { height: 16 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -46088,7 +46166,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -46098,7 +46176,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -46108,7 +46186,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 } priority: 15000 } @@ -46121,12 +46199,12 @@ cont { caption { primary { height: 16 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -46139,7 +46217,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46149,7 +46227,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46159,7 +46237,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46172,11 +46250,11 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } secondary { height: 12 - color: 10066329 + color: 9474192 offset_y: 20 text: "int_name" } @@ -46188,12 +46266,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -46206,12 +46284,12 @@ cont { caption { primary { height: 16 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -46224,7 +46302,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46234,7 +46312,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46244,7 +46322,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46257,11 +46335,11 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } secondary { height: 12 - color: 10066329 + color: 9474192 offset_y: 20 text: "int_name" } @@ -46273,12 +46351,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -46291,12 +46369,12 @@ cont { caption { primary { height: 16 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 16777215 offset_y: 20 text: "int_name" @@ -46309,7 +46387,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46319,7 +46397,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46329,7 +46407,7 @@ cont { caption { primary { height: 16 - color: 4473924 + color: 4210752 } priority: 15000 } @@ -46342,7 +46420,7 @@ cont { caption { primary { height: 12 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46352,7 +46430,7 @@ cont { caption { primary { height: 12 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46362,7 +46440,7 @@ cont { caption { primary { height: 12 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46372,7 +46450,7 @@ cont { caption { primary { height: 12 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46382,7 +46460,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46392,7 +46470,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46402,7 +46480,7 @@ cont { caption { primary { height: 16 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46412,7 +46490,7 @@ cont { caption { primary { height: 16 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46422,7 +46500,7 @@ cont { caption { primary { height: 16 - color: 4495803 + color: 5217717 } priority: 14997 } @@ -46435,7 +46513,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -46445,7 +46523,7 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 } priority: 15000 } @@ -46458,7 +46536,7 @@ cont { caption { primary { height: 10 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46468,7 +46546,7 @@ cont { caption { primary { height: 10 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46478,7 +46556,7 @@ cont { caption { primary { height: 12 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46488,7 +46566,7 @@ cont { caption { primary { height: 12 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46498,7 +46576,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46508,7 +46586,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46518,7 +46596,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46528,7 +46606,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46538,7 +46616,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46548,7 +46626,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46558,7 +46636,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46568,7 +46646,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46578,7 +46656,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46588,7 +46666,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46598,7 +46676,7 @@ cont { caption { primary { height: 14 - color: 4495803 + color: 5217717 } priority: 15000 } @@ -46611,7 +46689,7 @@ cont { caption { primary { height: 12 - color: 13421755 + color: 12632240 } priority: 14988 } @@ -46621,7 +46699,7 @@ cont { caption { primary { height: 13 - color: 13421755 + color: 12632240 } priority: 14988 } @@ -46631,7 +46709,7 @@ cont { caption { primary { height: 14 - color: 13421755 + color: 12632240 } priority: 14988 } @@ -46641,7 +46719,7 @@ cont { caption { primary { height: 14 - color: 12303274 + color: 11579560 stroke_color: 15658717 } priority: 14988 @@ -46652,7 +46730,7 @@ cont { caption { primary { height: 14 - color: 13421755 + color: 12632240 stroke_color: 15658717 } priority: 14988 @@ -46666,7 +46744,7 @@ cont { caption { primary { height: 12 - color: 13421755 + color: 12632240 } priority: 14988 } @@ -46676,7 +46754,7 @@ cont { caption { primary { height: 13 - color: 13421755 + color: 12632240 } priority: 14988 } @@ -46686,7 +46764,7 @@ cont { caption { primary { height: 14 - color: 13421755 + color: 12632240 } priority: 14988 } @@ -46696,7 +46774,7 @@ cont { caption { primary { height: 14 - color: 12303274 + color: 11579560 stroke_color: 15658717 } priority: 14988 @@ -46707,7 +46785,7 @@ cont { caption { primary { height: 14 - color: 13421755 + color: 12632240 stroke_color: 15658717 } priority: 14988 @@ -46721,11 +46799,11 @@ cont { caption { primary { height: 12 - color: 10066329 + color: 9474192 } secondary { height: 12 - color: 11184810 + color: 10526880 offset_y: 20 text: "int_name" } @@ -46737,11 +46815,11 @@ cont { caption { primary { height: 14 - color: 10066329 + color: 9474192 } secondary { height: 12 - color: 11184810 + color: 10526880 offset_y: 20 text: "int_name" } @@ -46753,11 +46831,11 @@ cont { caption { primary { height: 18 - color: 10066329 + color: 9474192 } secondary { height: 12 - color: 11184810 + color: 10526880 offset_y: 20 text: "int_name" } @@ -46769,11 +46847,11 @@ cont { caption { primary { height: 18 - color: 10066329 + color: 9474192 } secondary { height: 12 - color: 11184810 + color: 10526880 offset_y: 20 text: "int_name" } @@ -46785,11 +46863,11 @@ cont { caption { primary { height: 18 - color: 10066329 + color: 9474192 } secondary { height: 12 - color: 11184810 + color: 10526880 offset_y: 20 text: "int_name" } @@ -46801,11 +46879,11 @@ cont { caption { primary { height: 20 - color: 10066329 + color: 9474192 } secondary { height: 14 - color: 11184810 + color: 10526880 offset_y: 20 text: "int_name" } @@ -46817,11 +46895,11 @@ cont { caption { primary { height: 20 - color: 10066329 + color: 9474192 } secondary { height: 14 - color: 11184810 + color: 10526880 offset_y: 20 text: "int_name" } @@ -46833,11 +46911,11 @@ cont { caption { primary { height: 20 - color: 10066329 + color: 9474192 } secondary { height: 14 - color: 11184810 + color: 10526880 offset_y: 20 text: "int_name" } @@ -46852,7 +46930,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 7368816 } priority: 15000 } @@ -46862,12 +46940,12 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -46880,12 +46958,12 @@ cont { caption { primary { height: 16 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -46898,12 +46976,12 @@ cont { caption { primary { height: 16 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -46916,12 +46994,12 @@ cont { caption { primary { height: 18 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -46934,12 +47012,12 @@ cont { caption { primary { height: 20 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 12 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -46952,12 +47030,12 @@ cont { caption { primary { height: 22 - color: 5592405 + color: 5263440 stroke_color: 15658717 } secondary { height: 14 - color: 8947848 + color: 8421504 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -46971,20 +47049,20 @@ cont { element { scale: 11 area { - color: 14540236 + color: 14539465 priority: -16422 } } element { scale: 12 area { - color: 14540236 + color: 14539465 priority: -16423 } caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } priority: 15000 @@ -46993,18 +47071,18 @@ cont { element { scale: 13 area { - color: 14540236 + color: 14539465 priority: -16424 } caption { primary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 } secondary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -47015,18 +47093,18 @@ cont { element { scale: 14 area { - color: 14540236 + color: 14539465 priority: -16425 } caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 15658717 } secondary { height: 12 - color: 6710886 + color: 6316128 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -47037,18 +47115,18 @@ cont { element { scale: 15 area { - color: 14540236 + color: 14539465 priority: -16426 } caption { primary { height: 16 - color: 7829367 + color: 7368816 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -47059,18 +47137,18 @@ cont { element { scale: 16 area { - color: 14540236 + color: 14539465 priority: -16427 } caption { primary { height: 16 - color: 7829367 + color: 7368816 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -47081,18 +47159,18 @@ cont { element { scale: 17 area { - color: 14540236 + color: 14539465 priority: -16428 } caption { primary { height: 18 - color: 7829367 + color: 7368816 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -47103,18 +47181,18 @@ cont { element { scale: 18 area { - color: 14540236 + color: 14539465 priority: -16429 } caption { primary { height: 18 - color: 7829367 + color: 7368816 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -47125,18 +47203,18 @@ cont { element { scale: 19 area { - color: 14540236 + color: 14539465 priority: -16430 } caption { primary { height: 18 - color: 7829367 + color: 7368816 stroke_color: 15658717 } secondary { height: 12 - color: 10066329 + color: 9474192 stroke_color: 15658717 offset_y: 20 text: "int_name" @@ -47150,7 +47228,7 @@ cont { element { scale: 14 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47161,7 +47239,7 @@ cont { element { scale: 15 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47172,7 +47250,7 @@ cont { element { scale: 16 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47183,7 +47261,7 @@ cont { element { scale: 17 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47194,7 +47272,7 @@ cont { element { scale: 18 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47205,7 +47283,7 @@ cont { element { scale: 19 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47219,7 +47297,7 @@ cont { element { scale: 14 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47230,7 +47308,7 @@ cont { element { scale: 15 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47241,7 +47319,7 @@ cont { element { scale: 16 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47252,7 +47330,7 @@ cont { element { scale: 17 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47263,7 +47341,7 @@ cont { element { scale: 18 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47274,7 +47352,7 @@ cont { element { scale: 19 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47288,7 +47366,7 @@ cont { element { scale: 14 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47299,7 +47377,7 @@ cont { element { scale: 15 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47310,7 +47388,7 @@ cont { element { scale: 16 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47321,7 +47399,7 @@ cont { element { scale: 17 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47332,7 +47410,7 @@ cont { element { scale: 18 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47343,7 +47421,7 @@ cont { element { scale: 19 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47357,7 +47435,7 @@ cont { element { scale: 14 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47368,7 +47446,7 @@ cont { element { scale: 15 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47379,7 +47457,7 @@ cont { element { scale: 16 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47390,7 +47468,7 @@ cont { element { scale: 17 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47401,7 +47479,7 @@ cont { element { scale: 18 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47412,7 +47490,7 @@ cont { element { scale: 19 area { - color: 12303291 + color: 12500670 priority: 1001 } symbol { @@ -47434,7 +47512,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47455,7 +47533,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47476,7 +47554,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47497,7 +47575,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47518,7 +47596,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47539,7 +47617,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47556,7 +47634,7 @@ cont { scale: 16 lines { width: 0.8 - color: 2156431496 + color: 2155905152 dashdot { dd: 2.4 dd: 4.0 @@ -47569,7 +47647,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47583,7 +47661,7 @@ cont { scale: 17 lines { width: 0.8 - color: 2156431496 + color: 2155905152 dashdot { dd: 2.4 dd: 4.0 @@ -47596,7 +47674,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47610,7 +47688,7 @@ cont { scale: 18 lines { width: 0.8 - color: 2156431496 + color: 2155905152 dashdot { dd: 2.4 dd: 4.0 @@ -47623,7 +47701,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47637,7 +47715,7 @@ cont { scale: 19 lines { width: 0.8 - color: 2156431496 + color: 2155905152 dashdot { dd: 2.4 dd: 4.0 @@ -47650,7 +47728,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 16.0 dd: 8.0 @@ -47674,7 +47752,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 8.0 dd: 4.0 @@ -47685,7 +47763,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 1.2 dd: 2.0 @@ -47710,7 +47788,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 8.0 dd: 4.0 @@ -47721,7 +47799,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 1.2 dd: 2.0 @@ -47746,7 +47824,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 8.0 dd: 4.0 @@ -47757,7 +47835,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 1.2 dd: 2.0 @@ -47782,7 +47860,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 8.0 dd: 4.0 @@ -47793,7 +47871,7 @@ cont { } lines { width: 0.8 - color: 8947848 + color: 8421504 dashdot { dd: 1.2 dd: 2.0 @@ -47844,42 +47922,42 @@ cont { element { scale: 14 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 15 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 16 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 17 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 18 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 19 area { - color: 12303291 + color: 12500670 priority: 1001 } } @@ -47889,42 +47967,42 @@ cont { element { scale: 14 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 15 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 16 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 17 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 18 area { - color: 12303291 + color: 12500670 priority: 1001 } } element { scale: 19 area { - color: 12303291 + color: 12500670 priority: 1001 } } @@ -48025,7 +48103,7 @@ cont { scale: 12 lines { width: 0.25 - color: 3015424955 + color: 3014832818 priority: 1214 join: ROUNDJOIN cap: ROUNDCAP @@ -48035,7 +48113,7 @@ cont { scale: 13 lines { width: 0.55 - color: 3015424955 + color: 3014832818 priority: 1232 join: ROUNDJOIN cap: ROUNDCAP @@ -48045,14 +48123,14 @@ cont { scale: 14 lines { width: 1.6 - color: 2579217339 + color: 2578625202 priority: 1186 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 4.5 dd: 4.5 @@ -48073,14 +48151,14 @@ cont { scale: 15 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1278 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 9.0 dd: 9.0 @@ -48101,14 +48179,14 @@ cont { scale: 16 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1510 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.4 - color: 2579217339 + color: 2578625202 dashdot { dd: 12.0 dd: 12.0 @@ -48129,14 +48207,14 @@ cont { scale: 17 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1547 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 12.0 dd: 12.0 @@ -48157,14 +48235,14 @@ cont { scale: 18 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1547 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 12.0 dd: 12.0 @@ -48185,14 +48263,14 @@ cont { scale: 19 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1547 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 12.0 dd: 12.0 @@ -48216,7 +48294,7 @@ cont { scale: 12 lines { width: 0.25 - color: 3015424955 + color: 3014832818 priority: 1214 join: ROUNDJOIN cap: ROUNDCAP @@ -48226,7 +48304,7 @@ cont { scale: 13 lines { width: 0.55 - color: 3015424955 + color: 3014832818 priority: 1232 join: ROUNDJOIN cap: ROUNDCAP @@ -48236,14 +48314,14 @@ cont { scale: 14 lines { width: 1.6 - color: 2579217339 + color: 2578625202 priority: 1186 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 4.5 dd: 4.5 @@ -48264,7 +48342,7 @@ cont { scale: 15 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1278 join: ROUNDJOIN cap: ROUNDCAP @@ -48278,7 +48356,7 @@ cont { } lines { width: 2.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 9.0 dd: 9.0 @@ -48296,7 +48374,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -48306,7 +48384,7 @@ cont { scale: 16 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1510 join: ROUNDJOIN cap: ROUNDCAP @@ -48320,7 +48398,7 @@ cont { } lines { width: 2.4 - color: 2579217339 + color: 2578625202 dashdot { dd: 12.0 dd: 12.0 @@ -48338,7 +48416,7 @@ cont { } lines { width: 12.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -48348,7 +48426,7 @@ cont { scale: 17 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1547 join: ROUNDJOIN cap: ROUNDCAP @@ -48362,7 +48440,7 @@ cont { } lines { width: 2.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 12.0 dd: 12.0 @@ -48380,7 +48458,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -48390,7 +48468,7 @@ cont { scale: 18 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1547 join: ROUNDJOIN cap: ROUNDCAP @@ -48404,7 +48482,7 @@ cont { } lines { width: 2.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 12.0 dd: 12.0 @@ -48422,7 +48500,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -48432,7 +48510,7 @@ cont { scale: 19 lines { width: 3.2 - color: 2579217339 + color: 2578625202 priority: 1547 join: ROUNDJOIN cap: ROUNDCAP @@ -48446,7 +48524,7 @@ cont { } lines { width: 2.0 - color: 2579217339 + color: 2578625202 dashdot { dd: 12.0 dd: 12.0 @@ -48464,7 +48542,7 @@ cont { } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -48508,7 +48586,7 @@ cont { scale: 12 lines { width: 0.5 - color: 2156431496 + color: 2155905152 priority: 1211 join: ROUNDJOIN cap: ROUNDCAP @@ -48518,7 +48596,7 @@ cont { scale: 13 lines { width: 0.85 - color: 2156431496 + color: 2155905152 priority: 1229 join: ROUNDJOIN cap: ROUNDCAP @@ -48528,14 +48606,14 @@ cont { scale: 14 lines { width: 1.6 - color: 1300793480 + color: 1300267136 priority: 1183 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 1300793480 + color: 1300267136 dashdot { dd: 4.5 dd: 4.5 @@ -48546,7 +48624,7 @@ cont { } lines { width: 1.0 - color: 1308622847 + color: 1307767538 priority: 1269 join: ROUNDJOIN cap: ROUNDCAP @@ -48556,14 +48634,14 @@ cont { scale: 15 lines { width: 3.2 - color: 1300793480 + color: 1300267136 priority: 1275 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 1300793480 + color: 1300267136 dashdot { dd: 9.0 dd: 9.0 @@ -48574,7 +48652,7 @@ cont { } lines { width: 2.0 - color: 1308622847 + color: 1307767538 priority: 1348 join: ROUNDJOIN cap: ROUNDCAP @@ -48584,14 +48662,14 @@ cont { scale: 16 lines { width: 3.2 - color: 1300793480 + color: 1300267136 priority: 1504 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.4 - color: 1300793480 + color: 1300267136 dashdot { dd: 12.0 dd: 12.0 @@ -48602,7 +48680,7 @@ cont { } lines { width: 2.4 - color: 1308622847 + color: 1307767538 priority: 1608 join: ROUNDJOIN cap: ROUNDCAP @@ -48612,14 +48690,14 @@ cont { scale: 17 lines { width: 3.2 - color: 1300793480 + color: 1300267136 priority: 1544 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 1300793480 + color: 1300267136 dashdot { dd: 12.0 dd: 12.0 @@ -48630,7 +48708,7 @@ cont { } lines { width: 2.0 - color: 1308622847 + color: 1307767538 priority: 1675 join: ROUNDJOIN cap: ROUNDCAP @@ -48640,14 +48718,14 @@ cont { scale: 18 lines { width: 3.2 - color: 1300793480 + color: 1300267136 priority: 1544 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 1300793480 + color: 1300267136 dashdot { dd: 12.0 dd: 12.0 @@ -48658,7 +48736,7 @@ cont { } lines { width: 2.0 - color: 1308622847 + color: 1307767538 priority: 1675 join: ROUNDJOIN cap: ROUNDCAP @@ -48668,14 +48746,14 @@ cont { scale: 19 lines { width: 3.2 - color: 1300793480 + color: 1300267136 priority: 1544 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 1300793480 + color: 1300267136 dashdot { dd: 12.0 dd: 12.0 @@ -48686,7 +48764,7 @@ cont { } lines { width: 2.0 - color: 1308622847 + color: 1307767538 priority: 1675 join: ROUNDJOIN cap: ROUNDCAP @@ -48699,7 +48777,7 @@ cont { scale: 12 lines { width: 1.0 - color: 11184810 + color: 10526880 priority: 1226 join: ROUNDJOIN cap: ROUNDCAP @@ -48709,7 +48787,7 @@ cont { scale: 13 lines { width: 1.0 - color: 11184810 + color: 10526880 priority: 1247 join: ROUNDJOIN cap: ROUNDCAP @@ -48719,21 +48797,21 @@ cont { scale: 14 lines { width: 2.4 - color: 5570560 + color: 5835017 priority: 1198 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.4 - color: 5570560 + color: 5835017 priority: 1324 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 15645627 + color: 15120311 dashdot { dd: 3.6 dd: 5.4 @@ -48747,21 +48825,21 @@ cont { scale: 15 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1296 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.5 - color: 4456448 + color: 4984591 priority: 1400 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 7.2 dd: 10.8 @@ -48775,21 +48853,21 @@ cont { scale: 16 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1519 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.6 - color: 4456448 + color: 4984591 priority: 1663 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -48803,21 +48881,21 @@ cont { scale: 17 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -48831,21 +48909,21 @@ cont { scale: 18 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -48859,21 +48937,21 @@ cont { scale: 19 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -48890,7 +48968,7 @@ cont { scale: 12 lines { width: 1.0 - color: 11184810 + color: 10526880 priority: 1226 join: ROUNDJOIN cap: ROUNDCAP @@ -48900,7 +48978,7 @@ cont { scale: 13 lines { width: 1.0 - color: 11184810 + color: 10526880 priority: 1247 join: ROUNDJOIN cap: ROUNDCAP @@ -48910,21 +48988,21 @@ cont { scale: 14 lines { width: 2.4 - color: 5570560 + color: 5835017 priority: 1198 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.4 - color: 5570560 + color: 5835017 priority: 1324 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 15645627 + color: 15120311 dashdot { dd: 3.6 dd: 5.4 @@ -48938,7 +49016,7 @@ cont { scale: 15 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1296 join: ROUNDJOIN cap: ROUNDCAP @@ -48952,14 +49030,14 @@ cont { } lines { width: 0.5 - color: 4456448 + color: 4984591 priority: 1400 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 7.2 dd: 10.8 @@ -48970,7 +49048,7 @@ cont { } lines { width: 10.5 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -48980,7 +49058,7 @@ cont { scale: 16 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1519 join: ROUNDJOIN cap: ROUNDCAP @@ -48994,14 +49072,14 @@ cont { } lines { width: 0.6 - color: 4456448 + color: 4984591 priority: 1663 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -49012,7 +49090,7 @@ cont { } lines { width: 10.6 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -49022,7 +49100,7 @@ cont { scale: 17 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP @@ -49036,14 +49114,14 @@ cont { } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -49054,7 +49132,7 @@ cont { } lines { width: 10.64 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -49064,7 +49142,7 @@ cont { scale: 18 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP @@ -49078,14 +49156,14 @@ cont { } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -49096,7 +49174,7 @@ cont { } lines { width: 10.64 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -49106,7 +49184,7 @@ cont { scale: 19 lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP @@ -49120,14 +49198,14 @@ cont { } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -49138,7 +49216,7 @@ cont { } lines { width: 10.64 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -49151,7 +49229,7 @@ cont { scale: 12 lines { width: 1.0 - color: 11184810 + color: 10526880 priority: 1226 join: ROUNDJOIN cap: ROUNDCAP @@ -49161,7 +49239,7 @@ cont { scale: 13 lines { width: 1.0 - color: 11184810 + color: 10526880 priority: 1247 join: ROUNDJOIN cap: ROUNDCAP @@ -49171,21 +49249,21 @@ cont { scale: 14 lines { width: 2.4 - color: 5570560 + color: 5835017 priority: 1198 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.4 - color: 5570560 + color: 5835017 priority: 1324 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 15645627 + color: 15120311 dashdot { dd: 3.6 dd: 5.4 @@ -49206,21 +49284,21 @@ cont { } lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1296 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.5 - color: 4456448 + color: 4984591 priority: 1400 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 7.2 dd: 10.8 @@ -49231,7 +49309,7 @@ cont { } lines { width: 10.5 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -49252,21 +49330,21 @@ cont { } lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1519 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.6 - color: 4456448 + color: 4984591 priority: 1663 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -49277,7 +49355,7 @@ cont { } lines { width: 10.6 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -49298,21 +49376,21 @@ cont { } lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -49323,7 +49401,7 @@ cont { } lines { width: 10.64 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -49344,21 +49422,21 @@ cont { } lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -49369,7 +49447,7 @@ cont { } lines { width: 10.64 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -49390,21 +49468,21 @@ cont { } lines { width: 3.2 - color: 4456448 + color: 4984591 priority: 1568 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 0.64 - color: 4456448 + color: 4984591 priority: 1755 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 15645627 + color: 15120311 dashdot { dd: 9.6 dd: 14.4 @@ -49415,7 +49493,7 @@ cont { } lines { width: 10.64 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -49444,7 +49522,7 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } @@ -49460,7 +49538,7 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } @@ -49476,7 +49554,7 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } @@ -49492,7 +49570,7 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } @@ -49508,7 +49586,7 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } @@ -49553,7 +49631,7 @@ cont { scale: 12 lines { width: 1.0 - color: 10083737 + color: 9490576 priority: 1697 join: ROUNDJOIN cap: ROUNDCAP @@ -49563,7 +49641,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10083737 + color: 9490576 priority: 1752 join: ROUNDJOIN cap: ROUNDCAP @@ -49573,14 +49651,14 @@ cont { scale: 14 lines { width: 2.4 - color: 21760 + color: 612617 priority: 1697 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 21760 + color: 612617 dashdot { dd: 3.8 dd: 5.4 @@ -49591,7 +49669,7 @@ cont { } lines { width: 1.7 - color: 12316398 + color: 12052198 priority: 1721 join: ROUNDJOIN cap: ROUNDCAP @@ -49601,14 +49679,14 @@ cont { scale: 15 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1697 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 7.6 dd: 10.8 @@ -49619,7 +49697,7 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1721 join: ROUNDJOIN cap: ROUNDCAP @@ -49629,14 +49707,14 @@ cont { scale: 16 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1697 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 9.6 dd: 14.4 @@ -49647,7 +49725,7 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1721 join: ROUNDJOIN cap: ROUNDCAP @@ -49657,14 +49735,14 @@ cont { scale: 17 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1565 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 9.6 dd: 14.4 @@ -49675,7 +49753,7 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1694 join: ROUNDJOIN cap: ROUNDCAP @@ -49685,14 +49763,14 @@ cont { scale: 18 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1565 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 9.6 dd: 14.4 @@ -49703,7 +49781,7 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1694 join: ROUNDJOIN cap: ROUNDCAP @@ -49713,14 +49791,14 @@ cont { scale: 19 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1565 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 9.6 dd: 14.4 @@ -49731,7 +49809,7 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1694 join: ROUNDJOIN cap: ROUNDCAP @@ -49744,7 +49822,7 @@ cont { scale: 12 lines { width: 1.0 - color: 10083737 + color: 9490576 priority: 1697 join: ROUNDJOIN cap: ROUNDCAP @@ -49754,7 +49832,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10083737 + color: 9490576 priority: 1752 join: ROUNDJOIN cap: ROUNDCAP @@ -49764,14 +49842,14 @@ cont { scale: 14 lines { width: 2.4 - color: 21760 + color: 612617 priority: 1697 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 21760 + color: 612617 dashdot { dd: 3.8 dd: 5.4 @@ -49782,7 +49860,7 @@ cont { } lines { width: 1.7 - color: 12316398 + color: 12052198 priority: 1721 join: ROUNDJOIN cap: ROUNDCAP @@ -49792,7 +49870,7 @@ cont { scale: 15 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1697 join: ROUNDJOIN cap: ROUNDCAP @@ -49806,7 +49884,7 @@ cont { } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 7.6 dd: 10.8 @@ -49817,14 +49895,14 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1721 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -49834,7 +49912,7 @@ cont { scale: 16 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1697 join: ROUNDJOIN cap: ROUNDCAP @@ -49848,7 +49926,7 @@ cont { } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 9.6 dd: 14.4 @@ -49859,14 +49937,14 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1721 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -49876,7 +49954,7 @@ cont { scale: 17 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1565 join: ROUNDJOIN cap: ROUNDCAP @@ -49890,7 +49968,7 @@ cont { } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 9.6 dd: 14.4 @@ -49901,14 +49979,14 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1694 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -49918,7 +49996,7 @@ cont { scale: 18 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1565 join: ROUNDJOIN cap: ROUNDCAP @@ -49932,7 +50010,7 @@ cont { } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 9.6 dd: 14.4 @@ -49943,14 +50021,14 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1694 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -49960,7 +50038,7 @@ cont { scale: 19 lines { width: 3.2 - color: 17408 + color: 1002511 priority: 1565 join: ROUNDJOIN cap: ROUNDCAP @@ -49974,7 +50052,7 @@ cont { } lines { width: 2.0 - color: 17408 + color: 1002511 dashdot { dd: 9.6 dd: 14.4 @@ -49985,14 +50063,14 @@ cont { } lines { width: 2.0 - color: 12316398 + color: 12052198 priority: 1694 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -50005,7 +50083,7 @@ cont { scale: 12 lines { width: 1.0 - color: 14518408 + color: 13664384 priority: 1229 join: ROUNDJOIN cap: ROUNDCAP @@ -50015,7 +50093,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14518408 + color: 13664384 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -50025,7 +50103,7 @@ cont { scale: 14 lines { width: 1.7 - color: 5570645 + color: 5835097 dashdot { dd: 3.6 dd: 5.4 @@ -50036,14 +50114,14 @@ cont { } lines { width: 2.0 - color: 5570645 + color: 5835097 priority: 1532 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 14518408 + color: 13664384 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -50053,14 +50131,14 @@ cont { scale: 15 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 7.2 dd: 10.8 @@ -50071,7 +50149,7 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -50081,14 +50159,14 @@ cont { scale: 16 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50099,7 +50177,7 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -50109,14 +50187,14 @@ cont { scale: 17 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50127,7 +50205,7 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -50137,14 +50215,14 @@ cont { scale: 18 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50155,7 +50233,7 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -50165,14 +50243,14 @@ cont { scale: 19 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50183,7 +50261,7 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -50196,7 +50274,7 @@ cont { scale: 12 lines { width: 1.0 - color: 14518408 + color: 13664384 priority: 1229 join: ROUNDJOIN cap: ROUNDCAP @@ -50206,7 +50284,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14518408 + color: 13664384 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -50216,7 +50294,7 @@ cont { scale: 14 lines { width: 1.7 - color: 5570645 + color: 5835097 dashdot { dd: 3.6 dd: 5.4 @@ -50227,14 +50305,14 @@ cont { } lines { width: 2.0 - color: 5570645 + color: 5835097 priority: 1532 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 14518408 + color: 13664384 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -50244,7 +50322,7 @@ cont { scale: 15 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -50258,7 +50336,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 7.2 dd: 10.8 @@ -50269,14 +50347,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -50286,7 +50364,7 @@ cont { scale: 16 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -50300,7 +50378,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50311,14 +50389,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -50328,7 +50406,7 @@ cont { scale: 17 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -50342,7 +50420,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50353,14 +50431,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -50370,7 +50448,7 @@ cont { scale: 18 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -50384,7 +50462,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50395,14 +50473,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -50412,7 +50490,7 @@ cont { scale: 19 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -50426,7 +50504,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50437,14 +50515,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -50457,7 +50535,7 @@ cont { scale: 12 lines { width: 1.0 - color: 14518408 + color: 13664384 priority: 1229 join: ROUNDJOIN cap: ROUNDCAP @@ -50467,7 +50545,7 @@ cont { scale: 13 lines { width: 1.0 - color: 14518408 + color: 13664384 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -50477,7 +50555,7 @@ cont { scale: 14 lines { width: 1.7 - color: 5570645 + color: 5835097 dashdot { dd: 3.6 dd: 5.4 @@ -50488,14 +50566,14 @@ cont { } lines { width: 2.0 - color: 5570645 + color: 5835097 priority: 1532 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 14518408 + color: 13664384 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -50512,14 +50590,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 7.2 dd: 10.8 @@ -50530,14 +50608,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -50558,14 +50636,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50576,14 +50654,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -50604,14 +50682,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50622,14 +50700,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -50650,14 +50728,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50668,14 +50746,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -50696,14 +50774,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -50714,14 +50792,14 @@ cont { } lines { width: 2.0 - color: 14518408 + color: 13664384 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -50738,7 +50816,7 @@ cont { scale: 12 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1220 join: ROUNDJOIN cap: ROUNDCAP @@ -50748,7 +50826,7 @@ cont { scale: 13 lines { width: 1.0 - color: 11184810 + color: 10526880 priority: 1241 join: ROUNDJOIN cap: ROUNDCAP @@ -50758,14 +50836,14 @@ cont { scale: 14 lines { width: 2.4 - color: 6710886 + color: 6316128 priority: 1192 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 4473924 + color: 4210752 dashdot { dd: 5.5 dd: 5.5 @@ -50776,7 +50854,7 @@ cont { } lines { width: 1.7 - color: 15658734 + color: 15132390 priority: 1281 join: ROUNDJOIN cap: ROUNDCAP @@ -50804,7 +50882,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1357 join: ROUNDJOIN cap: ROUNDCAP @@ -50832,7 +50910,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1623 join: ROUNDJOIN cap: ROUNDCAP @@ -50860,7 +50938,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1688 join: ROUNDJOIN cap: ROUNDCAP @@ -50888,7 +50966,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1688 join: ROUNDJOIN cap: ROUNDCAP @@ -50916,7 +50994,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1688 join: ROUNDJOIN cap: ROUNDCAP @@ -50929,7 +51007,7 @@ cont { scale: 12 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1220 join: ROUNDJOIN cap: ROUNDCAP @@ -50939,7 +51017,7 @@ cont { scale: 13 lines { width: 1.0 - color: 11184810 + color: 10526880 priority: 1241 join: ROUNDJOIN cap: ROUNDCAP @@ -50949,14 +51027,14 @@ cont { scale: 14 lines { width: 2.4 - color: 6710886 + color: 6316128 priority: 1192 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 4473924 + color: 4210752 dashdot { dd: 5.5 dd: 5.5 @@ -50967,7 +51045,7 @@ cont { } lines { width: 1.7 - color: 15658734 + color: 15132390 priority: 1281 join: ROUNDJOIN cap: ROUNDCAP @@ -51002,14 +51080,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1357 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 13.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51044,14 +51122,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1623 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 13.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51086,14 +51164,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1688 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51128,14 +51206,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1688 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51170,14 +51248,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1688 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51249,7 +51327,7 @@ cont { scale: 12 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1223 join: ROUNDJOIN cap: ROUNDCAP @@ -51259,7 +51337,7 @@ cont { scale: 13 lines { width: 1.35 - color: 12303291 + color: 11579568 priority: 1244 join: ROUNDJOIN cap: ROUNDCAP @@ -51269,14 +51347,14 @@ cont { scale: 14 lines { width: 2.4 - color: 10066329 + color: 9474192 priority: 1195 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 5592405 + color: 5263440 dashdot { dd: 4.5 dd: 4.5 @@ -51287,7 +51365,7 @@ cont { } lines { width: 1.7 - color: 15658734 + color: 15132390 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -51297,7 +51375,7 @@ cont { scale: 15 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1290 join: ROUNDJOIN cap: ROUNDCAP @@ -51315,7 +51393,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1360 join: ROUNDJOIN cap: ROUNDCAP @@ -51325,7 +51403,7 @@ cont { scale: 16 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -51343,7 +51421,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1626 join: ROUNDJOIN cap: ROUNDCAP @@ -51353,7 +51431,7 @@ cont { scale: 17 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1562 join: ROUNDJOIN cap: ROUNDCAP @@ -51371,7 +51449,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1691 join: ROUNDJOIN cap: ROUNDCAP @@ -51381,7 +51459,7 @@ cont { scale: 18 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1562 join: ROUNDJOIN cap: ROUNDCAP @@ -51399,7 +51477,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1691 join: ROUNDJOIN cap: ROUNDCAP @@ -51409,7 +51487,7 @@ cont { scale: 19 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1562 join: ROUNDJOIN cap: ROUNDCAP @@ -51427,7 +51505,7 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1691 join: ROUNDJOIN cap: ROUNDCAP @@ -51440,7 +51518,7 @@ cont { scale: 12 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1223 join: ROUNDJOIN cap: ROUNDCAP @@ -51450,7 +51528,7 @@ cont { scale: 13 lines { width: 1.35 - color: 12303291 + color: 11579568 priority: 1244 join: ROUNDJOIN cap: ROUNDCAP @@ -51460,14 +51538,14 @@ cont { scale: 14 lines { width: 2.4 - color: 10066329 + color: 9474192 priority: 1195 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 5592405 + color: 5263440 dashdot { dd: 4.5 dd: 4.5 @@ -51478,7 +51556,7 @@ cont { } lines { width: 1.7 - color: 15658734 + color: 15132390 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -51488,7 +51566,7 @@ cont { scale: 15 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1290 join: ROUNDJOIN cap: ROUNDCAP @@ -51513,14 +51591,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1360 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51530,7 +51608,7 @@ cont { scale: 16 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -51555,14 +51633,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1626 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 13.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51572,7 +51650,7 @@ cont { scale: 17 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1562 join: ROUNDJOIN cap: ROUNDCAP @@ -51597,14 +51675,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1691 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51614,7 +51692,7 @@ cont { scale: 18 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1562 join: ROUNDJOIN cap: ROUNDCAP @@ -51639,14 +51717,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1691 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51656,7 +51734,7 @@ cont { scale: 19 lines { width: 3.2 - color: 10066329 + color: 9474192 priority: 1562 join: ROUNDJOIN cap: ROUNDCAP @@ -51681,14 +51759,14 @@ cont { } lines { width: 2.0 - color: 15658734 + color: 15132390 priority: 1691 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -51701,7 +51779,7 @@ cont { scale: 10 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1152 join: ROUNDJOIN cap: ROUNDCAP @@ -51711,7 +51789,7 @@ cont { scale: 11 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1152 join: ROUNDJOIN cap: ROUNDCAP @@ -51721,7 +51799,7 @@ cont { scale: 12 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1217 join: ROUNDJOIN cap: ROUNDCAP @@ -51731,7 +51809,7 @@ cont { scale: 13 lines { width: 1.85 - color: 12303291 + color: 11579568 priority: 1238 join: ROUNDJOIN cap: ROUNDCAP @@ -51748,7 +51826,7 @@ cont { } lines { width: 1.8 - color: 15658734 + color: 15132390 priority: 1278 join: ROUNDJOIN cap: ROUNDCAP @@ -51767,7 +51845,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16189 @@ -51784,7 +51862,7 @@ cont { } lines { width: 2.4 - color: 15658734 + color: 15132390 priority: 1354 join: ROUNDJOIN cap: ROUNDCAP @@ -51803,7 +51881,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16284 @@ -51813,7 +51891,7 @@ cont { scale: 16 lines { width: 2.4 - color: 15658734 + color: 15132390 priority: 1620 join: ROUNDJOIN cap: ROUNDCAP @@ -51839,7 +51917,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16620 @@ -51856,7 +51934,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -51875,7 +51953,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -51892,7 +51970,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -51911,7 +51989,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -51928,7 +52006,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -51947,7 +52025,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -51960,7 +52038,7 @@ cont { scale: 10 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1152 join: ROUNDJOIN cap: ROUNDCAP @@ -51970,7 +52048,7 @@ cont { scale: 11 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1152 join: ROUNDJOIN cap: ROUNDCAP @@ -51980,7 +52058,7 @@ cont { scale: 12 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1217 join: ROUNDJOIN cap: ROUNDCAP @@ -51990,7 +52068,7 @@ cont { scale: 13 lines { width: 1.85 - color: 12303291 + color: 11579568 priority: 1238 join: ROUNDJOIN cap: ROUNDCAP @@ -52007,7 +52085,7 @@ cont { } lines { width: 1.8 - color: 15658734 + color: 15132390 priority: 1278 join: ROUNDJOIN cap: ROUNDCAP @@ -52026,7 +52104,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16189 @@ -52050,7 +52128,7 @@ cont { } lines { width: 2.4 - color: 15658734 + color: 15132390 priority: 1354 join: ROUNDJOIN cap: ROUNDCAP @@ -52068,7 +52146,7 @@ cont { } lines { width: 12.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -52076,7 +52154,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16284 @@ -52086,7 +52164,7 @@ cont { scale: 16 lines { width: 2.4 - color: 15658734 + color: 15132390 priority: 1620 join: ROUNDJOIN cap: ROUNDCAP @@ -52118,7 +52196,7 @@ cont { } lines { width: 12.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -52126,7 +52204,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16620 @@ -52150,7 +52228,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -52168,7 +52246,7 @@ cont { } lines { width: 13.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -52176,7 +52254,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -52200,7 +52278,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -52218,7 +52296,7 @@ cont { } lines { width: 13.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -52226,7 +52304,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -52250,7 +52328,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -52268,7 +52346,7 @@ cont { } lines { width: 13.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -52276,7 +52354,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -52289,7 +52367,7 @@ cont { scale: 10 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1152 join: ROUNDJOIN cap: ROUNDCAP @@ -52299,7 +52377,7 @@ cont { scale: 11 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1152 join: ROUNDJOIN cap: ROUNDCAP @@ -52309,7 +52387,7 @@ cont { scale: 12 lines { width: 1.0 - color: 13421772 + color: 12632256 priority: 1217 join: ROUNDJOIN cap: ROUNDCAP @@ -52319,7 +52397,7 @@ cont { scale: 13 lines { width: 1.85 - color: 12303291 + color: 11579568 priority: 1238 join: ROUNDJOIN cap: ROUNDCAP @@ -52336,7 +52414,7 @@ cont { } lines { width: 1.8 - color: 15658734 + color: 15132390 priority: 1278 join: ROUNDJOIN cap: ROUNDCAP @@ -52355,7 +52433,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16189 @@ -52372,7 +52450,7 @@ cont { } lines { width: 2.4 - color: 15658734 + color: 15132390 priority: 1354 join: ROUNDJOIN cap: ROUNDCAP @@ -52391,7 +52469,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16284 @@ -52401,7 +52479,7 @@ cont { scale: 16 lines { width: 2.4 - color: 15658734 + color: 15132390 priority: 1620 join: ROUNDJOIN cap: ROUNDCAP @@ -52427,7 +52505,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16620 @@ -52444,7 +52522,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -52463,7 +52541,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -52480,7 +52558,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -52499,7 +52577,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -52516,7 +52594,7 @@ cont { } lines { width: 3.2 - color: 15658734 + color: 15132390 priority: 1685 join: ROUNDJOIN cap: ROUNDCAP @@ -52535,7 +52613,7 @@ cont { path_text { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 } priority: 16556 @@ -52548,7 +52626,7 @@ cont { scale: 16 lines { width: 3.2 - color: 3016543436 + color: 3015885506 dashdot { dd: 2.4 dd: 2.4 @@ -52559,7 +52637,7 @@ cont { } lines { width: 2.4 - color: 3016543436 + color: 3015885506 dashdot { dd: 2.4 dd: 2.4 @@ -52584,7 +52662,7 @@ cont { scale: 17 lines { width: 3.2 - color: 3016543436 + color: 3015885506 dashdot { dd: 2.4 dd: 2.4 @@ -52595,7 +52673,7 @@ cont { } lines { width: 2.0 - color: 3016543436 + color: 3015885506 dashdot { dd: 2.4 dd: 2.4 @@ -52620,7 +52698,7 @@ cont { scale: 18 lines { width: 3.2 - color: 3016543436 + color: 3015885506 dashdot { dd: 2.4 dd: 2.4 @@ -52631,7 +52709,7 @@ cont { } lines { width: 2.0 - color: 3016543436 + color: 3015885506 dashdot { dd: 2.4 dd: 2.4 @@ -52656,7 +52734,7 @@ cont { scale: 19 lines { width: 3.2 - color: 3016543436 + color: 3015885506 dashdot { dd: 2.4 dd: 2.4 @@ -52667,7 +52745,7 @@ cont { } lines { width: 2.0 - color: 3016543436 + color: 3015885506 dashdot { dd: 2.4 dd: 2.4 @@ -52695,7 +52773,7 @@ cont { scale: 13 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1253 join: ROUNDJOIN cap: ROUNDCAP @@ -52705,14 +52783,14 @@ cont { scale: 14 lines { width: 1.6 - color: 10066329 + color: 9474192 priority: 1207 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 4473924 + color: 4210752 dashdot { dd: 3.0 dd: 6.0 @@ -52723,7 +52801,7 @@ cont { } lines { width: 1.0 - color: 15658734 + color: 15132390 priority: 1302 join: ROUNDJOIN cap: ROUNDCAP @@ -52751,7 +52829,7 @@ cont { } lines { width: 1.4 - color: 15658734 + color: 15132390 priority: 1379 join: ROUNDJOIN cap: ROUNDCAP @@ -52779,7 +52857,7 @@ cont { } lines { width: 1.2 - color: 15658734 + color: 15132390 priority: 1642 join: ROUNDJOIN cap: ROUNDCAP @@ -52807,7 +52885,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1709 join: ROUNDJOIN cap: ROUNDCAP @@ -52835,7 +52913,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1709 join: ROUNDJOIN cap: ROUNDCAP @@ -52863,7 +52941,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1709 join: ROUNDJOIN cap: ROUNDCAP @@ -52876,7 +52954,7 @@ cont { scale: 13 lines { width: 1.0 - color: 12303291 + color: 11579568 priority: 1253 join: ROUNDJOIN cap: ROUNDCAP @@ -52886,14 +52964,14 @@ cont { scale: 14 lines { width: 1.6 - color: 10066329 + color: 9474192 priority: 1207 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 4473924 + color: 4210752 dashdot { dd: 3.0 dd: 6.0 @@ -52904,7 +52982,7 @@ cont { } lines { width: 1.0 - color: 15658734 + color: 15132390 priority: 1302 join: ROUNDJOIN cap: ROUNDCAP @@ -52939,14 +53017,14 @@ cont { } lines { width: 1.4 - color: 15658734 + color: 15132390 priority: 1379 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -52981,14 +53059,14 @@ cont { } lines { width: 1.2 - color: 15658734 + color: 15132390 priority: 1642 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53023,14 +53101,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1709 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53065,14 +53143,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1709 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53107,14 +53185,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1709 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53127,14 +53205,14 @@ cont { scale: 14 lines { width: 1.6 - color: 12303291 + color: 11579568 priority: 1201 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 15658734 + color: 15527148 dashdot { dd: 3.0 dd: 6.0 @@ -53145,7 +53223,7 @@ cont { } lines { width: 1.0 - color: 10066329 + color: 9474192 priority: 1296 join: ROUNDJOIN cap: ROUNDCAP @@ -53155,14 +53233,14 @@ cont { scale: 15 lines { width: 2.4 - color: 6710886 + color: 6316128 priority: 1302 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.4 - color: 6710886 + color: 6316128 dashdot { dd: 6.0 dd: 12.0 @@ -53173,7 +53251,7 @@ cont { } lines { width: 1.4 - color: 15658734 + color: 15132390 priority: 1373 join: ROUNDJOIN cap: ROUNDCAP @@ -53183,7 +53261,7 @@ cont { scale: 16 lines { width: 2.4 - color: 6710886 + color: 6316128 priority: 1522 join: ROUNDJOIN cap: ROUNDCAP @@ -53201,7 +53279,7 @@ cont { } lines { width: 1.2 - color: 15658734 + color: 15132390 priority: 1636 join: ROUNDJOIN cap: ROUNDCAP @@ -53229,7 +53307,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1703 join: ROUNDJOIN cap: ROUNDCAP @@ -53257,7 +53335,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1703 join: ROUNDJOIN cap: ROUNDCAP @@ -53285,7 +53363,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1703 join: ROUNDJOIN cap: ROUNDCAP @@ -53298,14 +53376,14 @@ cont { scale: 14 lines { width: 1.6 - color: 12303291 + color: 11579568 priority: 1201 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 15658734 + color: 15527148 dashdot { dd: 3.0 dd: 6.0 @@ -53316,7 +53394,7 @@ cont { } lines { width: 1.0 - color: 10066329 + color: 9474192 priority: 1296 join: ROUNDJOIN cap: ROUNDCAP @@ -53326,7 +53404,7 @@ cont { scale: 15 lines { width: 2.4 - color: 6710886 + color: 6316128 priority: 1302 join: ROUNDJOIN cap: ROUNDCAP @@ -53340,7 +53418,7 @@ cont { } lines { width: 1.4 - color: 6710886 + color: 6316128 dashdot { dd: 6.0 dd: 12.0 @@ -53351,14 +53429,14 @@ cont { } lines { width: 1.4 - color: 15658734 + color: 15132390 priority: 1373 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53368,7 +53446,7 @@ cont { scale: 16 lines { width: 2.4 - color: 6710886 + color: 6316128 priority: 1522 join: ROUNDJOIN cap: ROUNDCAP @@ -53393,14 +53471,14 @@ cont { } lines { width: 1.2 - color: 15658734 + color: 15132390 priority: 1636 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53435,14 +53513,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1703 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.36 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53477,14 +53555,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1703 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.36 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53519,14 +53597,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1703 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.36 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -53551,8 +53629,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15159 @@ -53567,8 +53645,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53583,8 +53661,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53599,8 +53677,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53615,8 +53693,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53641,8 +53719,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15159 @@ -53657,8 +53735,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53673,8 +53751,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53689,8 +53767,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53705,8 +53783,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53731,8 +53809,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15159 @@ -53747,8 +53825,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53763,8 +53841,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53779,8 +53857,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53795,8 +53873,8 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } priority: 15171 @@ -53814,14 +53892,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -53837,14 +53915,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -53860,14 +53938,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -53883,14 +53961,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -53906,14 +53984,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -53929,14 +54007,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -53952,14 +54030,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -53975,14 +54053,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54001,14 +54079,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54024,14 +54102,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54047,14 +54125,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54070,14 +54148,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54093,14 +54171,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54116,14 +54194,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54139,14 +54217,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54162,14 +54240,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54188,14 +54266,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54211,14 +54289,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54234,14 +54312,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54257,14 +54335,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54280,14 +54358,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54303,14 +54381,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54326,14 +54404,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54349,14 +54427,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54375,14 +54453,14 @@ cont { caption { primary { height: 10 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54398,14 +54476,14 @@ cont { caption { primary { height: 11 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54421,14 +54499,14 @@ cont { caption { primary { height: 11 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54444,14 +54522,14 @@ cont { caption { primary { height: 12 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54467,14 +54545,14 @@ cont { caption { primary { height: 12 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54490,14 +54568,14 @@ cont { caption { primary { height: 12 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54513,14 +54591,14 @@ cont { caption { primary { height: 12 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54536,14 +54614,14 @@ cont { caption { primary { height: 12 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8840 - stroke_color: 16777215 + color: 469129 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54563,13 +54641,13 @@ cont { primary { height: 10 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54586,13 +54664,13 @@ cont { primary { height: 11 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54609,13 +54687,13 @@ cont { primary { height: 11 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54632,13 +54710,13 @@ cont { primary { height: 12 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54655,13 +54733,13 @@ cont { primary { height: 12 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54678,13 +54756,13 @@ cont { primary { height: 12 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54701,13 +54779,13 @@ cont { primary { height: 12 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54724,13 +54802,13 @@ cont { primary { height: 12 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 12285696 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54749,14 +54827,14 @@ cont { caption { primary { height: 10 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54772,14 +54850,14 @@ cont { caption { primary { height: 11 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54795,14 +54873,14 @@ cont { caption { primary { height: 11 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54818,14 +54896,14 @@ cont { caption { primary { height: 12 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54841,14 +54919,14 @@ cont { caption { primary { height: 12 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54864,14 +54942,14 @@ cont { caption { primary { height: 12 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54887,14 +54965,14 @@ cont { caption { primary { height: 12 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54910,14 +54988,14 @@ cont { caption { primary { height: 12 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 26112 - stroke_color: 16777215 + color: 25600 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54936,14 +55014,14 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54959,14 +55037,14 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -54982,14 +55060,14 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55005,14 +55083,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55028,14 +55106,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55051,14 +55129,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55074,14 +55152,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55097,14 +55175,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55124,13 +55202,13 @@ cont { primary { height: 10 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55147,13 +55225,13 @@ cont { primary { height: 11 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55170,13 +55248,13 @@ cont { primary { height: 11 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55193,13 +55271,13 @@ cont { primary { height: 12 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55216,13 +55294,13 @@ cont { primary { height: 12 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55239,13 +55317,13 @@ cont { primary { height: 12 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55262,13 +55340,13 @@ cont { primary { height: 12 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55285,13 +55363,13 @@ cont { primary { height: 12 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 26112 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55310,14 +55388,14 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55333,14 +55411,14 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55356,14 +55434,14 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55379,14 +55457,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55402,14 +55480,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55425,14 +55503,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55448,14 +55526,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55471,14 +55549,14 @@ cont { caption { primary { height: 12 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8947848 - stroke_color: 16777215 + color: 8421504 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55497,14 +55575,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55520,14 +55598,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55543,14 +55621,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55566,14 +55644,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55589,14 +55667,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55612,14 +55690,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55635,14 +55713,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55658,14 +55736,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55684,14 +55762,14 @@ cont { caption { primary { height: 10 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55707,14 +55785,14 @@ cont { caption { primary { height: 11 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55730,14 +55808,14 @@ cont { caption { primary { height: 11 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55753,14 +55831,14 @@ cont { caption { primary { height: 12 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55776,14 +55854,14 @@ cont { caption { primary { height: 12 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55799,14 +55877,14 @@ cont { caption { primary { height: 12 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55822,14 +55900,14 @@ cont { caption { primary { height: 12 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55845,14 +55923,14 @@ cont { caption { primary { height: 12 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 11197934 - stroke_color: 16777215 + color: 11393254 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55871,14 +55949,14 @@ cont { caption { primary { height: 10 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55894,14 +55972,14 @@ cont { caption { primary { height: 11 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55917,14 +55995,14 @@ cont { caption { primary { height: 11 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55940,14 +56018,14 @@ cont { caption { primary { height: 12 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55963,14 +56041,14 @@ cont { caption { primary { height: 12 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -55986,14 +56064,14 @@ cont { caption { primary { height: 12 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56009,14 +56087,14 @@ cont { caption { primary { height: 12 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56032,14 +56110,14 @@ cont { caption { primary { height: 12 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 10088089 - stroke_color: 16777215 + color: 9498256 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56058,14 +56136,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56081,14 +56159,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56104,14 +56182,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56127,14 +56205,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56150,14 +56228,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56173,14 +56251,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56196,14 +56274,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56219,14 +56297,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56245,14 +56323,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56268,14 +56346,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56291,14 +56369,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56314,14 +56392,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56337,14 +56415,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56360,14 +56438,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56383,14 +56461,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56406,14 +56484,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56432,14 +56510,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56455,14 +56533,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56478,14 +56556,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56501,14 +56579,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56524,14 +56602,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56547,14 +56625,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56570,14 +56648,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56593,14 +56671,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56619,14 +56697,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56642,14 +56720,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56665,14 +56743,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56688,14 +56766,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56711,14 +56789,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56734,14 +56812,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56757,14 +56835,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56780,14 +56858,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56806,14 +56884,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56829,14 +56907,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56852,14 +56930,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56875,14 +56953,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56898,14 +56976,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56921,14 +56999,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56944,14 +57022,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56967,14 +57045,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -56994,13 +57072,13 @@ cont { primary { height: 10 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57017,13 +57095,13 @@ cont { primary { height: 11 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57040,13 +57118,13 @@ cont { primary { height: 11 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57063,13 +57141,13 @@ cont { primary { height: 12 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57086,13 +57164,13 @@ cont { primary { height: 12 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57109,13 +57187,13 @@ cont { primary { height: 12 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57132,13 +57210,13 @@ cont { primary { height: 12 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57155,13 +57233,13 @@ cont { primary { height: 12 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 16742144 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57180,14 +57258,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57203,14 +57281,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57226,14 +57304,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57249,14 +57327,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57272,14 +57350,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57295,14 +57373,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57318,14 +57396,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57341,14 +57419,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57367,14 +57445,14 @@ cont { caption { primary { height: 10 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57390,14 +57468,14 @@ cont { caption { primary { height: 11 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57413,14 +57491,14 @@ cont { caption { primary { height: 11 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57436,14 +57514,14 @@ cont { caption { primary { height: 12 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57459,14 +57537,14 @@ cont { caption { primary { height: 12 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57482,14 +57560,14 @@ cont { caption { primary { height: 12 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57505,14 +57583,14 @@ cont { caption { primary { height: 12 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57528,14 +57606,14 @@ cont { caption { primary { height: 12 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 8934809 - stroke_color: 16777215 + color: 9130140 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57555,13 +57633,13 @@ cont { primary { height: 10 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57578,13 +57656,13 @@ cont { primary { height: 11 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57601,13 +57679,13 @@ cont { primary { height: 11 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57624,13 +57702,13 @@ cont { primary { height: 12 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57647,13 +57725,13 @@ cont { primary { height: 12 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57670,13 +57748,13 @@ cont { primary { height: 12 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57693,13 +57771,13 @@ cont { primary { height: 12 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57716,13 +57794,13 @@ cont { primary { height: 12 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 color: 14483456 - stroke_color: 16777215 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57741,14 +57819,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57764,14 +57842,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57787,14 +57865,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57810,14 +57888,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57833,14 +57911,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57856,14 +57934,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57879,14 +57957,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57902,14 +57980,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57928,14 +58006,14 @@ cont { caption { primary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57951,14 +58029,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57974,14 +58052,14 @@ cont { caption { primary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -57997,14 +58075,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58020,14 +58098,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58043,14 +58121,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58066,14 +58144,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58089,14 +58167,14 @@ cont { caption { primary { height: 12 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 3364317 - stroke_color: 16777215 + color: 3166424 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58115,14 +58193,14 @@ cont { caption { primary { height: 10 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58138,14 +58216,14 @@ cont { caption { primary { height: 11 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58161,14 +58239,14 @@ cont { caption { primary { height: 11 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58184,14 +58262,14 @@ cont { caption { primary { height: 12 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58207,14 +58285,14 @@ cont { caption { primary { height: 12 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58230,14 +58308,14 @@ cont { caption { primary { height: 12 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58253,14 +58331,14 @@ cont { caption { primary { height: 12 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58276,14 +58354,14 @@ cont { caption { primary { height: 12 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 15632622 - stroke_color: 16777215 + color: 15631086 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58302,14 +58380,14 @@ cont { caption { primary { height: 10 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 } secondary { height: 9 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58325,14 +58403,14 @@ cont { caption { primary { height: 11 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58348,14 +58426,14 @@ cont { caption { primary { height: 11 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 } secondary { height: 10 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58371,14 +58449,14 @@ cont { caption { primary { height: 12 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58394,14 +58472,14 @@ cont { caption { primary { height: 12 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58417,14 +58495,14 @@ cont { caption { primary { height: 12 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58440,14 +58518,14 @@ cont { caption { primary { height: 12 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58463,14 +58541,14 @@ cont { caption { primary { height: 12 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 } secondary { height: 11 - color: 16763904 - stroke_color: 16777215 + color: 16238080 + stroke_color: 16317695 offset_y: 10 text: "int_name" } @@ -58484,7 +58562,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58498,7 +58576,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58512,7 +58590,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58526,7 +58604,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58540,7 +58618,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58554,7 +58632,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58568,7 +58646,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58582,7 +58660,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58599,7 +58677,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3003130504 + color: 3003590793 dashdot { dd: 3.0 dd: 3.0 @@ -58613,7 +58691,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3003130504 + color: 3003590793 dashdot { dd: 3.0 dd: 3.0 @@ -58627,7 +58705,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3003130504 + color: 3003590793 dashdot { dd: 3.0 dd: 3.0 @@ -58641,7 +58719,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3003130504 + color: 3003590793 dashdot { dd: 3.0 dd: 3.0 @@ -58655,7 +58733,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3003130504 + color: 3003590793 dashdot { dd: 3.0 dd: 3.0 @@ -58669,7 +58747,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3003130504 + color: 3003590793 dashdot { dd: 3.0 dd: 3.0 @@ -58683,7 +58761,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3003130504 + color: 3003590793 dashdot { dd: 3.0 dd: 3.0 @@ -58697,7 +58775,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3003130504 + color: 3003590793 dashdot { dd: 3.0 dd: 3.0 @@ -58714,7 +58792,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58728,7 +58806,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58742,7 +58820,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58756,7 +58834,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58774,7 +58852,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -58784,7 +58862,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58802,7 +58880,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -58812,7 +58890,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58830,7 +58908,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -58840,7 +58918,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58858,7 +58936,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -58868,7 +58946,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3003121732 + color: 3004108620 dashdot { dd: 3.0 dd: 3.0 @@ -58886,7 +58964,7 @@ cont { } lines { width: 13.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -59014,7 +59092,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3003147776 + color: 3003147264 dashdot { dd: 3.0 dd: 3.0 @@ -59028,7 +59106,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3003147776 + color: 3003147264 dashdot { dd: 3.0 dd: 3.0 @@ -59042,7 +59120,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3003147776 + color: 3003147264 dashdot { dd: 3.0 dd: 3.0 @@ -59056,7 +59134,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3003147776 + color: 3003147264 dashdot { dd: 3.0 dd: 3.0 @@ -59070,7 +59148,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3003147776 + color: 3003147264 dashdot { dd: 3.0 dd: 3.0 @@ -59084,7 +59162,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3003147776 + color: 3003147264 dashdot { dd: 3.0 dd: 3.0 @@ -59098,7 +59176,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3003147776 + color: 3003147264 dashdot { dd: 3.0 dd: 3.0 @@ -59112,7 +59190,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3003147776 + color: 3003147264 dashdot { dd: 3.0 dd: 3.0 @@ -59129,7 +59207,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59143,7 +59221,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59157,7 +59235,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59171,7 +59249,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59185,7 +59263,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59199,7 +59277,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59213,7 +59291,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59227,7 +59305,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59359,7 +59437,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59373,7 +59451,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59387,7 +59465,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59401,7 +59479,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59415,7 +59493,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59429,7 +59507,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59443,7 +59521,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59457,7 +59535,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3012069512 + color: 3011543168 dashdot { dd: 3.0 dd: 3.0 @@ -59474,7 +59552,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3014319598 + color: 3014514918 dashdot { dd: 3.0 dd: 3.0 @@ -59488,7 +59566,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3014319598 + color: 3014514918 dashdot { dd: 3.0 dd: 3.0 @@ -59502,7 +59580,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3014319598 + color: 3014514918 dashdot { dd: 3.0 dd: 3.0 @@ -59516,7 +59594,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3014319598 + color: 3014514918 dashdot { dd: 3.0 dd: 3.0 @@ -59530,7 +59608,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3014319598 + color: 3014514918 dashdot { dd: 3.0 dd: 3.0 @@ -59544,7 +59622,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3014319598 + color: 3014514918 dashdot { dd: 3.0 dd: 3.0 @@ -59558,7 +59636,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3014319598 + color: 3014514918 dashdot { dd: 3.0 dd: 3.0 @@ -59572,7 +59650,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3014319598 + color: 3014514918 dashdot { dd: 3.0 dd: 3.0 @@ -59589,7 +59667,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3013209753 + color: 3012619920 dashdot { dd: 3.0 dd: 3.0 @@ -59603,7 +59681,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3013209753 + color: 3012619920 dashdot { dd: 3.0 dd: 3.0 @@ -59617,7 +59695,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3013209753 + color: 3012619920 dashdot { dd: 3.0 dd: 3.0 @@ -59631,7 +59709,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3013209753 + color: 3012619920 dashdot { dd: 3.0 dd: 3.0 @@ -59645,7 +59723,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3013209753 + color: 3012619920 dashdot { dd: 3.0 dd: 3.0 @@ -59659,7 +59737,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3013209753 + color: 3012619920 dashdot { dd: 3.0 dd: 3.0 @@ -59673,7 +59751,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3013209753 + color: 3012619920 dashdot { dd: 3.0 dd: 3.0 @@ -59687,7 +59765,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3013209753 + color: 3012619920 dashdot { dd: 3.0 dd: 3.0 @@ -59819,7 +59897,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3012056473 + color: 3012251804 dashdot { dd: 3.0 dd: 3.0 @@ -59833,7 +59911,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3012056473 + color: 3012251804 dashdot { dd: 3.0 dd: 3.0 @@ -59847,7 +59925,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3012056473 + color: 3012251804 dashdot { dd: 3.0 dd: 3.0 @@ -59861,7 +59939,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3012056473 + color: 3012251804 dashdot { dd: 3.0 dd: 3.0 @@ -59875,7 +59953,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3012056473 + color: 3012251804 dashdot { dd: 3.0 dd: 3.0 @@ -59889,7 +59967,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3012056473 + color: 3012251804 dashdot { dd: 3.0 dd: 3.0 @@ -59903,7 +59981,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3012056473 + color: 3012251804 dashdot { dd: 3.0 dd: 3.0 @@ -59917,7 +59995,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3012056473 + color: 3012251804 dashdot { dd: 3.0 dd: 3.0 @@ -60049,7 +60127,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3018754286 + color: 3018752750 dashdot { dd: 3.0 dd: 3.0 @@ -60063,7 +60141,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3018754286 + color: 3018752750 dashdot { dd: 3.0 dd: 3.0 @@ -60077,7 +60155,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3018754286 + color: 3018752750 dashdot { dd: 3.0 dd: 3.0 @@ -60091,7 +60169,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3018754286 + color: 3018752750 dashdot { dd: 3.0 dd: 3.0 @@ -60105,7 +60183,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3018754286 + color: 3018752750 dashdot { dd: 3.0 dd: 3.0 @@ -60119,7 +60197,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3018754286 + color: 3018752750 dashdot { dd: 3.0 dd: 3.0 @@ -60133,7 +60211,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3018754286 + color: 3018752750 dashdot { dd: 3.0 dd: 3.0 @@ -60147,7 +60225,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3018754286 + color: 3018752750 dashdot { dd: 3.0 dd: 3.0 @@ -60164,7 +60242,7 @@ cont { scale: 12 lines { width: 3.0 - color: 3019885568 + color: 3019359744 dashdot { dd: 3.0 dd: 3.0 @@ -60178,7 +60256,7 @@ cont { scale: 13 lines { width: 3.0 - color: 3019885568 + color: 3019359744 dashdot { dd: 3.0 dd: 3.0 @@ -60192,7 +60270,7 @@ cont { scale: 14 lines { width: 3.0 - color: 3019885568 + color: 3019359744 dashdot { dd: 3.0 dd: 3.0 @@ -60206,7 +60284,7 @@ cont { scale: 15 lines { width: 3.0 - color: 3019885568 + color: 3019359744 dashdot { dd: 3.0 dd: 3.0 @@ -60220,7 +60298,7 @@ cont { scale: 16 lines { width: 3.0 - color: 3019885568 + color: 3019359744 dashdot { dd: 3.0 dd: 3.0 @@ -60234,7 +60312,7 @@ cont { scale: 17 lines { width: 3.0 - color: 3019885568 + color: 3019359744 dashdot { dd: 3.0 dd: 3.0 @@ -60248,7 +60326,7 @@ cont { scale: 18 lines { width: 3.0 - color: 3019885568 + color: 3019359744 dashdot { dd: 3.0 dd: 3.0 @@ -60262,7 +60340,7 @@ cont { scale: 19 lines { width: 3.0 - color: 3019885568 + color: 3019359744 dashdot { dd: 3.0 dd: 3.0 @@ -60651,7 +60729,7 @@ cont { scale: 14 lines { width: 1.7 - color: 5570645 + color: 5835097 dashdot { dd: 3.6 dd: 5.4 @@ -60662,14 +60740,14 @@ cont { } lines { width: 2.0 - color: 5570645 + color: 5835097 priority: 1532 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 15645678 + color: 15120358 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -60679,14 +60757,14 @@ cont { scale: 15 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 7.2 dd: 10.8 @@ -60697,7 +60775,7 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -60707,14 +60785,14 @@ cont { scale: 16 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -60725,7 +60803,7 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -60735,14 +60813,14 @@ cont { scale: 17 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -60753,7 +60831,7 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -60763,14 +60841,14 @@ cont { scale: 18 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -60781,7 +60859,7 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -60791,14 +60869,14 @@ cont { scale: 19 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -60809,7 +60887,7 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP @@ -60822,7 +60900,7 @@ cont { scale: 14 lines { width: 1.7 - color: 5570645 + color: 5835097 dashdot { dd: 3.6 dd: 5.4 @@ -60833,14 +60911,14 @@ cont { } lines { width: 2.0 - color: 5570645 + color: 5835097 priority: 1532 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 15645678 + color: 15120358 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -60850,7 +60928,7 @@ cont { scale: 15 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -60864,7 +60942,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 7.2 dd: 10.8 @@ -60875,14 +60953,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 13.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -60892,7 +60970,7 @@ cont { scale: 16 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -60906,7 +60984,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -60917,14 +60995,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -60934,7 +61012,7 @@ cont { scale: 17 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -60948,7 +61026,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -60959,14 +61037,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -60976,7 +61054,7 @@ cont { scale: 18 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -60990,7 +61068,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -61001,14 +61079,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -61018,7 +61096,7 @@ cont { scale: 19 lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -61032,7 +61110,7 @@ cont { } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -61043,14 +61121,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -61063,7 +61141,7 @@ cont { scale: 14 lines { width: 1.7 - color: 5570645 + color: 5835097 dashdot { dd: 3.6 dd: 5.4 @@ -61074,14 +61152,14 @@ cont { } lines { width: 2.0 - color: 5570645 + color: 5835097 priority: 1532 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.7 - color: 15645678 + color: 15120358 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP @@ -61098,14 +61176,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 7.2 dd: 10.8 @@ -61116,14 +61194,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 13.2 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -61144,14 +61222,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -61162,14 +61240,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -61190,14 +61268,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -61208,14 +61286,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -61236,14 +61314,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -61254,14 +61332,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -61282,14 +61360,14 @@ cont { } lines { width: 3.2 - color: 4456516 + color: 4984652 priority: 1535 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.0 - color: 4456516 + color: 4984652 dashdot { dd: 9.6 dd: 14.4 @@ -61300,14 +61378,14 @@ cont { } lines { width: 2.0 - color: 15645678 + color: 15120358 priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 - color: 7829367 + color: 7368816 dashdot { dd: 5.0 dd: 5.0 @@ -61329,13 +61407,13 @@ cont { caption { primary { height: 10 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 9 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -61352,13 +61430,13 @@ cont { caption { primary { height: 11 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 10 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -61375,13 +61453,13 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -61398,13 +61476,13 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -61421,13 +61499,13 @@ cont { caption { primary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 } secondary { height: 12 - color: 3364317 + color: 3166424 stroke_color: 16777215 offset_y: 10 text: "int_name" @@ -61442,7 +61520,7 @@ cont { scale: 12 lines { width: 0.5 - color: 4473924 + color: 4210752 priority: 1235 join: ROUNDJOIN cap: ROUNDCAP @@ -61452,7 +61530,7 @@ cont { scale: 13 lines { width: 0.85 - color: 4473924 + color: 4210752 priority: 1250 join: ROUNDJOIN cap: ROUNDCAP @@ -61462,14 +61540,14 @@ cont { scale: 14 lines { width: 1.6 - color: 4473924 + color: 4210752 priority: 1204 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 4473924 + color: 4210752 dashdot { dd: 3.0 dd: 6.0 @@ -61480,7 +61558,7 @@ cont { } lines { width: 1.0 - color: 15658734 + color: 15132390 priority: 1299 join: ROUNDJOIN cap: ROUNDCAP @@ -61508,7 +61586,7 @@ cont { } lines { width: 1.4 - color: 15658734 + color: 15132390 priority: 1376 join: ROUNDJOIN cap: ROUNDCAP @@ -61536,7 +61614,7 @@ cont { } lines { width: 1.2 - color: 15658734 + color: 15132390 priority: 1639 join: ROUNDJOIN cap: ROUNDCAP @@ -61564,7 +61642,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1706 join: ROUNDJOIN cap: ROUNDCAP @@ -61592,7 +61670,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1706 join: ROUNDJOIN cap: ROUNDCAP @@ -61620,7 +61698,7 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1706 join: ROUNDJOIN cap: ROUNDCAP @@ -61633,7 +61711,7 @@ cont { scale: 12 lines { width: 0.5 - color: 4473924 + color: 4210752 priority: 1235 join: ROUNDJOIN cap: ROUNDCAP @@ -61643,7 +61721,7 @@ cont { scale: 13 lines { width: 0.85 - color: 4473924 + color: 4210752 priority: 1250 join: ROUNDJOIN cap: ROUNDCAP @@ -61653,14 +61731,14 @@ cont { scale: 14 lines { width: 1.6 - color: 4473924 + color: 4210752 priority: 1204 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 1.0 - color: 4473924 + color: 4210752 dashdot { dd: 3.0 dd: 6.0 @@ -61671,7 +61749,7 @@ cont { } lines { width: 1.0 - color: 15658734 + color: 15132390 priority: 1299 join: ROUNDJOIN cap: ROUNDCAP @@ -61706,14 +61784,14 @@ cont { } lines { width: 1.4 - color: 15658734 + color: 15132390 priority: 1376 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.4 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -61748,14 +61826,14 @@ cont { } lines { width: 1.2 - color: 15658734 + color: 15132390 priority: 1639 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.2 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -61790,14 +61868,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1706 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.36 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -61832,14 +61910,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1706 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.36 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -61874,14 +61952,14 @@ cont { } lines { width: 1.36 - color: 15658734 + color: 15132390 priority: 1706 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.36 - color: 7829367 + color: 7368816 priority: 1026 join: ROUNDJOIN cap: BUTTCAP @@ -61894,7 +61972,7 @@ cont { scale: 10 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -61908,7 +61986,7 @@ cont { scale: 11 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -61922,7 +62000,7 @@ cont { scale: 12 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -61936,7 +62014,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -61950,7 +62028,7 @@ cont { scale: 14 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -61964,7 +62042,7 @@ cont { scale: 15 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 7.0 dd: 5.0 @@ -61978,7 +62056,7 @@ cont { scale: 16 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -61992,7 +62070,7 @@ cont { scale: 17 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62006,7 +62084,7 @@ cont { scale: 18 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62020,7 +62098,7 @@ cont { scale: 19 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62037,7 +62115,7 @@ cont { scale: 10 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62051,7 +62129,7 @@ cont { scale: 11 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62065,7 +62143,7 @@ cont { scale: 12 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62079,7 +62157,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62093,7 +62171,7 @@ cont { scale: 14 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62107,7 +62185,7 @@ cont { scale: 15 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 7.0 dd: 5.0 @@ -62121,7 +62199,7 @@ cont { scale: 16 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62135,7 +62213,7 @@ cont { scale: 17 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62149,7 +62227,7 @@ cont { scale: 18 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62163,7 +62241,7 @@ cont { scale: 19 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62180,7 +62258,7 @@ cont { scale: 10 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62194,7 +62272,7 @@ cont { scale: 11 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62208,7 +62286,7 @@ cont { scale: 12 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62222,7 +62300,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62236,7 +62314,7 @@ cont { scale: 14 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 3.0 dd: 2.0 @@ -62250,7 +62328,7 @@ cont { scale: 15 lines { width: 1.0 - color: 10075118 + color: 10008808 dashdot { dd: 7.0 dd: 5.0 @@ -62264,7 +62342,7 @@ cont { scale: 16 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62278,7 +62356,7 @@ cont { scale: 17 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62292,7 +62370,7 @@ cont { scale: 18 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62306,7 +62384,7 @@ cont { scale: 19 lines { width: 2.0 - color: 11193565 + color: 11061464 dashdot { dd: 12.0 dd: 8.0 @@ -62324,7 +62402,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62336,7 +62414,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62348,7 +62426,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62374,7 +62452,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62390,7 +62468,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62406,7 +62484,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62432,7 +62510,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62448,7 +62526,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62464,7 +62542,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62483,7 +62561,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62499,7 +62577,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62515,7 +62593,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62530,7 +62608,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62542,7 +62620,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62554,7 +62632,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62573,7 +62651,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62589,7 +62667,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62605,7 +62683,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62624,7 +62702,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62640,7 +62718,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62656,7 +62734,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62675,7 +62753,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62691,7 +62769,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62707,7 +62785,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62722,7 +62800,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62734,7 +62812,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62746,7 +62824,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62772,7 +62850,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62788,7 +62866,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62804,7 +62882,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62819,7 +62897,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62831,7 +62909,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62843,7 +62921,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62869,7 +62947,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62885,7 +62963,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62901,7 +62979,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62916,7 +62994,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62928,7 +63006,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62940,7 +63018,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62955,7 +63033,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62967,7 +63045,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -62979,7 +63057,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63005,7 +63083,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63021,7 +63099,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63037,7 +63115,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63063,7 +63141,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63079,7 +63157,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63095,7 +63173,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63121,7 +63199,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63137,7 +63215,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63153,7 +63231,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63172,7 +63250,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63188,7 +63266,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63204,7 +63282,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63223,7 +63301,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63239,7 +63317,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63255,7 +63333,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63281,7 +63359,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63297,7 +63375,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63313,7 +63391,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63328,7 +63406,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63340,7 +63418,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63352,7 +63430,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63367,7 +63445,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63379,7 +63457,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63391,7 +63469,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63406,7 +63484,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63418,7 +63496,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63430,7 +63508,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63456,7 +63534,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63472,7 +63550,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63488,7 +63566,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63503,7 +63581,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63515,7 +63593,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63527,7 +63605,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63542,7 +63620,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63554,7 +63632,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63566,7 +63644,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63592,7 +63670,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63608,7 +63686,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63624,7 +63702,46 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } +} +cont { + name: "shop-laundry" + element { + scale: 17 + caption { + primary { + height: 11 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } + element { + scale: 18 + caption { + primary { + height: 11 + color: 4210752 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15003 + } + } + element { + scale: 19 + caption { + primary { + height: 11 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63650,7 +63767,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63666,7 +63783,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63682,7 +63799,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63701,7 +63818,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63717,7 +63834,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63733,7 +63850,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63748,7 +63865,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63760,7 +63877,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63772,7 +63889,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63791,7 +63908,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63807,7 +63924,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63823,7 +63940,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63842,7 +63959,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63858,7 +63975,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63874,7 +63991,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63900,7 +64017,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63916,7 +64033,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63932,7 +64049,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63947,7 +64064,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63959,7 +64076,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -63971,7 +64088,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64518,7 +64635,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64534,7 +64651,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64550,7 +64667,7 @@ cont { caption { primary { height: 12 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64566,7 +64683,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64582,7 +64699,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64598,7 +64715,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64631,7 +64748,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64647,7 +64764,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64663,7 +64780,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64678,7 +64795,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -64689,7 +64806,7 @@ cont { caption { primary { height: 12 - color: 2236962 + color: 2105376 stroke_color: 16777215 } priority: 15000 @@ -64700,7 +64817,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64712,7 +64829,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64724,7 +64841,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64737,21 +64854,21 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16431 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16432 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16433 } symbol { @@ -64762,7 +64879,7 @@ cont { element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16434 } symbol { @@ -64773,7 +64890,7 @@ cont { element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16435 } symbol { @@ -64784,7 +64901,7 @@ cont { element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -15997 } symbol { @@ -64794,7 +64911,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64804,7 +64921,7 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -15997 } symbol { @@ -64814,7 +64931,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64824,7 +64941,7 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -15997 } symbol { @@ -64834,7 +64951,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64847,48 +64964,48 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16436 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16437 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16438 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16439 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16440 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -15997 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64898,13 +65015,13 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -15997 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64914,13 +65031,13 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -15997 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64946,7 +65063,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64962,7 +65079,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -64978,7 +65095,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65004,7 +65121,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65020,7 +65137,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65036,7 +65153,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65062,7 +65179,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65078,7 +65195,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65094,7 +65211,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65113,7 +65230,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65129,7 +65246,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65145,7 +65262,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65164,7 +65281,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65180,7 +65297,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65196,7 +65313,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65215,7 +65332,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65231,7 +65348,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65247,7 +65364,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65273,7 +65390,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65289,7 +65406,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65305,7 +65422,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65331,7 +65448,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65347,7 +65464,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65363,7 +65480,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65376,42 +65493,42 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16441 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16442 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16443 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16444 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16445 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -15997 } symbol { @@ -65421,7 +65538,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65431,7 +65548,7 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -15997 } symbol { @@ -65441,7 +65558,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65451,7 +65568,7 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -15997 } symbol { @@ -65461,7 +65578,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65494,7 +65611,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65510,7 +65627,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65526,7 +65643,7 @@ cont { caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65539,48 +65656,48 @@ cont { element { scale: 12 area { - color: 13430459 + color: 13626551 priority: -16446 } } element { scale: 13 area { - color: 13430459 + color: 13626551 priority: -16447 } } element { scale: 14 area { - color: 13430459 + color: 13626551 priority: -16448 } } element { scale: 15 area { - color: 13430459 + color: 13626551 priority: -16449 } } element { scale: 16 area { - color: 13430459 + color: 13626551 priority: -16450 } } element { scale: 17 area { - color: 13430459 + color: 13626551 priority: -15997 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65590,13 +65707,13 @@ cont { element { scale: 18 area { - color: 13430459 + color: 13626551 priority: -15997 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65606,13 +65723,13 @@ cont { element { scale: 19 area { - color: 13430459 + color: 13626551 priority: -15997 } caption { primary { height: 11 - color: 4473924 + color: 4210752 stroke_color: 16777215 offset_y: 10 } @@ -65626,7 +65743,7 @@ cont { scale: 12 lines { width: 2.5 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -65636,7 +65753,7 @@ cont { scale: 13 lines { width: 3.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -65646,7 +65763,7 @@ cont { scale: 14 lines { width: 4.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -65654,7 +65771,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -65663,7 +65780,7 @@ cont { scale: 15 lines { width: 4.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -65671,7 +65788,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -65680,7 +65797,7 @@ cont { scale: 16 lines { width: 4.8 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -65688,7 +65805,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -65697,14 +65814,14 @@ cont { scale: 17 lines { width: 8.0 - color: 12303291 + color: 11579568 priority: 1023 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -65712,7 +65829,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -65721,14 +65838,14 @@ cont { scale: 18 lines { width: 8.0 - color: 12303291 + color: 11579568 priority: 1023 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -65736,7 +65853,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -65745,14 +65862,14 @@ cont { scale: 19 lines { width: 8.0 - color: 12303291 + color: 11579568 priority: 1023 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -65760,7 +65877,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -65772,7 +65889,7 @@ cont { scale: 14 lines { width: 0.38 - color: 2236962 + color: 2105376 priority: 1128 join: ROUNDJOIN cap: ROUNDCAP @@ -65782,7 +65899,7 @@ cont { scale: 15 lines { width: 1.5 - color: 2236962 + color: 2105376 priority: 1137 join: ROUNDJOIN cap: ROUNDCAP @@ -65792,7 +65909,7 @@ cont { scale: 16 lines { width: 3.0 - color: 2236962 + color: 2105376 priority: 1143 join: ROUNDJOIN cap: ROUNDCAP @@ -65802,7 +65919,7 @@ cont { scale: 17 lines { width: 4.0 - color: 2236962 + color: 2105376 priority: 1149 join: ROUNDJOIN cap: ROUNDCAP @@ -65812,7 +65929,7 @@ cont { scale: 18 lines { width: 4.0 - color: 2236962 + color: 2105376 priority: 1149 join: ROUNDJOIN cap: ROUNDCAP @@ -65822,7 +65939,7 @@ cont { scale: 19 lines { width: 4.0 - color: 2236962 + color: 2105376 priority: 1149 join: ROUNDJOIN cap: ROUNDCAP @@ -65835,7 +65952,7 @@ cont { scale: 12 lines { width: 0.3 - color: 10079453 + color: 9487572 priority: 1067 join: ROUNDJOIN cap: ROUNDCAP @@ -65845,7 +65962,7 @@ cont { scale: 13 lines { width: 0.4 - color: 10079453 + color: 9487572 priority: 1076 join: ROUNDJOIN cap: ROUNDCAP @@ -65855,7 +65972,7 @@ cont { scale: 14 lines { width: 0.3 - color: 10079453 + color: 9487572 priority: 1100 join: ROUNDJOIN cap: ROUNDCAP @@ -65865,7 +65982,7 @@ cont { scale: 15 lines { width: 0.6 - color: 10079453 + color: 9487572 priority: 1110 join: ROUNDJOIN cap: ROUNDCAP @@ -65873,7 +65990,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16110 } @@ -65882,7 +65999,7 @@ cont { scale: 16 lines { width: 0.6 - color: 10079453 + color: 9487572 priority: 1116 join: ROUNDJOIN cap: ROUNDCAP @@ -65890,7 +66007,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16116 } @@ -65899,7 +66016,7 @@ cont { scale: 17 lines { width: 0.8 - color: 10079453 + color: 9487572 priority: 1122 join: ROUNDJOIN cap: ROUNDCAP @@ -65907,7 +66024,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16122 } @@ -65916,7 +66033,7 @@ cont { scale: 18 lines { width: 0.8 - color: 10079453 + color: 9487572 priority: 1122 join: ROUNDJOIN cap: ROUNDCAP @@ -65924,7 +66041,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16122 } @@ -65933,7 +66050,7 @@ cont { scale: 19 lines { width: 0.8 - color: 10079453 + color: 9487572 priority: 1122 join: ROUNDJOIN cap: ROUNDCAP @@ -65941,7 +66058,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16122 } @@ -65952,140 +66069,140 @@ cont { element { scale: 0 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 1 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 2 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 3 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 4 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 5 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 6 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 7 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 8 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 9 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 10 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 11 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 12 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 13 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 14 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 15 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 16 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 17 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 18 area { - color: 10079453 + color: 9487572 priority: 1095 } } element { scale: 19 area { - color: 10079453 + color: 9487572 priority: 1095 } } @@ -66096,7 +66213,7 @@ cont { scale: 12 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1064 join: ROUNDJOIN cap: ROUNDCAP @@ -66106,7 +66223,7 @@ cont { scale: 13 lines { width: 1.5 - color: 10079453 + color: 9487572 priority: 1073 join: ROUNDJOIN cap: ROUNDCAP @@ -66116,7 +66233,7 @@ cont { scale: 14 lines { width: 2.3 - color: 10079453 + color: 9487572 priority: 1000 join: ROUNDJOIN cap: ROUNDCAP @@ -66126,14 +66243,14 @@ cont { scale: 15 lines { width: 3.5 - color: 12303291 + color: 11579568 priority: 1106 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.8 - color: 10079453 + color: 9487572 priority: 1107 join: ROUNDJOIN cap: ROUNDCAP @@ -66141,7 +66258,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16107 } @@ -66150,14 +66267,14 @@ cont { scale: 16 lines { width: 5.2 - color: 12303291 + color: 11579568 priority: 1112 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.0 - color: 10079453 + color: 9487572 priority: 1113 join: ROUNDJOIN cap: ROUNDCAP @@ -66165,7 +66282,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16113 } @@ -66174,14 +66291,14 @@ cont { scale: 17 lines { width: 8.0 - color: 12303291 + color: 11579568 priority: 1118 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 10079453 + color: 9487572 priority: 1119 join: ROUNDJOIN cap: ROUNDCAP @@ -66189,7 +66306,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16119 } @@ -66198,14 +66315,14 @@ cont { scale: 18 lines { width: 8.0 - color: 12303291 + color: 11579568 priority: 1118 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 10079453 + color: 9487572 priority: 1119 join: ROUNDJOIN cap: ROUNDCAP @@ -66213,7 +66330,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16119 } @@ -66222,14 +66339,14 @@ cont { scale: 19 lines { width: 8.0 - color: 12303291 + color: 11579568 priority: 1118 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 10079453 + color: 9487572 priority: 1119 join: ROUNDJOIN cap: ROUNDCAP @@ -66237,7 +66354,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16119 } @@ -66249,14 +66366,14 @@ cont { scale: 14 lines { width: 6.0 - color: 2236962 + color: 2105376 priority: 1078 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 16777215 + color: 16316664 priority: 1079 join: ROUNDJOIN cap: ROUNDCAP @@ -66266,14 +66383,14 @@ cont { scale: 15 lines { width: 10.0 - color: 2236962 + color: 2105376 priority: 1081 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16777215 + color: 16316664 priority: 1082 join: ROUNDJOIN cap: ROUNDCAP @@ -66283,14 +66400,14 @@ cont { scale: 16 lines { width: 12.0 - color: 2236962 + color: 2105376 priority: 1084 join: ROUNDJOIN cap: BUTTCAP } lines { width: 10.0 - color: 16777215 + color: 16316664 priority: 1085 join: ROUNDJOIN cap: ROUNDCAP @@ -66300,14 +66417,14 @@ cont { scale: 17 lines { width: 16.0 - color: 2236962 + color: 2105376 priority: 1087 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777215 + color: 16316664 priority: 1088 join: ROUNDJOIN cap: ROUNDCAP @@ -66317,14 +66434,14 @@ cont { scale: 18 lines { width: 16.0 - color: 2236962 + color: 2105376 priority: 1087 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777215 + color: 16316664 priority: 1088 join: ROUNDJOIN cap: ROUNDCAP @@ -66334,14 +66451,14 @@ cont { scale: 19 lines { width: 16.0 - color: 2236962 + color: 2105376 priority: 1087 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.0 - color: 16777215 + color: 16316664 priority: 1088 join: ROUNDJOIN cap: ROUNDCAP @@ -66354,7 +66471,7 @@ cont { scale: 10 lines { width: 0.5 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66364,7 +66481,7 @@ cont { scale: 11 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66372,7 +66489,7 @@ cont { path_text { primary { height: 10 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66381,7 +66498,7 @@ cont { scale: 12 lines { width: 2.5 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66389,7 +66506,7 @@ cont { path_text { primary { height: 10 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66398,7 +66515,7 @@ cont { scale: 13 lines { width: 3.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66406,7 +66523,7 @@ cont { path_text { primary { height: 10 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66415,7 +66532,7 @@ cont { scale: 14 lines { width: 4.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66423,7 +66540,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66432,7 +66549,7 @@ cont { scale: 15 lines { width: 5.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66440,7 +66557,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66449,7 +66566,7 @@ cont { scale: 16 lines { width: 8.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66457,7 +66574,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66466,7 +66583,7 @@ cont { scale: 17 lines { width: 16.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66474,7 +66591,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66483,7 +66600,7 @@ cont { scale: 18 lines { width: 16.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66491,7 +66608,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66500,7 +66617,7 @@ cont { scale: 19 lines { width: 16.0 - color: 10079453 + color: 9487572 priority: 1024 join: ROUNDJOIN cap: ROUNDCAP @@ -66508,7 +66625,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16024 } @@ -66519,140 +66636,140 @@ cont { element { scale: 0 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 1 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 2 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 3 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 4 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 5 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 6 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 7 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 8 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 9 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 10 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 11 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 12 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 13 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 14 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 15 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 16 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 17 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 18 area { - color: 10079453 + color: 9487572 priority: 1025 } } element { scale: 19 area { - color: 10079453 + color: 9487572 priority: 1025 } } @@ -66663,7 +66780,7 @@ cont { scale: 12 lines { width: 0.75 - color: 10079453 + color: 9487572 priority: 1061 join: ROUNDJOIN cap: ROUNDCAP @@ -66673,7 +66790,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1070 join: ROUNDJOIN cap: ROUNDCAP @@ -66683,7 +66800,7 @@ cont { scale: 14 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1097 join: ROUNDJOIN cap: ROUNDCAP @@ -66693,7 +66810,7 @@ cont { scale: 15 lines { width: 2.0 - color: 10079453 + color: 9487572 priority: 1103 join: ROUNDJOIN cap: ROUNDCAP @@ -66701,7 +66818,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16103 } @@ -66710,7 +66827,7 @@ cont { scale: 16 lines { width: 2.0 - color: 10079453 + color: 9487572 priority: 1107 join: ROUNDJOIN cap: ROUNDCAP @@ -66718,7 +66835,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16107 } @@ -66727,7 +66844,7 @@ cont { scale: 17 lines { width: 2.2 - color: 10079453 + color: 9487572 priority: 1113 join: ROUNDJOIN cap: ROUNDCAP @@ -66735,7 +66852,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16113 } @@ -66744,7 +66861,7 @@ cont { scale: 18 lines { width: 2.2 - color: 10079453 + color: 9487572 priority: 1113 join: ROUNDJOIN cap: ROUNDCAP @@ -66752,7 +66869,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16113 } @@ -66761,7 +66878,7 @@ cont { scale: 19 lines { width: 2.2 - color: 10079453 + color: 9487572 priority: 1113 join: ROUNDJOIN cap: ROUNDCAP @@ -66769,7 +66886,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16113 } @@ -66781,7 +66898,7 @@ cont { scale: 12 lines { width: 0.75 - color: 10079453 + color: 9487572 priority: 1061 join: ROUNDJOIN cap: ROUNDCAP @@ -66791,7 +66908,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1070 join: ROUNDJOIN cap: ROUNDCAP @@ -66801,7 +66918,7 @@ cont { scale: 14 lines { width: 1.0 - color: 10079453 + color: 9487572 dashdot { dd: 1.6 dd: 1.6 @@ -66815,7 +66932,7 @@ cont { scale: 15 lines { width: 2.0 - color: 10079453 + color: 9487572 dashdot { dd: 1.6 dd: 1.6 @@ -66827,7 +66944,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16100 } @@ -66836,7 +66953,7 @@ cont { scale: 16 lines { width: 2.0 - color: 10079453 + color: 9487572 dashdot { dd: 1.6 dd: 1.6 @@ -66848,7 +66965,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16103 } @@ -66857,7 +66974,7 @@ cont { scale: 17 lines { width: 2.2 - color: 10079453 + color: 9487572 dashdot { dd: 1.6 dd: 1.6 @@ -66869,7 +66986,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16110 } @@ -66878,7 +66995,7 @@ cont { scale: 18 lines { width: 2.2 - color: 10079453 + color: 9487572 dashdot { dd: 1.6 dd: 1.6 @@ -66890,7 +67007,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16110 } @@ -66899,7 +67016,7 @@ cont { scale: 19 lines { width: 2.2 - color: 10079453 + color: 9487572 dashdot { dd: 1.6 dd: 1.6 @@ -66911,7 +67028,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16110 } @@ -66923,7 +67040,7 @@ cont { scale: 12 lines { width: 0.75 - color: 10079453 + color: 9487572 priority: 1061 join: ROUNDJOIN cap: ROUNDCAP @@ -66933,7 +67050,7 @@ cont { scale: 13 lines { width: 1.0 - color: 10079453 + color: 9487572 priority: 1070 join: ROUNDJOIN cap: ROUNDCAP @@ -66943,7 +67060,7 @@ cont { scale: 14 lines { width: 1.0 - color: 10079453 + color: 9487572 dashdot { dd: 2.4 dd: 1.0 @@ -66957,7 +67074,7 @@ cont { scale: 15 lines { width: 2.0 - color: 10079453 + color: 9487572 dashdot { dd: 2.4 dd: 1.0 @@ -66969,7 +67086,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16103 } @@ -66978,7 +67095,7 @@ cont { scale: 16 lines { width: 2.0 - color: 10079453 + color: 9487572 dashdot { dd: 2.4 dd: 1.0 @@ -66990,7 +67107,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16107 } @@ -66999,7 +67116,7 @@ cont { scale: 17 lines { width: 2.2 - color: 10079453 + color: 9487572 dashdot { dd: 2.4 dd: 1.0 @@ -67011,7 +67128,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16107 } @@ -67020,7 +67137,7 @@ cont { scale: 18 lines { width: 2.2 - color: 10079453 + color: 9487572 dashdot { dd: 2.4 dd: 1.0 @@ -67032,7 +67149,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16107 } @@ -67041,7 +67158,7 @@ cont { scale: 19 lines { width: 2.2 - color: 10079453 + color: 9487572 dashdot { dd: 2.4 dd: 1.0 @@ -67053,7 +67170,7 @@ cont { path_text { primary { height: 12 - color: 5601262 + color: 5274858 } priority: 16107 } diff --git a/data/drules_proto_clear.bin b/data/drules_proto_clear.bin index 00d2bbbfe4..f835c72209 100644 Binary files a/data/drules_proto_clear.bin and b/data/drules_proto_clear.bin differ diff --git a/data/drules_proto_clear.txt b/data/drules_proto_clear.txt index 20bfc73070..2912a2b6a4 100644 --- a/data/drules_proto_clear.txt +++ b/data/drules_proto_clear.txt @@ -4,52 +4,52 @@ cont { scale: 14 lines { width: 0.5 - color: 1719105399 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 color: 1719105399 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { scale: 15 lines { width: 0.5 - color: 1719105399 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -58,15 +58,15 @@ cont { stroke_color: 2164260863 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { scale: 16 lines { width: 1.0 - color: 1299674999 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -75,16 +75,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -93,7 +93,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -101,7 +101,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1921 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -110,16 +110,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -128,7 +128,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -136,7 +136,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1921 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -145,16 +145,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -163,7 +163,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -171,7 +171,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1875 + priority: 1680 join: ROUNDJOIN cap: ROUNDCAP } @@ -180,9 +180,9 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } @@ -194,52 +194,52 @@ cont { scale: 14 lines { width: 0.5 - color: 1719105399 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 color: 1719105399 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { scale: 15 lines { width: 0.5 - color: 1719105399 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -248,15 +248,15 @@ cont { stroke_color: 2164260863 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { scale: 16 lines { width: 1.0 - color: 1299674999 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -265,16 +265,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -283,7 +283,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -291,7 +291,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1921 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -300,16 +300,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -318,7 +318,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -326,7 +326,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1921 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -335,16 +335,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -353,7 +353,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -361,7 +361,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1875 + priority: 1680 join: ROUNDJOIN cap: ROUNDCAP } @@ -370,9 +370,9 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } @@ -384,52 +384,52 @@ cont { scale: 14 lines { width: 0.5 - color: 1719105399 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 color: 1719105399 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { scale: 15 lines { width: 0.5 - color: 1719105399 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -438,15 +438,15 @@ cont { stroke_color: 2164260863 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { scale: 16 lines { width: 1.0 - color: 1299674999 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -455,16 +455,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -473,7 +473,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -481,7 +481,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1921 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -490,16 +490,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -508,7 +508,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -516,7 +516,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1921 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -525,16 +525,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -543,7 +543,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -551,7 +551,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1875 + priority: 1680 join: ROUNDJOIN cap: ROUNDCAP } @@ -560,9 +560,9 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } @@ -574,52 +574,52 @@ cont { scale: 14 lines { width: 0.5 - color: 1719105399 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 color: 1719105399 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { scale: 15 lines { width: 0.5 - color: 1719105399 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -628,15 +628,15 @@ cont { stroke_color: 2164260863 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { scale: 16 lines { width: 1.0 - color: 1299674999 - priority: 1921 + color: 7829367 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -645,16 +645,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -663,7 +663,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -671,7 +671,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1921 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -680,16 +680,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -698,7 +698,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -706,7 +706,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1921 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } @@ -715,16 +715,16 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -733,7 +733,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -741,7 +741,7 @@ cont { lines { width: 1.0 color: 7829367 - priority: 1875 + priority: 1680 join: ROUNDJOIN cap: ROUNDCAP } @@ -750,9 +750,9 @@ cont { color: 7829367 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } @@ -765,7 +765,7 @@ cont { symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { @@ -773,7 +773,7 @@ cont { symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -782,7 +782,7 @@ cont { stroke_color: 2164260863 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { @@ -790,7 +790,7 @@ cont { symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -799,7 +799,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -807,7 +807,7 @@ cont { symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -816,7 +816,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -824,7 +824,7 @@ cont { symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -833,7 +833,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -841,7 +841,7 @@ cont { symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { @@ -850,32 +850,59 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15921 + priority: 15958 } } } cont { name: "aeroway-aerodrome" + element { + scale: 12 + area { + color: 13746411 + priority: -15987 + } + } + element { + scale: 13 + area { + color: 13615592 + priority: -15987 + } + } element { scale: 14 area { - color: 3016539118 - priority: -15735 + color: 13484259 + priority: -15209 + } + symbol { + name: "airport-l" + priority: 16791 + } + caption { + primary { + height: 10 + color: 3355443 + stroke_color: 2164260863 + offset_y: 8 + } + priority: 15791 } } element { scale: 15 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -887,22 +914,22 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 16 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -914,22 +941,22 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 17 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -941,22 +968,22 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 18 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -968,22 +995,22 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 19 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -995,7 +1022,7 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } } @@ -1004,12 +1031,12 @@ cont { element { scale: 10 area { - color: 13417454 - priority: -15735 + color: 13942770 + priority: -15209 } symbol { name: "airport-s" - priority: 16265 + priority: 16791 } caption { primary { @@ -1018,22 +1045,22 @@ cont { stroke_color: 2164260863 offset_y: 7 } - priority: 15265 + priority: 15791 } } element { scale: 11 area { - color: 1305263086 - priority: -15079 + color: 13942770 + priority: -15209 } symbol { name: "airport-m" - priority: 16921 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -1045,22 +1072,22 @@ cont { offset_y: 20 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 12 area { - color: 1724693486 - priority: -15079 + color: 13746411 + priority: -15209 } symbol { name: "airport-m" - priority: 16921 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -1072,22 +1099,22 @@ cont { offset_y: 20 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 13 area { - color: 2160901102 - priority: -15079 + color: 13615592 + priority: -15209 } symbol { name: "airport-m" - priority: 16921 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -1099,25 +1126,25 @@ cont { offset_y: 20 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 14 area { - color: 3016539118 - priority: -15079 + color: 13484259 + priority: -15209 } symbol { - name: "airport-m" - priority: 16921 + name: "airport-l" + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 - offset_y: 7 + offset_y: 8 } secondary { height: 9 @@ -1126,22 +1153,22 @@ cont { offset_y: 20 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 15 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -1153,22 +1180,22 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 16 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -1180,22 +1207,22 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 17 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -1207,22 +1234,22 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 18 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -1234,22 +1261,22 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 19 area { - color: 3016539118 - priority: -15079 + color: 13155550 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -1261,7 +1288,88 @@ cont { offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 + } + } +} +cont { + name: "aeroway-gate" + element { + scale: 18 + symbol { + name: "gate-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "gate-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "aeroway-helipad" + element { + scale: 17 + symbol { + name: "heliport-m" + priority: 16750 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15750 + } + } + element { + scale: 18 + symbol { + name: "heliport-m" + priority: 16750 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15750 + } + } + element { + scale: 19 + symbol { + name: "heliport-m" + priority: 16750 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15750 } } } @@ -1271,48 +1379,48 @@ cont { scale: 12 lines { width: 1.0 - color: 2164260863 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + color: 2163800312 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { width: 1.5 - color: 872415231 - priority: 1000 + color: 871954680 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 5.0 - color: 16777215 - priority: 1000 + width: 2.4 + color: 16316664 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 5.0 - color: 16777215 - priority: 1000 + width: 2.4 + color: 16316664 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 5.0 - color: 16777215 - priority: 1000 + width: 4.0 + color: 16316664 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1320,9 +1428,9 @@ cont { element { scale: 17 lines { - width: 8.0 - color: 16777215 - priority: 1000 + width: 4.0 + color: 16316664 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1330,9 +1438,9 @@ cont { element { scale: 18 lines { - width: 8.0 - color: 16777215 - priority: 1000 + width: 4.0 + color: 16316664 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1340,9 +1448,9 @@ cont { element { scale: 19 lines { - width: 8.0 - color: 16777215 - priority: 1000 + width: 4.0 + color: 16316664 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1353,29 +1461,29 @@ cont { element { scale: 14 lines { - width: 0.5 - color: 1728053247 - priority: 1000 + width: 0.6 + color: 1727592696 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.0 - color: 1728053247 - priority: 1000 + width: 1.2 + color: 1727592696 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 1728053247 - priority: 1000 + width: 1.2 + color: 1727592696 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1383,9 +1491,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 1728053247 - priority: 1000 + width: 1.2 + color: 1727592696 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1393,9 +1501,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 1728053247 - priority: 1000 + width: 1.2 + color: 1727592696 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1403,9 +1511,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 1728053247 - priority: 1000 + width: 1.2 + color: 1727592696 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1416,78 +1524,78 @@ cont { element { scale: 14 area { - color: 869059771 - priority: -15641 + color: 868862139 + priority: -15695 } } element { scale: 15 area { - color: 869059771 - priority: -15641 + color: 868862139 + priority: -15695 } caption { primary { height: 9 - color: 7829367 + color: 6645093 } - priority: 15359 + priority: 15305 } } element { scale: 16 area { - color: 13421755 - priority: -15641 + color: 13224123 + priority: -15695 } caption { primary { height: 9 - color: 7829367 + color: 6645093 } - priority: 15359 + priority: 15305 } } element { scale: 17 area { - color: 12303274 - priority: -15641 + color: 12763315 + priority: -15695 } caption { primary { height: 9 - color: 7829367 + color: 6645093 } - priority: 15359 + priority: 15305 } } element { scale: 18 area { - color: 12303274 - priority: -15641 + color: 12763315 + priority: -15695 } caption { primary { height: 9 - color: 7829367 + color: 6645093 } - priority: 15359 + priority: 15305 } } element { scale: 19 area { - color: 12303274 - priority: -15641 + color: 12763315 + priority: -15695 } caption { primary { height: 9 - color: 7829367 + color: 6645093 } - priority: 15359 + priority: 15305 } } } @@ -1497,15 +1605,15 @@ cont { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -1515,30 +1623,30 @@ cont { scale: 18 symbol { name: "atm-l" - priority: 16796 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15796 + priority: 15736 } } element { scale: 19 symbol { name: "atm-l" - priority: 16796 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15796 + priority: 15736 } } } @@ -1548,45 +1656,45 @@ cont { scale: 17 symbol { name: "bank-l" - priority: 16812 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15812 + priority: 15750 } } element { scale: 18 symbol { name: "bank-l" - priority: 16812 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15812 + priority: 15750 } } element { scale: 19 symbol { name: "bank-l" - priority: 16812 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15812 + priority: 15750 } } } @@ -1595,49 +1703,64 @@ cont { element { scale: 18 symbol { - name: "bar-l" - priority: 16781 + name: "beer-l" + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { - name: "bar-l" - priority: 16781 + name: "beer-l" + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-bbq" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "bbq-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "bbq-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -1648,22 +1771,22 @@ cont { symbol { name: "bench" apply_for_type: 1 - priority: 16781 + priority: 16722 } } element { scale: 19 symbol { name: "bench" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -1673,45 +1796,45 @@ cont { scale: 17 symbol { name: "bicycle-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 18 symbol { name: "bicycle-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "bicycle-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -1721,15 +1844,15 @@ cont { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -1740,30 +1863,30 @@ cont { symbol { name: "banknote-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "banknote-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -1774,18 +1897,18 @@ cont { symbol { name: "bus-l" apply_for_type: 1 - priority: 16781 + priority: 16000 } } element { scale: 16 symbol { name: "bus-l" - priority: 16781 + priority: 16972 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -1797,18 +1920,18 @@ cont { offset_y: 8 text: "int_name" } - priority: 15781 + priority: 15972 } } element { scale: 17 symbol { name: "bus-l" - priority: 16781 + priority: 16972 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -1820,18 +1943,18 @@ cont { offset_y: 8 text: "int_name" } - priority: 15781 + priority: 15972 } } element { scale: 18 symbol { name: "bus-l" - priority: 16781 + priority: 16972 } caption { primary { - height: 12 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -1843,180 +1966,211 @@ cont { offset_y: 8 text: "int_name" } - priority: 15781 + priority: 15972 } } element { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16972 } caption { primary { height: 10 color: 4473924 stroke_color: 2164260863 - offset_y: 8 + offset_y: 10 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 offset_y: 10 text: "int_name" } - priority: 15781 + priority: 15972 } } } cont { name: "amenity-cafe" element { - scale: 17 + scale: 16 symbol { - name: "cafe-l" - priority: 16781 + name: "cafe-m" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 + } + } + element { + scale: 17 + symbol { + name: "cafe-l" + priority: 16750 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15750 } } element { scale: 18 symbol { name: "cafe-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "cafe-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-car_rental" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "car_sharing-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "car_sharing-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "amenity-car_sharing" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "car_sharing-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "car_sharing-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "amenity-casino" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "casino-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "casino-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "amenity-cinema" - element { - scale: 17 - symbol { - name: "cinema-l" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } - element { - scale: 18 - symbol { - name: "cinema-l" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 19 symbol { - name: "cinema-l" - priority: 16781 + name: "none" + priority: 16000 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -2026,60 +2180,60 @@ cont { scale: 16 symbol { name: "hospital-m" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 17 symbol { name: "hospital-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 18 symbol { name: "hospital-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 symbol { name: "hospital-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -2089,156 +2243,96 @@ cont { scale: 16 symbol { name: "college-m" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 17 symbol { name: "college-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "college-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "college-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-dentist" - element { - scale: 16 - symbol { - name: "hospital-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } - element { - scale: 17 - symbol { - name: "hospital-l" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } - element { - scale: 18 - symbol { - name: "hospital-l" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 19 symbol { - name: "hospital-l" - priority: 16781 + name: "none" + priority: 16000 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } cont { name: "amenity-doctors" - element { - scale: 16 - symbol { - name: "hospital-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -2248,29 +2342,29 @@ cont { scale: 17 symbol { name: "drinking-water-l" - priority: 16781 + priority: 16722 } } element { scale: 18 symbol { name: "drinking-water-l" - priority: 16781 + priority: 16722 } } element { scale: 19 symbol { name: "drinking-water-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -2280,45 +2374,45 @@ cont { scale: 17 symbol { name: "embassy-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "embassy-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "embassy-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -2328,30 +2422,30 @@ cont { scale: 18 symbol { name: "fastfood-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "fastfood-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -2362,7 +2456,7 @@ cont { symbol { name: "ship-s" apply_for_type: 1 - priority: 16921 + priority: 16972 } } element { @@ -2370,7 +2464,7 @@ cont { symbol { name: "ship-s" apply_for_type: 1 - priority: 16781 + priority: 16972 } } element { @@ -2378,16 +2472,16 @@ cont { symbol { name: "ship-m" apply_for_type: 1 - priority: 16781 + priority: 16972 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 } - priority: 15781 + priority: 15972 } } element { @@ -2395,7 +2489,7 @@ cont { symbol { name: "ship-l" apply_for_type: 1 - priority: 16781 + priority: 16972 } caption { primary { @@ -2404,7 +2498,7 @@ cont { stroke_color: 2164260863 offset_y: 10 } - priority: 15781 + priority: 15972 } } element { @@ -2412,7 +2506,7 @@ cont { symbol { name: "ship-l" apply_for_type: 1 - priority: 16781 + priority: 16972 } caption { primary { @@ -2421,41 +2515,56 @@ cont { stroke_color: 2164260863 offset_y: 10 } - priority: 15781 + priority: 15972 } } element { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16972 } caption { primary { height: 10 color: 4473924 stroke_color: 2164260863 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15972 } } } cont { name: "amenity-fire_station" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "fire_station-l" + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "none" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 } } } @@ -2464,128 +2573,113 @@ cont { element { scale: 16 area { - color: 8965341 - priority: -15219 + color: 9163744 + priority: -15778 } } element { scale: 17 area { - color: 8965341 - priority: -15360 + color: 9163744 + priority: -15264 } symbol { name: "fountain-l" - priority: 16640 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15736 } } element { scale: 18 area { - color: 8965341 - priority: -15360 + color: 9163744 + priority: -15264 } symbol { name: "fountain-l" - priority: 16640 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15736 } } element { scale: 19 area { - color: 8965341 - priority: -15360 + color: 9163744 + priority: -15264 } symbol { name: "fountain-l" - priority: 16640 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15736 } } } cont { name: "amenity-fuel" - element { - scale: 16 - symbol { - name: "fuel-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 17 symbol { name: "fuel-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "fuel-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "fuel-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -2594,33 +2688,33 @@ cont { element { scale: 14 area { - color: 665500518 - priority: -15813 + color: 666683518 + priority: -15848 } } element { scale: 15 area { - color: 11189094 - priority: -15219 + color: 12372094 + priority: -15848 } } element { scale: 16 area { - color: 11189094 - priority: -15219 + color: 11781233 + priority: -15848 } } element { scale: 17 area { - color: 11189094 - priority: -15219 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16781 + priority: 16569 } caption { primary { @@ -2628,18 +2722,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15781 + priority: 15569 } } element { scale: 18 area { - color: 11189094 - priority: -15219 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16781 + priority: 16569 } caption { primary { @@ -2647,26 +2741,26 @@ cont { color: 4473924 offset_y: 10 } - priority: 15781 + priority: 15569 } } element { scale: 19 area { - color: 11189094 - priority: -15219 + color: 11781233 + priority: -15431 } symbol { name: "none" - priority: 16781 + priority: 16569 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15569 } } } @@ -2675,33 +2769,33 @@ cont { element { scale: 14 area { - color: 665500518 - priority: -15813 + color: 666683518 + priority: -15848 } } element { scale: 15 area { - color: 11189094 - priority: -15219 + color: 12372094 + priority: -15848 } } element { scale: 16 area { - color: 11189094 - priority: -15219 + color: 11781233 + priority: -15848 } } element { scale: 17 area { - color: 11189094 - priority: -15219 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16781 + priority: 16569 } caption { primary { @@ -2709,18 +2803,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15781 + priority: 15569 } } element { scale: 18 area { - color: 11189094 - priority: -15219 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16781 + priority: 16569 } caption { primary { @@ -2728,26 +2822,26 @@ cont { color: 4473924 offset_y: 10 } - priority: 15781 + priority: 15569 } } element { scale: 19 area { - color: 11189094 - priority: -15219 + color: 11781233 + priority: -15431 } symbol { name: "none" - priority: 16781 + priority: 16569 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15569 } } } @@ -2756,185 +2850,220 @@ cont { element { scale: 14 area { - color: 16755370 - priority: -15969 + color: 15453902 + priority: -15973 } } element { scale: 15 area { - color: 16755370 - priority: -15219 - } - symbol { - name: "hospital-m" - apply_for_type: 1 - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 + color: 15453902 + priority: -15973 } } element { scale: 16 area { - color: 16755370 - priority: -15219 + color: 15453902 + priority: -15237 } symbol { name: "hospital-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 17 area { - color: 16755370 - priority: -15219 + color: 15453902 + priority: -15237 } symbol { name: "hospital-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 18 area { - color: 16755370 - priority: -15219 + color: 15453902 + priority: -15237 } symbol { name: "hospital-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 19 area { - color: 16755370 - priority: -15219 + color: 15453902 + priority: -15237 } symbol { name: "hospital-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } } cont { name: "amenity-hunting_stand" element { - scale: 19 + scale: 15 symbol { - name: "none" - priority: 16781 + name: "hunting-tower-m" + apply_for_type: 1 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 16 + symbol { + name: "hunting-tower-m" + apply_for_type: 1 + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 17 + symbol { + name: "hunting-tower-m" + apply_for_type: 1 + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 18 + symbol { + name: "hunting-tower-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "hunting-tower-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 } } } cont { name: "amenity-kindergarten" - element { - scale: 16 - symbol { - name: "kindergarten-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 17 symbol { name: "kindergarten-l" - priority: 16781 + priority: 16930 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15930 } } element { scale: 18 symbol { name: "kindergarten-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 symbol { name: "kindergarten-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -2945,66 +3074,96 @@ cont { symbol { name: "library-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "library-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } cont { name: "amenity-marketplace" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "marketplace-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "marketplace-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "amenity-nightclub" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "bar-l" + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "bar-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 } } } @@ -3013,58 +3172,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3073,58 +3232,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3133,58 +3292,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3193,58 +3352,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3253,58 +3412,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3313,58 +3472,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3373,58 +3532,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "zero-icon" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3433,58 +3592,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "zero-icon" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3493,58 +3652,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "zero-icon" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3553,58 +3712,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3613,58 +3772,58 @@ cont { element { scale: 16 area { - color: 15658700 - priority: 1922 + color: 15921870 + priority: -15931 } } element { scale: 17 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { - color: 15658700 - priority: 1063 + color: 15921870 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3674,30 +3833,30 @@ cont { scale: 18 symbol { name: "pharmacy-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "pharmacy-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -3705,62 +3864,78 @@ cont { name: "amenity-place_of_worship" element { scale: 16 + area { + color: 16316664 + priority: -15250 + } symbol { name: "place-of-worship-m" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 17 + area { + color: 16316664 + priority: -15250 + } symbol { name: "place-of-worship-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 + area { + color: 16316664 + priority: -15250 + } symbol { name: "place-of-worship-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 + area { + color: 16316664 + priority: -15250 + } symbol { name: "place-of-worship-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -3770,63 +3945,78 @@ cont { scale: 17 symbol { name: "police-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "police-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "police-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-post_box" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "postbox-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "postbox-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -3837,15 +4027,15 @@ cont { symbol { name: "mail-l" apply_for_type: 1 - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { @@ -3853,30 +4043,30 @@ cont { symbol { name: "mail-m" apply_for_type: 1 - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 symbol { name: "mail-m" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -3885,31 +4075,31 @@ cont { element { scale: 18 symbol { - name: "pub-l" - priority: 16781 + name: "beer-l" + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { - name: "pub-l" - priority: 16781 + name: "beer-l" + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -3919,240 +4109,303 @@ cont { scale: 19 symbol { name: "recycling-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } cont { name: "amenity-restaurant" element { - scale: 17 + scale: 16 symbol { - name: "restaurant-l" - priority: 16781 + name: "restaurant-m" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 + } + } + element { + scale: 17 + symbol { + name: "restaurant-l" + priority: 16750 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15750 } } element { scale: 18 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-restaurant-vegan" element { - scale: 17 + scale: 16 symbol { - name: "restaurant-l" - priority: 16781 + name: "restaurant-m" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 + } + } + element { + scale: 17 + symbol { + name: "restaurant-l" + priority: 16750 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15750 } } element { scale: 18 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-restaurant-vegetarian" element { - scale: 17 + scale: 16 symbol { - name: "restaurant-l" - priority: 16781 + name: "restaurant-m" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 + } + } + element { + scale: 17 + symbol { + name: "restaurant-l" + priority: 16750 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15750 } } element { scale: 18 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-school" - element { - scale: 16 - symbol { - name: "school-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 4473924 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 17 symbol { name: "school-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 18 symbol { name: "school-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "school-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } cont { name: "amenity-shelter" element { - scale: 19 + scale: 17 symbol { - name: "none" - priority: 16781 + name: "picnic-l" + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 18 + symbol { + name: "picnic-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "none" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 } } } @@ -4162,33 +4415,48 @@ cont { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } cont { name: "amenity-taxi" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "taxi-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "taxi-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -4198,15 +4466,15 @@ cont { scale: 19 symbol { name: "phone-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -4215,61 +4483,62 @@ cont { element { scale: 16 symbol { - name: "theatre-m" - priority: 16781 + name: "theatre-l" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 17 symbol { name: "theatre-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "theatre-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "theatre-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -4279,30 +4548,30 @@ cont { scale: 18 symbol { name: "toilets-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "toilets-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -4312,15 +4581,15 @@ cont { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -4329,104 +4598,412 @@ cont { element { scale: 14 area { - color: 870173866 - priority: -15985 + color: 15456432 + priority: -15987 } } element { scale: 15 area { - color: 870173866 - priority: -15938 + color: 15456432 + priority: -15987 } symbol { name: "college-m" apply_for_type: 1 - priority: 16062 + priority: 16013 + min_distance: 12 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15013 } + apply_if: "name" + } + element { + scale: 15 + area { + color: 15456432 + priority: -15237 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + apply_if: "!name" } element { scale: 16 area { - color: 14535850 - priority: -15938 + color: 15456432 + priority: -15987 } symbol { name: "college-m" - priority: 16062 + priority: 16013 + min_distance: 11 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15013 } + apply_if: "name" + } + element { + scale: 16 + area { + color: 15456432 + priority: -15987 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15013 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 15456432 + priority: -15987 + } + symbol { + name: "college-m" + priority: 16013 + min_distance: 11 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15013 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 15456432 + priority: -15987 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15013 + } + apply_if: "!name" } element { scale: 17 area { - color: 14535850 - priority: -15938 + color: 15456432 + priority: -15987 } symbol { name: "college-l" - priority: 16062 + priority: 16013 + min_distance: 10 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15013 } + apply_if: "name" + } + element { + scale: 17 + area { + color: 15456432 + priority: -15264 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 15456432 + priority: -15987 + } + symbol { + name: "college-l" + priority: 16013 + min_distance: 10 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15013 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 15456432 + priority: -15264 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" } element { scale: 18 area { - color: 14535850 - priority: -15922 + color: 15456432 + priority: -15987 } symbol { name: "college-l" - priority: 16078 + priority: 16013 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15013 } + apply_if: "name" + } + element { + scale: 18 + area { + color: 15456432 + priority: -15264 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 15456432 + priority: -15987 + } + symbol { + name: "college-l" + priority: 16013 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15013 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 15456432 + priority: -15264 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" } element { scale: 19 area { - color: 14535850 - priority: -15922 + color: 15456432 + priority: -15987 } symbol { name: "college-l" - priority: 16078 + priority: 16013 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15013 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 15456432 + priority: -15264 + } + symbol { + name: "none" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 15456432 + priority: -15987 + } + symbol { + name: "college-l" + priority: 16013 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15013 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 15456432 + priority: -15264 + } + symbol { + name: "none" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" + } +} +cont { + name: "amenity-vending_machine-parking_tickets" + element { + scale: 18 + symbol { + name: "parking-meter-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "parking-meter-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "amenity-vending_machine-public_transport_tickets" + element { + scale: 18 + symbol { + name: "vending-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "vending-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -4436,30 +5013,30 @@ cont { scale: 18 symbol { name: "recycling-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "recycling-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -4468,78 +5045,78 @@ cont { element { scale: 14 area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } } element { scale: 15 area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } element { scale: 16 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } element { scale: 17 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } element { scale: 18 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } element { scale: 19 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } } @@ -4548,43 +5125,43 @@ cont { element { scale: 14 area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } } element { scale: 15 area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } } element { scale: 16 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } } element { scale: 17 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } } element { scale: 18 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } } element { scale: 19 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } } } @@ -4593,78 +5170,78 @@ cont { element { scale: 14 area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } } element { scale: 15 area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } element { scale: 16 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } element { scale: 17 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } element { scale: 18 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } element { scale: 19 area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 } - priority: 15203 + priority: 15166 } } } @@ -4675,15 +5252,15 @@ cont { symbol { name: "bcontrol-m" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } element { @@ -4691,63 +5268,63 @@ cont { symbol { name: "bcontrol-m" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } element { scale: 17 symbol { - name: "bcontrol-m" + name: "bcontrol-l" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } element { scale: 18 symbol { - name: "bcontrol-m" + name: "bcontrol-l" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } element { scale: 19 symbol { - name: "bcontrol-m" + name: "bcontrol-l" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } } @@ -4756,13 +5333,13 @@ cont { element { scale: 16 lines { - width: 0.1 - color: 1723579306 + width: 0.5 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4770,13 +5347,13 @@ cont { element { scale: 17 lines { - width: 0.3 - color: 12303274 + width: 1.0 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4785,12 +5362,12 @@ cont { scale: 18 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4799,12 +5376,12 @@ cont { scale: 19 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4815,13 +5392,13 @@ cont { element { scale: 16 lines { - width: 0.1 - color: 1723579306 + width: 0.5 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4829,13 +5406,13 @@ cont { element { scale: 17 lines { - width: 0.3 - color: 12303274 + width: 1.0 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4844,12 +5421,12 @@ cont { scale: 18 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4858,12 +5435,12 @@ cont { scale: 19 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4874,13 +5451,13 @@ cont { element { scale: 16 lines { - width: 0.1 - color: 1723579306 + width: 0.5 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4888,13 +5465,13 @@ cont { element { scale: 17 lines { - width: 0.3 - color: 12303274 + width: 1.0 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4903,12 +5480,12 @@ cont { scale: 18 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4917,29 +5494,62 @@ cont { scale: 19 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } } } +cont { + name: "barrier-lift_gate" + element { + scale: 18 + symbol { + name: "lift_gate-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "lift_gate-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} cont { name: "barrier-retaining_wall" element { scale: 16 lines { - width: 0.1 - color: 1723579306 + width: 0.5 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4947,13 +5557,13 @@ cont { element { scale: 17 lines { - width: 0.3 - color: 12303274 + width: 1.0 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4962,12 +5572,12 @@ cont { scale: 18 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4976,29 +5586,62 @@ cont { scale: 19 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } } } +cont { + name: "barrier-toll_booth" + element { + scale: 18 + symbol { + name: "toll_booth-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "toll_booth-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} cont { name: "barrier-wall" element { scale: 16 lines { - width: 0.1 - color: 1723579306 + width: 0.5 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -5006,13 +5649,13 @@ cont { element { scale: 17 lines { - width: 0.3 - color: 12303274 + width: 1.0 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -5021,12 +5664,12 @@ cont { scale: 18 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -5035,12 +5678,12 @@ cont { scale: 19 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -5051,181 +5694,71 @@ cont { element { scale: 2 lines { - width: 0.2 - color: 1719105382 - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.5 + color: 1298359132 + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 3 lines { - width: 0.2 - color: 863467366 - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.5 + color: 862151516 + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 4 lines { - width: 0.4 - color: 7829350 - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 6513500 + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 5 lines { - width: 0.5 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 6513500 + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 6 lines { - width: 0.8 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.85 + color: 6513500 + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 7 lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 6513500 + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 9 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 10 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 11 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 12 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 13 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 14 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 15 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 16 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 17 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 18 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 19 - lines { - width: 1.1 - color: 7829350 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + color: 6513500 + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } } @@ -5234,15 +5767,15 @@ cont { element { scale: 4 lines { - width: 0.4 - color: 7829350 + width: 0.8 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.0 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } } @@ -5251,167 +5784,167 @@ cont { element { scale: 5 lines { - width: 0.4 - color: 863467366 + width: 0.7 + color: 863203947 dashdot { - dd: 1.5 + dd: 1.35 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 6 lines { - width: 0.6 - color: 7829350 + width: 0.8 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.0 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 7 lines { width: 0.9 - color: 7829350 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { width: 0.9 - color: 7829350 + color: 7565931 dashdot { - dd: 1.5 - dd: 1.0 + dd: 1.44 + dd: 1.44 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.9 - color: 7829350 + width: 1.0 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 - color: 7829350 + width: 1.2 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 11 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5420,12 +5953,12 @@ cont { scale: 17 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5434,12 +5967,12 @@ cont { scale: 18 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5448,12 +5981,12 @@ cont { scale: 19 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5464,167 +5997,167 @@ cont { element { scale: 5 lines { - width: 0.4 - color: 863467366 + width: 0.7 + color: 863203947 dashdot { - dd: 1.5 + dd: 1.35 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 6 lines { - width: 0.6 - color: 7829350 + width: 0.8 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.0 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 7 lines { width: 0.9 - color: 7829350 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { width: 0.9 - color: 7829350 + color: 7565931 dashdot { - dd: 1.5 - dd: 1.0 + dd: 1.44 + dd: 1.44 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.9 - color: 7829350 + width: 1.0 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 - color: 7829350 + width: 1.2 + color: 7565931 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 11 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5633,12 +6166,12 @@ cont { scale: 17 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5647,12 +6180,12 @@ cont { scale: 18 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5661,225 +6194,94 @@ cont { scale: 19 lines { width: 1.2 - color: 7829350 + color: 7565931 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } } } -cont { - name: "boundary-national_park" - element { - scale: 12 - symbol { - name: "nparkf-s" - priority: 16640 - } - caption { - primary { - height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 8 - } - priority: 15640 - } - } - element { - scale: 13 - symbol { - name: "nparkf-s" - priority: 16640 - } - caption { - primary { - height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 8 - } - priority: 15640 - } - } - element { - scale: 14 - symbol { - name: "nparkf-s" - priority: 16640 - } - caption { - primary { - height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 8 - } - priority: 15640 - } - } - element { - scale: 15 - symbol { - name: "nparkf-m" - priority: 16640 - } - caption { - primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 - offset_y: 10 - } - priority: 15640 - } - } - element { - scale: 16 - symbol { - name: "nparkf-m" - priority: 16640 - } - caption { - primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 - offset_y: 10 - } - priority: 15640 - } - } - element { - scale: 17 - symbol { - name: "nparkf-l" - priority: 16640 - } - caption { - primary { - height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 12 - } - priority: 15640 - } - } - element { - scale: 18 - symbol { - name: "nparkf-l" - priority: 16640 - } - caption { - primary { - height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 12 - } - priority: 15640 - } - } - element { - scale: 19 - symbol { - name: "nparkf-l" - priority: 16640 - } - caption { - primary { - height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 12 - } - priority: 15640 - } - } -} cont { name: "building" element { scale: 14 area { - color: 2580335803 - priority: 1329 + color: 2160707771 + priority: 1292 } } element { scale: 15 area { - color: 1724697787 - priority: 1329 + color: 1724500155 + priority: 1292 } } element { scale: 16 area { - color: 869059771 - priority: 1641 + color: 868862139 + priority: 1348 } caption { primary { height: 8 - color: 7829367 + color: 8355446 text: "addr:housename" } - priority: 15640 + priority: 15347 } } element { scale: 17 area { - color: 13421755 - priority: 1360 + color: 12763315 + priority: 1348 } caption { primary { height: 9 - color: 7829367 + color: 6645093 } secondary { height: 8 - color: 7829367 + color: 6645093 offset_y: 20 text: "int_name" } - priority: 15359 + priority: 15347 } } element { scale: 18 area { - color: 12303274 - priority: 1641 + color: 12763315 + priority: 1348 } caption { primary { height: 10 - color: 7829367 + color: 6645093 } - priority: 15640 + priority: 15347 } } element { scale: 19 area { - color: 12303274 - priority: 1641 + color: 12763315 + priority: 1348 } caption { primary { height: 10 - color: 7829367 + color: 6645093 } - priority: 15640 + priority: 15347 } } } @@ -5890,10 +6292,10 @@ cont { caption { primary { height: 8 - color: 7829367 + color: 8355446 text: "addr:housename" } - priority: 15640 + priority: 15347 } } element { @@ -5901,15 +6303,15 @@ cont { caption { primary { height: 9 - color: 7829367 + color: 6645093 } secondary { height: 8 - color: 7829367 + color: 6645093 offset_y: 20 text: "int_name" } - priority: 15359 + priority: 15347 } } element { @@ -5917,9 +6319,9 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 6645093 } - priority: 15640 + priority: 15347 } } element { @@ -5927,9 +6329,9 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 6645093 } - priority: 15640 + priority: 15347 } } } @@ -5940,16 +6342,16 @@ cont { symbol { name: "entrance-s" apply_for_type: 1 - priority: 16093 + priority: 16083 } caption { primary { height: 10 - color: 7829367 - offset_x: 6 + color: 6645093 + offset_x: 9 text: "ref" } - priority: 15093 + priority: 15083 } } element { @@ -5957,22 +6359,22 @@ cont { symbol { name: "entrance-s" apply_for_type: 1 - priority: 16093 + priority: 16083 } caption { primary { height: 10 - color: 7829367 - offset_x: 6 + color: 6645093 + offset_x: 9 text: "ref" } secondary { - height: 9 - color: 7829367 + height: 12 + color: 6645093 offset_y: 10 text: "addr:flats" } - priority: 15093 + priority: 15083 } } } @@ -5981,29 +6383,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 4011550 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1406 + priority: 1416 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.4 + color: 4011550 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1430 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6011,95 +6413,95 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16430 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 4011550 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 4011550 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 4011550 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16430 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 4011550 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } } @@ -6108,29 +6510,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 4011550 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1406 + priority: 1416 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.4 + color: 4011550 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1430 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6138,95 +6540,95 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16430 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 4011550 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 4011550 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 4011550 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16430 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 4011550 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } } @@ -6235,29 +6637,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 4011550 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1406 + priority: 1416 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.4 + color: 4011550 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1430 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6265,95 +6667,95 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16430 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 4011550 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 4011550 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 4011550 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16430 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 4011550 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } } @@ -6362,29 +6764,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 4011550 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1406 + priority: 1416 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.4 + color: 4011550 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1430 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6392,95 +6794,95 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16430 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 4011550 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 4011550 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 4011550 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16430 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 4011550 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16430 } } } @@ -6490,18 +6892,18 @@ cont { scale: 17 symbol { name: "bus-m" - priority: 16781 + priority: 16972 } } element { scale: 18 symbol { name: "bus-l" - priority: 16828 + priority: 16972 } - caption { + path_text { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 10 @@ -6513,18 +6915,18 @@ cont { offset_y: 10 text: "int_name" } - priority: 15828 + priority: 16972 } } element { scale: 19 symbol { name: "bus-l" - priority: 16828 + priority: 16972 } - caption { + path_text { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 10 @@ -6536,7 +6938,7 @@ cont { offset_y: 10 text: "int_name" } - priority: 15828 + priority: 16972 } } } @@ -6545,55 +6947,55 @@ cont { element { scale: 13 lines { - width: 1.4 - color: 2159786922 + width: 1.2 + color: 12303274 dashdot { - dd: 4.0 - dd: 4.0 + dd: 3.6 + dd: 1.8 } - priority: 1000 + priority: 1388 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { width: 1.4 - color: 2159786922 + color: 12303274 dashdot { - dd: 5.0 - dd: 5.0 + dd: 4.5 + dd: 1.8 } - priority: 1000 + priority: 1388 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { width: 2.0 - color: 2159786922 + color: 12303274 dashdot { - dd: 5.0 - dd: 5.0 + dd: 7.2 + dd: 2.7 } - priority: 1000 + priority: 1388 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 2.0 - color: 1304148906 + width: 2.6 + color: 12303274 dashdot { - dd: 5.0 - dd: 5.0 + dd: 9.0 + dd: 3.6 } - priority: 1000 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -6604,10 +7006,10 @@ cont { width: 3.0 color: 12303274 dashdot { - dd: 6.0 - dd: 6.0 + dd: 10.8 + dd: 4.5 } - priority: 1000 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -6618,10 +7020,10 @@ cont { width: 4.0 color: 12303274 dashdot { - dd: 6.0 - dd: 6.0 + dd: 13.5 + dd: 5.4 } - priority: 1000 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -6632,10 +7034,10 @@ cont { width: 6.0 color: 12303274 dashdot { - dd: 6.0 - dd: 6.0 + dd: 18.0 + dd: 6.3 } - priority: 1000 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -6643,32 +7045,42 @@ cont { } cont { name: "highway-cycleway" + element { + scale: 13 + lines { + width: 1.0 + color: 872384429 + priority: 1652 + join: ROUNDJOIN + cap: BUTTCAP + } + } element { scale: 14 lines { - width: 0.4 - color: 872384682 - priority: 1640 + width: 1.2 + color: 16746413 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452954282 - priority: 1640 + width: 1.4 + color: 16746413 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 16746666 - priority: 1640 + width: 1.6 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6676,9 +7088,9 @@ cont { element { scale: 17 lines { - width: 1.2 - color: 16746666 - priority: 1484 + width: 1.8 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6687,8 +7099,8 @@ cont { scale: 18 lines { width: 2.0 - color: 16746666 - priority: 1484 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6696,9 +7108,9 @@ cont { element { scale: 19 lines { - width: 2.0 - color: 16746666 - priority: 1484 + width: 2.2 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6706,32 +7118,42 @@ cont { } cont { name: "highway-cycleway-bridge" + element { + scale: 13 + lines { + width: 1.0 + color: 872384429 + priority: 1652 + join: ROUNDJOIN + cap: BUTTCAP + } + } element { scale: 14 lines { - width: 0.4 - color: 872384682 - priority: 1640 + width: 1.2 + color: 16746413 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452954282 - priority: 1640 + width: 1.4 + color: 16746413 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 16746666 - priority: 1640 + width: 1.6 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6739,9 +7161,9 @@ cont { element { scale: 17 lines { - width: 1.2 - color: 16746666 - priority: 1484 + width: 1.8 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6750,8 +7172,8 @@ cont { scale: 18 lines { width: 2.0 - color: 16746666 - priority: 1484 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6759,9 +7181,9 @@ cont { element { scale: 19 lines { - width: 2.0 - color: 16746666 - priority: 1484 + width: 2.2 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6769,32 +7191,42 @@ cont { } cont { name: "highway-cycleway-permissive" + element { + scale: 13 + lines { + width: 1.0 + color: 872384429 + priority: 1652 + join: ROUNDJOIN + cap: BUTTCAP + } + } element { scale: 14 lines { - width: 0.4 - color: 872384682 - priority: 1640 + width: 1.2 + color: 16746413 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452954282 - priority: 1640 + width: 1.4 + color: 16746413 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 16746666 - priority: 1640 + width: 1.6 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6802,9 +7234,9 @@ cont { element { scale: 17 lines { - width: 1.2 - color: 16746666 - priority: 1484 + width: 1.8 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6813,8 +7245,8 @@ cont { scale: 18 lines { width: 2.0 - color: 16746666 - priority: 1484 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6822,9 +7254,9 @@ cont { element { scale: 19 lines { - width: 2.0 - color: 16746666 - priority: 1484 + width: 2.2 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6832,32 +7264,42 @@ cont { } cont { name: "highway-cycleway-tunnel" + element { + scale: 13 + lines { + width: 1.0 + color: 872384429 + priority: 1652 + join: ROUNDJOIN + cap: BUTTCAP + } + } element { scale: 14 lines { - width: 0.4 - color: 872384682 - priority: 1640 + width: 1.2 + color: 16746413 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452954282 - priority: 1640 + width: 1.4 + color: 16746413 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 16746666 - priority: 1640 + width: 1.6 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6865,9 +7307,9 @@ cont { element { scale: 17 lines { - width: 1.2 - color: 16746666 - priority: 1484 + width: 1.8 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6876,8 +7318,8 @@ cont { scale: 18 lines { width: 2.0 - color: 16746666 - priority: 1484 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6885,9 +7327,9 @@ cont { element { scale: 19 lines { - width: 2.0 - color: 16746666 - priority: 1484 + width: 2.2 + color: 16746413 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6898,29 +7340,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6928,19 +7370,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -6950,19 +7392,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -6972,19 +7414,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -6994,19 +7436,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7016,7 +7458,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -7025,29 +7467,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7055,19 +7497,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7077,19 +7519,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7099,19 +7541,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7121,19 +7563,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7143,7 +7585,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -7152,149 +7594,149 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1203 + priority: 1166 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1203 + priority: 1166 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } } @@ -7303,27 +7745,27 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 0.2 - color: 15658717 - priority: 1420 + priority: 1444 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.6 - color: 8947848 - priority: 1405 + width: 2.0 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 2.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -7331,27 +7773,27 @@ cont { element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 1.6 - color: 15658717 - priority: 1420 + priority: 1444 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 - color: 8947848 - priority: 1405 + width: 3.4 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -7361,141 +7803,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 - lines { - width: 1.0 - color: 16777215 - dashdot { - dd: 1.0 - dd: 1.0 - } - priority: 1437 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.4 - color: 15658717 - priority: 1499 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 3.2 - color: 8947848 - priority: 1483 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 9 - color: 3355443 - stroke_color: 2164260863 - } - priority: 16437 - } - } - element { - scale: 17 - lines { - width: 1.2 - color: 16777215 - dashdot { - dd: 2.0 - dd: 2.0 - } - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 15658717 - priority: 1499 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 3.6 - color: 8947848 - priority: 1483 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 9 - color: 3355443 - stroke_color: 2164260863 - } - priority: 16515 - } - } - element { - scale: 18 - lines { - width: 1.8 - color: 16777215 - dashdot { - dd: 3.0 - dd: 1.5 - } - priority: 1671 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 15658717 - priority: 1655 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 4.8 - color: 8947848 - priority: 1639 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 9 - color: 3355443 - stroke_color: 2164260863 - } - priority: 16671 - } - } - element { - scale: 19 lines { width: 2.0 - color: 16777215 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.4 - color: 15658717 - priority: 1655 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.2 - color: 8947848 - priority: 1639 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -7505,7 +7839,115 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 + } + } + element { + scale: 17 + lines { + width: 2.4 + color: 16316664 + dashdot { + dd: 4.5 + dd: 1.8 + } + priority: 1444 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 5.2 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 6.0 + color: 8421504 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16444 + } + } + element { + scale: 18 + lines { + width: 3.4 + color: 16316664 + dashdot { + dd: 7.2 + dd: 2.7 + } + priority: 1444 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 7.2 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 8.0 + color: 8421504 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16444 + } + } + element { + scale: 19 + lines { + width: 4.0 + color: 16316664 + dashdot { + dd: 9.0 + dd: 3.6 + } + priority: 1444 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 8.4 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 9.2 + color: 8421504 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16444 } } } @@ -7514,29 +7956,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7544,19 +7986,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7566,19 +8008,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7588,19 +8030,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7610,19 +8052,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7632,7 +8074,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -7641,29 +8083,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7671,19 +8113,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7693,19 +8135,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7715,19 +8157,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7737,19 +8179,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7759,7 +8201,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -7768,29 +8210,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7798,19 +8240,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7820,19 +8262,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7842,19 +8284,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7864,19 +8306,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7886,7 +8328,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -7895,29 +8337,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7925,19 +8367,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7947,19 +8389,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7969,19 +8411,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7991,19 +8433,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8013,7 +8455,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -8022,29 +8464,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8052,19 +8494,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8074,19 +8516,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8096,19 +8538,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8118,19 +8560,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8140,7 +8582,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -8149,29 +8591,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8179,19 +8621,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8201,19 +8643,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8223,19 +8665,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8245,19 +8687,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8267,7 +8709,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -8276,29 +8718,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8306,19 +8748,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8328,19 +8770,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8350,19 +8792,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8372,19 +8814,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8394,7 +8836,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -8403,29 +8845,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 16777215 + width: 1.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 16777215 + width: 1.7 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8433,19 +8875,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 - color: 16777215 + width: 2.0 + color: 16316664 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8455,37 +8897,37 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 3.4 - color: 15658717 - priority: 1139 + width: 5.8 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.4 - color: 8947848 + width: 6.8 + color: 8421504 dashdot { dd: 2.0 dd: 2.0 } - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8495,37 +8937,37 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 4.6 - color: 15658717 - priority: 1139 + width: 7.8 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.6 - color: 8947848 + width: 8.8 + color: 8421504 dashdot { dd: 2.0 dd: 2.0 } - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.8 - color: 16777215 + width: 3.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8535,37 +8977,37 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 5.0 - color: 15658717 - priority: 1139 + width: 9.0 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 8947848 + width: 10.0 + color: 8421504 dashdot { dd: 2.0 dd: 2.0 } - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8575,7 +9017,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16671 + priority: 16444 } } } @@ -8584,101 +9026,101 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1484 + width: 4.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1484 + width: 6.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8688,15 +9130,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1484 + width: 12.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8706,7 +9148,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } } @@ -8715,101 +9157,101 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1484 + width: 4.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1484 + width: 6.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8819,15 +9261,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1484 + width: 12.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8837,7 +9279,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } } @@ -8846,134 +9288,134 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 6.5 - color: 8947848 + width: 6.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 + width: 4.0 color: 16777215 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 9.2 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.2 + width: 6.0 color: 16777215 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 18 lines { width: 11.0 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 color: 16777215 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8983,26 +9425,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 11.0 - color: 8947848 + width: 14.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 + width: 12.0 color: 16777215 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -9012,7 +9454,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } } @@ -9021,91 +9463,91 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2583660544 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2164230144 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 872384512 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 2.0 - color: 452954112 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { @@ -9113,30 +9555,24 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 2.8 - color: 452954112 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9144,30 +9580,24 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 3.8 - color: 16746496 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9175,30 +9605,24 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 4.8 - color: 16746496 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9206,28 +9630,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 6.8 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.8 - color: 13399876 - priority: 1218 + width: 6.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -9237,28 +9655,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 9.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 13399876 - priority: 1218 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -9268,28 +9680,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { - height: 9 + height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 14.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 + width: 12.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -9299,28 +9705,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 14.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 + width: 15.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -9330,13 +9730,14 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } } @@ -9345,91 +9746,91 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2583660544 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2164230144 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 872384512 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 2.0 - color: 452954112 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { @@ -9437,44 +9838,38 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 2.8 - color: 452954112 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.4 - color: 15658717 - priority: 1139 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.8 - color: 8947848 - priority: 1124 + width: 6.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.0 - color: 13399876 - priority: 1218 + width: 6.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9482,44 +9877,38 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 3.8 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.0 - color: 15658717 - priority: 1420 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 10.8 - color: 8947848 - priority: 1405 + width: 7.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.0 - color: 13399876 - priority: 1218 + width: 8.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9527,44 +9916,38 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 4.8 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 12.0 - color: 15658717 - priority: 1420 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.8 - color: 8947848 - priority: 1405 + width: 9.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 13399876 - priority: 1218 + width: 10.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9572,193 +9955,170 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 6.8 - color: 16746496 - priority: 1593 + width: 6.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 17.6 - color: 15658717 - priority: 1420 + width: 12.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.4 - color: 8947848 - priority: 1405 + width: 12.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 8.8 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 9.0 - color: 16746496 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 22.6 - color: 15658717 - priority: 1420 + width: 19.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 24.2 - color: 8947848 - priority: 1405 + width: 21.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 10.5 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { - height: 9 + height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 14.0 - color: 16746496 - priority: 1593 + width: 12.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 34.0 - color: 15658717 - priority: 1420 + width: 26.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 36.0 - color: 8947848 - priority: 1405 + width: 28.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 14.0 - color: 16746496 - priority: 1593 + width: 15.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } + lines { + width: 32.0 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } lines { width: 34.0 - color: 15658717 - priority: 1420 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 36.0 - color: 8947848 - priority: 1405 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } } @@ -9767,102 +10127,102 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2583660544 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2164230144 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 872384512 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 3.0 - color: 8947848 + color: 8421504 dashdot { dd: 2.0 dd: 2.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16557154 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { @@ -9870,41 +10230,35 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 4.8 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.8 - color: 452954112 - priority: 1593 + color: 16557154 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9912,41 +10266,35 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 5.8 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.8 - color: 16746496 - priority: 1593 + color: 16557154 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9954,41 +10302,35 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 6.8 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.8 - color: 16746496 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -9996,39 +10338,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 8.8 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.8 - color: 13399876 - priority: 1218 + width: 6.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -10038,39 +10374,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 11.0 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 13399876 - priority: 1218 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -10080,39 +10410,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { - height: 9 + height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 16.0 - color: 8947848 + width: 14.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 + width: 12.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -10122,39 +10446,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 16.0 - color: 8947848 + width: 17.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 + width: 15.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -10164,13 +10482,67 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 + } + } +} +cont { + name: "highway-motorway_junction" + element { + scale: 15 + caption { + primary { + height: 9 + color: 3355443 + } + priority: 15652 + } + } + element { + scale: 16 + caption { + primary { + height: 10 + color: 3355443 + } + priority: 15652 + } + } + element { + scale: 17 + caption { + primary { + height: 10 + color: 3355443 + } + priority: 15652 + } + } + element { + scale: 18 + caption { + primary { + height: 10 + color: 3355443 + } + priority: 15652 + } + } + element { + scale: 19 + caption { + primary { + height: 10 + color: 3355443 + } + priority: 15652 } } } @@ -10182,9 +10554,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -10193,9 +10565,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -10206,17 +10578,17 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 0.8 - color: 16777215 - priority: 1406 + width: 2.8 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -10224,105 +10596,108 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 14 lines { - width: 1.9 - color: 16777215 - priority: 1406 + width: 3.8 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 2.4 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 3.4 - color: 16777215 - priority: 1406 + width: 3.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 4.5 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 6.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -10332,15 +10707,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 7.5 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -10350,7 +10725,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } } @@ -10362,9 +10737,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -10373,9 +10748,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -10386,17 +10761,17 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 0.8 - color: 16777215 - priority: 1406 + width: 2.8 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -10404,73 +10779,75 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 14 - lines { - width: 1.9 - color: 16777215 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } lines { width: 3.8 - color: 15658717 - priority: 1420 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 - color: 8947848 - priority: 1405 + width: 7.6 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 8.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 2.4 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 4.8 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.6 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -10478,101 +10855,102 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 3.4 - color: 16777215 - priority: 1406 + width: 3.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.8 - color: 15658717 - priority: 1420 + width: 6.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.6 - color: 8947848 - priority: 1405 + width: 6.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 4.5 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 10.6 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.2 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 6.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 14.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 - color: 8947848 - priority: 1405 + width: 16.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -10582,29 +10960,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 7.5 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 17.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 - color: 8947848 - priority: 1405 + width: 19.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -10614,7 +10992,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } } @@ -10626,9 +11004,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -10637,9 +11015,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -10650,28 +11028,28 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 2.8 - color: 8947848 + width: 4.8 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 16777215 - priority: 1406 + width: 2.8 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -10679,160 +11057,163 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 14 lines { - width: 3.9 - color: 8947848 + width: 5.8 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.9 - color: 16777215 - priority: 1406 + width: 3.8 + color: 16557154 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 4.4 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.4 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 5.4 - color: 8947848 + width: 5.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.4 - color: 16777215 - priority: 1406 + width: 3.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 6.5 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 9.0 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 6.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -10842,26 +11223,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 9.0 - color: 8947848 + width: 9.5 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 7.5 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -10871,7 +11252,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } } @@ -10880,29 +11261,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -10910,63 +11291,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -10976,19 +11357,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -10998,7 +11379,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -11007,29 +11388,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11037,63 +11418,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11103,19 +11484,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11125,7 +11506,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -11134,29 +11515,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11164,63 +11545,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11230,19 +11611,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11252,7 +11633,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -11261,29 +11642,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11291,63 +11672,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11357,19 +11738,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11379,7 +11760,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -11388,29 +11769,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11418,63 +11799,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11484,19 +11865,37 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 9.0 + color: 14934482 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 10.0 + color: 8421504 dashdot { - dd: 5.0 - dd: 3.0 + dd: 2.0 + dd: 2.0 } - priority: 1437 + priority: 1096 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 + color: 6510384 + dashdot { + dd: 9.0 + dd: 3.6 + } + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11506,7 +11905,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -11515,29 +11914,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11545,63 +11944,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11611,19 +12010,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11633,7 +12032,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -11642,29 +12041,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11672,63 +12071,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11738,19 +12137,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11760,7 +12159,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -11769,29 +12168,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11799,63 +12198,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11865,19 +12264,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11887,7 +12286,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -11896,29 +12295,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11926,63 +12325,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11992,19 +12391,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12014,7 +12413,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -12023,29 +12422,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12053,63 +12452,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12119,19 +12518,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12141,7 +12540,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -12150,29 +12549,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12180,63 +12579,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12246,19 +12645,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12268,7 +12667,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -12277,29 +12676,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12307,63 +12706,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12373,19 +12772,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12395,7 +12794,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -12404,29 +12803,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12434,63 +12833,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12500,19 +12899,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12522,7 +12921,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -12531,29 +12930,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12561,63 +12960,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12627,19 +13026,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12649,7 +13048,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -12658,29 +13057,29 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12688,63 +13087,63 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12754,19 +13153,37 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 9.0 + color: 14934482 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 10.0 + color: 8421504 dashdot { - dd: 5.0 - dd: 3.0 + dd: 2.0 + dd: 2.0 } - priority: 1437 + priority: 1096 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 + color: 6510384 + dashdot { + dd: 9.0 + dd: 3.6 + } + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12776,7 +13193,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16437 + priority: 16444 } } } @@ -12785,115 +13202,115 @@ cont { element { scale: 13 lines { - width: 0.7 - color: 1308622847 + width: 1.0 + color: 16316664 dashdot { dd: 2.0 dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.9 - color: 872415231 + width: 1.6 + color: 16316664 dashdot { - dd: 2.0 - dd: 1.0 + dd: 3.6 + dd: 1.44 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16468 + priority: 16472 } } element { scale: 15 lines { - width: 1.6 - color: 872415231 + width: 2.0 + color: 16316664 dashdot { + dd: 5.0 dd: 2.0 - dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16468 + priority: 16472 } } element { scale: 16 lines { - width: 2.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 5.4 + dd: 2.7 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } element { scale: 17 lines { - width: 3.2 - color: 16777215 + width: 3.0 + color: 16316664 dashdot { - dd: 6.0 - dd: 3.0 + dd: 5.0 + dd: 2.0 } - priority: 1468 + priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16000 } } element { scale: 18 lines { - width: 4.6 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 5.0 - dd: 2.0 + dd: 7.0 + dd: 3.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } @@ -12903,19 +13320,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } element { scale: 19 lines { width: 5.0 - color: 16777215 + color: 16316664 dashdot { - dd: 5.0 - dd: 2.0 + dd: 16.2 + dd: 8.1 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } @@ -12925,7 +13342,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } } @@ -12934,171 +13351,171 @@ cont { element { scale: 13 lines { - width: 0.7 - color: 1308622847 + width: 1.0 + color: 16316664 dashdot { dd: 2.0 dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.9 - color: 872415231 + width: 1.6 + color: 16316664 dashdot { - dd: 2.0 - dd: 1.0 + dd: 3.6 + dd: 1.44 } - priority: 1203 + priority: 1166 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16203 + priority: 16166 } } element { scale: 15 lines { - width: 1.6 - color: 872415231 + width: 2.0 + color: 16316664 dashdot { + dd: 5.0 dd: 2.0 - dd: 1.0 } - priority: 1203 + priority: 1166 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 3019898879 - priority: -15797 + color: 14934482 + priority: -15834 } caption { primary { height: 11 - color: 5592405 - stroke_color: 2163142365 + color: 5855577 + stroke_color: 2163076059 } - priority: 15203 + priority: 15166 } } element { scale: 16 lines { - width: 2.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 5.4 + dd: 2.7 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } element { scale: 17 lines { - width: 3.2 - color: 16777215 + width: 3.0 + color: 16316664 dashdot { - dd: 6.0 - dd: 3.0 + dd: 5.0 + dd: 2.0 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } element { scale: 18 lines { - width: 4.6 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 5.0 - dd: 2.0 + dd: 7.0 + dd: 3.0 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } element { scale: 19 lines { width: 5.0 - color: 16777215 + color: 16316664 dashdot { - dd: 5.0 - dd: 2.0 + dd: 16.2 + dd: 8.1 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3019898879 - priority: -15797 + color: 15592411 + priority: -15834 } caption { primary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 2164260863 } - priority: 15203 + priority: 15166 } } } @@ -13107,84 +13524,84 @@ cont { element { scale: 13 lines { - width: 0.7 - color: 1308622847 + width: 1.0 + color: 16316664 dashdot { dd: 2.0 dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { - width: 1.0 - color: 15658717 - priority: 1452 + width: 1.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } } element { scale: 14 - lines { - width: 0.9 - color: 872415231 - dashdot { - dd: 2.0 - dd: 1.0 - } - priority: 1468 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 1.8 - color: 15658717 - priority: 1420 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 2.2 - color: 8947848 - priority: 1405 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 10 - color: 3355443 - stroke_color: 2163142365 - } - priority: 16468 - } - } - element { - scale: 15 lines { width: 1.6 - color: 872415231 + color: 16316664 dashdot { - dd: 2.0 - dd: 1.0 + dd: 3.6 + dd: 1.44 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 3.2 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.6 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 3355443 + stroke_color: 2163076059 + } + priority: 16472 + } + } + element { + scale: 15 + lines { + width: 2.0 + color: 16316664 + dashdot { + dd: 5.0 + dd: 2.0 + } + priority: 1472 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -13192,107 +13609,107 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16468 + priority: 16472 } } element { scale: 16 lines { - width: 2.2 - color: 16777215 + width: 2.4 + color: 16316664 dashdot { - dd: 3.0 - dd: 1.5 + dd: 5.4 + dd: 2.7 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.8 - color: 15658717 - priority: 1499 + width: 5.2 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.6 - color: 8947848 - priority: 1483 + width: 6.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } element { scale: 17 lines { - width: 3.2 - color: 16777215 + width: 3.0 + color: 16316664 dashdot { - dd: 6.0 - dd: 3.0 + dd: 5.0 + dd: 2.0 } - priority: 1468 + priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.8 - color: 15658717 - priority: 1499 + width: 6.4 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.6 - color: 8947848 - priority: 1483 + width: 7.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16000 } } element { scale: 18 lines { - width: 4.6 - color: 16777215 + width: 4.0 + color: 16316664 dashdot { - dd: 5.0 - dd: 2.0 + dd: 7.0 + dd: 3.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.6 - color: 15658717 - priority: 1655 + width: 8.4 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 10.4 - color: 8947848 - priority: 1639 + width: 9.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -13302,33 +13719,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } element { scale: 19 lines { width: 5.0 - color: 16777215 + color: 16316664 dashdot { - dd: 5.0 - dd: 2.0 + dd: 16.2 + dd: 8.1 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 10.4 - color: 15658717 - priority: 1655 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 11.2 - color: 8947848 - priority: 1639 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -13338,7 +13755,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } } @@ -13347,148 +13764,148 @@ cont { element { scale: 13 lines { - width: 0.7 - color: 1308622847 + width: 1.0 + color: 16316664 dashdot { dd: 2.0 dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.9 - color: 872415231 + width: 1.6 + color: 16316664 dashdot { - dd: 2.0 - dd: 1.0 + dd: 3.6 + dd: 1.44 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16468 + priority: 16472 } } element { scale: 15 lines { - width: 1.6 - color: 872415231 + width: 2.0 + color: 16316664 dashdot { + dd: 5.0 dd: 2.0 - dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16468 + priority: 16472 } } element { scale: 16 lines { - width: 4.2 - color: 8947848 + width: 4.4 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1467 + priority: 1471 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.2 + width: 2.4 color: 16777215 dashdot { - dd: 3.0 - dd: 1.5 + dd: 5.4 + dd: 2.7 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } element { scale: 17 lines { - width: 5.2 - color: 8947848 + width: 5.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1467 + priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.2 - color: 16777215 - dashdot { - dd: 6.0 - dd: 3.0 - } - priority: 1468 - join: ROUNDJOIN - cap: ROUNDCAP - } - path_text { - primary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - } - priority: 16468 - } - } - element { - scale: 18 - lines { - width: 6.6 - color: 8947848 - dashdot { - dd: 5.0 - dd: 5.0 - } - priority: 1467 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 4.6 + width: 3.0 color: 16777215 dashdot { dd: 5.0 dd: 2.0 } - priority: 1468 + priority: 1000 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 11 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16000 + } + } + element { + scale: 18 + lines { + width: 6.0 + color: 8421504 + dashdot { + dd: 5.0 + dd: 5.0 + } + priority: 1471 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 + color: 16777215 + dashdot { + dd: 7.0 + dd: 3.0 + } + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } @@ -13498,19 +13915,19 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } element { scale: 19 lines { width: 7.0 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1467 + priority: 1471 join: ROUNDJOIN cap: BUTTCAP } @@ -13518,10 +13935,10 @@ cont { width: 5.0 color: 16777215 dashdot { - dd: 5.0 - dd: 2.0 + dd: 16.2 + dd: 8.1 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } @@ -13531,142 +13948,140 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16468 + priority: 16472 } } } cont { name: "highway-primary" + element { + scale: 8 + lines { + width: 0.5 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP + } + } element { scale: 9 lines { - width: 0.1 - color: 2582559556 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 - color: 871283524 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16597 + min_distance: 18 } } element { scale: 11 lines { - width: 1.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.4 + color: 16749632 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16597 + min_distance: 18 } } element { scale: 12 lines { - width: 1.5 - color: 452975974 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 20 } } element { scale: 13 lines { - width: 2.5 - color: 16768358 - priority: 1578 + width: 2.4 + color: 16752972 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 - color: 16768358 - priority: 1578 + width: 2.9 + color: 16749632 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -13674,30 +14089,24 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 - color: 16768358 - priority: 1578 + width: 4.2 + color: 16752972 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -13705,28 +14114,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 24 } } element { scale: 16 lines { - width: 6.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 7.2 - color: 15641156 - priority: 1218 + width: 4.8 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } @@ -13736,22 +14139,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 17 lines { - width: 9.0 - color: 16768341 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 15641156 - priority: 1218 + width: 7.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } @@ -13761,22 +14157,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 18 lines { - width: 14.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 15641156 - priority: 1218 + width: 10.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } @@ -13786,22 +14175,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 19 lines { - width: 14.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 15641156 - priority: 1218 + width: 13.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } @@ -13811,156 +14193,154 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } } cont { name: "highway-primary-bridge" + element { + scale: 8 + lines { + width: 0.5 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP + } + } element { scale: 9 lines { - width: 0.1 - color: 2582559556 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 - color: 871283524 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16597 + min_distance: 18 } } element { scale: 11 lines { - width: 1.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.4 + color: 16749632 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16597 + min_distance: 18 } } element { scale: 12 lines { - width: 1.5 - color: 452975974 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 20 } } element { scale: 13 lines { - width: 2.5 - color: 16768358 - priority: 1578 + width: 2.4 + color: 16752972 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.0 - color: 15658717 - priority: 1420 + width: 2.9 + color: 16749632 + priority: 1597 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.8 - color: 8947848 - priority: 1405 + width: 5.8 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.0 - color: 15641156 - priority: 1218 + width: 6.6 + color: 8421504 + priority: 1360 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -13968,44 +14348,38 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 11.0 - color: 15658717 - priority: 1420 + width: 4.2 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 11.8 - color: 8947848 - priority: 1405 + width: 8.4 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.5 - color: 15641156 - priority: 1218 + width: 9.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -14013,315 +14387,286 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 24 } } element { scale: 16 lines { - width: 6.0 - color: 16768358 - priority: 1578 + width: 4.8 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 14.4 - color: 15658717 - priority: 1420 + width: 9.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 15.2 - color: 8947848 - priority: 1405 + width: 10.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 7.2 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 17 lines { - width: 9.0 - color: 16768341 - priority: 1578 + width: 7.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 22.6 - color: 15658717 - priority: 1420 + width: 15.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 24.2 - color: 8947848 - priority: 1405 + width: 17.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 10.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 18 lines { - width: 14.0 - color: 16768358 - priority: 1578 + width: 10.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 34.0 - color: 15658717 - priority: 1420 + width: 22.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 36.0 - color: 8947848 - priority: 1405 + width: 24.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 19 lines { - width: 14.0 - color: 16768358 - priority: 1578 + width: 13.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 34.0 - color: 15658717 - priority: 1420 + width: 28.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 36.0 - color: 8947848 - priority: 1405 + width: 30.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } } cont { name: "highway-primary-tunnel" + element { + scale: 8 + lines { + width: 0.5 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP + } + } element { scale: 9 lines { - width: 0.1 - color: 2582559556 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 - color: 871283524 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16597 + min_distance: 18 } } element { scale: 11 lines { - width: 1.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.4 + color: 16749632 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16597 + min_distance: 18 } } element { scale: 12 lines { - width: 1.5 - color: 452975974 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16746278 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 20 } } element { scale: 13 lines { - width: 2.5 - color: 16768358 - priority: 1578 + width: 2.4 + color: 16752972 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 20 } } element { scale: 14 lines { - width: 4.8 - color: 8947848 + width: 4.9 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.8 - color: 16768358 - priority: 1578 + width: 2.9 + color: 16557154 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -14329,41 +14674,35 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 25 } } element { scale: 15 lines { - width: 5.8 - color: 8947848 + width: 6.2 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.8 - color: 16768358 - priority: 1578 + width: 4.2 + color: 16752972 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.5 - color: 15641156 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -14371,39 +14710,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16578 + stroke_color: 4820806 + priority: 16597 + min_distance: 24 } } element { scale: 16 lines { - width: 8.0 - color: 8947848 + width: 6.8 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 7.2 - color: 15641156 - priority: 1218 + width: 4.8 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } @@ -14413,33 +14746,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 17 lines { - width: 11.0 - color: 8947848 + width: 9.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 - color: 16768341 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 15641156 - priority: 1218 + width: 7.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } @@ -14449,33 +14775,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 18 lines { - width: 16.0 - color: 8947848 + width: 12.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 15641156 - priority: 1218 + width: 10.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } @@ -14485,33 +14804,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } element { scale: 19 lines { - width: 16.0 - color: 8947848 + width: 15.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 16768358 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 15641156 - priority: 1218 + width: 13.0 + color: 16752972 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } @@ -14521,7 +14833,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16578 + priority: 16597 } } } @@ -14531,22 +14843,22 @@ cont { scale: 10 path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16406 + priority: 16000 } } element { scale: 11 path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16406 + priority: 16000 } } element { @@ -14555,9 +14867,9 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -14566,101 +14878,103 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1406 + width: 2.9 + color: 16749632 + priority: 1583 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16583 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16583 + min_distance: 20 } } element { scale: 15 lines { - width: 1.9 - color: 16777215 - priority: 1406 + width: 2.1 + color: 16752972 + priority: 1583 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16583 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16583 + min_distance: 24 } } element { scale: 16 lines { - width: 3.0 - color: 16777215 - priority: 1406 + width: 2.4 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 17 lines { - width: 4.5 - color: 16777215 - priority: 1406 + width: 3.5 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 18 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 5.0 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } @@ -14670,15 +14984,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 19 lines { width: 7.0 - color: 16777215 - priority: 1406 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } @@ -14688,7 +15002,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } } @@ -14698,22 +15012,22 @@ cont { scale: 10 path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16406 + priority: 16000 } } element { scale: 11 path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16406 + priority: 16000 } } element { @@ -14722,9 +15036,9 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -14733,69 +15047,70 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 15658717 - priority: 1420 + width: 2.9 + color: 16749632 + priority: 1583 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.6 - color: 8947848 - priority: 1405 + width: 5.8 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 6.6 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16583 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16583 + min_distance: 20 } } element { scale: 15 lines { - width: 1.9 - color: 16777215 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.8 - color: 15658717 - priority: 1420 + width: 2.1 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 - color: 8947848 - priority: 1405 + width: 4.2 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 5.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -14803,101 +15118,102 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16583 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16583 + min_distance: 24 } } element { scale: 16 lines { - width: 3.0 - color: 16777215 - priority: 1406 + width: 2.4 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.0 - color: 15658717 - priority: 1420 + width: 4.8 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 - color: 8947848 - priority: 1405 + width: 5.6 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 17 lines { - width: 4.5 - color: 16777215 - priority: 1406 + width: 3.5 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 10.6 - color: 15658717 - priority: 1420 + width: 8.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.2 - color: 8947848 - priority: 1405 + width: 10.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 18 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 5.0 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 12.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 - color: 8947848 - priority: 1405 + width: 14.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -14907,29 +15223,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 19 lines { width: 7.0 - color: 16777215 - priority: 1406 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 16.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 18.0 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -14939,7 +15255,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } } @@ -14949,22 +15265,22 @@ cont { scale: 10 path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16406 + priority: 16000 } } element { scale: 11 path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16406 + priority: 16000 } } element { @@ -14973,9 +15289,9 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -14984,145 +15300,158 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { scale: 14 lines { - width: 3.4 - color: 8947848 + width: 4.9 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.4 - color: 16777215 - priority: 1406 + width: 2.9 + color: 16557154 + priority: 1583 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16583 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16583 + min_distance: 20 } } element { scale: 15 lines { - width: 1.9 - color: 16777215 - priority: 1406 + width: 4.1 + color: 8421504 + dashdot { + dd: 5.0 + dd: 5.0 + } + priority: 1582 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + lines { + width: 2.1 + color: 16752972 + priority: 1583 + join: ROUNDJOIN + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16583 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16583 + min_distance: 24 } } element { scale: 16 lines { - width: 5.0 - color: 8947848 + width: 4.4 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.0 - color: 16777215 - priority: 1406 + width: 2.4 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 17 lines { - width: 6.5 - color: 8947848 + width: 5.5 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 - color: 16777215 - priority: 1406 + width: 3.5 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 18 lines { - width: 9.0 - color: 8947848 + width: 7.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 5.0 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } @@ -15132,26 +15461,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } element { scale: 19 lines { width: 9.0 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 16777215 - priority: 1406 + color: 16752972 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } @@ -15161,7 +15490,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16583 } } } @@ -15170,125 +15499,125 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3439329279 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1515 + width: 1.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 872415231 - priority: 1515 + width: 1.8 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 - color: 16777215 - priority: 1515 + width: 3.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1515 + width: 4.4 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1515 + width: 6.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1515 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15298,15 +15627,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1515 + width: 12.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15316,7 +15645,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } } @@ -15325,125 +15654,125 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3439329279 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1515 + width: 1.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 872415231 - priority: 1515 + width: 1.8 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 - color: 16777215 - priority: 1515 + width: 3.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1515 + width: 4.4 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1515 + width: 6.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1515 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15453,15 +15782,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1515 + width: 12.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15471,7 +15800,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } } @@ -15480,99 +15809,99 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3439329279 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1515 + width: 1.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 872415231 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 15658717 - priority: 1420 + width: 1.8 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.6 - color: 8947848 - priority: 1405 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 - color: 16777215 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 15658717 - priority: 1420 + width: 3.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 - color: 8947848 - priority: 1405 + width: 6.4 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 7.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -15580,95 +15909,95 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1515 + width: 4.4 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.0 - color: 15658717 - priority: 1420 + width: 8.8 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.8 - color: 8947848 - priority: 1405 + width: 9.6 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1515 + width: 6.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 13.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 17.6 - color: 8947848 - priority: 1405 + width: 15.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1515 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 20.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 22.0 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -15678,29 +16007,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1515 + width: 12.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 20.0 - color: 15658717 - priority: 1420 + width: 26.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 22.0 - color: 8947848 - priority: 1405 + width: 28.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -15710,7 +16039,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } } @@ -15719,158 +16048,158 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3439329279 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1515 + width: 1.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 872415231 - priority: 1515 + width: 1.8 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 - color: 16777215 - priority: 1515 + width: 3.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 6.5 - color: 8947848 + width: 6.4 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 + width: 4.4 color: 16777215 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 9.2 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.2 + width: 6.0 color: 16777215 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 18 lines { width: 11.0 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 color: 16777215 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15880,26 +16209,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 11.0 - color: 8947848 + width: 14.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 + width: 12.0 color: 16777215 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15909,7 +16238,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } } @@ -15918,49 +16247,49 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1484 + width: 4.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -15968,9 +16297,9 @@ cont { element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1484 + width: 6.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -15979,8 +16308,8 @@ cont { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -15988,9 +16317,9 @@ cont { element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1484 + width: 12.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16001,63 +16330,63 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1484 + width: 4.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.0 - color: 15658717 - priority: 1420 + width: 8.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.4 - color: 8947848 - priority: 1405 + width: 8.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16065,23 +16394,23 @@ cont { element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1484 + width: 6.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 14.4 - color: 15658717 - priority: 1420 + width: 12.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.8 - color: 8947848 - priority: 1405 + width: 12.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16090,22 +16419,22 @@ cont { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 18.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 18.4 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16113,23 +16442,23 @@ cont { element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1484 + width: 12.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 18.0 - color: 15658717 - priority: 1420 + width: 24.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.4 - color: 8947848 - priority: 1405 + width: 24.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16140,49 +16469,49 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1484 + width: 4.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16190,9 +16519,9 @@ cont { element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1484 + width: 6.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16201,8 +16530,8 @@ cont { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16210,9 +16539,9 @@ cont { element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1484 + width: 12.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16223,117 +16552,145 @@ cont { element { scale: 10 lines { - width: 0.2 - color: 2583691263 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16562 + priority: 16569 } } element { scale: 11 lines { - width: 0.7 - color: 872415231 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.1 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16562 + priority: 16569 } } element { scale: 12 lines { - width: 1.8 - color: 1308622847 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 stroke_color: 3019898879 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 20 } } element { scale: 13 lines { - width: 2.0 + width: 2.2 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 stroke_color: 3019898879 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 + width: 3.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 + width: 4.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 24 } } element { scale: 16 lines { - width: 5.4 + width: 4.8 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } @@ -16343,15 +16700,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 17 lines { - width: 9.0 + width: 7.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } @@ -16361,15 +16718,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 18 lines { - width: 12.0 + width: 10.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } @@ -16379,15 +16736,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 19 lines { - width: 12.0 + width: 13.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } @@ -16397,7 +16754,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } } @@ -16406,127 +16763,148 @@ cont { element { scale: 10 lines { - width: 0.2 - color: 2583691263 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16562 + priority: 16569 } } element { scale: 11 lines { - width: 0.7 - color: 872415231 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.1 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16562 + priority: 16569 } } element { scale: 12 lines { - width: 1.8 - color: 1308622847 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 stroke_color: 3019898879 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 20 } } element { scale: 13 lines { - width: 2.0 + width: 2.2 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 stroke_color: 3019898879 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 + width: 3.0 color: 16777215 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.6 - color: 15658717 - priority: 1420 + priority: 1569 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.4 - color: 8947848 - priority: 1405 + width: 6.0 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 6.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 + width: 4.0 color: 16777215 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 7.6 - color: 15658717 - priority: 1420 + priority: 1569 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.4 - color: 8947848 - priority: 1405 + width: 8.0 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 8.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16534,31 +16912,38 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 24 } } element { scale: 16 lines { - width: 5.4 + width: 4.8 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 10.8 - color: 15658717 - priority: 1420 + width: 9.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 11.6 - color: 8947848 - priority: 1405 + width: 10.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16568,29 +16953,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 17 lines { - width: 9.0 + width: 7.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 19.6 - color: 15658717 - priority: 1420 + width: 15.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 21.2 - color: 8947848 - priority: 1405 + width: 17.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16600,29 +16985,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 18 lines { - width: 12.0 + width: 10.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 26.0 - color: 15658717 - priority: 1420 + width: 22.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 28.0 - color: 8947848 - priority: 1405 + width: 24.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16632,29 +17017,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 19 lines { - width: 12.0 + width: 13.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 26.0 - color: 15658717 - priority: 1420 + width: 28.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 28.0 - color: 8947848 - priority: 1405 + width: 30.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16664,7 +17049,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } } @@ -16673,128 +17058,156 @@ cont { element { scale: 10 lines { - width: 0.2 - color: 2583691263 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16562 + priority: 16569 } } element { scale: 11 lines { - width: 0.7 - color: 872415231 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.1 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 - stroke_color: 3018780381 + stroke_color: 3018714075 } - priority: 16562 + priority: 16569 } } element { scale: 12 lines { - width: 1.8 - color: 1308622847 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16777215 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 stroke_color: 3019898879 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 20 } } element { scale: 13 lines { - width: 2.0 + width: 2.2 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 4473924 stroke_color: 3019898879 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 + width: 3.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 + width: 4.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16569 + min_distance: 24 } } element { scale: 16 lines { - width: 7.4 - color: 8947848 + width: 6.8 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1561 + priority: 1568 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.4 + width: 4.8 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } @@ -16804,26 +17217,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 17 lines { - width: 11.0 - color: 8947848 + width: 9.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1561 + priority: 1568 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 + width: 7.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } @@ -16833,26 +17246,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 18 lines { - width: 14.0 - color: 8947848 + width: 12.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1561 + priority: 1568 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.0 + width: 10.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } @@ -16862,26 +17275,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } element { scale: 19 lines { - width: 14.0 - color: 8947848 + width: 15.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1561 + priority: 1568 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.0 + width: 13.0 color: 16777215 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } @@ -16891,7 +17304,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16562 + priority: 16569 } } } @@ -16900,29 +17313,29 @@ cont { element { scale: 14 lines { - width: 1.4 + width: 1.5 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.9 + width: 2.0 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 2.7 + width: 2.4 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -16930,9 +17343,9 @@ cont { element { scale: 17 lines { - width: 4.5 + width: 3.5 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -16940,9 +17353,9 @@ cont { element { scale: 18 lines { - width: 6.0 + width: 5.0 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -16950,9 +17363,9 @@ cont { element { scale: 19 lines { - width: 6.0 + width: 7.0 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -16963,23 +17376,23 @@ cont { element { scale: 14 lines { - width: 1.4 + width: 1.5 color: 16777215 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 15658717 - priority: 1420 + priority: 1555 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.6 - color: 8947848 - priority: 1405 + width: 3.0 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16987,23 +17400,23 @@ cont { element { scale: 15 lines { - width: 1.9 + width: 2.0 color: 16777215 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.8 - color: 15658717 - priority: 1420 + priority: 1555 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 - color: 8947848 - priority: 1405 + width: 4.0 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17011,23 +17424,23 @@ cont { element { scale: 16 lines { - width: 2.7 + width: 2.4 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 - color: 15658717 - priority: 1420 + width: 4.8 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.2 - color: 8947848 - priority: 1405 + width: 5.6 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17035,23 +17448,23 @@ cont { element { scale: 17 lines { - width: 4.5 + width: 3.5 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 10.6 - color: 15658717 - priority: 1420 + width: 8.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.2 - color: 8947848 - priority: 1405 + width: 10.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17059,23 +17472,23 @@ cont { element { scale: 18 lines { - width: 6.0 + width: 5.0 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 14.0 - color: 15658717 - priority: 1420 + width: 12.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 16.0 - color: 8947848 - priority: 1405 + width: 14.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17083,23 +17496,23 @@ cont { element { scale: 19 lines { - width: 6.0 + width: 7.0 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 14.0 - color: 15658717 - priority: 1420 + width: 16.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 16.0 - color: 8947848 - priority: 1405 + width: 18.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17110,40 +17523,40 @@ cont { element { scale: 14 lines { - width: 1.4 + width: 1.5 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.9 + width: 2.0 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 4.7 - color: 8947848 + width: 4.4 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1554 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.7 + width: 2.4 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -17151,20 +17564,20 @@ cont { element { scale: 17 lines { - width: 6.5 - color: 8947848 + width: 5.5 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1554 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 + width: 3.5 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -17172,20 +17585,20 @@ cont { element { scale: 18 lines { - width: 8.0 - color: 8947848 + width: 7.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1554 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 + width: 5.0 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -17193,20 +17606,20 @@ cont { element { scale: 19 lines { - width: 8.0 - color: 8947848 + width: 9.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1554 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 + width: 7.0 color: 16777215 - priority: 1406 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -17217,29 +17630,29 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452984831 - priority: 1437 + width: 1.2 + color: 16316664 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 872415231 - priority: 1468 + width: 1.6 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17247,9 +17660,9 @@ cont { element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17258,21 +17671,37 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17280,29 +17709,29 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452984831 - priority: 1437 + width: 1.2 + color: 16316664 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 872415231 - priority: 1468 + width: 1.6 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17310,9 +17739,9 @@ cont { element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17321,21 +17750,37 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17343,43 +17788,43 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452984831 - priority: 1437 + width: 1.2 + color: 16316664 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 872415231 - priority: 1468 + width: 1.6 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 2.8 - color: 15658717 - priority: 1420 + width: 3.2 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.2 - color: 8947848 - priority: 1405 + width: 3.6 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17387,23 +17832,23 @@ cont { element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.8 - color: 15658717 - priority: 1420 + width: 4.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.2 - color: 8947848 - priority: 1405 + width: 4.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17412,49 +17857,65 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 6.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.0 - color: 15658717 - priority: 1420 + width: 8.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.4 - color: 8947848 - priority: 1405 + width: 8.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17462,19 +17923,19 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17483,21 +17944,37 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17505,19 +17982,19 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17526,21 +18003,37 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17548,33 +18041,33 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.8 - color: 15658717 - priority: 1420 + width: 4.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.2 - color: 8947848 - priority: 1405 + width: 4.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17583,49 +18076,65 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 6.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.0 - color: 15658717 - priority: 1420 + width: 8.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.4 - color: 8947848 - priority: 1405 + width: 8.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17633,19 +18142,19 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17654,21 +18163,37 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17676,29 +18201,29 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452984831 - priority: 1437 + width: 1.2 + color: 16316664 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 872415231 - priority: 1468 + width: 1.6 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17706,9 +18231,9 @@ cont { element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17717,21 +18242,37 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17739,29 +18280,29 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2583691263 - priority: 1437 + width: 0.7 + color: 4294506744 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 452984831 - priority: 1437 + width: 1.2 + color: 16316664 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 872415231 - priority: 1468 + width: 1.6 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17769,9 +18310,9 @@ cont { element { scale: 17 lines { - width: 2.4 - color: 16777215 - priority: 1468 + width: 2.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17780,21 +18321,37 @@ cont { scale: 18 lines { width: 3.0 - color: 16777215 - priority: 1468 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 - color: 16777215 - priority: 1468 + width: 4.0 + color: 16316664 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 3355443 + stroke_color: 2164260863 + } + priority: 16458 + } } } cont { @@ -17804,7 +18361,7 @@ cont { symbol { name: "speedcam-m" apply_for_type: 1 - priority: 16890 + priority: 16722 } } element { @@ -17812,7 +18369,7 @@ cont { symbol { name: "speedcam-m" apply_for_type: 1 - priority: 16890 + priority: 16722 } } element { @@ -17820,7 +18377,7 @@ cont { symbol { name: "speedcam-m" apply_for_type: 1 - priority: 16890 + priority: 16722 } } element { @@ -17828,7 +18385,7 @@ cont { symbol { name: "speedcam-m" apply_for_type: 1 - priority: 16890 + priority: 16722 } } } @@ -17837,13 +18394,13 @@ cont { element { scale: 16 lines { - width: 4.0 + width: 5.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 1.5 + dd: 1.5 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -17851,13 +18408,13 @@ cont { element { scale: 17 lines { - width: 6.0 + width: 7.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.3 + dd: 2.3 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -17865,13 +18422,13 @@ cont { element { scale: 18 lines { - width: 8.0 + width: 9.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.2 + dd: 3.2 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -17879,13 +18436,13 @@ cont { element { scale: 19 lines { - width: 10.0 + width: 11.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 4.0 + dd: 4.0 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -17896,27 +18453,27 @@ cont { element { scale: 16 lines { - width: 4.0 + width: 5.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 1.5 + dd: 1.5 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 8.0 - color: 15658717 - priority: 1420 + width: 10.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.4 - color: 8947848 - priority: 1405 + width: 10.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17924,27 +18481,27 @@ cont { element { scale: 17 lines { - width: 6.0 + width: 7.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.3 + dd: 2.3 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 12.0 - color: 15658717 - priority: 1420 + width: 14.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.4 - color: 8947848 - priority: 1405 + width: 14.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17952,27 +18509,27 @@ cont { element { scale: 18 lines { - width: 8.0 + width: 9.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.2 + dd: 3.2 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 18.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 16.4 - color: 8947848 - priority: 1405 + width: 18.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17980,27 +18537,27 @@ cont { element { scale: 19 lines { - width: 10.0 + width: 11.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 4.0 + dd: 4.0 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 20.0 - color: 15658717 - priority: 1420 + width: 22.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 20.4 - color: 8947848 - priority: 1405 + width: 22.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18011,13 +18568,13 @@ cont { element { scale: 16 lines { - width: 4.0 + width: 5.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 1.5 + dd: 1.5 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -18025,13 +18582,13 @@ cont { element { scale: 17 lines { - width: 6.0 + width: 7.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.3 + dd: 2.3 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -18039,13 +18596,13 @@ cont { element { scale: 18 lines { - width: 8.0 + width: 9.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.2 + dd: 3.2 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -18053,13 +18610,13 @@ cont { element { scale: 19 lines { - width: 10.0 + width: 11.0 color: 16777215 dashdot { - dd: 1.0 - dd: 1.0 + dd: 4.0 + dd: 4.0 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -18070,125 +18627,125 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3439329279 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1515 + width: 1.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 872415231 - priority: 1515 + width: 1.8 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 - color: 16777215 - priority: 1515 + width: 3.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1515 + width: 4.4 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1515 + width: 6.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1515 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -18198,15 +18755,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1515 + width: 12.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -18216,7 +18773,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } } @@ -18225,99 +18782,99 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3439329279 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1515 + width: 1.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 872415231 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 15658717 - priority: 1420 + width: 1.8 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.6 - color: 8947848 - priority: 1405 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 - color: 16777215 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 15658717 - priority: 1420 + width: 3.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 - color: 8947848 - priority: 1405 + width: 6.4 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 7.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18325,95 +18882,95 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1515 + width: 4.4 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.0 - color: 15658717 - priority: 1420 + width: 8.8 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.8 - color: 8947848 - priority: 1405 + width: 9.6 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1515 + width: 6.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 13.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 17.6 - color: 8947848 - priority: 1405 + width: 15.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1515 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 20.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 22.0 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18423,29 +18980,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1515 + width: 12.0 + color: 16316664 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 20.0 - color: 15658717 - priority: 1420 + width: 26.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 22.0 - color: 8947848 - priority: 1405 + width: 28.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18455,7 +19012,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } } @@ -18464,158 +19021,158 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3439329279 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1515 + width: 1.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 8 color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 872415231 - priority: 1515 + width: 1.8 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 - color: 16777215 - priority: 1515 + width: 3.2 + color: 16316664 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 6.5 - color: 8947848 + width: 6.4 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 + width: 4.4 color: 16777215 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 9.2 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.2 + width: 6.0 color: 16777215 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 18 lines { width: 11.0 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 color: 16777215 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -18625,26 +19182,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 11.0 - color: 8947848 + width: 14.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 + width: 12.0 color: 16777215 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -18654,7 +19211,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16515 + priority: 16541 } } } @@ -18663,19 +19220,19 @@ cont { element { scale: 15 lines { - width: 1.5 - color: 16777215 - priority: 1406 + width: 1.6 + color: 16316664 + priority: 1527 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { width: 2.2 - color: 16777215 - priority: 1406 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18683,9 +19240,9 @@ cont { element { scale: 17 lines { - width: 3.6 - color: 16777215 - priority: 1406 + width: 3.0 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18694,8 +19251,8 @@ cont { scale: 18 lines { width: 4.5 - color: 16777215 - priority: 1406 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18703,9 +19260,9 @@ cont { element { scale: 19 lines { - width: 4.5 - color: 16777215 - priority: 1406 + width: 6.0 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18716,23 +19273,23 @@ cont { element { scale: 15 lines { - width: 1.5 - color: 16777215 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.0 - color: 15658717 - priority: 1420 + width: 1.6 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.8 - color: 8947848 - priority: 1405 + width: 3.2 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18741,22 +19298,22 @@ cont { scale: 16 lines { width: 2.2 - color: 16777215 - priority: 1406 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.4 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.2 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18764,23 +19321,23 @@ cont { element { scale: 17 lines { - width: 3.6 - color: 16777215 - priority: 1406 + width: 3.0 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 8.8 - color: 15658717 - priority: 1420 + width: 7.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 10.4 - color: 8947848 - priority: 1405 + width: 9.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18789,22 +19346,22 @@ cont { scale: 18 lines { width: 4.5 - color: 16777215 - priority: 1406 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 13.0 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18812,23 +19369,23 @@ cont { element { scale: 19 lines { - width: 4.5 - color: 16777215 - priority: 1406 + width: 6.0 + color: 16316664 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 11.0 - color: 15658717 - priority: 1420 + width: 14.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 13.0 - color: 8947848 - priority: 1405 + width: 16.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18839,30 +19396,30 @@ cont { element { scale: 15 lines { - width: 1.5 - color: 16777215 - priority: 1406 + width: 1.6 + color: 16316664 + priority: 1527 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { width: 4.2 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1526 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.2 color: 16777215 - priority: 1406 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18870,20 +19427,20 @@ cont { element { scale: 17 lines { - width: 5.6 - color: 8947848 + width: 5.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1526 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.6 + width: 3.0 color: 16777215 - priority: 1406 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18892,19 +19449,19 @@ cont { scale: 18 lines { width: 6.5 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1526 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 color: 16777215 - priority: 1406 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18912,20 +19469,20 @@ cont { element { scale: 19 lines { - width: 6.5 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1526 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 + width: 6.0 color: 16777215 - priority: 1406 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18936,41 +19493,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -18979,12 +19536,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -18993,12 +19550,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19006,13 +19563,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19023,41 +19580,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19066,12 +19623,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19080,12 +19637,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19093,13 +19650,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19110,41 +19667,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19153,12 +19710,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19167,12 +19724,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19180,13 +19737,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19197,41 +19754,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19240,12 +19797,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19254,12 +19811,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19267,13 +19824,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19284,41 +19841,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19327,12 +19884,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19341,12 +19898,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19354,13 +19911,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19371,41 +19928,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19414,12 +19971,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19428,12 +19985,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19441,13 +19998,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19458,41 +20015,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19501,12 +20058,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19515,12 +20072,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19528,13 +20085,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19545,41 +20102,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19588,12 +20145,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19602,12 +20159,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19615,13 +20172,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19632,41 +20189,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19675,12 +20232,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19689,12 +20246,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19702,13 +20259,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19719,41 +20276,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19762,12 +20319,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19776,12 +20333,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19789,13 +20346,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19806,41 +20363,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19849,12 +20406,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19863,12 +20420,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19876,13 +20433,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19893,41 +20450,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19936,12 +20493,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19950,12 +20507,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19963,13 +20520,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19980,41 +20537,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20023,12 +20580,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20037,12 +20594,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20050,13 +20607,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20067,41 +20624,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20110,12 +20667,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20124,12 +20681,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20137,13 +20694,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20154,41 +20711,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20197,12 +20754,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20211,12 +20768,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20224,13 +20781,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20241,41 +20798,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20284,12 +20841,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20298,12 +20855,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20311,13 +20868,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20328,41 +20885,41 @@ cont { element { scale: 14 lines { - width: 0.1 - color: 8943428 + width: 0.9 + color: 6510384 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 8943428 + width: 1.3 + color: 6510384 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 - color: 8943428 + width: 1.8 + color: 6510384 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20371,12 +20928,12 @@ cont { scale: 17 lines { width: 2.0 - color: 8943428 + color: 6510384 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20385,12 +20942,12 @@ cont { scale: 18 lines { width: 3.0 - color: 8943428 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20398,13 +20955,13 @@ cont { element { scale: 19 lines { - width: 3.8 - color: 8943428 + width: 4.0 + color: 6510384 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20415,91 +20972,91 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2583660544 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2164230144 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 872384512 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 2.0 - color: 452954112 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { @@ -20507,30 +21064,24 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 2.8 - color: 452954112 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -20538,30 +21089,24 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 3.8 - color: 16746496 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -20569,30 +21114,24 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 4.8 - color: 16746496 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -20600,28 +21139,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 6.8 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.8 - color: 13399876 - priority: 1218 + width: 6.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -20631,28 +21164,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 9.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 13399876 - priority: 1218 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -20662,28 +21189,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { - height: 9 + height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 14.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 + width: 12.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -20693,28 +21214,22 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 14.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 + width: 15.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -20724,13 +21239,14 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } } @@ -20739,91 +21255,91 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2583660544 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2164230144 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 872384512 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 2.0 - color: 452954112 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { @@ -20831,44 +21347,38 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 2.8 - color: 452954112 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.4 - color: 15658717 - priority: 1139 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.8 - color: 8947848 - priority: 1124 + width: 6.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.0 - color: 13399876 - priority: 1218 + width: 6.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -20876,44 +21386,38 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 3.8 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.0 - color: 15658717 - priority: 1420 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 10.8 - color: 8947848 - priority: 1405 + width: 7.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.0 - color: 13399876 - priority: 1218 + width: 8.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -20921,44 +21425,38 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 4.8 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 12.0 - color: 15658717 - priority: 1420 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.8 - color: 8947848 - priority: 1405 + width: 9.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 13399876 - priority: 1218 + width: 10.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -20966,193 +21464,170 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 6.8 - color: 16746496 - priority: 1593 + width: 6.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 17.6 - color: 15658717 - priority: 1420 + width: 12.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.4 - color: 8947848 - priority: 1405 + width: 12.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 8.8 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 9.0 - color: 16746496 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 22.6 - color: 15658717 - priority: 1420 + width: 19.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 24.2 - color: 8947848 - priority: 1405 + width: 21.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 10.5 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { - height: 9 + height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 14.0 - color: 16746496 - priority: 1593 + width: 12.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 34.0 - color: 15658717 - priority: 1420 + width: 26.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 36.0 - color: 8947848 - priority: 1405 + width: 28.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 14.0 - color: 16746496 - priority: 1593 + width: 15.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } + lines { + width: 32.0 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } lines { width: 34.0 - color: 15658717 - priority: 1420 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 36.0 - color: 8947848 - priority: 1405 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } } @@ -21161,102 +21636,102 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2583660544 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2164230144 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 872384512 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16737830 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1308592128 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16741158 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 16777215 + stroke_color: 4820806 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 3.0 - color: 8947848 + color: 8421504 dashdot { dd: 2.0 dd: 2.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16557154 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { @@ -21264,41 +21739,35 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 4.8 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.8 - color: 452954112 - priority: 1593 + color: 16557154 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -21306,41 +21775,35 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 5.8 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.8 - color: 16746496 - priority: 1593 + color: 16557154 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -21348,41 +21811,35 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 6.8 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.8 - color: 16746496 - priority: 1593 + color: 16741158 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 13399876 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -21390,39 +21847,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 8.8 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.8 - color: 13399876 - priority: 1218 + width: 6.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -21432,39 +21883,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 11.0 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 13399876 - priority: 1218 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -21474,39 +21919,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { - height: 9 + height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 16.0 - color: 8947848 + width: 14.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 + width: 12.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -21516,39 +21955,33 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 16.0 - color: 8947848 + width: 17.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 16746496 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 13399876 - priority: 1218 + width: 15.0 + color: 16741158 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } @@ -21558,13 +21991,14 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16593 + priority: 16625 } shield { height: 10 color: 16777215 - stroke_color: 4491332 - priority: 16593 + stroke_color: 4820806 + priority: 16625 + min_distance: 26 } } } @@ -21576,9 +22010,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -21587,9 +22021,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -21600,17 +22034,17 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 0.8 - color: 16777215 - priority: 1406 + width: 2.8 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -21618,105 +22052,108 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 14 lines { - width: 1.9 - color: 16777215 - priority: 1406 + width: 3.8 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 2.4 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 3.4 - color: 16777215 - priority: 1406 + width: 3.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 4.5 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 6.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -21726,15 +22163,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 7.5 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -21744,7 +22181,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } } @@ -21756,9 +22193,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -21767,9 +22204,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -21780,17 +22217,17 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 0.8 - color: 16777215 - priority: 1406 + width: 2.8 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -21798,73 +22235,75 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 14 - lines { - width: 1.9 - color: 16777215 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } lines { width: 3.8 - color: 15658717 - priority: 1420 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 - color: 8947848 - priority: 1405 + width: 7.6 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 8.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 2.4 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 4.8 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.6 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -21872,101 +22311,102 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 3.4 - color: 16777215 - priority: 1406 + width: 3.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.8 - color: 15658717 - priority: 1420 + width: 6.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.6 - color: 8947848 - priority: 1405 + width: 6.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 4.5 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 10.6 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.2 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 6.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 14.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 - color: 8947848 - priority: 1405 + width: 16.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -21976,29 +22416,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 7.5 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 17.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 - color: 8947848 - priority: 1405 + width: 19.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -22008,7 +22448,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } } @@ -22020,9 +22460,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -22031,9 +22471,9 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16000 } } element { @@ -22044,28 +22484,28 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 2.8 - color: 8947848 + width: 4.8 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 16777215 - priority: 1406 + width: 2.8 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -22073,160 +22513,163 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 14 lines { - width: 3.9 - color: 8947848 + width: 5.8 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.9 - color: 16777215 - priority: 1406 + width: 3.8 + color: 16557154 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 4.4 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.4 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16406 + priority: 16611 } shield { height: 9 color: 16777215 - stroke_color: 4491332 - priority: 16406 + stroke_color: 4820806 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 5.4 - color: 8947848 + width: 5.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.4 - color: 16777215 - priority: 1406 + width: 3.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 6.5 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 16777215 - priority: 1406 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 9.0 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 6.0 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -22236,26 +22679,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 9.0 - color: 8947848 + width: 9.5 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 16777215 - priority: 1406 + width: 7.5 + color: 16741158 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -22265,7 +22708,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16406 + priority: 16611 } } } @@ -22274,101 +22717,101 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1484 + width: 4.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1484 + width: 6.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22378,15 +22821,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1484 + width: 12.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22396,7 +22839,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } } @@ -22405,101 +22848,101 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1484 + width: 4.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1484 + width: 6.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22509,15 +22952,15 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1484 + width: 12.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22527,7 +22970,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } } @@ -22536,75 +22979,75 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 15658717 - priority: 1420 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.6 - color: 8947848 - priority: 1405 + color: 14934482 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.4 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 6.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -22612,95 +23055,95 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 - color: 16777215 - priority: 1484 + width: 4.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.0 - color: 15658717 - priority: 1420 + width: 8.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.8 - color: 8947848 - priority: 1405 + width: 8.8 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 - color: 16777215 - priority: 1484 + width: 6.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 - color: 15658717 - priority: 1420 + width: 13.6 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 17.6 - color: 8947848 - priority: 1405 + width: 15.2 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 18 lines { width: 9.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 20.0 - color: 15658717 - priority: 1420 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 22.0 - color: 8947848 - priority: 1405 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -22710,29 +23153,29 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 - color: 16777215 - priority: 1484 + width: 12.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 20.0 - color: 15658717 - priority: 1420 + width: 26.0 + color: 14934482 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 22.0 - color: 8947848 - priority: 1405 + width: 28.0 + color: 8421504 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -22742,7 +23185,7 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } } @@ -22751,134 +23194,134 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2583691263 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 16316664 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1308622847 - priority: 1484 + width: 1.0 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 - color: 16777215 - priority: 1484 + width: 1.8 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 15 lines { width: 3.0 - color: 16777215 - priority: 1484 + color: 16316664 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 6.5 - color: 8947848 + width: 6.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 + width: 4.0 color: 16777215 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 9.2 - color: 8947848 + width: 8.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.2 + width: 6.0 color: 16777215 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 18 lines { width: 11.0 - color: 8947848 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 color: 16777215 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22888,26 +23331,26 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 11.0 - color: 8947848 + width: 14.0 + color: 8421504 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 + width: 12.0 color: 16777215 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22917,7 +23360,151 @@ cont { color: 3355443 stroke_color: 2164260863 } - priority: 16484 + priority: 16513 + } + } +} +cont { + name: "historic-archaeological_site" + element { + scale: 17 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 18 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 19 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + } +} +cont { + name: "historic-boundary_stone" + element { + scale: 18 + symbol { + name: "boundary_stone-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "boundary_stone-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "historic-castle" + element { + scale: 16 + symbol { + name: "remains-m" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 12 + } + priority: 15763 + } + } + element { + scale: 17 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 18 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 19 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 } } } @@ -22926,13 +23513,13 @@ cont { element { scale: 16 lines { - width: 0.1 - color: 1723579306 + width: 0.5 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -22940,13 +23527,13 @@ cont { element { scale: 17 lines { - width: 0.3 - color: 12303274 + width: 1.0 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -22955,12 +23542,12 @@ cont { scale: 18 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -22969,12 +23556,12 @@ cont { scale: 19 lines { width: 1.0 - color: 12303274 + color: 8355446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -22986,45 +23573,45 @@ cont { scale: 17 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 18 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 19 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } } @@ -23034,60 +23621,60 @@ cont { scale: 16 symbol { name: "monument-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 12 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 18 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 19 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } } @@ -23097,60 +23684,240 @@ cont { scale: 16 symbol { name: "museum-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 12 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "museum-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "museum-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "museum-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 + } + } +} +cont { + name: "historic-ruins" + element { + scale: 17 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 18 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 19 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15763 + } + } +} +cont { + name: "historic-ship" + element { + scale: 18 + symbol { + name: "ship-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "ship-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "historic-tomb" + element { + scale: 18 + symbol { + name: "tomb-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "tomb-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "historic-wayside_cross" + element { + scale: 18 + symbol { + name: "wayside_cross-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "wayside_cross-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "historic-wayside_shrine" + element { + scale: 18 + symbol { + name: "wayside_shrine-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "wayside_shrine-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -23161,7 +23928,7 @@ cont { lines { width: 0 color: 0 - priority: 1406 + priority: 1402 pathsym { name: "arrow-s" step: 144.0 @@ -23174,7 +23941,7 @@ cont { lines { width: 0 color: 0 - priority: 1640 + priority: 1652 pathsym { name: "arrow-s" step: 184.0 @@ -23187,7 +23954,7 @@ cont { lines { width: 0 color: 0 - priority: 1640 + priority: 1652 pathsym { name: "arrow-m" step: 184.0 @@ -23200,7 +23967,7 @@ cont { lines { width: 0 color: 0 - priority: 1640 + priority: 1652 pathsym { name: "arrow-m" step: 184.0 @@ -23211,46 +23978,88 @@ cont { } cont { name: "landuse-allotments" + element { + scale: 13 + area { + color: 13620648 + priority: -15862 + } + } element { scale: 14 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 15 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 16 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 17 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 18 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 19 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } } @@ -23259,57 +24068,57 @@ cont { element { scale: 12 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 13 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 14 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 15 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 16 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 17 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 18 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 19 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } } @@ -23318,19 +24127,19 @@ cont { element { scale: 14 area { - color: 665500518 - priority: -15813 + color: 666683518 + priority: -15848 } } element { scale: 15 area { - color: 11189094 - priority: -15813 + color: 12372094 + priority: -15848 } symbol { name: "cemetery-m" - priority: 16187 + priority: 16152 } caption { primary { @@ -23338,18 +24147,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15187 + priority: 15152 } } element { scale: 16 area { - color: 11189094 - priority: -15813 + color: 11781233 + priority: -15848 } symbol { name: "cemetery-m" - priority: 16187 + priority: 16152 } caption { primary { @@ -23357,18 +24166,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15187 + priority: 15152 } } element { scale: 17 area { - color: 11189094 - priority: -15360 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23376,18 +24185,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15569 } } element { scale: 18 area { - color: 11189094 - priority: -15360 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23395,18 +24204,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15569 } } element { scale: 19 area { - color: 11189094 - priority: -15360 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23414,7 +24223,7 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15569 } } } @@ -23423,19 +24232,19 @@ cont { element { scale: 14 area { - color: 665500518 - priority: -15813 + color: 666683518 + priority: -15848 } } element { scale: 15 area { - color: 11189094 - priority: -15813 + color: 12372094 + priority: -15848 } symbol { name: "cemetery-m" - priority: 16187 + priority: 16152 } caption { primary { @@ -23443,18 +24252,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15187 + priority: 15152 } } element { scale: 16 area { - color: 11189094 - priority: -15813 + color: 11781233 + priority: -15848 } symbol { name: "cemetery-m" - priority: 16187 + priority: 16152 } caption { primary { @@ -23462,18 +24271,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15187 + priority: 15152 } } element { scale: 17 area { - color: 11189094 - priority: -15360 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23481,18 +24290,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15569 } } element { scale: 18 area { - color: 11189094 - priority: -15360 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23500,18 +24309,18 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15569 } } element { scale: 19 area { - color: 11189094 - priority: -15360 + color: 11781233 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23519,7 +24328,7 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15569 } } } @@ -23561,81 +24370,158 @@ cont { element { scale: 15 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15959 + } + caption { + primary { + height: 10 + color: 5855577 + } + priority: 15041 } } element { scale: 16 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15959 + } + caption { + primary { + height: 10 + color: 5855577 + } + priority: 15041 } } element { scale: 17 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15959 + } + caption { + primary { + height: 10 + color: 5855577 + } + priority: 15041 } } element { scale: 18 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15959 + } + caption { + primary { + height: 10 + color: 5855577 + } + priority: 15041 } } element { scale: 19 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15959 + } + caption { + primary { + height: 10 + color: 5855577 + } + priority: 15041 } } } cont { name: "landuse-farmland" + element { + scale: 13 + area { + color: 13620648 + priority: -15862 + } + } element { scale: 14 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 15 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 16 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 17 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 18 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 19 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } } @@ -23644,72 +24530,836 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 13 area { - color: 665500518 - priority: -15860 + color: 11781233 + priority: -15889 } } element { scale: 14 area { - color: 665500518 - priority: -15860 + color: 11453035 + priority: -15889 } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 14 + area { + color: 11453035 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 14 + area { + color: 11453035 + priority: -15889 + } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15860 + color: 11584112 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" } element { scale: 18 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 19 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } } cont { @@ -23717,72 +25367,836 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 13 area { - color: 665500518 - priority: -15860 + color: 11781233 + priority: -15889 } } element { scale: 14 area { - color: 665500518 - priority: -15860 + color: 11453035 + priority: -15889 } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 14 + area { + color: 11453035 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 14 + area { + color: 11453035 + priority: -15889 + } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15860 + color: 11584112 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" } element { scale: 18 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 19 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } } cont { @@ -23790,72 +26204,836 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 13 area { - color: 665500518 - priority: -15860 + color: 11781233 + priority: -15889 } } element { scale: 14 area { - color: 665500518 - priority: -15860 + color: 11453035 + priority: -15889 } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 14 + area { + color: 11453035 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 14 + area { + color: 11453035 + priority: -15889 + } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15860 + color: 11584112 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" } element { scale: 18 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 19 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } } cont { @@ -23863,109 +27041,887 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 13 area { - color: 665500518 - priority: -15860 + color: 11781233 + priority: -15889 } } element { scale: 14 area { - color: 665500518 - priority: -15860 + color: 11453035 + priority: -15889 } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 14 + area { + color: 11453035 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 14 + area { + color: 11453035 + priority: -15889 + } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15860 + color: 11584112 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15889 + } + apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15889 + } + apply_if: "!name" } element { scale: 18 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 19 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } } cont { name: "landuse-grass" + element { + scale: 13 + area { + color: 13620648 + priority: -15820 + } + } + element { + scale: 14 + area { + color: 13029267 + priority: -15820 + } + } element { scale: 15 area { - color: 11189094 - priority: -15782 + color: 13029267 + priority: -15820 } } element { scale: 16 area { - color: 11189094 - priority: -15782 + color: 13029267 + priority: -15820 } } element { scale: 17 area { - color: 11189094 - priority: -15782 + color: 13029267 + priority: -15820 } } element { scale: 18 area { - color: 11189094 - priority: -15782 + color: 13029267 + priority: -15820 } } element { scale: 19 area { - color: 11189094 - priority: -15782 + color: 13029267 + priority: -15820 } } } @@ -23974,116 +27930,123 @@ cont { element { scale: 15 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15125 } caption { primary { height: 10 - color: 5592405 + color: 5855577 } - priority: 15046 + priority: 15875 } } element { scale: 16 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15125 } caption { primary { height: 10 - color: 5592405 + color: 5855577 } - priority: 15046 + priority: 15875 } } element { scale: 17 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15125 } caption { primary { height: 10 - color: 5592405 + color: 5855577 } - priority: 15046 + priority: 15875 } } element { scale: 18 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15125 } caption { primary { height: 10 - color: 5592405 + color: 5855577 } - priority: 15046 + priority: 15875 } } element { scale: 19 area { - color: 14540253 - priority: -15954 + color: 15000299 + priority: -15125 } caption { primary { height: 10 - color: 5592405 + color: 5855577 } - priority: 15046 + priority: 15875 } } } cont { name: "landuse-meadow" + element { + scale: 13 + area { + color: 13620648 + priority: -15862 + } + } element { scale: 14 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 15 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 16 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 17 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 18 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 19 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } } @@ -24093,7 +28056,7 @@ cont { scale: 17 symbol { name: "military-l" - priority: 16640 + priority: 16652 } caption { primary { @@ -24101,14 +28064,14 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15652 } } element { scale: 18 symbol { name: "military-l" - priority: 16640 + priority: 16652 } caption { primary { @@ -24116,14 +28079,14 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15652 } } element { scale: 19 symbol { name: "military-l" - priority: 16640 + priority: 16652 } caption { primary { @@ -24131,97 +28094,181 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15652 } } } cont { name: "landuse-orchard" + element { + scale: 13 + area { + color: 13620648 + priority: -15862 + } + } element { scale: 14 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 15 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 16 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 17 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 18 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 19 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } } cont { name: "landuse-recreation_ground" + element { + scale: 13 + area { + color: 13620648 + priority: -15862 + } + } element { scale: 14 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 15 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 16 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 17 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 18 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 19 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } } @@ -24234,7 +28281,7 @@ cont { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24245,369 +28292,395 @@ cont { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 12 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 12 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 12 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 13 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 13 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 13 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 14 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 14 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 14 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 15 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 15 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 15 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 16 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 16 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 16 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 17 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 17 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 17 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 18 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 18 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 18 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 19 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 19 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 19 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } } cont { name: "landuse-village_green" + element { + scale: 13 + area { + color: 13620648 + priority: -15862 + } + } element { scale: 14 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 15 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 16 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 17 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 18 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 19 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } } cont { name: "landuse-vineyard" + element { + scale: 13 + area { + color: 13620648 + priority: -15862 + } + } element { scale: 14 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 15 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 16 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } element { scale: 17 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } - } - element { - scale: 18 - area { - color: 11189094 - priority: -15829 - } - } - element { - scale: 19 - area { - color: 11189094 - priority: -15829 - } - } -} -cont { - name: "leisure-common" - element { - scale: 18 caption { primary { height: 10 color: 4473924 } - priority: 15000 + priority: 15138 } } element { - scale: 19 + scale: 18 + area { + color: 13029267 + priority: -15862 + } caption { primary { height: 10 color: 4473924 } - priority: 15000 + priority: 15138 + } + } + element { + scale: 19 + area { + color: 13029267 + priority: -15862 + } + caption { + primary { + height: 10 + color: 4473924 + } + priority: 15138 } } } @@ -24615,22 +28688,32 @@ cont { name: "leisure-dog_park" element { scale: 18 + symbol { + name: "dog_park-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15000 + priority: 15722 } } element { scale: 19 + symbol { + name: "dog_park-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15000 + priority: 15722 } } } @@ -24641,47 +28724,45 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { scale: 18 symbol { - name: "tennis-l" - apply_for_type: 1 - priority: 16000 + name: "dog_park-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15722 } } element { scale: 19 symbol { - name: "tennis-l" - apply_for_type: 1 - priority: 16000 + name: "dog_park-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15722 } } } @@ -24690,265 +28771,296 @@ cont { element { scale: 12 area { - color: 1303034726 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 13 area { - color: 866827110 - priority: -15844 + color: 11781233 + priority: -15875 } } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 } } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "garden-m" - priority: 16156 + priority: 16125 + min_distance: 10 } caption { primary { height: 11 - color: 3372834 + color: 3832097 stroke_color: 2583691263 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "garden-m" - priority: 16156 + priority: 16125 + min_distance: 10 } caption { primary { height: 11 - color: 3372834 + color: 3832097 stroke_color: 2583691263 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { - scale: 17 + scale: 16 area { - color: 11189094 - priority: -15844 - } - symbol { - name: "garden-l" - priority: 16156 - } - caption { - primary { - height: 13 - color: 3372834 - stroke_color: 2583691263 - offset_y: 10 - } - secondary { - height: 13 - color: 3372834 - stroke_color: 2583691263 - offset_y: 10 - text: "int_name" - } - priority: 15156 - } - apply_if: "name" - } - element { - scale: 17 - area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "garden-l" - priority: 16156 + priority: 16125 + min_distance: 10 } caption { primary { - height: 13 - color: 3372834 + height: 11 + color: 3832097 stroke_color: 2583691263 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "garden-l" + priority: 16125 + min_distance: 10 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 2583691263 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } element { scale: 18 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "garden-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 + height: 11 + color: 3832097 stroke_color: 2583691263 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } } element { scale: 19 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "garden-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 + height: 11 + color: 3832097 stroke_color: 2583691263 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } } } cont { name: "leisure-golf_course" element { - scale: 18 + scale: 13 + area { + color: 13620648 + priority: -15820 + } + } + element { + scale: 14 + area { + color: 13029267 + priority: -15820 + } + } + element { + scale: 15 + area { + color: 13029267 + priority: -15820 + } + } + element { + scale: 16 + area { + color: 13029267 + priority: -15820 + } + } + element { + scale: 17 + area { + color: 13029267 + priority: -15792 + } symbol { name: "golf-l" - priority: 16000 + apply_for_type: 1 + priority: 16208 } - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 + } + element { + scale: 18 + area { + color: 13029267 + priority: -15792 + } + symbol { + name: "golf-l" + priority: 16208 } } element { scale: 19 + area { + color: 13029267 + priority: -15792 + } symbol { name: "golf-l" - priority: 16000 - } - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 - } - } -} -cont { - name: "leisure-landscape_reserve" - element { - scale: 18 - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 - } - } - element { - scale: 19 - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 + priority: 16208 } } } @@ -24957,175 +29069,175 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15360 + color: 12372094 + priority: -15237 } symbol { name: "nparkf-s" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 8 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 13 area { - color: 665500518 - priority: -15360 + color: 11781233 + priority: -15237 } symbol { name: "nparkf-s" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 8 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 14 area { - color: 665500518 - priority: -15360 + color: 11453035 + priority: -15237 } symbol { name: "nparkf-s" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 3372834 - stroke_color: 2583691263 - offset_y: 8 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 15 area { - color: 11189094 - priority: -15360 + color: 11584112 + priority: -15237 } symbol { name: "nparkf-m" - priority: 16640 + priority: 16763 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 16 area { - color: 11189094 - priority: -15360 + color: 11190117 + priority: -15237 } symbol { name: "nparkf-m" - priority: 16640 + priority: 16763 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 17 area { - color: 11189094 - priority: -15360 + color: 11190117 + priority: -15237 } symbol { name: "nparkf-l" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 12 } - priority: 15640 + priority: 15763 } } element { scale: 18 area { - color: 11189094 - priority: -15360 + color: 11190117 + priority: -15237 } symbol { name: "nparkf-l" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 4473924 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 12 } - priority: 15640 + priority: 15763 } } element { scale: 19 area { - color: 11189094 - priority: -15360 + color: 11190117 + priority: -15237 } symbol { name: "nparkf-l" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 4473924 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 12 } - priority: 15640 + priority: 15763 } } } @@ -25134,344 +29246,886 @@ cont { element { scale: 10 area { - color: 2578103142 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 11 area { - color: 2158672742 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 12 area { - color: 1303034726 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 13 area { - color: 866827110 - priority: -15844 + color: 11781233 + priority: -15875 } } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 14 area { - color: 665500518 - priority: -15844 - } - symbol { - name: "none" - priority: 16156 + color: 11453035 + priority: -15875 } apply_if: "!name" } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 } apply_if: "name" } element { scale: 18 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 - stroke_color: 2583691263 + height: 13 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } element { scale: 19 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 - stroke_color: 2583691263 + height: 13 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } } cont { @@ -25479,344 +30133,886 @@ cont { element { scale: 10 area { - color: 2578103142 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 11 area { - color: 2158672742 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 12 area { - color: 1303034726 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 13 area { - color: 866827110 - priority: -15844 + color: 11781233 + priority: -15875 } } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 14 area { - color: 665500518 - priority: -15844 - } - symbol { - name: "none" - priority: 16156 + color: 11453035 + priority: -15875 } apply_if: "!name" } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 } apply_if: "name" } element { scale: 18 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 - stroke_color: 2583691263 + height: 13 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } element { scale: 19 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 - stroke_color: 2583691263 + height: 13 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } } cont { @@ -25824,344 +31020,886 @@ cont { element { scale: 10 area { - color: 2578103142 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 11 area { - color: 2158672742 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 12 area { - color: 1303034726 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 13 area { - color: 866827110 - priority: -15844 + color: 11781233 + priority: -15875 } } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 14 area { - color: 665500518 - priority: -15844 - } - symbol { - name: "none" - priority: 16156 + color: 11453035 + priority: -15875 } apply_if: "!name" } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 } apply_if: "name" } element { scale: 18 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 - stroke_color: 2583691263 + height: 13 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } element { scale: 19 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 - stroke_color: 2583691263 + height: 13 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } } cont { @@ -26169,344 +31907,886 @@ cont { element { scale: 10 area { - color: 2578103142 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 11 area { - color: 2158672742 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 12 area { - color: 1303034726 - priority: -15844 + color: 12372094 + priority: -15875 } } element { scale: 13 area { - color: 866827110 - priority: -15844 + color: 11781233 + priority: -15875 } } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 14 area { - color: 665500518 - priority: -15844 - } - symbol { - name: "none" - priority: 16156 + color: 11453035 + priority: -15875 } apply_if: "!name" } element { scale: 14 area { - color: 665500518 - priority: -15844 + color: 11453035 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 3372834 - stroke_color: 2583691263 + height: 10 + color: 3832097 + stroke_color: 16777215 offset_y: 8 } secondary { height: 10 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 11189094 - priority: -15844 + color: 11584112 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 8 + } + secondary { + height: 10 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 11584112 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 11 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 11 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 11190117 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 } apply_if: "name" } element { scale: 18 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 - stroke_color: 2583691263 + height: 13 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } element { scale: 19 area { - color: 11189094 - priority: -15844 + color: 11190117 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 4473924 - stroke_color: 2583691263 + height: 13 + color: 3832097 + stroke_color: 16777215 offset_y: 10 } secondary { height: 13 - color: 3372834 - stroke_color: 2583691263 + color: 3832097 + stroke_color: 16777215 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 11190117 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 13 + color: 3832097 + stroke_color: 16777215 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } } cont { @@ -26514,53 +32794,68 @@ cont { element { scale: 16 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15945 } } element { scale: 17 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 + } + symbol { + name: "pitch-l" + apply_for_type: 1 + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 } } element { scale: 18 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 19 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15078 + priority: 15736 } } } @@ -26569,68 +32864,68 @@ cont { element { scale: 16 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15945 } } element { scale: 17 area { - color: 13421738 - priority: -15032 + color: 13749671 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16968 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15968 + priority: 15736 } } element { scale: 18 area { - color: 13421738 - priority: -15032 + color: 13749671 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16968 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15968 + priority: 15736 } } element { scale: 19 area { - color: 13421738 - priority: -15032 + color: 13749671 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16968 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15968 + priority: 15736 } } } @@ -26639,46 +32934,37 @@ cont { element { scale: 17 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 + } + symbol { + name: "pitch-l" + apply_for_type: 1 + priority: 16736 } } element { scale: 18 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 - } - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15078 + priority: 16736 } } element { scale: 19 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 - } - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15078 + priority: 16736 } } } @@ -26687,61 +32973,61 @@ cont { element { scale: 17 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 18 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 19 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } } @@ -26752,15 +33038,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -26768,15 +33054,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -26784,80 +33070,50 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 - } - } -} -cont { - name: "leisure-recreation_ground" - element { - scale: 18 - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 - } - } - element { - scale: 19 - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 - } - } -} -cont { - name: "leisure-slipway" - element { - scale: 18 - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 - } - } - element { - scale: 19 - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 + priority: 15736 } } } cont { name: "leisure-sports_centre" element { - scale: 18 + scale: 17 symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 + } + } + element { + scale: 18 + symbol { + name: "pitch-l" + apply_for_type: 1 + priority: 16750 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15750 } } element { @@ -26865,15 +33121,15 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } } @@ -26882,88 +33138,88 @@ cont { element { scale: 15 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15945 } } element { scale: 16 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "pitch-m" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 17 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 18 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 19 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } } @@ -26972,95 +33228,63 @@ cont { element { scale: 13 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 14 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 15 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 16 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 17 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15250 + } + symbol { + name: "swimming-l" + apply_for_type: 1 + priority: 16750 } } element { scale: 18 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15250 } symbol { name: "swimming-l" - priority: 16265 - } - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15265 + priority: 16750 } } element { scale: 19 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15250 } symbol { name: "swimming-l" - priority: 16265 - } - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15265 - } - } -} -cont { - name: "leisure-track" - element { - scale: 18 - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 - } - } - element { - scale: 19 - caption { - primary { - height: 10 - color: 4473924 - } - priority: 15000 + priority: 16750 } } } @@ -27068,22 +33292,32 @@ cont { name: "leisure-water_park" element { scale: 18 + symbol { + name: "diving-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15000 + priority: 15722 } } element { scale: 19 + symbol { + name: "diving-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15000 + priority: 15722 } } } @@ -27092,120 +33326,120 @@ cont { element { scale: 12 area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 13 area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 14 lines { - width: 0.6 - color: 14540236 - priority: 1295 + width: 4.0 + color: 14934482 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 15 lines { - width: 0.6 - color: 14540236 - priority: 1295 + width: 4.0 + color: 14934482 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 16 lines { - width: 0.6 - color: 14540236 - priority: 1295 + width: 4.0 + color: 14934482 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 17 lines { - width: 2.0 - color: 14540236 - priority: 1639 + width: 4.0 + color: 14934482 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15360 + color: 14934482 + priority: -15348 } caption { primary { height: 10 color: 4473924 } - priority: 15640 + priority: 15652 } } element { scale: 18 lines { - width: 2.0 - color: 14540236 - priority: 1639 + width: 4.0 + color: 14934482 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15360 + color: 14934482 + priority: -15348 } caption { primary { height: 10 color: 4473924 } - priority: 15640 + priority: 15652 } } element { scale: 19 lines { - width: 2.0 - color: 14540236 - priority: 1639 + width: 4.0 + color: 14934482 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15360 + color: 14934482 + priority: -15348 } caption { primary { height: 10 color: 4473924 } - priority: 15640 + priority: 15652 } } } @@ -27215,75 +33449,75 @@ cont { scale: 15 symbol { name: "lighthouse-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "lighthouse-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "lighthouse-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "lighthouse-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "lighthouse-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -27292,120 +33526,153 @@ cont { element { scale: 12 area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 13 area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 14 lines { - width: 0.6 - color: 14540236 - priority: 1295 + width: 4.0 + color: 14934482 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 15 lines { - width: 0.6 - color: 14540236 - priority: 1295 + width: 4.0 + color: 14934482 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 16 lines { - width: 0.6 - color: 14540236 - priority: 1295 + width: 4.0 + color: 14934482 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15704 + color: 14934482 + priority: -15737 } } element { scale: 17 lines { - width: 2.0 - color: 14540236 - priority: 1639 + width: 4.0 + color: 14934482 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15360 + color: 14934482 + priority: -15348 } caption { primary { height: 10 color: 4473924 } - priority: 15640 + priority: 15652 } } element { scale: 18 lines { - width: 2.0 - color: 14540236 - priority: 1639 + width: 4.0 + color: 14934482 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15360 + color: 14934482 + priority: -15348 } caption { primary { height: 10 color: 4473924 } - priority: 15640 + priority: 15652 } } element { scale: 19 lines { - width: 2.0 - color: 14540236 - priority: 1639 + width: 4.0 + color: 14934482 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { - color: 14540236 - priority: -15360 + color: 14934482 + priority: -15348 } caption { primary { height: 10 color: 4473924 } - priority: 15640 + priority: 15652 + } + } +} +cont { + name: "man_made-windmill" + element { + scale: 18 + symbol { + name: "windmill-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "windmill-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -27415,75 +33682,75 @@ cont { scale: 15 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -27492,113 +33759,113 @@ cont { element { scale: 10 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 11 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 12 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 13 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 14 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } caption { primary { height: 8 color: 4495803 } - priority: 15265 + priority: 15222 } } element { scale: 15 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } caption { primary { height: 8 color: 4495803 } - priority: 15265 + priority: 15222 } } element { scale: 16 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } caption { primary { height: 11 color: 4495803 } - priority: 15265 + priority: 15222 } } element { scale: 17 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } caption { primary { height: 11 color: 4495803 } - priority: 15265 + priority: 15222 } } element { scale: 18 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } caption { primary { height: 11 color: 4495803 } - priority: 15265 + priority: 15222 } } element { scale: 19 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } caption { primary { height: 11 color: 4495803 } - priority: 15265 + priority: 15222 } } } @@ -27607,106 +33874,116 @@ cont { element { scale: 10 area { - color: 1308618410 - priority: -15985 + color: 16575614 + priority: -15987 } } element { scale: 11 area { - color: 1308618410 - priority: -15985 + color: 16575614 + priority: -15987 } } element { scale: 12 area { - color: 1308618410 - priority: -15985 + color: 16575614 + priority: -15987 } } element { scale: 13 area { - color: 1308618410 - priority: -15985 + color: 16575614 + priority: -15987 } } element { scale: 14 area { - color: 1308618410 - priority: -15985 + color: 16575614 + priority: -15987 } } element { scale: 15 area { - color: 671084202 - priority: -15985 + color: 16575614 + priority: -15987 } caption { primary { height: 10 color: 4473924 } - priority: 15015 + priority: 15013 } } element { scale: 16 area { - color: 671084202 - priority: -15985 + color: 16575614 + priority: -15987 } caption { primary { height: 10 color: 4473924 } - priority: 15015 + priority: 15013 } } element { scale: 17 area { - color: 16772778 - priority: -15985 + color: 16575614 + priority: -15987 } caption { primary { height: 10 color: 4473924 } - priority: 15015 + priority: 15013 } } element { scale: 18 area { - color: 16772778 - priority: -15985 + color: 16575614 + priority: -15278 + } + symbol { + name: "beach-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15015 + priority: 15722 } } element { scale: 19 area { - color: 16772778 - priority: -15985 + color: 16575614 + priority: -15278 + } + symbol { + name: "beach-l" + priority: 16722 } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15015 + priority: 15722 } } } @@ -27780,15 +34057,15 @@ cont { symbol { name: "cave-s" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27796,15 +34073,15 @@ cont { symbol { name: "cave-s" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27812,15 +34089,15 @@ cont { symbol { name: "cave-s" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27828,15 +34105,15 @@ cont { symbol { name: "cave-m" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27844,15 +34121,15 @@ cont { symbol { name: "cave-m" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27860,15 +34137,15 @@ cont { symbol { name: "cave-m" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27876,7 +34153,7 @@ cont { symbol { name: "cave-l" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { @@ -27884,7 +34161,7 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27892,7 +34169,7 @@ cont { symbol { name: "cave-l" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { @@ -27900,7 +34177,7 @@ cont { color: 4473924 offset_y: 10 } - priority: 15640 + priority: 15763 } } } @@ -27909,141 +34186,141 @@ cont { element { scale: 0 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 1 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 2 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 3 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 4 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 5 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 6 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 7 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 8 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 9 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 10 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 11 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 12 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 13 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 14 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 15 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 16 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 17 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 18 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } element { scale: 19 area { - color: 8965341 - priority: -16715 + color: 9163744 + priority: -16713 } } } @@ -28053,140 +34330,192 @@ cont { scale: 0 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 1 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 2 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 3 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 4 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 5 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 6 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 7 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 8 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 9 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 10 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 11 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 12 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 13 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 14 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 15 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 16 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 17 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 18 area { color: 16777215 - priority: -15985 + priority: -15987 } } element { scale: 19 area { color: 16777215 - priority: -15985 + priority: -15987 + } + } +} +cont { + name: "natural-grassland" + element { + scale: 13 + area { + color: 13620648 + priority: -15820 + } + } + element { + scale: 14 + area { + color: 13029267 + priority: -15820 + } + } + element { + scale: 15 + area { + color: 13029267 + priority: -15820 + } + } + element { + scale: 16 + area { + color: 13029267 + priority: -15820 + } + } + element { + scale: 17 + area { + color: 13029267 + priority: -15820 + } + } + element { + scale: 18 + area { + color: 13029267 + priority: -15820 + } + } + element { + scale: 19 + area { + color: 13029267 + priority: -15820 } } } @@ -28195,364 +34524,364 @@ cont { element { scale: 0 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 1 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 2 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 3 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 4 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 5 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 6 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 7 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 8 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 9 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 10 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 10 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 11 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 11 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 12 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 12 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 12 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 13 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 13 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 13 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 14 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 14 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 14 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 15 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 15 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 15 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 16 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 16 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 16 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 17 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 17 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 17 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 18 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 18 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 18 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 19 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 19 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 19 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28562,140 +34891,140 @@ cont { element { scale: 0 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 1 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 2 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 3 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 4 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 5 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 6 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 7 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 8 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 9 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 10 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 11 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 12 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 13 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 14 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 15 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 16 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 17 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 18 area { - color: 14540236 + color: 14934482 priority: -16700 } } element { scale: 19 area { - color: 14540236 + color: 14934482 priority: -16700 } } @@ -28706,7 +35035,7 @@ cont { scale: 12 symbol { name: "peakt-s" - priority: 16000 + priority: 16763 } apply_if: "name" } @@ -28714,7 +35043,7 @@ cont { scale: 12 symbol { name: "peakt-s" - priority: 16000 + priority: 16763 } apply_if: "name" } @@ -28722,7 +35051,7 @@ cont { scale: 13 symbol { name: "peakt-s" - priority: 16000 + priority: 16763 } caption { primary { @@ -28730,7 +35059,7 @@ cont { color: 4473924 offset_y: 6 } - priority: 15000 + priority: 15763 } apply_if: "name" } @@ -28738,7 +35067,7 @@ cont { scale: 13 symbol { name: "peakt-s" - priority: 16000 + priority: 16763 } caption { primary { @@ -28746,7 +35075,7 @@ cont { color: 4473924 offset_y: 6 } - priority: 15000 + priority: 15763 } apply_if: "name" } @@ -28754,7 +35083,7 @@ cont { scale: 14 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { @@ -28762,7 +35091,7 @@ cont { color: 4473924 offset_y: 6 } - priority: 15000 + priority: 15763 } apply_if: "name" } @@ -28770,7 +35099,7 @@ cont { scale: 14 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { @@ -28778,7 +35107,7 @@ cont { color: 4473924 offset_y: 6 } - priority: 15000 + priority: 15763 } apply_if: "name" } @@ -28786,75 +35115,75 @@ cont { scale: 15 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -28863,141 +35192,141 @@ cont { element { scale: 0 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 1 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 2 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 3 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 4 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 5 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 6 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 7 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 8 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 9 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 10 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 11 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 12 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 13 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 14 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 15 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 16 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 17 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 18 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 19 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } } @@ -29007,120 +35336,127 @@ cont { scale: 15 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } cont { name: "natural-scrub" + element { + scale: 13 + area { + color: 13620648 + priority: -15862 + } + } element { scale: 14 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 15 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 16 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 17 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 18 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } element { scale: 19 area { - color: 11189094 - priority: -15829 + color: 13029267 + priority: -15862 } } } @@ -29131,7 +35467,7 @@ cont { symbol { name: "drinking-water-m" apply_for_type: 1 - priority: 16265 + priority: 16763 } caption { primary { @@ -29139,14 +35475,14 @@ cont { color: 4473924 offset_y: 8 } - priority: 15265 + priority: 15763 } } element { scale: 16 symbol { name: "drinking-water-m" - priority: 16265 + priority: 16763 } caption { primary { @@ -29154,14 +35490,14 @@ cont { color: 4473924 offset_y: 8 } - priority: 15265 + priority: 15763 } } element { scale: 17 symbol { name: "drinking-water-l" - priority: 16265 + priority: 16763 } caption { primary { @@ -29169,37 +35505,37 @@ cont { color: 4473924 offset_y: 8 } - priority: 15265 + priority: 15763 } } element { scale: 18 symbol { name: "drinking-water-l" - priority: 16640 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15750 } } element { scale: 19 symbol { name: "drinking-water-l" - priority: 16640 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15750 } } } @@ -29209,150 +35545,150 @@ cont { scale: 10 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 11 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 12 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 13 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 14 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 15 symbol { name: "volcano-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "volcano-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "volcano-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "volcano-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "volcano-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -29361,448 +35697,448 @@ cont { element { scale: 0 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 1 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 2 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 3 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 4 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 5 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 6 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 7 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 8 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 9 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 10 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 10 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 11 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 11 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 12 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 12 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 12 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 13 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 9 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 13 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } apply_if: "bbox_area<4000000" } element { scale: 13 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } apply_if: "bbox_area<10000000" } element { scale: 14 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 8 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 14 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } caption { primary { height: 8 color: 4495803 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } element { scale: 14 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } caption { primary { height: 8 color: 4495803 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } element { scale: 15 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 8 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 15 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } caption { primary { height: 8 color: 4495803 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } element { scale: 15 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } caption { primary { height: 8 color: 4495803 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } element { scale: 16 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 11 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 16 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } caption { primary { height: 11 color: 4495803 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } element { scale: 16 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } caption { primary { height: 11 color: 4495803 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } element { scale: 17 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 11 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 17 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } caption { primary { height: 11 color: 4495803 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } element { scale: 17 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } caption { primary { height: 11 color: 4495803 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } element { scale: 18 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 11 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 18 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } caption { primary { height: 11 color: 4495803 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } element { scale: 18 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } caption { primary { height: 11 color: 4495803 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } element { scale: 19 area { - color: 8965341 - priority: -15079 + color: 9163744 + priority: -15084 } caption { primary { height: 11 color: 4495803 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } element { scale: 19 area { - color: 8965341 - priority: -15641 + color: 9163744 + priority: -15653 } caption { primary { height: 11 color: 4495803 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } element { scale: 19 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15084 } caption { primary { height: 11 color: 4495803 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } @@ -29813,120 +36149,120 @@ cont { scale: 12 symbol { name: "waterfall-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 13 symbol { name: "waterfall-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 14 symbol { name: "waterfall-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 15 symbol { name: "waterfall-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "waterfall-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "waterfall-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "waterfall-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "waterfall-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -29935,64 +36271,64 @@ cont { element { scale: 11 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 12 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 13 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 14 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 15 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 16 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 17 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 18 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 19 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } } @@ -30001,64 +36337,64 @@ cont { element { scale: 11 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 12 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 13 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 14 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 15 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 16 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 17 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 18 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } element { scale: 19 area { - color: 3012087005 - priority: -15766 + color: 3012285408 + priority: -15806 } } } @@ -30067,71 +36403,71 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 13 area { - color: 665500518 - priority: -15860 + color: 11781233 + priority: -15889 } } element { scale: 14 area { - color: 665500518 - priority: -15860 + color: 11453035 + priority: -15889 } } element { scale: 15 area { - color: 11189094 - priority: -15860 + color: 11584112 + priority: -15889 } } element { scale: 16 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 17 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 18 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 19 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } } @@ -30140,71 +36476,71 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 13 area { - color: 665500518 - priority: -15860 + color: 11781233 + priority: -15889 } } element { scale: 14 area { - color: 665500518 - priority: -15860 + color: 11453035 + priority: -15889 } } element { scale: 15 area { - color: 11189094 - priority: -15860 + color: 11584112 + priority: -15889 } } element { scale: 16 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 17 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 18 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 19 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } } @@ -30213,71 +36549,71 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 13 area { - color: 665500518 - priority: -15860 + color: 11781233 + priority: -15889 } } element { scale: 14 area { - color: 665500518 - priority: -15860 + color: 11453035 + priority: -15889 } } element { scale: 15 area { - color: 11189094 - priority: -15860 + color: 11584112 + priority: -15889 } } element { scale: 16 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 17 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 18 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 19 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } } @@ -30286,71 +36622,269 @@ cont { element { scale: 10 area { - color: 2158672742 - priority: -15860 + color: 13029267 + priority: -15889 } } element { scale: 11 area { - color: 1521138534 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 12 area { - color: 1084930918 - priority: -15860 + color: 12372094 + priority: -15889 } } element { scale: 13 area { - color: 665500518 - priority: -15860 + color: 11781233 + priority: -15889 } } element { scale: 14 area { - color: 665500518 - priority: -15860 + color: 11453035 + priority: -15889 } } element { scale: 15 area { - color: 11189094 - priority: -15860 + color: 11584112 + priority: -15889 } } element { scale: 16 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 17 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 18 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 } } element { scale: 19 area { - color: 11189094 - priority: -15860 + color: 11190117 + priority: -15889 + } + } +} +cont { + name: "office" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-company" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-estate_agent" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-government" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-lawyer" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-telecommunication" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15736 } } } @@ -30359,39 +36893,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30399,9 +36933,9 @@ cont { element { scale: 17 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30409,9 +36943,9 @@ cont { element { scale: 18 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30419,9 +36953,9 @@ cont { element { scale: 19 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30432,39 +36966,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30472,9 +37006,9 @@ cont { element { scale: 17 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30482,9 +37016,9 @@ cont { element { scale: 18 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30492,9 +37026,9 @@ cont { element { scale: 19 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30505,39 +37039,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30545,9 +37079,9 @@ cont { element { scale: 17 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30555,9 +37089,9 @@ cont { element { scale: 18 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30565,9 +37099,9 @@ cont { element { scale: 19 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30578,39 +37112,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30618,9 +37152,9 @@ cont { element { scale: 17 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30628,9 +37162,9 @@ cont { element { scale: 18 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30638,9 +37172,9 @@ cont { element { scale: 19 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30651,39 +37185,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30691,9 +37225,9 @@ cont { element { scale: 17 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30701,9 +37235,9 @@ cont { element { scale: 18 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30711,9 +37245,9 @@ cont { element { scale: 19 lines { - width: 0.8 + width: 1.6 color: 7829367 - priority: 1875 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30724,29 +37258,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1719101183 - priority: 1093 + width: 0.8 + color: 12876543 + priority: 1083 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 863463167 - priority: 1312 + width: 1.1 + color: 12876543 + priority: 1319 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.1 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -30754,9 +37288,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -30764,9 +37298,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -30774,9 +37308,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -30787,29 +37321,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1265 + width: 1.0 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1265 + width: 1.6 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30817,9 +37351,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30827,9 +37361,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30837,9 +37371,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30850,29 +37384,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1712446720 - priority: 1265 + width: 1.0 + color: 1170688 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 856808704 - priority: 1265 + width: 1.6 + color: 1170688 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 1170688 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30880,9 +37414,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 1170688 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30890,9 +37424,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 1170688 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30900,9 +37434,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 1170688 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30913,29 +37447,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1265 + width: 1.0 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1265 + width: 1.6 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30943,9 +37477,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30953,9 +37487,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30963,9 +37497,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30976,29 +37510,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1265 + width: 1.0 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1265 + width: 1.6 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31006,9 +37540,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31016,9 +37550,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31026,9 +37560,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31039,29 +37573,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1727987712 - priority: 1265 + width: 1.0 + color: 16711680 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 + width: 1.6 color: 872349696 - priority: 1265 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 16711680 - priority: 1265 + width: 1.6 + color: 872349696 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31069,9 +37603,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 16711680 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31079,9 +37613,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 16711680 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31089,9 +37623,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 16711680 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31102,29 +37636,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1712446720 - priority: 1265 + width: 1.0 + color: 1170688 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 856808704 - priority: 1265 + width: 1.6 + color: 1170688 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 1170688 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31132,9 +37666,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 1170688 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31142,9 +37676,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 1170688 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31152,9 +37686,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 1170688 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31165,29 +37699,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1719101183 - priority: 1093 + width: 0.8 + color: 12876543 + priority: 1083 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 863463167 - priority: 1312 + width: 1.1 + color: 12876543 + priority: 1319 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.1 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31195,9 +37729,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31205,9 +37739,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31215,9 +37749,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31228,39 +37762,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1719101183 - priority: 1093 + width: 0.8 + color: 12876543 + priority: 1083 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 863463167 - priority: 1312 + width: 1.1 + color: 12876543 + priority: 1319 join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 16 - lines { - width: 1.0 - color: 7825151 - priority: 1312 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31268,9 +37792,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31278,9 +37802,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 7825151 - priority: 1312 + width: 1.5 + color: 12876543 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31294,16 +37818,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31313,16 +37837,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31332,16 +37856,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31351,16 +37875,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31370,16 +37894,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31389,16 +37913,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31408,16 +37932,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -31427,16 +37951,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -31446,16 +37970,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -31465,16 +37989,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -31484,17 +38008,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -31512,7 +38036,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -31530,7 +38054,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -31548,7 +38072,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -31566,7 +38090,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -31584,7 +38108,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -31596,16 +38120,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31615,16 +38139,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31634,16 +38158,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31653,16 +38177,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31672,16 +38196,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31691,16 +38215,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31710,16 +38234,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -31729,16 +38253,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -31748,16 +38272,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -31767,16 +38291,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -31786,17 +38310,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -31814,7 +38338,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -31832,7 +38356,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -31850,7 +38374,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -31868,7 +38392,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -31886,7 +38410,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -31898,16 +38422,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31917,16 +38441,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31936,16 +38460,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31955,16 +38479,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31974,16 +38498,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31993,16 +38517,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32012,16 +38536,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32031,16 +38555,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32050,16 +38574,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32069,16 +38593,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32088,17 +38612,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32116,7 +38640,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -32134,7 +38658,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -32152,7 +38676,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32170,7 +38694,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -32188,7 +38712,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -32200,16 +38724,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -32219,16 +38743,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -32238,16 +38762,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -32257,16 +38781,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -32276,16 +38800,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32295,16 +38819,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32314,16 +38838,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32333,16 +38857,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32352,16 +38876,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32371,16 +38895,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32390,17 +38914,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32418,7 +38942,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -32436,7 +38960,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -32454,7 +38978,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32472,7 +38996,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -32490,7 +39014,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -32501,23 +39025,23 @@ cont { symbol { name: "star-s" apply_for_type: 1 - priority: 16781 + priority: 16861 } caption { primary { height: 10 color: 3355443 - stroke_color: 2163142365 - offset_y: 2 + stroke_color: 15592411 + offset_y: 5 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 - offset_y: 8 + stroke_color: 2163076059 + offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -32525,23 +39049,23 @@ cont { symbol { name: "star-m" apply_for_type: 1 - priority: 16750 + priority: 16833 } caption { primary { height: 10 color: 3355443 - stroke_color: 2163142365 - offset_y: 3 + stroke_color: 15592411 + offset_y: 6 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 - offset_y: 13 + stroke_color: 2163076059 + offset_y: 21 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32549,23 +39073,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16906 + priority: 16902 } caption { primary { height: 10 color: 3355443 - stroke_color: 2163142365 - offset_y: 4 + stroke_color: 15592411 + offset_y: 6 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 - offset_y: 13 + stroke_color: 2163076059 + offset_y: 21 text: "int_name" } - priority: 15906 + priority: 15902 } } element { @@ -32573,23 +39097,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16906 + priority: 16902 } caption { primary { height: 11 color: 3355443 - stroke_color: 1726934749 - offset_y: 5 + stroke_color: 15592411 + offset_y: 6 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 - offset_y: 15 + stroke_color: 1726868443 + offset_y: 21 text: "int_name" } - priority: 15906 + priority: 15902 } } element { @@ -32597,23 +39121,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16906 + priority: 16902 } caption { primary { height: 12 color: 3355443 - stroke_color: 1726934749 - offset_y: 5 + stroke_color: 15592411 + offset_y: 6 } secondary { height: 11 color: 3355443 - stroke_color: 1726934749 - offset_y: 5 + stroke_color: 1726868443 + offset_y: 21 text: "int_name" } - priority: 15906 + priority: 15902 } } element { @@ -32621,23 +39145,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16765 + priority: 16847 } caption { primary { height: 12 color: 3355443 - stroke_color: 2163142365 - offset_y: 3 + stroke_color: 2163076059 + offset_y: 6 } secondary { height: 11 color: 3355443 - stroke_color: 2163142365 - offset_y: 3 + stroke_color: 2163076059 + offset_y: 21 text: "int_name" } - priority: 15765 + priority: 15847 } } element { @@ -32645,23 +39169,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16906 + priority: 16902 } caption { primary { height: 12 color: 3355443 stroke_color: 2164260863 - offset_y: 3 + offset_y: 6 } secondary { height: 11 color: 3355443 stroke_color: 2164260863 - offset_y: 3 + offset_y: 21 text: "int_name" } - priority: 15906 + priority: 15902 } } element { @@ -32669,7 +39193,7 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16765 + priority: 16847 } caption { primary { @@ -32685,7 +39209,7 @@ cont { offset_y: 4 text: "int_name" } - priority: 15765 + priority: 15847 } } element { @@ -32693,7 +39217,7 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16765 + priority: 16847 } caption { primary { @@ -32709,7 +39233,7 @@ cont { offset_y: 4 text: "int_name" } - priority: 15765 + priority: 15847 } } element { @@ -32717,7 +39241,7 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16015 + priority: 16013 } caption { primary { @@ -32733,7 +39257,7 @@ cont { offset_y: 4 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -32741,7 +39265,7 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16015 + priority: 16013 } caption { primary { @@ -32757,7 +39281,7 @@ cont { offset_y: 4 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -32769,16 +39293,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -32788,16 +39312,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -32807,16 +39331,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -32826,16 +39350,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -32845,16 +39369,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32864,16 +39388,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32883,16 +39407,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32902,16 +39426,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32921,16 +39445,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32940,16 +39464,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32959,17 +39483,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32987,7 +39511,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -33005,7 +39529,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -33023,7 +39547,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33041,7 +39565,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -33059,7 +39583,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -33071,16 +39595,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33090,16 +39614,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33109,16 +39633,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33128,16 +39652,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33147,16 +39671,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33166,16 +39690,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33185,16 +39709,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33204,16 +39728,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33223,16 +39747,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33242,16 +39766,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33261,17 +39785,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33289,7 +39813,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -33307,7 +39831,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -33325,7 +39849,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33343,7 +39867,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -33361,7 +39885,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -33373,16 +39897,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33392,16 +39916,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33411,16 +39935,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33430,16 +39954,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33449,16 +39973,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33468,16 +39992,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33487,16 +40011,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33506,16 +40030,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33525,16 +40049,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33544,16 +40068,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33563,17 +40087,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33591,7 +40115,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -33609,7 +40133,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -33627,7 +40151,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33645,7 +40169,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -33663,7 +40187,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -33675,16 +40199,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33694,16 +40218,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33713,16 +40237,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33732,16 +40256,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33751,16 +40275,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33770,16 +40294,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33789,16 +40313,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33808,16 +40332,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33827,16 +40351,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33846,16 +40370,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33865,17 +40389,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33893,7 +40417,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -33911,7 +40435,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -33929,7 +40453,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33947,7 +40471,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -33965,7 +40489,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -33977,16 +40501,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33996,16 +40520,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34015,16 +40539,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34034,16 +40558,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34053,16 +40577,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34072,16 +40596,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34091,16 +40615,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34110,16 +40634,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34129,16 +40653,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34148,16 +40672,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34167,17 +40691,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34195,7 +40719,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -34213,7 +40737,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -34231,7 +40755,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34249,7 +40773,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -34267,7 +40791,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -34279,16 +40803,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34298,16 +40822,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34317,16 +40841,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34336,16 +40860,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34355,16 +40879,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34374,16 +40898,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34393,16 +40917,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34412,16 +40936,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34431,16 +40955,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34450,16 +40974,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34469,17 +40993,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34497,7 +41021,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -34515,7 +41039,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -34533,7 +41057,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34551,7 +41075,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -34569,7 +41093,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -34581,16 +41105,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34600,16 +41124,16 @@ cont { primary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 8 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34619,16 +41143,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34638,16 +41162,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34657,16 +41181,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34676,16 +41200,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34695,16 +41219,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34714,16 +41238,16 @@ cont { primary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 9 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34733,16 +41257,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34752,16 +41276,16 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 1726934749 + stroke_color: 15592411 } secondary { height: 10 color: 3355443 - stroke_color: 1726934749 + stroke_color: 1726868443 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34771,17 +41295,17 @@ cont { primary { height: 11 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34799,7 +41323,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -34817,7 +41341,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -34835,7 +41359,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34853,7 +41377,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -34871,7 +41395,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -34882,9 +41406,9 @@ cont { caption { primary { height: 12 - color: 8947848 + color: 9211020 } - priority: 15687 + priority: 15694 } } element { @@ -34892,9 +41416,9 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 9211020 } - priority: 15687 + priority: 15694 } } } @@ -34905,15 +41429,15 @@ cont { caption { primary { height: 10 - color: 8947848 + color: 9211020 } secondary { height: 8 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } } element { @@ -34921,9 +41445,15 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 9211020 } - priority: 15640 + secondary { + height: 12 + color: 9211020 + offset_y: 20 + text: "int_name" + } + priority: 15652 } } element { @@ -34931,15 +41461,15 @@ cont { caption { primary { height: 16 - color: 8947848 + color: 9211020 } secondary { height: 14 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } } element { @@ -34947,9 +41477,15 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + secondary { + height: 16 + color: 9211020 + offset_y: 20 + text: "int_name" + } + priority: 15652 } } element { @@ -34957,9 +41493,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -34967,9 +41503,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -34977,9 +41513,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -34987,9 +41523,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -34997,9 +41533,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -35007,9 +41543,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -35017,9 +41553,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -35027,9 +41563,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -35037,9 +41573,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -35047,9 +41583,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -35057,9 +41593,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -35067,9 +41603,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } element { @@ -35077,9 +41613,9 @@ cont { caption { primary { height: 18 - color: 8947848 + color: 9211020 } - priority: 15640 + priority: 15652 } } } @@ -35090,7 +41626,13 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" } priority: 15000 } @@ -35100,7 +41642,13 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" } priority: 15000 } @@ -35110,7 +41658,13 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" } priority: 15000 } @@ -35120,7 +41674,13 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" } priority: 15000 } @@ -35130,7 +41690,13 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" } priority: 15000 } @@ -35140,7 +41706,13 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" } priority: 15000 } @@ -35156,7 +41728,7 @@ cont { color: 4473924 stroke_color: 3019898879 } - priority: 15015 + priority: 15013 } } element { @@ -35167,7 +41739,7 @@ cont { color: 4473924 stroke_color: 3019898879 } - priority: 15015 + priority: 15013 } } element { @@ -35178,7 +41750,7 @@ cont { color: 4473924 stroke_color: 3019898879 } - priority: 15015 + priority: 15013 } } element { @@ -35189,7 +41761,7 @@ cont { color: 4473924 stroke_color: 3019898879 } - priority: 15015 + priority: 15013 } } element { @@ -35200,7 +41772,7 @@ cont { color: 4473924 stroke_color: 3019898879 } - priority: 15015 + priority: 15013 } } element { @@ -35211,7 +41783,7 @@ cont { color: 4473924 stroke_color: 3019898879 } - priority: 15015 + priority: 15013 } } element { @@ -35222,7 +41794,7 @@ cont { color: 4473924 stroke_color: 3019898879 } - priority: 15015 + priority: 15013 } } } @@ -35233,7 +41805,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35243,7 +41815,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35253,7 +41825,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35263,7 +41835,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35273,7 +41845,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35283,7 +41855,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35293,7 +41865,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35303,7 +41875,106 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 + } + priority: 15000 + } + } +} +cont { + name: "place-isolated_dwelling" + element { + scale: 14 + caption { + primary { + height: 12 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 15 + caption { + primary { + height: 12 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 16 + caption { + primary { + height: 12 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 17 + caption { + primary { + height: 12 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 18 + caption { + primary { + height: 12 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 19 + caption { + primary { + height: 12 + color: 8355711 + } + secondary { + height: 10 + color: 8355711 + offset_y: 20 + text: "int_name" } priority: 15000 } @@ -35316,7 +41987,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35328,11 +41999,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35344,11 +42015,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35360,11 +42031,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35376,11 +42047,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35392,11 +42063,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35408,11 +42079,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35427,7 +42098,7 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35439,11 +42110,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35455,11 +42126,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35471,11 +42142,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35487,11 +42158,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35503,11 +42174,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35519,11 +42190,11 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } secondary { height: 10 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -35540,7 +42211,7 @@ cont { height: 15 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35550,7 +42221,7 @@ cont { height: 15 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35560,7 +42231,7 @@ cont { height: 16 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35570,7 +42241,7 @@ cont { height: 17 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35580,7 +42251,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35590,7 +42261,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35600,7 +42271,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35610,7 +42281,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35620,7 +42291,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35630,7 +42301,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35640,7 +42311,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35650,7 +42321,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35660,7 +42331,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35670,7 +42341,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35680,7 +42351,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35690,7 +42361,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35700,7 +42371,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35710,7 +42381,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35720,7 +42391,7 @@ cont { height: 19 color: 4495803 } - priority: 15718 + priority: 15805 } } } @@ -35731,7 +42402,7 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35741,7 +42412,7 @@ cont { caption { primary { height: 12 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -35756,7 +42427,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35766,7 +42437,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35776,7 +42447,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35786,7 +42457,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35796,7 +42467,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35806,7 +42477,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35816,7 +42487,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35826,7 +42497,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35836,7 +42507,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35846,7 +42517,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35856,7 +42527,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35866,7 +42537,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35876,7 +42547,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35886,7 +42557,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35896,7 +42567,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } element { @@ -35906,7 +42577,7 @@ cont { height: 14 color: 4495803 } - priority: 15718 + priority: 15805 } } } @@ -35917,7 +42588,7 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 9211020 } priority: 15000 } @@ -35927,15 +42598,15 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 9211020 } secondary { height: 10 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { @@ -35943,15 +42614,15 @@ cont { caption { primary { height: 12 - color: 8947848 + color: 9211020 } secondary { height: 11 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { @@ -35959,31 +42630,27 @@ cont { caption { primary { height: 12 - color: 8947848 + color: 9211020 } secondary { height: 12 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { scale: 10 caption { primary { - height: 12 - color: 8947848 - } - secondary { height: 11 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } } @@ -35994,7 +42661,7 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 9211020 } priority: 15000 } @@ -36004,7 +42671,7 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 9211020 } priority: 15000 } @@ -36014,15 +42681,15 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 9211020 } secondary { height: 10 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { @@ -36030,15 +42697,15 @@ cont { caption { primary { height: 12 - color: 8947848 + color: 9211020 } secondary { height: 11 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { @@ -36046,31 +42713,27 @@ cont { caption { primary { height: 12 - color: 8947848 + color: 9211020 } secondary { height: 12 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { scale: 10 caption { primary { - height: 12 - color: 8947848 - } - secondary { height: 11 - color: 8947848 + color: 9211020 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } } @@ -36081,7 +42744,7 @@ cont { caption { primary { height: 8 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -36091,7 +42754,7 @@ cont { caption { primary { height: 9 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -36101,11 +42764,11 @@ cont { caption { primary { height: 10 - color: 7829367 + color: 8355711 } secondary { height: 9 - color: 7829367 + color: 8355711 offset_y: 20 text: "int_name" } @@ -36117,7 +42780,7 @@ cont { caption { primary { height: 11 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -36127,7 +42790,7 @@ cont { caption { primary { height: 11 - color: 7829367 + color: 8355711 } priority: 15000 } @@ -36140,15 +42803,15 @@ cont { caption { primary { height: 10 - color: 5592405 + color: 5855577 } secondary { height: 9 - color: 5592405 + color: 5855577 offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } apply_if: "population>=40000" } @@ -36157,15 +42820,15 @@ cont { caption { primary { height: 10 - color: 5592405 + color: 5855577 } secondary { height: 9 - color: 5592405 + color: 5855577 offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } apply_if: "population>=40000" } @@ -36174,17 +42837,17 @@ cont { caption { primary { height: 10 - color: 5592405 - stroke_color: 2162023884 + color: 5855577 + stroke_color: 2162418130 } secondary { height: 8 - color: 5592405 - stroke_color: 2162023884 + color: 5855577 + stroke_color: 2162418130 offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } apply_if: "population>=20000" } @@ -36193,17 +42856,17 @@ cont { caption { primary { height: 10 - color: 5592405 - stroke_color: 2162023884 + color: 5855577 + stroke_color: 2162418130 } secondary { height: 8 - color: 5592405 - stroke_color: 2162023884 + color: 5855577 + stroke_color: 2162418130 offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } apply_if: "population>=20000" } @@ -36212,17 +42875,17 @@ cont { caption { primary { height: 10 - color: 5592405 - stroke_color: 14540236 + color: 5855577 + stroke_color: 14934482 } secondary { height: 9 - color: 5592405 - stroke_color: 14540236 + color: 5855577 + stroke_color: 14934482 offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15902 } } element { @@ -36231,16 +42894,16 @@ cont { primary { height: 12 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } secondary { height: 10 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36249,16 +42912,16 @@ cont { primary { height: 14 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 } secondary { - height: 12 + height: 13 color: 3355443 - stroke_color: 2163142365 + stroke_color: 2163076059 offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36276,7 +42939,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36294,7 +42957,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36312,7 +42975,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36330,7 +42993,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36348,7 +43011,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } } @@ -36359,10 +43022,10 @@ cont { caption { primary { height: 10 - color: 5592405 + color: 5855577 stroke_color: 14540236 } - priority: 15703 + priority: 15708 } } element { @@ -36370,12 +43033,12 @@ cont { caption { primary { height: 12 - color: 5592405 + color: 5855577 stroke_color: 14540236 } secondary { height: 11 - color: 5592405 + color: 5855577 stroke_color: 14540236 offset_y: 20 text: "int_name" @@ -36398,7 +43061,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -36416,7 +43079,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -36434,7 +43097,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -36452,7 +43115,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -36470,7 +43133,184 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 + } + } +} +cont { + name: "railway-abandoned" + element { + scale: 16 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-abandoned-bridge" + element { + scale: 16 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-abandoned-tunnel" + element { + scale: 16 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP } } } @@ -36480,12 +43320,12 @@ cont { scale: 18 lines { width: 1.0 - color: 10066312 + color: 9868678 dashdot { - dd: 2.0 - dd: 6.0 + dd: 1.8 + dd: 5.4 } - priority: 1281 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -36494,12 +43334,12 @@ cont { scale: 19 lines { width: 1.0 - color: 10066312 + color: 9868678 dashdot { - dd: 2.0 - dd: 6.0 + dd: 1.8 + dd: 5.4 } - priority: 1281 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -36511,12 +43351,12 @@ cont { scale: 18 lines { width: 1.0 - color: 10066312 + color: 9868678 dashdot { - dd: 2.0 - dd: 6.0 + dd: 1.8 + dd: 5.4 } - priority: 1281 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -36525,12 +43365,12 @@ cont { scale: 19 lines { width: 1.0 - color: 10066312 + color: 9868678 dashdot { - dd: 2.0 - dd: 6.0 + dd: 1.8 + dd: 5.4 } - priority: 1281 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -36541,39 +43381,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1109 + width: 2.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 867941290 - priority: 1109 + width: 2.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36581,9 +43421,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36591,9 +43431,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36601,9 +43441,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36614,39 +43454,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1109 + width: 2.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 867941290 - priority: 1109 + width: 2.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36654,9 +43494,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36664,9 +43504,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36674,9 +43514,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36687,39 +43527,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1109 + width: 2.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 867941290 - priority: 1109 + width: 2.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36727,9 +43567,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36737,9 +43577,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36747,9 +43587,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 1721342344 - priority: 1109 + width: 3.0 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36762,11 +43602,11 @@ cont { symbol { name: "train-s" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 @@ -36778,7 +43618,7 @@ cont { offset_y: 6 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -36786,11 +43626,11 @@ cont { symbol { name: "train-m" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -36802,7 +43642,7 @@ cont { offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -36810,7 +43650,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { @@ -36820,13 +43660,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -36834,7 +43674,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -36844,13 +43684,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -36858,7 +43698,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -36868,13 +43708,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -36882,7 +43722,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -36892,13 +43732,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } } @@ -36907,39 +43747,50 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 0.8 + color: 11710882 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 1.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 1.2 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 2.6 + color: 9868678 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 15658734 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -36947,20 +43798,20 @@ cont { element { scale: 17 lines { - width: 2.0 - color: 865704328 - priority: 1531 + width: 3.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 15658734 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -36969,19 +43820,19 @@ cont { scale: 18 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -36990,19 +43841,19 @@ cont { scale: 19 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37013,33 +43864,33 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 0.8 + color: 11710882 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 867941290 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 1.4 - color: 15658717 - priority: 1139 + width: 1.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 - color: 8947848 - priority: 1124 + width: 2.4 + color: 14934482 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.0 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } @@ -37047,23 +43898,23 @@ cont { element { scale: 15 lines { - width: 0.8 - color: 1721342344 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 15658717 - priority: 1139 + width: 1.2 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.6 - color: 8947848 - priority: 1124 + width: 2.8 + color: 14934482 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.4 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } @@ -37071,58 +43922,69 @@ cont { element { scale: 16 lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 2.6 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 2.0 - color: 15658717 - priority: 1139 + width: 3.0 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.6 - color: 8947848 - priority: 1124 + width: 3.6 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } + lines { + width: 1.3 + color: 15658734 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 + join: ROUNDJOIN + cap: ROUNDCAP + } } element { scale: 17 lines { - width: 2.0 - color: 865704328 - priority: 1531 + width: 3.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.4 - color: 15658717 - priority: 1139 + width: 6.4 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 8947848 - priority: 1124 + width: 8.0 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.0 + width: 2.0 color: 15658734 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37131,33 +43993,33 @@ cont { scale: 18 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 - color: 15658717 - priority: 1139 + width: 6.4 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 8947848 - priority: 1124 + width: 8.0 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37166,33 +44028,33 @@ cont { scale: 19 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 - color: 15658717 - priority: 1139 + width: 6.4 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 8947848 - priority: 1124 + width: 8.0 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37203,72 +44065,83 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 0.8 + color: 11710882 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 2.5 + width: 3.0 color: 5592405 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 1.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 2.8 + width: 3.2 color: 5592405 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 1.2 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 2.8 + width: 4.6 color: 5592405 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 2.6 + color: 9868678 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 15658734 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37276,31 +44149,31 @@ cont { element { scale: 17 lines { - width: 4.0 + width: 5.0 color: 5592405 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 - color: 865704328 - priority: 1531 + width: 3.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 15658734 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37314,25 +44187,25 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37346,25 +44219,25 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37375,29 +44248,29 @@ cont { element { scale: 14 lines { - width: 0.9 - color: 2159786922 - priority: 1625 + width: 1.0 + color: 11710882 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37406,8 +44279,8 @@ cont { scale: 17 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37416,8 +44289,8 @@ cont { scale: 18 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37426,8 +44299,8 @@ cont { scale: 19 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37438,29 +44311,29 @@ cont { element { scale: 14 lines { - width: 0.9 - color: 2159786922 - priority: 1625 + width: 1.0 + color: 11710882 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37469,8 +44342,8 @@ cont { scale: 17 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37479,8 +44352,8 @@ cont { scale: 18 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37489,8 +44362,8 @@ cont { scale: 19 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37501,29 +44374,29 @@ cont { element { scale: 14 lines { - width: 0.9 - color: 2159786922 - priority: 1625 + width: 1.0 + color: 11710882 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37532,8 +44405,8 @@ cont { scale: 17 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37542,8 +44415,8 @@ cont { scale: 18 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37552,8 +44425,8 @@ cont { scale: 19 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37564,19 +44437,19 @@ cont { element { scale: 15 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37585,8 +44458,8 @@ cont { scale: 17 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37595,8 +44468,8 @@ cont { scale: 18 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37605,8 +44478,8 @@ cont { scale: 19 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37617,19 +44490,19 @@ cont { element { scale: 15 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37638,8 +44511,8 @@ cont { scale: 17 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37648,8 +44521,8 @@ cont { scale: 18 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37658,8 +44531,8 @@ cont { scale: 19 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37670,19 +44543,19 @@ cont { element { scale: 15 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 865704328 - priority: 1625 + width: 1.2 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37691,8 +44564,8 @@ cont { scale: 17 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37701,8 +44574,8 @@ cont { scale: 18 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37711,8 +44584,185 @@ cont { scale: 19 lines { width: 2.0 - color: 865704328 - priority: 1625 + color: 9868678 + priority: 1638 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-preserved" + element { + scale: 16 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-preserved-bridge" + element { + scale: 16 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-preserved-tunnel" + element { + scale: 16 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 9868678 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -37723,59 +44773,70 @@ cont { element { scale: 11 lines { - width: 0.5 - color: 12303274 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 11710882 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.5 - color: 12303274 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 11710882 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 0.8 + color: 11710882 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 1.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 1.2 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 2.6 + color: 9868678 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 15658734 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37783,20 +44844,20 @@ cont { element { scale: 17 lines { - width: 2.0 - color: 865704328 - priority: 1531 + width: 3.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 15658734 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37805,19 +44866,19 @@ cont { scale: 18 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37826,19 +44887,19 @@ cont { scale: 19 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37849,53 +44910,53 @@ cont { element { scale: 11 lines { - width: 0.5 - color: 12303274 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 11710882 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.5 - color: 12303274 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 11710882 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 0.8 + color: 11710882 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 867941290 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 1.4 - color: 15658717 - priority: 1139 + width: 1.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 - color: 8947848 - priority: 1124 + width: 2.4 + color: 14934482 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.0 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } @@ -37903,23 +44964,23 @@ cont { element { scale: 15 lines { - width: 0.8 - color: 1721342344 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 15658717 - priority: 1139 + width: 1.2 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.6 - color: 8947848 - priority: 1124 + width: 2.8 + color: 14934482 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.4 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } @@ -37927,58 +44988,69 @@ cont { element { scale: 16 lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 2.6 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 2.0 - color: 15658717 - priority: 1139 + width: 3.0 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.6 - color: 8947848 - priority: 1124 + width: 3.6 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } + lines { + width: 1.3 + color: 15658734 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 + join: ROUNDJOIN + cap: ROUNDCAP + } } element { scale: 17 lines { - width: 2.0 - color: 865704328 - priority: 1531 + width: 3.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.4 - color: 15658717 - priority: 1139 + width: 6.4 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 8947848 - priority: 1124 + width: 8.0 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.0 + width: 2.0 color: 15658734 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37987,33 +45059,33 @@ cont { scale: 18 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 - color: 15658717 - priority: 1139 + width: 6.4 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 8947848 - priority: 1124 + width: 8.0 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38022,33 +45094,33 @@ cont { scale: 19 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 - color: 15658717 - priority: 1139 + width: 6.4 + color: 14934482 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 8947848 - priority: 1124 + width: 8.0 + color: 8421504 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38059,59 +45131,70 @@ cont { element { scale: 11 lines { - width: 0.5 - color: 12303274 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 11710882 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.5 - color: 12303274 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 11710882 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 0.8 + color: 11710882 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 1.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 1.2 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 2.6 + color: 9868678 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 15658734 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38119,20 +45202,20 @@ cont { element { scale: 17 lines { - width: 2.0 - color: 865704328 - priority: 1531 + width: 3.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 15658734 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38141,19 +45224,19 @@ cont { scale: 18 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38162,19 +45245,19 @@ cont { scale: 19 lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38185,92 +45268,103 @@ cont { element { scale: 11 lines { - width: 0.5 - color: 12303274 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 11710882 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.5 - color: 12303274 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 11710882 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 0.8 + color: 11710882 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 2.5 + width: 3.0 color: 5592405 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.5 - color: 867941290 - priority: 1531 + width: 1.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 2.8 + width: 3.2 color: 5592405 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 1.2 + color: 9868678 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 2.8 + width: 4.6 color: 5592405 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 1721342344 - priority: 1531 + width: 2.6 + color: 9868678 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 15658734 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38278,31 +45372,31 @@ cont { element { scale: 17 lines { - width: 4.0 + width: 5.0 color: 5592405 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 - color: 865704328 - priority: 1531 + width: 3.0 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 15658734 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38316,25 +45410,25 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38348,25 +45442,25 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 865704328 - priority: 1531 + color: 9868678 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 15658734 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38379,11 +45473,11 @@ cont { symbol { name: "train-s" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 @@ -38395,7 +45489,7 @@ cont { offset_y: 6 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38403,11 +45497,11 @@ cont { symbol { name: "train-m" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -38419,7 +45513,7 @@ cont { offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38427,7 +45521,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { @@ -38437,13 +45531,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38451,7 +45545,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38461,13 +45555,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38475,7 +45569,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38485,13 +45579,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38499,7 +45593,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38509,13 +45603,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } } @@ -38526,11 +45620,11 @@ cont { symbol { name: "train-s" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 @@ -38542,7 +45636,7 @@ cont { offset_y: 6 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38550,11 +45644,11 @@ cont { symbol { name: "train-m" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -38566,7 +45660,7 @@ cont { offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38574,7 +45668,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { @@ -38584,13 +45678,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38598,7 +45692,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38608,13 +45702,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38622,7 +45716,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38632,13 +45726,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38646,7 +45740,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38656,13 +45750,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } } @@ -38673,11 +45767,11 @@ cont { symbol { name: "train-s" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 @@ -38689,7 +45783,7 @@ cont { offset_y: 6 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38697,11 +45791,11 @@ cont { symbol { name: "train-m" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -38713,7 +45807,7 @@ cont { offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38721,7 +45815,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { @@ -38731,13 +45825,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38745,7 +45839,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38755,13 +45849,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38769,7 +45863,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38779,13 +45873,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38793,7 +45887,7 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { @@ -38803,13 +45897,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } } @@ -38820,23 +45914,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38844,11 +45938,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -38860,7 +45954,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38868,7 +45962,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -38878,13 +45972,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38892,7 +45986,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -38902,13 +45996,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38916,7 +46010,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -38926,13 +46020,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38940,7 +46034,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -38950,13 +46044,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -38967,23 +46061,23 @@ cont { symbol { name: "subway-barcelona-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38991,11 +46085,11 @@ cont { symbol { name: "subway-barcelona-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -39007,7 +46101,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39015,7 +46109,7 @@ cont { symbol { name: "subway-barcelona-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39025,13 +46119,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39039,7 +46133,7 @@ cont { symbol { name: "subway-barcelona-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39049,13 +46143,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39063,7 +46157,7 @@ cont { symbol { name: "subway-barcelona-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39073,13 +46167,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39087,7 +46181,7 @@ cont { symbol { name: "subway-barcelona-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39097,13 +46191,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39114,23 +46208,23 @@ cont { symbol { name: "subway-berlin-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39138,11 +46232,11 @@ cont { symbol { name: "subway-berlin-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -39154,7 +46248,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39162,7 +46256,7 @@ cont { symbol { name: "subway-berlin-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39172,13 +46266,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39186,7 +46280,7 @@ cont { symbol { name: "subway-berlin-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39196,13 +46290,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39210,7 +46304,7 @@ cont { symbol { name: "subway-berlin-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39220,13 +46314,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39234,7 +46328,7 @@ cont { symbol { name: "subway-berlin-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39244,13 +46338,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39261,23 +46355,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39285,11 +46379,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -39301,7 +46395,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39309,7 +46403,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39319,13 +46413,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39333,7 +46427,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39343,13 +46437,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39357,7 +46451,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39367,13 +46461,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39381,7 +46475,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39391,13 +46485,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39408,23 +46502,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39432,11 +46526,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -39448,7 +46542,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39456,7 +46550,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39466,13 +46560,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39480,7 +46574,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39490,13 +46584,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39504,7 +46598,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39514,13 +46608,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39528,7 +46622,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39538,13 +46632,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39555,23 +46649,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39579,11 +46673,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -39595,7 +46689,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39603,7 +46697,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39613,13 +46707,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39627,7 +46721,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39637,13 +46731,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39651,7 +46745,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39661,13 +46755,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39675,7 +46769,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39685,13 +46779,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39702,23 +46796,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39726,11 +46820,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -39742,7 +46836,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39750,7 +46844,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39760,13 +46854,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39774,7 +46868,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39784,13 +46878,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39798,7 +46892,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39808,13 +46902,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39822,7 +46916,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39832,13 +46926,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39849,23 +46943,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39873,11 +46967,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -39889,7 +46983,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39897,7 +46991,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39907,13 +47001,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39921,7 +47015,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39931,13 +47025,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39945,7 +47039,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39955,13 +47049,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39969,7 +47063,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -39979,13 +47073,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39996,23 +47090,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40020,11 +47114,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -40036,7 +47130,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40044,7 +47138,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40054,13 +47148,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40068,7 +47162,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40078,13 +47172,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40092,7 +47186,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40102,13 +47196,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40116,7 +47210,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40126,13 +47220,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40143,7 +47237,7 @@ cont { symbol { name: "subway-kiev-s" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { @@ -40152,7 +47246,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - priority: 15953 + priority: 15027 } } element { @@ -40160,23 +47254,23 @@ cont { symbol { name: "subway-kiev-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40184,11 +47278,11 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -40200,7 +47294,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40208,21 +47302,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40230,21 +47324,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40252,21 +47346,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40274,21 +47368,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40299,23 +47393,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40323,11 +47417,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -40339,7 +47433,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40347,7 +47441,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40357,13 +47451,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40371,7 +47465,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40381,13 +47475,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40395,7 +47489,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40405,13 +47499,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40419,7 +47513,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40429,13 +47523,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40446,23 +47540,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40470,11 +47564,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -40486,7 +47580,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40494,7 +47588,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40504,13 +47598,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40518,7 +47612,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40528,13 +47622,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40542,7 +47636,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40552,13 +47646,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40566,7 +47660,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40576,13 +47670,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40593,23 +47687,23 @@ cont { symbol { name: "subway-london-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40617,11 +47711,11 @@ cont { symbol { name: "subway-london-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -40633,7 +47727,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40641,7 +47735,7 @@ cont { symbol { name: "subway-london-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40651,13 +47745,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40665,7 +47759,7 @@ cont { symbol { name: "subway-london-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40675,13 +47769,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40689,7 +47783,7 @@ cont { symbol { name: "subway-london-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40699,13 +47793,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40713,7 +47807,7 @@ cont { symbol { name: "subway-london-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40723,13 +47817,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40740,23 +47834,23 @@ cont { symbol { name: "subway-madrid-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40764,11 +47858,11 @@ cont { symbol { name: "subway-madrid-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -40780,7 +47874,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40788,7 +47882,7 @@ cont { symbol { name: "subway-madrid-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40798,13 +47892,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40812,7 +47906,7 @@ cont { symbol { name: "subway-madrid-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40822,13 +47916,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40836,7 +47930,7 @@ cont { symbol { name: "subway-madrid-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40846,13 +47940,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40860,7 +47954,7 @@ cont { symbol { name: "subway-madrid-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40870,13 +47964,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40887,16 +47981,16 @@ cont { symbol { name: "subway-minsk-s" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 offset_y: 4 } - priority: 15953 + priority: 15777 } } element { @@ -40904,23 +47998,23 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 5 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40928,11 +48022,11 @@ cont { symbol { name: "subway-minsk-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 5 @@ -40944,7 +48038,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40952,21 +48046,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40974,21 +48068,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40996,21 +48090,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41018,41 +48112,56 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } cont { name: "railway-station-subway-moscow" + element { + scale: 11 + symbol { + name: "subway-moscow-s" + apply_for_type: 1 + priority: 16791 + } + } element { scale: 12 symbol { name: "subway-moscow-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 color: 3355443 - stroke_color: 2164260863 - offset_y: 5 + stroke_color: 16777215 + offset_y: 7 } - priority: 15953 + secondary { + height: 9 + color: 3355443 + stroke_color: 2164260863 + offset_y: 22 + text: "int_name" + } + priority: 15791 } } element { @@ -41060,23 +48169,23 @@ cont { symbol { name: "subway-moscow-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 3355443 - stroke_color: 2164260863 - offset_y: 5 - } - secondary { height: 10 color: 3355443 + stroke_color: 16777215 + offset_y: 7 + } + secondary { + height: 9 + color: 3355443 stroke_color: 2164260863 - offset_y: 28 + offset_y: 22 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41084,23 +48193,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 - stroke_color: 2164260863 - offset_y: 8 + stroke_color: 16777215 + offset_y: 9 } secondary { height: 10 color: 3355443 - stroke_color: 2164260863 - offset_y: 6 + stroke_color: 16777215 + offset_y: 24 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41108,111 +48217,111 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 - stroke_color: 2164260863 - offset_y: 7 + stroke_color: 16777215 + offset_y: 9 } secondary { height: 10 color: 3355443 - stroke_color: 2164260863 - offset_y: 7 + stroke_color: 16777215 + offset_y: 24 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 16 symbol { - name: "none" + name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 - color: 7829367 + height: 12 + color: 8355711 offset_y: 7 } secondary { - height: 9 - color: 7829367 + height: 11 + color: 8355711 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 17 symbol { - name: "none" + name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 - color: 7829367 + height: 12 + color: 8355711 offset_y: 8 } secondary { - height: 9 - color: 7829367 + height: 11 + color: 8355711 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 18 symbol { - name: "none" + name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 - color: 7829367 + height: 12 + color: 8355711 offset_y: 8 } secondary { - height: 9 - color: 7829367 + height: 11 + color: 8355711 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 19 symbol { - name: "none" + name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 - color: 7829367 + height: 12 + color: 8355711 offset_y: 8 } secondary { - height: 9 - color: 7829367 + height: 11 + color: 8355711 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41223,23 +48332,23 @@ cont { symbol { name: "subway-newyork-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41247,11 +48356,11 @@ cont { symbol { name: "subway-newyork-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -41263,7 +48372,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41271,7 +48380,7 @@ cont { symbol { name: "subway-newyork-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41281,13 +48390,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41295,7 +48404,7 @@ cont { symbol { name: "subway-newyork-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41305,13 +48414,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41319,7 +48428,7 @@ cont { symbol { name: "subway-newyork-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41329,13 +48438,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41343,7 +48452,7 @@ cont { symbol { name: "subway-newyork-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41353,13 +48462,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41370,23 +48479,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41394,11 +48503,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -41410,7 +48519,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41418,7 +48527,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41428,13 +48537,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41442,7 +48551,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41452,13 +48561,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41466,7 +48575,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41476,13 +48585,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41490,7 +48599,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41500,40 +48609,48 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } cont { name: "railway-station-subway-paris" + element { + scale: 13 + symbol { + name: "subway-paris-s" + apply_for_type: 1 + priority: 16000 + } + } element { scale: 14 symbol { name: "subway-paris-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41541,11 +48658,11 @@ cont { symbol { name: "subway-paris-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -41557,7 +48674,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41565,7 +48682,7 @@ cont { symbol { name: "subway-paris-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41575,13 +48692,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41589,7 +48706,7 @@ cont { symbol { name: "subway-paris-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41599,13 +48716,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41613,7 +48730,7 @@ cont { symbol { name: "subway-paris-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41623,13 +48740,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41637,7 +48754,7 @@ cont { symbol { name: "subway-paris-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41647,13 +48764,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41664,23 +48781,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41688,11 +48805,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -41704,7 +48821,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41712,7 +48829,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41722,13 +48839,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41736,7 +48853,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41746,13 +48863,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41760,7 +48877,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41770,13 +48887,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41784,7 +48901,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41794,13 +48911,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41811,23 +48928,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41835,11 +48952,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -41851,7 +48968,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41859,7 +48976,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41869,13 +48986,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41883,7 +49000,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41893,13 +49010,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41907,7 +49024,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41917,13 +49034,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41931,7 +49048,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41941,13 +49058,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41958,23 +49075,23 @@ cont { symbol { name: "subway-rome-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41982,11 +49099,11 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -41998,7 +49115,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42006,7 +49123,7 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42016,13 +49133,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42030,21 +49147,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42052,21 +49169,21 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42074,41 +49191,56 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 7829367 + color: 8355711 offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } cont { name: "railway-station-subway-spb" + element { + scale: 11 + symbol { + name: "subway-spb-s" + apply_for_type: 1 + priority: 16791 + } + } element { scale: 12 symbol { name: "subway-spb-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 color: 3355443 stroke_color: 2164260863 - offset_y: 5 + offset_y: 8 } - priority: 15953 + secondary { + height: 9 + color: 3355443 + stroke_color: 2164260863 + offset_y: 5 + text: "int_name" + } + priority: 15791 } } element { @@ -42116,23 +49248,23 @@ cont { symbol { name: "subway-spb-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 - offset_y: 5 + offset_y: 8 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 offset_y: 5 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42140,135 +49272,135 @@ cont { symbol { name: "subway-spb-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 11 color: 3355443 stroke_color: 2164260863 - offset_y: 5 + offset_y: 8 } secondary { height: 10 color: 3355443 stroke_color: 2164260863 - offset_y: 5 + offset_y: 8 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 15 symbol { - name: "subway-spb-m" + name: "subway-spb-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 - offset_y: 7 + offset_y: 8 } secondary { height: 10 color: 3355443 stroke_color: 2164260863 - offset_y: 7 + offset_y: 8 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 16 symbol { - name: "none" + name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 - color: 7829367 + height: 12 + color: 8355711 offset_y: 7 } secondary { - height: 9 - color: 7829367 + height: 11 + color: 8355711 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 17 symbol { - name: "none" + name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 - color: 7829367 + height: 12 + color: 8355711 offset_y: 8 } secondary { - height: 9 - color: 7829367 + height: 11 + color: 8355711 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 18 symbol { - name: "none" + name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 - color: 7829367 + height: 12 + color: 8355711 offset_y: 8 } secondary { - height: 9 - color: 7829367 + height: 11 + color: 8355711 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 19 symbol { - name: "none" + name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 - color: 7829367 + height: 12 + color: 8355711 offset_y: 8 } secondary { - height: 9 - color: 7829367 + height: 11 + color: 8355711 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -42279,23 +49411,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42303,11 +49435,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -42319,7 +49451,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42327,7 +49459,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42337,13 +49469,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42351,7 +49483,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42361,13 +49493,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42375,7 +49507,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42385,13 +49517,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42399,7 +49531,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42409,13 +49541,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -42426,23 +49558,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 6 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42450,11 +49582,11 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 7 @@ -42466,7 +49598,7 @@ cont { offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42474,7 +49606,7 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42484,13 +49616,13 @@ cont { offset_y: 7 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42498,7 +49630,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42508,13 +49640,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42522,7 +49654,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42532,13 +49664,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42546,7 +49678,7 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42556,13 +49688,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -42573,7 +49705,7 @@ cont { symbol { name: "subway-entrance-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42582,14 +49714,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42597,7 +49722,7 @@ cont { symbol { name: "subway-entrance-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42606,14 +49731,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42621,7 +49739,7 @@ cont { symbol { name: "subway-entrance-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42630,14 +49748,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -42648,7 +49759,7 @@ cont { symbol { name: "subway-barcelona-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42657,14 +49768,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42672,7 +49776,7 @@ cont { symbol { name: "subway-barcelona-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42681,14 +49785,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42696,7 +49793,7 @@ cont { symbol { name: "subway-barcelona-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42705,14 +49802,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -42723,7 +49813,7 @@ cont { symbol { name: "subway-berlin-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42732,14 +49822,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42747,7 +49830,7 @@ cont { symbol { name: "subway-berlin-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42756,14 +49839,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42771,7 +49847,7 @@ cont { symbol { name: "subway-berlin-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42780,14 +49856,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -42798,16 +49867,16 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 6 } - priority: 15953 + priority: 15027 } } element { @@ -42815,7 +49884,7 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { @@ -42824,14 +49893,7 @@ cont { stroke_color: 2164260863 offset_y: 6 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15027 } } element { @@ -42839,7 +49901,7 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { @@ -42848,14 +49910,7 @@ cont { stroke_color: 2164260863 offset_y: 6 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15027 } } element { @@ -42863,7 +49918,7 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { @@ -42872,14 +49927,7 @@ cont { stroke_color: 2164260863 offset_y: 6 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15027 } } } @@ -42890,7 +49938,7 @@ cont { symbol { name: "subway-london-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42899,14 +49947,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42914,7 +49955,7 @@ cont { symbol { name: "subway-london-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42923,14 +49964,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42938,7 +49972,7 @@ cont { symbol { name: "subway-london-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42947,14 +49981,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -42965,7 +49992,7 @@ cont { symbol { name: "subway-madrid-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42974,14 +50001,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42989,7 +50009,7 @@ cont { symbol { name: "subway-madrid-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -42998,14 +50018,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43013,7 +50026,7 @@ cont { symbol { name: "subway-madrid-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43022,14 +50035,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -43040,16 +50046,16 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { - height: 12 + height: 11 color: 3355443 stroke_color: 2164260863 offset_y: 6 } - priority: 15953 + priority: 15777 } } element { @@ -43057,7 +50063,7 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { @@ -43066,14 +50072,7 @@ cont { stroke_color: 2164260863 offset_y: 6 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15777 } } element { @@ -43081,7 +50080,7 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { @@ -43090,14 +50089,7 @@ cont { stroke_color: 2164260863 offset_y: 6 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15777 } } element { @@ -43105,7 +50097,7 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { @@ -43114,14 +50106,7 @@ cont { stroke_color: 2164260863 offset_y: 6 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15777 } } } @@ -43132,23 +50117,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { height: 12 color: 3355443 - stroke_color: 2164260863 - offset_y: 8 + stroke_color: 16777215 + offset_y: 10 } secondary { - height: 10 + height: 11 color: 3355443 - stroke_color: 2164260863 - offset_y: 8 + stroke_color: 16777215 + offset_y: 25 text: "int_name" } - priority: 15953 + priority: 15777 } } element { @@ -43156,17 +50141,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { + height: 12 + color: 3355443 + stroke_color: 16777215 + offset_y: 10 + } + secondary { height: 11 color: 3355443 - stroke_color: 2164260863 - offset_y: 8 + stroke_color: 16777215 + offset_y: 25 text: "int_name" } - priority: 15937 + priority: 15777 } } element { @@ -43174,17 +50165,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { - height: 11 + height: 13 color: 3355443 - stroke_color: 2164260863 - offset_y: 8 + stroke_color: 16777215 + offset_y: 10 + } + secondary { + height: 12 + color: 3355443 + stroke_color: 16777215 + offset_y: 25 text: "int_name" } - priority: 15937 + priority: 15777 } } element { @@ -43192,23 +50189,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 color: 3355443 - stroke_color: 2164260863 - offset_y: 8 + stroke_color: 16777215 + offset_y: 10 } secondary { height: 12 color: 3355443 - stroke_color: 2164260863 - offset_y: 8 + stroke_color: 16777215 + offset_y: 25 text: "int_name" } - priority: 15937 + priority: 15777 } } } @@ -43219,7 +50216,7 @@ cont { symbol { name: "subway-newyork-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43228,14 +50225,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43243,7 +50233,7 @@ cont { symbol { name: "subway-newyork-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43252,14 +50242,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43267,7 +50250,7 @@ cont { symbol { name: "subway-newyork-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43276,14 +50259,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -43294,7 +50270,7 @@ cont { symbol { name: "subway-paris-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43303,14 +50279,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43318,7 +50287,7 @@ cont { symbol { name: "subway-paris-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43327,14 +50296,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43342,7 +50304,7 @@ cont { symbol { name: "subway-paris-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43351,14 +50313,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -43369,7 +50324,7 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43378,14 +50333,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 13 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43393,7 +50341,7 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43402,14 +50350,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43417,7 +50358,7 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { @@ -43426,14 +50367,7 @@ cont { stroke_color: 2164260863 offset_y: 8 } - secondary { - height: 12 - color: 3355443 - stroke_color: 2164260863 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -43444,11 +50378,11 @@ cont { symbol { name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { - height: 13 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -43460,7 +50394,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15953 + priority: 15777 } } element { @@ -43468,11 +50402,11 @@ cont { symbol { name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { - height: 13 + height: 12 color: 3355443 stroke_color: 2164260863 offset_y: 8 @@ -43481,10 +50415,10 @@ cont { height: 11 color: 3355443 stroke_color: 2164260863 - offset_y: 8 + offset_y: 20 text: "int_name" } - priority: 15953 + priority: 15777 } } element { @@ -43492,7 +50426,7 @@ cont { symbol { name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { @@ -43502,13 +50436,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 - offset_y: 8 + offset_y: 20 text: "int_name" } - priority: 15953 + priority: 15777 } } element { @@ -43516,7 +50450,7 @@ cont { symbol { name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { @@ -43526,13 +50460,13 @@ cont { offset_y: 8 } secondary { - height: 11 + height: 12 color: 3355443 stroke_color: 2164260863 - offset_y: 8 + offset_y: 20 text: "int_name" } - priority: 15953 + priority: 15777 } } } @@ -43541,19 +50475,19 @@ cont { element { scale: 15 lines { - width: 0.5 - color: 1716868437 - priority: 1609 + width: 0.7 + color: 5592405 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.5 - color: 861230421 - priority: 1609 + width: 0.8 + color: 5592405 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43563,7 +50497,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43573,7 +50507,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43583,7 +50517,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43594,19 +50528,19 @@ cont { element { scale: 15 lines { - width: 0.5 - color: 1716868437 - priority: 1609 + width: 0.7 + color: 5592405 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.5 - color: 861230421 - priority: 1609 + width: 0.8 + color: 5592405 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43616,7 +50550,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43626,7 +50560,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43636,7 +50570,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43647,19 +50581,19 @@ cont { element { scale: 15 lines { - width: 0.5 - color: 1716868437 - priority: 1609 + width: 0.7 + color: 5592405 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.5 - color: 861230421 - priority: 1609 + width: 0.8 + color: 5592405 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43669,7 +50603,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43679,7 +50613,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43689,7 +50623,7 @@ cont { lines { width: 1.0 color: 5592405 - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43701,83 +50635,83 @@ cont { scale: 15 symbol { name: "tram-m" - priority: 16781 + priority: 16777 } } element { scale: 16 symbol { name: "tram-m" - priority: 16781 + priority: 16777 } } element { scale: 17 symbol { name: "tram-l" - priority: 16828 + priority: 16777 } caption { primary { - height: 11 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { scale: 18 symbol { name: "tram-l" - priority: 16828 + priority: 16777 } caption { primary { - height: 12 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { scale: 19 symbol { name: "tram-l" - priority: 16828 + priority: 16777 } caption { primary { - height: 12 + height: 10 color: 3355443 stroke_color: 2164260863 offset_y: 8 } secondary { - height: 10 + height: 9 color: 3355443 stroke_color: 2164260863 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } } @@ -43786,142 +50720,212 @@ cont { element { scale: 10 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 11 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 12 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 13 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 14 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 15 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16250 } } element { scale: 16 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16250 + } } element { scale: 17 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } element { scale: 18 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } element { scale: 19 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } } cont { @@ -43929,142 +50933,212 @@ cont { element { scale: 10 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 11 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 12 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 13 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 14 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 15 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16250 } } element { scale: 16 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16250 + } } element { scale: 17 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } element { scale: 18 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } element { scale: 19 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } } cont { @@ -44072,142 +51146,212 @@ cont { element { scale: 10 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 11 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 12 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 13 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 14 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16263 } } element { scale: 15 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16250 } } element { scale: 16 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 9 + color: 4495803 + } + priority: 16250 + } } element { scale: 17 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } element { scale: 18 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } element { scale: 19 lines { - width: 0.8 + width: 1.0 color: 4495803 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16263 + } } } cont { @@ -44216,7 +51360,7 @@ cont { scale: 19 symbol { name: "shop-m" - priority: 16843 + priority: 16736 } caption { primary { @@ -44224,7 +51368,7 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15736 } } } @@ -44235,7 +51379,7 @@ cont { symbol { name: "alcohol-l" apply_for_type: 1 - priority: 16000 + priority: 16722 } caption { primary { @@ -44243,14 +51387,14 @@ cont { color: 4473924 offset_y: 10 } - priority: 15000 + priority: 15722 } } element { scale: 19 symbol { - name: "alcohol-l" - priority: 16843 + name: "shop-m" + priority: 16736 } caption { primary { @@ -44258,17 +51402,17 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15736 } } } cont { name: "shop-bakery" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "bakery-l" + priority: 16722 } caption { primary { @@ -44276,17 +51420,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "bakery-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-beauty" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "beauty-l" + priority: 16722 } caption { primary { @@ -44294,17 +51453,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "beauty-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-beverages" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "alcohol-l" + priority: 16722 } caption { primary { @@ -44312,17 +51486,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "alcohol-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-bicycle" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "shop-bicycle-l" + priority: 16722 } caption { primary { @@ -44330,17 +51519,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "shop-bicycle-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-books" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "book-shop-l" + priority: 16722 } caption { primary { @@ -44348,17 +51552,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "book-shop-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-butcher" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "butcher-l" + priority: 16722 } caption { primary { @@ -44366,17 +51585,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "butcher-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-car" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "car_sharing-l" + priority: 16722 } caption { primary { @@ -44384,17 +51618,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "car_sharing-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-car_repair" element { - scale: 19 + scale: 17 symbol { - name: "shop-m" - priority: 16843 + name: "car-repair-l" + priority: 16736 } caption { primary { @@ -44402,17 +51651,47 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15736 + } + } + element { + scale: 18 + symbol { + name: "car-repair-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "car-repair-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-chemist" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "chemist-l" + priority: 16722 } caption { primary { @@ -44420,17 +51699,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "chemist-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-clothes" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "clothes-l" + priority: 16722 } caption { primary { @@ -44438,17 +51732,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "clothes-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-computer" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "computer-l" + priority: 16722 } caption { primary { @@ -44456,17 +51765,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "computer-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-confectionery" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "sweets-l" + priority: 16722 } caption { primary { @@ -44474,17 +51798,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "sweets-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-convenience" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "convenience-l" + priority: 16722 } caption { primary { @@ -44492,17 +51831,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "convenience-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-department_store" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "department_store-l" + priority: 16722 } caption { primary { @@ -44510,17 +51864,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "department_store-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-doityourself" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "doityourself-l" + priority: 16722 } caption { primary { @@ -44528,17 +51897,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "doityourself-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-electronics" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "electronics-l" + priority: 16722 } caption { primary { @@ -44546,17 +51930,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "electronics-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-florist" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "florist-l" + priority: 16722 } caption { primary { @@ -44564,17 +51963,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "florist-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-furniture" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "furniture-l" + priority: 16722 } caption { primary { @@ -44582,17 +51996,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "furniture-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-garden_centre" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "garden_center-l" + priority: 16722 } caption { primary { @@ -44600,17 +52029,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "garden_center-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-gift" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "gift-l" + priority: 16722 } caption { primary { @@ -44618,17 +52062,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "gift-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-greengrocer" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "greengrocer-l" + priority: 16722 } caption { primary { @@ -44636,17 +52095,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "greengrocer-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-hairdresser" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "hairdresser-l" + priority: 16722 } caption { primary { @@ -44654,17 +52128,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "hairdresser-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-hardware" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "hardware-l" + priority: 16722 } caption { primary { @@ -44672,17 +52161,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "hardware-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-jewelry" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "jewelry-l" + priority: 16722 } caption { primary { @@ -44690,17 +52194,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "jewelry-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-kiosk" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "kiosk-l" + priority: 16722 } caption { primary { @@ -44708,17 +52227,33 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "kiosk-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-laundry" element { - scale: 18 + scale: 17 symbol { name: "laundry-l" - priority: 16921 + apply_for_type: 1 + priority: 16944 } caption { primary { @@ -44726,14 +52261,29 @@ cont { color: 4473924 offset_y: 10 } - priority: 15921 + priority: 15944 + } + } + element { + scale: 18 + symbol { + name: "laundry-l" + priority: 16944 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15944 } } element { scale: 19 symbol { - name: "laundry-l" - priority: 16921 + name: "shop-m" + priority: 16736 } caption { primary { @@ -44741,7 +52291,7 @@ cont { color: 4473924 offset_y: 10 } - priority: 15921 + priority: 15736 } } } @@ -44752,15 +52302,15 @@ cont { symbol { name: "shop-m" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { @@ -44768,15 +52318,15 @@ cont { symbol { name: "shop-l" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { @@ -44784,40 +52334,40 @@ cont { symbol { name: "shop-l" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 19 symbol { - name: "shop-l" - priority: 16843 + name: "shop-m" + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15843 + priority: 15736 } } } cont { name: "shop-mobile_phone" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "mobile_phone-l" + priority: 16722 } caption { primary { @@ -44825,17 +52375,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "mobile_phone-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-optician" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "optician-l" + priority: 16722 } caption { primary { @@ -44843,17 +52408,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "optician-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-shoes" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "shoes-l" + priority: 16722 } caption { primary { @@ -44861,17 +52441,32 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "shoes-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-sports" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "sports-l" + priority: 16722 } caption { primary { @@ -44879,7 +52474,22 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "sports-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -44890,7 +52500,7 @@ cont { symbol { name: "grocery-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { @@ -44898,7 +52508,7 @@ cont { color: 4473924 offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -44906,7 +52516,7 @@ cont { symbol { name: "grocery-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { @@ -44914,14 +52524,14 @@ cont { color: 4473924 offset_y: 10 } - priority: 15000 + priority: 15736 } } element { scale: 19 symbol { - name: "grocery-l" - priority: 16843 + name: "shop-m" + priority: 16736 } caption { primary { @@ -44929,17 +52539,17 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15736 } } } cont { name: "shop-toys" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "toys-l" + priority: 16722 } caption { primary { @@ -44947,7 +52557,22 @@ cont { color: 4473924 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "toys-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -44958,15 +52583,15 @@ cont { symbol { name: "america-football-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -44974,15 +52599,48 @@ cont { symbol { name: "america-football-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 + } + } +} +cont { + name: "sport-archery" + element { + scale: 18 + symbol { + name: "archery-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "archery-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -44993,15 +52651,15 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45009,15 +52667,48 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 + } + } +} +cont { + name: "sport-australian_football" + element { + scale: 18 + symbol { + name: "australian-football-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "australian-football-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -45028,15 +52719,15 @@ cont { symbol { name: "baseball-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45044,15 +52735,15 @@ cont { symbol { name: "baseball-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } } @@ -45063,15 +52754,15 @@ cont { symbol { name: "basketball-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45079,15 +52770,147 @@ cont { symbol { name: "basketball-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 + } + } +} +cont { + name: "sport-bowls" + element { + scale: 18 + symbol { + name: "bowls-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "bowls-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "sport-cricket" + element { + scale: 18 + symbol { + name: "cricket-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "cricket-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "sport-curling" + element { + scale: 18 + symbol { + name: "curling-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "curling-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "sport-diving" + element { + scale: 18 + symbol { + name: "diving-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "diving-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -45098,15 +52921,15 @@ cont { symbol { name: "golf-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45114,15 +52937,15 @@ cont { symbol { name: "golf-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } } @@ -45133,15 +52956,15 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45149,15 +52972,48 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 + } + } +} +cont { + name: "sport-scuba_diving" + element { + scale: 18 + symbol { + name: "diving-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "diving-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } } @@ -45166,67 +53022,67 @@ cont { element { scale: 16 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15945 } } element { scale: 17 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "soccer-l" - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 18 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "soccer-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 19 area { - color: 13421738 - priority: -15922 + color: 13749671 + priority: -15264 } symbol { name: "soccer-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } } @@ -45237,15 +53093,15 @@ cont { symbol { name: "swimming-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45253,15 +53109,15 @@ cont { symbol { name: "swimming-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } } @@ -45272,15 +53128,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45288,15 +53144,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45304,15 +53160,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } } @@ -45320,22 +53176,32 @@ cont { name: "tourism-alpine_hut" element { scale: 18 + symbol { + name: "alpine_hut-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 + symbol { + name: "alpine_hut-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45346,15 +53212,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45362,15 +53228,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45378,15 +53244,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45397,15 +53263,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45413,15 +53279,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45429,15 +53295,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45447,67 +53313,67 @@ cont { scale: 15 symbol { name: "campsite-m" - priority: 16781 + priority: 16763 } } element { scale: 16 symbol { name: "campsite-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 12 } - priority: 15781 + priority: 15763 } } element { scale: 17 symbol { name: "campsite-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 18 symbol { name: "campsite-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "campsite-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45515,22 +53381,32 @@ cont { name: "tourism-caravan_site" element { scale: 18 + symbol { + name: "caravan_site-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 + symbol { + name: "caravan_site-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45538,22 +53414,32 @@ cont { name: "tourism-guest_house" element { scale: 18 + symbol { + name: "motel-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 + symbol { + name: "motel-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45564,15 +53450,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45580,15 +53466,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45596,15 +53482,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45615,15 +53501,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45631,15 +53517,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45647,15 +53533,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45666,15 +53552,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45682,15 +53568,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45698,15 +53584,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -45717,15 +53603,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45733,15 +53619,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45749,15 +53635,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -45768,47 +53654,45 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 18 symbol { - name: "information-l" - apply_for_type: 1 - priority: 16781 + name: "office-l" + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { - name: "information-l" - apply_for_type: 1 - priority: 16781 + name: "office-l" + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -45816,22 +53700,32 @@ cont { name: "tourism-motel" element { scale: 18 + symbol { + name: "motel-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 + symbol { + name: "motel-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45841,98 +53735,124 @@ cont { scale: 15 symbol { name: "museum-m" - priority: 16781 + priority: 16763 + min_distance: 1 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 16 symbol { name: "museum-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 12 } - priority: 15781 + priority: 15763 } } element { scale: 17 symbol { name: "museum-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 18 symbol { name: "museum-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 19 symbol { name: "museum-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } } cont { name: "tourism-picnic_site" element { - scale: 18 + scale: 17 + symbol { + name: "picnic-l" + priority: 16736 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 18 + symbol { + name: "picnic-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 4473924 + offset_y: 10 + } + priority: 15722 } } element { scale: 19 + symbol { + name: "picnic-l" + priority: 16722 + } caption { primary { height: 10 color: 4473924 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45943,15 +53863,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45959,15 +53879,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45975,15 +53895,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -45993,75 +53913,319 @@ cont { scale: 15 symbol { name: "zoo-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 16 symbol { name: "zoo-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 12 } - priority: 15781 + priority: 15763 } } element { scale: 17 symbol { name: "zoo-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 18 symbol { name: "zoo-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 19 symbol { name: "zoo-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 4473924 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 + } + } +} +cont { + name: "waterway-canal" + element { + scale: 13 + lines { + width: 0.2 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 14 + lines { + width: 0.2 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 15 + lines { + width: 1.0 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 16 + lines { + width: 1.5 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 17 + lines { + width: 1.5 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 11 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 18 + lines { + width: 1.5 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 12 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 19 + lines { + width: 1.5 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 12 + color: 4495803 + } + priority: 16916 + } + } +} +cont { + name: "waterway-canal-tunnel" + element { + scale: 13 + lines { + width: 0.2 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 14 + lines { + width: 0.2 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 15 + lines { + width: 1.0 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 16 + lines { + width: 1.5 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 10 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 17 + lines { + width: 1.5 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 11 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 18 + lines { + width: 1.5 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 12 + color: 4495803 + } + priority: 16916 + } + } + element { + scale: 19 + lines { + width: 1.5 + color: 3584191 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 12 + color: 4495803 + } + priority: 16916 } } } @@ -46071,25 +54235,25 @@ cont { scale: 15 lines { width: 1.0 - color: 864585864 - priority: 1640 + color: 8421504 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 4473924 } - priority: 16640 + priority: 16652 } } element { scale: 16 lines { width: 1.0 - color: 864585864 - priority: 1640 + color: 8421504 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -46098,15 +54262,15 @@ cont { height: 10 color: 4473924 } - priority: 16640 + priority: 16652 } } element { scale: 17 lines { width: 1.0 - color: 864585864 - priority: 1640 + color: 8421504 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -46115,15 +54279,15 @@ cont { height: 10 color: 4473924 } - priority: 16640 + priority: 16652 } } element { scale: 18 lines { width: 1.0 - color: 864585864 - priority: 1640 + color: 8421504 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -46132,15 +54296,15 @@ cont { height: 10 color: 4473924 } - priority: 16640 + priority: 16652 } } element { scale: 19 lines { width: 1.0 - color: 864585864 - priority: 1640 + color: 8421504 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -46149,7 +54313,7 @@ cont { height: 10 color: 4473924 } - priority: 16640 + priority: 16652 } } } @@ -46158,13 +54322,13 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 6728379 + width: 1.8 + color: 3584191 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46172,13 +54336,13 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 6728379 + width: 1.8 + color: 3584191 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46186,13 +54350,13 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 6728379 + width: 1.8 + color: 3584191 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46203,13 +54367,13 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 6728379 + width: 1.8 + color: 3584191 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46217,13 +54381,13 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 6728379 + width: 1.8 + color: 3584191 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46231,13 +54395,13 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 6728379 + width: 1.8 + color: 3584191 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46248,141 +54412,141 @@ cont { element { scale: 0 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 1 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 2 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 3 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 4 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 5 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 6 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 7 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 8 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 9 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 10 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 11 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 12 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 13 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 14 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 15 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 16 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 17 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 18 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 19 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } } @@ -46391,204 +54555,204 @@ cont { element { scale: 10 lines { - width: 0.5 - color: 2154212027 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } } element { scale: 11 lines { - width: 0.7 - color: 862366395 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 12 lines { - width: 0.7 - color: 862366395 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 13 lines { - width: 1.0 - color: 6728379 - priority: 1250 + width: 1.2 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 14 lines { - width: 1.0 - color: 6728379 - priority: 1250 + width: 1.2 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 15 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 16 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 17 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 11 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 18 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 19 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 4495803 } - priority: 16250 + priority: 16208 } } } @@ -46597,204 +54761,204 @@ cont { element { scale: 10 lines { - width: 0.5 - color: 2154212027 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } } element { scale: 11 lines { - width: 0.7 - color: 862366395 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 12 lines { - width: 0.7 - color: 862366395 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 13 lines { - width: 1.0 - color: 6728379 - priority: 1250 + width: 1.2 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 14 lines { - width: 1.0 - color: 6728379 - priority: 1250 + width: 1.2 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 15 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 16 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 17 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 11 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 18 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 19 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 4495803 } - priority: 16250 + priority: 16208 } } } @@ -46803,274 +54967,274 @@ cont { element { scale: 0 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 1 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 2 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 3 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 4 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 5 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 6 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 7 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 8 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 9 area { - color: 8965341 - priority: -15735 + color: 9163744 + priority: -15778 } } element { scale: 10 lines { - width: 0.5 - color: 2154212027 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } } element { scale: 11 lines { - width: 0.7 - color: 862366395 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 12 lines { - width: 0.7 - color: 862366395 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 3584191 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 13 lines { - width: 1.0 - color: 6728379 - priority: 1250 + width: 1.2 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 14 lines { - width: 1.0 - color: 6728379 - priority: 1250 + width: 1.2 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 15 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 16 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { height: 10 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 17 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 11 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 18 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 4495803 } - priority: 16250 + priority: 16208 } } element { scale: 19 lines { width: 1.8 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 8965341 - priority: -15750 + color: 9163744 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 4495803 } - priority: 16250 + priority: 16208 } } } @@ -47079,77 +55243,77 @@ cont { element { scale: 13 lines { - width: 0.1 - color: 1718004411 - priority: 1250 + width: 0.2 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 14 lines { - width: 0.1 - color: 1718004411 - priority: 1250 + width: 0.2 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 15 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 11 + height: 10 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 16 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 10 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 17 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } @@ -47158,41 +55322,41 @@ cont { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 18 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 19 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 4495803 } - priority: 16250 + priority: 16916 } } } @@ -47201,77 +55365,77 @@ cont { element { scale: 13 lines { - width: 0.1 - color: 1718004411 - priority: 1250 + width: 0.2 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 14 lines { - width: 0.1 - color: 1718004411 - priority: 1250 + width: 0.2 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 15 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 11 + height: 10 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 16 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 10 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 17 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } @@ -47280,41 +55444,41 @@ cont { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 18 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 19 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 4495803 } - priority: 16250 + priority: 16916 } } } @@ -47323,94 +55487,94 @@ cont { element { scale: 13 lines { - width: 0.1 - color: 1718004411 + width: 0.2 + color: 3584191 dashdot { - dd: 3.0 - dd: 3.0 + dd: 2.7 + dd: 2.7 } - priority: 1250 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 14 lines { - width: 0.1 - color: 1718004411 + width: 0.2 + color: 3584191 dashdot { - dd: 3.0 - dd: 3.0 + dd: 2.7 + dd: 2.7 } - priority: 1250 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 15 lines { width: 1.0 - color: 6728379 + color: 3584191 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 11 + height: 10 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 16 lines { width: 1.0 - color: 6728379 + color: 3584191 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 10 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 17 lines { width: 1.0 - color: 6728379 + color: 3584191 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } @@ -47419,47 +55583,47 @@ cont { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 18 lines { width: 1.0 - color: 6728379 + color: 3584191 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 19 lines { width: 1.0 - color: 6728379 + color: 3584191 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 4495803 } - priority: 16250 + priority: 16916 } } } @@ -47468,77 +55632,77 @@ cont { element { scale: 13 lines { - width: 0.1 - color: 1718004411 - priority: 1250 + width: 0.2 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 14 lines { - width: 0.1 - color: 1718004411 - priority: 1250 + width: 0.2 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 15 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 11 + height: 10 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 16 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 10 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 17 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } @@ -47547,41 +55711,41 @@ cont { height: 11 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 18 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 4495803 } - priority: 16250 + priority: 16916 } } element { scale: 19 lines { width: 1.0 - color: 6728379 - priority: 1250 + color: 3584191 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 4495803 } - priority: 16250 + priority: 16916 } } } diff --git a/data/drules_proto_dark.bin b/data/drules_proto_dark.bin index 869b5cffbd..4b68292e63 100644 Binary files a/data/drules_proto_dark.bin and b/data/drules_proto_dark.bin differ diff --git a/data/drules_proto_dark.txt b/data/drules_proto_dark.txt index d136dd2850..61af4c8479 100644 --- a/data/drules_proto_dark.txt +++ b/data/drules_proto_dark.txt @@ -4,185 +4,185 @@ cont { scale: 14 lines { width: 0.5 - color: 1715749939 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 - color: 1715749939 + color: 1716407869 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { scale: 15 lines { width: 0.5 - color: 1715749939 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { scale: 16 lines { width: 1.0 - color: 1296319539 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 17 lines { width: 1.0 - color: 4473907 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 18 lines { width: 1.0 - color: 4473907 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 19 lines { width: 1.0 - color: 4473907 - priority: 1875 + color: 5131837 + priority: 1680 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } @@ -194,185 +194,185 @@ cont { scale: 14 lines { width: 0.5 - color: 1715749939 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 - color: 1715749939 + color: 1716407869 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { scale: 15 lines { width: 0.5 - color: 1715749939 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { scale: 16 lines { width: 1.0 - color: 1296319539 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 17 lines { width: 1.0 - color: 4473907 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 18 lines { width: 1.0 - color: 4473907 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 19 lines { width: 1.0 - color: 4473907 - priority: 1875 + color: 5131837 + priority: 1680 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } @@ -384,185 +384,185 @@ cont { scale: 14 lines { width: 0.5 - color: 1715749939 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 - color: 1715749939 + color: 1716407869 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { scale: 15 lines { width: 0.5 - color: 1715749939 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { scale: 16 lines { width: 1.0 - color: 1296319539 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 17 lines { width: 1.0 - color: 4473907 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 18 lines { width: 1.0 - color: 4473907 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 19 lines { width: 1.0 - color: 4473907 - priority: 1875 + color: 5131837 + priority: 1680 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } @@ -574,185 +574,185 @@ cont { scale: 14 lines { width: 0.5 - color: 1715749939 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 - color: 1715749939 + color: 1716407869 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { scale: 15 lines { width: 0.5 - color: 1715749939 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { scale: 16 lines { width: 1.0 - color: 1296319539 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 17 lines { width: 1.0 - color: 4473907 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 18 lines { width: 1.0 - color: 4473907 - priority: 1921 + color: 5131837 + priority: 1958 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { scale: 19 lines { width: 1.0 - color: 4473907 - priority: 1875 + color: 5131837 + priority: 1680 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 2.5 - color: 4473907 + color: 5131837 dashdot { dd: 1.0 - dd: 20.0 + dd: 18.0 } - priority: 1859 + priority: 1666 join: ROUNDJOIN cap: ROUNDCAP } @@ -765,7 +765,7 @@ cont { symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } } element { @@ -773,16 +773,16 @@ cont { symbol { name: "cable-car-s" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - priority: 15921 + priority: 15958 } } element { @@ -790,16 +790,16 @@ cont { symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -807,16 +807,16 @@ cont { symbol { name: "cable-car-m" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -824,16 +824,16 @@ cont { symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } element { @@ -841,161 +841,188 @@ cont { symbol { name: "cable-car-l" apply_for_type: 1 - priority: 16921 + priority: 16958 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15921 + priority: 15958 } } } cont { name: "aeroway-aerodrome" + element { + scale: 12 + area { + color: 2757700 + priority: -15987 + } + } + element { + scale: 13 + area { + color: 2757700 + priority: -15987 + } + } element { scale: 14 area { - color: 3005354308 - priority: -15735 + color: 2757700 + priority: -15209 + } + symbol { + name: "airport-l" + priority: 16791 + } + caption { + primary { + height: 10 + color: 3355443 + stroke_color: 2148602112 + offset_y: 8 + } + priority: 15791 } } element { scale: 15 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 16 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 17 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 18 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 19 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } } @@ -1004,264 +1031,345 @@ cont { element { scale: 10 area { - color: 2232644 - priority: -15735 + color: 2757700 + priority: -15209 } symbol { name: "airport-s" - priority: 16265 + priority: 16791 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } - priority: 15265 + priority: 15791 } } element { scale: 11 area { - color: 1294078276 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-m" - priority: 16921 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 12 area { - color: 1713508676 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-m" - priority: 16921 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 13 area { - color: 2149716292 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-m" - priority: 16921 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 14 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { - name: "airport-m" - priority: 16921 + name: "airport-l" + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 - offset_y: 7 + offset_y: 8 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 15 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 16 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 17 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 18 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 } } element { scale: 19 area { - color: 3005354308 - priority: -15079 + color: 2757700 + priority: -15209 } symbol { name: "airport-l" - priority: 16921 + priority: 16791 } caption { primary { - height: 14 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15921 + priority: 15791 + } + } +} +cont { + name: "aeroway-gate" + element { + scale: 18 + symbol { + name: "gate-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "gate-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "aeroway-helipad" + element { + scale: 17 + symbol { + name: "heliport-m" + priority: 16750 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15750 + } + } + element { + scale: 18 + symbol { + name: "heliport-m" + priority: 16750 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15750 + } + } + element { + scale: 19 + symbol { + name: "heliport-m" + priority: 16750 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15750 } } } @@ -1272,9 +1380,9 @@ cont { lines { width: 1.0 color: 2149720610 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -1282,37 +1390,37 @@ cont { lines { width: 1.5 color: 857874978 - priority: 1000 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 5.0 + width: 2.4 color: 2236962 - priority: 1000 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 5.0 + width: 2.4 color: 2236962 - priority: 1000 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 5.0 + width: 4.0 color: 2236962 - priority: 1000 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1320,9 +1428,9 @@ cont { element { scale: 17 lines { - width: 8.0 + width: 4.0 color: 2236962 - priority: 1000 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1330,9 +1438,9 @@ cont { element { scale: 18 lines { - width: 8.0 + width: 4.0 color: 2236962 - priority: 1000 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1340,9 +1448,9 @@ cont { element { scale: 19 lines { - width: 8.0 + width: 4.0 color: 2236962 - priority: 1000 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1353,29 +1461,29 @@ cont { element { scale: 14 lines { - width: 0.5 + width: 0.6 color: 1713512994 - priority: 1000 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.0 + width: 1.2 color: 1713512994 - priority: 1000 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.2 color: 1713512994 - priority: 1000 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1383,9 +1491,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.2 color: 1713512994 - priority: 1000 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1393,9 +1501,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.2 color: 1713512994 - priority: 1000 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1403,9 +1511,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.2 color: 1713512994 - priority: 1000 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -1417,77 +1525,77 @@ cont { scale: 14 area { color: 857874978 - priority: -15641 + priority: -15695 } } element { scale: 15 area { color: 857874978 - priority: -15641 + priority: -15695 } caption { primary { height: 9 color: 5592405 } - priority: 15359 + priority: 15305 } } element { scale: 16 area { color: 2236962 - priority: -15641 + priority: -15695 } caption { primary { height: 9 color: 5592405 } - priority: 15359 + priority: 15305 } } element { scale: 17 area { color: 3355443 - priority: -15641 + priority: -15695 } caption { primary { height: 9 color: 5592405 } - priority: 15359 + priority: 15305 } } element { scale: 18 area { color: 3355443 - priority: -15641 + priority: -15695 } caption { primary { height: 9 color: 5592405 } - priority: 15359 + priority: 15305 } } element { scale: 19 area { color: 3355443 - priority: -15641 + priority: -15695 } caption { primary { height: 9 color: 5592405 } - priority: 15359 + priority: 15305 } } } @@ -1497,15 +1605,15 @@ cont { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -1515,30 +1623,30 @@ cont { scale: 18 symbol { name: "atm-l" - priority: 16796 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15796 + priority: 15736 } } element { scale: 19 symbol { name: "atm-l" - priority: 16796 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15796 + priority: 15736 } } } @@ -1548,45 +1656,45 @@ cont { scale: 17 symbol { name: "bank-l" - priority: 16812 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15812 + priority: 15750 } } element { scale: 18 symbol { name: "bank-l" - priority: 16812 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15812 + priority: 15750 } } element { scale: 19 symbol { name: "bank-l" - priority: 16812 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15812 + priority: 15750 } } } @@ -1595,49 +1703,64 @@ cont { element { scale: 18 symbol { - name: "bar-l" - priority: 16781 + name: "beer-l" + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { - name: "bar-l" - priority: 16781 + name: "beer-l" + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-bbq" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "bbq-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "bbq-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -1648,22 +1771,22 @@ cont { symbol { name: "bench" apply_for_type: 1 - priority: 16781 + priority: 16722 } } element { scale: 19 symbol { name: "bench" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -1673,45 +1796,45 @@ cont { scale: 17 symbol { name: "bicycle-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 18 symbol { name: "bicycle-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "bicycle-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -1721,15 +1844,15 @@ cont { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -1740,30 +1863,30 @@ cont { symbol { name: "banknote-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "banknote-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -1774,249 +1897,280 @@ cont { symbol { name: "bus-l" apply_for_type: 1 - priority: 16781 + priority: 16000 } } element { scale: 16 symbol { name: "bus-l" - priority: 16781 + priority: 16972 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15781 + priority: 15972 } } element { scale: 17 symbol { name: "bus-l" - priority: 16781 + priority: 16972 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15781 + priority: 15972 } } element { scale: 18 symbol { name: "bus-l" - priority: 16781 + priority: 16972 } caption { primary { - height: 12 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15781 + priority: 15972 } } element { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16972 } caption { primary { height: 10 color: 5592405 stroke_color: 2148602112 - offset_y: 8 + offset_y: 10 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 offset_y: 10 text: "int_name" } - priority: 15781 + priority: 15972 } } } cont { name: "amenity-cafe" element { - scale: 17 + scale: 16 symbol { - name: "cafe-l" - priority: 16781 + name: "cafe-m" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 + } + } + element { + scale: 17 + symbol { + name: "cafe-l" + priority: 16750 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15750 } } element { scale: 18 symbol { name: "cafe-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "cafe-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-car_rental" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "car_sharing-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "car_sharing-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "amenity-car_sharing" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "car_sharing-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "car_sharing-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "amenity-casino" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "casino-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "casino-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "amenity-cinema" - element { - scale: 17 - symbol { - name: "cinema-l" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } - element { - scale: 18 - symbol { - name: "cinema-l" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 19 symbol { - name: "cinema-l" - priority: 16781 + name: "none" + priority: 16000 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -2026,60 +2180,60 @@ cont { scale: 16 symbol { name: "hospital-m" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 17 symbol { name: "hospital-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 18 symbol { name: "hospital-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 symbol { name: "hospital-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -2089,156 +2243,96 @@ cont { scale: 16 symbol { name: "college-m" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 17 symbol { name: "college-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "college-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "college-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-dentist" - element { - scale: 16 - symbol { - name: "hospital-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } - element { - scale: 17 - symbol { - name: "hospital-l" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } - element { - scale: 18 - symbol { - name: "hospital-l" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 19 symbol { - name: "hospital-l" - priority: 16781 + name: "none" + priority: 16000 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } cont { name: "amenity-doctors" - element { - scale: 16 - symbol { - name: "hospital-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -2248,29 +2342,29 @@ cont { scale: 17 symbol { name: "drinking-water-l" - priority: 16781 + priority: 16722 } } element { scale: 18 symbol { name: "drinking-water-l" - priority: 16781 + priority: 16722 } } element { scale: 19 symbol { name: "drinking-water-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -2280,45 +2374,45 @@ cont { scale: 17 symbol { name: "embassy-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "embassy-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "embassy-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -2328,30 +2422,30 @@ cont { scale: 18 symbol { name: "fastfood-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "fastfood-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -2362,7 +2456,7 @@ cont { symbol { name: "ship-s" apply_for_type: 1 - priority: 16921 + priority: 16972 } } element { @@ -2370,7 +2464,7 @@ cont { symbol { name: "ship-s" apply_for_type: 1 - priority: 16781 + priority: 16972 } } element { @@ -2378,16 +2472,16 @@ cont { symbol { name: "ship-m" apply_for_type: 1 - priority: 16781 + priority: 16972 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15781 + priority: 15972 } } element { @@ -2395,16 +2489,16 @@ cont { symbol { name: "ship-l" apply_for_type: 1 - priority: 16781 + priority: 16972 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 10 } - priority: 15781 + priority: 15972 } } element { @@ -2412,50 +2506,65 @@ cont { symbol { name: "ship-l" apply_for_type: 1 - priority: 16781 + priority: 16972 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 10 } - priority: 15781 + priority: 15972 } } element { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16972 } caption { primary { height: 10 color: 5592405 stroke_color: 2148602112 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15972 } } } cont { name: "amenity-fire_station" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "fire_station-l" + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "none" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 } } } @@ -2465,127 +2574,112 @@ cont { scale: 16 area { color: 8738 - priority: -15219 + priority: -15778 } } element { scale: 17 area { color: 8738 - priority: -15360 + priority: -15264 } symbol { name: "fountain-l" - priority: 16640 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15736 } } element { scale: 18 area { color: 8738 - priority: -15360 + priority: -15264 } symbol { name: "fountain-l" - priority: 16640 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15736 } } element { scale: 19 area { color: 8738 - priority: -15360 + priority: -15264 } symbol { name: "fountain-l" - priority: 16640 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15736 } } } cont { name: "amenity-fuel" - element { - scale: 16 - symbol { - name: "fuel-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 17 symbol { name: "fuel-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "fuel-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "fuel-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -2594,33 +2688,33 @@ cont { element { scale: 14 area { - color: 655434240 - priority: -15813 + color: 656090368 + priority: -15848 } } element { scale: 15 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15848 } } element { scale: 16 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15848 } } element { scale: 17 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16781 + priority: 16569 } caption { primary { @@ -2628,18 +2722,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15781 + priority: 15569 } } element { scale: 18 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16781 + priority: 16569 } caption { primary { @@ -2647,26 +2741,26 @@ cont { color: 5592405 offset_y: 10 } - priority: 15781 + priority: 15569 } } element { scale: 19 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15431 } symbol { name: "none" - priority: 16781 + priority: 16569 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15569 } } } @@ -2675,33 +2769,33 @@ cont { element { scale: 14 area { - color: 655434240 - priority: -15813 + color: 656090368 + priority: -15848 } } element { scale: 15 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15848 } } element { scale: 16 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15848 } } element { scale: 17 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16781 + priority: 16569 } caption { primary { @@ -2709,18 +2803,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15781 + priority: 15569 } } element { scale: 18 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16781 + priority: 16569 } caption { primary { @@ -2728,26 +2822,26 @@ cont { color: 5592405 offset_y: 10 } - priority: 15781 + priority: 15569 } } element { scale: 19 area { - color: 1122816 - priority: -15219 + color: 1778944 + priority: -15431 } symbol { name: "none" - priority: 16781 + priority: 16569 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15569 } } } @@ -2756,185 +2850,220 @@ cont { element { scale: 14 area { - color: 3351074 - priority: -15969 + color: 3878179 + priority: -15973 } } element { scale: 15 area { - color: 3351074 - priority: -15219 - } - symbol { - name: "hospital-m" - apply_for_type: 1 - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 + color: 3878179 + priority: -15973 } } element { scale: 16 area { - color: 3351074 - priority: -15219 + color: 3878179 + priority: -15237 } symbol { name: "hospital-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 17 area { - color: 3351074 - priority: -15219 + color: 3878179 + priority: -15237 } symbol { name: "hospital-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 18 area { - color: 3351074 - priority: -15219 + color: 3878179 + priority: -15237 } symbol { name: "hospital-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 19 area { - color: 3351074 - priority: -15219 + color: 3878179 + priority: -15237 } symbol { name: "hospital-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } } cont { name: "amenity-hunting_stand" element { - scale: 19 + scale: 15 symbol { - name: "none" - priority: 16781 + name: "hunting-tower-m" + apply_for_type: 1 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 16 + symbol { + name: "hunting-tower-m" + apply_for_type: 1 + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 17 + symbol { + name: "hunting-tower-m" + apply_for_type: 1 + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 18 + symbol { + name: "hunting-tower-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "hunting-tower-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 } } } cont { name: "amenity-kindergarten" - element { - scale: 16 - symbol { - name: "kindergarten-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 17 symbol { name: "kindergarten-l" - priority: 16781 + priority: 16930 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15930 } } element { scale: 18 symbol { name: "kindergarten-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 symbol { name: "kindergarten-l" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -2945,66 +3074,96 @@ cont { symbol { name: "library-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "library-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } cont { name: "amenity-marketplace" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "marketplace-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "marketplace-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "amenity-nightclub" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "bar-l" + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "bar-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 } } } @@ -3014,57 +3173,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3074,57 +3233,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3134,57 +3293,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3194,57 +3353,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3254,57 +3413,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3314,57 +3473,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3374,57 +3533,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "zero-icon" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3434,57 +3593,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "zero-icon" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3494,57 +3653,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "zero-icon" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3554,57 +3713,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3614,57 +3773,57 @@ cont { scale: 16 area { color: 4369 - priority: 1922 + priority: -15931 } } element { scale: 17 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-s" apply_for_type: 1 - priority: 16062 + priority: 16069 } } element { scale: 18 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } element { scale: 19 area { color: 4369 - priority: 1063 + priority: -15931 } symbol { name: "parking-m" - priority: 16062 + priority: 16069 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15069 } } } @@ -3674,30 +3833,30 @@ cont { scale: 18 symbol { name: "pharmacy-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "pharmacy-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -3705,62 +3864,78 @@ cont { name: "amenity-place_of_worship" element { scale: 16 + area { + color: 3355426 + priority: -15250 + } symbol { name: "place-of-worship-m" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 17 + area { + color: 3355426 + priority: -15250 + } symbol { name: "place-of-worship-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 + area { + color: 3355426 + priority: -15250 + } symbol { name: "place-of-worship-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 + area { + color: 3355426 + priority: -15250 + } symbol { name: "place-of-worship-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -3770,63 +3945,78 @@ cont { scale: 17 symbol { name: "police-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "police-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "police-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-post_box" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "postbox-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "postbox-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -3837,15 +4027,15 @@ cont { symbol { name: "mail-l" apply_for_type: 1 - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { @@ -3853,30 +4043,30 @@ cont { symbol { name: "mail-m" apply_for_type: 1 - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 symbol { name: "mail-m" - priority: 16781 + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -3885,31 +4075,31 @@ cont { element { scale: 18 symbol { - name: "pub-l" - priority: 16781 + name: "beer-l" + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { - name: "pub-l" - priority: 16781 + name: "beer-l" + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -3919,240 +4109,303 @@ cont { scale: 19 symbol { name: "recycling-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } cont { name: "amenity-restaurant" element { - scale: 17 + scale: 16 symbol { - name: "restaurant-l" - priority: 16781 + name: "restaurant-m" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 + } + } + element { + scale: 17 + symbol { + name: "restaurant-l" + priority: 16750 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15750 } } element { scale: 18 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-restaurant-vegan" element { - scale: 17 + scale: 16 symbol { - name: "restaurant-l" - priority: 16781 + name: "restaurant-m" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 + } + } + element { + scale: 17 + symbol { + name: "restaurant-l" + priority: 16750 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15750 } } element { scale: 18 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-restaurant-vegetarian" element { - scale: 17 + scale: 16 symbol { - name: "restaurant-l" - priority: 16781 + name: "restaurant-m" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 + } + } + element { + scale: 17 + symbol { + name: "restaurant-l" + priority: 16750 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15750 } } element { scale: 18 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "restaurant-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } cont { name: "amenity-school" - element { - scale: 16 - symbol { - name: "school-m" - priority: 16781 - } - caption { - primary { - height: 10 - color: 5592405 - offset_y: 8 - } - priority: 15781 - } - } element { scale: 17 symbol { name: "school-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 18 symbol { name: "school-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "school-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } cont { name: "amenity-shelter" element { - scale: 19 + scale: 17 symbol { - name: "none" - priority: 16781 + name: "picnic-l" + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 18 + symbol { + name: "picnic-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "none" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 } } } @@ -4162,33 +4415,48 @@ cont { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } cont { name: "amenity-taxi" element { - scale: 19 + scale: 18 symbol { - name: "none" - priority: 16781 + name: "taxi-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "taxi-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -4198,15 +4466,15 @@ cont { scale: 19 symbol { name: "phone-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -4215,61 +4483,62 @@ cont { element { scale: 16 symbol { - name: "theatre-m" - priority: 16781 + name: "theatre-l" + priority: 16750 + min_distance: 10 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 17 symbol { name: "theatre-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 18 symbol { name: "theatre-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "theatre-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -4279,30 +4548,30 @@ cont { scale: 18 symbol { name: "toilets-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "toilets-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -4312,15 +4581,15 @@ cont { scale: 19 symbol { name: "none" - priority: 16781 + priority: 16000 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15000 } } } @@ -4329,104 +4598,412 @@ cont { element { scale: 14 area { - color: 857874961 - priority: -15985 + color: 2894359 + priority: -15987 } } element { scale: 15 area { - color: 857874961 - priority: -15938 + color: 2894359 + priority: -15987 } symbol { name: "college-m" apply_for_type: 1 - priority: 16062 + priority: 16013 + min_distance: 12 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15013 } + apply_if: "name" + } + element { + scale: 15 + area { + color: 2894359 + priority: -15237 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + apply_if: "!name" } element { scale: 16 area { - color: 2236945 - priority: -15938 + color: 2894359 + priority: -15987 } symbol { name: "college-m" - priority: 16062 + priority: 16013 + min_distance: 11 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15013 } + apply_if: "name" + } + element { + scale: 16 + area { + color: 2894359 + priority: -15987 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15013 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 2894359 + priority: -15987 + } + symbol { + name: "college-m" + priority: 16013 + min_distance: 11 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15013 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 2894359 + priority: -15987 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15013 + } + apply_if: "!name" } element { scale: 17 area { - color: 2236945 - priority: -15938 + color: 2894359 + priority: -15987 } symbol { name: "college-l" - priority: 16062 + priority: 16013 + min_distance: 10 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15062 + priority: 15013 } + apply_if: "name" + } + element { + scale: 17 + area { + color: 2894359 + priority: -15264 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 2894359 + priority: -15987 + } + symbol { + name: "college-l" + priority: 16013 + min_distance: 10 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15013 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 2894359 + priority: -15264 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" } element { scale: 18 area { - color: 2236945 - priority: -15922 + color: 2894359 + priority: -15987 } symbol { name: "college-l" - priority: 16078 + priority: 16013 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15013 } + apply_if: "name" + } + element { + scale: 18 + area { + color: 2894359 + priority: -15264 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 2894359 + priority: -15987 + } + symbol { + name: "college-l" + priority: 16013 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15013 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 2894359 + priority: -15264 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" } element { scale: 19 area { - color: 2236945 - priority: -15922 + color: 2894359 + priority: -15987 } symbol { name: "college-l" - priority: 16078 + priority: 16013 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15013 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 2894359 + priority: -15264 + } + symbol { + name: "none" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 2894359 + priority: -15987 + } + symbol { + name: "college-l" + priority: 16013 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15013 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 2894359 + priority: -15264 + } + symbol { + name: "none" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + apply_if: "!name" + } +} +cont { + name: "amenity-vending_machine-parking_tickets" + element { + scale: 18 + symbol { + name: "parking-meter-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "parking-meter-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "amenity-vending_machine-public_transport_tickets" + element { + scale: 18 + symbol { + name: "vending-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "vending-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -4436,30 +5013,30 @@ cont { scale: 18 symbol { name: "recycling-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { name: "recycling-l" - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -4468,78 +5045,78 @@ cont { element { scale: 14 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } element { scale: 15 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } element { scale: 16 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } element { scale: 17 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } element { scale: 18 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } element { scale: 19 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } } @@ -4548,43 +5125,43 @@ cont { element { scale: 14 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } element { scale: 15 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } element { scale: 16 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } element { scale: 17 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } element { scale: 18 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } element { scale: 19 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } } @@ -4593,78 +5170,78 @@ cont { element { scale: 14 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } element { scale: 15 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } element { scale: 16 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } element { scale: 17 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } element { scale: 18 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } element { scale: 19 area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { height: 11 color: 10066329 } - priority: 15203 + priority: 15166 } } } @@ -4675,15 +5252,15 @@ cont { symbol { name: "bcontrol-m" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } element { @@ -4691,63 +5268,63 @@ cont { symbol { name: "bcontrol-m" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } element { scale: 17 symbol { - name: "bcontrol-m" + name: "bcontrol-l" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } element { scale: 18 symbol { - name: "bcontrol-m" + name: "bcontrol-l" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } element { scale: 19 symbol { - name: "bcontrol-m" + name: "bcontrol-l" apply_for_type: 1 - priority: 16921 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15921 + priority: 15763 } } } @@ -4756,13 +5333,13 @@ cont { element { scale: 16 lines { - width: 0.1 - color: 1715749956 + width: 0.5 + color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4770,13 +5347,13 @@ cont { element { scale: 17 lines { - width: 0.3 + width: 1.0 color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4790,7 +5367,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4804,7 +5381,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4815,13 +5392,13 @@ cont { element { scale: 16 lines { - width: 0.1 - color: 1715749956 + width: 0.5 + color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4829,13 +5406,13 @@ cont { element { scale: 17 lines { - width: 0.3 + width: 1.0 color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4849,7 +5426,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4863,7 +5440,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4874,13 +5451,13 @@ cont { element { scale: 16 lines { - width: 0.1 - color: 1715749956 + width: 0.5 + color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4888,13 +5465,13 @@ cont { element { scale: 17 lines { - width: 0.3 + width: 1.0 color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4908,7 +5485,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4922,24 +5499,57 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } } } +cont { + name: "barrier-lift_gate" + element { + scale: 18 + symbol { + name: "lift_gate-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "lift_gate-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} cont { name: "barrier-retaining_wall" element { scale: 16 lines { - width: 0.1 - color: 1715749956 + width: 0.5 + color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4947,13 +5557,13 @@ cont { element { scale: 17 lines { - width: 0.3 + width: 1.0 color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4967,7 +5577,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -4981,24 +5591,57 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } } } +cont { + name: "barrier-toll_booth" + element { + scale: 18 + symbol { + name: "toll_booth-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "toll_booth-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} cont { name: "barrier-wall" element { scale: 16 lines { - width: 0.1 - color: 1715749956 + width: 0.5 + color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -5006,13 +5649,13 @@ cont { element { scale: 17 lines { - width: 0.3 + width: 1.0 color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -5026,7 +5669,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -5040,7 +5683,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -5051,61 +5694,61 @@ cont { element { scale: 2 lines { - width: 0.2 - color: 1716868420 - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.5 + color: 1297438020 + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 3 lines { - width: 0.2 + width: 0.5 color: 861230404 - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 4 lines { - width: 0.4 + width: 0.6 color: 5592388 - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 5 lines { - width: 0.5 + width: 0.8 color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 6 lines { - width: 0.8 + width: 0.85 color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 7 lines { - width: 1.1 + width: 1.0 color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5113,119 +5756,9 @@ cont { lines { width: 1.1 color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 9 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 10 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 11 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 12 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 13 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 14 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 15 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 16 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 17 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 18 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 19 - lines { - width: 1.1 - color: 5592388 - priority: 1000 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } } @@ -5234,15 +5767,15 @@ cont { element { scale: 4 lines { - width: 0.4 + width: 0.8 color: 5592388 dashdot { - dd: 1.5 + dd: 1.0 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } } @@ -5251,29 +5784,29 @@ cont { element { scale: 5 lines { - width: 0.4 + width: 0.7 color: 861230404 dashdot { - dd: 1.5 + dd: 1.35 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 6 lines { - width: 0.6 + width: 0.8 color: 5592388 dashdot { - dd: 1.5 + dd: 1.0 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5282,12 +5815,12 @@ cont { width: 0.9 color: 5592388 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5296,40 +5829,40 @@ cont { width: 0.9 color: 5592388 dashdot { - dd: 1.5 - dd: 1.0 + dd: 1.44 + dd: 1.44 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.9 + width: 1.0 color: 5592388 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 + width: 1.2 color: 5592388 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5338,12 +5871,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5352,12 +5885,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5366,12 +5899,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -5380,12 +5913,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -5394,12 +5927,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -5408,10 +5941,10 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5422,10 +5955,10 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5436,10 +5969,10 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5450,10 +5983,10 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5464,29 +5997,29 @@ cont { element { scale: 5 lines { - width: 0.4 + width: 0.7 color: 861230404 dashdot { - dd: 1.5 + dd: 1.35 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 6 lines { - width: 0.6 + width: 0.8 color: 5592388 dashdot { - dd: 1.5 + dd: 1.0 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5495,12 +6028,12 @@ cont { width: 0.9 color: 5592388 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1375 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5509,40 +6042,40 @@ cont { width: 0.9 color: 5592388 dashdot { - dd: 1.5 - dd: 1.0 + dd: 1.44 + dd: 1.44 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.9 + width: 1.0 color: 5592388 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 + width: 1.2 color: 5592388 dashdot { - dd: 1.5 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5551,12 +6084,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5565,12 +6098,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1277 + join: BEVELJOIN + cap: BUTTCAP } } element { @@ -5579,12 +6112,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -5593,12 +6126,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -5607,12 +6140,12 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -5621,10 +6154,10 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5635,10 +6168,10 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5649,10 +6182,10 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } @@ -5663,167 +6196,36 @@ cont { width: 1.2 color: 5592388 dashdot { - dd: 2.0 + dd: 1.8 dd: 1.0 } - priority: 1390 + priority: 1277 join: ROUNDJOIN cap: ROUNDCAP } } } -cont { - name: "boundary-national_park" - element { - scale: 12 - symbol { - name: "nparkf-s" - priority: 16640 - } - caption { - primary { - height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 8 - } - priority: 15640 - } - } - element { - scale: 13 - symbol { - name: "nparkf-s" - priority: 16640 - } - caption { - primary { - height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 8 - } - priority: 15640 - } - } - element { - scale: 14 - symbol { - name: "nparkf-s" - priority: 16640 - } - caption { - primary { - height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 8 - } - priority: 15640 - } - } - element { - scale: 15 - symbol { - name: "nparkf-m" - priority: 16640 - } - caption { - primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 - offset_y: 10 - } - priority: 15640 - } - } - element { - scale: 16 - symbol { - name: "nparkf-m" - priority: 16640 - } - caption { - primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 - offset_y: 10 - } - priority: 15640 - } - } - element { - scale: 17 - symbol { - name: "nparkf-l" - priority: 16640 - } - caption { - primary { - height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 12 - } - priority: 15640 - } - } - element { - scale: 18 - symbol { - name: "nparkf-l" - priority: 16640 - } - caption { - primary { - height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 12 - } - priority: 15640 - } - } - element { - scale: 19 - symbol { - name: "nparkf-l" - priority: 16640 - } - caption { - primary { - height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 12 - } - priority: 15640 - } - } -} cont { name: "building" element { scale: 14 area { - color: 2569151010 - priority: 1329 + color: 2149720610 + priority: 1292 } } element { scale: 15 area { color: 1713512994 - priority: 1329 + priority: 1292 } } element { scale: 16 area { color: 857874978 - priority: 1641 + priority: 1348 } caption { primary { @@ -5831,14 +6233,14 @@ cont { color: 5592405 text: "addr:housename" } - priority: 15640 + priority: 15347 } } element { scale: 17 area { - color: 2236962 - priority: 1360 + color: 3355443 + priority: 1348 } caption { primary { @@ -5851,35 +6253,35 @@ cont { offset_y: 20 text: "int_name" } - priority: 15359 + priority: 15347 } } element { scale: 18 area { color: 3355443 - priority: 1641 + priority: 1348 } caption { primary { height: 10 color: 5592405 } - priority: 15640 + priority: 15347 } } element { scale: 19 area { color: 3355443 - priority: 1641 + priority: 1348 } caption { primary { height: 10 color: 5592405 } - priority: 15640 + priority: 15347 } } } @@ -5893,7 +6295,7 @@ cont { color: 5592405 text: "addr:housename" } - priority: 15640 + priority: 15347 } } element { @@ -5909,7 +6311,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15359 + priority: 15347 } } element { @@ -5919,7 +6321,7 @@ cont { height: 10 color: 5592405 } - priority: 15640 + priority: 15347 } } element { @@ -5929,7 +6331,7 @@ cont { height: 10 color: 5592405 } - priority: 15640 + priority: 15347 } } } @@ -5940,16 +6342,16 @@ cont { symbol { name: "entrance-s" apply_for_type: 1 - priority: 16093 + priority: 16083 } caption { primary { height: 10 color: 5592405 - offset_x: 6 + offset_x: 9 text: "ref" } - priority: 15093 + priority: 15083 } } element { @@ -5957,22 +6359,22 @@ cont { symbol { name: "entrance-s" apply_for_type: 1 - priority: 16093 + priority: 16083 } caption { primary { height: 10 color: 5592405 - offset_x: 6 + offset_x: 9 text: "ref" } secondary { - height: 9 + height: 12 color: 5592405 offset_y: 10 text: "addr:flats" } - priority: 15093 + priority: 15083 } } } @@ -5981,29 +6383,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1406 + priority: 1416 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.4 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1430 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6011,29 +6413,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16430 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } element { @@ -6042,20 +6444,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } element { @@ -6064,42 +6466,42 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16430 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } } @@ -6108,29 +6510,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1406 + priority: 1416 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.4 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1430 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6138,29 +6540,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16430 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } element { @@ -6169,20 +6571,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } element { @@ -6191,42 +6593,42 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16430 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } } @@ -6235,29 +6637,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1406 + priority: 1416 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.4 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1430 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6265,29 +6667,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16430 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } element { @@ -6296,20 +6698,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } element { @@ -6318,42 +6720,42 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16430 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } } @@ -6362,29 +6764,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1406 + priority: 1416 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.4 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1430 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6392,29 +6794,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16430 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } element { @@ -6423,20 +6825,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } element { @@ -6445,42 +6847,42 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16430 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1430 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 9 + height: 12 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16430 } } } @@ -6490,53 +6892,53 @@ cont { scale: 17 symbol { name: "bus-m" - priority: 16781 + priority: 16972 } } element { scale: 18 symbol { name: "bus-l" - priority: 16828 + priority: 16972 } - caption { + path_text { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 10 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 10 text: "int_name" } - priority: 15828 + priority: 16972 } } element { scale: 19 symbol { name: "bus-l" - priority: 16828 + priority: 16972 } - caption { + path_text { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 10 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 10 text: "int_name" } - priority: 15828 + priority: 16972 } } } @@ -6545,55 +6947,55 @@ cont { element { scale: 13 lines { - width: 1.4 - color: 2149720610 + width: 1.2 + color: 2236962 dashdot { - dd: 4.0 - dd: 4.0 + dd: 3.6 + dd: 1.8 } - priority: 1000 + priority: 1388 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { width: 1.4 - color: 2149720610 + color: 2236962 dashdot { - dd: 5.0 - dd: 5.0 + dd: 4.5 + dd: 1.8 } - priority: 1000 + priority: 1388 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { width: 2.0 - color: 2149720610 + color: 2236962 dashdot { - dd: 5.0 - dd: 5.0 + dd: 7.2 + dd: 2.7 } - priority: 1000 + priority: 1388 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 2.0 - color: 1294082594 + width: 2.6 + color: 2236962 dashdot { - dd: 5.0 - dd: 5.0 + dd: 9.0 + dd: 3.6 } - priority: 1000 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -6604,10 +7006,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 6.0 - dd: 6.0 + dd: 10.8 + dd: 4.5 } - priority: 1000 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -6618,10 +7020,10 @@ cont { width: 4.0 color: 2236962 dashdot { - dd: 6.0 - dd: 6.0 + dd: 13.5 + dd: 5.4 } - priority: 1000 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -6632,10 +7034,10 @@ cont { width: 6.0 color: 2236962 dashdot { - dd: 6.0 - dd: 6.0 + dd: 18.0 + dd: 6.3 } - priority: 1000 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -6643,32 +7045,42 @@ cont { } cont { name: "highway-cycleway" + element { + scale: 13 + lines { + width: 1.0 + color: 862011455 + priority: 1652 + join: ROUNDJOIN + cap: BUTTCAP + } + } element { scale: 14 lines { - width: 0.4 - color: 862340147 - priority: 1640 + width: 1.2 + color: 6373439 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 442909747 - priority: 1640 + width: 1.4 + color: 6373439 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 6702131 - priority: 1640 + width: 1.6 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6676,9 +7088,9 @@ cont { element { scale: 17 lines { - width: 1.2 - color: 6702131 - priority: 1484 + width: 1.8 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6687,8 +7099,8 @@ cont { scale: 18 lines { width: 2.0 - color: 6702131 - priority: 1484 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6696,9 +7108,9 @@ cont { element { scale: 19 lines { - width: 2.0 - color: 6702131 - priority: 1484 + width: 2.2 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6706,32 +7118,42 @@ cont { } cont { name: "highway-cycleway-bridge" + element { + scale: 13 + lines { + width: 1.0 + color: 862011455 + priority: 1652 + join: ROUNDJOIN + cap: BUTTCAP + } + } element { scale: 14 lines { - width: 0.4 - color: 862340147 - priority: 1640 + width: 1.2 + color: 6373439 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 442909747 - priority: 1640 + width: 1.4 + color: 6373439 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 6702131 - priority: 1640 + width: 1.6 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6739,9 +7161,9 @@ cont { element { scale: 17 lines { - width: 1.2 - color: 6702131 - priority: 1484 + width: 1.8 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6750,8 +7172,8 @@ cont { scale: 18 lines { width: 2.0 - color: 6702131 - priority: 1484 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6759,9 +7181,9 @@ cont { element { scale: 19 lines { - width: 2.0 - color: 6702131 - priority: 1484 + width: 2.2 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6769,32 +7191,42 @@ cont { } cont { name: "highway-cycleway-permissive" + element { + scale: 13 + lines { + width: 1.0 + color: 862011455 + priority: 1652 + join: ROUNDJOIN + cap: BUTTCAP + } + } element { scale: 14 lines { - width: 0.4 - color: 862340147 - priority: 1640 + width: 1.2 + color: 6373439 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 442909747 - priority: 1640 + width: 1.4 + color: 6373439 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 6702131 - priority: 1640 + width: 1.6 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6802,9 +7234,9 @@ cont { element { scale: 17 lines { - width: 1.2 - color: 6702131 - priority: 1484 + width: 1.8 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6813,8 +7245,8 @@ cont { scale: 18 lines { width: 2.0 - color: 6702131 - priority: 1484 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6822,9 +7254,9 @@ cont { element { scale: 19 lines { - width: 2.0 - color: 6702131 - priority: 1484 + width: 2.2 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6832,32 +7264,42 @@ cont { } cont { name: "highway-cycleway-tunnel" + element { + scale: 13 + lines { + width: 1.0 + color: 862011455 + priority: 1652 + join: ROUNDJOIN + cap: BUTTCAP + } + } element { scale: 14 lines { - width: 0.4 - color: 862340147 - priority: 1640 + width: 1.2 + color: 6373439 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 442909747 - priority: 1640 + width: 1.4 + color: 6373439 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 6702131 - priority: 1640 + width: 1.6 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6865,9 +7307,9 @@ cont { element { scale: 17 lines { - width: 1.2 - color: 6702131 - priority: 1484 + width: 1.8 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6876,8 +7318,8 @@ cont { scale: 18 lines { width: 2.0 - color: 6702131 - priority: 1484 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6885,9 +7327,9 @@ cont { element { scale: 19 lines { - width: 2.0 - color: 6702131 - priority: 1484 + width: 2.2 + color: 6373439 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -6898,29 +7340,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -6928,19 +7370,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -6950,19 +7392,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -6972,19 +7414,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -6994,19 +7436,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7016,7 +7458,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -7025,29 +7467,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7055,19 +7497,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7077,19 +7519,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7099,19 +7541,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7121,19 +7563,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7143,7 +7585,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -7152,37 +7594,37 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1203 + priority: 1166 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1203 + priority: 1166 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { @@ -7190,25 +7632,25 @@ cont { color: 10066329 stroke_color: 2148602112 } - priority: 15203 + priority: 15166 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { @@ -7216,25 +7658,25 @@ cont { color: 10066329 stroke_color: 2148602112 } - priority: 15203 + priority: 15166 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { @@ -7242,25 +7684,25 @@ cont { color: 10066329 stroke_color: 2148602112 } - priority: 15203 + priority: 15166 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { @@ -7268,25 +7710,25 @@ cont { color: 10066329 stroke_color: 2148602112 } - priority: 15203 + priority: 15166 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { @@ -7294,7 +7736,7 @@ cont { color: 10066329 stroke_color: 2148602112 } - priority: 15203 + priority: 15166 } } } @@ -7303,27 +7745,27 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 0.2 - color: 2236945 - priority: 1420 + priority: 1444 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.6 + width: 2.0 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 2.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -7331,27 +7773,27 @@ cont { element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 1.6 - color: 2236945 - priority: 1420 + priority: 1444 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 + width: 3.4 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -7361,141 +7803,33 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 - lines { - width: 1.0 - color: 3355426 - dashdot { - dd: 1.0 - dd: 1.0 - } - priority: 1437 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.4 - color: 2236945 - priority: 1499 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 3.2 - color: 4473924 - priority: 1483 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 9 - color: 7829367 - stroke_color: 2148602112 - } - priority: 16437 - } - } - element { - scale: 17 - lines { - width: 1.2 - color: 3355426 - dashdot { - dd: 2.0 - dd: 2.0 - } - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 2236945 - priority: 1499 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 3.6 - color: 4473924 - priority: 1483 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 9 - color: 7829367 - stroke_color: 2148602112 - } - priority: 16515 - } - } - element { - scale: 18 - lines { - width: 1.8 - color: 3355426 - dashdot { - dd: 3.0 - dd: 1.5 - } - priority: 1671 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 2236945 - priority: 1655 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 4.8 - color: 4473924 - priority: 1639 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 9 - color: 7829367 - stroke_color: 2148602112 - } - priority: 16671 - } - } - element { - scale: 19 lines { width: 2.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.4 color: 2236945 - priority: 1655 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.2 color: 4473924 - priority: 1639 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -7505,7 +7839,115 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 + } + } + element { + scale: 17 + lines { + width: 2.4 + color: 3355426 + dashdot { + dd: 4.5 + dd: 1.8 + } + priority: 1444 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 5.2 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 6.0 + color: 4473924 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16444 + } + } + element { + scale: 18 + lines { + width: 3.4 + color: 3355426 + dashdot { + dd: 7.2 + dd: 2.7 + } + priority: 1444 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 7.2 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 8.0 + color: 4473924 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16444 + } + } + element { + scale: 19 + lines { + width: 4.0 + color: 3355426 + dashdot { + dd: 9.0 + dd: 3.6 + } + priority: 1444 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 8.4 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 9.2 + color: 4473924 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16444 } } } @@ -7514,29 +7956,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7544,19 +7986,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7566,19 +8008,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7588,19 +8030,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7610,19 +8052,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7632,7 +8074,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -7641,29 +8083,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7671,19 +8113,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7693,19 +8135,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7715,19 +8157,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7737,19 +8179,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7759,7 +8201,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -7768,29 +8210,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7798,19 +8240,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7820,19 +8262,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7842,19 +8284,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7864,19 +8306,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7886,7 +8328,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -7895,29 +8337,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -7925,19 +8367,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7947,19 +8389,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7969,19 +8411,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -7991,19 +8433,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8013,7 +8455,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -8022,29 +8464,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8052,19 +8494,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8074,19 +8516,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8096,19 +8538,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8118,19 +8560,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8140,7 +8582,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -8149,29 +8591,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8179,19 +8621,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8201,19 +8643,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8223,19 +8665,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8245,19 +8687,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8267,7 +8709,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -8276,29 +8718,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8306,19 +8748,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8328,19 +8770,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8350,19 +8792,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8372,19 +8814,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8394,7 +8836,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -8403,29 +8845,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 1.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.7 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8433,19 +8875,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 16 lines { - width: 1.0 + width: 2.0 color: 3355426 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8455,37 +8897,37 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 17 lines { - width: 3.4 + width: 5.8 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.4 + width: 6.8 color: 4473924 dashdot { dd: 2.0 dd: 2.0 } - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.2 + width: 2.4 color: 3355426 dashdot { - dd: 2.0 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1515 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8495,37 +8937,37 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16444 } } element { scale: 18 lines { - width: 4.6 + width: 7.8 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.6 + width: 8.8 color: 4473924 dashdot { dd: 2.0 dd: 2.0 } - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.8 + width: 3.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 7.2 + dd: 2.7 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8535,37 +8977,37 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } element { scale: 19 lines { - width: 5.0 + width: 9.0 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 + width: 10.0 color: 4473924 dashdot { dd: 2.0 dd: 2.0 } - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 + width: 4.0 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 9.0 + dd: 3.6 } - priority: 1671 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -8575,7 +9017,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16671 + priority: 16444 } } } @@ -8584,39 +9026,39 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -8624,9 +9066,9 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8634,43 +9076,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 + width: 4.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -8678,7 +9120,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8688,15 +9130,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8706,7 +9148,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } } @@ -8715,39 +9157,39 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -8755,9 +9197,9 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8765,43 +9207,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 + width: 4.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -8809,7 +9251,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8819,15 +9261,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8837,7 +9279,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } } @@ -8846,39 +9288,39 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -8886,9 +9328,9 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -8896,65 +9338,65 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 6.5 + width: 6.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 - color: 2236945 - priority: 1484 + width: 4.0 + color: 3026460 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 9.2 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.2 - color: 2236945 - priority: 1484 + width: 6.0 + color: 3026460 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -8966,14 +9408,14 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 2236945 - priority: 1484 + color: 3026460 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -8983,26 +9425,26 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 11.0 + width: 14.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 - color: 2236945 - priority: 1484 + width: 12.0 + color: 3026460 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -9012,7 +9454,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } } @@ -9021,322 +9463,281 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2570265088 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2150834688 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 858989056 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 2.0 - color: 439558656 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 2.8 - color: 439558656 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 3.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 4.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 6.8 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.8 - color: 0 - priority: 1218 + width: 6.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 9.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 0 - priority: 1218 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { - height: 9 - color: 10066329 + height: 10 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 14.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 12.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 14.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 15.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } } @@ -9345,420 +9746,379 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2570265088 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2150834688 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 858989056 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 2.0 - color: 439558656 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 2.8 - color: 439558656 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { - width: 8.4 + width: 6.0 color: 2236945 - priority: 1139 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.8 + width: 6.4 color: 4473924 - priority: 1124 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 3.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { - width: 10.0 + width: 7.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 10.8 + width: 8.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 5.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 4.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 9.6 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 10.4 + color: 4473924 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 13 + color: 3355443 + stroke_color: 2148602112 + } + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 24 + } + } + element { + scale: 16 + lines { + width: 6.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 6.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } - path_text { - primary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - } - priority: 16593 - } - shield { - height: 9 - color: 10066329 - stroke_color: 0 - priority: 16593 - } - } - element { - scale: 16 - lines { - width: 6.8 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 17.6 - color: 2236945 - priority: 1420 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 18.4 - color: 4473924 - priority: 1405 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 8.8 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 9.0 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 22.6 + width: 19.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 24.2 + width: 21.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 10.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { - height: 9 - color: 10066329 + height: 10 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 14.0 - color: 3351040 - priority: 1593 + width: 12.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 34.0 + width: 26.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 36.0 + width: 28.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 14.0 - color: 3351040 - priority: 1593 + width: 15.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } + lines { + width: 32.0 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } lines { width: 34.0 - color: 2236945 - priority: 1420 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 36.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } } @@ -9767,74 +10127,81 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2570265088 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2150834688 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 858989056 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { @@ -9846,37 +10213,31 @@ cont { dd: 2.0 dd: 2.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16557154 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { @@ -9888,37 +10249,31 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.8 - color: 439558656 - priority: 1593 + color: 16557154 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { @@ -9930,37 +10285,31 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.8 - color: 3351040 - priority: 1593 + color: 16557154 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { @@ -9972,79 +10321,67 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 8.8 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.8 - color: 0 - priority: 1218 + width: 6.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { @@ -10056,121 +10393,156 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 0 - priority: 1218 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { - height: 9 - color: 10066329 + height: 10 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 16.0 + width: 14.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 12.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 16.0 + width: 17.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 15.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 + } + } +} +cont { + name: "highway-motorway_junction" + element { + scale: 15 + caption { + primary { + height: 9 + color: 5592405 + } + priority: 15652 + } + } + element { + scale: 16 + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15652 + } + } + element { + scale: 17 + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15652 + } + } + element { + scale: 18 + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15652 + } + } + element { + scale: 19 + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15652 } } } @@ -10181,10 +10553,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -10192,10 +10564,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -10203,68 +10575,70 @@ cont { path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 0.8 - color: 2236945 - priority: 1406 + width: 2.8 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 14 lines { - width: 1.9 - color: 2236945 - priority: 1406 + width: 3.8 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 2.4 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -10272,57 +10646,58 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 3.4 - color: 2236945 - priority: 1406 + width: 3.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 6.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -10332,15 +10707,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 7.5 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -10350,7 +10725,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } } @@ -10361,10 +10736,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -10372,10 +10747,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -10383,94 +10758,96 @@ cont { path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 0.8 - color: 2236945 - priority: 1406 + width: 2.8 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 14 - lines { - width: 1.9 - color: 2236945 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } lines { width: 3.8 - color: 2236945 - priority: 1420 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 + width: 7.6 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 8.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 2.4 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 4.8 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -10480,99 +10857,100 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 3.4 - color: 2236945 - priority: 1406 + width: 3.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.8 + width: 6.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.6 + width: 6.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 10.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 6.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 14.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 + width: 16.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -10582,29 +10960,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 7.5 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 17.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 + width: 19.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -10614,7 +10992,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } } @@ -10625,10 +11003,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -10636,10 +11014,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -10647,80 +11025,82 @@ cont { path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 2.8 + width: 4.8 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 2236945 - priority: 1406 + width: 2.8 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 14 lines { - width: 3.9 + width: 5.8 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.9 - color: 2236945 - priority: 1406 + width: 3.8 + color: 16557154 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { @@ -10732,16 +11112,16 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.4 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -10749,42 +11129,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 5.4 + width: 5.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.4 - color: 2236945 - priority: 1406 + width: 3.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { @@ -10796,43 +11177,43 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 9.0 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 6.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -10842,26 +11223,26 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 9.0 + width: 9.5 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 7.5 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -10871,7 +11252,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } } @@ -10880,29 +11261,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -10910,29 +11291,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -10941,20 +11322,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -10963,10 +11344,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -10976,19 +11357,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -10998,7 +11379,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -11007,29 +11388,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11037,29 +11418,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11068,20 +11449,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11090,10 +11471,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11103,19 +11484,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11125,7 +11506,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -11134,29 +11515,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11164,29 +11545,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11195,20 +11576,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11217,10 +11598,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11230,19 +11611,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11252,7 +11633,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -11261,29 +11642,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11291,29 +11672,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11322,20 +11703,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11344,10 +11725,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11357,19 +11738,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11379,7 +11760,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -11388,29 +11769,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11418,29 +11799,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11449,20 +11830,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11471,10 +11852,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11484,19 +11865,37 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 9.0 + color: 2236945 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 10.0 + color: 4473924 + dashdot { + dd: 2.0 + dd: 2.0 + } + priority: 1096 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11506,7 +11905,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -11515,29 +11914,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11545,29 +11944,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11576,20 +11975,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11598,10 +11997,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11611,19 +12010,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11633,7 +12032,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -11642,29 +12041,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11672,29 +12071,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11703,20 +12102,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11725,10 +12124,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11738,19 +12137,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11760,7 +12159,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -11769,29 +12168,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11799,29 +12198,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11830,20 +12229,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11852,10 +12251,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11865,19 +12264,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11887,7 +12286,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -11896,29 +12295,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -11926,29 +12325,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11957,20 +12356,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -11979,10 +12378,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -11992,19 +12391,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12014,7 +12413,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -12023,29 +12422,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12053,29 +12452,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12084,20 +12483,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12106,10 +12505,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12119,19 +12518,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12141,7 +12540,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -12150,29 +12549,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12180,29 +12579,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12211,20 +12610,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12233,10 +12632,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12246,19 +12645,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12268,7 +12667,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -12277,29 +12676,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12307,29 +12706,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12338,20 +12737,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12360,10 +12759,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12373,19 +12772,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12395,7 +12794,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -12404,29 +12803,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12434,29 +12833,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12465,20 +12864,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12487,10 +12886,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12500,19 +12899,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12522,7 +12921,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -12531,29 +12930,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12561,29 +12960,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12592,20 +12991,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12614,10 +13013,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12627,19 +13026,19 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12649,7 +13048,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -12658,29 +13057,29 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1437 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12688,29 +13087,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16640 + priority: 16444 } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12719,20 +13118,20 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { @@ -12741,10 +13140,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12754,19 +13153,37 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } element { scale: 19 lines { - width: 3.8 + width: 9.0 + color: 2236945 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 10.0 + color: 4473924 + dashdot { + dd: 2.0 + dd: 2.0 + } + priority: 1096 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -12776,7 +13193,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16437 + priority: 16444 } } } @@ -12785,51 +13202,51 @@ cont { element { scale: 13 lines { - width: 0.7 - color: 1295201058 + width: 1.0 + color: 3355426 dashdot { dd: 2.0 dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.9 - color: 858993442 + width: 1.6 + color: 3355426 dashdot { - dd: 2.0 - dd: 1.0 + dd: 3.6 + dd: 1.44 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { scale: 15 lines { - width: 1.6 - color: 858993442 + width: 2.0 + color: 3355426 dashdot { + dd: 5.0 dd: 2.0 - dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -12837,63 +13254,63 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { scale: 16 lines { - width: 2.2 + width: 2.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 5.4 + dd: 2.7 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { scale: 17 lines { - width: 3.2 - color: 3355426 - dashdot { - dd: 6.0 - dd: 3.0 - } - priority: 1468 - join: ROUNDJOIN - cap: ROUNDCAP - } - path_text { - primary { - height: 12 - color: 7829367 - stroke_color: 2148602112 - } - priority: 16468 - } - } - element { - scale: 18 - lines { - width: 4.6 + width: 3.0 color: 3355426 dashdot { dd: 5.0 dd: 2.0 } - priority: 1468 + priority: 1000 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 11 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16000 + } + } + element { + scale: 18 + lines { + width: 4.0 + color: 3355426 + dashdot { + dd: 7.0 + dd: 3.0 + } + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } @@ -12903,7 +13320,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { @@ -12912,10 +13329,10 @@ cont { width: 5.0 color: 3355426 dashdot { - dd: 5.0 - dd: 2.0 + dd: 16.2 + dd: 8.1 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } @@ -12925,7 +13342,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } } @@ -12934,137 +13351,59 @@ cont { element { scale: 13 lines { - width: 0.7 - color: 1295201058 + width: 1.0 + color: 3355426 dashdot { dd: 2.0 dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.9 - color: 858993442 + width: 1.6 + color: 3355426 dashdot { - dd: 2.0 - dd: 1.0 + dd: 3.6 + dd: 1.44 } - priority: 1203 + priority: 1166 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16203 + priority: 16166 } } element { scale: 15 lines { - width: 1.6 - color: 858993442 - dashdot { - dd: 2.0 - dd: 1.0 - } - priority: 1203 - join: ROUNDJOIN - cap: ROUNDCAP - } - area { - color: 3005358609 - priority: -15797 - } - caption { - primary { - height: 11 - color: 10066329 - stroke_color: 2148602112 - } - priority: 15203 - } - } - element { - scale: 16 - lines { - width: 2.2 - color: 3355426 - dashdot { - dd: 3.0 - dd: 1.5 - } - priority: 1203 - join: ROUNDJOIN - cap: ROUNDCAP - } - area { - color: 3005358609 - priority: -15797 - } - caption { - primary { - height: 11 - color: 10066329 - stroke_color: 2148602112 - } - priority: 15203 - } - } - element { - scale: 17 - lines { - width: 3.2 - color: 3355426 - dashdot { - dd: 6.0 - dd: 3.0 - } - priority: 1203 - join: ROUNDJOIN - cap: ROUNDCAP - } - area { - color: 3005358609 - priority: -15797 - } - caption { - primary { - height: 11 - color: 10066329 - stroke_color: 2148602112 - } - priority: 15203 - } - } - element { - scale: 18 - lines { - width: 4.6 + width: 2.0 color: 3355426 dashdot { dd: 5.0 dd: 2.0 } - priority: 1203 + priority: 1166 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { @@ -13072,7 +13411,85 @@ cont { color: 10066329 stroke_color: 2148602112 } - priority: 15203 + priority: 15166 + } + } + element { + scale: 16 + lines { + width: 2.4 + color: 3355426 + dashdot { + dd: 5.4 + dd: 2.7 + } + priority: 1166 + join: ROUNDJOIN + cap: ROUNDCAP + } + area { + color: 3026460 + priority: -15834 + } + caption { + primary { + height: 11 + color: 10066329 + stroke_color: 2148602112 + } + priority: 15166 + } + } + element { + scale: 17 + lines { + width: 3.0 + color: 3355426 + dashdot { + dd: 5.0 + dd: 2.0 + } + priority: 1166 + join: ROUNDJOIN + cap: ROUNDCAP + } + area { + color: 3026460 + priority: -15834 + } + caption { + primary { + height: 11 + color: 10066329 + stroke_color: 2148602112 + } + priority: 15166 + } + } + element { + scale: 18 + lines { + width: 4.0 + color: 3355426 + dashdot { + dd: 7.0 + dd: 3.0 + } + priority: 1166 + join: ROUNDJOIN + cap: ROUNDCAP + } + area { + color: 3026460 + priority: -15834 + } + caption { + primary { + height: 11 + color: 10066329 + stroke_color: 2148602112 + } + priority: 15166 } } element { @@ -13081,16 +13498,16 @@ cont { width: 5.0 color: 3355426 dashdot { - dd: 5.0 - dd: 2.0 + dd: 16.2 + dd: 8.1 } - priority: 1203 + priority: 1166 join: ROUNDJOIN cap: ROUNDCAP } area { - color: 3005358609 - priority: -15797 + color: 3026460 + priority: -15834 } caption { primary { @@ -13098,7 +13515,7 @@ cont { color: 10066329 stroke_color: 2148602112 } - priority: 15203 + priority: 15166 } } } @@ -13107,84 +13524,84 @@ cont { element { scale: 13 lines { - width: 0.7 - color: 1295201058 + width: 1.0 + color: 3355426 dashdot { dd: 2.0 dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { - width: 1.0 + width: 1.6 color: 2236945 - priority: 1452 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } } element { scale: 14 - lines { - width: 0.9 - color: 858993442 - dashdot { - dd: 2.0 - dd: 1.0 - } - priority: 1468 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 1.8 - color: 2236945 - priority: 1420 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 2.2 - color: 4473924 - priority: 1405 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 10 - color: 7829367 - stroke_color: 2148602112 - } - priority: 16468 - } - } - element { - scale: 15 lines { width: 1.6 - color: 858993442 + color: 3355426 dashdot { - dd: 2.0 - dd: 1.0 + dd: 3.6 + dd: 1.44 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 3.2 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.6 color: 4473924 - priority: 1405 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16472 + } + } + element { + scale: 15 + lines { + width: 2.0 + color: 3355426 + dashdot { + dd: 5.0 + dd: 2.0 + } + priority: 1472 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.4 + color: 4473924 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -13194,105 +13611,105 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { scale: 16 lines { - width: 2.2 + width: 2.4 color: 3355426 dashdot { - dd: 3.0 - dd: 1.5 + dd: 5.4 + dd: 2.7 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.8 + width: 5.2 color: 2236945 - priority: 1499 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.6 + width: 6.0 color: 4473924 - priority: 1483 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { scale: 17 lines { - width: 3.2 - color: 3355426 - dashdot { - dd: 6.0 - dd: 3.0 - } - priority: 1468 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.8 - color: 2236945 - priority: 1499 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 7.6 - color: 4473924 - priority: 1483 - join: ROUNDJOIN - cap: BUTTCAP - } - path_text { - primary { - height: 12 - color: 7829367 - stroke_color: 2148602112 - } - priority: 16468 - } - } - element { - scale: 18 - lines { - width: 4.6 + width: 3.0 color: 3355426 dashdot { dd: 5.0 dd: 2.0 } - priority: 1468 + priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.6 + width: 6.4 color: 2236945 - priority: 1655 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 10.4 + width: 7.2 color: 4473924 - priority: 1639 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16000 + } + } + element { + scale: 18 + lines { + width: 4.0 + color: 3355426 + dashdot { + dd: 7.0 + dd: 3.0 + } + priority: 1472 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 8.4 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 9.2 + color: 4473924 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -13302,7 +13719,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { @@ -13311,24 +13728,24 @@ cont { width: 5.0 color: 3355426 dashdot { - dd: 5.0 - dd: 2.0 + dd: 16.2 + dd: 8.1 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 10.4 color: 2236945 - priority: 1655 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 11.2 color: 4473924 - priority: 1639 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -13338,7 +13755,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } } @@ -13347,51 +13764,51 @@ cont { element { scale: 13 lines { - width: 0.7 - color: 1295201058 + width: 1.0 + color: 3355426 dashdot { dd: 2.0 dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.9 - color: 858993442 + width: 1.6 + color: 3355426 dashdot { - dd: 2.0 - dd: 1.0 + dd: 3.6 + dd: 1.44 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { scale: 15 lines { - width: 1.6 - color: 858993442 + width: 2.0 + color: 3355426 dashdot { + dd: 5.0 dd: 2.0 - dd: 1.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -13399,96 +13816,96 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { scale: 16 lines { - width: 4.2 + width: 4.4 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1467 + priority: 1471 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.2 - color: 2236945 + width: 2.4 + color: 3026460 dashdot { - dd: 3.0 - dd: 1.5 + dd: 5.4 + dd: 2.7 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { scale: 17 lines { - width: 5.2 + width: 5.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1467 + priority: 999 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.2 - color: 2236945 + width: 3.0 + color: 3026460 dashdot { - dd: 6.0 - dd: 3.0 + dd: 5.0 + dd: 2.0 } - priority: 1468 + priority: 1000 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16000 } } element { scale: 18 lines { - width: 6.6 + width: 6.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1467 + priority: 1471 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 - color: 2236945 + width: 4.0 + color: 3026460 dashdot { - dd: 5.0 - dd: 2.0 + dd: 7.0 + dd: 3.0 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } @@ -13498,7 +13915,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } element { @@ -13510,18 +13927,18 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1467 + priority: 1471 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.0 - color: 2236945 + color: 3026460 dashdot { - dd: 5.0 - dd: 2.0 + dd: 16.2 + dd: 8.1 } - priority: 1468 + priority: 1472 join: ROUNDJOIN cap: ROUNDCAP } @@ -13531,997 +13948,892 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16468 + priority: 16472 } } } cont { name: "highway-primary" + element { + scale: 8 + lines { + width: 0.5 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP + } + } element { scale: 9 lines { - width: 0.1 - color: 2570269457 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 - color: 858993425 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16597 + min_distance: 18 } } element { scale: 11 lines { - width: 1.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.4 + color: 16553815 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16597 + min_distance: 18 } } element { scale: 12 lines { - width: 1.5 - color: 439563025 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 20 } } element { scale: 13 lines { - width: 2.5 - color: 3355409 - priority: 1578 + width: 2.4 + color: 16557154 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 - color: 3355409 - priority: 1578 + width: 2.9 + color: 16553815 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 - color: 3355409 - priority: 1578 + width: 4.2 + color: 16557154 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 24 } } element { scale: 16 lines { - width: 6.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 7.2 - color: 0 - priority: 1218 + width: 4.8 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 17 lines { - width: 9.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 0 - priority: 1218 + width: 7.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 18 lines { - width: 14.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 10.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 19 lines { - width: 14.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 13.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } } cont { name: "highway-primary-bridge" + element { + scale: 8 + lines { + width: 0.5 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP + } + } element { scale: 9 lines { - width: 0.1 - color: 2570269457 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 - color: 858993425 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16597 + min_distance: 18 } } element { scale: 11 lines { - width: 1.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.4 + color: 16553815 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16597 + min_distance: 18 } } element { scale: 12 lines { - width: 1.5 - color: 439563025 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 20 } } element { scale: 13 lines { - width: 2.5 - color: 3355409 - priority: 1578 + width: 2.4 + color: 16557154 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 - color: 3355409 - priority: 1578 + width: 2.9 + color: 16553815 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { - width: 8.0 + width: 5.8 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.8 + width: 6.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 - color: 3355409 - priority: 1578 + width: 4.2 + color: 16557154 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { - width: 11.0 + width: 8.4 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 11.8 + width: 9.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 5.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 24 } } element { scale: 16 lines { - width: 6.0 - color: 3355409 - priority: 1578 + width: 4.8 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 14.4 + width: 9.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 15.2 + width: 10.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 7.2 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 17 lines { - width: 9.0 - color: 3355409 - priority: 1578 + width: 7.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 22.6 + width: 15.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 24.2 + width: 17.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 10.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 18 lines { - width: 14.0 - color: 3355409 - priority: 1578 + width: 10.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 34.0 + width: 22.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 36.0 + width: 24.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 19 lines { - width: 14.0 - color: 3355409 - priority: 1578 + width: 13.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 34.0 + width: 28.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 36.0 + width: 30.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } } cont { name: "highway-primary-tunnel" + element { + scale: 8 + lines { + width: 0.5 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP + } + } element { scale: 9 lines { - width: 0.1 - color: 2570269457 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 0.9 - color: 858993425 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16597 + min_distance: 18 } } element { scale: 11 lines { - width: 1.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.4 + color: 16553815 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16578 + priority: 16597 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16597 + min_distance: 18 } } element { scale: 12 lines { - width: 1.5 - color: 439563025 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 16746062 + priority: 1597 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 20 } } element { scale: 13 lines { - width: 2.5 - color: 3355409 - priority: 1578 + width: 2.4 + color: 16557154 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 20 } } element { scale: 14 lines { - width: 4.8 + width: 4.9 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.8 - color: 3355409 - priority: 1578 + width: 2.9 + color: 16557154 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 25 } } element { scale: 15 lines { - width: 5.8 + width: 6.2 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.8 - color: 3355409 - priority: 1578 + width: 4.2 + color: 16557154 + priority: 1597 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16578 + priority: 16597 + min_distance: 24 } } element { scale: 16 lines { - width: 8.0 + width: 6.8 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 7.2 - color: 0 - priority: 1218 + width: 4.8 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 17 lines { - width: 11.0 + width: 9.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 0 - priority: 1218 + width: 7.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 18 lines { - width: 16.0 + width: 12.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 10.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } element { scale: 19 lines { - width: 16.0 + width: 15.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1577 + priority: 1596 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 3355409 - priority: 1578 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 13.0 + color: 16557154 + priority: 1597 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16578 + priority: 16597 } } } @@ -14531,22 +14843,22 @@ cont { scale: 10 path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16406 + priority: 16000 } } element { scale: 11 path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16406 + priority: 16000 } } element { @@ -14554,10 +14866,10 @@ cont { path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -14565,44 +14877,45 @@ cont { path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 14 lines { - width: 1.4 - color: 2236945 - priority: 1406 + width: 2.9 + color: 16553815 + priority: 1583 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16583 + min_distance: 20 } } element { scale: 15 lines { - width: 1.9 - color: 2236945 - priority: 1406 + width: 2.1 + color: 16557154 + priority: 1583 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -14610,57 +14923,58 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16583 + min_distance: 24 } } element { scale: 16 lines { - width: 3.0 - color: 2236945 - priority: 1406 + width: 2.4 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { scale: 17 lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 3.5 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { scale: 18 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 5.0 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } @@ -14670,15 +14984,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { scale: 19 lines { width: 7.0 - color: 2236945 - priority: 1406 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } @@ -14688,7 +15002,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } } @@ -14698,22 +15012,22 @@ cont { scale: 10 path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16406 + priority: 16000 } } element { scale: 11 path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16406 + priority: 16000 } } element { @@ -14721,10 +15035,10 @@ cont { path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -14732,70 +15046,71 @@ cont { path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 14 lines { - width: 1.4 - color: 2236945 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 2236945 - priority: 1420 + width: 2.9 + color: 16553815 + priority: 1583 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.6 + width: 5.8 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 6.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16583 + min_distance: 20 } } element { scale: 15 lines { - width: 1.9 - color: 2236945 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.8 - color: 2236945 - priority: 1420 + width: 2.1 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 + width: 4.2 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 5.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -14805,99 +15120,100 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16583 + min_distance: 24 } } element { scale: 16 lines { - width: 3.0 - color: 2236945 - priority: 1406 + width: 2.4 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.0 + width: 4.8 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 + width: 5.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { scale: 17 lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 3.5 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 10.6 + width: 8.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.2 + width: 10.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { scale: 18 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 5.0 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 12.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 + width: 14.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -14907,29 +15223,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { scale: 19 lines { width: 7.0 - color: 2236945 - priority: 1406 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 16.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 18.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -14939,7 +15255,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } } @@ -14949,22 +15265,22 @@ cont { scale: 10 path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16406 + priority: 16000 } } element { scale: 11 path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 3004240128 } - priority: 16406 + priority: 16000 } } element { @@ -14972,10 +15288,10 @@ cont { path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -14983,55 +15299,67 @@ cont { path_text { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 14 lines { - width: 3.4 + width: 4.9 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.4 - color: 2236945 - priority: 1406 + width: 2.9 + color: 16557154 + priority: 1583 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16583 + min_distance: 20 } } element { scale: 15 lines { - width: 1.9 - color: 2236945 - priority: 1406 + width: 4.1 + color: 0 + dashdot { + dd: 5.0 + dd: 5.0 + } + priority: 1582 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + lines { + width: 2.1 + color: 16557154 + priority: 1583 + join: ROUNDJOIN + cap: BUTTCAP } path_text { primary { @@ -15039,90 +15367,91 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16583 + min_distance: 24 } } element { scale: 16 lines { - width: 5.0 + width: 4.4 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.0 - color: 2236945 - priority: 1406 + width: 2.4 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { scale: 17 lines { - width: 6.5 + width: 5.5 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 3.5 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { scale: 18 lines { - width: 9.0 + width: 7.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 5.0 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } @@ -15132,7 +15461,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } element { @@ -15144,14 +15473,14 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1582 join: ROUNDJOIN cap: BUTTCAP } lines { width: 7.0 - color: 2236945 - priority: 1406 + color: 16557154 + priority: 1583 join: ROUNDJOIN cap: ROUNDCAP } @@ -15161,7 +15490,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16583 } } } @@ -15170,73 +15499,73 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3424789026 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1515 + width: 1.2 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 857874978 - priority: 1515 + width: 1.8 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 + width: 3.2 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -15244,43 +15573,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 + width: 4.4 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { @@ -15288,7 +15617,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15298,15 +15627,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15316,7 +15645,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } } @@ -15325,73 +15654,73 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3424789026 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1515 + width: 1.2 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 857874978 - priority: 1515 + width: 1.8 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 + width: 3.2 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -15399,43 +15728,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 + width: 4.4 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { @@ -15443,7 +15772,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15453,15 +15782,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15471,7 +15800,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } } @@ -15480,99 +15809,99 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3424789026 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1515 + width: 1.2 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 857874978 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 2236945 - priority: 1420 + width: 1.8 + color: 2236962 + priority: 1541 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.6 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 + width: 3.2 color: 2236962 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 2236945 - priority: 1420 + priority: 1541 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 + width: 6.4 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 7.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -15582,71 +15911,71 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 + width: 4.4 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.0 + width: 8.8 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.8 + width: 9.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 13.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 17.6 + width: 15.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { @@ -15654,21 +15983,21 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 20.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 22.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -15678,29 +16007,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 20.0 + width: 26.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 22.0 + width: 28.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -15710,7 +16039,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } } @@ -15719,73 +16048,73 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3424789026 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1515 + width: 1.2 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 857874978 - priority: 1515 + width: 1.8 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 + width: 3.2 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -15793,65 +16122,65 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 6.5 + width: 6.4 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 - color: 2236945 - priority: 1515 + width: 4.4 + color: 3026460 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 9.2 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.2 - color: 2236962 - priority: 1515 + width: 6.0 + color: 3026460 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { @@ -15863,14 +16192,14 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 2236945 - priority: 1515 + color: 3026460 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15880,26 +16209,26 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 11.0 + width: 14.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 - color: 2236945 - priority: 1515 + width: 12.0 + color: 3026460 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -15909,7 +16238,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } } @@ -15918,31 +16247,31 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -15950,17 +16279,17 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 4.5 + width: 4.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -15968,9 +16297,9 @@ cont { element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -15980,7 +16309,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -15988,9 +16317,9 @@ cont { element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16001,31 +16330,31 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -16033,31 +16362,31 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 4.5 + width: 4.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.0 + width: 8.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.4 + width: 8.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16065,23 +16394,23 @@ cont { element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 14.4 + width: 12.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.8 + width: 12.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16091,21 +16420,21 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 18.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 18.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16113,23 +16442,23 @@ cont { element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 18.0 + width: 24.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.4 + width: 24.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16140,31 +16469,31 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -16172,17 +16501,17 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 4.5 + width: 4.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16190,9 +16519,9 @@ cont { element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16202,7 +16531,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16210,9 +16539,9 @@ cont { element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -16223,101 +16552,122 @@ cont { element { scale: 10 lines { - width: 0.2 - color: 2569151010 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3004240128 } - priority: 16562 + priority: 16569 } } element { scale: 11 lines { - width: 0.7 - color: 857874978 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.1 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3004240128 } - priority: 16562 + priority: 16569 } } element { scale: 12 lines { - width: 1.8 - color: 1294082594 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3003121664 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 20 } } element { scale: 13 lines { - width: 2.0 + width: 2.2 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3003121664 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 + width: 3.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 + width: 4.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -16325,79 +16675,86 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 24 } } element { scale: 16 lines { - width: 5.4 + width: 4.8 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 17 lines { - width: 9.0 + width: 7.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 18 lines { - width: 12.0 + width: 10.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 19 lines { - width: 12.0 + width: 13.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } } @@ -16406,127 +16763,148 @@ cont { element { scale: 10 lines { - width: 0.2 - color: 2569151010 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3004240128 } - priority: 16562 + priority: 16569 } } element { scale: 11 lines { - width: 0.7 - color: 857874978 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.1 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3004240128 } - priority: 16562 + priority: 16569 } } element { scale: 12 lines { - width: 1.8 - color: 1294082594 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3003121664 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 20 } } element { scale: 13 lines { - width: 2.0 + width: 2.2 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3003121664 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 + width: 3.0 color: 2236962 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.6 - color: 2236945 - priority: 1420 + priority: 1569 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.4 + width: 6.0 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 6.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 + width: 4.0 color: 2236962 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 7.6 - color: 2236945 - priority: 1420 + priority: 1569 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.4 + width: 8.0 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 8.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16536,135 +16914,142 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 24 } } element { scale: 16 lines { - width: 5.4 + width: 4.8 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 10.8 + width: 9.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 11.6 + width: 10.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 17 lines { - width: 9.0 + width: 7.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 19.6 + width: 15.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 21.2 + width: 17.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 18 lines { - width: 12.0 + width: 10.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 26.0 + width: 22.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 28.0 + width: 24.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 19 lines { - width: 12.0 + width: 13.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 26.0 + width: 28.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 28.0 + width: 30.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } } @@ -16673,101 +17058,122 @@ cont { element { scale: 10 lines { - width: 0.2 - color: 2569151010 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3004240128 } - priority: 16562 + priority: 16569 } } element { scale: 11 lines { - width: 0.7 - color: 857874978 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.1 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3004240128 } - priority: 16562 + priority: 16569 } } element { scale: 12 lines { - width: 1.8 - color: 1294082594 - priority: 1562 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.6 + color: 2236962 + priority: 1569 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3003121664 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 20 } } element { scale: 13 lines { - width: 2.0 + width: 2.2 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 9 + color: 4473924 stroke_color: 3003121664 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 20 } } element { scale: 14 lines { - width: 2.8 + width: 3.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 25 } } element { scale: 15 lines { - width: 3.8 + width: 4.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -16775,123 +17181,130 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16569 + min_distance: 24 } } element { scale: 16 lines { - width: 7.4 + width: 6.8 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1561 + priority: 1568 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.4 + width: 4.8 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 17 lines { - width: 11.0 + width: 9.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1561 + priority: 1568 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 + width: 7.0 color: 2236962 - priority: 1562 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 18 lines { - width: 14.0 + width: 12.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1561 + priority: 1568 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.0 - color: 2236945 - priority: 1562 + width: 10.0 + color: 3026460 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } element { scale: 19 lines { - width: 14.0 + width: 15.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1561 + priority: 1568 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.0 - color: 2236945 - priority: 1562 + width: 13.0 + color: 3026460 + priority: 1569 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16562 + priority: 16569 } } } @@ -16900,29 +17313,29 @@ cont { element { scale: 14 lines { - width: 1.4 - color: 2236945 - priority: 1406 + width: 1.5 + color: 2236962 + priority: 1555 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.9 - color: 2236945 - priority: 1406 + width: 2.0 + color: 2236962 + priority: 1555 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 2.7 - color: 2236945 - priority: 1406 + width: 2.4 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -16930,9 +17343,9 @@ cont { element { scale: 17 lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 3.5 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -16940,9 +17353,9 @@ cont { element { scale: 18 lines { - width: 6.0 - color: 2236945 - priority: 1406 + width: 5.0 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -16950,9 +17363,9 @@ cont { element { scale: 19 lines { - width: 6.0 - color: 2236945 - priority: 1406 + width: 7.0 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -16963,23 +17376,23 @@ cont { element { scale: 14 lines { - width: 1.4 - color: 2236945 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 2236945 - priority: 1420 + width: 1.5 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.6 + width: 3.0 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -16987,23 +17400,23 @@ cont { element { scale: 15 lines { - width: 1.9 - color: 2236945 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.8 - color: 2236945 - priority: 1420 + width: 2.0 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 + width: 4.0 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17011,23 +17424,23 @@ cont { element { scale: 16 lines { - width: 2.7 - color: 2236945 - priority: 1406 + width: 2.4 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 + width: 4.8 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.2 + width: 5.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17035,23 +17448,23 @@ cont { element { scale: 17 lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 3.5 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 10.6 + width: 8.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.2 + width: 10.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17059,23 +17472,23 @@ cont { element { scale: 18 lines { - width: 6.0 - color: 2236945 - priority: 1406 + width: 5.0 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 14.0 + width: 12.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 16.0 + width: 14.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17083,23 +17496,23 @@ cont { element { scale: 19 lines { - width: 6.0 - color: 2236945 - priority: 1406 + width: 7.0 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 14.0 + width: 16.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 16.0 + width: 18.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17110,40 +17523,40 @@ cont { element { scale: 14 lines { - width: 1.4 - color: 2236945 - priority: 1406 + width: 1.5 + color: 2236962 + priority: 1555 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.9 - color: 2236945 - priority: 1406 + width: 2.0 + color: 2236962 + priority: 1555 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 4.7 + width: 4.4 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1554 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.7 - color: 2236945 - priority: 1406 + width: 2.4 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -17151,20 +17564,20 @@ cont { element { scale: 17 lines { - width: 6.5 + width: 5.5 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1554 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 3.5 + color: 2236962 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -17172,20 +17585,20 @@ cont { element { scale: 18 lines { - width: 8.0 + width: 7.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1554 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 2236945 - priority: 1406 + width: 5.0 + color: 3026460 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -17193,20 +17606,20 @@ cont { element { scale: 19 lines { - width: 8.0 + width: 9.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1554 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 - color: 2236945 - priority: 1406 + width: 7.0 + color: 3026460 + priority: 1555 join: ROUNDJOIN cap: ROUNDCAP } @@ -17217,29 +17630,29 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 438444578 - priority: 1437 + width: 1.2 + color: 2236962 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 857874978 - priority: 1468 + width: 1.6 + color: 2236962 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17247,9 +17660,9 @@ cont { element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17259,20 +17672,36 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17280,29 +17709,29 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 438444578 - priority: 1437 + width: 1.2 + color: 2236962 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 857874978 - priority: 1468 + width: 1.6 + color: 2236962 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17310,9 +17739,9 @@ cont { element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17322,20 +17751,36 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17343,43 +17788,43 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 438444578 - priority: 1437 + width: 1.2 + color: 2236962 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 857874978 - priority: 1468 + width: 1.6 + color: 2236962 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 2.8 + width: 3.2 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.2 + width: 3.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17387,23 +17832,23 @@ cont { element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.8 + width: 4.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.2 + width: 4.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17413,48 +17858,64 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 6.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.0 + width: 8.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.4 + width: 8.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17462,19 +17923,19 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17484,20 +17945,36 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17505,19 +17982,19 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17527,20 +18004,36 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17548,33 +18041,33 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.8 + width: 4.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 5.2 + width: 4.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17584,48 +18077,64 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 6.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.0 + width: 8.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.4 + width: 8.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17633,19 +18142,19 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17655,20 +18164,36 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17676,29 +18201,29 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 438444578 - priority: 1437 + width: 1.2 + color: 2236962 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 857874978 - priority: 1468 + width: 1.6 + color: 2236962 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17706,9 +18231,9 @@ cont { element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17718,20 +18243,36 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17739,29 +18280,29 @@ cont { element { scale: 14 lines { - width: 0.2 - color: 2569151010 - priority: 1437 + width: 0.7 + color: 4280427042 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.6 - color: 438444578 - priority: 1437 + width: 1.2 + color: 2236962 + priority: 1458 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.4 - color: 857874978 - priority: 1468 + width: 1.6 + color: 2236962 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17769,9 +18310,9 @@ cont { element { scale: 17 lines { - width: 2.4 + width: 2.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } @@ -17781,20 +18322,36 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } element { scale: 19 lines { - width: 3.0 + width: 4.0 color: 2236962 - priority: 1468 + priority: 1458 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 12 + color: 7829367 + stroke_color: 2148602112 + } + priority: 16458 + } } } cont { @@ -17804,7 +18361,7 @@ cont { symbol { name: "speedcam-m" apply_for_type: 1 - priority: 16890 + priority: 16722 } } element { @@ -17812,7 +18369,7 @@ cont { symbol { name: "speedcam-m" apply_for_type: 1 - priority: 16890 + priority: 16722 } } element { @@ -17820,7 +18377,7 @@ cont { symbol { name: "speedcam-m" apply_for_type: 1 - priority: 16890 + priority: 16722 } } element { @@ -17828,7 +18385,7 @@ cont { symbol { name: "speedcam-m" apply_for_type: 1 - priority: 16890 + priority: 16722 } } } @@ -17837,13 +18394,13 @@ cont { element { scale: 16 lines { - width: 4.0 + width: 5.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 1.5 + dd: 1.5 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -17851,13 +18408,13 @@ cont { element { scale: 17 lines { - width: 6.0 + width: 7.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.3 + dd: 2.3 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -17865,13 +18422,13 @@ cont { element { scale: 18 lines { - width: 8.0 + width: 9.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.2 + dd: 3.2 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -17879,13 +18436,13 @@ cont { element { scale: 19 lines { - width: 10.0 + width: 11.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 4.0 + dd: 4.0 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -17896,27 +18453,27 @@ cont { element { scale: 16 lines { - width: 4.0 + width: 5.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 1.5 + dd: 1.5 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 8.0 + width: 10.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.4 + width: 10.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17924,27 +18481,27 @@ cont { element { scale: 17 lines { - width: 6.0 + width: 7.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.3 + dd: 2.3 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 12.0 + width: 14.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 12.4 + width: 14.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17952,27 +18509,27 @@ cont { element { scale: 18 lines { - width: 8.0 + width: 9.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.2 + dd: 3.2 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 18.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 16.4 + width: 18.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -17980,27 +18537,27 @@ cont { element { scale: 19 lines { - width: 10.0 + width: 11.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 4.0 + dd: 4.0 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 20.0 + width: 22.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 20.4 + width: 22.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18011,13 +18568,13 @@ cont { element { scale: 16 lines { - width: 4.0 + width: 5.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 1.5 + dd: 1.5 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -18025,13 +18582,13 @@ cont { element { scale: 17 lines { - width: 6.0 + width: 7.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.3 + dd: 2.3 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -18039,13 +18596,13 @@ cont { element { scale: 18 lines { - width: 8.0 + width: 9.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 3.2 + dd: 3.2 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -18053,13 +18610,13 @@ cont { element { scale: 19 lines { - width: 10.0 + width: 11.0 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 4.0 + dd: 4.0 } - priority: 1000 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -18070,73 +18627,73 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3424789026 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1515 + width: 1.2 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 857874978 - priority: 1515 + width: 1.8 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 + width: 3.2 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -18144,43 +18701,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 + width: 4.4 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { @@ -18188,7 +18745,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -18198,15 +18755,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -18216,7 +18773,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } } @@ -18225,99 +18782,99 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3424789026 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1515 + width: 1.2 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 857874978 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 2236945 - priority: 1420 + width: 1.8 + color: 2236962 + priority: 1541 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.6 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 + width: 3.2 color: 2236962 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 2236945 - priority: 1420 + priority: 1541 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 + width: 6.4 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 7.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18327,71 +18884,71 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 4.5 + width: 4.4 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.0 + width: 8.8 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.8 + width: 9.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 13.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 17.6 + width: 15.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { @@ -18399,21 +18956,21 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 20.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 22.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18423,29 +18980,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 20.0 + width: 26.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 22.0 + width: 28.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18455,7 +19012,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } } @@ -18464,73 +19021,73 @@ cont { element { scale: 11 lines { - width: 0.1 - color: 3424789026 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.4 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1515 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1515 + width: 1.2 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 - color: 6710886 + height: 8 + color: 4473924 } - priority: 16515 + priority: 16541 } } element { scale: 14 lines { - width: 1.4 - color: 857874978 - priority: 1515 + width: 1.8 + color: 2236962 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 15 lines { - width: 3.0 + width: 3.2 color: 2236962 - priority: 1515 + priority: 1541 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -18538,65 +19095,65 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 16 lines { - width: 6.5 + width: 6.4 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 - color: 2236945 - priority: 1515 + width: 4.4 + color: 3026460 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 17 lines { - width: 9.2 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.2 - color: 2236962 - priority: 1515 + width: 6.0 + color: 3026460 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { @@ -18608,14 +19165,14 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 2236945 - priority: 1515 + color: 3026460 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -18625,26 +19182,26 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } element { scale: 19 lines { - width: 11.0 + width: 14.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1514 + priority: 1540 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 - color: 2236945 - priority: 1515 + width: 12.0 + color: 3026460 + priority: 1541 join: ROUNDJOIN cap: ROUNDCAP } @@ -18654,7 +19211,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16515 + priority: 16541 } } } @@ -18663,19 +19220,19 @@ cont { element { scale: 15 lines { - width: 1.5 - color: 2236945 - priority: 1406 + width: 1.6 + color: 2236962 + priority: 1527 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { width: 2.2 - color: 2236945 - priority: 1406 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18683,9 +19240,9 @@ cont { element { scale: 17 lines { - width: 3.6 - color: 2236945 - priority: 1406 + width: 3.0 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18694,8 +19251,8 @@ cont { scale: 18 lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18703,9 +19260,9 @@ cont { element { scale: 19 lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 6.0 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18716,23 +19273,23 @@ cont { element { scale: 15 lines { - width: 1.5 - color: 2236945 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.0 - color: 2236945 - priority: 1420 + width: 1.6 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.8 + width: 3.2 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18741,22 +19298,22 @@ cont { scale: 16 lines { width: 2.2 - color: 2236945 - priority: 1406 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 4.4 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18764,23 +19321,23 @@ cont { element { scale: 17 lines { - width: 3.6 - color: 2236945 - priority: 1406 + width: 3.0 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 8.8 + width: 7.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 10.4 + width: 9.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18789,22 +19346,22 @@ cont { scale: 18 lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 11.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 13.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18812,23 +19369,23 @@ cont { element { scale: 19 lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 6.0 + color: 2236962 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 11.0 + width: 14.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 13.0 + width: 16.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -18839,11 +19396,11 @@ cont { element { scale: 15 lines { - width: 1.5 - color: 2236945 - priority: 1406 + width: 1.6 + color: 2236962 + priority: 1527 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { @@ -18855,14 +19412,14 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1526 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.2 - color: 2236945 - priority: 1406 + color: 3026460 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18870,20 +19427,20 @@ cont { element { scale: 17 lines { - width: 5.6 + width: 5.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1526 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.6 - color: 2236945 - priority: 1406 + width: 3.0 + color: 3026460 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18897,14 +19454,14 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1526 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 3026460 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18912,20 +19469,20 @@ cont { element { scale: 19 lines { - width: 6.5 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1526 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 - color: 2236945 - priority: 1406 + width: 6.0 + color: 3026460 + priority: 1527 join: ROUNDJOIN cap: ROUNDCAP } @@ -18936,41 +19493,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -18981,10 +19538,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -18995,10 +19552,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19006,13 +19563,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19023,41 +19580,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19068,10 +19625,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19082,10 +19639,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19093,13 +19650,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19110,41 +19667,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19155,10 +19712,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19169,10 +19726,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19180,13 +19737,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19197,41 +19754,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19242,10 +19799,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19256,10 +19813,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19267,13 +19824,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19284,41 +19841,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19329,10 +19886,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19343,10 +19900,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19354,13 +19911,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19371,41 +19928,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19416,10 +19973,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19430,10 +19987,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19441,13 +19998,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19458,41 +20015,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19503,10 +20060,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19517,10 +20074,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19528,13 +20085,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19545,41 +20102,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19590,10 +20147,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19604,10 +20161,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19615,13 +20172,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19632,41 +20189,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19677,10 +20234,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19691,10 +20248,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19702,13 +20259,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19719,41 +20276,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19764,10 +20321,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19778,10 +20335,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19789,13 +20346,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19806,41 +20363,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19851,10 +20408,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19865,10 +20422,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19876,13 +20433,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19893,41 +20450,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19938,10 +20495,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19952,10 +20509,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19963,13 +20520,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -19980,41 +20537,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20025,10 +20582,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20039,10 +20596,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20050,13 +20607,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20067,41 +20624,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20112,10 +20669,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20126,10 +20683,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20137,13 +20694,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20154,41 +20711,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20199,10 +20756,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20213,10 +20770,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20224,13 +20781,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20241,41 +20798,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20286,10 +20843,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20300,10 +20857,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20311,13 +20868,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20328,41 +20885,41 @@ cont { element { scale: 14 lines { - width: 0.1 + width: 0.9 color: 2236962 dashdot { - dd: 1.0 - dd: 1.0 + dd: 2.52 + dd: 1.35 } - priority: 1406 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 + width: 1.3 color: 2236962 dashdot { - dd: 2.0 - dd: 1.0 + dd: 2.7 + dd: 1.26 } - priority: 1640 + priority: 1444 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.2 + width: 1.8 color: 2236962 dashdot { - dd: 3.0 - dd: 1.5 + dd: 3.6 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20373,10 +20930,10 @@ cont { width: 2.0 color: 2236962 dashdot { - dd: 3.5 - dd: 2.0 + dd: 4.5 + dd: 1.8 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20387,10 +20944,10 @@ cont { width: 3.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 7.2 + dd: 2.7 } - priority: 1437 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20398,13 +20955,13 @@ cont { element { scale: 19 lines { - width: 3.8 + width: 4.0 color: 2236962 dashdot { - dd: 5.0 - dd: 3.0 + dd: 9.0 + dd: 3.6 } - priority: 1406 + priority: 1444 join: ROUNDJOIN cap: ROUNDCAP } @@ -20415,322 +20972,281 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2570265088 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2150834688 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 858989056 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 2.0 - color: 439558656 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 2.8 - color: 439558656 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 3.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 4.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 6.8 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.8 - color: 0 - priority: 1218 + width: 6.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 9.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 0 - priority: 1218 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { - height: 9 - color: 10066329 + height: 10 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 14.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 12.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 14.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 15.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } } @@ -20739,420 +21255,379 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2570265088 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2150834688 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 858989056 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 12 lines { width: 2.0 - color: 439558656 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 13 lines { width: 2.8 - color: 439558656 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { - width: 8.4 + width: 6.0 color: 2236945 - priority: 1139 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 8.8 + width: 6.4 color: 4473924 - priority: 1124 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 14 lines { width: 3.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { - width: 10.0 + width: 7.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 10.8 + width: 8.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 5.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { scale: 15 lines { width: 4.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 9.6 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 10.4 + color: 4473924 + priority: 1360 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 13 + color: 3355443 + stroke_color: 2148602112 + } + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 24 + } + } + element { + scale: 16 + lines { + width: 6.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 12.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 6.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } - path_text { - primary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - } - priority: 16593 - } - shield { - height: 9 - color: 10066329 - stroke_color: 0 - priority: 16593 - } - } - element { - scale: 16 - lines { - width: 6.8 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 17.6 - color: 2236945 - priority: 1420 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 18.4 - color: 4473924 - priority: 1405 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 8.8 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 17 lines { width: 9.0 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 22.6 + width: 19.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 24.2 + width: 21.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 10.5 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { - height: 9 - color: 10066329 + height: 10 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 14.0 - color: 3351040 - priority: 1593 + width: 12.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 34.0 + width: 26.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 36.0 + width: 28.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 14.0 - color: 3351040 - priority: 1593 + width: 15.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } + lines { + width: 32.0 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } lines { width: 34.0 - color: 2236945 - priority: 1420 - join: ROUNDJOIN - cap: BUTTCAP - } - lines { - width: 36.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } - lines { - width: 16.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP - } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } } @@ -21161,74 +21636,81 @@ cont { element { scale: 7 lines { - width: 0.3 - color: 2570265088 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 8 lines { - width: 0.6 - color: 2150834688 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.7 + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 9 lines { - width: 0.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.0 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 10 lines { - width: 1.2 - color: 858989056 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP + width: 1.3 + color: 16280377 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { scale: 11 lines { width: 1.8 - color: 1295196672 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16284746 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 + } + shield { + height: 9 + color: 9474192 + stroke_color: 0 + priority: 16625 + min_distance: 18 } } element { @@ -21240,37 +21722,31 @@ cont { dd: 2.0 dd: 2.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 3.2 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + color: 16557154 + priority: 1625 + join: BEVELJOIN + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { @@ -21282,37 +21758,31 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.8 - color: 439558656 - priority: 1593 + color: 16557154 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 4.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { @@ -21324,37 +21794,31 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.8 - color: 3351040 - priority: 1593 + color: 16557154 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 5.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 20 } } element { @@ -21366,79 +21830,67 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.8 - color: 3351040 - priority: 1593 + color: 16284746 + priority: 1625 join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 6.0 - color: 0 - priority: 1218 - join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 24 } } element { scale: 16 lines { - width: 8.8 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.8 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 8.8 - color: 0 - priority: 1218 + width: 6.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { @@ -21450,121 +21902,103 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 10.5 - color: 0 - priority: 1218 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { - height: 9 - color: 10066329 + height: 10 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 25 } } element { scale: 18 lines { - width: 16.0 + width: 14.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 12.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } element { scale: 19 lines { - width: 16.0 + width: 17.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1592 + priority: 1624 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 14.0 - color: 3351040 - priority: 1593 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 16.0 - color: 0 - priority: 1218 + width: 15.0 + color: 16284746 + priority: 1625 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16593 + priority: 16625 } shield { height: 10 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16593 + priority: 16625 + min_distance: 26 } } } @@ -21575,10 +22009,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -21586,10 +22020,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -21597,68 +22031,70 @@ cont { path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 0.8 - color: 2236945 - priority: 1406 + width: 2.8 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 14 lines { - width: 1.9 - color: 2236945 - priority: 1406 + width: 3.8 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 2.4 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -21666,57 +22102,58 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 3.4 - color: 2236945 - priority: 1406 + width: 3.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 6.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -21726,15 +22163,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 7.5 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -21744,7 +22181,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } } @@ -21755,10 +22192,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -21766,10 +22203,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -21777,94 +22214,96 @@ cont { path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 0.8 - color: 2236945 - priority: 1406 + width: 2.8 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 14 - lines { - width: 1.9 - color: 2236945 - priority: 1406 - join: ROUNDJOIN - cap: ROUNDCAP - } lines { width: 3.8 - color: 2236945 - priority: 1420 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.6 + width: 7.6 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 8.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 15 lines { width: 2.4 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 4.8 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 5.6 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -21874,99 +22313,100 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 3.4 - color: 2236945 - priority: 1406 + width: 3.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 6.8 + width: 6.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.6 + width: 6.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 17 lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 10.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 12.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 6.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 14.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 + width: 16.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -21976,29 +22416,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 7.5 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 17.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 18.0 + width: 19.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -22008,7 +22448,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } } @@ -22019,10 +22459,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -22030,10 +22470,10 @@ cont { path_text { primary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { @@ -22041,80 +22481,82 @@ cont { path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16000 } } element { scale: 13 lines { - width: 2.8 + width: 4.8 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 2236945 - priority: 1406 + width: 2.8 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { scale: 14 lines { - width: 3.9 + width: 5.8 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.9 - color: 2236945 - priority: 1406 + width: 3.8 + color: 16557154 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 20 } } element { @@ -22126,16 +22568,16 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { width: 2.4 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -22143,42 +22585,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } shield { height: 9 - color: 10066329 + color: 9474192 stroke_color: 0 - priority: 16406 + priority: 16611 + min_distance: 24 } } element { scale: 16 lines { - width: 5.4 + width: 5.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 3.4 - color: 2236945 - priority: 1406 + width: 3.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { @@ -22190,43 +22633,43 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { width: 4.5 - color: 2236945 - priority: 1406 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 18 lines { - width: 9.0 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 6.0 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -22236,26 +22679,26 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } element { scale: 19 lines { - width: 9.0 + width: 9.5 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1405 + priority: 1610 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 - color: 2236945 - priority: 1406 + width: 7.5 + color: 16284746 + priority: 1611 join: ROUNDJOIN cap: ROUNDCAP } @@ -22265,7 +22708,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16406 + priority: 16611 } } } @@ -22274,39 +22717,39 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -22314,9 +22757,9 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -22324,43 +22767,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 + width: 4.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -22368,7 +22811,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22378,15 +22821,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22396,7 +22839,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } } @@ -22405,39 +22848,39 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -22445,9 +22888,9 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -22455,43 +22898,43 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 + width: 4.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -22499,7 +22942,7 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22509,15 +22952,15 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22527,7 +22970,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } } @@ -22536,53 +22979,53 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.8 - color: 2236945 - priority: 1420 + priority: 1513 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.6 + color: 2236945 + priority: 1374 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 4.4 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -22590,21 +23033,21 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } lines { width: 6.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 6.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -22614,71 +23057,71 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 4.5 + width: 4.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 9.0 + width: 8.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.8 + width: 8.8 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 7.2 + width: 6.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 16.0 + width: 13.6 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 17.6 + width: 15.2 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -22686,21 +23129,21 @@ cont { lines { width: 9.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { width: 20.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { width: 22.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -22710,29 +23153,29 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 9.0 + width: 12.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 20.0 + width: 26.0 color: 2236945 - priority: 1420 + priority: 1374 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 22.0 + width: 28.0 color: 4473924 - priority: 1405 + priority: 1360 join: ROUNDJOIN cap: BUTTCAP } @@ -22742,7 +23185,7 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } } @@ -22751,39 +23194,39 @@ cont { element { scale: 12 lines { - width: 0.3 - color: 2569151010 - priority: 1484 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 2236962 + priority: 1541 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.7 - color: 1294082594 - priority: 1484 + width: 1.0 + color: 2236962 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 1.4 + width: 1.8 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 10 + height: 9 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -22791,9 +23234,9 @@ cont { lines { width: 3.0 color: 2236962 - priority: 1484 + priority: 1513 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { @@ -22801,65 +23244,65 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 16 lines { - width: 6.5 + width: 6.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 4.5 - color: 2236945 - priority: 1484 + width: 4.0 + color: 3026460 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 17 lines { - width: 9.2 + width: 8.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.2 - color: 2236945 - priority: 1484 + width: 6.0 + color: 3026460 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 12 + height: 11 color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { @@ -22871,14 +23314,14 @@ cont { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { width: 9.0 - color: 2236945 - priority: 1484 + color: 3026460 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22888,26 +23331,26 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 } } element { scale: 19 lines { - width: 11.0 + width: 14.0 color: 0 dashdot { dd: 5.0 dd: 5.0 } - priority: 1483 + priority: 1512 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 9.0 - color: 2236945 - priority: 1484 + width: 12.0 + color: 3026460 + priority: 1513 join: ROUNDJOIN cap: ROUNDCAP } @@ -22917,7 +23360,151 @@ cont { color: 7829367 stroke_color: 2148602112 } - priority: 16484 + priority: 16513 + } + } +} +cont { + name: "historic-archaeological_site" + element { + scale: 17 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 18 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 19 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + } +} +cont { + name: "historic-boundary_stone" + element { + scale: 18 + symbol { + name: "boundary_stone-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "boundary_stone-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "historic-castle" + element { + scale: 16 + symbol { + name: "remains-m" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 12 + } + priority: 15763 + } + } + element { + scale: 17 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 18 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 19 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 } } } @@ -22926,13 +23513,13 @@ cont { element { scale: 16 lines { - width: 0.1 - color: 1715749956 + width: 0.5 + color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -22940,13 +23527,13 @@ cont { element { scale: 17 lines { - width: 0.3 + width: 1.0 color: 4473924 dashdot { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -22960,7 +23547,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -22974,7 +23561,7 @@ cont { dd: 1.0 dd: 1.0 } - priority: 1609 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -22986,45 +23573,45 @@ cont { scale: 17 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 18 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 19 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } } @@ -23034,60 +23621,60 @@ cont { scale: 16 symbol { name: "monument-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 12 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 18 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 19 symbol { name: "monument-l" - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } } @@ -23097,60 +23684,240 @@ cont { scale: 16 symbol { name: "museum-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 12 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "museum-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "museum-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "museum-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 + } + } +} +cont { + name: "historic-ruins" + element { + scale: 17 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 18 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + } + element { + scale: 19 + symbol { + name: "remains-l" + priority: 16763 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15763 + } + } +} +cont { + name: "historic-ship" + element { + scale: 18 + symbol { + name: "ship-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "ship-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "historic-tomb" + element { + scale: 18 + symbol { + name: "tomb-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "tomb-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "historic-wayside_cross" + element { + scale: 18 + symbol { + name: "wayside_cross-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "wayside_cross-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "historic-wayside_shrine" + element { + scale: 18 + symbol { + name: "wayside_shrine-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "wayside_shrine-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -23161,7 +23928,7 @@ cont { lines { width: 0 color: 0 - priority: 1406 + priority: 1402 pathsym { name: "arrow-s" step: 144.0 @@ -23174,7 +23941,7 @@ cont { lines { width: 0 color: 0 - priority: 1640 + priority: 1652 pathsym { name: "arrow-s" step: 184.0 @@ -23187,7 +23954,7 @@ cont { lines { width: 0 color: 0 - priority: 1640 + priority: 1652 pathsym { name: "arrow-m" step: 184.0 @@ -23200,7 +23967,7 @@ cont { lines { width: 0 color: 0 - priority: 1640 + priority: 1652 pathsym { name: "arrow-m" step: 184.0 @@ -23211,46 +23978,88 @@ cont { } cont { name: "landuse-allotments" + element { + scale: 13 + area { + color: 1778944 + priority: -15862 + } + } element { scale: 14 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 15 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 16 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 17 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 18 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 19 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } } @@ -23260,56 +24069,56 @@ cont { scale: 12 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 13 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 14 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 15 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 16 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 17 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 18 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 19 area { color: 8738 - priority: -15735 + priority: -15778 } } } @@ -23318,19 +24127,19 @@ cont { element { scale: 14 area { - color: 655434240 - priority: -15813 + color: 656090368 + priority: -15848 } } element { scale: 15 area { - color: 1122816 - priority: -15813 + color: 1778944 + priority: -15848 } symbol { name: "cemetery-m" - priority: 16187 + priority: 16152 } caption { primary { @@ -23338,18 +24147,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15187 + priority: 15152 } } element { scale: 16 area { - color: 1122816 - priority: -15813 + color: 1778944 + priority: -15848 } symbol { name: "cemetery-m" - priority: 16187 + priority: 16152 } caption { primary { @@ -23357,18 +24166,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15187 + priority: 15152 } } element { scale: 17 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23376,18 +24185,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15569 } } element { scale: 18 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23395,18 +24204,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15569 } } element { scale: 19 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23414,7 +24223,7 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15569 } } } @@ -23423,19 +24232,19 @@ cont { element { scale: 14 area { - color: 655434240 - priority: -15813 + color: 656090368 + priority: -15848 } } element { scale: 15 area { - color: 1122816 - priority: -15813 + color: 1778944 + priority: -15848 } symbol { name: "cemetery-m" - priority: 16187 + priority: 16152 } caption { primary { @@ -23443,18 +24252,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15187 + priority: 15152 } } element { scale: 16 area { - color: 1122816 - priority: -15813 + color: 1778944 + priority: -15848 } symbol { name: "cemetery-m" - priority: 16187 + priority: 16152 } caption { primary { @@ -23462,18 +24271,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15187 + priority: 15152 } } element { scale: 17 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23481,18 +24290,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15569 } } element { scale: 18 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23500,18 +24309,18 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15569 } } element { scale: 19 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15431 } symbol { name: "cemetery-l" - priority: 16640 + priority: 16569 } caption { primary { @@ -23519,7 +24328,7 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15569 } } } @@ -23561,81 +24370,158 @@ cont { element { scale: 15 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15959 + } + caption { + primary { + height: 10 + color: 10066329 + } + priority: 15041 } } element { scale: 16 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15959 + } + caption { + primary { + height: 10 + color: 10066329 + } + priority: 15041 } } element { scale: 17 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15959 + } + caption { + primary { + height: 10 + color: 10066329 + } + priority: 15041 } } element { scale: 18 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15959 + } + caption { + primary { + height: 10 + color: 10066329 + } + priority: 15041 } } element { scale: 19 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15959 + } + caption { + primary { + height: 10 + color: 10066329 + } + priority: 15041 } } } cont { name: "landuse-farmland" + element { + scale: 13 + area { + color: 1778944 + priority: -15862 + } + } element { scale: 14 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 15 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 16 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 17 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 18 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 19 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } } @@ -23644,72 +24530,836 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 13 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 14 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 14 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 14 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 18 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 19 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } } cont { @@ -23717,72 +25367,836 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 13 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 14 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 14 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 14 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 18 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 19 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } } cont { @@ -23790,72 +26204,836 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 13 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 14 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 14 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 14 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 18 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 19 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } } cont { @@ -23863,109 +27041,887 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 13 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 14 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 14 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 14 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-s" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-m" + priority: 16111 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15889 + } + apply_if: "!name" } element { scale: 18 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } element { scale: 19 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + priority: 15111 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15889 + } + symbol { + name: "park-l" + priority: 16111 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15111 + } + apply_if: "name" } } cont { name: "landuse-grass" + element { + scale: 13 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 14 + area { + color: 1778944 + priority: -15820 + } + } element { scale: 15 area { - color: 1122816 - priority: -15782 + color: 1778944 + priority: -15820 } } element { scale: 16 area { - color: 1122816 - priority: -15782 + color: 1778944 + priority: -15820 } } element { scale: 17 area { - color: 1122816 - priority: -15782 + color: 1778944 + priority: -15820 } } element { scale: 18 area { - color: 1122816 - priority: -15782 + color: 1778944 + priority: -15820 } } element { scale: 19 area { - color: 1122816 - priority: -15782 + color: 1778944 + priority: -15820 } } } @@ -23974,116 +27930,123 @@ cont { element { scale: 15 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15125 } caption { primary { height: 10 color: 10066329 } - priority: 15046 + priority: 15875 } } element { scale: 16 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15125 } caption { primary { height: 10 color: 10066329 } - priority: 15046 + priority: 15875 } } element { scale: 17 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15125 } caption { primary { height: 10 color: 10066329 } - priority: 15046 + priority: 15875 } } element { scale: 18 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15125 } caption { primary { height: 10 color: 10066329 } - priority: 15046 + priority: 15875 } } element { scale: 19 area { - color: 1118464 - priority: -15954 + color: 1315840 + priority: -15125 } caption { primary { height: 10 color: 10066329 } - priority: 15046 + priority: 15875 } } } cont { name: "landuse-meadow" + element { + scale: 13 + area { + color: 1778944 + priority: -15862 + } + } element { scale: 14 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 15 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 16 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 17 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 18 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 19 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } } @@ -24093,7 +28056,7 @@ cont { scale: 17 symbol { name: "military-l" - priority: 16640 + priority: 16652 } caption { primary { @@ -24101,14 +28064,14 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15652 } } element { scale: 18 symbol { name: "military-l" - priority: 16640 + priority: 16652 } caption { primary { @@ -24116,14 +28079,14 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15652 } } element { scale: 19 symbol { name: "military-l" - priority: 16640 + priority: 16652 } caption { primary { @@ -24131,97 +28094,181 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15652 } } } cont { name: "landuse-orchard" + element { + scale: 13 + area { + color: 1778944 + priority: -15862 + } + } element { scale: 14 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 15 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 16 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 17 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 18 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 19 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } } cont { name: "landuse-recreation_ground" + element { + scale: 13 + area { + color: 1778944 + priority: -15862 + } + } element { scale: 14 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 15 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 16 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 17 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 18 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 19 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } } @@ -24234,7 +28281,7 @@ cont { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24245,7 +28292,7 @@ cont { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24253,14 +28300,14 @@ cont { scale: 12 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24268,7 +28315,7 @@ cont { scale: 12 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -24276,7 +28323,7 @@ cont { scale: 12 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -24284,14 +28331,14 @@ cont { scale: 13 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24299,7 +28346,7 @@ cont { scale: 13 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -24307,7 +28354,7 @@ cont { scale: 13 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -24315,14 +28362,14 @@ cont { scale: 14 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24330,7 +28377,7 @@ cont { scale: 14 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -24338,7 +28385,7 @@ cont { scale: 14 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -24346,14 +28393,14 @@ cont { scale: 15 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24361,7 +28408,7 @@ cont { scale: 15 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -24369,7 +28416,7 @@ cont { scale: 15 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -24377,14 +28424,14 @@ cont { scale: 16 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24392,7 +28439,7 @@ cont { scale: 16 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -24400,7 +28447,7 @@ cont { scale: 16 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -24408,14 +28455,14 @@ cont { scale: 17 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24423,7 +28470,7 @@ cont { scale: 17 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -24431,7 +28478,7 @@ cont { scale: 17 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -24439,14 +28486,14 @@ cont { scale: 18 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24454,7 +28501,7 @@ cont { scale: 18 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -24462,7 +28509,7 @@ cont { scale: 18 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -24470,14 +28517,14 @@ cont { scale: 19 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -24485,7 +28532,7 @@ cont { scale: 19 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -24493,121 +28540,147 @@ cont { scale: 19 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } } cont { name: "landuse-village_green" + element { + scale: 13 + area { + color: 1778944 + priority: -15862 + } + } element { scale: 14 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 15 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 16 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 17 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 18 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 19 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } } cont { name: "landuse-vineyard" + element { + scale: 13 + area { + color: 1778944 + priority: -15862 + } + } element { scale: 14 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 15 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 16 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } element { scale: 17 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } - } - element { - scale: 18 - area { - color: 1122816 - priority: -15829 - } - } - element { - scale: 19 - area { - color: 1122816 - priority: -15829 - } - } -} -cont { - name: "leisure-common" - element { - scale: 18 caption { primary { height: 10 color: 5592405 } - priority: 15000 + priority: 15138 } } element { - scale: 19 + scale: 18 + area { + color: 1778944 + priority: -15862 + } caption { primary { height: 10 color: 5592405 } - priority: 15000 + priority: 15138 + } + } + element { + scale: 19 + area { + color: 1778944 + priority: -15862 + } + caption { + primary { + height: 10 + color: 5592405 + } + priority: 15138 } } } @@ -24615,22 +28688,32 @@ cont { name: "leisure-dog_park" element { scale: 18 + symbol { + name: "dog_park-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15000 + priority: 15722 } } element { scale: 19 + symbol { + name: "dog_park-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15000 + priority: 15722 } } } @@ -24641,47 +28724,45 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { scale: 18 symbol { - name: "tennis-l" - apply_for_type: 1 - priority: 16000 + name: "dog_park-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15722 } } element { scale: 19 symbol { - name: "tennis-l" - apply_for_type: 1 - priority: 16000 + name: "dog_park-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15722 } } } @@ -24690,265 +28771,296 @@ cont { element { scale: 12 area { - color: 1292968448 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 13 area { - color: 856760832 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "garden-m" - priority: 16156 + priority: 16125 + min_distance: 10 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 2566914048 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "garden-m" - priority: 16156 + priority: 16125 + min_distance: 10 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 2566914048 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { - scale: 17 + scale: 16 area { - color: 1122816 - priority: -15844 - } - symbol { - name: "garden-l" - priority: 16156 - } - caption { - primary { - height: 13 - color: 1131520 - stroke_color: 2568032512 - offset_y: 10 - } - secondary { - height: 13 - color: 1131520 - stroke_color: 2568032512 - offset_y: 10 - text: "int_name" - } - priority: 15156 - } - apply_if: "name" - } - element { - scale: 17 - area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "garden-l" - priority: 16156 + priority: 16125 + min_distance: 10 } caption { primary { - height: 13 - color: 1131520 - stroke_color: 2568032512 + height: 11 + color: 1786635 + stroke_color: 2566914048 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "garden-l" + priority: 16125 + min_distance: 10 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 2566914048 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } element { scale: 18 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "garden-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 11 + color: 1786635 + stroke_color: 2566914048 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } } element { scale: 19 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "garden-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 11 + color: 1786635 + stroke_color: 2566914048 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } } } cont { name: "leisure-golf_course" element { - scale: 18 + scale: 13 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 14 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 15 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 16 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 17 + area { + color: 1778944 + priority: -15792 + } symbol { name: "golf-l" - priority: 16000 + apply_for_type: 1 + priority: 16208 } - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 + } + element { + scale: 18 + area { + color: 1778944 + priority: -15792 + } + symbol { + name: "golf-l" + priority: 16208 } } element { scale: 19 + area { + color: 1778944 + priority: -15792 + } symbol { name: "golf-l" - priority: 16000 - } - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 - } - } -} -cont { - name: "leisure-landscape_reserve" - element { - scale: 18 - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 - } - } - element { - scale: 19 - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 + priority: 16208 } } } @@ -24957,175 +29069,175 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15360 + color: 1778944 + priority: -15237 } symbol { name: "nparkf-s" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 8 + color: 1786635 + stroke_color: 1118464 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 13 area { - color: 655434240 - priority: -15360 + color: 1778944 + priority: -15237 } symbol { name: "nparkf-s" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 8 + color: 1786635 + stroke_color: 1118464 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 14 area { - color: 655434240 - priority: -15360 + color: 1778944 + priority: -15237 } symbol { name: "nparkf-s" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 1131520 - stroke_color: 2568032512 - offset_y: 8 + color: 1786635 + stroke_color: 1118464 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 15 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15237 } symbol { name: "nparkf-m" - priority: 16640 + priority: 16763 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 1118464 offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 16 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15237 } symbol { name: "nparkf-m" - priority: 16640 + priority: 16763 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 1118464 offset_y: 10 } - priority: 15640 + priority: 15763 } } element { scale: 17 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15237 } symbol { name: "nparkf-l" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 1118464 offset_y: 12 } - priority: 15640 + priority: 15763 } } element { scale: 18 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15237 } symbol { name: "nparkf-l" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 5592405 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 1118464 offset_y: 12 } - priority: 15640 + priority: 15763 } } element { scale: 19 area { - color: 1122816 - priority: -15360 + color: 1778944 + priority: -15237 } symbol { name: "nparkf-l" - priority: 16640 + priority: 16763 } caption { primary { height: 10 - color: 5592405 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 1118464 offset_y: 12 } - priority: 15640 + priority: 15763 } } } @@ -25134,344 +29246,886 @@ cont { element { scale: 10 area { - color: 2568036864 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 11 area { - color: 2148606464 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 12 area { - color: 1292968448 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 13 area { - color: 856760832 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 14 area { - color: 655434240 - priority: -15844 - } - symbol { - name: "none" - priority: 16156 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 } apply_if: "name" } element { scale: 18 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 13 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } element { scale: 19 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 13 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } } cont { @@ -25479,344 +30133,886 @@ cont { element { scale: 10 area { - color: 2568036864 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 11 area { - color: 2148606464 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 12 area { - color: 1292968448 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 13 area { - color: 856760832 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 14 area { - color: 655434240 - priority: -15844 - } - symbol { - name: "none" - priority: 16156 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 } apply_if: "name" } element { scale: 18 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 13 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } element { scale: 19 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 13 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } } cont { @@ -25824,344 +31020,886 @@ cont { element { scale: 10 area { - color: 2568036864 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 11 area { - color: 2148606464 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 12 area { - color: 1292968448 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 13 area { - color: 856760832 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 14 area { - color: 655434240 - priority: -15844 - } - symbol { - name: "none" - priority: 16156 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 } apply_if: "name" } element { scale: 18 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 13 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } element { scale: 19 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 13 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } } cont { @@ -26169,344 +31907,886 @@ cont { element { scale: 10 area { - color: 2568036864 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 11 area { - color: 2148606464 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 12 area { - color: 1292968448 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 13 area { - color: 856760832 - priority: -15844 + color: 1778944 + priority: -15875 } } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 14 area { - color: 655434240 - priority: -15844 - } - symbol { - name: "none" - priority: 16156 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 14 area { - color: 655434240 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-s" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { - height: 11 - color: 1131520 - stroke_color: 2568032512 + height: 10 + color: 1786635 + stroke_color: 0 offset_y: 8 } secondary { height: 10 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 15 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 8 + } + secondary { + height: 10 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 15 + area { + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 16 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-m" - priority: 16156 + priority: 16125 } caption { primary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 11 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-m" + priority: 16125 + } + caption { + primary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 11 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 16 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 } apply_if: "name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } apply_if: "!name" } element { scale: 17 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { height: 12 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 10 text: "int_name" } - priority: 15156 + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 12 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 17 + area { + color: 1778944 + priority: -15875 + } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 } apply_if: "name" } element { scale: 18 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 13 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "!name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 18 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } element { scale: 19 area { - color: 1122816 - priority: -15844 + color: 1778944 + priority: -15875 } symbol { name: "park-l" - priority: 16156 + priority: 16125 } caption { primary { - height: 10 - color: 5592405 - stroke_color: 2571387972 + height: 13 + color: 1786635 + stroke_color: 0 offset_y: 10 } secondary { height: 13 - color: 1131520 - stroke_color: 2568032512 + color: 1786635 + stroke_color: 0 offset_y: 18 text: "int_name" } - priority: 15156 + priority: 15125 } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "!name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" + } + element { + scale: 19 + area { + color: 1778944 + priority: -15875 + } + symbol { + name: "park-l" + priority: 16125 + } + caption { + primary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 10 + } + secondary { + height: 13 + color: 1786635 + stroke_color: 0 + offset_y: 18 + text: "int_name" + } + priority: 15125 + } + apply_if: "name" } } cont { @@ -26515,52 +32795,67 @@ cont { scale: 16 area { color: 1118464 - priority: -15922 + priority: -15945 } } element { scale: 17 area { color: 1118464 - priority: -15922 + priority: -15264 + } + symbol { + name: "pitch-l" + apply_for_type: 1 + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 } } element { scale: 18 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 19 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15078 + priority: 15736 } } } @@ -26570,67 +32865,67 @@ cont { scale: 16 area { color: 1118464 - priority: -15922 + priority: -15945 } } element { scale: 17 area { color: 1118464 - priority: -15032 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16968 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15968 + priority: 15736 } } element { scale: 18 area { color: 1118464 - priority: -15032 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16968 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15968 + priority: 15736 } } element { scale: 19 area { color: 1118464 - priority: -15032 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16968 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15968 + priority: 15736 } } } @@ -26640,45 +32935,36 @@ cont { scale: 17 area { color: 1118464 - priority: -15922 + priority: -15264 + } + symbol { + name: "pitch-l" + apply_for_type: 1 + priority: 16736 } } element { scale: 18 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 - } - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15078 + priority: 16736 } } element { scale: 19 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 - } - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15078 + priority: 16736 } } } @@ -26688,60 +32974,60 @@ cont { scale: 17 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 18 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 19 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "tennis-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } } @@ -26752,15 +33038,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -26768,15 +33054,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -26784,80 +33070,50 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 - } - } -} -cont { - name: "leisure-recreation_ground" - element { - scale: 18 - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 - } - } - element { - scale: 19 - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 - } - } -} -cont { - name: "leisure-slipway" - element { - scale: 18 - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 - } - } - element { - scale: 19 - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 + priority: 15736 } } } cont { name: "leisure-sports_centre" element { - scale: 18 + scale: 17 symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 + } + } + element { + scale: 18 + symbol { + name: "pitch-l" + apply_for_type: 1 + priority: 16750 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15750 } } element { @@ -26865,15 +33121,15 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } } @@ -26883,87 +33139,87 @@ cont { scale: 15 area { color: 1118464 - priority: -15922 + priority: -15945 } } element { scale: 16 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "pitch-m" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 17 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 18 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 19 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "pitch-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } } @@ -26973,94 +33229,62 @@ cont { scale: 13 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 14 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 15 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 16 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 17 area { color: 8738 - priority: -15735 + priority: -15250 + } + symbol { + name: "swimming-l" + apply_for_type: 1 + priority: 16750 } } element { scale: 18 area { color: 8738 - priority: -15735 + priority: -15250 } symbol { name: "swimming-l" - priority: 16265 - } - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15265 + priority: 16750 } } element { scale: 19 area { color: 8738 - priority: -15735 + priority: -15250 } symbol { name: "swimming-l" - priority: 16265 - } - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15265 - } - } -} -cont { - name: "leisure-track" - element { - scale: 18 - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 - } - } - element { - scale: 19 - caption { - primary { - height: 10 - color: 5592405 - } - priority: 15000 + priority: 16750 } } } @@ -27068,22 +33292,32 @@ cont { name: "leisure-water_park" element { scale: 18 + symbol { + name: "diving-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15000 + priority: 15722 } } element { scale: 19 + symbol { + name: "diving-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15000 + priority: 15722 } } } @@ -27093,119 +33327,119 @@ cont { scale: 12 area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 13 area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 14 lines { - width: 0.6 + width: 4.0 color: 0 - priority: 1295 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 15 lines { - width: 0.6 + width: 4.0 color: 0 - priority: 1295 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 16 lines { - width: 0.6 + width: 4.0 color: 0 - priority: 1295 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 17 lines { - width: 2.0 + width: 4.0 color: 0 - priority: 1639 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15360 + priority: -15348 } caption { primary { height: 10 color: 5592405 } - priority: 15640 + priority: 15652 } } element { scale: 18 lines { - width: 2.0 + width: 4.0 color: 0 - priority: 1639 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15360 + priority: -15348 } caption { primary { height: 10 color: 5592405 } - priority: 15640 + priority: 15652 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 0 - priority: 1639 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15360 + priority: -15348 } caption { primary { height: 10 color: 5592405 } - priority: 15640 + priority: 15652 } } } @@ -27215,75 +33449,75 @@ cont { scale: 15 symbol { name: "lighthouse-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "lighthouse-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "lighthouse-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "lighthouse-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "lighthouse-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -27293,119 +33527,152 @@ cont { scale: 12 area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 13 area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 14 lines { - width: 0.6 + width: 4.0 color: 0 - priority: 1295 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 15 lines { - width: 0.6 + width: 4.0 color: 0 - priority: 1295 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 16 lines { - width: 0.6 + width: 4.0 color: 0 - priority: 1295 + priority: 1262 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15704 + priority: -15737 } } element { scale: 17 lines { - width: 2.0 + width: 4.0 color: 0 - priority: 1639 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15360 + priority: -15348 } caption { primary { height: 10 color: 5592405 } - priority: 15640 + priority: 15652 } } element { scale: 18 lines { - width: 2.0 + width: 4.0 color: 0 - priority: 1639 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15360 + priority: -15348 } caption { primary { height: 10 color: 5592405 } - priority: 15640 + priority: 15652 } } element { scale: 19 lines { - width: 2.0 + width: 4.0 color: 0 - priority: 1639 + priority: 1651 join: ROUNDJOIN cap: BUTTCAP } area { color: 0 - priority: -15360 + priority: -15348 } caption { primary { height: 10 color: 5592405 } - priority: 15640 + priority: 15652 + } + } +} +cont { + name: "man_made-windmill" + element { + scale: 18 + symbol { + name: "windmill-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "windmill-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -27415,75 +33682,75 @@ cont { scale: 15 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -27493,112 +33760,112 @@ cont { scale: 10 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 11 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 12 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 13 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 14 area { color: 8738 - priority: -15735 + priority: -15778 } caption { primary { height: 8 color: 17510 } - priority: 15265 + priority: 15222 } } element { scale: 15 area { color: 8738 - priority: -15735 + priority: -15778 } caption { primary { height: 8 color: 17510 } - priority: 15265 + priority: 15222 } } element { scale: 16 area { color: 8738 - priority: -15735 + priority: -15778 } caption { primary { height: 11 color: 17510 } - priority: 15265 + priority: 15222 } } element { scale: 17 area { color: 8738 - priority: -15735 + priority: -15778 } caption { primary { height: 11 color: 17510 } - priority: 15265 + priority: 15222 } } element { scale: 18 area { color: 8738 - priority: -15735 + priority: -15778 } caption { primary { height: 11 color: 17510 } - priority: 15265 + priority: 15222 } } element { scale: 19 area { color: 8738 - priority: -15735 + priority: -15778 } caption { primary { height: 11 color: 17510 } - priority: 15265 + priority: 15222 } } } @@ -27607,106 +33874,116 @@ cont { element { scale: 10 area { - color: 1294082577 - priority: -15985 + color: 2631706 + priority: -15987 } } element { scale: 11 area { - color: 1294082577 - priority: -15985 + color: 2631706 + priority: -15987 } } element { scale: 12 area { - color: 1294082577 - priority: -15985 + color: 2631706 + priority: -15987 } } element { scale: 13 area { - color: 1294082577 - priority: -15985 + color: 2631706 + priority: -15987 } } element { scale: 14 area { - color: 1294082577 - priority: -15985 + color: 2631706 + priority: -15987 } } element { scale: 15 area { - color: 656548369 - priority: -15985 + color: 2631706 + priority: -15987 } caption { primary { height: 10 color: 5592405 } - priority: 15015 + priority: 15013 } } element { scale: 16 area { - color: 656548369 - priority: -15985 + color: 2631706 + priority: -15987 } caption { primary { height: 10 color: 5592405 } - priority: 15015 + priority: 15013 } } element { scale: 17 area { - color: 2236945 - priority: -15985 + color: 2631706 + priority: -15987 } caption { primary { height: 10 color: 5592405 } - priority: 15015 + priority: 15013 } } element { scale: 18 area { - color: 2236945 - priority: -15985 + color: 2631706 + priority: -15278 + } + symbol { + name: "beach-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15015 + priority: 15722 } } element { scale: 19 area { - color: 2236945 - priority: -15985 + color: 2631706 + priority: -15278 + } + symbol { + name: "beach-l" + priority: 16722 } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15015 + priority: 15722 } } } @@ -27780,15 +34057,15 @@ cont { symbol { name: "cave-s" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27796,15 +34073,15 @@ cont { symbol { name: "cave-s" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27812,15 +34089,15 @@ cont { symbol { name: "cave-s" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27828,15 +34105,15 @@ cont { symbol { name: "cave-m" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27844,15 +34121,15 @@ cont { symbol { name: "cave-m" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27860,15 +34137,15 @@ cont { symbol { name: "cave-m" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27876,7 +34153,7 @@ cont { symbol { name: "cave-l" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { @@ -27884,7 +34161,7 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15763 } } element { @@ -27892,7 +34169,7 @@ cont { symbol { name: "cave-l" apply_for_type: 1 - priority: 16640 + priority: 16763 } caption { primary { @@ -27900,7 +34177,7 @@ cont { color: 5592405 offset_y: 10 } - priority: 15640 + priority: 15763 } } } @@ -27910,140 +34187,140 @@ cont { scale: 0 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 1 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 2 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 3 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 4 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 5 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 6 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 7 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 8 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 9 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 10 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 11 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 12 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 13 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 14 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 15 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 16 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 17 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 18 area { color: 8738 - priority: -16715 + priority: -16713 } } element { scale: 19 area { color: 8738 - priority: -16715 + priority: -16713 } } } @@ -28053,140 +34330,192 @@ cont { scale: 0 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 1 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 2 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 3 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 4 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 5 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 6 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 7 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 8 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 9 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 10 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 11 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 12 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 13 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 14 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 15 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 16 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 17 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 18 area { color: 1118481 - priority: -15985 + priority: -15987 } } element { scale: 19 area { color: 1118481 - priority: -15985 + priority: -15987 + } + } +} +cont { + name: "natural-grassland" + element { + scale: 13 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 14 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 15 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 16 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 17 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 18 + area { + color: 1778944 + priority: -15820 + } + } + element { + scale: 19 + area { + color: 1778944 + priority: -15820 } } } @@ -28196,84 +34525,84 @@ cont { scale: 0 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 1 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 2 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 3 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 4 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 5 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 6 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 7 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 8 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 9 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 10 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28281,7 +34610,7 @@ cont { scale: 10 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28289,14 +34618,14 @@ cont { scale: 11 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28304,7 +34633,7 @@ cont { scale: 11 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28312,14 +34641,14 @@ cont { scale: 12 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28327,7 +34656,7 @@ cont { scale: 12 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28335,7 +34664,7 @@ cont { scale: 12 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28343,14 +34672,14 @@ cont { scale: 13 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28358,7 +34687,7 @@ cont { scale: 13 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28366,7 +34695,7 @@ cont { scale: 13 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28374,14 +34703,14 @@ cont { scale: 14 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28389,7 +34718,7 @@ cont { scale: 14 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28397,7 +34726,7 @@ cont { scale: 14 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28405,14 +34734,14 @@ cont { scale: 15 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28420,7 +34749,7 @@ cont { scale: 15 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28428,7 +34757,7 @@ cont { scale: 15 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28436,14 +34765,14 @@ cont { scale: 16 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28451,7 +34780,7 @@ cont { scale: 16 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28459,7 +34788,7 @@ cont { scale: 16 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28467,14 +34796,14 @@ cont { scale: 17 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28482,7 +34811,7 @@ cont { scale: 17 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28490,7 +34819,7 @@ cont { scale: 17 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28498,14 +34827,14 @@ cont { scale: 18 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28513,7 +34842,7 @@ cont { scale: 18 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28521,7 +34850,7 @@ cont { scale: 18 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28529,14 +34858,14 @@ cont { scale: 19 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -28544,7 +34873,7 @@ cont { scale: 19 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -28552,7 +34881,7 @@ cont { scale: 19 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -28706,7 +35035,7 @@ cont { scale: 12 symbol { name: "peakt-s" - priority: 16000 + priority: 16763 } apply_if: "name" } @@ -28714,7 +35043,7 @@ cont { scale: 12 symbol { name: "peakt-s" - priority: 16000 + priority: 16763 } apply_if: "name" } @@ -28722,7 +35051,7 @@ cont { scale: 13 symbol { name: "peakt-s" - priority: 16000 + priority: 16763 } caption { primary { @@ -28730,7 +35059,7 @@ cont { color: 5592405 offset_y: 6 } - priority: 15000 + priority: 15763 } apply_if: "name" } @@ -28738,7 +35067,7 @@ cont { scale: 13 symbol { name: "peakt-s" - priority: 16000 + priority: 16763 } caption { primary { @@ -28746,7 +35075,7 @@ cont { color: 5592405 offset_y: 6 } - priority: 15000 + priority: 15763 } apply_if: "name" } @@ -28754,7 +35083,7 @@ cont { scale: 14 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { @@ -28762,7 +35091,7 @@ cont { color: 5592405 offset_y: 6 } - priority: 15000 + priority: 15763 } apply_if: "name" } @@ -28770,7 +35099,7 @@ cont { scale: 14 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { @@ -28778,7 +35107,7 @@ cont { color: 5592405 offset_y: 6 } - priority: 15000 + priority: 15763 } apply_if: "name" } @@ -28786,75 +35115,75 @@ cont { scale: 15 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -28864,140 +35193,140 @@ cont { scale: 0 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 1 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 2 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 3 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 4 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 5 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 6 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 7 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 8 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 9 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 10 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 11 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 12 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 13 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 14 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 15 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 16 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 17 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 18 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 19 area { color: 8738 - priority: -15735 + priority: -15778 } } } @@ -29007,120 +35336,127 @@ cont { scale: 15 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "peakt-m" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "peakt-l" - priority: 16000 + priority: 16763 } caption { primary { height: 11 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } cont { name: "natural-scrub" + element { + scale: 13 + area { + color: 1778944 + priority: -15862 + } + } element { scale: 14 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 15 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 16 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 17 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 18 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } element { scale: 19 area { - color: 1122816 - priority: -15829 + color: 1778944 + priority: -15862 } } } @@ -29131,7 +35467,7 @@ cont { symbol { name: "drinking-water-m" apply_for_type: 1 - priority: 16265 + priority: 16763 } caption { primary { @@ -29139,14 +35475,14 @@ cont { color: 5592405 offset_y: 8 } - priority: 15265 + priority: 15763 } } element { scale: 16 symbol { name: "drinking-water-m" - priority: 16265 + priority: 16763 } caption { primary { @@ -29154,14 +35490,14 @@ cont { color: 5592405 offset_y: 8 } - priority: 15265 + priority: 15763 } } element { scale: 17 symbol { name: "drinking-water-l" - priority: 16265 + priority: 16763 } caption { primary { @@ -29169,37 +35505,37 @@ cont { color: 5592405 offset_y: 8 } - priority: 15265 + priority: 15763 } } element { scale: 18 symbol { name: "drinking-water-l" - priority: 16640 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15750 } } element { scale: 19 symbol { name: "drinking-water-l" - priority: 16640 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15640 + priority: 15750 } } } @@ -29209,150 +35545,150 @@ cont { scale: 10 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 11 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 12 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 13 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 14 symbol { name: "volcano-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 15 symbol { name: "volcano-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "volcano-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "volcano-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "volcano-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "volcano-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -29362,84 +35698,84 @@ cont { scale: 0 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 1 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 2 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 3 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 4 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 5 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 6 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 7 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 8 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 9 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 10 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29447,7 +35783,7 @@ cont { scale: 10 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -29455,14 +35791,14 @@ cont { scale: 11 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29470,7 +35806,7 @@ cont { scale: 11 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -29478,14 +35814,14 @@ cont { scale: 12 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29493,7 +35829,7 @@ cont { scale: 12 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -29501,7 +35837,7 @@ cont { scale: 12 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -29509,14 +35845,14 @@ cont { scale: 13 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 9 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29524,7 +35860,7 @@ cont { scale: 13 area { color: 8738 - priority: -15641 + priority: -15653 } apply_if: "bbox_area<4000000" } @@ -29532,7 +35868,7 @@ cont { scale: 13 area { color: 8738 - priority: -15735 + priority: -15084 } apply_if: "bbox_area<10000000" } @@ -29540,14 +35876,14 @@ cont { scale: 14 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 8 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29555,14 +35891,14 @@ cont { scale: 14 area { color: 8738 - priority: -15641 + priority: -15653 } caption { primary { height: 8 color: 17510 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } @@ -29570,14 +35906,14 @@ cont { scale: 14 area { color: 8738 - priority: -15735 + priority: -15084 } caption { primary { height: 8 color: 17510 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } @@ -29585,14 +35921,14 @@ cont { scale: 15 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 8 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29600,14 +35936,14 @@ cont { scale: 15 area { color: 8738 - priority: -15641 + priority: -15653 } caption { primary { height: 8 color: 17510 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } @@ -29615,14 +35951,14 @@ cont { scale: 15 area { color: 8738 - priority: -15735 + priority: -15084 } caption { primary { height: 8 color: 17510 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } @@ -29630,14 +35966,14 @@ cont { scale: 16 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 11 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29645,14 +35981,14 @@ cont { scale: 16 area { color: 8738 - priority: -15641 + priority: -15653 } caption { primary { height: 11 color: 17510 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } @@ -29660,14 +35996,14 @@ cont { scale: 16 area { color: 8738 - priority: -15735 + priority: -15084 } caption { primary { height: 11 color: 17510 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } @@ -29675,14 +36011,14 @@ cont { scale: 17 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 11 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29690,14 +36026,14 @@ cont { scale: 17 area { color: 8738 - priority: -15641 + priority: -15653 } caption { primary { height: 11 color: 17510 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } @@ -29705,14 +36041,14 @@ cont { scale: 17 area { color: 8738 - priority: -15735 + priority: -15084 } caption { primary { height: 11 color: 17510 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } @@ -29720,14 +36056,14 @@ cont { scale: 18 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 11 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29735,14 +36071,14 @@ cont { scale: 18 area { color: 8738 - priority: -15641 + priority: -15653 } caption { primary { height: 11 color: 17510 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } @@ -29750,14 +36086,14 @@ cont { scale: 18 area { color: 8738 - priority: -15735 + priority: -15084 } caption { primary { height: 11 color: 17510 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } @@ -29765,14 +36101,14 @@ cont { scale: 19 area { color: 8738 - priority: -15079 + priority: -15084 } caption { primary { height: 11 color: 17510 } - priority: 15921 + priority: 15916 } apply_if: "bbox_area>=4000000" } @@ -29780,14 +36116,14 @@ cont { scale: 19 area { color: 8738 - priority: -15641 + priority: -15653 } caption { primary { height: 11 color: 17510 } - priority: 15359 + priority: 15347 } apply_if: "bbox_area<4000000" } @@ -29795,14 +36131,14 @@ cont { scale: 19 area { color: 8738 - priority: -15735 + priority: -15084 } caption { primary { height: 11 color: 17510 } - priority: 15265 + priority: 15916 } apply_if: "bbox_area<10000000" } @@ -29813,120 +36149,120 @@ cont { scale: 12 symbol { name: "waterfall-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 13 symbol { name: "waterfall-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 14 symbol { name: "waterfall-s" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 15 symbol { name: "waterfall-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 16 symbol { name: "waterfall-m" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 17 symbol { name: "waterfall-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 18 symbol { name: "waterfall-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } element { scale: 19 symbol { name: "waterfall-l" - priority: 16000 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15763 } } } @@ -29936,63 +36272,63 @@ cont { scale: 11 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 12 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 13 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 14 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 15 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 16 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 17 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 18 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 19 area { color: 3003130402 - priority: -15766 + priority: -15806 } } } @@ -30002,63 +36338,63 @@ cont { scale: 11 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 12 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 13 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 14 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 15 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 16 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 17 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 18 area { color: 3003130402 - priority: -15766 + priority: -15806 } } element { scale: 19 area { color: 3003130402 - priority: -15766 + priority: -15806 } } } @@ -30067,71 +36403,71 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 13 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 14 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 15 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 16 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 17 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 18 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 19 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } } @@ -30140,71 +36476,71 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 13 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 14 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 15 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 16 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 17 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 18 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 19 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } } @@ -30213,71 +36549,71 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 13 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 14 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 15 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 16 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 17 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 18 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 19 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } } @@ -30286,71 +36622,269 @@ cont { element { scale: 10 area { - color: 2148606464 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 11 area { - color: 1511072256 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 12 area { - color: 1074864640 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 13 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 14 area { - color: 655434240 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 15 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 16 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 17 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 18 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 } } element { scale: 19 area { - color: 1122816 - priority: -15860 + color: 1778944 + priority: -15889 + } + } +} +cont { + name: "office" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-company" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-estate_agent" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-government" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-lawyer" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } +} +cont { + name: "office-telecommunication" + element { + scale: 18 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 + } + } + element { + scale: 19 + symbol { + name: "office-l" + priority: 16736 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15736 } } } @@ -30359,39 +36893,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30399,9 +36933,9 @@ cont { element { scale: 17 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30409,9 +36943,9 @@ cont { element { scale: 18 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30419,9 +36953,9 @@ cont { element { scale: 19 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30432,39 +36966,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30472,9 +37006,9 @@ cont { element { scale: 17 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30482,9 +37016,9 @@ cont { element { scale: 18 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30492,9 +37026,9 @@ cont { element { scale: 19 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30505,39 +37039,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30545,9 +37079,9 @@ cont { element { scale: 17 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30555,9 +37089,9 @@ cont { element { scale: 18 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30565,9 +37099,9 @@ cont { element { scale: 19 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30578,39 +37112,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30618,9 +37152,9 @@ cont { element { scale: 17 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30628,9 +37162,9 @@ cont { element { scale: 18 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30638,9 +37172,9 @@ cont { element { scale: 19 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30651,39 +37185,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 1727987712 - priority: 1875 + width: 1.0 + color: 16711680 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30691,9 +37225,9 @@ cont { element { scale: 17 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30701,9 +37235,9 @@ cont { element { scale: 18 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30711,9 +37245,9 @@ cont { element { scale: 19 lines { - width: 0.8 - color: 4473907 - priority: 1875 + width: 1.6 + color: 5131837 + priority: 1888 join: ROUNDJOIN cap: ROUNDCAP } @@ -30724,29 +37258,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1093 + width: 0.8 + color: 3355443 + priority: 1083 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1312 + width: 1.1 + color: 3355443 + priority: 1319 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.1 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -30754,9 +37288,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -30764,9 +37298,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -30774,9 +37308,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -30787,29 +37321,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1265 + width: 1.0 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1265 + width: 1.6 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30817,9 +37351,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30827,9 +37361,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30837,9 +37371,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30850,29 +37384,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1711293440 - priority: 1265 + width: 1.0 + color: 17408 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 855655424 - priority: 1265 + width: 1.6 + color: 17408 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 17408 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30880,9 +37414,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 17408 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30890,9 +37424,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 17408 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30900,9 +37434,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 17408 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30913,29 +37447,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1265 + width: 1.0 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1265 + width: 1.6 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30943,9 +37477,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30953,9 +37487,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30963,9 +37497,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -30976,29 +37510,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1265 + width: 1.0 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1265 + width: 1.6 + color: 3355443 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31006,9 +37540,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31016,9 +37550,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31026,9 +37560,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 3355443 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31039,29 +37573,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1715732480 - priority: 1265 + width: 1.0 + color: 4456448 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 + width: 1.6 color: 860094464 - priority: 1265 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 4456448 - priority: 1265 + width: 1.6 + color: 860094464 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31069,9 +37603,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 4456448 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31079,9 +37613,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 4456448 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31089,9 +37623,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 4456448 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31102,29 +37636,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1711293440 - priority: 1265 + width: 1.0 + color: 17408 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 855655424 - priority: 1265 + width: 1.6 + color: 17408 + priority: 1222 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.6 color: 17408 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31132,9 +37666,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.8 color: 17408 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31142,9 +37676,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.8 color: 17408 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31152,9 +37686,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.8 color: 17408 - priority: 1265 + priority: 1222 join: ROUNDJOIN cap: ROUNDCAP } @@ -31165,29 +37699,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1093 + width: 0.8 + color: 3355443 + priority: 1083 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1312 + width: 1.1 + color: 3355443 + priority: 1319 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 + width: 1.1 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31195,9 +37729,9 @@ cont { element { scale: 17 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31205,9 +37739,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31215,9 +37749,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31228,39 +37762,29 @@ cont { element { scale: 14 lines { - width: 0.3 - color: 1714631475 - priority: 1093 + width: 0.8 + color: 3355443 + priority: 1083 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.5 - color: 858993459 - priority: 1312 - join: ROUNDJOIN - cap: ROUNDCAP - } - } - element { - scale: 16 - lines { - width: 1.0 + width: 1.1 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 17 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31268,9 +37792,9 @@ cont { element { scale: 18 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31278,9 +37802,9 @@ cont { element { scale: 19 lines { - width: 1.0 + width: 1.5 color: 3355443 - priority: 1312 + priority: 1319 join: ROUNDJOIN cap: ROUNDCAP } @@ -31293,17 +37817,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31312,17 +37836,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31331,17 +37855,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31350,17 +37874,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31369,17 +37893,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31388,17 +37912,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31407,17 +37931,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -31426,17 +37950,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -31445,17 +37969,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -31464,17 +37988,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -31483,18 +38007,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -31512,7 +38036,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -31520,17 +38044,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -31548,7 +38072,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -31566,7 +38090,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -31584,7 +38108,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -31595,17 +38119,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31614,17 +38138,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31633,17 +38157,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31652,17 +38176,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31671,17 +38195,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31690,17 +38214,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31709,17 +38233,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -31728,17 +38252,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -31747,17 +38271,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -31766,17 +38290,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -31785,18 +38309,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -31814,7 +38338,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -31822,17 +38346,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -31850,7 +38374,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -31868,7 +38392,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -31886,7 +38410,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -31897,17 +38421,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31916,17 +38440,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -31935,17 +38459,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31954,17 +38478,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -31973,17 +38497,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -31992,17 +38516,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32011,17 +38535,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32030,17 +38554,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32049,17 +38573,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32068,17 +38592,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32087,18 +38611,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32116,7 +38640,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -32124,17 +38648,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -32152,7 +38676,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32170,7 +38694,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -32188,7 +38712,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -32199,17 +38723,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -32218,17 +38742,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -32237,17 +38761,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -32256,17 +38780,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -32275,17 +38799,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32294,17 +38818,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32313,17 +38837,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32332,17 +38856,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32351,17 +38875,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32370,17 +38894,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32389,18 +38913,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32418,7 +38942,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -32426,17 +38950,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -32454,7 +38978,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32472,7 +38996,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -32490,7 +39014,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -32501,23 +39025,23 @@ cont { symbol { name: "star-s" apply_for_type: 1 - priority: 16781 + priority: 16861 } caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 - offset_y: 2 + color: 3355443 + stroke_color: 1118464 + offset_y: 5 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 8 + offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -32525,23 +39049,23 @@ cont { symbol { name: "star-m" apply_for_type: 1 - priority: 16750 + priority: 16833 } caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 - offset_y: 3 + color: 3355443 + stroke_color: 1118464 + offset_y: 6 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 13 + offset_y: 21 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32549,23 +39073,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16906 + priority: 16902 } caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 - offset_y: 4 + color: 3355443 + stroke_color: 1118464 + offset_y: 6 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 13 + offset_y: 21 text: "int_name" } - priority: 15906 + priority: 15902 } } element { @@ -32573,23 +39097,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16906 + priority: 16902 } caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 - offset_y: 5 + color: 3355443 + stroke_color: 1118464 + offset_y: 6 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 - offset_y: 15 + offset_y: 21 text: "int_name" } - priority: 15906 + priority: 15902 } } element { @@ -32597,23 +39121,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16906 + priority: 16902 } caption { primary { height: 12 - color: 8947848 - stroke_color: 1712394496 - offset_y: 5 + color: 3355443 + stroke_color: 1118464 + offset_y: 6 } secondary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 1712394496 - offset_y: 5 + offset_y: 21 text: "int_name" } - priority: 15906 + priority: 15902 } } element { @@ -32621,23 +39145,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16765 + priority: 16847 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 3 + offset_y: 6 } secondary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 3 + offset_y: 21 text: "int_name" } - priority: 15765 + priority: 15847 } } element { @@ -32645,23 +39169,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16906 + priority: 16902 } caption { primary { height: 12 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 3 + offset_y: 6 } secondary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 3 + offset_y: 21 text: "int_name" } - priority: 15906 + priority: 15902 } } element { @@ -32669,23 +39193,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16765 + priority: 16847 } caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15765 + priority: 15847 } } element { @@ -32693,23 +39217,23 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16765 + priority: 16847 } caption { primary { height: 16 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 15 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15765 + priority: 15847 } } element { @@ -32717,7 +39241,7 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16015 + priority: 16013 } caption { primary { @@ -32733,7 +39257,7 @@ cont { offset_y: 4 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -32741,7 +39265,7 @@ cont { symbol { name: "star-l" apply_for_type: 1 - priority: 16015 + priority: 16013 } caption { primary { @@ -32757,7 +39281,7 @@ cont { offset_y: 4 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -32768,17 +39292,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -32787,17 +39311,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -32806,17 +39330,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -32825,17 +39349,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -32844,17 +39368,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32863,17 +39387,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -32882,17 +39406,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32901,17 +39425,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -32920,17 +39444,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32939,17 +39463,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -32958,18 +39482,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -32987,7 +39511,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -32995,17 +39519,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -33023,7 +39547,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33041,7 +39565,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -33059,7 +39583,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -33070,17 +39594,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33089,17 +39613,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33108,17 +39632,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33127,17 +39651,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33146,17 +39670,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33165,17 +39689,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33184,17 +39708,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33203,17 +39727,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33222,17 +39746,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33241,17 +39765,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33260,18 +39784,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33289,7 +39813,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -33297,17 +39821,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -33325,7 +39849,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33343,7 +39867,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -33361,7 +39885,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -33372,17 +39896,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33391,17 +39915,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33410,17 +39934,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33429,17 +39953,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33448,17 +39972,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33467,17 +39991,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33486,17 +40010,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33505,17 +40029,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33524,17 +40048,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33543,17 +40067,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33562,18 +40086,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33591,7 +40115,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -33599,17 +40123,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -33627,7 +40151,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33645,7 +40169,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -33663,7 +40187,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -33674,17 +40198,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33693,17 +40217,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33712,17 +40236,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33731,17 +40255,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -33750,17 +40274,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33769,17 +40293,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -33788,17 +40312,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33807,17 +40331,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -33826,17 +40350,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33845,17 +40369,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -33864,18 +40388,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33893,7 +40417,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -33901,17 +40425,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -33929,7 +40453,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -33947,7 +40471,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -33965,7 +40489,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -33976,17 +40500,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -33995,17 +40519,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34014,17 +40538,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34033,17 +40557,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34052,17 +40576,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34071,17 +40595,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34090,17 +40614,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34109,17 +40633,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34128,17 +40652,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34147,17 +40671,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34166,18 +40690,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34195,7 +40719,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -34203,17 +40727,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -34231,7 +40755,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34249,7 +40773,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -34267,7 +40791,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -34278,17 +40802,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34297,17 +40821,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34316,17 +40840,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34335,17 +40859,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34354,17 +40878,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34373,17 +40897,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34392,17 +40916,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34411,17 +40935,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34430,17 +40954,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34449,17 +40973,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34468,18 +40992,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34497,7 +41021,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -34505,17 +41029,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -34533,7 +41057,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34551,7 +41075,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -34569,7 +41093,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -34580,17 +41104,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34599,17 +41123,17 @@ cont { caption { primary { height: 9 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 8 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=1000000" } @@ -34618,17 +41142,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34637,17 +41161,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=150000" } @@ -34656,17 +41180,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34675,17 +41199,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } apply_if: "population>=50000" } @@ -34694,17 +41218,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34713,17 +41237,17 @@ cont { caption { primary { height: 10 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 9 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15828 + priority: 15875 } apply_if: "population>=40000" } @@ -34732,17 +41256,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34751,17 +41275,17 @@ cont { caption { primary { height: 11 - color: 8947848 - stroke_color: 1712394496 + color: 3355443 + stroke_color: 1118464 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 1712394496 offset_y: 20 text: "int_name" } - priority: 15718 + priority: 15805 } apply_if: "population>=40000" } @@ -34770,18 +41294,18 @@ cont { caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 4 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34799,7 +41323,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } } element { @@ -34807,17 +41331,17 @@ cont { caption { primary { height: 14 - color: 8947848 + color: 3355443 stroke_color: 2148602112 } secondary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15781 + priority: 15861 } } element { @@ -34835,7 +41359,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15750 + priority: 15833 } } element { @@ -34853,7 +41377,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -34871,7 +41395,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } } @@ -34884,7 +41408,7 @@ cont { height: 12 color: 4473924 } - priority: 15687 + priority: 15694 } } element { @@ -34894,7 +41418,7 @@ cont { height: 14 color: 4473924 } - priority: 15687 + priority: 15694 } } } @@ -34913,7 +41437,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } } element { @@ -34923,7 +41447,13 @@ cont { height: 14 color: 4473924 } - priority: 15640 + secondary { + height: 12 + color: 4473924 + offset_y: 20 + text: "int_name" + } + priority: 15652 } } element { @@ -34939,7 +41469,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15640 + priority: 15652 } } element { @@ -34949,7 +41479,13 @@ cont { height: 18 color: 4473924 } - priority: 15640 + secondary { + height: 16 + color: 4473924 + offset_y: 20 + text: "int_name" + } + priority: 15652 } } element { @@ -34959,7 +41495,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -34969,7 +41505,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -34979,7 +41515,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -34989,7 +41525,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -34999,7 +41535,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -35009,7 +41545,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -35019,7 +41555,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -35029,7 +41565,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -35039,7 +41575,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -35049,7 +41585,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -35059,7 +41595,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -35069,7 +41605,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } element { @@ -35079,7 +41615,7 @@ cont { height: 18 color: 4473924 } - priority: 15640 + priority: 15652 } } } @@ -35092,6 +41628,12 @@ cont { height: 12 color: 5592405 } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } priority: 15000 } } @@ -35102,6 +41644,12 @@ cont { height: 12 color: 5592405 } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } priority: 15000 } } @@ -35112,6 +41660,12 @@ cont { height: 12 color: 5592405 } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } priority: 15000 } } @@ -35122,6 +41676,12 @@ cont { height: 12 color: 5592405 } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } priority: 15000 } } @@ -35132,6 +41692,12 @@ cont { height: 12 color: 5592405 } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } priority: 15000 } } @@ -35142,6 +41708,12 @@ cont { height: 12 color: 5592405 } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } priority: 15000 } } @@ -35153,10 +41725,10 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 4473924 stroke_color: 3004240128 } - priority: 15015 + priority: 15013 } } element { @@ -35164,10 +41736,10 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 4473924 stroke_color: 3004240128 } - priority: 15015 + priority: 15013 } } element { @@ -35175,10 +41747,10 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 4473924 stroke_color: 3004240128 } - priority: 15015 + priority: 15013 } } element { @@ -35186,10 +41758,10 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 4473924 stroke_color: 3004240128 } - priority: 15015 + priority: 15013 } } element { @@ -35197,10 +41769,10 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 4473924 stroke_color: 3004240128 } - priority: 15015 + priority: 15013 } } element { @@ -35208,10 +41780,10 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 4473924 stroke_color: 3004240128 } - priority: 15015 + priority: 15013 } } element { @@ -35219,10 +41791,10 @@ cont { caption { primary { height: 12 - color: 6710886 + color: 4473924 stroke_color: 3004240128 } - priority: 15015 + priority: 15013 } } } @@ -35309,6 +41881,105 @@ cont { } } } +cont { + name: "place-isolated_dwelling" + element { + scale: 14 + caption { + primary { + height: 12 + color: 5592405 + } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 15 + caption { + primary { + height: 12 + color: 5592405 + } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 16 + caption { + primary { + height: 12 + color: 5592405 + } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 17 + caption { + primary { + height: 12 + color: 5592405 + } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 18 + caption { + primary { + height: 12 + color: 5592405 + } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } + element { + scale: 19 + caption { + primary { + height: 12 + color: 5592405 + } + secondary { + height: 10 + color: 5592405 + offset_y: 20 + text: "int_name" + } + priority: 15000 + } + } +} cont { name: "place-locality" element { @@ -35540,7 +42211,7 @@ cont { height: 15 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35550,7 +42221,7 @@ cont { height: 15 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35560,7 +42231,7 @@ cont { height: 16 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35570,7 +42241,7 @@ cont { height: 17 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35580,7 +42251,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35590,7 +42261,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35600,7 +42271,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35610,7 +42281,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35620,7 +42291,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35630,7 +42301,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35640,7 +42311,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35650,7 +42321,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35660,7 +42331,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35670,7 +42341,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35680,7 +42351,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35690,7 +42361,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35700,7 +42371,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35710,7 +42381,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35720,7 +42391,7 @@ cont { height: 19 color: 17510 } - priority: 15718 + priority: 15805 } } } @@ -35756,7 +42427,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35766,7 +42437,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35776,7 +42447,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35786,7 +42457,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35796,7 +42467,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35806,7 +42477,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35816,7 +42487,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35826,7 +42497,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35836,7 +42507,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35846,7 +42517,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35856,7 +42527,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35866,7 +42537,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35876,7 +42547,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35886,7 +42557,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35896,7 +42567,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } element { @@ -35906,7 +42577,7 @@ cont { height: 14 color: 17510 } - priority: 15718 + priority: 15805 } } } @@ -35935,7 +42606,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { @@ -35951,7 +42622,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { @@ -35967,23 +42638,19 @@ cont { offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { scale: 10 caption { primary { - height: 12 - color: 4473924 - } - secondary { height: 11 color: 4473924 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } } @@ -36022,7 +42689,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { @@ -36038,7 +42705,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { @@ -36054,23 +42721,19 @@ cont { offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } element { scale: 10 caption { primary { - height: 12 - color: 4473924 - } - secondary { height: 11 color: 4473924 offset_y: 20 text: "int_name" } - priority: 14985 + priority: 14987 } } } @@ -36148,7 +42811,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } apply_if: "population>=40000" } @@ -36165,7 +42828,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15708 } apply_if: "population>=40000" } @@ -36184,7 +42847,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } apply_if: "population>=20000" } @@ -36203,7 +42866,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } apply_if: "population>=20000" } @@ -36222,7 +42885,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15703 + priority: 15902 } } element { @@ -36240,7 +42903,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36252,13 +42915,13 @@ cont { stroke_color: 2148602112 } secondary { - height: 12 + height: 13 color: 7829367 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36276,7 +42939,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36294,7 +42957,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36312,7 +42975,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36330,7 +42993,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } element { @@ -36348,7 +43011,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15734 + priority: 15819 } } } @@ -36362,7 +43025,7 @@ cont { color: 10066329 stroke_color: 0 } - priority: 15703 + priority: 15708 } } element { @@ -36398,7 +43061,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -36416,7 +43079,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -36434,7 +43097,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -36452,7 +43115,7 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 } } element { @@ -36470,7 +43133,184 @@ cont { offset_y: 20 text: "int_name" } - priority: 15015 + priority: 15013 + } + } +} +cont { + name: "railway-abandoned" + element { + scale: 16 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-abandoned-bridge" + element { + scale: 16 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-abandoned-tunnel" + element { + scale: 16 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP } } } @@ -36480,12 +43320,12 @@ cont { scale: 18 lines { width: 1.0 - color: 2236945 + color: 2171161 dashdot { - dd: 2.0 - dd: 6.0 + dd: 1.8 + dd: 5.4 } - priority: 1281 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -36494,12 +43334,12 @@ cont { scale: 19 lines { width: 1.0 - color: 2236945 + color: 2171161 dashdot { - dd: 2.0 - dd: 6.0 + dd: 1.8 + dd: 5.4 } - priority: 1281 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -36511,12 +43351,12 @@ cont { scale: 18 lines { width: 1.0 - color: 2236945 + color: 2171161 dashdot { - dd: 2.0 - dd: 6.0 + dd: 1.8 + dd: 5.4 } - priority: 1281 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -36525,12 +43365,12 @@ cont { scale: 19 lines { width: 1.0 - color: 2236945 + color: 2171161 dashdot { - dd: 2.0 - dd: 6.0 + dd: 1.8 + dd: 5.4 } - priority: 1281 + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -36541,39 +43381,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1109 + width: 2.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 857874961 - priority: 1109 + width: 2.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36581,9 +43421,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36591,9 +43431,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36601,9 +43441,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36614,39 +43454,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1109 + width: 2.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 857874961 - priority: 1109 + width: 2.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36654,9 +43494,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36664,9 +43504,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36674,9 +43514,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36687,39 +43527,39 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1109 + width: 2.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 857874961 - priority: 1109 + width: 2.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36727,9 +43567,9 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36737,9 +43577,9 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36747,9 +43587,9 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 1713512977 - priority: 1109 + width: 3.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -36762,23 +43602,23 @@ cont { symbol { name: "train-s" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -36786,23 +43626,23 @@ cont { symbol { name: "train-m" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -36810,23 +43650,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -36834,23 +43674,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -36858,23 +43698,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -36882,23 +43722,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } } @@ -36907,39 +43747,50 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 0.8 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 1.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 1.2 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 2.6 + color: 2171161 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 0 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -36947,20 +43798,20 @@ cont { element { scale: 17 lines { - width: 2.0 - color: 857874961 - priority: 1531 + width: 3.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 0 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -36969,19 +43820,19 @@ cont { scale: 18 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -36990,19 +43841,19 @@ cont { scale: 19 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37013,33 +43864,33 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 0.8 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 857874961 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 1.4 - color: 2236945 - priority: 1139 + width: 1.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 + width: 2.4 + color: 2236945 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.0 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } @@ -37047,23 +43898,23 @@ cont { element { scale: 15 lines { - width: 0.8 - color: 1713512977 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 2236945 - priority: 1139 + width: 1.2 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.6 + width: 2.8 + color: 2236945 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.4 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } @@ -37071,58 +43922,69 @@ cont { element { scale: 16 lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 2.6 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 2.0 + width: 3.0 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.6 + width: 3.6 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } + lines { + width: 1.3 + color: 0 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 + join: ROUNDJOIN + cap: ROUNDCAP + } } element { scale: 17 lines { - width: 2.0 - color: 857874961 - priority: 1531 + width: 3.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.4 + width: 6.4 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 + width: 8.0 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.0 + width: 2.0 color: 0 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37131,33 +43993,33 @@ cont { scale: 18 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 + width: 6.4 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 + width: 8.0 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37166,33 +44028,33 @@ cont { scale: 19 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 + width: 6.4 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 + width: 8.0 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37203,72 +44065,83 @@ cont { element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 0.8 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 2.5 - color: 2236945 + width: 3.0 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 1.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 2.8 - color: 2236945 + width: 3.2 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 1.2 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 2.8 - color: 2236945 + width: 4.6 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 2.6 + color: 2171161 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 0 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37276,31 +44149,31 @@ cont { element { scale: 17 lines { - width: 4.0 - color: 2236945 + width: 5.0 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 - color: 857874961 - priority: 1531 + width: 3.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 0 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37309,30 +44182,30 @@ cont { scale: 18 lines { width: 5.0 - color: 2236945 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37341,30 +44214,30 @@ cont { scale: 19 lines { width: 5.0 - color: 2236945 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37375,29 +44248,29 @@ cont { element { scale: 14 lines { - width: 0.9 - color: 2149720593 - priority: 1625 + width: 1.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37406,8 +44279,8 @@ cont { scale: 17 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37416,8 +44289,8 @@ cont { scale: 18 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37426,8 +44299,8 @@ cont { scale: 19 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37438,29 +44311,29 @@ cont { element { scale: 14 lines { - width: 0.9 - color: 2149720593 - priority: 1625 + width: 1.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37469,8 +44342,8 @@ cont { scale: 17 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37479,8 +44352,8 @@ cont { scale: 18 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37489,8 +44362,8 @@ cont { scale: 19 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37501,29 +44374,29 @@ cont { element { scale: 14 lines { - width: 0.9 - color: 2149720593 - priority: 1625 + width: 1.0 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37532,8 +44405,8 @@ cont { scale: 17 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37542,8 +44415,8 @@ cont { scale: 18 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37552,8 +44425,8 @@ cont { scale: 19 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37564,19 +44437,19 @@ cont { element { scale: 15 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37585,8 +44458,8 @@ cont { scale: 17 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37595,8 +44468,8 @@ cont { scale: 18 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37605,8 +44478,8 @@ cont { scale: 19 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37617,19 +44490,19 @@ cont { element { scale: 15 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37638,8 +44511,8 @@ cont { scale: 17 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37648,8 +44521,8 @@ cont { scale: 18 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37658,8 +44531,8 @@ cont { scale: 19 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37670,19 +44543,19 @@ cont { element { scale: 15 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.9 - color: 857874961 - priority: 1625 + width: 1.2 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37691,8 +44564,8 @@ cont { scale: 17 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37701,8 +44574,8 @@ cont { scale: 18 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -37711,8 +44584,185 @@ cont { scale: 19 lines { width: 2.0 - color: 857874961 - priority: 1625 + color: 2171161 + priority: 1638 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-preserved" + element { + scale: 16 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-preserved-bridge" + element { + scale: 16 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } +} +cont { + name: "railway-preserved-tunnel" + element { + scale: 16 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 17 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 18 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 + join: ROUNDJOIN + cap: ROUNDCAP + } + } + element { + scale: 19 + lines { + width: 1.6 + color: 2171161 + dashdot { + dd: 6.3 + dd: 6.3 + } + priority: 1388 join: ROUNDJOIN cap: ROUNDCAP } @@ -37723,59 +44773,70 @@ cont { element { scale: 11 lines { - width: 0.5 - color: 2236945 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 2171161 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.5 - color: 2236945 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 2171161 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 0.8 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 1.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 1.2 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 2.6 + color: 2171161 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 0 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37783,20 +44844,20 @@ cont { element { scale: 17 lines { - width: 2.0 - color: 857874961 - priority: 1531 + width: 3.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 0 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37805,19 +44866,19 @@ cont { scale: 18 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37826,19 +44887,19 @@ cont { scale: 19 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37849,53 +44910,53 @@ cont { element { scale: 11 lines { - width: 0.5 - color: 2236945 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 2171161 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.5 - color: 2236945 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 2171161 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 0.8 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 857874961 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 1.4 - color: 2236945 - priority: 1139 + width: 1.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 + width: 2.4 + color: 2236945 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.0 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } @@ -37903,23 +44964,23 @@ cont { element { scale: 15 lines { - width: 0.8 - color: 1713512977 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP - } - lines { - width: 2.0 - color: 2236945 - priority: 1139 + width: 1.2 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.6 + width: 2.8 + color: 2236945 + priority: 1110 + join: ROUNDJOIN + cap: BUTTCAP + } + lines { + width: 3.4 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } @@ -37927,58 +44988,69 @@ cont { element { scale: 16 lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 2.6 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 2.0 + width: 3.0 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.6 + width: 3.6 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } + lines { + width: 1.3 + color: 0 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 + join: ROUNDJOIN + cap: ROUNDCAP + } } element { scale: 17 lines { - width: 2.0 - color: 857874961 - priority: 1531 + width: 3.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 4.4 + width: 6.4 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 6.0 + width: 8.0 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.0 + width: 2.0 color: 0 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -37987,33 +45059,33 @@ cont { scale: 18 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 + width: 6.4 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 + width: 8.0 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38022,33 +45094,33 @@ cont { scale: 19 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 5.4 + width: 6.4 color: 2236945 - priority: 1139 + priority: 1110 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 7.0 + width: 8.0 color: 4473924 - priority: 1124 + priority: 1096 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38059,59 +45131,70 @@ cont { element { scale: 11 lines { - width: 0.5 - color: 2236945 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 2171161 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.5 - color: 2236945 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 2171161 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 0.8 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 1.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 1.2 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 2.6 + color: 2171161 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 0 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38119,20 +45202,20 @@ cont { element { scale: 17 lines { - width: 2.0 - color: 857874961 - priority: 1531 + width: 3.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 0 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38141,19 +45224,19 @@ cont { scale: 18 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38162,19 +45245,19 @@ cont { scale: 19 lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38185,92 +45268,103 @@ cont { element { scale: 11 lines { - width: 0.5 - color: 2236945 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 2171161 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 12 lines { - width: 0.5 - color: 2236945 - priority: 1531 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 2171161 + priority: 1486 + join: BEVELJOIN + cap: BUTTCAP } } element { scale: 13 lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 0.8 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 14 lines { - width: 2.5 - color: 2236945 + width: 3.0 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.5 - color: 857874961 - priority: 1531 + width: 1.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 15 lines { - width: 2.8 - color: 2236945 + width: 3.2 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 1.2 + color: 2171161 + priority: 1486 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 2.8 - color: 2236945 + width: 4.6 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 0.8 - color: 1713512977 - priority: 1531 + width: 2.6 + color: 2171161 + priority: 1486 + join: ROUNDJOIN + cap: ROUNDCAP + } + lines { + width: 1.3 + color: 0 + dashdot { + dd: 4.5 + dd: 4.5 + } + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38278,31 +45372,31 @@ cont { element { scale: 17 lines { - width: 4.0 - color: 2236945 + width: 5.0 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { - width: 2.0 - color: 857874961 - priority: 1531 + width: 3.0 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.0 + width: 2.0 color: 0 dashdot { - dd: 5.0 - dd: 5.0 + dd: 6.3 + dd: 6.3 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38311,30 +45405,30 @@ cont { scale: 18 lines { width: 5.0 - color: 2236945 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38343,30 +45437,30 @@ cont { scale: 19 lines { width: 5.0 - color: 2236945 + color: 2171161 dashdot { dd: 5.0 dd: 5.0 } - priority: 1530 + priority: 1485 join: ROUNDJOIN cap: BUTTCAP } lines { width: 3.0 - color: 857874961 - priority: 1531 + color: 2171161 + priority: 1486 join: ROUNDJOIN cap: ROUNDCAP } lines { - width: 1.5 + width: 2.0 color: 0 dashdot { - dd: 7.0 - dd: 7.0 + dd: 8.1 + dd: 8.1 } - priority: 1546 + priority: 1500 join: ROUNDJOIN cap: ROUNDCAP } @@ -38379,23 +45473,23 @@ cont { symbol { name: "train-s" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38403,23 +45497,23 @@ cont { symbol { name: "train-m" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38427,23 +45521,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38451,23 +45545,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38475,23 +45569,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38499,23 +45593,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } } @@ -38526,23 +45620,23 @@ cont { symbol { name: "train-s" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38550,23 +45644,23 @@ cont { symbol { name: "train-m" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38574,23 +45668,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38598,23 +45692,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38622,23 +45716,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38646,23 +45740,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } } @@ -38673,23 +45767,23 @@ cont { symbol { name: "train-s" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38697,23 +45791,23 @@ cont { symbol { name: "train-m" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38721,23 +45815,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16828 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { @@ -38745,23 +45839,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38769,23 +45863,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } element { @@ -38793,23 +45887,23 @@ cont { symbol { name: "train-l" apply_for_type: 1 - priority: 16921 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15921 + priority: 15777 } } } @@ -38820,23 +45914,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38844,23 +45938,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38868,23 +45962,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38892,23 +45986,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38916,23 +46010,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38940,23 +46034,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -38967,23 +46061,23 @@ cont { symbol { name: "subway-barcelona-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -38991,23 +46085,23 @@ cont { symbol { name: "subway-barcelona-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39015,23 +46109,23 @@ cont { symbol { name: "subway-barcelona-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39039,23 +46133,23 @@ cont { symbol { name: "subway-barcelona-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39063,23 +46157,23 @@ cont { symbol { name: "subway-barcelona-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39087,23 +46181,23 @@ cont { symbol { name: "subway-barcelona-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39114,23 +46208,23 @@ cont { symbol { name: "subway-berlin-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39138,23 +46232,23 @@ cont { symbol { name: "subway-berlin-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39162,23 +46256,23 @@ cont { symbol { name: "subway-berlin-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39186,23 +46280,23 @@ cont { symbol { name: "subway-berlin-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39210,23 +46304,23 @@ cont { symbol { name: "subway-berlin-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39234,23 +46328,23 @@ cont { symbol { name: "subway-berlin-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39261,23 +46355,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39285,23 +46379,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39309,23 +46403,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39333,23 +46427,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39357,23 +46451,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39381,23 +46475,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39408,23 +46502,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39432,23 +46526,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39456,23 +46550,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39480,23 +46574,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39504,23 +46598,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39528,23 +46622,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39555,23 +46649,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39579,23 +46673,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39603,23 +46697,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39627,23 +46721,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39651,23 +46745,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39675,23 +46769,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39702,23 +46796,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39726,23 +46820,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39750,23 +46844,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39774,23 +46868,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39798,23 +46892,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39822,23 +46916,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39849,23 +46943,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39873,23 +46967,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39897,23 +46991,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39921,23 +47015,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39945,23 +47039,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -39969,23 +47063,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -39996,23 +47090,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40020,23 +47114,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40044,23 +47138,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40068,23 +47162,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40092,23 +47186,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40116,23 +47210,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40143,16 +47237,16 @@ cont { symbol { name: "subway-kiev-s" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - priority: 15953 + priority: 15027 } } element { @@ -40160,23 +47254,23 @@ cont { symbol { name: "subway-kiev-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40184,23 +47278,23 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40208,7 +47302,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40217,12 +47311,12 @@ cont { offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40230,7 +47324,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40239,12 +47333,12 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40252,7 +47346,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40261,12 +47355,12 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40274,7 +47368,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40283,12 +47377,12 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40299,23 +47393,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40323,23 +47417,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40347,23 +47441,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40371,23 +47465,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40395,23 +47489,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40419,23 +47513,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40446,23 +47540,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40470,23 +47564,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40494,23 +47588,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40518,23 +47612,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40542,23 +47636,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40566,23 +47660,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40593,23 +47687,23 @@ cont { symbol { name: "subway-london-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40617,23 +47711,23 @@ cont { symbol { name: "subway-london-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40641,23 +47735,23 @@ cont { symbol { name: "subway-london-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40665,23 +47759,23 @@ cont { symbol { name: "subway-london-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40689,23 +47783,23 @@ cont { symbol { name: "subway-london-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40713,23 +47807,23 @@ cont { symbol { name: "subway-london-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40740,23 +47834,23 @@ cont { symbol { name: "subway-madrid-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40764,23 +47858,23 @@ cont { symbol { name: "subway-madrid-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40788,23 +47882,23 @@ cont { symbol { name: "subway-madrid-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40812,23 +47906,23 @@ cont { symbol { name: "subway-madrid-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40836,23 +47930,23 @@ cont { symbol { name: "subway-madrid-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40860,23 +47954,23 @@ cont { symbol { name: "subway-madrid-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -40887,16 +47981,16 @@ cont { symbol { name: "subway-minsk-s" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 offset_y: 4 } - priority: 15953 + priority: 15777 } } element { @@ -40904,23 +47998,23 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 5 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40928,23 +48022,23 @@ cont { symbol { name: "subway-minsk-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 5 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40952,7 +48046,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40961,12 +48055,12 @@ cont { offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40974,7 +48068,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -40983,12 +48077,12 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -40996,7 +48090,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41005,12 +48099,12 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41018,7 +48112,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -41027,32 +48121,47 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } cont { name: "railway-station-subway-moscow" + element { + scale: 11 + symbol { + name: "subway-moscow-s" + apply_for_type: 1 + priority: 16791 + } + } element { scale: 12 symbol { name: "subway-moscow-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 8947848 - stroke_color: 2148602112 - offset_y: 5 + color: 3355443 + stroke_color: 1118464 + offset_y: 7 } - priority: 15953 + secondary { + height: 9 + color: 3355443 + stroke_color: 2148602112 + offset_y: 22 + text: "int_name" + } + priority: 15791 } } element { @@ -41060,23 +48169,23 @@ cont { symbol { name: "subway-moscow-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 - stroke_color: 2148602112 - offset_y: 5 + height: 10 + color: 3355443 + stroke_color: 1118464 + offset_y: 7 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 28 + offset_y: 22 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41084,23 +48193,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 + height: 11 + color: 3355443 + stroke_color: 1118464 + offset_y: 9 } secondary { height: 10 - color: 8947848 - stroke_color: 2148602112 - offset_y: 6 + color: 3355443 + stroke_color: 1118464 + offset_y: 24 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41108,111 +48217,111 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 7 + height: 11 + color: 3355443 + stroke_color: 1118464 + offset_y: 9 } secondary { height: 10 - color: 8947848 - stroke_color: 2148602112 - offset_y: 7 + color: 3355443 + stroke_color: 1118464 + offset_y: 24 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 16 symbol { - name: "none" + name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 + height: 12 color: 5592405 offset_y: 7 } secondary { - height: 9 + height: 11 color: 5592405 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 17 symbol { - name: "none" + name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 + height: 12 color: 5592405 offset_y: 8 } secondary { - height: 9 + height: 11 color: 5592405 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 18 symbol { - name: "none" + name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 + height: 12 color: 5592405 offset_y: 8 } secondary { - height: 9 + height: 11 color: 5592405 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 19 symbol { - name: "none" + name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 + height: 12 color: 5592405 offset_y: 8 } secondary { - height: 9 + height: 11 color: 5592405 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41223,23 +48332,23 @@ cont { symbol { name: "subway-newyork-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41247,23 +48356,23 @@ cont { symbol { name: "subway-newyork-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41271,23 +48380,23 @@ cont { symbol { name: "subway-newyork-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41295,23 +48404,23 @@ cont { symbol { name: "subway-newyork-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41319,23 +48428,23 @@ cont { symbol { name: "subway-newyork-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41343,23 +48452,23 @@ cont { symbol { name: "subway-newyork-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41370,23 +48479,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41394,23 +48503,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41418,23 +48527,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41442,23 +48551,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41466,23 +48575,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41490,50 +48599,58 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } cont { name: "railway-station-subway-paris" + element { + scale: 13 + symbol { + name: "subway-paris-s" + apply_for_type: 1 + priority: 16000 + } + } element { scale: 14 symbol { name: "subway-paris-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41541,23 +48658,23 @@ cont { symbol { name: "subway-paris-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41565,23 +48682,23 @@ cont { symbol { name: "subway-paris-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41589,23 +48706,23 @@ cont { symbol { name: "subway-paris-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41613,23 +48730,23 @@ cont { symbol { name: "subway-paris-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41637,23 +48754,23 @@ cont { symbol { name: "subway-paris-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41664,23 +48781,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41688,23 +48805,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41712,23 +48829,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41736,23 +48853,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41760,23 +48877,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41784,23 +48901,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41811,23 +48928,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41835,23 +48952,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41859,23 +48976,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41883,23 +49000,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41907,23 +49024,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41931,23 +49048,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -41958,23 +49075,23 @@ cont { symbol { name: "subway-rome-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -41982,23 +49099,23 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42006,23 +49123,23 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42030,7 +49147,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42039,12 +49156,12 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42052,7 +49169,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42061,12 +49178,12 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42074,7 +49191,7 @@ cont { symbol { name: "none" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { @@ -42083,32 +49200,47 @@ cont { offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } cont { name: "railway-station-subway-spb" + element { + scale: 11 + symbol { + name: "subway-spb-s" + apply_for_type: 1 + priority: 16791 + } + } element { scale: 12 symbol { name: "subway-spb-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 10 - color: 8947848 + color: 3355443 + stroke_color: 2148602112 + offset_y: 8 + } + secondary { + height: 9 + color: 3355443 stroke_color: 2148602112 offset_y: 5 + text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42116,23 +49248,23 @@ cont { symbol { name: "subway-spb-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 - offset_y: 5 + offset_y: 8 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 offset_y: 5 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42140,135 +49272,135 @@ cont { symbol { name: "subway-spb-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 5 + offset_y: 8 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 5 + offset_y: 8 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 15 symbol { - name: "subway-spb-m" + name: "subway-spb-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 - offset_y: 7 + offset_y: 8 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 7 + offset_y: 8 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 16 symbol { - name: "none" + name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 + height: 12 color: 5592405 offset_y: 7 } secondary { - height: 9 + height: 11 color: 5592405 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 17 symbol { - name: "none" + name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 + height: 12 color: 5592405 offset_y: 8 } secondary { - height: 9 + height: 11 color: 5592405 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 18 symbol { - name: "none" + name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 + height: 12 color: 5592405 offset_y: 8 } secondary { - height: 9 + height: 11 color: 5592405 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { scale: 19 symbol { - name: "none" + name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 10 + height: 12 color: 5592405 offset_y: 8 } secondary { - height: 9 + height: 11 color: 5592405 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -42279,23 +49411,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42303,23 +49435,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42327,23 +49459,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42351,23 +49483,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42375,23 +49507,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42399,23 +49531,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -42426,23 +49558,23 @@ cont { symbol { name: "subway-s" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 - offset_y: 6 + offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42450,23 +49582,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { height: 10 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42474,23 +49606,23 @@ cont { symbol { name: "subway-m" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 7 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 7 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42498,23 +49630,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42522,23 +49654,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } element { @@ -42546,23 +49678,23 @@ cont { symbol { name: "subway-l" apply_for_type: 1 - priority: 16953 + priority: 16791 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 18 text: "int_name" } - priority: 15953 + priority: 15791 } } } @@ -42573,23 +49705,16 @@ cont { symbol { name: "subway-entrance-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42597,23 +49722,16 @@ cont { symbol { name: "subway-entrance-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42621,23 +49739,16 @@ cont { symbol { name: "subway-entrance-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -42648,23 +49759,16 @@ cont { symbol { name: "subway-barcelona-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42672,23 +49776,16 @@ cont { symbol { name: "subway-barcelona-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42696,23 +49793,16 @@ cont { symbol { name: "subway-barcelona-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -42723,23 +49813,16 @@ cont { symbol { name: "subway-berlin-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42747,23 +49830,16 @@ cont { symbol { name: "subway-berlin-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42771,23 +49847,16 @@ cont { symbol { name: "subway-berlin-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -42798,16 +49867,16 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - priority: 15953 + priority: 15027 } } element { @@ -42815,23 +49884,16 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15027 } } element { @@ -42839,23 +49901,16 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15027 } } element { @@ -42863,23 +49918,16 @@ cont { symbol { name: "subway-kiev-m" apply_for_type: 1 - priority: 16953 + priority: 16027 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15027 } } } @@ -42890,23 +49938,16 @@ cont { symbol { name: "subway-london-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42914,23 +49955,16 @@ cont { symbol { name: "subway-london-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42938,23 +49972,16 @@ cont { symbol { name: "subway-london-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -42965,23 +49992,16 @@ cont { symbol { name: "subway-madrid-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -42989,23 +50009,16 @@ cont { symbol { name: "subway-madrid-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43013,23 +50026,16 @@ cont { symbol { name: "subway-madrid-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -43040,16 +50046,16 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { - height: 12 - color: 8947848 + height: 11 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - priority: 15953 + priority: 15777 } } element { @@ -43057,23 +50063,16 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15777 } } element { @@ -43081,23 +50080,16 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15777 } } element { @@ -43105,23 +50097,16 @@ cont { symbol { name: "subway-minsk-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 6 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15953 + priority: 15777 } } } @@ -43132,23 +50117,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 + color: 3355443 + stroke_color: 1118464 + offset_y: 10 } secondary { - height: 10 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 + height: 11 + color: 3355443 + stroke_color: 1118464 + offset_y: 25 text: "int_name" } - priority: 15953 + priority: 15777 } } element { @@ -43156,17 +50141,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { + height: 12 + color: 3355443 + stroke_color: 1118464 + offset_y: 10 + } + secondary { height: 11 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 + color: 3355443 + stroke_color: 1118464 + offset_y: 25 text: "int_name" } - priority: 15937 + priority: 15777 } } element { @@ -43174,17 +50165,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { - height: 11 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 + height: 13 + color: 3355443 + stroke_color: 1118464 + offset_y: 10 + } + secondary { + height: 12 + color: 3355443 + stroke_color: 1118464 + offset_y: 25 text: "int_name" } - priority: 15937 + priority: 15777 } } element { @@ -43192,23 +50189,23 @@ cont { symbol { name: "subway-moscow-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 + color: 3355443 + stroke_color: 1118464 + offset_y: 10 } secondary { height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 + color: 3355443 + stroke_color: 1118464 + offset_y: 25 text: "int_name" } - priority: 15937 + priority: 15777 } } } @@ -43219,23 +50216,16 @@ cont { symbol { name: "subway-newyork-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43243,23 +50233,16 @@ cont { symbol { name: "subway-newyork-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43267,23 +50250,16 @@ cont { symbol { name: "subway-newyork-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -43294,23 +50270,16 @@ cont { symbol { name: "subway-paris-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43318,23 +50287,16 @@ cont { symbol { name: "subway-paris-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43342,23 +50304,16 @@ cont { symbol { name: "subway-paris-s" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -43369,23 +50324,16 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 13 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43393,23 +50341,16 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } element { @@ -43417,23 +50358,16 @@ cont { symbol { name: "subway-rome-m" apply_for_type: 1 - priority: 16937 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } - secondary { - height: 12 - color: 8947848 - stroke_color: 2148602112 - offset_y: 8 - text: "int_name" - } - priority: 15937 + priority: 15777 } } } @@ -43444,23 +50378,23 @@ cont { symbol { name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { - height: 13 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 20 text: "int_name" } - priority: 15953 + priority: 15777 } } element { @@ -43468,23 +50402,23 @@ cont { symbol { name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { - height: 13 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { height: 11 - color: 8947848 + color: 3355443 stroke_color: 2148602112 - offset_y: 8 + offset_y: 20 text: "int_name" } - priority: 15953 + priority: 15777 } } element { @@ -43492,23 +50426,23 @@ cont { symbol { name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 - offset_y: 8 + offset_y: 20 text: "int_name" } - priority: 15953 + priority: 15777 } } element { @@ -43516,23 +50450,23 @@ cont { symbol { name: "subway-spb-m" apply_for_type: 1 - priority: 16953 + priority: 16777 } caption { primary { height: 13 - color: 8947848 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 11 - color: 8947848 + height: 12 + color: 3355443 stroke_color: 2148602112 - offset_y: 8 + offset_y: 20 text: "int_name" } - priority: 15953 + priority: 15777 } } } @@ -43541,19 +50475,19 @@ cont { element { scale: 15 lines { - width: 0.5 - color: 1716868437 - priority: 1609 + width: 0.7 + color: 6052945 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.5 - color: 861230421 - priority: 1609 + width: 0.8 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43562,8 +50496,8 @@ cont { scale: 17 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43572,8 +50506,8 @@ cont { scale: 18 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43582,8 +50516,8 @@ cont { scale: 19 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43594,19 +50528,19 @@ cont { element { scale: 15 lines { - width: 0.5 - color: 1716868437 - priority: 1609 + width: 0.7 + color: 6052945 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.5 - color: 861230421 - priority: 1609 + width: 0.8 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43615,8 +50549,8 @@ cont { scale: 17 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43625,8 +50559,8 @@ cont { scale: 18 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43635,8 +50569,8 @@ cont { scale: 19 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43647,19 +50581,19 @@ cont { element { scale: 15 lines { - width: 0.5 - color: 1716868437 - priority: 1609 + width: 0.7 + color: 6052945 + priority: 1638 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } } element { scale: 16 lines { - width: 0.5 - color: 861230421 - priority: 1609 + width: 0.8 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43668,8 +50602,8 @@ cont { scale: 17 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43678,8 +50612,8 @@ cont { scale: 18 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43688,8 +50622,8 @@ cont { scale: 19 lines { width: 1.0 - color: 5592405 - priority: 1609 + color: 6052945 + priority: 1638 join: ROUNDJOIN cap: ROUNDCAP } @@ -43701,83 +50635,83 @@ cont { scale: 15 symbol { name: "tram-m" - priority: 16781 + priority: 16777 } } element { scale: 16 symbol { name: "tram-m" - priority: 16781 + priority: 16777 } } element { scale: 17 symbol { name: "tram-l" - priority: 16828 + priority: 16777 } caption { primary { - height: 11 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { scale: 18 symbol { name: "tram-l" - priority: 16828 + priority: 16777 } caption { primary { - height: 12 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } element { scale: 19 symbol { name: "tram-l" - priority: 16828 + priority: 16777 } caption { primary { - height: 12 - color: 8947848 + height: 10 + color: 3355443 stroke_color: 2148602112 offset_y: 8 } secondary { - height: 10 - color: 8947848 + height: 9 + color: 3355443 stroke_color: 2148602112 offset_y: 8 text: "int_name" } - priority: 15828 + priority: 15777 } } } @@ -43786,142 +50720,212 @@ cont { element { scale: 10 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 11 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 12 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 13 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 14 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 15 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16250 } } element { scale: 16 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16250 + } } element { scale: 17 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } element { scale: 18 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } element { scale: 19 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } } cont { @@ -43929,142 +50933,212 @@ cont { element { scale: 10 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 11 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 12 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 13 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 14 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 15 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16250 } } element { scale: 16 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16250 + } } element { scale: 17 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } element { scale: 18 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } element { scale: 19 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } } cont { @@ -44072,142 +51146,212 @@ cont { element { scale: 10 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 11 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 12 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 - join: ROUNDJOIN - cap: ROUNDCAP + priority: 1263 + join: BEVELJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 13 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 14 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16263 } } element { scale: 15 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP + } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16250 } } element { scale: 16 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1250 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 9 + color: 17510 + } + priority: 16250 + } } element { scale: 17 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } element { scale: 18 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } element { scale: 19 lines { - width: 0.8 - color: 2245700 + width: 1.0 + color: 2770241 dashdot { - dd: 3.0 - dd: 2.0 + dd: 5.4 + dd: 2.7 } - priority: 1390 + priority: 1263 join: ROUNDJOIN cap: ROUNDCAP } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16263 + } } } cont { @@ -44216,7 +51360,7 @@ cont { scale: 19 symbol { name: "shop-m" - priority: 16843 + priority: 16736 } caption { primary { @@ -44224,7 +51368,7 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15736 } } } @@ -44235,7 +51379,7 @@ cont { symbol { name: "alcohol-l" apply_for_type: 1 - priority: 16000 + priority: 16722 } caption { primary { @@ -44243,14 +51387,14 @@ cont { color: 5592405 offset_y: 10 } - priority: 15000 + priority: 15722 } } element { scale: 19 symbol { - name: "alcohol-l" - priority: 16843 + name: "shop-m" + priority: 16736 } caption { primary { @@ -44258,17 +51402,17 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15736 } } } cont { name: "shop-bakery" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "bakery-l" + priority: 16722 } caption { primary { @@ -44276,17 +51420,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "bakery-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-beauty" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "beauty-l" + priority: 16722 } caption { primary { @@ -44294,17 +51453,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "beauty-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-beverages" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "alcohol-l" + priority: 16722 } caption { primary { @@ -44312,17 +51486,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "alcohol-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-bicycle" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "shop-bicycle-l" + priority: 16722 } caption { primary { @@ -44330,17 +51519,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "shop-bicycle-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-books" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "book-shop-l" + priority: 16722 } caption { primary { @@ -44348,17 +51552,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "book-shop-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-butcher" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "butcher-l" + priority: 16722 } caption { primary { @@ -44366,17 +51585,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "butcher-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-car" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "car_sharing-l" + priority: 16722 } caption { primary { @@ -44384,17 +51618,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "car_sharing-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-car_repair" element { - scale: 19 + scale: 17 symbol { - name: "shop-m" - priority: 16843 + name: "car-repair-l" + priority: 16736 } caption { primary { @@ -44402,17 +51651,47 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15736 + } + } + element { + scale: 18 + symbol { + name: "car-repair-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "car-repair-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-chemist" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "chemist-l" + priority: 16722 } caption { primary { @@ -44420,17 +51699,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "chemist-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-clothes" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "clothes-l" + priority: 16722 } caption { primary { @@ -44438,17 +51732,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "clothes-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-computer" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "computer-l" + priority: 16722 } caption { primary { @@ -44456,17 +51765,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "computer-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-confectionery" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "sweets-l" + priority: 16722 } caption { primary { @@ -44474,17 +51798,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "sweets-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-convenience" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "convenience-l" + priority: 16722 } caption { primary { @@ -44492,17 +51831,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "convenience-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-department_store" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "department_store-l" + priority: 16722 } caption { primary { @@ -44510,17 +51864,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "department_store-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-doityourself" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "doityourself-l" + priority: 16722 } caption { primary { @@ -44528,17 +51897,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "doityourself-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-electronics" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "electronics-l" + priority: 16722 } caption { primary { @@ -44546,17 +51930,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "electronics-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-florist" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "florist-l" + priority: 16722 } caption { primary { @@ -44564,17 +51963,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "florist-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-furniture" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "furniture-l" + priority: 16722 } caption { primary { @@ -44582,17 +51996,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "furniture-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-garden_centre" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "garden_center-l" + priority: 16722 } caption { primary { @@ -44600,17 +52029,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "garden_center-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-gift" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "gift-l" + priority: 16722 } caption { primary { @@ -44618,17 +52062,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "gift-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-greengrocer" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "greengrocer-l" + priority: 16722 } caption { primary { @@ -44636,17 +52095,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "greengrocer-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-hairdresser" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "hairdresser-l" + priority: 16722 } caption { primary { @@ -44654,17 +52128,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "hairdresser-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-hardware" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "hardware-l" + priority: 16722 } caption { primary { @@ -44672,17 +52161,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "hardware-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-jewelry" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "jewelry-l" + priority: 16722 } caption { primary { @@ -44690,17 +52194,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "jewelry-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-kiosk" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "kiosk-l" + priority: 16722 } caption { primary { @@ -44708,17 +52227,33 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "kiosk-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-laundry" element { - scale: 18 + scale: 17 symbol { name: "laundry-l" - priority: 16921 + apply_for_type: 1 + priority: 16944 } caption { primary { @@ -44726,14 +52261,29 @@ cont { color: 5592405 offset_y: 10 } - priority: 15921 + priority: 15944 + } + } + element { + scale: 18 + symbol { + name: "laundry-l" + priority: 16944 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15944 } } element { scale: 19 symbol { - name: "laundry-l" - priority: 16921 + name: "shop-m" + priority: 16736 } caption { primary { @@ -44741,7 +52291,7 @@ cont { color: 5592405 offset_y: 10 } - priority: 15921 + priority: 15736 } } } @@ -44752,15 +52302,15 @@ cont { symbol { name: "shop-m" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { @@ -44768,15 +52318,15 @@ cont { symbol { name: "shop-l" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { @@ -44784,40 +52334,40 @@ cont { symbol { name: "shop-l" apply_for_type: 1 - priority: 16000 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15750 } } element { scale: 19 symbol { - name: "shop-l" - priority: 16843 + name: "shop-m" + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15843 + priority: 15736 } } } cont { name: "shop-mobile_phone" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "mobile_phone-l" + priority: 16722 } caption { primary { @@ -44825,17 +52375,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "mobile_phone-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-optician" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "optician-l" + priority: 16722 } caption { primary { @@ -44843,17 +52408,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "optician-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-shoes" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "shoes-l" + priority: 16722 } caption { primary { @@ -44861,17 +52441,32 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "shoes-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } cont { name: "shop-sports" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "sports-l" + priority: 16722 } caption { primary { @@ -44879,7 +52474,22 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "sports-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -44890,7 +52500,7 @@ cont { symbol { name: "grocery-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { @@ -44898,7 +52508,7 @@ cont { color: 5592405 offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -44906,7 +52516,7 @@ cont { symbol { name: "grocery-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { @@ -44914,14 +52524,14 @@ cont { color: 5592405 offset_y: 10 } - priority: 15000 + priority: 15736 } } element { scale: 19 symbol { - name: "grocery-l" - priority: 16843 + name: "shop-m" + priority: 16736 } caption { primary { @@ -44929,17 +52539,17 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15736 } } } cont { name: "shop-toys" element { - scale: 19 + scale: 18 symbol { - name: "shop-m" - priority: 16843 + name: "toys-l" + priority: 16722 } caption { primary { @@ -44947,7 +52557,22 @@ cont { color: 5592405 offset_y: 10 } - priority: 15843 + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "toys-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -44958,15 +52583,15 @@ cont { symbol { name: "america-football-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -44974,15 +52599,48 @@ cont { symbol { name: "america-football-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 + } + } +} +cont { + name: "sport-archery" + element { + scale: 18 + symbol { + name: "archery-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "archery-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -44993,15 +52651,15 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45009,15 +52667,48 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 + } + } +} +cont { + name: "sport-australian_football" + element { + scale: 18 + symbol { + name: "australian-football-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "australian-football-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -45028,15 +52719,15 @@ cont { symbol { name: "baseball-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45044,15 +52735,15 @@ cont { symbol { name: "baseball-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } } @@ -45063,15 +52754,15 @@ cont { symbol { name: "basketball-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45079,15 +52770,147 @@ cont { symbol { name: "basketball-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 + } + } +} +cont { + name: "sport-bowls" + element { + scale: 18 + symbol { + name: "bowls-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "bowls-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "sport-cricket" + element { + scale: 18 + symbol { + name: "cricket-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "cricket-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "sport-curling" + element { + scale: 18 + symbol { + name: "curling-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "curling-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } +} +cont { + name: "sport-diving" + element { + scale: 18 + symbol { + name: "diving-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "diving-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -45098,15 +52921,15 @@ cont { symbol { name: "golf-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45114,15 +52937,15 @@ cont { symbol { name: "golf-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } } @@ -45133,15 +52956,15 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45149,15 +52972,48 @@ cont { symbol { name: "pitch-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 + } + } +} +cont { + name: "sport-scuba_diving" + element { + scale: 18 + symbol { + name: "diving-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 + } + } + element { + scale: 19 + symbol { + name: "diving-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } } @@ -45167,66 +53023,66 @@ cont { scale: 16 area { color: 1118464 - priority: -15922 + priority: -15945 } } element { scale: 17 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "soccer-l" - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 18 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "soccer-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } element { scale: 19 area { color: 1118464 - priority: -15922 + priority: -15264 } symbol { name: "soccer-l" apply_for_type: 1 - priority: 16078 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15078 + priority: 15736 } } } @@ -45237,15 +53093,15 @@ cont { symbol { name: "swimming-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45253,15 +53109,15 @@ cont { symbol { name: "swimming-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } } @@ -45272,15 +53128,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45288,15 +53144,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } element { @@ -45304,15 +53160,15 @@ cont { symbol { name: "tennis-l" apply_for_type: 1 - priority: 16000 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15000 + priority: 15736 } } } @@ -45320,22 +53176,32 @@ cont { name: "tourism-alpine_hut" element { scale: 18 + symbol { + name: "alpine_hut-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 + symbol { + name: "alpine_hut-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45346,15 +53212,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45362,15 +53228,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45378,15 +53244,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45397,15 +53263,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45413,15 +53279,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45429,15 +53295,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45447,67 +53313,67 @@ cont { scale: 15 symbol { name: "campsite-m" - priority: 16781 + priority: 16763 } } element { scale: 16 symbol { name: "campsite-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 12 } - priority: 15781 + priority: 15763 } } element { scale: 17 symbol { name: "campsite-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 18 symbol { name: "campsite-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { scale: 19 symbol { name: "campsite-l" - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45515,22 +53381,32 @@ cont { name: "tourism-caravan_site" element { scale: 18 + symbol { + name: "caravan_site-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 + symbol { + name: "caravan_site-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45538,22 +53414,32 @@ cont { name: "tourism-guest_house" element { scale: 18 + symbol { + name: "motel-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 + symbol { + name: "motel-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45564,15 +53450,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45580,15 +53466,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45596,15 +53482,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45615,15 +53501,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45631,15 +53517,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } element { @@ -45647,15 +53533,15 @@ cont { symbol { name: "hotel-l" apply_for_type: 1 - priority: 16781 + priority: 16750 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15750 } } } @@ -45666,15 +53552,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45682,15 +53568,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45698,15 +53584,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -45717,15 +53603,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45733,15 +53619,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45749,15 +53635,15 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -45768,47 +53654,45 @@ cont { symbol { name: "information-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 18 symbol { - name: "information-l" - apply_for_type: 1 - priority: 16781 + name: "office-l" + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { scale: 19 symbol { - name: "information-l" - apply_for_type: 1 - priority: 16781 + name: "office-l" + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -45816,22 +53700,32 @@ cont { name: "tourism-motel" element { scale: 18 + symbol { + name: "motel-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } element { scale: 19 + symbol { + name: "motel-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45841,98 +53735,124 @@ cont { scale: 15 symbol { name: "museum-m" - priority: 16781 + priority: 16763 + min_distance: 1 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 16 symbol { name: "museum-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 12 } - priority: 15781 + priority: 15763 } } element { scale: 17 symbol { name: "museum-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 18 symbol { name: "museum-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 19 symbol { name: "museum-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } } cont { name: "tourism-picnic_site" element { - scale: 18 + scale: 17 + symbol { + name: "picnic-l" + priority: 16736 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15736 + } + } + element { + scale: 18 + symbol { + name: "picnic-l" + priority: 16722 + } + caption { + primary { + height: 10 + color: 5592405 + offset_y: 10 + } + priority: 15722 } } element { scale: 19 + symbol { + name: "picnic-l" + priority: 16722 + } caption { primary { height: 10 color: 5592405 + offset_y: 10 } - priority: 15781 + priority: 15722 } } } @@ -45943,15 +53863,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45959,15 +53879,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } element { @@ -45975,15 +53895,15 @@ cont { symbol { name: "tourism-l" apply_for_type: 1 - priority: 16781 + priority: 16736 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15736 } } } @@ -45993,75 +53913,319 @@ cont { scale: 15 symbol { name: "zoo-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 16 symbol { name: "zoo-m" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 12 } - priority: 15781 + priority: 15763 } } element { scale: 17 symbol { name: "zoo-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 18 symbol { name: "zoo-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 } } element { scale: 19 symbol { name: "zoo-l" - priority: 16781 + priority: 16763 } caption { primary { height: 10 color: 5592405 - offset_y: 8 + offset_y: 10 } - priority: 15781 + priority: 15763 + } + } +} +cont { + name: "waterway-canal" + element { + scale: 13 + lines { + width: 0.2 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 14 + lines { + width: 0.2 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 15 + lines { + width: 1.0 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 16 + lines { + width: 1.5 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 17 + lines { + width: 1.5 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 11 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 18 + lines { + width: 1.5 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 12 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 19 + lines { + width: 1.5 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 12 + color: 17510 + } + priority: 16916 + } + } +} +cont { + name: "waterway-canal-tunnel" + element { + scale: 13 + lines { + width: 0.2 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 14 + lines { + width: 0.2 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 11 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 15 + lines { + width: 1.0 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: BUTTCAP + } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 16 + lines { + width: 1.5 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 10 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 17 + lines { + width: 1.5 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 11 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 18 + lines { + width: 1.5 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 12 + color: 17510 + } + priority: 16916 + } + } + element { + scale: 19 + lines { + width: 1.5 + color: 401446 + priority: 1916 + join: ROUNDJOIN + cap: ROUNDCAP + } + path_text { + primary { + height: 12 + color: 17510 + } + priority: 16916 } } } @@ -46071,25 +54235,25 @@ cont { scale: 15 lines { width: 1.0 - color: 860111940 - priority: 1640 + color: 4473924 + priority: 1652 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 10 color: 5592405 } - priority: 16640 + priority: 16652 } } element { scale: 16 lines { width: 1.0 - color: 860111940 - priority: 1640 + color: 4473924 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -46098,15 +54262,15 @@ cont { height: 10 color: 5592405 } - priority: 16640 + priority: 16652 } } element { scale: 17 lines { width: 1.0 - color: 860111940 - priority: 1640 + color: 4473924 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -46115,15 +54279,15 @@ cont { height: 10 color: 5592405 } - priority: 16640 + priority: 16652 } } element { scale: 18 lines { width: 1.0 - color: 860111940 - priority: 1640 + color: 4473924 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -46132,15 +54296,15 @@ cont { height: 10 color: 5592405 } - priority: 16640 + priority: 16652 } } element { scale: 19 lines { width: 1.0 - color: 860111940 - priority: 1640 + color: 4473924 + priority: 1652 join: ROUNDJOIN cap: ROUNDCAP } @@ -46149,7 +54313,7 @@ cont { height: 10 color: 5592405 } - priority: 16640 + priority: 16652 } } } @@ -46158,13 +54322,13 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 8738 + width: 1.8 + color: 401446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46172,13 +54336,13 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 8738 + width: 1.8 + color: 401446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46186,13 +54350,13 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 8738 + width: 1.8 + color: 401446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46203,13 +54367,13 @@ cont { element { scale: 17 lines { - width: 1.0 - color: 8738 + width: 1.8 + color: 401446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46217,13 +54381,13 @@ cont { element { scale: 18 lines { - width: 1.0 - color: 8738 + width: 1.8 + color: 401446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46231,13 +54395,13 @@ cont { element { scale: 19 lines { - width: 1.0 - color: 8738 + width: 1.8 + color: 401446 dashdot { dd: 1.0 dd: 1.0 } - priority: 1250 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } @@ -46249,140 +54413,140 @@ cont { scale: 0 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 1 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 2 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 3 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 4 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 5 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 6 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 7 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 8 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 9 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 10 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 11 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 12 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 13 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 14 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 15 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 16 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 17 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 18 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 19 area { color: 8738 - priority: -15735 + priority: -15778 } } } @@ -46391,204 +54555,204 @@ cont { element { scale: 10 lines { - width: 0.5 - color: 2147492386 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } } element { scale: 11 lines { - width: 0.7 - color: 855646754 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 12 lines { - width: 0.7 - color: 855646754 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 13 lines { - width: 1.0 - color: 8738 - priority: 1250 + width: 1.2 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 14 lines { - width: 1.0 - color: 8738 - priority: 1250 + width: 1.2 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 15 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 16 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 17 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 11 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 18 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 19 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 17510 } - priority: 16250 + priority: 16208 } } } @@ -46597,204 +54761,204 @@ cont { element { scale: 10 lines { - width: 0.5 - color: 2147492386 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } } element { scale: 11 lines { - width: 0.7 - color: 855646754 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 12 lines { - width: 0.7 - color: 855646754 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 13 lines { - width: 1.0 - color: 8738 - priority: 1250 + width: 1.2 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 14 lines { - width: 1.0 - color: 8738 - priority: 1250 + width: 1.2 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 15 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 16 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 17 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 11 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 18 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 19 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 17510 } - priority: 16250 + priority: 16208 } } } @@ -46804,273 +54968,273 @@ cont { scale: 0 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 1 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 2 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 3 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 4 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 5 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 6 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 7 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 8 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 9 area { color: 8738 - priority: -15735 + priority: -15778 } } element { scale: 10 lines { - width: 0.5 - color: 2147492386 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.6 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } } element { scale: 11 lines { - width: 0.7 - color: 855646754 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 12 lines { - width: 0.7 - color: 855646754 - priority: 1250 - join: ROUNDJOIN - cap: ROUNDCAP + width: 0.8 + color: 401446 + priority: 1208 + join: BEVELJOIN + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 13 lines { - width: 1.0 - color: 8738 - priority: 1250 + width: 1.2 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 14 lines { - width: 1.0 - color: 8738 - priority: 1250 + width: 1.2 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 15 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 16 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { height: 10 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 17 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 11 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 18 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 17510 } - priority: 16250 + priority: 16208 } } element { scale: 19 lines { width: 1.8 - color: 8738 - priority: 1250 + color: 401446 + priority: 1208 join: ROUNDJOIN cap: ROUNDCAP } area { color: 8738 - priority: -15750 + priority: -15792 } path_text { primary { - height: 10 + height: 12 color: 17510 } - priority: 16250 + priority: 16208 } } } @@ -47079,77 +55243,77 @@ cont { element { scale: 13 lines { - width: 0.1 - color: 1711284770 - priority: 1250 + width: 0.2 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 14 lines { - width: 0.1 - color: 1711284770 - priority: 1250 + width: 0.2 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 15 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 11 + height: 10 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 16 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 10 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 17 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } @@ -47158,41 +55322,41 @@ cont { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 18 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 19 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 17510 } - priority: 16250 + priority: 16916 } } } @@ -47201,77 +55365,77 @@ cont { element { scale: 13 lines { - width: 0.1 - color: 1711284770 - priority: 1250 + width: 0.2 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 14 lines { - width: 0.1 - color: 1711284770 - priority: 1250 + width: 0.2 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 15 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 11 + height: 10 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 16 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 10 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 17 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } @@ -47280,41 +55444,41 @@ cont { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 18 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 19 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 17510 } - priority: 16250 + priority: 16916 } } } @@ -47323,94 +55487,94 @@ cont { element { scale: 13 lines { - width: 0.1 - color: 1711284770 + width: 0.2 + color: 401446 dashdot { - dd: 3.0 - dd: 3.0 + dd: 2.7 + dd: 2.7 } - priority: 1250 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 14 lines { - width: 0.1 - color: 1711284770 + width: 0.2 + color: 401446 dashdot { - dd: 3.0 - dd: 3.0 + dd: 2.7 + dd: 2.7 } - priority: 1250 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 15 lines { width: 1.0 - color: 8738 + color: 401446 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 11 + height: 10 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 16 lines { width: 1.0 - color: 8738 + color: 401446 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 10 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 17 lines { width: 1.0 - color: 8738 + color: 401446 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } @@ -47419,47 +55583,47 @@ cont { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 18 lines { width: 1.0 - color: 8738 + color: 401446 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 19 lines { width: 1.0 - color: 8738 + color: 401446 dashdot { - dd: 5.5 + dd: 4.95 } - priority: 1250 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 17510 } - priority: 16250 + priority: 16916 } } } @@ -47468,77 +55632,77 @@ cont { element { scale: 13 lines { - width: 0.1 - color: 1711284770 - priority: 1250 + width: 0.2 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 14 lines { - width: 0.1 - color: 1711284770 - priority: 1250 + width: 0.2 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 15 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN - cap: ROUNDCAP + cap: BUTTCAP } path_text { primary { - height: 11 + height: 10 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 16 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 10 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 17 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } @@ -47547,41 +55711,41 @@ cont { height: 11 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 18 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 17510 } - priority: 16250 + priority: 16916 } } element { scale: 19 lines { width: 1.0 - color: 8738 - priority: 1250 + color: 401446 + priority: 1916 join: ROUNDJOIN cap: ROUNDCAP } path_text { primary { - height: 11 + height: 12 color: 17510 } - priority: 16250 + priority: 16916 } } } diff --git a/data/mapcss-mapping.csv b/data/mapcss-mapping.csv index 77597df036..8343053310 100644 --- a/data/mapcss-mapping.csv +++ b/data/mapcss-mapping.csv @@ -1038,3 +1038,5 @@ amenity|clinic;[amenity=clinic];;name;int_name;1037; barrier|entrance;[barrier=entrance];;name;int_name;1038; barrier|border_control;[barrier=border_control];;name;int_name;1039; shop|laundry;[shop=laundry];;name;int_name;1040; +amenity|vending_machine|parking_tickets;[amenity=vending_machine][vending=parking_tickets];;name;int_name;1041; +amenity|vending_machine|public_transport_tickets;[amenity=vending_machine][vending=public_transport_tickets];;name;int_name;1042; diff --git a/data/patterns.txt b/data/patterns.txt new file mode 100644 index 0000000000..6ce25f3104 --- /dev/null +++ b/data/patterns.txt @@ -0,0 +1,76 @@ +1.0 18.0 +1.0 1.0 +1.35 1.0 +1.8 1.0 +1.44 1.44 +2.7 1.26 +3.6 1.8 +4.5 1.8 +7.2 2.7 +9.0 3.6 +10.8 4.5 +13.5 5.4 +18.0 6.3 +2.0 2.0 +5.0 5.0 +2.52 1.35 +2.0 1.0 +3.6 1.44 +5.0 2.0 +5.4 2.7 +7.0 3.0 +16.2 8.1 +1.5 1.5 +2.3 2.3 +3.2 3.2 +4.0 4.0 +6.3 6.3 +1.8 5.4 +4.5 4.5 +8.1 8.1 +2.7 2.7 +4.95 +4.0 20.0 +1.0 5.2 +3.12 3.12 +12.0 12.0 +5.0 1.0 1.0 1.0 +10.0 2.0 2.0 2.0 +12.0 4.0 4.0 4.0 +8.0 4.0 +1.2 2.0 1.2 2.0 1.2 4.4 +1.0 3.0 +1.0 4.0 +1.0 2.4 +1.0 1.2 +1.6 1.6 +2.4 1.0 +3.0 1.0 +4.0 1.0 +1.0 20.0 +1.0 40.0 +8.0 8.0 +1.5 1.0 +6.0 1.0 +16.0 8.0 +2.4 4.0 2.4 4.0 +9.0 9.0 +3.6 5.4 +7.2 10.8 +9.6 14.4 +3.8 5.4 +7.6 10.8 +5.5 5.5 +11.0 11.0 +14.0 14.0 +14.4 14.4 +2.4 2.4 +2.4 2.4 2.4 2.4 2.4 12.0 +3.0 6.0 +6.0 12.0 +8.0 16.0 +7.2 16.8 +3.0 3.0 +3.0 2.0 +7.0 5.0 +12.0 8.0 diff --git a/data/resources-6plus/basic.skn b/data/resources-6plus/basic.skn deleted file mode 100644 index 7abb4de11e..0000000000 --- a/data/resources-6plus/basic.skn +++ /dev/null @@ -1,527 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-6plus/symbols.sdf b/data/resources-6plus/symbols.sdf index 38a36c18cc..71717c9318 100644 --- a/data/resources-6plus/symbols.sdf +++ b/data/resources-6plus/symbols.sdf @@ -1,179 +1,179 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-6plus_clear/basic.skn b/data/resources-6plus_clear/basic.skn deleted file mode 100644 index 16ef1d3014..0000000000 --- a/data/resources-6plus_clear/basic.skn +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-6plus_clear/symbols.png b/data/resources-6plus_clear/symbols.png index 388827aada..569569e55c 100644 Binary files a/data/resources-6plus_clear/symbols.png and b/data/resources-6plus_clear/symbols.png differ diff --git a/data/resources-6plus_clear/symbols.sdf b/data/resources-6plus_clear/symbols.sdf index 9c9ceb3d4a..8eb71a6174 100644 --- a/data/resources-6plus_clear/symbols.sdf +++ b/data/resources-6plus_clear/symbols.sdf @@ -1,309 +1,447 @@ - + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-6plus_dark/basic.skn b/data/resources-6plus_dark/basic.skn deleted file mode 100644 index 0b01dcb528..0000000000 --- a/data/resources-6plus_dark/basic.skn +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-6plus_dark/symbols.png b/data/resources-6plus_dark/symbols.png index 0e1657202f..e28f277f6d 100644 Binary files a/data/resources-6plus_dark/symbols.png and b/data/resources-6plus_dark/symbols.png differ diff --git a/data/resources-6plus_dark/symbols.sdf b/data/resources-6plus_dark/symbols.sdf index 88969b3045..e1a2622355 100644 --- a/data/resources-6plus_dark/symbols.sdf +++ b/data/resources-6plus_dark/symbols.sdf @@ -1,309 +1,444 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-default/default.ui b/data/resources-default/default.ui new file mode 100644 index 0000000000..2ab18d8422 --- /dev/null +++ b/data/resources-default/default.ui @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-hdpi/basic.skn b/data/resources-hdpi/basic.skn deleted file mode 100644 index bf417aa16b..0000000000 --- a/data/resources-hdpi/basic.skn +++ /dev/null @@ -1,527 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-hdpi_clear/basic.skn b/data/resources-hdpi_clear/basic.skn deleted file mode 100644 index f1db7db871..0000000000 --- a/data/resources-hdpi_clear/basic.skn +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-hdpi_clear/symbols.png b/data/resources-hdpi_clear/symbols.png index a2e2e00203..06f6056455 100644 Binary files a/data/resources-hdpi_clear/symbols.png and b/data/resources-hdpi_clear/symbols.png differ diff --git a/data/resources-hdpi_clear/symbols.sdf b/data/resources-hdpi_clear/symbols.sdf index 65d9cbd620..989254088f 100644 --- a/data/resources-hdpi_clear/symbols.sdf +++ b/data/resources-hdpi_clear/symbols.sdf @@ -1,309 +1,447 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-hdpi_dark/basic.skn b/data/resources-hdpi_dark/basic.skn deleted file mode 100644 index 829c58b5fa..0000000000 --- a/data/resources-hdpi_dark/basic.skn +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-hdpi_dark/symbols.png b/data/resources-hdpi_dark/symbols.png index 28a32d8c6d..20892b4e3e 100644 Binary files a/data/resources-hdpi_dark/symbols.png and b/data/resources-hdpi_dark/symbols.png differ diff --git a/data/resources-hdpi_dark/symbols.sdf b/data/resources-hdpi_dark/symbols.sdf index d478bd240b..5e60e8ca86 100644 --- a/data/resources-hdpi_dark/symbols.sdf +++ b/data/resources-hdpi_dark/symbols.sdf @@ -1,309 +1,444 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-ldpi/basic.skn b/data/resources-ldpi/basic.skn deleted file mode 100644 index 5ac3f728c9..0000000000 --- a/data/resources-ldpi/basic.skn +++ /dev/null @@ -1,527 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-ldpi/symbols.sdf b/data/resources-ldpi/symbols.sdf index 62fc4b4217..b5babad62a 100644 --- a/data/resources-ldpi/symbols.sdf +++ b/data/resources-ldpi/symbols.sdf @@ -1,6 +1,6 @@ - + diff --git a/data/resources-ldpi_clear/basic.skn b/data/resources-ldpi_clear/basic.skn deleted file mode 100644 index 83a35cd242..0000000000 --- a/data/resources-ldpi_clear/basic.skn +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-ldpi_clear/symbols.png b/data/resources-ldpi_clear/symbols.png index c0137f1379..571b160e26 100644 Binary files a/data/resources-ldpi_clear/symbols.png and b/data/resources-ldpi_clear/symbols.png differ diff --git a/data/resources-ldpi_clear/symbols.sdf b/data/resources-ldpi_clear/symbols.sdf index 2d71c0cc56..759a63fe89 100644 --- a/data/resources-ldpi_clear/symbols.sdf +++ b/data/resources-ldpi_clear/symbols.sdf @@ -1,309 +1,447 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-ldpi_dark/basic.skn b/data/resources-ldpi_dark/basic.skn deleted file mode 100644 index 308f9b0d7c..0000000000 --- a/data/resources-ldpi_dark/basic.skn +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-ldpi_dark/symbols.png b/data/resources-ldpi_dark/symbols.png index c4505a2f53..0d46ceaa10 100644 Binary files a/data/resources-ldpi_dark/symbols.png and b/data/resources-ldpi_dark/symbols.png differ diff --git a/data/resources-ldpi_dark/symbols.sdf b/data/resources-ldpi_dark/symbols.sdf index ca328569a2..3cd271312f 100644 --- a/data/resources-ldpi_dark/symbols.sdf +++ b/data/resources-ldpi_dark/symbols.sdf @@ -1,309 +1,444 @@ - + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-mdpi/basic.skn b/data/resources-mdpi/basic.skn deleted file mode 100644 index 738662ab2b..0000000000 --- a/data/resources-mdpi/basic.skn +++ /dev/null @@ -1,536 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-mdpi_clear/basic.skn b/data/resources-mdpi_clear/basic.skn deleted file mode 100644 index 435dc9a883..0000000000 --- a/data/resources-mdpi_clear/basic.skn +++ /dev/null @@ -1,926 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-mdpi_clear/symbols.png b/data/resources-mdpi_clear/symbols.png index 8add74a631..2fa0ed6080 100644 Binary files a/data/resources-mdpi_clear/symbols.png and b/data/resources-mdpi_clear/symbols.png differ diff --git a/data/resources-mdpi_clear/symbols.sdf b/data/resources-mdpi_clear/symbols.sdf index e931097e94..5cdb3225af 100644 --- a/data/resources-mdpi_clear/symbols.sdf +++ b/data/resources-mdpi_clear/symbols.sdf @@ -18,295 +18,433 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-mdpi_dark/basic.skn b/data/resources-mdpi_dark/basic.skn deleted file mode 100644 index f1561acea2..0000000000 --- a/data/resources-mdpi_dark/basic.skn +++ /dev/null @@ -1,926 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-mdpi_dark/symbols.png b/data/resources-mdpi_dark/symbols.png index e7859efeea..9342cd3a5a 100644 Binary files a/data/resources-mdpi_dark/symbols.png and b/data/resources-mdpi_dark/symbols.png differ diff --git a/data/resources-mdpi_dark/symbols.sdf b/data/resources-mdpi_dark/symbols.sdf index baa19254f3..ffa5592d83 100644 --- a/data/resources-mdpi_dark/symbols.sdf +++ b/data/resources-mdpi_dark/symbols.sdf @@ -1,6 +1,6 @@ - + @@ -18,295 +18,430 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xhdpi/basic.skn b/data/resources-xhdpi/basic.skn deleted file mode 100644 index f3471f2f6d..0000000000 --- a/data/resources-xhdpi/basic.skn +++ /dev/null @@ -1,536 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-xhdpi/symbols.sdf b/data/resources-xhdpi/symbols.sdf index 1c175304e4..fa66ddc9c5 100644 --- a/data/resources-xhdpi/symbols.sdf +++ b/data/resources-xhdpi/symbols.sdf @@ -1,182 +1,182 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xhdpi_clear/basic.skn b/data/resources-xhdpi_clear/basic.skn deleted file mode 100644 index 14991f0c4a..0000000000 --- a/data/resources-xhdpi_clear/basic.skn +++ /dev/null @@ -1,926 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-xhdpi_clear/symbols.png b/data/resources-xhdpi_clear/symbols.png index ac0f376757..eee8eabb6e 100644 Binary files a/data/resources-xhdpi_clear/symbols.png and b/data/resources-xhdpi_clear/symbols.png differ diff --git a/data/resources-xhdpi_clear/symbols.sdf b/data/resources-xhdpi_clear/symbols.sdf index 421ea7847f..4424c2c806 100644 --- a/data/resources-xhdpi_clear/symbols.sdf +++ b/data/resources-xhdpi_clear/symbols.sdf @@ -1,6 +1,6 @@ - + @@ -18,295 +18,433 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xhdpi_dark/basic.skn b/data/resources-xhdpi_dark/basic.skn deleted file mode 100644 index 2944b14130..0000000000 --- a/data/resources-xhdpi_dark/basic.skn +++ /dev/null @@ -1,926 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-xhdpi_dark/symbols.png b/data/resources-xhdpi_dark/symbols.png index 13af91a2c7..cd2da8a88f 100644 Binary files a/data/resources-xhdpi_dark/symbols.png and b/data/resources-xhdpi_dark/symbols.png differ diff --git a/data/resources-xhdpi_dark/symbols.sdf b/data/resources-xhdpi_dark/symbols.sdf index 327cbac969..b9c350ed08 100644 --- a/data/resources-xhdpi_dark/symbols.sdf +++ b/data/resources-xhdpi_dark/symbols.sdf @@ -1,6 +1,6 @@ - + @@ -18,295 +18,430 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xxhdpi/basic.skn b/data/resources-xxhdpi/basic.skn deleted file mode 100644 index 984788efb1..0000000000 --- a/data/resources-xxhdpi/basic.skn +++ /dev/null @@ -1,536 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-xxhdpi_clear/basic.skn b/data/resources-xxhdpi_clear/basic.skn deleted file mode 100644 index 723d6ecd35..0000000000 --- a/data/resources-xxhdpi_clear/basic.skn +++ /dev/null @@ -1,926 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-xxhdpi_clear/symbols.png b/data/resources-xxhdpi_clear/symbols.png index 3ed7232b5c..11dd9cb1db 100644 Binary files a/data/resources-xxhdpi_clear/symbols.png and b/data/resources-xxhdpi_clear/symbols.png differ diff --git a/data/resources-xxhdpi_clear/symbols.sdf b/data/resources-xxhdpi_clear/symbols.sdf index f25f29f54f..ad127e5aab 100644 --- a/data/resources-xxhdpi_clear/symbols.sdf +++ b/data/resources-xxhdpi_clear/symbols.sdf @@ -1,312 +1,450 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xxhdpi_dark/basic.skn b/data/resources-xxhdpi_dark/basic.skn deleted file mode 100644 index 6604fd230f..0000000000 --- a/data/resources-xxhdpi_dark/basic.skn +++ /dev/null @@ -1,926 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/resources-xxhdpi_dark/symbols.png b/data/resources-xxhdpi_dark/symbols.png index 999ab6dc6d..8aa2ffb519 100644 Binary files a/data/resources-xxhdpi_dark/symbols.png and b/data/resources-xxhdpi_dark/symbols.png differ diff --git a/data/resources-xxhdpi_dark/symbols.sdf b/data/resources-xxhdpi_dark/symbols.sdf index acf00a3ef0..d8c00cbfd9 100644 --- a/data/resources-xxhdpi_dark/symbols.sdf +++ b/data/resources-xxhdpi_dark/symbols.sdf @@ -1,312 +1,447 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-yota/basic.skn b/data/resources-yota/basic.skn deleted file mode 100644 index 6ca078fdc3..0000000000 --- a/data/resources-yota/basic.skn +++ /dev/null @@ -1,524 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/styles/clear/include/POI.mapcss b/data/styles/clear/include/POI.mapcss index 131f691a7d..27e54edc34 100644 --- a/data/styles/clear/include/POI.mapcss +++ b/data/styles/clear/include/POI.mapcss @@ -1,270 +1,422 @@ /* ZOOM 15 */ -/* z=15 label rules */ - -/* z=15 icons — small icons */ -node|z15-[tourism], area|z15-[tourism] { z-index: 4000; } -node|z15-[amenity], area|z15-[amenity] { z-index: 4000; } - -node|z15[tourism=museum], area|z15[tourism=museum] { icon-image: museum-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z15[tourism=gallery] { icon-image: gallery-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } /* <-- <-- не показываетÑÑ, непонÑтно почему, позже разобратьÑÑ */ -node|z15[tourism=zoo], area|z15[tourism=zoo] { icon-image: zoo-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z15[amenity=university] { icon-image: college-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; z-index: 4; } -node|z15[amenity=hospital] { icon-image: hospital-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +/* z=15 icons — small icons +node|z15-[tourism], area|z15-[tourism] { z-index: 2700; } +node|z15-[amenity], area|z15-[amenity] { z-index: 2700; } +*/ +node|z15[tourism=museum], area|z15[tourism=museum] +{ icon-image: museum-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; icon-min-distance: 1; } +node|z15[tourism=gallery] +{ icon-image: gallery-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } /* <-- <-- не показываетÑÑ, непонÑтно почему, позже разобратьÑÑ */ +node|z15[tourism=zoo], area|z15[tourism=zoo] +{ icon-image: zoo-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z15[amenity=university][name] +{ icon-image: college-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 1; icon-min-distance: 12;} +node|z15[amenity=university][!name]{}; +node|z15[amenity=hospital] +{ icon-image: hospital-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } /* TOURISM, HISTORIC */ /* NAMED TOURISM POINTS BY DEFAULT — TEMPORARY */ -node|z18-[tourism], area|z18-[tourism] { font-size: 10; text: name; text-color: @poi_label; } -node|z16[tourism=museum],area|z16[tourism=museum] { icon-image: museum-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[historic=museum],area|z16[historic=museum] { icon-image: museum-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[historic=monument],area|z16[historic=monument] { icon-image: monument-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -/*node|z16[historic=memorial], area|z16[historic=memorial] { icon-image: monument-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; }*/ -node|z16[tourism=gallery],area|z16[tourism=gallery] { icon-image: gallery-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[tourism=zoo], area|z16[tourism=zoo] { icon-image: zoo-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z16[tourism=museum],area|z16[tourism=museum] +{ icon-image: museum-m.svg; text-offset: 12; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z16[historic=museum],area|z16[historic=museum] +{ icon-image: museum-m.svg; text-offset: 12; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z16[historic=monument],area|z16[historic=monument] +{ icon-image: monument-m.svg; text-offset: 12; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z16-[historic=fort],area|z16-[historic=fort] +{ icon-image: remains-m.svg; text-offset: 12; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z16-[historic=castle],area|z16-[historic=castle] +{ icon-image: remains-m.svg; text-offset: 12; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } -node|z15[tourism=camp_site], area|z15[tourism=camp_site] { icon-image: campsite-m.svg; } -node|z16[tourism=camp_site], area|z16-17[tourism=camp_site] { icon-image: campsite-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +/*node|z16[historic=memorial], area|z16[historic=memorial] { icon-image: monument-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; }*/ +node|z16[tourism=gallery],area|z16[tourism=gallery] +{ icon-image: gallery-m.svg; text-offset: 12; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z16[tourism=zoo], area|z16[tourism=zoo] +{ icon-image: zoo-m.svg; text-offset: 12; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } + +node|z15[tourism=camp_site], area|z15[tourism=camp_site] +{ text-offset: 12; icon-image: campsite-m.svg; z-index: 2700; } +node|z16[tourism=camp_site], area|z16-17[tourism=camp_site] +{ icon-image: campsite-m.svg; text-offset: 12; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } + +node|z18-[tourism], area|z18-[tourism] +{ font-size: 10; text: name;text-offset: 12; text-color: @poi_label;z-index: 2700; } /* ZOOM 17+ */ -node|z17-[tourism=museum],area|z17-[tourism=museum] { icon-image: museum-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[historic=museum],area|z17-[historic=museum] { icon-image: museum-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=gallery],area|z17-[tourism=gallery] { icon-image: gallery-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=zoo], area|z17-[tourism=zoo] { icon-image: zoo-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=hotel] { icon-image: hotel-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=hostel] { icon-image: hotel-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=artwork] { icon-image: tourism-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=attraction] { icon-image: tourism-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=viewpoint] { icon-image: tourism-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=information] { icon-image: information-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[tourism=camp_site], area|z17-[tourism=camp_site] { icon-image: campsite-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z17-[tourism=museum],area|z17-[tourism=museum] +{ icon-image: museum-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z17-[historic=museum],area|z17-[historic=museum] +{ icon-image: museum-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z17-[tourism=gallery],area|z17-[tourism=gallery] +{ icon-image: gallery-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z17-[tourism=zoo], area|z17-[tourism=zoo] +{ icon-image: zoo-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z17-[tourism=hotel] +{ icon-image: hotel-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600; } +node|z17-[tourism=hostel] +{ icon-image: hotel-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17-[tourism=artwork] +{ icon-image: tourism-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17-[tourism=attraction] +{ icon-image: tourism-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600; } +node|z17-[tourism=viewpoint] +{ icon-image: tourism-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } +node|z17-[tourism=information] +{ icon-image: information-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } +node|z17-[tourism=camp_site], area|z17-[tourism=camp_site] +{ icon-image: campsite-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z17-[tourism=picnic_site], area|z17-[tourism=picnic_site] +{ icon-image: picnic-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } +node|z17-[amenity=shelter], area|z17-[amenity=shelter] +{ icon-image: picnic-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z17-[historic=memorial], area|z17-[historic=memorial] +{ icon-image: monument-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600; } +node|z17-[historic=monument],area|z17-[historic=monument] +{ icon-image: monument-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600; } +node|z17-[historic=archaeological_site],area|z17-[historic=archaeological_site] +{ icon-image: remains-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17-[historic=ruins],area|z17-[historic=ruins] { icon-image: remains-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17-[historic=fort],area|z17-[historic=fort] { icon-image: remains-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17-[historic=castle],area|z17-[historic=castle] { icon-image: remains-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +/*node|z17-[amenity=fire_station], area|z17-[amenity=fire_station] { icon-image: fire_station-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; }*/ +node|z18-[tourism=camp_site], area|z18-[tourism=camp_site] { icon-image: campsite-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600; } +node|z18-[tourism=picnic_site], area|z18-[tourism=picnic_site] { icon-image: picnic-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } +node|z18-[amenity=shelter], area|z18-[amenity=shelter] { icon-image: picnic-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } +node|z18-[amenity=fire_station], area|z18-[amenity=fire_station] { icon-image: fire_station-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } + + +node|z19-[tourism=camp_site], area|z19-[tourism=camp_site] { icon-image: campsite-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z19-[tourism=picnic_site], area|z19-[tourism=picnic_site] { icon-image: picnic-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z19-[amenity=shelter], area|z19-[amenity=shelter] { icon-image: picnic-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z19-[amenity=fire_station], area|z19-[amenity=fire_station] { icon-image: fire_station-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } + /* NATURAL*/ -node|z12-14[natural=cave_entrance],area|z12-[natural=cave] { icon-image: cave-s.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label;z-index: 1000; } -node|z15-17[natural=cave_entrance],area|z15-[natural=cave] { icon-image: cave-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; z-index: 1000; } -node|z18-[natural=cave_entrance],area|z16-[natural=cave] { icon-image: cave-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 1000; } -node|z12-14[natural=waterfall],area|z12-14[natural=waterfall] { icon-image: waterfall-s.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z15-16[natural=waterfall],area|z15-17[natural=waterfall] { icon-image: waterfall-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[natural=waterfall],area|z18-[natural=waterfall] { icon-image: waterfall-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z12-14[natural=cave_entrance],area|z12-[natural=cave] { icon-image: cave-s.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z15-17[natural=cave_entrance],area|z15-[natural=cave] { icon-image: cave-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z18-[natural=cave_entrance],area|z16-[natural=cave] { icon-image: cave-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } -node|z10-14[natural=volcano],{ icon-image: volcano-s.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z15-16[natural=volcano],{ icon-image: volcano-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[natural=volcano],{ icon-image: volcano-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -area|z10-14[natural=volcano],{ icon-image: volcano-s.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -area|z15-16[natural=volcano],{ icon-image: volcano-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -area|z17-[natural=volcano],{ icon-image: volcano-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z12-14[natural=waterfall],area|z12-14[natural=waterfall] { icon-image: waterfall-s.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z15-16[natural=waterfall],area|z15-17[natural=waterfall] { icon-image: waterfall-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} +node|z17-[natural=waterfall],area|z18-[natural=waterfall] { icon-image: waterfall-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } + +node|z10-14[natural=volcano],{ icon-image: volcano-s.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z15-16[natural=volcano],{ icon-image: volcano-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} +node|z17-[natural=volcano],{ icon-image: volcano-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} +area|z10-14[natural=volcano],{ icon-image: volcano-s.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +area|z15-16[natural=volcano],{ icon-image: volcano-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} +area|z17-[natural=volcano],{ icon-image: volcano-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } node|z12[natural=peak][name], -{ icon-image: peakt-s.svg; } +{ icon-image: peakt-s.svg; z-index: 2700; } node|z12[natural=peak][!name], node|z12[natural=bare_rock][!name], node|z12[natural=rock][!name] { } area|z12[natural=peak][name], -{ icon-image: peakt-s.svg; } +{ icon-image: peakt-s.svg; z-index: 2700;} area|z12[natural=peak][!name], area|z12[natural=bare_rock][!name], area|z12[natural=rock][!name] { } node|z13[natural=peak][name], -{ icon-image: peakt-s.svg;text-offset: 6; font-size: 9; text: name; text-color: @poi_label; } +{ icon-image: peakt-s.svg;text-offset: 6; font-size: 9; text: name; text-color: @poi_label;z-index: 2700; } node|z13[natural=peak][!name], node|z13[natural=bare_rock][!name], node|z13[natural=rock][!name] { } area|z13[natural=peak][name], -{ icon-image: peakt-s.svg; text-offset: 6; font-size: 9; text: name; text-color: @poi_label; } +{ icon-image: peakt-s.svg; text-offset: 6; font-size: 9; text: name; text-color: @poi_label;z-index: 2700; } area|z13[natural=peak][!name], area|z13[natural=bare_rock][!name], area|z13[natural=rock][!name] { } node|z14[natural=peak][name], -{ icon-image: peakt-m.svg; text-offset: 6; font-size: 10; text: name; text-color: @poi_label; } +{ icon-image: peakt-m.svg; text-offset: 6; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } node|z14[natural=peak][!name], node|z14[natural=bare_rock][!name], node|z14[natural=rock][!name] { } area|z14[natural=peak][name], -{ icon-image: peakt-m.svg; text-offset: 6; font-size: 10; text: name; text-color: @poi_label; } +{ icon-image: peakt-m.svg; text-offset: 6; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } area|z14[natural=peak][!name], area|z14[natural=bare_rock][!name], area|z14[natural=rock][!name] { } -node|z15[natural=peak],node|z15-16[natural=bare_rock],node|z15-16[natural=rock] { icon-image: peakt-m.svg; text-offset: 8; font-size: 11; text: name; text-color: @poi_label; } -area|z15[natural=peak],area|z15-16[natural=bare_rock],area|z15-16[natural=rock] { icon-image: peakt-m.svg; text-offset: 8; font-size: 11; text: name; text-color: @poi_label; } -node|z16-[natural=peak],node|z17-[natural=bare_rock],node|z17-[natural=rock] { icon-image: peakt-l.svg; text-offset: 8; font-size: 11; text: name; text-color: @poi_label; } -area|z16-[natural=peak],area|z17-[natural=bare_rock],area|z17-[natural=rock] { icon-image: peakt-l.svg; text-offset: 8; font-size: 11; text: name; text-color: @poi_label; } +node|z15[natural=peak],node|z15-16[natural=bare_rock],node|z15-16[natural=rock] { icon-image: peakt-m.svg; text-offset: 10; font-size: 11; text: name; text-color: @poi_label;z-index: 2700; } +area|z15[natural=peak],area|z15-16[natural=bare_rock],area|z15-16[natural=rock] { icon-image: peakt-m.svg; text-offset: 10; font-size: 11; text: name; text-color: @poi_label; z-index: 2700;} +node|z16-[natural=peak],node|z17-[natural=bare_rock],node|z17-[natural=rock] { icon-image: peakt-l.svg; text-offset: 10; font-size: 11; text: name; text-color: @poi_label;z-index: 2700; } +area|z16-[natural=peak],area|z17-[natural=bare_rock],area|z17-[natural=rock] { icon-image: peakt-l.svg; text-offset: 10; font-size: 11; text: name; text-color: @poi_label; z-index: 2700;} -node|z12-14[boundary=national_park],area|z12-14[boundary=national_park] { icon-image: nparkf-s.svg; text-offset: 8; font-size: 10; text: name; text-color: @park_label; text-halo-opacity: 0.4; text-halo-color: @label_halo_light; -text-halo-radius:0.5; z-index: 1000;} -node|z15-16[boundary=national_park],area|z15-16[boundary=national_park] { icon-image: nparkf-m.svg; text-offset: 10; font-size: 11; text: name; text-color: @park_label;text-halo-opacity: 0.4; text-halo-color: @label_halo_light; -text-halo-radius:0.5; z-index: 1000;} -node|z17-[boundary=national_park],area|z17-[boundary=national_park] { icon-image: nparkf-l.svg; text-offset: 12; font-size: 10; text: name; text-color: @park_label; text-halo-opacity: 0.4; text-halo-color: @label_halo_light; -text-halo-radius:0.5; z-index: 1000;} +node|z12-14[landuse=forest][boundary=national_park],area|z12-14[landuse=forest][boundary=national_park] { icon-image: nparkf-s.svg; text-offset: 10; font-size: 10; text: name; text-color: @park_label; text-halo-opacity: 1; text-halo-color: @label_halo_light; +text-halo-radius:0.5; z-index: 2700;} +node|z15-16[landuse=forest][boundary=national_park],area|z15-16[landuse=forest][boundary=national_park] { icon-image: nparkf-m.svg; text-offset: 10; font-size: 11; text: name; text-color: @park_label;text-halo-opacity: 1; text-halo-color: @label_halo_light; +text-halo-radius:0.5; z-index: 2700;} +node|z17-[landuse=forest][boundary=national_park],area|z17-[landuse=forest][boundary=national_park] { icon-image: nparkf-l.svg; text-offset: 12; font-size: 10; text: name; text-color: @park_label; text-halo-opacity: 1; text-halo-color: @label_halo_light; +text-halo-radius:0.5; z-index: 2700;} -node|z12-14[leisure=nature_reserve],area|z12-14[leisure=nature_reserve] { icon-image: nparkf-s.svg; text-offset: 8; font-size: 10; text: name; text-color: @park_label; text-halo-opacity: 0.4; text-halo-color: @label_halo_light; -text-halo-radius:0.5; z-index: 1000;} -node|z15-16[leisure=nature_reserve],area|z15-16[leisure=nature_reserve] { icon-image: nparkf-m.svg; text-offset: 10; font-size: 11; text: name; text-color: @park_label; text-halo-opacity: 0.4; text-halo-color: @label_halo_light; -text-halo-radius:0.5; z-index: 1000; } -node|z17-[leisure=nature_reserve],area|z17-[leisure=nature_reserve] { icon-image: nparkf-l.svg; text-offset: 12; font-size: 10; text: name; text-color: @park_label; text-halo-opacity: 0.4; text-halo-color: @label_halo_light; -text-halo-radius:0.5; z-index: 1000; } +node|z12-14[leisure=nature_reserve],area|z12-14[leisure=nature_reserve] { icon-image: nparkf-s.svg; text-offset: 10; font-size: 10; text: name; text-color: @park_label; text-halo-opacity: 1; text-halo-color: @label_halo_light; +text-halo-radius:0.5; z-index: 2700;} +node|z15-16[leisure=nature_reserve],area|z15-16[leisure=nature_reserve] { icon-image: nparkf-m.svg; text-offset: 10; font-size: 11; text: name; text-color: @park_label; text-halo-opacity: 1; text-halo-color: @label_halo_light; +text-halo-radius:0.5; z-index: 2700; } +node|z17-[leisure=nature_reserve],area|z17-[leisure=nature_reserve] { icon-image: nparkf-l.svg; text-offset: 12; font-size: 10; text: name; text-color: @park_label; text-halo-opacity: 1; text-halo-color: @label_halo_light; +text-halo-radius:0.5; z-index: 2700; } /* AMENITY */ /* NAMED AMENITIES BY DEFAULT — TEMPORARY */ -node|z19-[amenity], area|z19-[amenity] { icon-image: none.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z19-[amenity], area|z19-[amenity] { icon-image: none.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; } /* AMENITY */ -node|z15-[natural=spring],area|z17-[natural=spring]{ icon-image: drinking-water-m.svg; z-index: 1000; text-offset:8; font-size: 10; text: name; text-color: @poi_label; z-index: 100; } - -node|z16[amenity=place_of_worship], area|z16[amenity=place_of_worship] { icon-image: place-of-worship-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=theatre], area|z16[amenity=theatre] { icon-image: theatre-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=kindergarten], area|z16[amenity=kindergarten] { icon-image: kindergarten-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=school], area|z16[amenity=school] { icon-image: school-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=college], area|z16[amenity=college] { icon-image: college-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=hospital], area|z16[amenity=hospital] { icon-image: hospital-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=clinic], area|z16[amenity=clinic] { icon-image: hospital-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=dentist], area|z16[amenity=dentist] { icon-image: hospital-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=doctors], area|z16[amenity=doctors] { icon-image: hospital-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16[amenity=university], area|z16[amenity=university] { icon-image: college-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; z-index: 4; } -node|z16[amenity=fuel], area|z16[amenity=fuel] { icon-image: fuel-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z16-[natural=spring],area|z16-[natural=spring]{ icon-image: drinking-water-m.svg; z-index: 1000; text-offset:8; font-size: 10; text: name; text-color: @poi_label; z-index: 100; } +node|z15-[natural=spring],area|z17-[natural=spring]{ icon-image: drinking-water-m.svg; text-offset:8; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z15-[amenity=hunting_stand], area|z18-[amenity=hunting_stand] { icon-image: hunting-tower-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } -node|z17[amenity=place_of_worship], area|z17[amenity=place_of_worship] { icon-image: place-of-worship-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=theatre], area|z17[amenity=theatre] { icon-image: theatre-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=kindergarten], area|z17[amenity=kindergarten] { icon-image: kindergarten-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=school], area|z17[amenity=school] { icon-image: school-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=college], area|z17[amenity=college] { icon-image: college-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=hospital], area|z17[amenity=hospital] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=clinic], area|z17[amenity=clinic] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=dentist], area|z17[amenity=dentist] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=doctor], area|z17[amenity=doctor] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=university], area|z17[amenity=university] { icon-image: college-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; z-index: 4; } - -node|z17[amenity=cinema], area|z17[amenity=cinema] { icon-image: cinema-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=bank], area|z17[amenity=bank] { z-index: 4500; icon-image: bank-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=fuel], area|z17[amenity=fuel] { icon-image: fuel-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=police], area|z17[amenity=police] { icon-image: police-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=embassy], area|z17[amenity=embassy] { icon-image: embassy-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=bicycle_rental], area|z17[amenity=bicycle_rental] { icon-image: bicycle-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=post_office] { icon-image: mail-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=cafe], area|z17[amenity=cafe] { icon-image: cafe-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17[amenity=restaurant], area|z17[amenity=restaurant] { icon-image: restaurant-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[amenity=fountain],area|z17-[amenity=fountain] { icon-image: fountain-l.svg; z-index: 1000; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[amenity=drinking_water],area|z17-[amenity=drinking_water],node|z17-[amenity=water_point] ,area|z17-[amenity=water_point]{ icon-image: drinking-water-l.svg; } -node|z17-[natural=spring],area|z17-[natural=spring]{ icon-image: drinking-water-l.svg; z-index: 1000; text-offset:8; font-size: 10; text: name; text-color: @poi_label; z-index: 100; } -node|z17-[historic=memorial], area|z17-[historic=memorial] { icon-image: monument-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[historic=monument],area|z17-[historic=monument] { icon-image: monument-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z16[amenity=place_of_worship], area|z16[amenity=place_of_worship] { icon-image: place-of-worship-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +/*node|z16[amenity=theatre], area|z16[amenity=theatre] { icon-image: theatre-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z16[amenity=kindergarten], area|z16[amenity=kindergarten] { icon-image: kindergarten-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z16[amenity=school], area|z16[amenity=school] { icon-image: school-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;}*/ +node|z16[amenity=college], area|z16[amenity=college] { icon-image: college-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z16[amenity=hospital], area|z16[amenity=hospital] { icon-image: hospital-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} +node|z16[amenity=clinic], area|z16[amenity=clinic] { icon-image: hospital-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z16[amenity=university][name], area|z16[amenity=university][name] { icon-image: college-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 1;icon-min-distance: 11; } +node|z16[amenity=university][!name], area|z16[amenity=university][!name]{}; +node|z16[amenity=fuel], area|z16[amenity=fuel] { icon-image: fuel-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; } +node|z16-[natural=spring],area|z16-[natural=spring]{ icon-image: drinking-water-m.svg; z-index: 1000; text-offset:8; font-size: 10; text: name; text-color: @poi_label; z-index: 100; z-index: 2700; } +node|z16[amenity=cafe], area|z16[amenity=cafe] { icon-image: cafe-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; icon-min-distance: 10;} +node|z16[amenity=restaurant], area|z16[amenity=restaurant] { icon-image: restaurant-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;icon-min-distance: 10;} +node|z16[amenity=theatre], area|z16[amenity=theatre] { icon-image: theatre-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; icon-min-distance: 10;} -node|z18-[amenity=place_of_worship], area|z18-[amenity=place_of_worship] { icon-image: place-of-worship-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=theatre], area|z18-[amenity=theatre] { icon-image: theatre-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=kindergarten], area|z18-[amenity=kindergarten] { icon-image: kindergarten-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=school], area|z18-[amenity=school] { icon-image: school-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=college], area|z18-[amenity=college] { icon-image: college-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=hospital], area|z18-[amenity=hospital] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=clinic], area|z18-[amenity=clinic] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=dentist], area|z18-[amenity=dentist] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=doctor], area|z18-[amenity=doctor] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=university], area|z18-[amenity=university] { icon-image: college-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; z-index: 5; } -node|z18-[amenity=cinema], area|z18-[amenity=cinema] { icon-image: cinema-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=bank], area|z18-[amenity=bank] { z-index: 4500; icon-image: bank-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=fuel], area|z18-[amenity=fuel] { icon-image: fuel-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=police], area|z18-[amenity=police] { icon-image: police-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=embassy], area|z18-[amenity=embassy] { icon-image: embassy-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=bicycle_rental], area|z18-[amenity=bicycle_rental] { icon-image: bicycle-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=post_office] { icon-image: mail-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=toilets], area|z18-[amenity=toilets] { icon-image: toilets-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=atm], area|z18-[amenity=atm] { z-index: 4200; icon-image: atm-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=pharmacy], area|z18-[amenity=pharmacy] { icon-image: pharmacy-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=cafe], area|z18-[amenity=cafe] { icon-image: cafe-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=restaurant], area|z18-[amenity=restaurant] { icon-image: restaurant-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=fast_food], area|z18-[amenity=fast_food] { icon-image: fastfood-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=bar], area|z18-[amenity=bar] { icon-image: bar-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=pub], area|z18-[amenity=pub] { icon-image: pub-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=bureau_de_change] { icon-image: banknote-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=bench] { icon-image: bench.svg; } -node|z18-[amenity=fountain],area|z18-[amenity=fountain] { icon-image: fountain-l.svg; z-index: 1000; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=drinking_water],area|z18-[amenity=drinking_water],node|z18-[amenity=water_point],area|z18-[amenity=water_point] { icon-image: drinking-water-l.svg; } -node|z18-[natural=spring],area|z18-[natural=spring]{ icon-image: drinking-water-l.svg; z-index: 1000; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=library] { icon-image: library-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[amenity=waste_disposal], area|z18-[amenity=waste_disposal] { icon-image: recycling-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[historic=memorial], area|z18-[historic=memorial] { icon-image: monument-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[historic=monument],area|z18-[historic=monument] { icon-image: monument-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z17[amenity=place_of_worship], area|z17[amenity=place_of_worship] { icon-image: place-of-worship-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17[amenity=theatre], area|z17[amenity=theatre] { icon-image: theatre-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17[amenity=kindergarten], area|z17[amenity=kindergarten] { icon-image: kindergarten-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 21000; } +node|z17[amenity=school], area|z17[amenity=school] { icon-image: school-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z17[amenity=college], area|z17[amenity=college] { icon-image: college-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17[amenity=hospital], area|z17[amenity=hospital] { icon-image: hospital-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z17[amenity=clinic], area|z17[amenity=clinic] { icon-image: hospital-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z17[amenity=university][name], area|z17[amenity=university][name] { icon-image: college-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; icon-min-distance: 10;} +node|z17[amenity=university][!name], area|z17[amenity=university][!name]{}; +node|z17[amenity=cinema], area|z17[amenity=cinema] { icon-image: cinema-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z17[amenity=bank], area|z17[amenity=bank] { z-index: 4500; icon-image: bank-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17[amenity=fuel], area|z17[amenity=fuel] { icon-image: fuel-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17[amenity=police], area|z17[amenity=police] { icon-image: police-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17[amenity=embassy], area|z17[amenity=embassy] { icon-image: embassy-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17[amenity=bicycle_rental], area|z17[amenity=bicycle_rental] { icon-image: bicycle-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z17[amenity=post_office] { icon-image: mail-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z17[amenity=cafe], area|z17[amenity=cafe] { icon-image: cafe-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17[amenity=restaurant], area|z17[amenity=restaurant] { icon-image: restaurant-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17-[amenity=fountain],area|z17-[amenity=fountain] { icon-image: fountain-l.svg; z-index: 1000; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z17-[amenity=drinking_water],area|z17-[amenity=drinking_water],node|z17-[amenity=water_point] ,area|z17-[amenity=water_point]{ icon-image: drinking-water-l.svg;z-index: 2400; } +node|z17-[natural=spring],area|z17-[natural=spring]{ icon-image: drinking-water-l.svg; z-index: 1000; text-offset:8; font-size: 10; text: name; text-color: @poi_label; z-index: 100; z-index: 2700; } +node|z17-[historic=memorial], area|z17-[historic=memorial] { icon-image: monument-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17-[historic=monument],area|z17-[historic=monument] { icon-image: monument-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17-[historic=archaeological_site],area|z17-[historic=archaeological_site] { icon-image: remains-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} +node|z17-[historic=ruins],area|z17-[historic=ruins] { icon-image: remains-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} +node|z17-[historic=fort],area|z17-[historic=fort] { icon-image: remains-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z17-[historic=castle],area|z17-[historic=castle] { icon-image: remains-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} -node|z19-[amenity=telephone] { icon-image: phone-l.svg; } -node|z19-[amenity=recycling], area|z19-[amenity=recycling], { icon-image: recycling-l.svg; } +node|z18-[amenity=place_of_worship], area|z18-[amenity=place_of_worship] { icon-image: place-of-worship-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=theatre], area|z18-[amenity=theatre] { icon-image: theatre-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=kindergarten], area|z18-[amenity=kindergarten] { icon-image: kindergarten-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[amenity=school], area|z18-[amenity=school] { icon-image: school-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[amenity=college], area|z18-[amenity=college] { icon-image: college-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=hospital], area|z18-[amenity=hospital] { icon-image: hospital-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z18-[amenity=clinic], area|z18-[amenity=clinic] { icon-image: hospital-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[amenity=university][name], area|z18-[amenity=university][name] { icon-image: college-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;} +node|z18-[amenity=university][!name], area|z18-[amenity=university][!name]{}; +node|z18-[amenity=cinema], area|z18-[amenity=cinema] { icon-image: cinema-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[amenity=bank], area|z18-[amenity=bank] { z-index: 4500; icon-image: bank-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=fuel], area|z18-[amenity=fuel] { icon-image: fuel-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z18-[amenity=police], area|z18-[amenity=police] { icon-image: police-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=embassy], area|z18-[amenity=embassy] { icon-image: embassy-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=bicycle_rental], area|z18-[amenity=bicycle_rental] { icon-image: bicycle-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[amenity=post_office] { icon-image: mail-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[amenity=toilets], area|z18-[amenity=toilets] { icon-image: toilets-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[amenity=atm], area|z18-[amenity=atm] { z-index: 4200; icon-image: atm-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[amenity=pharmacy], area|z18-[amenity=pharmacy] { icon-image: pharmacy-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[amenity=cafe], area|z18-[amenity=cafe] { icon-image: cafe-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=restaurant], area|z18-[amenity=restaurant] { icon-image: restaurant-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z18-[amenity=fast_food], area|z18-[amenity=fast_food] { icon-image: fastfood-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[amenity=bar], area|z18-[amenity=bar] { icon-image: beer-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=pub], area|z18-[amenity=pub] { icon-image: beer-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z18-[amenity=nightclub], area|z18-[amenity=nightclub] { icon-image: bar-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[amenity=bureau_de_change] { icon-image: banknote-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[amenity=bench] { icon-image: bench.svg;z-index: 2400; } +node|z18-[amenity=fountain],area|z18-[amenity=fountain] { icon-image: fountain-l.svg; z-index: 1000; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[amenity=drinking_water],area|z18-[amenity=drinking_water],node|z18-[amenity=water_point],area|z18-[amenity=water_point] { icon-image: drinking-water-l.svg; z-index: 2400;} +node|z18-[natural=spring],area|z18-[natural=spring]{ icon-image: drinking-water-l.svg; z-index: 1000; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=library] { icon-image: library-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[amenity=waste_disposal], area|z18-[amenity=waste_disposal] { icon-image: recycling-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[historic=memorial], area|z18-[historic=memorial] { icon-image: monument-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z18-[historic=monument],area|z18-[historic=monument] { icon-image: monument-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=hunting_stand], area|z18-[amenity=hunting_stand] { icon-image: hunting-tower-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[historic=monument],area|z18-[historic=monument] { icon-image: monument-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z18-[amenity=hunting_stand], area|z18-[amenity=hunting_stand] { icon-image: hunting-tower-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[office], area|z18-[office] { icon-image: office-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } -/* LEISURE */ -/* node|z18-[leisure] { } */ -node|z18-[leisure], area|z18-[leisure] { font-size: 10; text: name; text-color: @poi_label; } -node|z16[leisure=stadium] { icon-image: pitch-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[leisure=stadium] { icon-image: pitch-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } - -node|z18-[leisure=pitch] { icon-image: pitch-l.svg; } -node|z18-[leisure=sports_centre] { icon-image: pitch-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[leisure=playground] { icon-image: pitch-l.svg; } -node|z18-[leisure=garden] { icon-image: garden-l.svg; } -node|z18-[leisure=swimming_pool],area|z18-[leisure=swimming_pool] { icon-image: swimming-l.svg; } -node|z18-[leisure=golf_course], area|z18-[leisure=golf_course] { icon-image: golf-l.svg; } +node|z19-[amenity=telephone] { icon-image: phone-l.svg; z-index: 2500; } +node|z19-[amenity=recycling], area|z19-[amenity=recycling], { icon-image: recycling-l.svg;z-index: 2500; } /* SHOPS */ -node|z19-[shop], area|z19-[shop] { icon-image: shop-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 6000; } -node|z16[shop=mall] { icon-image: shop-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[shop=mall] { icon-image: shop-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[shop=supermarket] { icon-image: grocery-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[shop=alcohol] { icon-image: alcohol-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[shop=laundry], area|z18-[shop=laundry] { icon-image:laundry-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 10000; } + +node|z16-[shop=mall] { icon-image: shop-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2600; } +node|z17-[shop=mall] { icon-image: shop-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600;} +node|z17-[shop=supermarket] { icon-image: grocery-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z17-[shop=car_repair], area|z17-[shop=car_repair] { icon-image: car-repair-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} + +node|z18-[shop=alcohol] { icon-image: alcohol-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z17-19[shop=laundry], area|z18-[shop=laundry] { icon-image:laundry-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 25001; } +node|z18-[shop=car_repair], area|z18-[shop=car_repair] { icon-image: car-repair-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } +node|z19-[shop], area|z19-[shop] { icon-image: shop-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} + /* SPORT */ -node|z17-[sport=soccer], area|z17[sport=soccer] { icon-image: soccer-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[sport=tennis] { icon-image: tennis-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[leisure=pitch][sport=tennis] { icon-image: tennis-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; z-index: 101010; } +/* LEISURE */ -node|z18-[sport=swimming] { icon-image: swimming-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[sport=baseball] { icon-image: baseball-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[sport=basketball] { icon-image: basketball-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[sport=american_football] { icon-image: america-football-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[sport=athletics] { icon-image: pitch-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[sport=golf] { icon-image: golf-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z18-[sport=gymnastics] { icon-image: pitch-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z16-[leisure=stadium] { icon-image: pitch-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } +node|z17-[leisure=stadium] { icon-image: pitch-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } + +node|z17-[leisure=pitch] { icon-image: pitch-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } +node|z17-[leisure=sports_centre] { icon-image: pitch-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600; } +node|z17-[leisure=playground] { icon-image: pitch-l.svg; z-index: 2500; } +node|z17-[leisure=swimming_pool],area|z18-[leisure=swimming_pool] { icon-image: swimming-l.svg;z-index: 2600; } +node|z17-[leisure=golf_course], area|z18-[leisure=golf_course] { icon-image: golf-l.svg;z-index: 50; } /* Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ z-inex^иначе пропадают вÑе объекты на поле */ + +node|z17-[sport=soccer], area|z17[sport=soccer] { icon-image: soccer-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z17-[sport=tennis] { icon-image: tennis-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z17-[leisure=pitch][sport=tennis] { icon-image: tennis-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500; } + +node|z18-[sport=swimming] { icon-image: swimming-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[sport=baseball] { icon-image: baseball-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[sport=basketball] { icon-image: basketball-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[sport=american_football] { icon-image: america-football-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[sport=athletics] { icon-image: pitch-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} +node|z18-[sport=golf] { icon-image: golf-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2500; } +node|z18-[sport=gymnastics] { icon-image: pitch-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2500;} -node|z16-[highway=speed_camera] { icon-image: speedcam-m.svg; z-index: 7000; } -node|z16[building=hospital], area|z16[building=hospital] { icon-image: hospital-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[building=hospital], area|z17-[building=hospital] { icon-image: hospital-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z16-[highway=speed_camera] { icon-image: speedcam-m.svg; z-index: 2400; } +node|z16[building=hospital], area|z16[building=hospital] { icon-image: hospital-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } +node|z17-[building=hospital], area|z17-[building=hospital] { icon-image: hospital-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } /* PARKINGS */ -area|z16-[amenity=parking] {fill-color: @parking;fill-oppacity:1;z-index: 10000;} +area|z16-[amenity=parking] {fill-color: @parking;fill-oppacity:1;fill-position:background;z-index: 6; } -node|z17[amenity=parking] { icon-image: parking-s.svg; z-index: 4; } -node|z17[amenity=parking] { icon-image: parking-s.svg; z-index: 4; } +node|z17[amenity=parking] { icon-image: parking-s.svg; z-index: 6; } +node|z17[amenity=parking] { icon-image: parking-s.svg; z-index: 6; } node|z17[amenity=parking][access=permissive], -node|z17[amenity=parking][access=private] { icon-image: zero-icon.svg; z-index: 4; } +node|z17[amenity=parking][access=private] { icon-image: zero-icon.svg; z-index: 6; } + +node|z18-[amenity=parking], area|z18-[amenity=parking] { icon-image: parking-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 6; } -node|z18-[amenity=parking], area|z18-[amenity=parking] { icon-image: parking-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; z-index: 4; } +area|z17-[aeroway=heliport], +area|z17-[aeroway=helipad], +node|z17-[aeroway=heliport], +node|z17-[aeroway=helipad] +{ icon-image: heliport-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2600; } /* MAN MADE */ -node|z15-16[man_made=lighthouse], area|z15-16[man_made=lighthouse] { icon-image: lighthouse-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } -node|z17-[man_made=lighthouse], area|z17-[man_made=lighthouse] { icon-image: lighthouse-l.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; } +node|z15-16[man_made=lighthouse], area|z15-16[man_made=lighthouse] { icon-image: lighthouse-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700;} +node|z17-[man_made=lighthouse], area|z17-[man_made=lighthouse] { icon-image: lighthouse-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2700; } /* BORDER CONTROL*/ -node|z15-[barrier=border_control]{ icon-image:bcontrol-m.svg; text-offset: 8; font-size: 10; text: name; text-color: @poi_label; z-index: 10000;} +node|z15-[barrier=border_control]{ icon-image:bcontrol-m.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } +node|z17-[barrier=border_control]{ icon-image:bcontrol-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2700; } + +/* NEW POI */ + +node|z18-[amenity=car_sharing], area|z18-[amenity=car_sharing]{ icon-image: car_sharing-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[amenity=post_box], area|z18-[amenity=post_box]{ icon-image: postbox-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[aeroway=gate], area|z18-[aeroway=gate]{ icon-image: gate-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } + +node|z18-[amenity=bbq], area|z18-[amenity=bbq]{ icon-image: bbq-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[amenity=car_rental], area|z18-[amenity=car_rental]{ icon-image: car_sharing-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +/*node|z18-[], area|z18-[] { icon-image: none.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; }*/ + +node|z18-[amenity=vending_machine], area|z18-[amenity=vending_machine] { icon-image: vending-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[amenity=vending_machine][vending=parking_tickets], +area|z18-[amenity=vending_machine][vending=parking_tickets] +{ icon-image: parking-meter-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } + + +node|z18-[amenity=casino], area|z18-[amenity=casino]{ icon-image: casino-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[amenity=marketplace], area|z18-[amenity=marketplace]{ icon-image: marketplace-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[amenity=taxi], area|z18-[amenity=taxi]{ icon-image: taxi-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[barrier=lift_gate], area|z18-[barrier=lift_gate] { icon-image: lift_gate-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[barrier=toll_booth], area|z18-[barrier=toll_booth] { icon-image: toll_booth-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[historic=boundary_stone], area|z18-[historic=boundary_stone]{ icon-image: boundary_stone-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[historic=ship], area|z18-[historic=ship]{ icon-image: ship-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[historic=tomb], area|z18-[historic=tomb] { icon-image: tomb-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[historic=wayside_cross], area|z18-[historic=wayside_cross]{ icon-image: wayside_cross-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[historic=wayside_shrine], area|z18-[historic=wayside_shrine] { icon-image: wayside_shrine-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[leisure=dog_park], area|z18-[leisure=dog_park] { icon-image: dog_park-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[leisure=water_park], area|z18-[leisure=water_park]{ icon-image: diving-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[man_made=windmill], area|z18-[man_made=windmill]{ icon-image: windmill-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} + +node|z18-[shop=books], area|z18-[shop=books]{ icon-image: book-shop-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=bakery], area|z18-[shop=bakery] { icon-image: bakery-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=beauty], area|z18-[shop=beauty] { icon-image: beauty-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=beverages], area|z18-[shop=beverages] { icon-image: alcohol-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=bicycle], area|z18-[shop=bicycle]{ icon-image: shop-bicycle-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=butcher], area|z18-[shop=butcher] { icon-image: butcher-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=car], area|z18-[shop=car]{ icon-image: car_sharing-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=car_repair], area|z18-[shop=car_repair] { icon-image: car-repair-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=chemist], area|z18-[shop=chemist] { icon-image: chemist-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=clothes], area|z18-[shop=clothes] { icon-image: clothes-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=computer], area|z18-[shop=computer]{ icon-image: computer-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=confectionery], area|z18-[shop=confectionery]{ icon-image: sweets-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=convenience], area|z18-[shop=convenience] { icon-image: convenience-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=department_store], area|z18-[shop=department_store]{ icon-image: department_store-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=doityourself], area|z18-[shop=doityourself] { icon-image: doityourself-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=electronics], area|z18-[shop=electronics] { icon-image: electronics-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=florist], area|z18-[shop=florist]{ icon-image: florist-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=furniture], area|z18-[shop=furniture]{ icon-image: furniture-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=garden_centre], area|z18-[shop=garden_centre]{ icon-image: garden_center-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=gift], area|z18-[shop=gift]{ icon-image: gift-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=greengrocer], area|z18-[shop=greengrocer]{ icon-image: greengrocer-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=hairdresser], area|z18-[shop=hairdresser] { icon-image: hairdresser-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=hardware], area|z18-[shop=hardware]{ icon-image: hardware-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=jewelry], area|z18-[shop=jewelry] { icon-image: jewelry-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=kiosk], area|z18-[shop=kiosk]{ icon-image: kiosk-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=mobile_phone], area|z18-[shop=mobile_phone]{ icon-image: mobile_phone-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=optician], area|z18-[shop=optician]{ icon-image: optician-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=shoes], area|z18-[shop=shoes]{ icon-image: shoes-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=sports], area|z18-[shop=sports]{ icon-image: sports-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=toys], area|z18-[shop=toys]{ icon-image: toys-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} + +node|z18-[sport=archery], area|z18-[sport=archery]{ icon-image: archery-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[sport=australian_football], area|z18-[sport=australian_football]{ icon-image: australian-football-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[sport=bowls], area|z18-[sport=bowls] { icon-image: bowls-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[sport=cricket], area|z18-[sport=cricket]{ icon-image: cricket-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[sport=curling], area|z18-[sport=curling] { icon-image: curling-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[sport=diving], area|z18-[sport=diving] { icon-image: diving-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[sport=scuba_diving], area|z18-[sport=scuba_diving]{ icon-image: diving-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[tourism=alpine_hut], area|z18-[tourism=alpine_hut]{ icon-image: alpine_hut-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[tourism=caravan_site], area|z18-[tourism=caravan_site]{ icon-image: caravan_site-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } + +node|z18-[tourism=guest_house], area|z18-[tourism=guest_house]{ icon-image: motel-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} + +node|z18-[tourism=motel], area|z18-[tourism=motel]{ icon-image: motel-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[tourism=picnic_site], area|z18-[tourism=picnic_site]{ icon-image: picnic-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} + +node|z18-[natural=beach], area|z18-[natural=beach]{ icon-image: beach-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } diff --git a/data/styles/clear/include/Z-INDEXES b/data/styles/clear/include/Z-INDEXES new file mode 100644 index 0000000000..33dd094064 --- /dev/null +++ b/data/styles/clear/include/Z-INDEXES @@ -0,0 +1,220 @@ +Z-INDEXES + +/*NATURE -1000 - 1 */ + +area|z0-[natural=coastline] +{z-index: -10;} +area|z0-[natural=land] +{z-index: 0;} +area|z0-[natural=glacier] +{z-index: 1;} +area|z10-[leisure=beach_resort], +area|z10-[natural=beach], +{z-index: 1;} + +/*LANDUSE 1- */ + +rea|z10-[aeroway=airport][aerodrome=international], +area|z10-[aeroway=aerodrome][aerodrome=international], +area|z12-[aeroway=airport], +area|z12-[aeroway=aerodrome] +{z-index: 1;} + +area|z14-[amenity=university] +{z-index: 1;} + +area|z14-15[amenity=hospital] +{z-index: 2;} + +area|z15-[landuse=industrial], +area|z15-[landuse=construction] +{z-index: 3;} + +area|z16-[leisure=pitch], +area|z16-[sport=soccer], +area|z15-[leisure=stadium], +area|z17-[leisure=playground] + +{z-index: 5;} + +area|z16-[amenity=parking] +{z-index: 6;} + +area|z15-[amenity=grave_yard], +area|z15-[landuse=cemetery] +{z-index: 43;} + +area|z16-[highway=pedestrian][area?], +area|z16-[area:highway=pedestrian], +area|z16-[highway=footway][area?][!sac_scale], +area|z16-[area:highway=footway], +area|z16-[area:highway=living_street], + +{z-index: 44;} + +area|z14-[leisure=golf_course] +{ z-index: 45;} + +area|z16-[amenity=place_of_worship] +{z-index: 210;}???????????????? + +/* VEGETATION 30-45 */ + +area|z10-[natural=wood], +area|z10-[landuse=forest], +area|z10-[leisure=nature_reserve], +{z-index: 30;} + +area|z12-[leisure=park], area|z12[leisure=garden] +{z-index: 40;} + +area|z13-[landuse=farmland], +area|z13-[landuse=allotments], +area|z13-[natural=scrub], +area|z13-[landuse=orchard], +area|z13-[landuse=vineyard], +area|z13-[landuse=meadow], +area|z13-[landuse=recreation_ground], +area|z13-[landuse=village_green], +{z-index: 42;} + +area|z13-[landuse=grass],area|z13-[natural=grassland], +{z-index: 45;} + + +/*WATER 49-120 */ + + +area|z11-[natural=wetland] +{z-index: 49;} +line|z13-14[waterway=stream][intermittent=yes] +{z-index: 49;} + +line|z10-[waterway=river], +line|z10-[waterway=riverbank], +line|z13-[waterway=stream], +line|z13-[waterway=canal], +line|z17-[waterway=ditch] +{z-index: 50;} + +area|z16-[amenity=fountain], +area|z12-[landuse=basin], +area|z12-[landuse=reservoir], +area|z13-[leisure=swimming_pool], +area|z0-[natural=lake], +area|z0-[natural=pond], +area|z0-[natural=water], +area|z0-[waterway=dock], +area|z0-[waterway=riverbank], +area|z10-[waterway=river], +area|z10-[natural=bay], +{z-index: 100;} + +line|z15-[waterway=dam], +line|z15-[waterway=wair], +{z-index: 110;} + +line|z10-[route=ferry], +line|z10-[route=ferry_motorcar] +{z-index: 115;} + +area|z12-[man_made=pier], +area|z12-[man_made=breakwater], +{z-index: 120;} + + +/* BOUNDARY 130 */ + +line|z2[boundary=administrative] +{z-index: 130;}?????????????????? + +/* building 150 */ + +area|z14-[building] +{z-index: 150;} +area|z14[aeroway=terminal] +{z-index: 160;} + +/*ROADS 450-1000*/ + +line|z13[highway=cycleway], +line|z16[highway=steps]{z-index: 1000;} + +line|z7-[highway=trunk], +line|z7-[highway=motorway] {z-index: 900;} + +line|z7-[highway=trunk_link], +line|z7-[highway=motorway_link], +{z-index: 890;} + +line|z7-[highway=primary] {z-index: 850;} + +line|z7-[highway=primary_link], +{z-index: 840;} + +line|z7-[highway=secondary] {z-index: 800;} + +line|z7-[highway=secondary_link], +{z-index: 790;} + +line|z11-[highway=residential], +line|z11-[highway=tertiary] {z-index: 750;} + +line|z7-[highway=tertiary_link], +line|z7-[highway=residential_link], +{z-index: 740;} + +line|z7-[highway=unclassified], +line|z7-[highway=living_street], +line|[highway=road] {z-index: 700;} + +line|z7-[highway=pedestrian] {z-index: 660;} +line|z7-[highway=service] {z-index: 650;} + +line|z14[highway=track], +line|z14[route=hiking], +line|z14[highway=track][tracktype=grade1],{z-index: 600;} + +line|z7-[highway=footway], +line|z7-[highway=path] {z-index: 600;} + +line|z14[highway=bridleway]{z-index: 590;} + +line|z13[highway=construction]{ z-index: 450;} + +/* RAILWAY LINES 680-690*/ + +line|z14[railway=monorail], +line|z15-[railway=narrow_gauge], +line|z13-[railway=funicular], +line|z15[railway=tram] +{ z-index: 950;} +line|z11-[railway=rail], +line|z13-[railway=light_rail] +{ z-index: 680;} +line|z16-[railway=rail]::dash, +line|z16-[railway=light_rail]::dash +{ z-index: 690;} +line|z16-[railway=preserved], +line|z16-[railway=abandoned], +line|z18-[railway=construction], +line|z18-[railway=disused] +{ z-index: 450;} + +/*Others*/ +line|z12[aeroway=runway], +line|z14[aeroway=taxiway] +{z-index: 50;} + +line|z14[aerialway=cable_car]::dash, +line|z14[aerialway=chair_lift]::dash, +line|z14[aerialway=gondola]::dash, +line|z14[aerialway=mixed_lift]::dash +{z-index: 1049;} +line|z17-[aerialway=cable_car], +line|z17-[aerialway=chair_lift], +line|z17-[aerialway=gondola], +line|z17-[aerialway=mixed_lift] +{z-index: 1050;} + +/*POI 2400-2900*/ diff --git a/data/styles/clear/include/boundaries.mapcss b/data/styles/clear/include/boundaries.mapcss index 10341282db..a7d04a435f 100644 --- a/data/styles/clear/include/boundaries.mapcss +++ b/data/styles/clear/include/boundaries.mapcss @@ -1,105 +1,119 @@ line|z2[boundary=administrative][admin_level=2] { color: @border_country; - width: 0.2; - opacity: 0.6; - z-index: 400; + width: 0.5; + opacity: 0.7; + z-index: 130; } line|z3[boundary=administrative][admin_level=2] { color: @border_country; - width: 0.2; + width: 0.5; opacity: 0.8; - z-index: 400; + z-index: 130; } line|z4[boundary=administrative][admin_level=2] { color: @border_country; - width: 0.4; + width: 0.6; opacity: 1; - z-index: 400; + z-index: 130; } line|z5[boundary=administrative][admin_level=2] { color: @border_country; - width: 0.5; + width: 0.8; opacity: 1; + z-index: 130; } line|z6[boundary=administrative][admin_level=2] { color: @border_country; - width: 0.8; + width: 0.85; opacity: 1; + z-index: 130; } -line|z7-[boundary=administrative][admin_level=2] +line|z7[boundary=administrative][admin_level=2] +{ + color: @border_country; + width: 1; + opacity: 1; + z-index: 130; +} +line|z8[boundary=administrative][admin_level=2] { color: @border_country; width: 1.1; opacity: 1; + z-index: 130; } line|z4[boundary=administrative][admin_level=3] { color: @border_region; - width: 0.4; + width: 0.8; opacity: 1; - z-index: 400; - dashes: 1.5,1; + z-index: 130; + dashes: 0.9,0.36; } line|z5[boundary=administrative][admin_level=4] { color: @border_region; - width: 0.4; + width: 0.7; opacity: 0.8; - z-index: 380; - dashes: 1.5,1; + z-index: 130; + dashes: 1.35,0.9; } line|z6[boundary=administrative][admin_level=4] { color: @border_region; - width: 0.6; + width: 0.8; opacity: 1; - z-index: 380; - dashes: 1.5,1; + z-index: 130; + dashes: 0.9,0.45; } line|z7[boundary=administrative][admin_level=4] { color: @border_region; width: 0.9; opacity: 1; - z-index: 380; - dashes: 1.5,1; + z-index: 130; + dashes: 1.8,0.9; } -line|z8-[boundary=administrative][admin_level=4] +line|z8[boundary=administrative][admin_level=4] { color: @border_region; width: 0.9; opacity: 1; - z-index: 400; - dashes: 1.5,1; + z-index: 130; + dashes: 1.44,1.44; } -line|z8-[boundary=administrative][admin_level=4] +line|z9[boundary=administrative][admin_level=4] { color: @border_region; - width: 0.9; + width: 1; opacity: 1; - z-index: 400; - dashes: 1.5,1; + z-index: 130; + dashes: 1.8,0.9; } -line|z11-[boundary=administrative][admin_level=4] + +line|z10-[boundary=administrative][admin_level=4] { color: @border_region; width: 1.2; opacity: 1; - z-index: 400; - dashes: 2,1; + z-index: 130; + dashes: 1.8,0.9; } - -/* DEBUG */ -/* line|z2-[boundary=administrative][admin_level=2] { - color: red; - width: 1; -} */ +/* +line|z12-[boundary=administrative][admin_level=4] +{ + color: @border_region; + width: 1.2; + opacity: 1; + z-index: 130; +} +*/ diff --git a/data/styles/clear/include/buildings.mapcss b/data/styles/clear/include/buildings.mapcss index 19c9669637..fc6603c9bc 100644 --- a/data/styles/clear/include/buildings.mapcss +++ b/data/styles/clear/include/buildings.mapcss @@ -1,35 +1,35 @@ area|z14[building] { fill-color: @building; - fill-opacity: 0.4; - z-index: 200; + fill-opacity: 0.5; + z-index: 150; } area|z15[building] { fill-color: @building; fill-opacity: 0.6; - z-index: 200; + z-index: 150; } area|z16[building] { fill-color: @building; fill-opacity: 0.8; - z-index: 200; + z-index: 150; } area|z17[building] { - fill-color: @building; - opacity: 1; - z-index: 200; + fill-color: @building_dark; + opacity: 0.9; + z-index: 150; } area|z18-[building] { fill-color: @building_dark; opacity: 1; - z-index: 200; + z-index: 150; } /* @@ -43,8 +43,13 @@ node|z18-[entrance] { } /* AIRPORTS */ -area|z14[aeroway=terminal] { fill-color: @building; fill-opacity: 0.8; z-index: 300; } -area|z15[aeroway=terminal] { fill-color: @building; fill-opacity: 0.8; text: name; font-size: 9; text-color: @building_label; text-position: center; z-index: 300; } -area|z16[aeroway=terminal] { fill-color: @building; fill-opacity: 1; text: name; font-size: 9; text-color: @building_label; text-position: center; z-index: 300; } -area|z17[aeroway=terminal] { fill-color: @building_dark; opacity: 0.8; text: name; font-size: 9; text-color: @building_label; text-position: center; z-index: 300; } -area|z18-[aeroway=terminal] { fill-color: @building_dark; opacity: 1; text: name; font-size: 9; text-color: @building_label; text-position: center; z-index: 300; } +area|z14[aeroway=terminal] +{ fill-color: @building; fill-opacity: 0.8; z-index: 160; } +area|z15[aeroway=terminal] +{ fill-color: @building; fill-opacity: 0.8; text: name; font-size: 9; text-color: @building_label; text-position: center; z-index: 160; } +area|z16[aeroway=terminal] +{ fill-color: @building; fill-opacity: 1; text: name; font-size: 9; text-color: @building_label; text-position: center; z-index: 160; } +area|z17[aeroway=terminal] +{ fill-color: @building_dark; opacity: 1; text: name; font-size: 9; text-color: @building_label; text-position: center; z-index: 160; } +area|z18-[aeroway=terminal] +{ fill-color: @building_dark; opacity: 1; text: name; font-size: 9; text-color: @building_label; text-position: center; z-index: 160; } diff --git a/data/styles/clear/include/defaults.mapcss b/data/styles/clear/include/defaults.mapcss index 0c34a7a9dd..b69ac164f1 100644 --- a/data/styles/clear/include/defaults.mapcss +++ b/data/styles/clear/include/defaults.mapcss @@ -1,10 +1,28 @@ way::* { - linejoin: round; - linecap: round; text-position: line; } +way|z1-12::* +{ + linejoin: bevel; +} + +way|z13-::* +{ + linejoin: round; +} + +way|z1-15::* +{ + linecap: butt; +} + +way|z16-::* +{ + linecap: round; +} + *::* { text-halo-color: @white; diff --git a/data/styles/clear/include/labels.mapcss b/data/styles/clear/include/labels.mapcss index ad46ceaca1..cbce72c85b 100644 --- a/data/styles/clear/include/labels.mapcss +++ b/data/styles/clear/include/labels.mapcss @@ -50,9 +50,10 @@ node|z4[place=country] text-color: @country_label; z-index: 1000; } + node|z4[place=country]::int_name { - text: name; + text: int_name; font-size: 12; text-color: @country_label; z-index: 1000; @@ -72,7 +73,6 @@ node|z5[place=country]::int_name text-color: @country_label; z-index: 1000; } - node|z6-[place=country] { text: name; @@ -80,9 +80,9 @@ node|z6-[place=country] text-color: @country_label; z-index: 1000; } -node|z6-[place=country]::int_name +node|z6[place=country]::int_name { - text: name; + text: int_name; font-size: 16; text-color: @country_label; z-index: 1000; @@ -132,7 +132,7 @@ node|z4[place=city][capital!=2][population>=1000000], text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.5; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 1000; } @@ -146,21 +146,22 @@ node|z4[place=city][capital!=2][population>=1000000]::int_name text-halo-color: @label_halo_medium; z-index: 1000; } + node|z4[place=city][capital=2], { icon-image: star-s.svg; - text-offset: 2.8; + text-offset: 5; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.5; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 4000; } node|z4[place=city][capital=2]::int_name { - text-offset: 8; + text-offset: 20; font-size: 9; text: int_name; text-color: @label_dark; @@ -169,7 +170,6 @@ node|z4[place=city][capital=2]::int_name text-halo-color: @label_halo_medium; z-index: 4000; } - /* CITIES ZOOM 5*/ node|z5[place=city][capital!=2][population>=150000], @@ -178,39 +178,37 @@ node|z4[place=city][capital=2]::int_name text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.5; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 1000; } + /* icon-image: dot-s.svg; text-offset: 3; */ -node|z5[place=city][capital!=2][population>=150000]::int_name -{ - font-size: 9; - text: int_name; - text-color: @label_dark; - text-halo-radius: 1; - text-halo-opacity: 0.5; - text-halo-color: @label_halo_medium; - z-index: 1000; -} - - + node|z5[place=city][capital!=2][population>=150000]::int_name + { + font-size: 9; + text: int_name; + text-color: @label_dark; + text-halo-radius: 1; + text-halo-opacity: 0.5; + text-halo-color: @label_halo_medium; + z-index: 1000; + } node|z5[place=city][capital=2]{ icon-image: star-m.svg; - text-offset: 3; + text-offset: 6; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.5; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; } - node|z5[place=city][capital=2]::int_name { - text-offset: 13; + text-offset: 21; font-size: 9; text: int_name; text-color: @label_dark; @@ -219,22 +217,6 @@ node|z5[place=city][capital=2]::int_name { text-halo-color: @label_halo_medium; } -/* -node|z5[place=city][capital=3], -node|z5[place=city][capital=4] { - icon-image: dot-s.svg; - text-offset: 3; - font-size: 10; - text: name; - text-color: @label_medium; - text-halo-radius: 1; - text-halo-opacity: 0.3; - text-halo-color: @label_halo_medium; -} -*/ - - - /* CITIES ZOOM 6*/ node|z6[place=city][capital!=2][population>=50000], @@ -243,17 +225,7 @@ node|z6[place=city][capital!=2][population>=50000], text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.5; - text-halo-color: @label_halo_medium; - z-index: 1000; -} -node|z6[place=city][capital!=2][population>=50000]::int_name -{ - font-size: 9; - text: int_name; - text-color: @label_dark; - text-halo-radius: 1; - text-halo-opacity: 0.5; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 1000; } @@ -262,20 +234,30 @@ node|z6[place=city][capital!=2][population>=50000]::int_name icon-image: dot-s.svg; text-offset: 2.5; */ + node|z6[place=city][capital!=2][population>=50000]::int_name + { + font-size: 9; + text: int_name; + text-color: @label_dark; + text-halo-radius: 1; + text-halo-opacity: 0.5; + text-halo-color: @label_halo_medium; + z-index: 1000; + } node|z6[place=city][capital=2] { icon-image: star-l.svg; - text-offset: 4; + text-offset: 6; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.5; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 9000; } node|z6[place=city][capital=2]::int_name { - text-offset: 13; + text-offset: 21; font-size: 9; text: int_name; text-color: @label_dark; @@ -285,20 +267,6 @@ node|z6[place=city][capital=2]::int_name { z-index: 9000; } -/* -node|z6[place=city][capital=3], -node|z6[place=city][capital=4] { - icon-image: dot-s.svg; - text-offset: 3; - font-size: 10; - text: name; - text-color: @label_medium; - text-halo-radius: 1; - text-halo-opacity: 0.3; - text-halo-color: @label_halo_medium; -} -*/ - /* CITIES ZOOM 7*/ /* @@ -312,7 +280,7 @@ node|z7[place=city][capital!=2][population>=40000], text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.6; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 5000; } @@ -326,20 +294,19 @@ node|z7[place=city][capital!=2][population>=40000]::int_name text-halo-color: @label_halo_medium; z-index: 5000; } - node|z7[place=city][capital=2]{ icon-image: star-l.svg; - text-offset: 5; + text-offset: 6; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.6; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 9000; } node|z7[place=city][capital=2]::int_name { - text-offset: 15; + text-offset: 21; font-size: 10; text: int_name; text-color: @label_dark; @@ -348,7 +315,6 @@ node|z7[place=city][capital=2]::int_name { text-halo-color: @label_halo_medium; z-index: 9000; } - node|z7[place=state] { text: name; @@ -356,7 +322,6 @@ node|z7[place=state] text-color: @state_name; z-index: -10; } - node|z7[place=state]::int_name { text: int_name; @@ -365,7 +330,6 @@ node|z7[place=state]::int_name z-index: -10; } - /* CITIES ZOOM 8*/ node|z8[place=city][capital!=2][population>=40000], { @@ -373,17 +337,7 @@ node|z8[place=city][capital!=2][population>=40000], text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.6; - text-halo-color: @label_halo_medium; - z-index: 3000; -} -node|z8[place=city][capital!=2][population>=40000]::int_name -{ - font-size: 10; - text: int_name; - text-color: @label_dark; - text-halo-radius: 1; - text-halo-opacity: 0.6; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 3000; } @@ -391,22 +345,30 @@ node|z8[place=city][capital!=2][population>=40000]::int_name icon-image: dot-m.svg; text-offset: 3; */ - + node|z8[place=city][capital!=2][population>=40000]::int_name + { + font-size: 10; + text: int_name; + text-color: @label_dark; + text-halo-radius: 1; + text-halo-opacity: 0.6; + text-halo-color: @label_halo_medium; + z-index: 3000; + } node|z8[place=city][capital=2] { icon-image: star-l.svg; - text-offset: 5; + text-offset: 6; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.6; + text-halo-opacity: 1; text-halo-color: @label_halo_medium; z-index: 9000; } - node|z8[place=city][capital=2]::int_name { - text-offset: 5; + text-offset: 21; font-size: 11; text: int_name; text-color: @label_dark; @@ -435,7 +397,6 @@ node|z8[place=state] text-color: @state_name; z-index: -10; } - node|z8[place=state]::int_name { text: int_name; @@ -473,7 +434,7 @@ node|z9[place=city]::int_name { node|z9[place=city][capital=2] { icon-image: star-l.svg; - text-offset: 3; + text-offset: 6; font-size: 12; text: name; text-color: @label_dark; @@ -482,8 +443,9 @@ node|z9[place=city][capital=2] { text-halo-color: @label_halo_medium; z-index: 3900; } + node|z9[place=city][capital=2]::int_name { - text-offset: 3; + text-offset: 21; font-size: 11; text: int_name; text-color: @label_dark; @@ -492,7 +454,6 @@ node|z9[place=city][capital=2]::int_name { text-halo-color: @label_halo_medium; z-index: 3900; } - node|z9[place=town][population>=20000] { font-size: 10; text: name; @@ -517,7 +478,6 @@ node|z9[place=state] text-color: @state_name; z-index: -10; } - node|z9[place=state]::int_name { text: int_name; @@ -551,7 +511,7 @@ node|z10[place=city]::int_name { node|z10[place=city][capital=2]{ icon-image: star-l.svg; - text-offset: 3; + text-offset: 6; font-size: 12; text: name; text-color: @label_dark; @@ -561,7 +521,7 @@ node|z10[place=city][capital=2]{ z-index: 9000; } node|z10[place=city][capital=2]::int_name { - text-offset: 3; + text-offset: 21; font-size: 11; text: int_name; text-color: @label_dark; @@ -570,7 +530,6 @@ node|z10[place=city][capital=2]::int_name { text-halo-color: @label_halo_light; z-index: 9000; } - node|z10[place=town] { font-size: 10; text: name; @@ -578,7 +537,7 @@ node|z10[place=town] { text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_bg; - z-index: 2000; + z-index: 9000; } node|z10[place=town]::int_name { font-size: 9; @@ -589,14 +548,14 @@ node|z10[place=town]::int_name { text-halo-color: @label_halo_bg; z-index: 2000; } -node|z10[place=state] + +node|z9[place=state] { text: name; font-size: 12; text-color: @state_name; z-index: -10; } - node|z10[place=state]::int_name { text: int_name; @@ -605,7 +564,6 @@ node|z10[place=state]::int_name z-index: -10; } - /* ZOOM 11 */ node|z11[place=city] { @@ -626,7 +584,6 @@ node|z11[place=city]::int_name { text-halo-color: @label_halo_light; z-index: 4000; } - node|z11[place=city][capital=2]{ icon-image: star-l.svg; text-offset: 4; @@ -665,7 +622,6 @@ node|z11[place=town]::int_name { text-halo-opacity: 0.5; text-halo-color: @label_halo_medium; } - node|z11[place=village] { font-size: 10; text: name; @@ -674,6 +630,14 @@ node|z11[place=village] { text-halo-color: @city_halo; z-index: 2000; } +node|z11[place=village]::int_name { + font-size: 9; + text: name; + text-color: @city_label; + text-halo-radius: 1; + text-halo-color: @city_halo; + z-index: 2000; +} /* ZOOM 12 */ @@ -694,7 +658,6 @@ node|z12[place=city]::int_name { text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z12[place=city][capital=2]{ icon-image: star-l.svg; text-offset: 4; @@ -717,7 +680,6 @@ node|z12[place=city][capital=2]::int_name { text-halo-color: @label_halo_light; z-index: 3900; } - node|z12[place=town] { font-size: 14; text: name; @@ -727,14 +689,13 @@ node|z12[place=town] { text-halo-color: @label_halo_medium; } node|z12[place=town]::int_name { - font-size: 12; + font-size: 13; text: int_name; text-color: @label_medium; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_medium; } - node|z12[place=village] { font-size: 12; text: name; @@ -742,7 +703,6 @@ node|z12[place=village] { text-halo-radius: 1; text-halo-color: @city_halo; } - node|z12[place=village]::int_name { font-size: 11; text: int_name; @@ -751,7 +711,6 @@ node|z12[place=village]::int_name { text-halo-color: @city_halo; } - /* ZOOM 13 */ node|z13-17[place=town] { @@ -771,7 +730,6 @@ node|z13-17[place=town]::int_name { text-halo-color: @label_halo_light; } - node|z13-17[place=village] { font-size: 14; text: name; @@ -781,7 +739,6 @@ node|z13-17[place=village] { text-halo-color: @label_halo_light; z-index: 1; } - node|z13-17[place=village]::int_name { font-size: 12; text: int_name; @@ -810,7 +767,6 @@ node|z13-14[place=city]::int_name { text-halo-color: @label_halo_light; z-index: 1; } - node|z13-14[place=city][capital=2] { icon-image: star-l.svg; text-offset: 4; @@ -832,7 +788,6 @@ node|z13-14[place=city][capital=2]::int_name { text-halo-color: @label_halo_light; z-index: 1; } - node|z13-[place=hamlet] { font-size: 12; text: name; @@ -852,6 +807,21 @@ line[highway] /* ZOOMS 10-11 */ +line|z10-11[highway=motorway], +line|z10-11[highway=trunk], +line|z10-11[highway=motorway_link], +line|z10-11[highway=trunk_link], +line|z10-11[highway=primary], +line|z10-11[highway=primary_link] { + shield-font-size: 9; + shield-text-color: @shield; + shield-text-halo-radius: 2; + shield-text-halo-color: @shield_halo; + shield-text-halo-opacity: 1; + shield-min-distance: 18; + +} + line|z10-11[highway=motorway], line|z10-11[highway=trunk], line|z10-11[highway=motorway_link], @@ -866,7 +836,7 @@ line|z10-11[highway=trunk_link] { line|z10-11[highway=primary], line|z10-11[highway=primary_link] { - font-size: 10; + font-size: 9; text: name; text-color: @label_medium; text-halo-opacity: 0.3; @@ -876,7 +846,7 @@ line|z10-11[highway=primary_link] { } line|z10-11[highway=secondary] { - font-size: 10; + font-size: 9; text: name; text-color: @label_light; text-halo-opacity: 0.3; @@ -891,12 +861,15 @@ line|z12-13[highway=trunk], line|z12-13[highway=motorway_link], line|z12-13[highway=trunk_link], line|z12-13[highway=primary], -line|z12-13[highway=primary_link] { +line|z12-13[highway=primary_link], +line|z12-13[highway=secondary] { shield-font-size: 9; shield-text-color: @shield; shield-text-halo-radius: 1; shield-text-halo-color: @shield_halo; shield-text-halo-opacity: 1; + shield-min-distance: 20; + } line|z12-13[highway=motorway], @@ -922,7 +895,7 @@ line|z12-13[highway=primary_link] { } line|z12-13[highway=secondary] { - font-size: 10; + font-size: 9; text: name; text-color: @label_light; text-halo-opacity: 0.3; @@ -932,7 +905,7 @@ line|z12-13[highway=secondary] { line|z12-13[highway=residential], line|z12-13[highway=tertiary] { - font-size: 10; + font-size: 8; text: name; text-color: @label_light; text-halo-opacity: 0; @@ -945,19 +918,35 @@ line|z12-13[highway=tertiary] { /*SHIELDS FOR TRUNKS */ -line|z14-15[highway=motorway], -line|z14-15[highway=trunk], -line|z14-15[highway=motorway_link], -line|z14-15[highway=trunk_link], -line|z14-15[highway=primary], -line|z14-15[highway=primary_link] { +line|z14[highway=motorway], +line|z14[highway=trunk], +line|z14[highway=motorway_link], +line|z14[highway=trunk_link], +line|z14[highway=primary], +line|z14[highway=primary_link], +line|z14[highway=secondary] { shield-font-size: 9; shield-text-color: @shield; shield-text-halo-radius: 1; shield-text-halo-color: @shield_halo; shield-text-halo-opacity: 1; + shield-min-distance: 20; } +line|z15[highway=motorway], +line|z15[highway=trunk], +line|z15[highway=motorway_link], +line|z15[highway=trunk_link], +line|z15[highway=primary], +line|z15[highway=primary_link], +line|z15[highway=secondary] { + shield-font-size: 9; + shield-text-color: @shield; + shield-text-halo-radius: 1; + shield-text-halo-color: @shield_halo; + shield-text-halo-opacity: 1; + shield-min-distance: 24; +} /* MAJOR LABELS */ line|z14-15[highway=motorway], @@ -981,7 +970,7 @@ line|z14[highway=tertiary], line|z14[highway=unclassified], line|z14[highway=living_street], line|z14[highway=pedestrian] { - font-size: 10; + font-size: 9; text: name; text-color: @label_medium; text-halo-opacity: 0.5; @@ -999,7 +988,7 @@ line|z15[highway=tertiary], line|z15[highway=unclassified], line|z15[highway=living_street], line|z15[highway=pedestrian] { - font-size: 11; + font-size: 10; text: name; text-color: @label_medium; text-halo-opacity: 0.5; @@ -1010,15 +999,26 @@ line|z15[highway=pedestrian] { /* ZOOMS 16-17 */ /*SHIELDS FOR TRUNKS */ -line|z16-17[highway=motorway], -line|z16-17[highway=trunk] { +line|z16[highway=motorway], +line|z16[highway=trunk], +line|z14[highway=primary], +line|z14[highway=secondary] { shield-font-size: 9; shield-text-color: @shield; shield-text-halo-radius: 1; shield-text-halo-color: @shield_halo; shield-text-halo-opacity: 1; + shield-min-distance: 25; +} +line|z17[highway=motorway], +line|z17[highway=trunk] { + shield-font-size: 10; + shield-text-color: @shield; + shield-text-halo-radius: 1; + shield-text-halo-color: @shield_halo; + shield-text-halo-opacity: 1; + shield-min-distance: 25; } - /* PRIMARY LABELS */ line|z16-17[highway=motorway], line|z16-17[highway=trunk], @@ -1033,23 +1033,6 @@ line|z16-17[highway=secondary] { } /* SECONDARY LABELS */ -line|z15[highway=primary_link], -line|z15[highway=secondary], -line|z15[highway=motorway_link], -line|z15[highway=trunk_link], -line|z15[highway=residential], -line|z15[highway=tertiary], -line|z15[highway=unclassified], -line|z15[highway=living_street], -line|z15[highway=pedestrian] { - font-size: 10; - text: name; - text-color: @label_medium; - text-halo-opacity: 0.5; - text-halo-radius: 1; - text-halo-color: @label_halo_medium; -} - line|z15-[highway=bridleway], line|z15-[highway=path], line|z15-[highway=footway] { @@ -1069,8 +1052,9 @@ line|z16-17[highway=tertiary], line|z16-17[highway=unclassified], line|z16-17[highway=living_street], line|z16-17[highway=pedestrian], -line|z16-17[highway=path], { - font-size: 12; +line|z16-17[highway=bridleway], +line|z16-17[highway=path] { + font-size: 11; text: name; text-color: @label_medium; text-halo-opacity: 0.5; @@ -1088,6 +1072,8 @@ line|z18-[highway=trunk] { shield-text-halo-radius: 1; shield-text-halo-color: @shield_halo; shield-text-halo-opacity: 1; + shield-min-distance: 26; + } /* PRIMARY LABELS */ @@ -1112,7 +1098,9 @@ line|z18-[highway=tertiary], line|z18-[highway=unclassified], line|z18-[highway=living_street], line|z18-[highway=pedestrian], -line|z18-[highway=path] { +line|z18-[highway=path], +line|z18-[highway=bridleway], +line|z18-[highway=service] { font-size: 12; text: name; text-color: @label_medium; @@ -1143,42 +1131,40 @@ node|z12[place=suburb] font-size: 10; text-color: @district_label; } - node|z12[place=suburb]::int_name { text: int_name; font-size: 9; text-color: @district_label; } - node|z13-14[place=suburb] { text: name; font-size: 11; text-color: @district_label; } - node|z13-14[place=suburb]::int_name { text: name; font-size: 10; text-color: @district_label; } - /* SMALL LOCALITIES */ node|z14-[place=locality], node|z14-[place=neighbourhood], node|z14-[place=farm], +node|z14-[place=isolated_dwelling], node|z8-9[place=region], { text: name; font-size: 12; text-color: @district_label; } - node|z13-[place=locality]::int_name, node|z13-[place=neighbourhood]::int_name, +node|z14-[place=isolated_dwelling]::int_name, +node|z14-[place=farm]::int_name, { text: int_name; font-size: 10; @@ -1198,7 +1184,7 @@ node|z16[addr:housenumber][addr:street], font-size: 8; text-color: @housename; text-position: center; - z-index: 1000; + z-index: 300; } area|z17[building], @@ -1212,7 +1198,6 @@ node|z17[addr:housenumber][addr:street] text-position: center; z-index: 300; } - area|z17[building]::int_name, node|z17[building]::int_name, area|z17[addr:housenumber][addr:street]::int_name, @@ -1225,7 +1210,6 @@ node|z17[addr:housenumber][addr:street]::int_name z-index: 300; } - area|z18-[building], node|z18-[building], area|z18-[addr:housenumber][addr:street], @@ -1235,9 +1219,8 @@ node|z18-[addr:housenumber][addr:street] font-size: 10; text-color: @building_label; text-position: center; - z-index: 1000; + z-index: 300; } - area|z18-[building]::int_name, node|z18-[building]::int_name, area|z18-[addr:housenumber][addr:street]::int_name, @@ -1247,14 +1230,13 @@ node|z18-[addr:housenumber][addr:street]::int_name font-size: 9; text-color: @building_label; text-position: center; - z-index: 1000; + z-index: 300; } - node|z18-[entrance] { font-size: 10; text: ref; - text-offset-x: 6; + text-offset-x: 9; z-index: 10; text-color: @building_label; } @@ -1262,7 +1244,7 @@ node|z18-[entrance] node|z19-[entrance]::flats { text: "addr:flats"; - font-size: 9; + font-size: 12; text-offset-y: 10; text-color: @building_label; } @@ -1283,7 +1265,9 @@ area|z15-[area:highway=footway], } /* INDUSTRIAL */ -area|z15-[landuse=industrial] { +area|z15-[landuse=industrial], +area|z15-[landuse=construction], +node|z15-[landuse=industrial]{ text: name; font-size: 10; text-color: @city_label; @@ -1377,7 +1361,6 @@ node|z16-[natural=bay] } /* water LABELS */ - line[waterway] { text-position: line; @@ -1412,6 +1395,7 @@ area|z12-[natural=water][bbox_area<10000000] line[waterway] { text-position: line; + z-index:10000; } line|z11-[waterway=river] { @@ -1432,13 +1416,137 @@ line|z11-[waterway=riverbank] { text-halo-radius: 0; } -line|z13-[waterway=stream] { +line|z13-[waterway=stream], +line|z13-[waterway=canal] { text: name; font-size: 11; text-color: @water_label; text-halo-opacity: 0.1; text-halo-color: @halo_water_lable; text-halo-radius: 0; + z-index: 10000; +} +line|z15-[waterway=river] { + text: name; + font-size: 10; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; +} + +line|z15-[waterway=riverbank] { + text: name; + font-size: 10; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; +} + +line|z15-[waterway=stream], +line|z15-[waterway=canal] { + text: name; + font-size: 10; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; + z-index: 10000; +} +line|z17-[waterway=river] { + text: name; + font-size: 11; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; +} + +line|z17-[waterway=riverbank] { + text: name; + font-size: 11; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; +} + +line|z17-[waterway=stream], +line|z17-[waterway=canal] { + text: name; + font-size: 11; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; + z-index: 10000; +} +line|z18-[waterway=river] { + text: name; + font-size: 12; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; +} + +line|z18-[waterway=riverbank] { + text: name; + font-size: 12; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; +} + +line|z18-[waterway=stream], +line|z18-[waterway=canal] { + text: name; + font-size: 12; + text-color: @water_label; + text-halo-opacity: 0.1; + text-halo-color: @halo_water_lable; + text-halo-radius: 0; + z-index: 10000; +} +/* FERRY */ + +line|z10-[route=ferry], +line|z10-[route=ferry_motorcar] +{ + text: name; + font-size: 9; + text-color: @water_label; + text-halo-opacity: 0.0; + text-halo-color: @halo_water_lable; + text-halo-radius: 0.0; + z-index: 120; + text-position: line; +} +line|z15-[route=ferry], +line|z15-[route=ferry_motorcar] +{ + text: name; + font-size: 9; + text-color: @water_label; + text-halo-opacity: 0.0; + text-halo-color: @halo_water_lable; + text-halo-radius: 0.0; + z-index: 115; + text-position: line; +} +line|z17-[route=ferry], +line|z17-[route=ferry_motorcar] +{ + text: name; + font-size: 10; + text-color: @water_label; + text-halo-opacity: 0.0; + text-halo-color: @halo_water_lable; + text-halo-radius: 0.0; + z-index: 120; + text-position: line; } /* @@ -1458,53 +1566,52 @@ area|z10-[landuse=reservoir][bbox_area<100000000000], area|z10-[natural=water][bbox_area<100000000000] {} */ + /* PARKS LABELS */ -area|z14[leisure=park][name] { +area|z14-[leisure=park][name], +area|z14-[landuse=forest][name] { icon-image: park-s.svg; text-offset: 8; text: name; - font-size: 11; + font-size: 10; text-color: @park_label; - text-halo-color: @label_halo_light; - text-halo-radius: 0.4; - text-halo-opacity: 0.4; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; + text-halo-opacity: 1; } -area|z14[leisure=park][!name] { - icon-image: none.svg; +area|z14-[leisure=park][!name], +area|z14-[landuse=forest][!name] { } - - -area|z14[leisure=park][name]::int_name { +area|z14-[leisure=park][name]::int_name, +area|z14-[landuse=forest][name]::int_name { text-offset: 18; text: int_name; font-size: 10; text-color: @park_label; - text-halo-color: @label_halo_light; - text-halo-radius: 0.4; - text-halo-opacity: 0.4; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; + text-halo-opacity: 1; } - - -area|z15[leisure=park][name], { +area|z15-[leisure=park][name], +area|z15-[landuse=forest][name] { icon-image: park-m.svg; text-offset: 8; text: name; - font-size: 11; - text-color: @park_label; - text-halo-color: @label_halo_light; - text-halo-radius: 0.4; - text-halo-opacity: 0.4; -} - -area|z15[leisure=park][name]::int_name, { font-size: 10; + text-color: @park_label; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; + text-halo-opacity: 1; +} +area|z15-[leisure=park][name]::int_name, +area|z15-[landuse=forest][name]::int_name { text-offset: 18; text: int_name; text-color: @park_label; - text-halo-color: @label_halo_light; - text-halo-radius: 0.4; - text-halo-opacity: 0.4; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; + text-halo-opacity: 1; } /* area|z15[leisure=garden][name] { @@ -1519,21 +1626,22 @@ area|z15[leisure=garden][name] { } */ area|z15[leisure=park][!name], +area|z15[landuse=forest][!name] /*area|z15[leisure=garden][!name]*/ { } -area|z16[leisure=park][name]{ +area|z16[leisure=park][name], +area|z16[landuse=forest][name]{ icon-image: park-m.svg; text-offset: 10; text: name; font-size: 11; text-color: @park_label; - text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-opacity: 1; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; } - area|z16[leisure=garden][name] { icon-image: garden-m.svg; text-offset: 10; @@ -1541,109 +1649,149 @@ area|z16[leisure=garden][name] { font-size: 11; text-color: @park_label; text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; + icon-min-distance: 10; } area|z16[leisure=park][!name], -area|z16[leisure=garden][!name] { +area|z16[leisure=garden][!name], +area|z16[landuse=forest][!name] { } - area|z16[leisure=park][name]::int_name, -area|z16[leisure=garden][name]::int_name { +area|z16[leisure=garden][name]::int_name, +area|z16[landuse=forest][name]::int_name { text-offset: 18; text: int_name; font-size: 11; text-color: @park_label; - text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-opacity: 1; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; +} +area|z16[leisure=park][!name]::int_name, +area|z16[leisure=garden][!name]::int_name, +area|z16[landuse=forest][!name]::int_name { + } - - -area|z17[leisure=park][name] { +area|z17[leisure=park][name], +area|z17[landuse=forest][name] { icon-image: park-l.svg; text-offset: 10; text: name; font-size: 12; text-color: @park_label; - text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-opacity: 1; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; } area|z17[leisure=garden][name] { icon-image: garden-l.svg; text-offset: 10; text: name; - font-size: 13; + font-size: 11; text-color: @park_label; text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; + icon-min-distance: 10; } -area|z17[leisure=park][!name] { +area|z17[leisure=park][!name], +area|z17[landuse=forest][!name] { } area|z17[leisure=garden][!name] { } - area|z17[leisure=park][name]::int_name, -area|z17[leisure=garden][name]::int_name +area|z17[leisure=garden][name]::int_name, +area|z17[leisure=forest][name]::int_name { text-offset: 10; text: int_name; font-size: 13; text-color: @park_label; - text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-opacity: 1; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; +} +area|z17[leisure=park][!name]::int_name, +area|z17[leisure=garden][!name]::int_name, +area|z17[leisure=forest][!name]::int_name { + } - -area|z18-[leisure=park] { +area|z18-[leisure=park], +area|z18-[landuse=forest]{ icon-image: park-l.svg; text-offset: 10; text: name; font-size: 13; text-color: @park_label; - text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-opacity: 1; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; } -area|z18-[leisure=garden] { +area|z18-[leisure=garden]{ icon-image: garden-l.svg; text-offset: 10; text: name; - font-size: 13; + font-size: 11; text-color: @park_label; text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; } - - area|z18-[leisure=park]::int_name, -area|z18-[leisure=garden]::int_name { +area|z18-[leisure=garden]::int_name, +area|z18-[leisure=forest]::int_name { text-offset: 18; text: int_name; font-size: 13; text-color: @park_label; - text-halo-opacity: 0.4; - text-halo-color: @label_halo_light; - text-halo-radius: 0.5; + text-halo-opacity: 1; + text-halo-color: @halo_park_lable; + text-halo-radius: 0.1; } - /* BEACH LABELS */ area|z15-[leisure=beach_resort], -area|z15-[natural=beach], { +area|z15-[natural=beach], +node|z17-[leisure=beach_resort], +node|z17-[natural=beach] { text: name; font-size: 10; text-color: @poi_label; } +area|z15-[landuse=farmland], +area|z15-[landuse=allotments], +area|z15-[landuse=recreation_ground], +area|z15-[landuse=orchard], +area|z15-[landuse=vineyard], +{ + text: name; + font-size: 10; + text-color: @poi_label; +} +node|z17-[landuse=farmland], +node|z17-[landuse=allotments], +node|z17-[landuse=recreation_ground], +node|z17-[landuse=orchard], +node|z17-[landuse=vineyard], +area|z17-[landuse=farmland], +area|z17-[landuse=allotments], +area|z17-[landuse=recreation_ground] +area|z17-[landuse=orchard], +area|z17-[landuse=vineyard], +{ + text: name; + font-size: 10; + text-color: @poi_label; +} + + /* MILITARY */ area|z17-[landuse=military], @@ -1672,8 +1820,9 @@ node|z17-[landuse=cemetery] { text: name; font-size: 10; text-color: @poi_label; - z-index: 1000; + z-index: 800; } + area|z17-[amenity=grave_yard] node|z17-[amenity=grave_yard]{ icon-image: cemetery-l.svg; @@ -1681,8 +1830,9 @@ node|z17-[amenity=grave_yard]{ text: name; font-size: 10; text-color: @poi_label; - z-index: 1000; + z-index: 800; } + /* PIER */ area|z17-[man_made=pier], area|z17-[man_made=breakwater], diff --git a/data/styles/clear/include/landuse.mapcss b/data/styles/clear/include/landuse.mapcss index fd18ee9a26..009346f122 100644 --- a/data/styles/clear/include/landuse.mapcss +++ b/data/styles/clear/include/landuse.mapcss @@ -7,6 +7,7 @@ area|z11-[place=hamlet] { fill-color: @background; } */ + /* PIER */ area|z12-[man_made=pier], area|z12-[man_made=breakwater], @@ -20,17 +21,16 @@ area|z12-[man_made=breakwater], line|z14-[man_made=pier], line|z14-[man_made=breakwater] -{ casing-width: 0.3; +{ casing-width: 2; casing-color: @background; fill-color: @background; fill-opacity: 1; z-index: 120; fill-position: background; - } line|z17-[man_made=pier], line|z17-[man_made=breakwater] -{ casing-width: 1; +{ casing-width: 2; casing-color: @background; fill-color: @background; fill-opacity: 1; @@ -47,9 +47,10 @@ area|z14-[area:highway=footway], area|z14-[area:highway=living_street], { fill-color: @pedestrian_area; - fill-opacity: 0.3; - z-index: 44; fill-position: background; + fill-opacity: 1; + z-index: 44; + } area|z16-[highway=pedestrian][area?], @@ -57,15 +58,18 @@ area|z16-[area:highway=pedestrian], area|z16-[highway=footway][area?][!sac_scale], area|z16-[area:highway=footway], area|z16-[area:highway=living_street], + { - fill-color: @pedestrian_area; - fill-opacity: 0.3; - z-index: 44; + fill-color: @pedestrian_area_light; fill-position: background; + fill-opacity: 1; + z-index: 44; } + /* INDUSTRIAL */ + area|z15-[landuse=industrial], area|z15-[landuse=construction]{ fill-color: @industrial; @@ -74,36 +78,50 @@ area|z15-[landuse=construction]{ z-index: 3; } + /* CEMETRY */ area|z14[landuse=cemetery] { - fill-color: @park; + fill-color: @green2; fill-opacity: 0.85; z-index: 43; fill-position: background; } area|z14[amenity=grave_yard] { - fill-color: @park; + fill-color: @green2; fill-opacity: 0.85; z-index: 43; fill-position: background; } area|z15-[amenity=grave_yard], area|z15-[landuse=cemetery] { - fill-color: @park; + fill-color: @green2; + fill-opacity: 1; + z-index: 43; + fill-position: background; +} +area|z16-[amenity=grave_yard], +area|z16-[landuse=cemetery] { + fill-color: @green3; fill-opacity: 1; z-index: 43; fill-position: background; } - /* UNIVERSITY */ + area|z14-15[amenity=university] { fill-color: @unversity; - fill-opacity: 0.8; + fill-opacity: 1; fill-position: background; z-index: 1; } +/*area|z15[amenity=university] { + fill-color: @unversity; + fill-opacity: 1; + fill-position: background; + z-index: -10; +}*/ area|z16-17[amenity=university] { fill-color: @unversity; @@ -114,8 +132,8 @@ area|z16-17[amenity=university] { area|z18-[amenity=university] { fill-color: @unversity; - fill-opacity: 1; fill-position: background; + fill-opacity: 1; z-index: 1; } @@ -124,15 +142,39 @@ area|z16-[sport=soccer], area|z15-[leisure=stadium], area|z17-[leisure=playground] { fill-color: @sport; + fill-position: background; fill-opacity: 1; z-index: 5; - fill-position: background; } -/* HOSPITALS */ -area|z14-[amenity=hospital] { +/* hospital*/ + +area|z14-15[amenity=hospital] { fill-color: @hospital; fill-opacity: 1; fill-position: background; z-index: 2; + } +area|z16-[amenity=hospital] { + fill-color: @hospital; + fill-opacity: 1; + fill-position: background; + z-index: 2; + +} +area|z16-[amenity=place_of_worship] +{ + fill-color: @pedestrian; + fill-opacity: 1; + fill-position: background; + z-index: 210; + +} +/* MILITARY */ +/* area|z14[landuse=military] { + fill-color: ; + fill-opacity: 0.5; + z-index: 10; +} +*/ diff --git a/data/styles/clear/include/natural.mapcss b/data/styles/clear/include/natural.mapcss index bdd73a2abd..26a7745f0e 100644 --- a/data/styles/clear/include/natural.mapcss +++ b/data/styles/clear/include/natural.mapcss @@ -1,4 +1,3 @@ - /* land */ area|z0-9[natural=land] @@ -20,12 +19,12 @@ area|z10-[natural=land] /* glacier */ area|z0-[natural=glacier] { - fill-color: @glacier; + fill-color: @glacier; fill-position: background; z-index: 1; } -/*water */ +/* water */ area|z0-10[natural=coastline] { @@ -49,7 +48,6 @@ area|z10-19[natural=coastline] fill-position: background; z-index: -10; } - area|z16-[amenity=fountain], area|z12-[landuse=basin], area|z12-[landuse=reservoir], @@ -80,44 +78,49 @@ area|z11-[natural=wetland] { line|z10[waterway=river], line|z10[waterway=riverbank] { - width: 0.5; - opacity: 0.5; + width: 0.6; + opacity: 1; color: @river; z-index: 50; } line|z11-12[waterway=river], line|z11-12[waterway=riverbank] { - width: 0.7; - opacity: 0.8; + width: 0.8; + opacity: 1; color: @river; z-index: 50; } -line|z13-14[waterway=stream] { - width: 0.1; - opacity: 0.6; +line|z13-14[waterway=stream], +line|z13-14[waterway=canal]{ + width: 0.2; + opacity: 1; color: @river; z-index: 50; } line|z13-14[waterway=stream][intermittent=yes] { - dashes: 3,3; + dashes: 2.7,2.7; + z-index: 49; } line|z13-14[waterway=river] { - width: 1; + width: 1.2; opacity: 1; color: @river; z-index: 50; } line|z13-14[waterway=riverbank] { - width: 1; + width: 1.2; + opacity: 1; color: @river; z-index: 50; } -line|z15-[waterway=stream] { +line|z15-[waterway=stream], +line|z15-[waterway=canal] + { width: 1; opacity: 1; color: @river; @@ -125,11 +128,11 @@ line|z15-[waterway=stream] { } line|z15-[waterway=stream][intermittent=yes] { - dashes: 5.5; + dashes: 4.95; width: 1; opacity: 1; color: @river; - z-index: 50; + z-index: 49; } line|z15-[waterway=river] { width: 1.8; @@ -144,120 +147,178 @@ line|z15-[waterway=riverbank] { } -line|z17-[waterway=ditch] { - width: 1; - opacity: 1; - color: @river; - z-index: 50; - dashes: 1,1; -} - area|z15-[waterway=dam], line|z15-[waterway=dam], line|z15-[waterway=wair], { width: 1; - opacity: 0.8; + opacity: 1; color: @bridge_casing; - z-index: 283; + z-index: 110; +} +line|z16-[waterway=canal] +{ + width: 1.5; + color: @river; + z-index: 50; +} +line|z17-[waterway=ditch] { + width: 1.8; + opacity: 1; + color: @river; + z-index: 50; + dashes: 0.9,0.9; } - /* VEGETATION */ - area|z10[natural=wood], area|z10[landuse=forest], area|z10[leisure=nature_reserve] { - fill-color: @forest; - fill-opacity: 0.5; - z-index: 30; + fill-color: @green1; fill-position: background; + fill-opacity: 1; + z-index: 30; } area|z11[natural=wood], area|z11[landuse=forest], area|z11[leisure=nature_reserve] { - fill-color: @forest; - fill-opacity: 0.65; - z-index: 30; + fill-color: @green2; fill-position: background; + fill-opacity: 1; + z-index: 30; } area|z12[natural=wood], area|z12[landuse=forest], area|z12[leisure=nature_reserve] { - fill-color: @forest; - fill-opacity: 0.75; - z-index: 30; + fill-color: @green2; fill-position: background; - + fill-opacity: 1; + z-index: 30; } -area|z13-14[natural=wood], -area|z13-14[landuse=forest], -area|z13-14[leisure=nature_reserve] +area|z13-[natural=wood], +area|z13-[landuse=forest], +area|z13-[leisure=nature_reserve] { - fill-color: @forest; - fill-opacity: 0.85; - z-index: 30; + fill-color: @green3; fill-position: background; + fill-opacity: 1; + z-index: 30; +} +area|z14-[natural=wood], +area|z14-[landuse=forest], +area|z14-[leisure=nature_reserve] +{ + fill-color: @green4; + fill-position: background; + fill-opacity: 1; + z-index: 30; } area|z15-[natural=wood], area|z15-[landuse=forest], area|z15-[leisure=nature_reserve] { - fill-color: @forest; + fill-color: @green5; + fill-position: background; fill-opacity: 1; z-index: 30; +} +area|z16-[natural=wood], +area|z16-[landuse=forest], +area|z16-[leisure=nature_reserve] +{ + fill-color: @forest; fill-position: background; + fill-opacity: 1; + z-index: 30; } + area|z10[leisure=park] { - fill-color: @park; - fill-opacity: 0.4; - z-index: 40; + fill-color: @green2; fill-position: background; + fill-opacity: 1; + z-index: 40; } area|z11[leisure=park] { - fill-color: @park; - fill-opacity: 0.5; - z-index: 40; + fill-color: @green2; fill-position: background; + fill-opacity: 1; + z-index: 40; } area|z12[leisure=park], area|z12[leisure=garden] { - fill-color: @park; - fill-opacity: 0.7; - z-index: 40; + fill-color: @green2; fill-position: background; + fill-opacity: 1; + z-index: 40; } area|z13[leisure=park], area|z13[leisure=garden] { - fill-color: @park; - fill-opacity: 0.8; - z-index: 40; + fill-color: @green3; fill-position: background; -} -area|z14[leisure=park], area|z14[leisure=garden] { - fill-color: @park; - fill-opacity: 0.85; - z-index: 40; - fill-position: background; -} -area|z15-[leisure=park], area|z15-[leisure=garden] { - fill-color: @park; fill-opacity: 1; z-index: 40; +} +area|z14[leisure=park], area|z14[leisure=garden] { + fill-color: @green4; + fill-position: background; + fill-opacity: 1; + z-index: 40; +} +area|z15[leisure=park], area|z15[leisure=garden] { + fill-color: @green5; + fill-position: background; + fill-opacity: 1; + z-index: 40; +} +area|z16-[leisure=park], area|z16-[leisure=garden] { + fill-color: @forest; + fill-position: background; + fill-opacity: 1; + z-index: 40; +} + +area|z13-[landuse=grass], +area|z13-[natural=grassland], +area|z13-[leisure=golf_course] + +{ + fill-color: @green0; + fill-opacity: 1; + z-index: 45; fill-position: background; } -area|z15-[landuse=grass] + +area|z13-[landuse=farmland], +area|z13-[landuse=allotments], +area|z13-[natural=scrub], +area|z13-[landuse=orchard], +area|z13-[landuse=vineyard], +area|z13-[landuse=meadow], +area|z13-[landuse=recreation_ground], +area|z13-[landuse=village_green], + { - fill-color: @forest; + fill-color: @green0; + fill-opacity: 1; + z-index: 42; + fill-position: background; +} + +area|z14-[landuse=grass], +area|z14-[natural=grassland], +area|z14-[leisure=golf_course] + +{ + fill-color: @green1; fill-opacity: 1; z-index: 45; fill-position: background; @@ -274,37 +335,35 @@ area|z14-[landuse=village_green], { - fill-color: @forest; + fill-color: @green1; fill-opacity: 1; z-index: 42; fill-position: background; } - /* BEACH */ - area|z10-14[leisure=beach_resort], area|z10-14[natural=beach], { fill-color: @beach; - fill-opacity: 0.7; - z-index: 1; fill-position: background; + fill-opacity: 1; + z-index: 1; } area|z15-[leisure=beach_resort], area|z15-[natural=beach], { fill-color: @beach; - fill-opacity: 0.85; - z-index: 1; fill-position: background; + fill-opacity: 1; + z-index: 1; } area|z17-[leisure=beach_resort], area|z17-[natural=beach], { fill-color: @beach; fill-opacity: 1; - z-index: 1; fill-position: background; + z-index: 1; } diff --git a/data/styles/clear/include/newPOI b/data/styles/clear/include/newPOI new file mode 100644 index 0000000000..df47197b43 --- /dev/null +++ b/data/styles/clear/include/newPOI @@ -0,0 +1,75 @@ +node|z18-[amenity=car_sharing], area|z18-[amenity=car_sharing]{ icon-image: car_sharing-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[amenity=post_box], area|z18-[amenity=post_box]{ icon-image: postbox-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[aeroway=gate], area|z18-[aeroway=gate]{ icon-image: none.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } + +node|z18-[amenity=bbq], area|z18-[amenity=bbq]{ icon-image: none.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[amenity=car_rental], area|z18-[amenity=car_rental]{ icon-image: car_sharing.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[], area|z18-[] { icon-image: none.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } + +node|z18-[amenity=vending_machine], area|z18-[amenity=vending_machine] { icon-image: vending-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[amenity=vending_machine][vending=parking_tickets], +area|z18-[amenity=vending_machine][vending=parking_tickets] +{ icon-image: parking-meter-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } + + +node|z18-[amenity=casino], area|z18-[amenity=casino]{ icon-image: casino-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[amenity=marketplace], area|z18-[amenity=marketplace]{ icon-image: marketplace-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[amenity=taxi], area|z18-[amenity=taxi]{ icon-image: taxi-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[barrier=lift_gate], area|z18-[barrier=lift_gate] { icon-image: lift_gate-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[barrier=toll_booth], area|z18-[barrier=toll_booth] { icon-image: toll_booth-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[historic=boundary_stone], area|z18-[historic=boundary_stone]{ icon-image: boundary_stone-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[historic=ship], area|z18-[historic=ship]{ icon-image: ship-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[historic=tomb], area|z18-[historic=tomb] { icon-image: tomb-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[historic=wayside_cross], area|z18-[historic=wayside_cross]{ icon-image: wayside_cross-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[historic=wayside_shrine], area|z18-[historic=wayside_shrine] { icon-image: wayside_shrine-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[leisure=dog_park], area|z18-[leisure=dog_park] { icon-image: dog_park-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[leisure=water_park], area|z18-[leisure=water_park]{ icon-image: diving-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[man_made=windmill], area|z18-[man_made=windmill]{ icon-image: windmill-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} + +node|z18-[shop=books], area|z18-[shop=books]{ icon-image: book-shop-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=bakery], area|z18-[shop=bakery] { icon-image: bakery-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=beauty], area|z18-[shop=beauty] { icon-image: beauty-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=beverages], area|z18-[shop=beverages] { icon-image: alcohol-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=bicycle], area|z18-[shop=bicycle]{ icon-image: shop-bicycle-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=butcher], area|z18-[shop=butcher] { icon-image: butcher-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=car], area|z18-[shop=car]{ icon-image: car_sharing-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=car_repair], area|z18-[shop=car_repair] { icon-image: car_repair-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=chemist], area|z18-[shop=chemist] { icon-image: chemist-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=clothes], area|z18-[shop=clothes] { icon-image: clothes-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=computer], area|z18-[shop=computer]{ icon-image: computer-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=confectionery], area|z18-[shop=confectionery]{ icon-image: sweets-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=convenience], area|z18-[shop=convenience] { icon-image: convenience-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=department_store], area|z18-[shop=department_store]{ icon-image: department_store-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=doityourself], area|z18-[shop=doityourself] { icon-image: doityourself-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=electronics], area|z18-[shop=electronics] { icon-image: electronics-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=florist], area|z18-[shop=florist]{ icon-image: florist-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=furniture], area|z18-[shop=furniture]{ icon-image: furniture-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=garden_centre], area|z18-[shop=garden_centre]{ icon-image: garden_centre-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=gift], area|z18-[shop=gift]{ icon-image: gift-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=greengrocer], area|z18-[shop=greengrocer]{ icon-image: greengrocer-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=hairdresser], area|z18-[shop=hairdresser] { icon-image: hairdresser-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=hardware], area|z18-[shop=hardware]{ icon-image: hardware-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=jewelry], area|z18-[shop=jewelry] { icon-image: jewelry-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=kiosk], area|z18-[shop=kiosk]{ icon-image: kiosk-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=mobile_phone], area|z18-[shop=mobile_phone]{ icon-image: mobile_phone-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=optician], area|z18-[shop=optician]{ icon-image: optician-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=shoes], area|z18-[shop=shoes]{ icon-image: shoes-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[shop=sports], area|z18-[shop=sports]{ icon-image: sports-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[shop=toys], area|z18-[shop=toys]{ icon-image: toys-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} + +node|z18-[sport=archery], area|z18-[sport=archery]{ icon-image: archery-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[sport=australian_football], area|z18-[sport=australian_football]{ icon-image: australian-football-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[sport=bowls], area|z18-[sport=bowls] { icon-image: bowls-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[sport=cricket], area|z18-[sport=cricket]{ icon-image: cricket-shop-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[sport=curling], area|z18-[sport=curling] { icon-image: curling-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[sport=diving], area|z18-[sport=diving] { icon-image: diving-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[sport=scuba_diving], area|z18-[sport=scuba_diving]{ icon-image: diving-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } +node|z18-[tourism=alpine_hut], area|z18-[tourism=alpine_hut]{ icon-image: alpine_hut-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[tourism=caravan_site], area|z18-[tourism=caravan_site]{ icon-image: caravan_site-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } + +node|z18-[tourism=guest_house], area|z18-[tourism=guest_house]{ icon-image: motel-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} + +node|z18-[tourism=motel], area|z18-[tourism=motel]{ icon-image: motel-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} +node|z18-[tourism=picnic_site], area|z18-[tourism=picnic_site]{ icon-image: picnic-l-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label; z-index: 2400;} + +node|z18-[natural=beach], area|z18-[natural=beach]{ icon-image: beach-l.svg; text-offset: 10; font-size: 10; text: name; text-color: @poi_label;z-index: 2400; } diff --git a/data/styles/clear/include/other.mapcss b/data/styles/clear/include/other.mapcss index 5d82a773d1..0c26d0ef2a 100644 --- a/data/styles/clear/include/other.mapcss +++ b/data/styles/clear/include/other.mapcss @@ -8,10 +8,10 @@ line|z16[barrier=hedge], line|z16[historic=citywalls], { color: @fence; - width: 0.1; - opacity: 0.6; + width: 0.5; + opacity: 1; z-index: 950; - dashes: 0.1,0.1; + dashes: 0.09,0.09; } line|z17-[barrier=wall], @@ -22,10 +22,10 @@ line|z17-[barrier=hedge], line|z17-[historic=citywalls], { color: @fence; - width: 0.3; + width: 1; opacity: 1; z-index: 950; - dashes: 0.2,0.2; + dashes: 0.18,0.18; } line|z18-[barrier=wall], line|z18-[barrier=city_wall], @@ -37,7 +37,7 @@ line|z18-[historic=citywalls], color: @fence; width: 1; z-index: 950; - dashes: 0.1,0.1; + dashes: 0.18,0.18; } /* PISTE */ @@ -49,8 +49,8 @@ line|z13-14[piste:lift=platter], line|z13-14[piste:lift=rope_tow], line|z13-14[piste:lift=t-bar] { color: red; - width: 0.5; - opacity: 0.6; + width: 1; + opacity: 1; z-index: 6888; } @@ -61,73 +61,80 @@ line|z15-[piste:lift=platter], line|z15-[piste:lift=rope_tow], line|z15-[piste:lift=t-bar] { color: @aerialway; - width: 0.8; + width: 1.6; opacity: 1; z-index: 6888; } line|z14[piste:type=downhill], line|z14[piste:type=nordic], line|z14[piste:type=sled] { color: @piste; - width: 0.3; - opacity: 0.6; + width: 0.8; + opacity: 1; z-index: 10; } line|z14[route=ski] { color: @piste; - width: 0.3; - opacity: 0.6; - z-index: 199; -} -line|z15[piste:type=downhill], line|z15[piste:type=nordic], line|z15[piste:type=sled] { - color: @piste; - width: 0.5; - opacity: 0.8; - z-index: 199; -} -line|z15[route=ski] { - color: @piste; - width: 0.5; - opacity: 0.8; - z-index: 199; -} - - -line|z16-[piste:type=downhill], -line|z16-[piste:type=nordic], -line|z16-[piste:type=sled] { - color: @piste; - width: 1; + width: 0.8; opacity: 1; z-index: 199; } -line|z16-[route=ski] { +line|z15-[piste:type=downhill], line|z15[piste:type=sled] { color: @piste; - width: 1; + width: 1.1; + opacity: 1; + z-index: 199; +} +line|z15-[piste:type=nordic]{ + color: @piste; + width: 1.1; + opacity: 1; + z-index: 199; +} + +line|z15-[route=ski] { + color: @piste; + width: 1.1; opacity: 1; z-index: 199; } -line|z14-[piste:type=downhill][piste:difficulty=novice] { color: @piste_novice; width: 0.3; opacity: 0.6; z-index: 100;} -line|z14-[piste:type=downhill][piste:difficulty=easy] { color: @piste_easy; width: 0.3; opacity: 0.6; z-index: 100; } -line|z14-[piste:type=downhill][piste:difficulty=intermediate] { color: @piste_intermadiate; width: 0.3; opacity: 0.6; z-index: 100;} -line|z14-[piste:type=downhill][piste:difficulty=advanced] { color: @piste_advanced; width: 0.3; opacity: 0.6; z-index: 100; } -line|z14-[piste:type=downhill][piste:difficulty=expert] { color: @piste_expert; width: 0.3; opacity: 0.6; z-index: 100; } -line|z14-[piste:type=downhill][piste:difficulty=freeride] { color: @piste_expert; width: 0.3; opacity: 0.6; z-index: 100;} +line|z17-[piste:type=downhill], +line|z17-[piste:type=nordic], +line|z17-[piste:type=sled] { + color: @piste; + width: 1.5; + opacity: 1; + z-index: 199; +} +line|z17-[route=ski] { + color: @piste; + width: 1.5; + opacity: 1; + z-index: 199; +} -line|z15-[piste:type=downhill][piste:difficulty=novice] { color: @piste_novice; width: 0.5; opacity: 0.8; z-index: 100;} -line|z15-[piste:type=downhill][piste:difficulty=easy] { color: @piste_easy; width: 0.5; opacity: 0.8; z-index: 100; } -line|z15-[piste:type=downhill][piste:difficulty=intermediate] { color: @piste_intermadiate; width: 0.5; opacity: 0.8; z-index: 100;} -line|z15-[piste:type=downhill][piste:difficulty=advanced] { color: @piste_advanced; width: 0.5; opacity: 0.8; z-index: 100; } -line|z15-[piste:type=downhill][piste:difficulty=expert] { color: @piste_expert; width: 0.5; opacity: 0.8; z-index: 100; } -line|z15-[piste:type=downhill][piste:difficulty=freeride] { color: @piste_expert; width: 0.5; opacity: 0.8; z-index: 100;} -line|z16-[piste:type=downhill][piste:difficulty=novice] { color: @piste_novice; width: 1; opacity: 1; z-index: 100;} -line|z16-[piste:type=downhill][piste:difficulty=easy] { color: @piste_easy; width: 1; opacity: 1; z-index: 100; } -line|z16-[piste:type=downhill][piste:difficulty=intermediate] { color: @piste_intermadiate; width: 1; opacity: 1; z-index: 100;} -line|z16-[piste:type=downhill][piste:difficulty=advanced] { color: @piste_advanced; width: 1; opacity: 1; z-index: 100; } -line|z16-[piste:type=downhill][piste:difficulty=expert] { color: @piste_expert; width: 1; opacity: 1; z-index: 100; } -line|z16-[piste:type=downhill][piste:difficulty=freeride] { color: @piste_expert; width: 1; opacity: 1; z-index: 100;} +line|z14-[piste:type=downhill][piste:difficulty=novice] { color: @piste_novice; width: 1; opacity: 1; z-index: 100;} +line|z14-[piste:type=downhill][piste:difficulty=easy] { color: @piste_easy; width: 1; opacity: 1; z-index: 100; } +line|z14-[piste:type=downhill][piste:difficulty=intermediate] { color: @piste_intermadiate; width: 1; opacity: 1; z-index: 100;} +line|z14-[piste:type=downhill][piste:difficulty=advanced] { color: @piste_advanced; width: 1; opacity: 1; z-index: 100; } +line|z14-[piste:type=downhill][piste:difficulty=expert] { color: @piste_expert; width: 1; opacity: 1; z-index: 100; } +line|z14-[piste:type=downhill][piste:difficulty=freeride] { color: @piste_expert; width: 1; opacity: 1; z-index: 100;} + +line|z15-[piste:type=downhill][piste:difficulty=novice] { color: @piste_novice; width: 1.6; opacity: 1; z-index: 100;} +line|z15-[piste:type=downhill][piste:difficulty=easy] { color: @piste_easy; width: 1.6; opacity: 1; z-index: 100; } +line|z15-[piste:type=downhill][piste:difficulty=intermediate] { color: @piste_intermadiate; width: 1.6; opacity: 0.8; z-index: 100;} +line|z15-[piste:type=downhill][piste:difficulty=advanced] { color: @piste_advanced; width: 1.6; opacity: 1; z-index: 100; } +line|z15-[piste:type=downhill][piste:difficulty=expert] { color: @piste_expert; width: 1.6; opacity: 1; z-index: 100; } +line|z15-[piste:type=downhill][piste:difficulty=freeride] { color: @piste_expert; width: 1.6; opacity:1; z-index: 100;} + +line|z17-[piste:type=downhill][piste:difficulty=novice] { color: @piste_novice; width: 1.8; opacity: 1; z-index: 100;} +line|z17-[piste:type=downhill][piste:difficulty=easy] { color: @piste_easy; width: 1.8; opacity: 1; z-index: 100; } +line|z17-[piste:type=downhill][piste:difficulty=intermediate] { color: @piste_intermadiate; width: 1.8; opacity: 1; z-index: 100;} +line|z17-[piste:type=downhill][piste:difficulty=advanced] { color: @piste_advanced; width: 1.8; opacity: 1; z-index: 100; } +line|z17-[piste:type=downhill][piste:difficulty=expert] { color: @piste_expert; width: 1.8; opacity: 1; z-index: 100; } +line|z17-[piste:type=downhill][piste:difficulty=freeride] { color: @piste_expert; width: 1.8; opacity: 1; z-index: 100;} /* [piste:type=downhill] diff --git a/data/styles/clear/include/roads.mapcss b/data/styles/clear/include/roads.mapcss index d7e0a92dab..5f2b2f9890 100644 --- a/data/styles/clear/include/roads.mapcss +++ b/data/styles/clear/include/roads.mapcss @@ -4,7 +4,7 @@ line[highway] } /* Z-INDEXES */ - +/* line|z7-[highway=trunk], line|z7-[highway=motorway] { z-index: 900; @@ -23,44 +23,65 @@ line|z11-[highway=tertiary] { z-index: 750; } -line|z10-[highway=unclassified], -line|z10-[highway=road], -line|z10-[highway=living_street] { +line|z7-[highway=unclassified], +line|z7-[highway=living_street] { z-index: 700; } -line|z10-[highway=service] { +line|z14[highway=track], +line|z14[highway=path], +line|z14[route=hiking], +line|z14[highway=track][tracktype=grade1], + +{ z-index: 600;} + + +/*line|z7-[highway=service] { z-index: 650; } -line|z10-[highway=pedestrian] { - z-index: 650; -} - -line|z10-[highway=footway], -line|z10-[highway=path] { +line|z7-[highway=footway], +line|z7-[highway=path] { z-index: 600; } -line|z10-[highway=trunk_link], -line|z10-[highway=motorway_link], -line|z10-[highway=primary_link], -line|z10-[highway=secondary_link], -line|z10-[highway=tertiary_link], -line|z10-[highway=residential_link], -line|z10-[highway=track], -line|z10-[highway=bridleway] { - z-index: 500; +line|z14[highway=bridleway] +{z-index: 590;} + +line|z7-[highway=pedestrian] { + z-index: 550; } +line|z13[highway=cycleway], +line|z16[highway=steps]{ + z-index: 1000; +} + +line|z13[highway=construction] +{ z-index: 450;} + + +line|z7-[highway=trunk_link], +line|z7-[highway=motorway_link], +{z-index: 890;} +line|z7-[highway=primary_link], +{z-index: 840;} +line|z7-[highway=secondary_link], +{z-index: 790;} +line|z7-[highway=tertiary_link], +line|z7-[highway=residential_link], +{z-index: 740;} + +*/ /* ZOOM 7 */ line|z7[highway=trunk], line|z7[highway=motorway] { - color: @trunk; - width: 0.3; - opacity: 0.4; + color: @trunk_orange_light; + width: 0.6; + opacity: 1; + z-index: 900; } @@ -69,56 +90,66 @@ line|z7[highway=motorway] { line|z8[highway=trunk], line|z8[highway=motorway] { - width: 0.6; - color: @trunk; - opacity: 0.5; + width: 0.7; + color: @trunk_orange_light; + opacity: 1; + z-index: 900; } +line|z8[highway=primary] +{ + color: @primary_orange; + width: 0.5; + opacity: 1; + z-index: 850; +} + /* ZOOM 9 */ line|z9[highway=trunk], line|z9[highway=motorway] { - color: @trunk; - width: 0.8; - opacity: 0.7; + color: @trunk_orange_medium; + width: 1; + opacity: 1; + z-index: 900; } line|z9[highway=primary] { - color: @primary; - width: 0.1; - opacity: 0.4; + color: @primary_orange; + width: 0.7; + opacity: 1; + z-index: 850; } -line|z7-[highway=cycleway] { - z-index: 950; -} - /* ZOOM 10 */ line|z10[highway=trunk], line|z10[highway=motorway] { - color: @trunk_yellow; - width: 1.2; - opacity: 0.8; + color: @trunk_orange_medium; + width: 1.3; + opacity: 1; + z-index: 900; } line|z10[highway=primary] { - color: @primary; - width: 0.9; - opacity: 0.8; + color: @primary_orange; + width: 1; + opacity: 1; + z-index: 850; } line|z10[highway=secondary] { color: @secondary; - width: 0.2; - opacity: 0.4; + width: 0.8; + opacity: 1; + z-index: 800; } @@ -127,49 +158,54 @@ line|z10[highway=secondary] line|z11[highway=trunk], line|z11[highway=motorway] { - color: @trunk_yellow; + color: @trunk_orange_light; width: 1.8; - opacity: 0.7; + opacity: 1; + z-index: 900; } - +/* line|z11[highway=trunk]::case, line|z11[highway=motorway]::case { - color: @trunk_yellow_case; - width: 2.8; + color: @trunk_orange_case; + width: 3.6; opacity: 1; z-index: 45; } +*/ line|z11[highway=primary] { - color: @primary_yellow; - width: 1; + color: @primary_orange_medium; + width: 1.4; opacity: 1; + z-index: 850; } - +/* line|z11[highway=primary]::case { - color: @primary_yellow_case; - width: 2; + color: @primary_orange_case; + width: 2.6; opacity: 1; z-index: 45; } - +*/ line|z11[highway=secondary] { color: @secondary; - width: 0.7; - opacity: 0.8; + width: 1.1; + opacity: 1; + z-index: 800; } line|z11[highway=residential], line|z11[highway=tertiary] { color: @residential; - width: 0.1; - opacity: 0.2; + width: 0.4; + opacity: 1; + z-index: 750; } @@ -178,23 +214,25 @@ line|z11[highway=tertiary] line|z12[highway=trunk], line|z12[highway=motorway] { - color: @trunk_yellow; + color: @trunk_orange_medium; width: 2; - opacity: 0.9; + opacity: 1; + z-index: 900; } - +/* line|z12[highway=trunk]::case, line|z12[highway=motorway]::case { - color: @trunk_yellow_case; + color: @trunk_orange_case; width: 3.2; opacity: 1; z-index: 45; } - +*/ line|z12[highway=motorway][tunnel?], line|z12[highway=trunk][tunnel?] { + color: @trunk_tunnel_orange; casing-width: 0.5; casing-linecap: butt; casing-color: @trunk_tunnel_casing; @@ -204,24 +242,27 @@ line|z12[highway=trunk][tunnel?] { line|z12[highway=primary] { - color: @primary_yellow; - width: 1.5; - opacity: 0.9; + color: @primary_orange; + width: 1.6; + opacity: 1; + z-index: 850; } - +/* line|z12[highway=primary]::case { - color: @primary_yellow_case; + color: @primary_orange_case; width: 2.5; opacity: 1; z-index: 45; } +*/ line|z12[highway=secondary] { color: @secondary; - width: 1.8; - opacity: 0.7; + width: 1.6; + opacity: 1; + z-index: 800; } line|z12[highway=residential], @@ -231,8 +272,9 @@ line|z12[highway=road], line|z12[highway=living_street] { color: @residential; - width: 0.3; - opacity: 0.4; + width: 0.8; + opacity: 1; + z-index: 750; } /* ZOOM 13 */ @@ -241,24 +283,26 @@ line|z13[highway=trunk], line|z13[highway=motorway] { width: 2.8; - opacity: 0.9; - color: @trunk_yellow; + opacity: 1; + color: @trunk_orange_light; + z-index: 900; } - +/* line|z13[highway=trunk]::case, line|z13[highway=motorway]::case { - color: @trunk_yellow_case; + color: @trunk_orange_case; width: 4; opacity: 1; z-index: 45; } - +*/ line|z13[highway=motorway][tunnel?], line|z13[highway=trunk][tunnel?], line|z13[highway=motorway_link][tunnel?], line|z13[highway=trunk_link][tunnel?] { + color: @trunk_tunnel_orange; casing-width: 1; casing-linecap: butt; casing-color: @trunk_tunnel_casing; @@ -268,30 +312,34 @@ line|z13[highway=trunk_link][tunnel?] { line|z13[highway=motorway_link], line|z13[highway=trunk_link] { - color: @trunk_link; - width: 0.8; + color: @trunk_orange_light; + width: 2.8; + z-index: 890; } line|z13[highway=primary] { - color: @primary_yellow; - width: 2.5; + color: @primary_orange_light; + width: 2.4; opacity: 1; + z-index: 850; } - +/* line|z13[highway=primary]::case { - color: @primary_yellow_case; + color: @primary_orange_case; width: 3.5; opacity: 1; z-index: 45; } +*/ line|z13[highway=secondary] { color: @secondary; - width: 2; + width: 2.2; opacity: 1; + z-index: 800; } @@ -299,8 +347,9 @@ line|z13[highway=residential], line|z13[highway=tertiary], { color: @residential; - width: 0.7; - opacity: 0.7; + width: 1.2; + opacity: 1; + z-index: 750; } line|z13[highway=unclassified], @@ -308,25 +357,37 @@ line|z13[highway=road], line|z13[highway=living_street] { color: @unclassified; - width: 0.7; - opacity: 0.7; + width: 1; + opacity: 1; + z-index: 700; } line|z13[highway=pedestrian] { color: @pedestrian; - width: 0.7; - dashes: 2,1; - opacity: 0.7; + width: 1; + dashes: 2,1;/*dashes: 0.9,0.45 1.8,0.9;*/ + opacity: 1; + z-index: 660; } +line|z13[highway=cycleway] +{ + color: @cycleway; + width: 1; + opacity: 1; + z-index: 1000; +/* dashes: 0.9,0.9; + opacity: 0.8;*/ +} line|z13[highway=construction] { color: @construction; - opacity: 0.5; - width: 1.4; - dashes: 4,4; + opacity: 1; + width: 1.2; + dashes: 3.6,1.8; + z-index: 450; } /* ZOOM 14 */ @@ -336,29 +397,33 @@ line|z14[highway=motorway] { width: 3.8; opacity: 1; - color: @trunk_yellow; + color: @trunk_orange_light; + z-index: 900; } - +/* line|z14[highway=trunk]::case, line|z14[highway=motorway]::case { - color: @trunk_yellow_case; + color: @trunk_orange_case; width: 5; opacity: 1; z-index: 45; } +*/ line|z14[highway=motorway_link], line|z14[highway=trunk_link] { - color: @trunk_link; - width: 1.9; + color: @trunk_orange_light; + width: 3.8; + z-index: 890; } line|z14[highway=motorway][tunnel?], line|z14[highway=trunk][tunnel?], line|z14[highway=motorway_link][tunnel?], line|z14[highway=trunk_link][tunnel?] { + color: @trunk_tunnel_orange; casing-width: 1; casing-linecap: butt; casing-color: @trunk_tunnel_casing; @@ -367,27 +432,31 @@ line|z14[highway=trunk_link][tunnel?] { line|z14[highway=primary] { - color: @primary_yellow; - width: 2.8; + color: @primary_orange_medium; + width: 2.9; opacity: 1; + z-index: 850; } - +/* line|z14[highway=primary]::case { - color: @primary_yellow_case; + color: @primary_orange_case; width: 4; opacity: 1; z-index: 45; } +*/ line|z14[highway=primary_link] { - color: @primary_link; - width: 1.4; + color: @primary_orange_medium; + width: 2.9; + z-index: 840; } line|z14[highway=primary][tunnel?], -line|z14[highway=primary_link][tunnel?] { +line|z14[highway=primary_link][tunnel?] { + color: @primary_tunnel_orange; casing-width: 1; casing-linecap: butt; casing-color: @primary_tunnel_casing; @@ -397,46 +466,61 @@ line|z14[highway=primary_link][tunnel?] { line|z14[highway=secondary] { color: @secondary; - width: 2.8; + width: 3; opacity: 1; + z-index: 800; } line|z14[highway=secondary_link] { - color: @secondary_link; - width: 1.4; + color: @secondary; + width: 1.5; + z-index: 790; } line|z14[highway=residential], line|z14[highway=tertiary], { color: @residential; - width: 1.4; - opacity: 0.8; + width: 1.8; + opacity: 1; + z-index: 750; } line|z14[highway=unclassified], line|z14[highway=living_street], line|z14[highway=road] + { color: @unclassified; - width: 1.4; + width: 1.8; opacity: 1; + z-index: 700; +} + +line|z14[highway=pedestrian] +{ + color: @pedestrian; + width: 1.6; + dashes: 3.6,1.44;/*dashes: 3.6,1.8;*/ + opacity: 1; + z-index: 660; } line|z14[highway=service] { color: @unclassified; - width: 0.2; - opacity: 0.4; - z-index: 600; + width: 0.7; + opacity: 0; + z-index: 650; } line|z14[highway=track][tracktype=grade1], { color: @track; opacity: 1; - width: 0.8; + width: 1; + z-index: 600; } line|z14[highway=track], line|z14[highway=path], @@ -444,31 +528,26 @@ line|z14[route=hiking] { color: @track; opacity: 1; - dashes: 0.1,0.1; - width: 0.1; + dashes: 2.52,1.35; + width: 0.9; + z-index: 600; } line|z14[highway=bridleway] { color: @bridleway; opacity: 1; - width: 0.1; - dashes: 0.1,0.1; + width: 0.9; + dashes: 2.7,1.26; + z-index: 560; } -line|z14[highway=pedestrian] -{ - color: @pedestrian; - width: 0.9; - dashes: 2,0.5; - opacity: 0.8; -} line|z14[highway=footway] { color: @footway; - width: 0.1; - dashes: 0.1,0.1; + width: 1; + dashes: 2.7,1.26; opacity: 1; z-index: 600; } @@ -476,19 +555,21 @@ line|z14[highway=footway] line|z14[highway=construction] { color: @construction; - opacity: 0.5; + opacity: 1; width: 1.4; - dashes: 5,5; + dashes: 4.5,1.8; + z-index: 450; } line|z14[highway=cycleway] { color: @cycleway; - width: 0.4; - opacity: 0.8; + width: 1.2; + opacity: 1; z-index: 1000; } + /* ZOOM 15 */ line|z15[highway=trunk], @@ -496,24 +577,26 @@ line|z15[highway=motorway] { width: 4.8; opacity: 1; - color: @trunk_yellow; + color: @trunk_orange_light; z-index: 900; } - +/* line|z15[highway=trunk]::case, line|z15[highway=motorway]::case { - color: @trunk_yellow_case; + color: @trunk_orange_case; width: 6; opacity: 1; z-index: 45; } +*/ line|z15[highway=motorway_link], line|z15[highway=trunk_link] { - color: @trunk_link; + color: @trunk_orange_light; width: 2.4; + z-index: 890; } line|z15[highway=motorway][tunnel?], @@ -528,29 +611,31 @@ line|z15[highway=trunk_link][tunnel?] { line|z15[highway=primary] { - color: @primary_yellow; - width: 3.8; + color: @primary_orange_light; + width: 4.2; opacity: 1; z-index: 850; } - +/* line|z15[highway=primary]::case { - color: @primary_yellow_case; + color: @primary_orange_case; width: 5.5; opacity: 1; z-index: 45; } +*/ line|z15[highway=primary_link] { - color: @primary_link; - width: 1.9; - z-index: 500; + color: @primary_orange_light; + width: 2.1; + z-index: 840; } line|z15[highway=primary][tunnel?], -line|z15[highway=primary][tunnel?] { +line|z15[highway=primary_link][tunnel?] { + casing-width: 1; casing-linecap: butt; casing-color: @primary_tunnel_casing; @@ -560,15 +645,16 @@ line|z15[highway=primary][tunnel?] { line|z15[highway=secondary] { color: @secondary; - width: 3.8; + width: 4; opacity: 1; z-index: 800; } line|z15[highway=secondary_link] { - color: @secondary_link; - width: 1.9; + color: @secondary; + width: 2; + z-index: 790; } @@ -576,14 +662,16 @@ line|z15[highway=residential], line|z15[highway=tertiary], { color: @residential; - width: 3; + width: 3.2; opacity: 1; z-index: 750; } +line|z15[highway=residential_link], line|z15[highway=tertiary_link] { - color: @tertiary_link; - width: 1.5; + color: @residential; + width: 1.6; + z-index: 740; } line|z15[highway=unclassified], @@ -595,26 +683,34 @@ line|z15[highway=road] opacity: 1; z-index: 700; } - +line|z15[highway=pedestrian] +{ + color: @pedestrian; + width: 2; + dashes: 5,2;/*dashes: 3.6,1.8;*/ + opacity: 1; + z-index: 660; +} line|z15[highway=service] { color: @unclassified; - width: 0.6; - opacity: 0.9; - z-index: 600; + width: 1.2; + opacity: 1; + z-index: 10; + z-index: 650; } line|z15[highway=service][service=driveway] { - width: 0; + width: 0; } line|z15[highway=track][tracktype=grade1], { color: @track; opacity: 1; - width: 1.6; - z-index: 1000; + width: 1.5; + z-index: 600; } line|z15[highway=track], line|z15[highway=path], @@ -622,33 +718,26 @@ line|z15[route=hiking] { color: @track; opacity: 1; - dashes: 2,0.5; - width: 0.8; - z-index: 1000; + dashes: 2.7,1.26; + width: 1.3; + z-index: 600; } line|z15[highway=bridleway] { color: @bridleway; opacity: 1; - dashes: 2,0.5; - width: 0.8; - z-index: 600; + dashes: 2.7,1.26; + width: 1.4; + z-index: 590; } -line|z15[highway=pedestrian] -{ - color: @pedestrian; - width: 1.6; - dashes: 2,0.5; - opacity: 0.8; -} line|z15[highway=footway] { color: @footway; - width: 0.8; - dashes: 0.5,0.5; + width: 1.7; + dashes: 2.7,1.26; opacity: 1; z-index: 600; } @@ -656,17 +745,18 @@ line|z15[highway=footway] line|z15[highway=cycleway] { color: @cycleway; - width: 0.6; - opacity: 0.9; + width: 1.4; + opacity: 1; z-index: 1000; } line|z15[highway=construction] { color: @construction; - opacity: 0.5; + opacity: 1; width: 2; - dashes: 5,5; + dashes: 7.2,2.7; + z-index: 450; } /* ZOOM 16 */ @@ -674,26 +764,29 @@ line|z15[highway=construction] line|z16[highway=trunk], line|z16[highway=motorway] { - color: @trunk_yellow; - width: 6.8; + color: @trunk_orange_light; + width: 6; opacity: 1; + z-index: 900; } - +/* line|z16[highway=trunk]::case, line|z16[highway=motorway]::case { - color: @trunk_yellow_case; + color: @trunk_orange_case; width: 8.8; opacity: 1; z-index: 45; } +*/ line|z16[highway=motorway_link], line|z16[highway=trunk_link] { - color: @trunk_link; - width: 3.4; + color: @trunk_orange_light; + width: 3; + z-index: 890; } line|z16[highway=motorway][tunnel?], @@ -708,24 +801,28 @@ line|z16[highway=trunk_link][tunnel?] { line|z16[highway=primary] { - color: @primary_yellow; - width: 6; + color: @primary_orange_light; + width: 4.8; opacity: 1; + z-index: 850; } +/* line|z16[highway=primary]::case { - color: @primary_yellow_case; + color: @primary_orange_case; width: 7.2; opacity: 1; z-index: 45; } - +*/ line|z16[highway=primary_link] { - color: @primary_link; - width: 3; + color: @primary_orange_light; + width: 2.4; + z-index: 840; + } line|z16[highway=primary][tunnel?], @@ -739,13 +836,15 @@ line|z16[highway=primary_link][tunnel?] { line|z16[highway=secondary] { color: @secondary; - width: 5.4; + width: 4.8; + z-index: 800; } line|z16[highway=secondary_link] { - color: @secondary_link; - width: 2.7; + color: @secondary; + width: 2.4; + z-index: 790; } line|z16[highway=secondary][tunnel?], @@ -760,20 +859,22 @@ line|z16[highway=residential], line|z16[highway=tertiary], { color: @residential; - width: 4.5; + width: 4.4; + z-index: 750; } - +line|z16[highway=residential_link], line|z16[highway=tertiary_link] { - color: @tertiary_link; + color: @residential; width: 2.2; + z-index: 740; } line|z16[highway=tertiary_link][tunnel?], line|z16[highway=residential_link][tunnel?], line|z16[highway=tertiary][tunnel?], line|z16[highway=residential][tunnel?] { - color: @unclassified_tunnel; + color: @unclassified_tunnel; casing-width: 1; casing-linecap: butt; casing-color: @unclassified_tunnel_casing; @@ -785,50 +886,25 @@ line|z16[highway=living_street], line|z16[highway=road] { color: @unclassified; - width: 4.5; + width: 4; + z-index: 700; } line|z16[highway=service] { color: @unclassified; - width: 1.4; - opacity: 0.8; -} - -line|z16[highway=service][service=driveway] -{ - width: 0; -} - -line|z16[highway=track][tracktype=grade1], -{ - color: @track; + width: 1.6; opacity: 1; - width: 3.5; -} -line|z16[highway=track], -line|z16[highway=path], -line|z16[route=hiking] -{ - color: @track; - opacity: 1; - dashes: 3,1.5; - width: 1.2; -} - -line|z16[highway=bridleway] -{ - color: @bridleway; - opacity: 1; - dashes: 3,1.5; - width: 1.2; + z-index: 650; } line|z16[highway=pedestrian] { color: @pedestrian; - width: 2.2; - dashes: 3,1.5; + width: 2.4; + dashes: 5.4,2.7;/*dashes: 3.6,1.8;*/ + opacity: 1; + z-index: 660; } @@ -845,59 +921,99 @@ line|z16[highway=pedestrian][tunnel?] { line|z16[highway=footway] { color: @footway; - width: 1; - dashes: 1,1; + width: 2; + dashes: 3.6,1.8; opacity: 1; + z-index: 600; } +line|z16[highway=service][service=driveway] +{ + width: 0; +} + +line|z16[highway=track][tracktype=grade1], +{ + color: @track; + opacity: 1; + width: 1.8; + z-index: 600; +} +line|z16[highway=track], +line|z16[highway=path], +line|z16[route=hiking] +{ + color: @track; + opacity: 1; + dashes: 3.6,1.8; + width: 1.8; + z-index: 600; +} + +line|z16[highway=bridleway] +{ + color: @bridleway; + opacity: 1; + dashes: 3.6,1.8; + width: 1.8; + z-index: 590; +} + + line|z16[highway=steps] { color: @steps; - width: 4; - dashes: 0.5,0.5; + width: 5; + dashes: 1.5,1.5; + z-index: 1000; } line|z16[highway=construction] { color: @construction; - opacity: 0.7; - width: 2; - dashes: 5,5; + opacity: 1; + width: 2.6; + dashes: 9,3.6; + z-index: 450; } line|z16[highway=cycleway] { color: @cycleway; - width: 1; + width: 1.6; opacity: 1; z-index: 1000; } + /* ZOOM 17 */ line|z17[highway=trunk], line|z17[highway=motorway] { - color: @trunk_yellow; + color: @trunk_orange_light; width: 9; opacity: 1; + z-index: 900; } - +/* line|z17[highway=trunk]::case, line|z17[highway=motorway]::case { - color: @trunk_yellow_case; + color: @trunk_orange_case; width: 10.5; opacity: 1; z-index: 45; } +*/ line|z17[highway=trunk_link], line|z17[highway=motorway_link] { - color: @trunk_link; + color: @trunk_orange_light; width: 4.5; + z-index: 890; } line|z17[highway=trunk][tunnel?], @@ -912,24 +1028,27 @@ line|z17[highway=motorway_link][tunnel?] { line|z17[highway=primary] { - color: @primary_light; - width: 9; + color: @primary_orange_light; + width: 7; opacity: 1; + z-index: 850; } - +/* line|z17[highway=primary]::case { - color: @primary_yellow_case; + color: @primary_orange_case; width: 10.5; opacity: 1; z-index: 45; } +*/ line|z17[highway=primary_link] { - color: @primary_link; - width: 4.5; + color: @primary_orange_light; + width: 3.5; opacity: 1; + z-index: 840; } line|z17[highway=primary][tunnel?], @@ -943,18 +1062,21 @@ line|z17[highway=primary_link][tunnel?] { line|z17[highway=secondary] { color: @secondary; - width: 9; + width: 7; opacity: 1; + z-index: 10; + z-index: 800; } line|z17[highway=secondary_link] { - color: @secondary_link; - width: 4.5; + color: @secondary; + width: 3.5; + z-index: 790; } -line|z17[highway=secondary_link][tunnel?], -line|z17[highway=secondary][tunnel?] { +line|z17[highway=secondary][tunnel?], +line|z17[highway=secondary_link][tunnel?] { casing-width: 1; casing-linecap: butt; casing-color: @secondary_tunnel_casing; @@ -965,20 +1087,23 @@ line|z17[highway=residential], line|z17[highway=tertiary], { color: @residential; - width: 7.2; + width: 6; opacity: 1; + z-index: 750; } - +line|z17[highway=residential_link], line|z17[highway=tertiary_link], { - color: @tertiary_link; - width: 3.6; + color: @residential; + width: 3; + z-index: 740; } line|z17[highway=tertiary_link][tunnel?], line|z17[highway=residential_link][tunnel?], line|z17[highway=tertiary][tunnel?], line|z17[highway=residential][tunnel?] { + color: @tertiary_tunnel; casing-width: 1; casing-linecap: butt; casing-color: @tertiary_tunnel_casing; @@ -990,14 +1115,16 @@ line|z17[highway=living_street], line|z17[highway=road] { color: @unclassified; - width: 7.2; + width: 6; + z-index: 700; } line|z17[highway=pedestrian] { color: @pedestrian; - width: 3.2; - dashes: 6,3; + width: 3; + dashes: 5,2;/*dashes: 7.2,3.6;*/ + z-index: 660; } line|z17[highway=unclassified][tunnel?], @@ -1010,13 +1137,13 @@ line|z17[highway=pedestrian][tunnel?] { casing-dashes: 5,5; } -line|z17[highway=footway] +line|z17[highway=footway], { color: @footway; - width: 1.2; - dashes: 2,2; + width: 2.4; + dashes: 4.5,1.8; opacity: 1; - z-index: 750; + z-index: 600; } line|z17[highway=footway][tunnel?]::tunnelBackground, @@ -1039,13 +1166,16 @@ line|z17[highway=path][tunnel?]::tunnelCasing { line|z17[highway=service] { color: @unclassified; - width: 2.4; + width: 2; + z-index: 650; } + line|z17[highway=track][tracktype=grade1], { color: @track; opacity: 1; - width: 6; + width: 3; + z-index: 600; } line|z17[highway=track], line|z17[highway=path], @@ -1053,23 +1183,26 @@ line|z17[route=hiking] { color: @track; opacity: 1; - dashes: 3.5,2; + dashes: 4.5,1.8; width: 2; + z-index: 600; } line|z17[highway=bridleway] { color: @bridleway; opacity: 1; - dashes: 3.5,2; + dashes: 4.5,1.8; width: 2; + z-index: 590; } line|z17[highway=steps] { color: @steps; - width: 6; - dashes: 1,1; + width: 7; + dashes: 2.3,2.3; + z-index: 1000; } line|z17[highway=construction] @@ -1077,42 +1210,46 @@ line|z17[highway=construction] color: @construction; opacity: 1; width: 3; - dashes: 6,6; + dashes: 10.8,4.5; + z-index: 450; } line|z17[highway=cycleway] { color: @cycleway; - width: 1.2; + width: 1.8; opacity: 1; - z-index: 700; + z-index: 1000; } + /* ZOOM 18+ */ line|z18[highway=trunk], line|z18[highway=motorway] { - color: @trunk_yellow; - width: 14; + color: @trunk_orange_light; + width: 12; opacity: 1; + z-index: 900; } - +/* line|z18[highway=trunk]::case, line|z18[highway=motorway]::case { - color: @trunk_yellow_case; + color: @trunk_orange_case; width: 16; opacity: 1; z-index: 45; } - +*/ line|z18[highway=trunk_link], line|z18[highway=motorway_link] { - color: @trunk_link; - width: 7; + color: @trunk_orange_light; + width: 6; + z-index: 890; } line|z18[highway=trunk][tunnel?], @@ -1127,25 +1264,27 @@ line|z18[highway=motorway_link][tunnel?] { line|z18[highway=primary] { - color: @primary_yellow; - width: 14; + color: @primary_orange_light; + width: 10; opacity: 1; + z-index: 850; } - +/* line|z18[highway=primary]::case { - color: @primary_yellow_case; + color: @primary_orange_case; width: 16; opacity: 1; z-index: 45; } - +*/ line|z18[highway=primary_link] { - color: @primary_link; - width: 7; + color: @primary_orange_light; + width: 5; opacity: 1; + z-index: 840; } line|z18[highway=primary][tunnel?], @@ -1159,14 +1298,16 @@ line|z18[highway=primary_link][tunnel?] { line|z18[highway=secondary] { color: @secondary; - width: 12; + width: 10; opacity: 1; + z-index: 800; } line|z18[highway=secondary_link] { - color: @secondary_link; - width: 6; + color: @secondary; + width: 5; + z-index: 790; } line|z18[highway=secondary][tunnel?], @@ -1184,12 +1325,14 @@ line|z18[highway=tertiary], color: @residential; width: 9; opacity: 1; + z-index: 750; } - +line|z18[highway=residential_link], line|z18[highway=tertiary_link], { - color: @tertiary_link; + color: @residential; width: 4.5; + z-index: 740; } line|z18[highway=tertiary][tunnel?], @@ -1208,13 +1351,15 @@ line|z18[highway=road] { color: @unclassified; width: 9; + z-index: 700; } line|z18[highway=pedestrian] { color: @pedestrian; - width: 4.6; - dashes: 5,2; + width: 4; + dashes: 7,3; + z-index: 660; } line|z18[highway=unclassified][tunnel?], @@ -1227,13 +1372,13 @@ line|z18[highway=pedestrian][tunnel?] { casing-dashes: 5,5; } -line|z18[highway=footway] +line|z18[highway=footway], { color: @footway; - width: 1.8; - dashes: 3,1.5; + width: 3.4; + dashes: 7.2,2.7; opacity: 1; - z-index: 1050; + z-index: 600; } line|z18[highway=footway][tunnel?]::tunnelBackground, @@ -1257,13 +1402,14 @@ line|z18[highway=service] { color: @unclassified; width: 3; + z-index: 650; } line|z18[highway=track][tracktype=grade1], { color: @track; opacity: 1; - width: 7.4; + width: 3; z-index: 600; } line|z18[highway=track], @@ -1272,7 +1418,7 @@ line|z18[route=hiking] { color: @track; opacity: 1; - dashes: 5,3; + dashes: 7.2,2.7; width: 3; z-index: 600; @@ -1282,16 +1428,17 @@ line|z18[highway=bridleway] { color: @bridleway; opacity: 1; - dashes: 5,3; + dashes: 7.2,2.7; width: 3; - z-index: 600; + z-index: 590; } line|z18[highway=steps] { color: @steps; - width: 8; - dashes: 1,1; + width: 9; + dashes: 3.2,3.2; + z-index: 1000; } line|z18[highway=construction] @@ -1299,7 +1446,8 @@ line|z18[highway=construction] color: @construction; opacity: 1; width: 4; - dashes: 6,6; + dashes: 13.5,5.4; + z-index: 450; } line|z18[highway=cycleway] @@ -1307,7 +1455,7 @@ line|z18[highway=cycleway] color: @cycleway; width: 2; opacity: 1; - z-index: 700; + z-index: 1000; } /* ZOOM 19+ */ @@ -1315,25 +1463,28 @@ line|z18[highway=cycleway] line|z19-[highway=trunk], line|z19-[highway=motorway] { - color: @trunk_yellow; - width: 14; + color: @trunk_orange_light; + width: 15; opacity: 1; + z-index: 900; } - +/* line|z19-[highway=trunk]::case, line|z19-[highway=motorway]::case { - color: @trunk_yellow_case; + color: @trunk_orange_case; width: 16; opacity: 1; z-index: 45; } +*/ line|z19-[highway=trunk_link], line|z19-[highway=motorway_link] { - color: @trunk_link; - width: 7; + color: @trunk_orange_light; + width: 7.5; + z-index: 890; } @@ -1341,33 +1492,35 @@ line|z19-[highway=trunk][tunnel?], line|z19-[highway=motorway][tunnel?], line|z19-[highway=trunk_link][tunnel?], line|z19-[highway=motorway_link][tunnel?] { - casing-width: 1; - casing-linecap: butt; - casing-color: @trunk_tunnel_casing; - casing-dashes: 5,5; + casing-width: 1; + casing-linecap: butt; + casing-color: @trunk_tunnel_casing; + casing-dashes: 5,5; } line|z19-[highway=primary] { - color: @primary_yellow; - width: 14; + color: @primary_orange_light; + width: 13; opacity: 1; + z-index: 850; } - +/* line|z19-[highway=primary]::case { - color: @primary_yellow_case; + color: @primary_orange_case; width: 16; opacity: 1; z-index: 45; } - +*/ line|z19-[highway=primary_link] { - color: @primary_link; + color: @primary_orange_light; width: 7; opacity: 1; + z-index: 840; } line|z19-[highway=primary][tunnel?], @@ -1381,14 +1534,16 @@ line|z19-[highway=primary_link][tunnel?] { line|z19-[highway=secondary] { color: @secondary; - width: 12; + width: 13; opacity: 1; + z-index: 800; } line|z19-[highway=secondary_link] { - color: @secondary_link; - width: 6; + color: @secondary; + width: 7; + z-index: 790; } line|z19-[highway=secondary][tunnel?], @@ -1404,14 +1559,16 @@ line|z19-[highway=residential], line|z19-[highway=tertiary], { color: @residential; - width: 9; + width: 12; opacity: 1; + z-index: 750; } - +line|z19-[highway=residential_link], line|z19-[highway=tertiary_link], { - color: @tertiary_link; - width: 4.5; + color: @residential; + width: 6; + z-index: 740; } line|z19-[highway=tertiary][tunnel?], @@ -1429,14 +1586,16 @@ line|z19-[highway=living_street], line|z19-[highway=road] { color: @unclassified; - width: 9; + width: 12; + z-index: 700; } line|z19-[highway=pedestrian] { color: @pedestrian; width: 5; - dashes: 5,2; + dashes: 16.2,8.1; + z-index: 660; } line|z19-[highway=unclassified][tunnel?], @@ -1449,13 +1608,14 @@ line|z19-[highway=pedestrian][tunnel?] { casing-dashes: 5,5; } -line|z19-[highway=footway] +line|z19-[highway=footway], +line|z19-[highway=path] { color: @footway; - width: 2; - dashes: 3,1.5; + width: 4; + dashes: 9,3.6; opacity: 1; - z-index: 1050; + z-index: 600; } line|z19-[highway=footway][tunnel?]::tunnelBackground, @@ -1478,14 +1638,16 @@ line|z19-[highway=path][tunnel?]::tunnelCasing { line|z19-[highway=service] { color: @unclassified; - width: 3; + width: 4; + z-index: 650; } line|z19-[highway=track][tracktype=grade1], { color: @track; opacity: 1; - width: 8.2; + width: 4; + z-index: 600; } line|z19-[highway=track], line|z19-[highway=path], @@ -1493,23 +1655,26 @@ line|z19-[route=hiking] { color: @track; opacity: 1; - dashes: 5,3; - width: 3.8; + dashes: 9,3.6; + width: 4; + z-index: 600; } line|z19-[highway=bridleway] { color: @bridleway; opacity: 1; - dashes: 5,3; - width: 3.8; + dashes: 9,3.6; + width: 4; + z-index: 590; } line|z19-[highway=steps] { color: @steps; - width: 10; - dashes: 0.5,0.5; + width: 11; + dashes: 4,4; + z-index: 1000; } line|z19-[highway=construction] @@ -1517,18 +1682,110 @@ line|z19-[highway=construction] color: @construction; opacity: 1; width: 6; - dashes: 6,6; + dashes: 18,6.3; + z-index: 450; } line|z19-[highway=cycleway] { color: @cycleway; - width: 2; + width: 2.2; opacity: 1; - z-index: 700; + z-index: 1000; } + +/* BRIDGES */ + +/* CASING FOR PRIMARY ROADS */ +/* LAST VERSION +line|z15-[highway=primary]::casingBackground { + z-index: 30; + casing-width: eval(prop("width")+0.2); + casing-linecap: butt; + casing-color: @background; +} + + + +line|z13[highway=motorway][bridge?]::bridgewhite, +line|z13[highway=trunk][bridge?]::bridgewhite { + z-index: 30; + casing-width: eval(prop("width")+0.2); + casing-linecap: butt; + casing-color: @bridge_background; +} + +line|z13[highway=motorway][bridge?]::bridgeblack, +line|z13[highway=trunk][bridge?]::bridgeblack { + z-index: 25; + casing-width: eval(prop("width")+0.5); + casing-linecap: butt; + casing-color: @bridge_casing; +} + +line|z14-[highway=motorway][bridge?]::bridgewhite, +line|z14-[highway=trunk][bridge?]::bridgewhite, +line|z14-[highway=primary][bridge?]::bridgewhite, +line|z15-[highway=secondary][bridge?]::bridgewhite, +line|z16-[highway=tertiary][bridge?]::bridgewhite, +line|z16-[highway=residential][bridge?]::bridgewhite, +line|z16-[highway=unclassified][bridge?]::bridgewhite, +line|z16-[highway=pedestrian][bridge?]::bridgewhite, +line|z16-[highway=footway][bridge?]::bridgewhite, +line|z17-[highway=steps][bridge?]::bridgewhite, +line|z17-[highway=road][bridge?]::bridgewhite, +line|z17-[highway=service][bridge?]::bridgewhite { + z-index: 510; + casing-width: eval(prop("width")); + casing-linecap: butt; + casing-color: @bridge_background; +} + +line|z14-[highway=motorway][bridge?]::bridgeblack, +line|z14-[highway=trunk][bridge?]::bridgeblack, +line|z14-[highway=primary][bridge?]::bridgeblack, +line|z15-[highway=secondary][bridge?]::bridgeblack, +line|z16-[highway=tertiary][bridge?]::bridgeblack, +line|z16-[highway=residential][bridge?]::bridgeblack, +line|z16-[highway=unclassified][bridge?]::bridgeblack, +line|z16-[highway=pedestrian][bridge?]::bridgeblack, +line|z16-[highway=footway][bridge?]::bridgeblack, +line|z17-[highway=steps][bridge?]::bridgeblack, +line|z17-[highway=road][bridge?]::bridgeblack, +line|z17-[highway=service][bridge?]::bridgeblack +{ + z-index: 500; + casing-width: eval(prop("width")+0.4); + casing-linecap: butt; + casing-color: @bridge_casing; +} + +line|z15-[highway=motorway_link][bridge?]::bridgewhite, +line|z15-[highway=trunk_link][bridge?]::bridgewhite, +line|z15-[highway=primary_link][bridge?]::bridgewhite, +line|z16-[highway=secondary_link][bridge?]::bridgewhite, +line|z16-[highway=tertiary_link][bridge?]::bridgewhite +{ + z-index: 30; + casing-width: eval(prop("width")+0.5); + casing-linecap: butt; + casing-color: @bridge_background; +} + +line|z15-[highway=motorway_link][bridge?]::bridgeblack, +line|z15-[highway=trunk_link][bridge?]::bridgeblack, +line|z15-[highway=primary_link][bridge?]::bridgeblack, +line|z16-[highway=secondary_link][bridge?]::bridgeblack, +line|z16-[highway=tertiary_link][bridge?]::bridgeblack +{ + z-index: 25; + casing-width: eval(prop("width")+1); + casing-linecap: butt; + casing-color: @bridge_casing; +} +*/ /* BRIDGES */ /* CASING FOR PRIMARY ROADS */ @@ -1544,15 +1801,16 @@ line|z15-[highway=primary]::casingBackground { line|z13[highway=motorway][bridge?]::bridgewhite, line|z13[highway=trunk][bridge?]::bridgewhite { - z-index: 30; + z-index: 400; casing-width: eval(prop("width")+0.2); casing-linecap: butt; casing-color: @bridge_background; + } line|z13[highway=motorway][bridge?]::bridgeblack, line|z13[highway=trunk][bridge?]::bridgeblack { - z-index: 25; + z-index: 390; casing-width: eval(prop("width")+0.4); casing-linecap: butt; casing-color: @bridge_casing; @@ -1567,7 +1825,7 @@ line|z14-[highway=residential][bridge?]::bridgewhite, line|z14-[highway=unclassified][bridge?]::bridgewhite, line|z14-[railway=rail][bridge?]::bridgewhite { - z-index: 510; + z-index: 400; casing-width: eval(prop("width")); casing-linecap: butt; casing-color: @bridge_background; @@ -1581,7 +1839,7 @@ line|z14-[highway=residential][bridge?]::bridgeblack, line|z14-[highway=unclassified][bridge?]::bridgeblack, line|z14-[railway=rail][bridge?]::bridgeblack { - z-index: 500; + z-index: 390; casing-width: eval(prop("width")+0.4); casing-linecap: butt; casing-color: @bridge_casing; @@ -1596,7 +1854,7 @@ line|z17-[highway=residential][bridge?]::bridgewhite, line|z17-[highway=unclassified][bridge?]::bridgewhite, line|z17-[railway=rail][bridge?]::bridgewhite { - z-index: 510; + z-index: 400; casing-width: eval(prop("width")+0.8); casing-linecap: butt; casing-color: @bridge_background; @@ -1610,7 +1868,7 @@ line|z17-[highway=residential][bridge?]::bridgeblack, line|z17-[highway=unclassified][bridge?]::bridgeblack, line|z17-[railway=rail][bridge?]::bridgeblack { - z-index: 500; + z-index: 390; casing-width: eval(prop("width")+1.6); casing-linecap: butt; casing-color: @bridge_casing; @@ -1624,7 +1882,7 @@ line|z18-[highway=residential][bridge?]::bridgewhite, line|z18-[highway=unclassified][bridge?]::bridgewhite, line|z18-[railway=rail][bridge?]::bridgewhite { - z-index: 510; + z-index: 400; casing-width: eval(prop("width")+1); casing-linecap: butt; casing-color: @bridge_background; @@ -1638,7 +1896,7 @@ line|z18-[highway=residential][bridge?]::bridgeblack, line|z18-[highway=unclassified][bridge?]::bridgeblack, line|z18-[railway=rail][bridge?]::bridgeblack { - z-index: 500; + z-index: 390; casing-width: eval(prop("width")+2); casing-linecap: butt; casing-color: @bridge_casing; @@ -1649,7 +1907,7 @@ line|z14-[highway=primary_link][bridge?]::bridgewhite, line|z14-[highway=secondary_link][bridge?]::bridgewhite, line|z14-[highway=tertiary_link][bridge?]::bridgewhite { - z-index: 510; + z-index: 400; casing-width: eval(prop("width")); casing-linecap: butt; casing-color: @bridge_background; @@ -1661,7 +1919,7 @@ line|z14-[highway=primary_link][bridge?]::bridgeblack, line|z14-[highway=secondary_link][bridge?]::bridgeblack, line|z14-[highway=tertiary_link][bridge?]::bridgeblack { - z-index: 500; + z-index: 390; casing-width: eval(prop("width")+0.4); casing-linecap: butt; casing-color: @bridge_casing; @@ -1672,7 +1930,7 @@ line|z17-[highway=primary_link][bridge?]::bridgewhite, line|z17-[highway=secondary_link][bridge?]::bridgewhite, line|z17-[highway=tertiary_link][bridge?]::bridgewhite { - z-index: 510; + z-index: 400; casing-width: eval(prop("width")+0.8); casing-linecap: butt; casing-color: @bridge_background; @@ -1684,7 +1942,7 @@ line|z17-[highway=primary_link][bridge?]::bridgeblack, line|z17-[highway=secondary_link][bridge?]::bridgeblack, line|z17-[highway=tertiary_link][bridge?]::bridgeblack { - z-index: 500; + z-index: 390; casing-width: eval(prop("width")+1.6); casing-linecap: butt; casing-color: @bridge_casing; @@ -1695,7 +1953,7 @@ line|z18-[highway=primary_link][bridge?]::bridgewhite, line|z18-[highway=secondary_link][bridge?]::bridgewhite, line|z18-[highway=tertiary_link][bridge?]::bridgewhite { - z-index: 510; + z-index: 400; casing-width: eval(prop("width")+1); casing-linecap: butt; casing-color: @bridge_background; @@ -1707,7 +1965,7 @@ line|z18-[highway=primary_link][bridge?]::bridgeblack, line|z18-[highway=secondary_link][bridge?]::bridgeblack, line|z18-[highway=tertiary_link][bridge?]::bridgeblack { - z-index: 500; + z-index: 390; casing-width: eval(prop("width")+2); casing-linecap: butt; casing-color: @bridge_casing; @@ -1715,7 +1973,7 @@ line|z18-[highway=tertiary_link][bridge?]::bridgeblack line|z13[highway=pedestrian][bridge?]::bridgewhite, line|z13[highway=footway][bridge?]::bridgewhite { - z-index: 610; + z-index: 400; casing-width: eval(prop("width")-0.2); casing-linecap: butt; casing-color: @bridge_background; @@ -1725,7 +1983,7 @@ line|z14-[highway=footway][bridge?]::bridgewhite, line|z16-[highway=steps][bridge?]::bridgewhite, line|z16-[highway=road][bridge?]::bridgewhite, line|z16-[highway=service][bridge?]::bridgewhite { - z-index: 510; + z-index: 400; casing-width: eval(prop("width")); casing-linecap: butt; casing-color: @bridge_background; @@ -1736,7 +1994,7 @@ line|z16-[highway=steps][bridge?]::bridgeblack, line|z16-[highway=road][bridge?]::bridgeblack, line|z16-[highway=service][bridge?]::bridgeblack { - z-index: 500; + z-index: 390; casing-width: eval(prop("width")+0.2); casing-linecap: butt; casing-color: @bridge_casing; @@ -1744,7 +2002,7 @@ line|z16-[highway=service][bridge?]::bridgeblack line|z16-[highway=pedestrian][bridge?]::bridgewhite, line|z16-[highway=footway][bridge?]::bridgewhite { - z-index: 710; + z-index: 400; casing-width: eval(prop("width")+0.2); casing-linecap: butt; casing-color: @bridge_background; @@ -1752,7 +2010,7 @@ line|z16-[highway=footway][bridge?]::bridgewhite line|z16-[highway=pedestrian][bridge?]::bridgeblack, line|z16-[highway=footway][bridge?]::bridgeblack, { - z-index:700; + z-index:390; casing-width: eval(prop("width")+0.6); casing-linecap: butt; casing-color: @bridge_casing; @@ -1760,7 +2018,7 @@ line|z16-[highway=footway][bridge?]::bridgeblack, line|z18-[highway=pedestrian][bridge?]::bridgewhite, line|z18-[highway=footway][bridge?]::bridgewhite { - z-index:1010; + z-index:400; casing-width: eval(prop("width")+0.2); casing-linecap: butt; casing-color: @bridge_background; @@ -1768,45 +2026,13 @@ line|z18-[highway=footway][bridge?]::bridgewhite line|z18-[highway=pedestrian][bridge?]::bridgeblack, line|z18-[highway=footway][bridge?]::bridgeblack, { - z-index:1000; + z-index:390; casing-width: eval(prop("width")+0.6); casing-linecap: butt; casing-color: @bridge_casing; } -/* ONEWAY ARROWS */ - -/* line|z15-[highway=primary][hwtag=oneway]::arrows <-- не работает по типам магиÑтралей */ - -line|z16[hwtag=oneway]::arrows -{ - pattern-offset: 160; - z-index: 1000; - pattern-image: arrow-s.svg; - pattern-spacing: 160; - z-index: 500; -} - -line|z17[hwtag=oneway]::arrows -{ - pattern-offset: 200; - z-index: 1000; - pattern-image: arrow-s.svg; - pattern-spacing: 200; -} - - -line|z18-[hwtag=oneway]::arrows -{ - pattern-offset: 200; - z-index: 1000; - pattern-image: arrow-m.svg; - pattern-spacing: 200; -} - - - /* Process bridge and tunnel */ /* @@ -1835,3 +2061,33 @@ line|z15-[tunnel?]::tunnelblack casing-dashes: 5,5; } */ + +/* ONEWAY ARROWS */ + +/* line|z15-[highway=primary][hwtag=oneway]::arrows <-- не работает по типам магиÑтралей */ + +line|z16[hwtag=oneway]::arrows +{ + pattern-offset: 160; + z-index: 1000; + pattern-image: arrow-s.svg; + pattern-spacing: 160; + z-index: 500; +} + +line|z17[hwtag=oneway]::arrows +{ + pattern-offset: 200; + z-index: 1000; + pattern-image: arrow-s.svg; + pattern-spacing: 200; +} + + +line|z18-[hwtag=oneway]::arrows +{ + pattern-offset: 200; + z-index: 1000; + pattern-image: arrow-m.svg; + pattern-spacing: 200; +} diff --git a/data/styles/clear/include/roads_orange.mapcss b/data/styles/clear/include/roads_yellow.mapcss similarity index 65% rename from data/styles/clear/include/roads_orange.mapcss rename to data/styles/clear/include/roads_yellow.mapcss index bbe1c3e00c..2ef6b06989 100644 --- a/data/styles/clear/include/roads_orange.mapcss +++ b/data/styles/clear/include/roads_yellow.mapcss @@ -23,32 +23,33 @@ line|z11-[highway=tertiary] { z-index: 750; } -line|z7-[highway=unclassified], -line|z7-[highway=living_street] { +line|z10-[highway=unclassified], +line|z10-[highway=road], +line|z10-[highway=living_street] { z-index: 700; } -line|z7-[highway=service] { +line|z10-[highway=service] { z-index: 650; } -line|z7-[highway=pedestrian] { +line|z10-[highway=pedestrian] { z-index: 650; } -line|z7-[highway=footway], -line|z7-[highway=path] { +line|z10-[highway=footway], +line|z10-[highway=path] { z-index: 600; } -line|z7-[highway=trunk_link], -line|z7-[highway=motorway_link], -line|z7-[highway=primary_link], -line|z7-[highway=secondary_link], -line|z7-[highway=tertiary_link], -line|z7-[highway=residential_link], -line|z7-[highway=track], -line|z7-[highway=bridleway] { +line|z10-[highway=trunk_link], +line|z10-[highway=motorway_link], +line|z10-[highway=primary_link], +line|z10-[highway=secondary_link], +line|z10-[highway=tertiary_link], +line|z10-[highway=residential_link], +line|z10-[highway=track], +line|z10-[highway=bridleway] { z-index: 500; } @@ -57,7 +58,7 @@ line|z7-[highway=bridleway] { line|z7[highway=trunk], line|z7[highway=motorway] { - color: @trunk_orange_light; + color: @trunk; width: 0.3; opacity: 0.4; @@ -69,7 +70,7 @@ line|z8[highway=trunk], line|z8[highway=motorway] { width: 0.6; - color: @trunk_orange_light; + color: @trunk; opacity: 0.5; } @@ -78,16 +79,16 @@ line|z8[highway=motorway] line|z9[highway=trunk], line|z9[highway=motorway] { - color: @trunk_orange; + color: @trunk; width: 0.8; opacity: 0.7; } line|z9[highway=primary] { - color: @primary_orange; - width: 0.2; - opacity: 0.5; + color: @primary; + width: 0.1; + opacity: 0.4; } @@ -101,14 +102,14 @@ line|z7-[highway=cycleway] { line|z10[highway=trunk], line|z10[highway=motorway] { - color: @trunk_orange_medium; + color: @trunk_yellow; width: 1.2; opacity: 0.8; } line|z10[highway=primary] { - color: @primary_orange; + color: @primary; width: 0.9; opacity: 0.8; } @@ -126,15 +127,15 @@ line|z10[highway=secondary] line|z11[highway=trunk], line|z11[highway=motorway] { - color: @trunk_orange; - width: 1.5; - opacity: 0.8; + color: @trunk_yellow; + width: 1.8; + opacity: 0.7; } line|z11[highway=trunk]::case, line|z11[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 2.8; opacity: 1; z-index: 45; @@ -142,14 +143,14 @@ line|z11[highway=motorway]::case line|z11[highway=primary] { - color: @primary_orange; - width: 0.9; + color: @primary_yellow; + width: 1; opacity: 1; } line|z11[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 2; opacity: 1; z-index: 45; @@ -177,7 +178,7 @@ line|z11[highway=tertiary] line|z12[highway=trunk], line|z12[highway=motorway] { - color: @trunk_orange_medium; + color: @trunk_yellow; width: 2; opacity: 0.9; } @@ -185,7 +186,7 @@ line|z12[highway=motorway] line|z12[highway=trunk]::case, line|z12[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 3.2; opacity: 1; z-index: 45; @@ -194,7 +195,6 @@ line|z12[highway=motorway]::case line|z12[highway=motorway][tunnel?], line|z12[highway=trunk][tunnel?] { - color: @trunk_tunnel_orange; casing-width: 0.5; casing-linecap: butt; casing-color: @trunk_tunnel_casing; @@ -204,14 +204,14 @@ line|z12[highway=trunk][tunnel?] { line|z12[highway=primary] { - color: @primary_orange; - width: 1.2; - opacity: 1; + color: @primary_yellow; + width: 1.5; + opacity: 0.9; } line|z12[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 2.5; opacity: 1; z-index: 45; @@ -227,6 +227,7 @@ line|z12[highway=secondary] line|z12[highway=residential], line|z12[highway=tertiary], line|z12[highway=unclassified], +line|z12[highway=road], line|z12[highway=living_street] { color: @residential; @@ -241,13 +242,13 @@ line|z13[highway=motorway] { width: 2.8; opacity: 0.9; - color: @trunk_orange_medium; + color: @trunk_yellow; } line|z13[highway=trunk]::case, line|z13[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 4; opacity: 1; z-index: 45; @@ -255,8 +256,9 @@ line|z13[highway=motorway]::case line|z13[highway=motorway][tunnel?], -line|z13[highway=trunk][tunnel?] { - color: @trunk_tunnel_orange; +line|z13[highway=trunk][tunnel?], +line|z13[highway=motorway_link][tunnel?], +line|z13[highway=trunk_link][tunnel?] { casing-width: 1; casing-linecap: butt; casing-color: @trunk_tunnel_casing; @@ -272,14 +274,14 @@ line|z13[highway=trunk_link] line|z13[highway=primary] { - color: @primary_orange_medium; - width: 2; + color: @primary_yellow; + width: 2.5; opacity: 1; } line|z13[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 3.5; opacity: 1; z-index: 45; @@ -302,6 +304,7 @@ line|z13[highway=tertiary], } line|z13[highway=unclassified], +line|z13[highway=road], line|z13[highway=living_street] { color: @unclassified; @@ -317,15 +320,6 @@ line|z13[highway=pedestrian] opacity: 0.7; } -line|z13[highway=cycleway] -{ - color: @cycleway; - width: 0.1; - opacity: 0.6; - z-index: 1000; -/* dashes: 1,1; - opacity: 0.8;*/ -} line|z13[highway=construction] { @@ -340,15 +334,15 @@ line|z13[highway=construction] line|z14[highway=trunk], line|z14[highway=motorway] { - width: 3.2; + width: 3.8; opacity: 1; - color: @trunk_orange_medium; + color: @trunk_yellow; } line|z14[highway=trunk]::case, line|z14[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 5; opacity: 1; z-index: 45; @@ -362,8 +356,9 @@ line|z14[highway=trunk_link] } line|z14[highway=motorway][tunnel?], -line|z14[highway=trunk][tunnel?] { - color: @trunk_tunnel_orange; +line|z14[highway=trunk][tunnel?], +line|z14[highway=motorway_link][tunnel?], +line|z14[highway=trunk_link][tunnel?] { casing-width: 1; casing-linecap: butt; casing-color: @trunk_tunnel_casing; @@ -372,14 +367,14 @@ line|z14[highway=trunk][tunnel?] { line|z14[highway=primary] { - color: @primary_orange_medium; + color: @primary_yellow; width: 2.8; opacity: 1; } line|z14[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 4; opacity: 1; z-index: 45; @@ -391,8 +386,8 @@ line|z14[highway=primary_link] width: 1.4; } -line|z14[highway=primary][tunnel?] { - color: @primary_tunnel_orange; +line|z14[highway=primary][tunnel?], +line|z14[highway=primary_link][tunnel?] { casing-width: 1; casing-linecap: butt; casing-color: @primary_tunnel_casing; @@ -421,7 +416,8 @@ line|z14[highway=tertiary], } line|z14[highway=unclassified], -line|z14[highway=living_street] +line|z14[highway=living_street], +line|z14[highway=road] { color: @unclassified; width: 1.4; @@ -436,19 +432,28 @@ line|z14[highway=service] z-index: 600; } -line|z14[highway=track] +line|z14[highway=track][tracktype=grade1], { color: @track; - opacity: 0.5; - width: 1; + opacity: 1; + width: 0.8; +} +line|z14[highway=track], +line|z14[highway=path], +line|z14[route=hiking] +{ + color: @track; + opacity: 1; + dashes: 0.1,0.1; + width: 0.1; } line|z14[highway=bridleway] { color: @bridleway; - opacity: 0.5; - width: 1; - dashes: 0.5,0.5; + opacity: 1; + width: 0.1; + dashes: 0.1,2; } line|z14[highway=pedestrian] @@ -459,8 +464,7 @@ line|z14[highway=pedestrian] opacity: 0.8; } -line|z14[highway=footway], -line|z14[highway=path] +line|z14[highway=footway] { color: @footway; width: 0.1; @@ -477,6 +481,14 @@ line|z14[highway=construction] dashes: 5,5; } +line|z14[highway=cycleway] +{ + color: @cycleway; + width: 0.4; + opacity: 0.8; + z-index: 2000; + +} /* ZOOM 15 */ line|z15[highway=trunk], @@ -484,14 +496,14 @@ line|z15[highway=motorway] { width: 4.8; opacity: 1; - color: @trunk_orange_medium; + color: @trunk_yellow; z-index: 900; } line|z15[highway=trunk]::case, line|z15[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 6; opacity: 1; z-index: 45; @@ -516,7 +528,7 @@ line|z15[highway=trunk_link][tunnel?] { line|z15[highway=primary] { - color: @primary_orange_medium; + color: @primary_yellow; width: 3.8; opacity: 1; z-index: 850; @@ -524,7 +536,7 @@ line|z15[highway=primary] line|z15[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 5.5; opacity: 1; z-index: 45; @@ -539,7 +551,6 @@ line|z15[highway=primary_link] line|z15[highway=primary][tunnel?], line|z15[highway=primary_link][tunnel?] { - casing-width: 1; casing-linecap: butt; casing-color: @primary_tunnel_casing; @@ -567,7 +578,6 @@ line|z15[highway=tertiary], color: @residential; width: 3; opacity: 1; - z-index: 750; } line|z15[highway=tertiary_link] { @@ -576,7 +586,8 @@ line|z15[highway=tertiary_link] { } line|z15[highway=unclassified], -line|z15[highway=living_street] +line|z15[highway=living_street], +line|z15[highway=road] { color: @unclassified; width: 3; @@ -594,23 +605,34 @@ line|z15[highway=service] line|z15[highway=service][service=driveway] { - width: 0; + width: 0; } - -line|z15[highway=track] +line|z15[highway=track][tracktype=grade1], { color: @track; - opacity: 0.5; - width: 1; + opacity: 1; + width: 1.6; + z-index: 1000; +} +line|z15[highway=track], +line|z15[highway=path], +line|z15[route=hiking] +{ + color: @track; + opacity: 1; + dashes: 2,0.5; + width: 0.8; + z-index: 1000; } line|z15[highway=bridleway] { color: @bridleway; - opacity: 0.5; + opacity: 1; + dashes: 0.5,3.5; width: 1; - dashes: 1,1; + z-index: 600; } line|z15[highway=pedestrian] @@ -621,13 +643,12 @@ line|z15[highway=pedestrian] opacity: 0.8; } -line|z15[highway=footway], -line|z15[highway=path] +line|z15[highway=footway] { color: @footway; width: 0.8; dashes: 0.5,0.5; - opacity: 0.6; + opacity: 1; z-index: 600; } @@ -636,11 +657,9 @@ line|z15[highway=cycleway] color: @cycleway; width: 0.6; opacity: 0.9; - z-index: 1000; -/* dashes: 1,1; - opacity: 0.8; */ -} + z-index: 2000; +} line|z15[highway=construction] { color: @construction; @@ -649,14 +668,13 @@ line|z15[highway=construction] dashes: 5,5; } - /* ZOOM 16 */ line|z16[highway=trunk], line|z16[highway=motorway] { - color: @trunk_orange_light; - width: 6; + color: @trunk_yellow; + width: 6.8; opacity: 1; } @@ -664,7 +682,7 @@ line|z16[highway=motorway] line|z16[highway=trunk]::case, line|z16[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 8.8; opacity: 1; z-index: 45; @@ -689,14 +707,14 @@ line|z16[highway=trunk_link][tunnel?] { line|z16[highway=primary] { - color: @primary_orange_medium; - width: 4.5; + color: @primary_yellow; + width: 6; opacity: 1; } line|z16[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 7.2; opacity: 1; z-index: 45; @@ -750,9 +768,11 @@ line|z16[highway=tertiary_link] width: 2.2; } -line|z16[highway=tertiary][tunnel?], line|z16[highway=tertiary_link][tunnel?], +line|z16[highway=residential_link][tunnel?], +line|z16[highway=tertiary][tunnel?], line|z16[highway=residential][tunnel?] { + color: @unclassified_tunnel; casing-width: 1; casing-linecap: butt; casing-color: @unclassified_tunnel_casing; @@ -760,7 +780,8 @@ line|z16[highway=residential][tunnel?] { } line|z16[highway=unclassified], -line|z16[highway=living_street] +line|z16[highway=living_street], +line|z16[highway=road] { color: @unclassified; width: 4.5; @@ -778,19 +799,28 @@ line|z16[highway=service][service=driveway] width: 0; } -line|z16[highway=track] +line|z16[highway=track][tracktype=grade1], { color: @track; opacity: 1; - width: 1.4; + width: 3.5; +} +line|z16[highway=track], +line|z16[highway=path], +line|z16[route=hiking] +{ + color: @track; + opacity: 1; + dashes: 3,1.5; + width: 1.2; } line|z16[highway=bridleway] { color: @bridleway; opacity: 1; - width: 1.4; - dashes: 1,1; + dashes: 1,4; + width: 1.2; } line|z16[highway=pedestrian] @@ -811,8 +841,7 @@ line|z16[highway=pedestrian][tunnel?] { casing-dashes: 5,5; } -line|z16[highway=footway], -line|z16[highway=path] +line|z16[highway=footway] { color: @footway; width: 1; @@ -823,7 +852,7 @@ line|z16[highway=path] line|z16[highway=steps] { color: @steps; - width: 3; + width: 4; dashes: 0.5,0.5; } @@ -840,7 +869,7 @@ line|z16[highway=cycleway] color: @cycleway; width: 1; opacity: 1; - z-index: 1000; + z-index: 2000; } @@ -849,7 +878,7 @@ line|z16[highway=cycleway] line|z17[highway=trunk], line|z17[highway=motorway] { - color: @trunk_orange_light; + color: @trunk_yellow; width: 9; opacity: 1; } @@ -857,7 +886,7 @@ line|z17[highway=motorway] line|z17[highway=trunk]::case, line|z17[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 10.5; opacity: 1; z-index: 45; @@ -882,14 +911,14 @@ line|z17[highway=motorway_link][tunnel?] { line|z17[highway=primary] { - color: @primary_orange_light; + color: @primary_light; width: 9; opacity: 1; } line|z17[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 10.5; opacity: 1; z-index: 45; @@ -923,8 +952,8 @@ line|z17[highway=secondary_link] width: 4.5; } -line|z17[highway=secondary][tunnel?], -line|z17[highway=secondary_link][tunnel?] { +line|z17[highway=secondary_link][tunnel?], +line|z17[highway=secondary][tunnel?] { casing-width: 1; casing-linecap: butt; casing-color: @secondary_tunnel_casing; @@ -945,10 +974,10 @@ line|z17[highway=tertiary_link], width: 3.6; } -line|z17[highway=tertiary][tunnel?], line|z17[highway=tertiary_link][tunnel?], +line|z17[highway=residential_link][tunnel?], +line|z17[highway=tertiary][tunnel?], line|z17[highway=residential][tunnel?] { - color: @tertiary_tunnel; casing-width: 1; casing-linecap: butt; casing-color: @tertiary_tunnel_casing; @@ -956,7 +985,8 @@ line|z17[highway=residential][tunnel?] { } line|z17[highway=unclassified], -line|z17[highway=living_street] +line|z17[highway=living_street], +line|z17[highway=road] { color: @unclassified; width: 7.2; @@ -986,7 +1016,7 @@ line|z17[highway=path] width: 1.2; dashes: 2,2; opacity: 1; - z-index: 600; + z-index: 750; } line|z17[highway=footway][tunnel?]::tunnelBackground, @@ -1011,26 +1041,34 @@ line|z17[highway=service] color: @unclassified; width: 2.4; } - -line|z17[highway=track] +line|z17[highway=track][tracktype=grade1], { color: @track; opacity: 1; - width: 2.4; + width: 6; +} +line|z17[highway=track], +line|z17[highway=path], +line|z17[route=hiking] +{ + color: @track; + opacity: 1; + dashes: 3.5,2; + width: 2; } line|z17[highway=bridleway] { color: @bridleway; opacity: 1; - width: 2.4; - dashes: 1,1; + dashes: 1,4; + width: 1.6; } line|z17[highway=steps] { color: @steps; - width: 4; + width: 6; dashes: 1,1; } @@ -1047,7 +1085,7 @@ line|z17[highway=cycleway] color: @cycleway; width: 1.2; opacity: 1; - z-index: 700; + z-index: 2000; } @@ -1056,7 +1094,7 @@ line|z17[highway=cycleway] line|z18[highway=trunk], line|z18[highway=motorway] { - color: @trunk_orange_light; + color: @trunk_yellow; width: 14; opacity: 1; } @@ -1064,7 +1102,7 @@ line|z18[highway=motorway] line|z18[highway=trunk]::case, line|z18[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 16; opacity: 1; z-index: 45; @@ -1089,14 +1127,14 @@ line|z18[highway=motorway_link][tunnel?] { line|z18[highway=primary] { - color: @primary_orange_light; + color: @primary_yellow; width: 14; opacity: 1; } line|z18[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 16; opacity: 1; z-index: 45; @@ -1165,7 +1203,8 @@ line|z18[highway=residential][tunnel?] { } line|z18[highway=unclassified], -line|z18[highway=living_street] +line|z18[highway=living_street], +line|z18[highway=road] { color: @unclassified; width: 9; @@ -1188,14 +1227,14 @@ line|z18[highway=pedestrian][tunnel?] { casing-dashes: 5,5; } -line|z18[highway=footway], +line|z18[highway=footway],, line|z18[highway=path] { color: @footway; width: 1.8; dashes: 3,1.5; opacity: 1; - z-index: 600; + z-index: 1050; } line|z18[highway=footway][tunnel?]::tunnelBackground, @@ -1221,23 +1260,38 @@ line|z18[highway=service] width: 3; } -line|z18[highway=track] +line|z18[highway=track][tracktype=grade1], { color: @track; + opacity: 1; + width: 7.4; + z-index: 600; +} +line|z18[highway=track], +line|z18[highway=path], +line|z18[route=hiking] +{ + color: @track; + opacity: 1; + dashes: 5,3; width: 3; + z-index: 600; + } line|z18[highway=bridleway] { color: @bridleway; - width: 3; - dashes: 1,1; + opacity: 1; + dashes: 2,5; + width: 2; + z-index: 600; } line|z18[highway=steps] { color: @steps; - width: 5; + width: 8; dashes: 1,1; } @@ -1254,7 +1308,7 @@ line|z18[highway=cycleway] color: @cycleway; width: 2; opacity: 1; - z-index: 700; + z-index: 2000; } /* ZOOM 19+ */ @@ -1262,7 +1316,7 @@ line|z18[highway=cycleway] line|z19-[highway=trunk], line|z19-[highway=motorway] { - color: @trunk_orange_light; + color: @trunk_yellow; width: 14; opacity: 1; } @@ -1270,7 +1324,7 @@ line|z19-[highway=motorway] line|z19-[highway=trunk]::case, line|z19-[highway=motorway]::case { - color: @trunk_orange_case; + color: @trunk_yellow_case; width: 16; opacity: 1; z-index: 45; @@ -1288,22 +1342,22 @@ line|z19-[highway=trunk][tunnel?], line|z19-[highway=motorway][tunnel?], line|z19-[highway=trunk_link][tunnel?], line|z19-[highway=motorway_link][tunnel?] { - casing-width: 1; - casing-linecap: butt; - casing-color: @trunk_tunnel_casing; - casing-dashes: 5,5; + casing-width: 1; + casing-linecap: butt; + casing-color: @trunk_tunnel_casing; + casing-dashes: 5,5; } line|z19-[highway=primary] { - color: @primary_orange_light; + color: @primary_yellow; width: 14; opacity: 1; } line|z19-[highway=primary]::case { - color: @primary_orange_case; + color: @primary_yellow_case; width: 16; opacity: 1; z-index: 45; @@ -1372,7 +1426,8 @@ line|z19-[highway=residential][tunnel?] { } line|z19-[highway=unclassified], -line|z19-[highway=living_street] +line|z19-[highway=living_street], +line|z19-[highway=road] { color: @unclassified; width: 9; @@ -1402,7 +1457,7 @@ line|z19-[highway=path] width: 2; dashes: 3,1.5; opacity: 1; - z-index: 600; + z-index: 1050; } line|z19-[highway=footway][tunnel?]::tunnelBackground, @@ -1428,23 +1483,34 @@ line|z19-[highway=service] width: 3; } -line|z19-[highway=track] +line|z19-[highway=track][tracktype=grade1], { color: @track; - width: 3; + opacity: 1; + width: 8.2; +} +line|z19-[highway=track], +line|z19-[highway=path], +line|z19-[route=hiking] +{ + color: @track; + opacity: 1; + dashes: 5,3; + width: 3.8; } line|z19-[highway=bridleway] { color: @bridleway; + opacity: 1; + dashes: 3,6; width: 3; - dashes: 1,1; } line|z19-[highway=steps] { color: @steps; - width: 6; + width: 10; dashes: 0.5,0.5; } @@ -1461,21 +1527,21 @@ line|z19-[highway=cycleway] color: @cycleway; width: 2; opacity: 1; - z-index: 700; + z-index: 2000; } /* BRIDGES */ /* CASING FOR PRIMARY ROADS */ - +/* line|z15-[highway=primary]::casingBackground { z-index: 30; casing-width: eval(prop("width")+0.2); casing-linecap: butt; casing-color: @background; } - +*/ line|z13[highway=motorway][bridge?]::bridgewhite, @@ -1489,7 +1555,7 @@ line|z13[highway=trunk][bridge?]::bridgewhite { line|z13[highway=motorway][bridge?]::bridgeblack, line|z13[highway=trunk][bridge?]::bridgeblack { z-index: 25; - casing-width: eval(prop("width")+0.5); + casing-width: eval(prop("width")+0.4); casing-linecap: butt; casing-color: @bridge_casing; } @@ -1497,61 +1563,216 @@ line|z13[highway=trunk][bridge?]::bridgeblack { line|z14-[highway=motorway][bridge?]::bridgewhite, line|z14-[highway=trunk][bridge?]::bridgewhite, line|z14-[highway=primary][bridge?]::bridgewhite, -line|z15-[highway=secondary][bridge?]::bridgewhite, -line|z16-[highway=tertiary][bridge?]::bridgewhite, -line|z16-[highway=residential][bridge?]::bridgewhite, -line|z16-[highway=unclassified][bridge?]::bridgewhite, -line|z16-[highway=pedestrian][bridge?]::bridgewhite, -line|z16-[highway=footway][bridge?]::bridgewhite, -line|z17-[highway=steps][bridge?]::bridgewhite, -line|z17-[highway=road][bridge?]::bridgewhite, -line|z17-[highway=service][bridge?]::bridgewhite { - z-index: 30; - casing-width: eval(prop("width")+0.5); +line|z14-[highway=secondary][bridge?]::bridgewhite, +line|z14-[highway=tertiary][bridge?]::bridgewhite, +line|z14-[highway=residential][bridge?]::bridgewhite, +line|z14-[highway=unclassified][bridge?]::bridgewhite, +line|z14-[railway=rail][bridge?]::bridgewhite +{ + z-index: 510; + casing-width: eval(prop("width")); casing-linecap: butt; casing-color: @bridge_background; } - line|z14-[highway=motorway][bridge?]::bridgeblack, line|z14-[highway=trunk][bridge?]::bridgeblack, line|z14-[highway=primary][bridge?]::bridgeblack, -line|z15-[highway=secondary][bridge?]::bridgeblack, -line|z16-[highway=tertiary][bridge?]::bridgeblack, -line|z16-[highway=residential][bridge?]::bridgeblack, -line|z16-[highway=unclassified][bridge?]::bridgeblack, -line|z16-[highway=pedestrian][bridge?]::bridgeblack, -line|z16-[highway=footway][bridge?]::bridgeblack, -line|z17-[highway=steps][bridge?]::bridgeblack, -line|z17-[highway=road][bridge?]::bridgeblack, -line|z17-[highway=service][bridge?]::bridgeblack +line|z14-[highway=secondary][bridge?]::bridgeblack, +line|z14-[highway=tertiary][bridge?]::bridgeblack, +line|z14-[highway=residential][bridge?]::bridgeblack, +line|z14-[highway=unclassified][bridge?]::bridgeblack, +line|z14-[railway=rail][bridge?]::bridgeblack { - z-index: 25; - casing-width: eval(prop("width")+1.5); + z-index: 500; + casing-width: eval(prop("width")+0.4); casing-linecap: butt; casing-color: @bridge_casing; } -line|z15-[highway=motorway_link][bridge?]::bridgewhite, -line|z15-[highway=trunk_link][bridge?]::bridgewhite, -line|z15-[highway=primary_link][bridge?]::bridgewhite, -line|z16-[highway=secondary_link][bridge?]::bridgewhite, -line|z16-[highway=tertiary_link][bridge?]::bridgewhite +line|z17-[highway=motorway][bridge?]::bridgewhite, +line|z17-[highway=trunk][bridge?]::bridgewhite, +line|z17-[highway=primary][bridge?]::bridgewhite, +line|z17-[highway=secondary][bridge?]::bridgewhite, +line|z17-[highway=tertiary][bridge?]::bridgewhite, +line|z17-[highway=residential][bridge?]::bridgewhite, +line|z17-[highway=unclassified][bridge?]::bridgewhite, +line|z17-[railway=rail][bridge?]::bridgewhite { - z-index: 30; - casing-width: eval(prop("width")+0.5); + z-index: 510; + casing-width: eval(prop("width")+0.8); + casing-linecap: butt; + casing-color: @bridge_background; +} +line|z17-[highway=motorway][bridge?]::bridgeblack, +line|z17-[highway=trunk][bridge?]::bridgeblack, +line|z17-[highway=primary][bridge?]::bridgeblack, +line|z17-[highway=secondary][bridge?]::bridgeblack, +line|z17-[highway=tertiary][bridge?]::bridgeblack, +line|z17-[highway=residential][bridge?]::bridgeblack, +line|z17-[highway=unclassified][bridge?]::bridgeblack, +line|z17-[railway=rail][bridge?]::bridgeblack +{ + z-index: 500; + casing-width: eval(prop("width")+1.6); + casing-linecap: butt; + casing-color: @bridge_casing; +} +line|z18-[highway=motorway][bridge?]::bridgewhite, +line|z18-[highway=trunk][bridge?]::bridgewhite, +line|z18-[highway=primary][bridge?]::bridgewhite, +line|z18-[highway=secondary][bridge?]::bridgewhite, +line|z18-[highway=tertiary][bridge?]::bridgewhite, +line|z18-[highway=residential][bridge?]::bridgewhite, +line|z18-[highway=unclassified][bridge?]::bridgewhite, +line|z18-[railway=rail][bridge?]::bridgewhite +{ + z-index: 510; + casing-width: eval(prop("width")+1); + casing-linecap: butt; + casing-color: @bridge_background; +} +line|z18-[highway=motorway][bridge?]::bridgeblack, +line|z18-[highway=trunk][bridge?]::bridgeblack, +line|z18-[highway=primary][bridge?]::bridgeblack, +line|z18-[highway=secondary][bridge?]::bridgeblack, +line|z18-[highway=tertiary][bridge?]::bridgeblack, +line|z18-[highway=residential][bridge?]::bridgeblack, +line|z18-[highway=unclassified][bridge?]::bridgeblack, +line|z18-[railway=rail][bridge?]::bridgeblack +{ + z-index: 500; + casing-width: eval(prop("width")+2); + casing-linecap: butt; + casing-color: @bridge_casing; +} +line|z14-[highway=motorway_link][bridge?]::bridgewhite, +line|z14-[highway=trunk_link][bridge?]::bridgewhite, +line|z14-[highway=primary_link][bridge?]::bridgewhite, +line|z14-[highway=secondary_link][bridge?]::bridgewhite, +line|z14-[highway=tertiary_link][bridge?]::bridgewhite +{ + z-index: 510; + casing-width: eval(prop("width")); casing-linecap: butt; casing-color: @bridge_background; } -line|z15-[highway=motorway_link][bridge?]::bridgeblack, -line|z15-[highway=trunk_link][bridge?]::bridgeblack, -line|z15-[highway=primary_link][bridge?]::bridgeblack, -line|z16-[highway=secondary_link][bridge?]::bridgeblack, -line|z16-[highway=tertiary_link][bridge?]::bridgeblack +line|z14-[highway=motorway_link][bridge?]::bridgeblack, +line|z14-[highway=trunk_link][bridge?]::bridgeblack, +line|z14-[highway=primary_link][bridge?]::bridgeblack, +line|z14-[highway=secondary_link][bridge?]::bridgeblack, +line|z14-[highway=tertiary_link][bridge?]::bridgeblack { - z-index: 25; + z-index: 500; + casing-width: eval(prop("width")+0.4); + casing-linecap: butt; + casing-color: @bridge_casing; +} +line|z17-[highway=motorway_link][bridge?]::bridgewhite, +line|z17-[highway=trunk_link][bridge?]::bridgewhite, +line|z17-[highway=primary_link][bridge?]::bridgewhite, +line|z17-[highway=secondary_link][bridge?]::bridgewhite, +line|z17-[highway=tertiary_link][bridge?]::bridgewhite +{ + z-index: 510; + casing-width: eval(prop("width")+0.8); + casing-linecap: butt; + casing-color: @bridge_background; +} + +line|z17-[highway=motorway_link][bridge?]::bridgeblack, +line|z17-[highway=trunk_link][bridge?]::bridgeblack, +line|z17-[highway=primary_link][bridge?]::bridgeblack, +line|z17-[highway=secondary_link][bridge?]::bridgeblack, +line|z17-[highway=tertiary_link][bridge?]::bridgeblack +{ + z-index: 500; + casing-width: eval(prop("width")+1.6); + casing-linecap: butt; + casing-color: @bridge_casing; +} +line|z18-[highway=motorway_link][bridge?]::bridgewhite, +line|z18-[highway=trunk_link][bridge?]::bridgewhite, +line|z18-[highway=primary_link][bridge?]::bridgewhite, +line|z18-[highway=secondary_link][bridge?]::bridgewhite, +line|z18-[highway=tertiary_link][bridge?]::bridgewhite +{ + z-index: 510; casing-width: eval(prop("width")+1); casing-linecap: butt; + casing-color: @bridge_background; +} + +line|z18-[highway=motorway_link][bridge?]::bridgeblack, +line|z18-[highway=trunk_link][bridge?]::bridgeblack, +line|z18-[highway=primary_link][bridge?]::bridgeblack, +line|z18-[highway=secondary_link][bridge?]::bridgeblack, +line|z18-[highway=tertiary_link][bridge?]::bridgeblack +{ + z-index: 500; + casing-width: eval(prop("width")+2); + casing-linecap: butt; + casing-color: @bridge_casing; +} +line|z13[highway=pedestrian][bridge?]::bridgewhite, +line|z13[highway=footway][bridge?]::bridgewhite +{ + z-index: 610; + casing-width: eval(prop("width")-0.2); + casing-linecap: butt; + casing-color: @bridge_background; +} +line|z14-[highway=pedestrian][bridge?]::bridgewhite, +line|z14-[highway=footway][bridge?]::bridgewhite, +line|z16-[highway=steps][bridge?]::bridgewhite, +line|z16-[highway=road][bridge?]::bridgewhite, +line|z16-[highway=service][bridge?]::bridgewhite { + z-index: 510; + casing-width: eval(prop("width")); + casing-linecap: butt; + casing-color: @bridge_background; +} +line|z14-[highway=pedestrian][bridge?]::bridgeblack, +line|z14-[highway=footway][bridge?]::bridgeblack, +line|z16-[highway=steps][bridge?]::bridgeblack, +line|z16-[highway=road][bridge?]::bridgeblack, +line|z16-[highway=service][bridge?]::bridgeblack +{ + z-index: 500; + casing-width: eval(prop("width")+0.2); + casing-linecap: butt; + casing-color: @bridge_casing; +} +line|z16-[highway=pedestrian][bridge?]::bridgewhite, +line|z16-[highway=footway][bridge?]::bridgewhite +{ + z-index: 710; + casing-width: eval(prop("width")+0.2); + casing-linecap: butt; + casing-color: @bridge_background; +} +line|z16-[highway=pedestrian][bridge?]::bridgeblack, +line|z16-[highway=footway][bridge?]::bridgeblack, +{ + z-index:700; + casing-width: eval(prop("width")+0.6); + casing-linecap: butt; + casing-color: @bridge_casing; +} +line|z18-[highway=pedestrian][bridge?]::bridgewhite, +line|z18-[highway=footway][bridge?]::bridgewhite +{ + z-index:1010; + casing-width: eval(prop("width")+0.2); + casing-linecap: butt; + casing-color: @bridge_background; +} +line|z18-[highway=pedestrian][bridge?]::bridgeblack, +line|z18-[highway=footway][bridge?]::bridgeblack, +{ + z-index:1000; + casing-width: eval(prop("width")+0.6); + casing-linecap: butt; casing-color: @bridge_casing; } @@ -1585,3 +1806,34 @@ line|z18-[hwtag=oneway]::arrows pattern-image: arrow-m.svg; pattern-spacing: 200; } + + + + +/* Process bridge and tunnel */ +/* +line|z15-[bridge?]::bridgewhite, +line|z15-[tunnel?]::tunnelwhite, +{ + z-index: 30; + casing-width: eval(prop("width")/2+4); + casing-linecap: butt; + casing-color: white; +} + +line|z15-[bridge?]::bridgeblack +{ + z-index: 25; + casing-width: eval(prop("width")/2+5); + casing-linecap: butt; + casing-color: black; +} +line|z15-[tunnel?]::tunnelblack +{ + z-index: 25; + casing-width: eval(prop("width")/2+5); + casing-linecap: butt; + casing-color: black; + casing-dashes: 5,5; +} +*/ diff --git a/data/styles/clear/include/transport.mapcss b/data/styles/clear/include/transport.mapcss index 56b0f99c15..20d89d014d 100644 --- a/data/styles/clear/include/transport.mapcss +++ b/data/styles/clear/include/transport.mapcss @@ -5,35 +5,61 @@ line|z11-12[railway=rail] { color: @railway_light; - width: 0.5; - z-index: 760; + width: 0.6; + opacity: 1; + z-index: 680; } -line|z13-14[railway=rail], -line|z13-14[railway=light_rail] +line|z13-[railway=rail], +line|z13-[railway=light_rail] { color: @railway_light; - opacity: 0.8; - width: 0.5; - z-index: 760; + opacity: 1; + width: 0.8; + z-index: 680; } - -line|z15-16[railway=rail], -line|z15-16[railway=light_rail] +line|z14[railway=rail], +line|z14[railway=light_rail] { color: @railway; - opacity: 0.6; - width: 0.8; - z-index: 760; + opacity: 1; + width: 1; + z-index: 680; +} +line|z15[railway=rail], +line|z15[railway=light_rail] +{ + color: @railway; + opacity: 1; + width: 1.2; + z-index: 680; +} + +line|z16[railway=rail]::dash, +line|z16[railway=light_rail]::dash +{ + color: @railway_dash; + opacity: 1; + width: 1.3; + z-index: 690; + dashes: 4.5,4.5; +} +line|z16[railway=rail], +line|z16[railway=light_rail] +{ + color: @railway; + opacity: 1; + width: 2.6; + z-index: 680; } line|z17[railway=rail], line|z17[railway=light_rail] { color: @railway; - opacity: 0.8; - width: 2; - z-index: 760; + opacity: 1; + width: 3; + z-index: 680; } line|z17[railway=rail]::dash, @@ -41,18 +67,18 @@ line|z17[railway=light_rail]::dash { color: @railway_dash; opacity: 1; - width: 1; - z-index: 770; - dashes: 5,5; + width: 2; + z-index: 690; + dashes: 6.3,6.3; } line|z18-[railway=rail], line|z18-[railway=light_rail] { color: @railway; - opacity: 0.8; + opacity: 1; width: 3; - z-index: 760; + z-index: 680; } line|z18-[railway=rail]::dash, @@ -60,9 +86,9 @@ line|z18-[railway=light_rail]::dash, { color: @railway_dash; opacity: 1; - width: 1.5; - z-index: 770; - dashes: 7,7; + width: 2; + z-index: 690; + dashes: 8.1,8.1; } line|z14-[railway=rail][tunnel?], @@ -109,53 +135,62 @@ line|z18-[railway=construction], line|z18-[railway=disused] { color: @railway; width: 1; - dashes: 2,6; - z-index: 119; + dashes: 1.8,5.4; + z-index: 450; } line|z14[railway=monorail] { color: @railway_light; - width: 0.9; - opacity: 0.5; - z-index: 960; + width: 1; + opacity: 1; + z-index: 950; } line|z15-16[railway=monorail] { color: @railway; - width: 0.9; - opacity: 0.8; - z-index: 960; + width: 1.2; + opacity: 1; + z-index: 950; } line|z17-[railway=monorail] { color: @railway; - opacity: 0.8; + opacity: 1; width: 2; - z-index: 960; + z-index: 950; } line|z15-16[railway=narrow_gauge] { color: @railway; - width: 0.9; - opacity: 0.8; - z-index: 960; + width: 1.2; + opacity: 1; + z-index: 950; } line|z17-[railway=narrow_gauge] { color: @railway; - opacity: 0.8; + opacity: 1; width: 2; - z-index: 960; + z-index: 950; } +line|z16-[railway=preserved], +line|z16-[railway=abandoned] +{ + color: @railway; + opacity: 1; + width: 1.6; + z-index: 450; + dashes: 6.3,6.3; +} @@ -163,18 +198,18 @@ line|z17-[railway=narrow_gauge] line|z13-14[railway=funicular] { - color: @railway_light; - opacity: 0.8; - width: 0.5; - z-index: 12; + color: @railway; + opacity: 1; + width: 2; + z-index: 950; } line|z15-[railway=funicular] { color: @railway; - opacity: 0.6; - width: 1; - z-index: 12; + opacity: 1; + width: 3; + z-index: 950; } @@ -184,16 +219,16 @@ line|z15-[railway=funicular] line|z15[railway=tram] { color: @tram; - opacity: 0.6; - width: 0.5; + opacity: 1; + width: 0.7; z-index: 950; } line|z16[railway=tram] { color: @tram; - opacity: 0.8; - width: 0.5; + opacity: 1; + width: 0.8; z-index: 950; } @@ -211,15 +246,15 @@ line|z10-[route=ferry], line|z10-[route=ferry_motorcar] { color: @ferry; - width: 0.8; + width: 1; opacity: 1; - dashes: 3,2; - z-index: 400; + dashes: 5.4,2.7; + z-index: 115; } /* TRANSPORT POINTS */ - +/* node[highway=bus_stop], node[amenity=bus_station], node[railway=tram_stop], @@ -233,6 +268,32 @@ area[railway=halt], text-position: center; z-index: 10000; } +*/ + +node|z15-[highway=motorway_junction] +{ + text: name; + font-size: 9; + text-color: @subway_label; + text-position: center; + z-index: 1000; +} +node|z16-[highway=motorway_junction] +{ + text: name; + font-size: 10; + text-color: @subway_label; + text-position: center; + z-index: 1000; +} +node|z17-[highway=motorway_junction] +{ + text: name; + font-size: 10; + text-color: @subway_label; + text-position: center; + z-index: 1000; +} /* TRAIN STATIONS */ @@ -241,19 +302,18 @@ node|z14[railway=station], node|z14[railway=halt] { icon-image: train-s.svg; text-offset: 6; - z-index: 5000; - font-size: 11; + z-index: 2800; + font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z14[railway=station]::int_name, node|z14[railway=halt]::int_name { text-offset: 6; - z-index: 5000; + z-index: 2800; font-size: 10; text: int_name; text-color: @label_dark; @@ -261,24 +321,22 @@ node|z14[railway=halt]::int_name { text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z15[railway=station], node|z15[railway=halt] { icon-image: train-m.svg; text-offset: 8; - z-index: 5000; - font-size: 12; + z-index: 2800; + font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z15[railway=station]::int_name, node|z15[railway=halt]::int_name { text-offset: 8; - z-index: 5000; + z-index: 2800; font-size: 10; text: int_name; text-color: @label_dark; @@ -292,44 +350,41 @@ node|z16[railway=halt] { icon-image: train-l.svg; text-offset: 8; font-size: 13; - z-index: 5000; + z-index: 2800; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z16[railway=station]::int_name, node|z16[railway=halt]::int_name { text-offset: 8; - font-size: 11; - z-index: 5000; + font-size: 12; + z-index: 2800; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z17-[railway=station], node|z17-[railway=halt] { icon-image: train-l.svg; text-offset: 8; font-size: 13; - z-index: 10000; + z-index: 2800; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z17-[railway=station]::int_name, node|z17-[railway=halt]::int_name { text-offset: 18; - font-size: 11; - z-index: 10000; + font-size: 12; + z-index: 2800; text: int_name; text-color: @label_dark; text-halo-radius: 1; @@ -337,7 +392,6 @@ node|z17-[railway=halt]::int_name { text-halo-color: @label_halo_light; } - /* node|z16-[railway=level_crossing] { icon-image: railway-crossing.svg; } */ /* SUBWAY STATIONS - GENERIC STYLES */ @@ -351,7 +405,29 @@ node|z13[railway=station][transport=subway] { node|z14[railway=station][transport=subway] { icon-image: subway-s.svg; text-offset: 6; - z-index: 15000; + z-index: 2900; + font-size: 10; + text: name; + text-color: @label_dark; + text-halo-radius: 1; + text-halo-opacity: 0.5; + text-halo-color: @label_halo_light; +} +node|z14[railway=station][transport=subway]::int_name { + icon-image: subway-m.svg; + text-offset: 7; + z-index: 2900; + font-size: 9; + text: int_name; + text-color: @label_dark; + text-halo-radius: 1; + text-halo-opacity: 0.5; + text-halo-color: @label_halo_light; +} +node|z15[railway=station][transport=subway] { + icon-image: subway-m.svg; + text-offset: 7; + z-index: 2900; font-size: 11; text: name; text-color: @label_dark; @@ -359,23 +435,10 @@ node|z14[railway=station][transport=subway] { text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - -node|z15[railway=station][transport=subway] { - icon-image: subway-m.svg; - text-offset: 7; - z-index: 15000; - font-size: 12; - text: name; - text-color: @label_dark; - text-halo-radius: 1; - text-halo-opacity: 0.5; - text-halo-color: @label_halo_light; -} - node|z15[railway=station][transport=subway]::int_name { icon-image: subway-m.svg; text-offset: 7; - z-index: 15000; + z-index: 2900; font-size: 10; text: int_name; text-color: @label_dark; @@ -383,94 +446,71 @@ node|z15[railway=station][transport=subway]::int_name { text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - - node|z16[railway=station][transport=subway] { icon-image: subway-m.svg; text-offset: 7; font-size: 13; - z-index: 15000; + z-index: 2900; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z16[railway=station][transport=subway]::int_name { text-offset: 7; - font-size: 11; - z-index: 15000; + font-size: 12; + z-index: 2900; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - - node|z17-[railway=station][transport=subway] { icon-image: subway-l.svg; font-size: 13; - z-index: 15000; + z-index: 2900; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z17-[railway=station][transport=subway]::int_name { - font-size: 11; - z-index: 15000; + font-size: 12; + z-index: 2900; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - -node|z17[railway=subway_entrance] { icon-image: subway-entrance-s.svg; text-offset: 8; font-size: 13; z-index: 13000; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } -node|z17[railway=subway_entrance]::int_name { text-offset: 8; font-size: 13; z-index: 13000; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - -node|z18-[railway=subway_entrance] { icon-image: subway-entrance-s.svg; text-offset: 8; font-size: 13; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; z-index: 13000; } -node|z18-[railway=subway_entrance]::int_name { text-offset: 8; font-size: 12; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; z-index: 13000; } - +node|z17[railway=subway_entrance] { icon-image: subway-entrance-s.svg; text-offset: 8; font-size: 13; z-index: 2800; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z18-[railway=subway_entrance] { icon-image: subway-entrance-s.svg; text-offset: 8; font-size: 13; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; z-index: 2800; } /* MOSCOW SUBWAY */ -node|z12[railway=station][transport=subway][city=moscow] { +node|z11[railway=station][transport=subway][city=moscow] { icon-image: subway-moscow-s.svg; z-index: 2900; } +node|z12-13[railway=station][transport=subway][city=moscow] { icon-image: subway-moscow-s.svg; - z-index: 15000; - text-offset: 5; - z-index: 15000; + text-offset: 7; + z-index: 2900; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; - text-halo-opacity: 0.5; - text-halo-color: @label_halo_light; - -} -node|z13[railway=station][transport=subway][city=moscow] { - icon-image: subway-moscow-s.svg; - text-offset: 5; - z-index: 15000; - font-size: 11; - text: name; - text-color: @label_dark; - text-halo-radius: 1; - text-halo-opacity: 0.5; + text-halo-opacity: 1; text-halo-color: @label_halo_light; } -node|z13[railway=station][transport=subway][city=moscow]::int_name { - text-offset: 28; - z-index: 15000; - font-size: 10; +node|z12-13[railway=station][transport=subway][city=moscow]::int_name { + text-offset: 22; + z-index: 2900; + font-size: 9; text: int_name; text-color: @label_dark; text-halo-radius: 1; @@ -478,52 +518,62 @@ node|z13[railway=station][transport=subway][city=moscow]::int_name { text-halo-color: @label_halo_light; } -node|z14[railway=station][transport=subway][city=moscow] { icon-image: subway-moscow-m.svg; text-offset: 8; z-index: 15000; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light;} -node|z14[railway=station][transport=subway][city=moscow]::int_name { z-index: 15000; font-size: 10; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light;} -node|z15[railway=station][transport=subway][city=moscow] { icon-image: subway-moscow-m.svg; font-size: 12; } -node|z15[railway=station][transport=subway][city=moscow]::int_name { font-size: 10; text: int_name; } +node|z14[railway=station][transport=subway][city=moscow] { icon-image: subway-moscow-m.svg; text-offset: 9; z-index: 2900; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light;} +node|z14[railway=station][transport=subway][city=moscow]::int_name { z-index: 2900; font-size: 10; text-offset: 24;text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light;} +node|z15[railway=station][transport=subway][city=moscow] { icon-image: subway-moscow-m.svg; text-offset: 9; z-index: 2900; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light; } +node|z15[railway=station][transport=subway][city=moscow]::int_name { font-size: 10; text: int_name; text-offset: 24; z-index: 2900; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light;} + +node|z16[railway=station][transport=subway][city=moscow] { icon-image: subway-moscow-m.svg; text: name; font-size: 12; text-color: @district_label; text-halo-radius: 0; z-index: 2900} +node|z16[railway=station][transport=subway][city=moscow]::int_name { icon-image: none.svg; text: int_name; font-size: 11; text-color: @district_label; text-halo-radius: 0;z-index: 2900 } + +node|z17-[railway=station][transport=subway][city=moscow] { icon-image: subway-moscow-m.svg; text: name; font-size: 12; text-color: @district_label; text-halo-radius: 0; z-index: 2900} +node|z17-[railway=station][transport=subway][city=moscow]::int_name { text: int_name; font-size: 11; text-color: @district_label; text-halo-radius: 0; z-index: 2900} + + -node|z16[railway=station][transport=subway][city=moscow] { icon-image: none.svg; text: name; font-size: 10; text-color: @district_label; text-halo-radius: 0; } -node|z16[railway=station][transport=subway][city=moscow]::int_name { icon-image: none.svg; text: int_name; font-size: 9; text-color: @district_label; text-halo-radius: 0; } -node|z17-[railway=station][transport=subway][city=moscow] { icon-image: none.svg; text: name; font-size: 10; text-color: @district_label; text-halo-radius: 0; } -node|z17-[railway=station][transport=subway][city=moscow]::int_name { text: int_name; font-size: 9; text-color: @district_label; text-halo-radius: 0; } /* MOSCOW SUBWAY ENTRANCES */ -node|z16[railway=subway_entrance][city=moscow] { icon-image: subway-moscow-m.svg; text-offset: 8; z-index: 15000; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } -node|z16[railway=subway_entrance][city=moscow]::int_name { icon-image: subway-moscow-m.svg; text-offset: 8; z-index: 15000; font-size: 10; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z16[railway=subway_entrance][city=moscow] { icon-image: subway-moscow-m.svg; text-offset: 10; z-index: 2800; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light; } +node|z16[railway=subway_entrance][city=moscow]::int_name { font-size: 11; text: int_name; text-offset: 25; z-index: 2800; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light; } -node|z17[railway=subway_entrance][city=moscow] { icon-image: subway-moscow-m.svg; font-size: 13; } -node|z17[railway=subway_entrance][city=moscow] { font-size: 11; text: int_name; } +node|z17[railway=subway_entrance][city=moscow] { icon-image: subway-moscow-m.svg; text-offset: 10; z-index: 2800; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light; } +node|z17[railway=subway_entrance][city=moscow]::int_name { font-size: 11; text: int_name; text-offset: 25; z-index: 2800; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light; } + +node|z18-[railway=subway_entrance][city=moscow] { icon-image: subway-moscow-m.svg; text-offset: 10; z-index: 2800; font-size: 13; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light; } +node|z18-[railway=subway_entrance][city=moscow]::int_name { font-size: 12; text: int_name; text-offset: 25; z-index: 2800; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 1; text-halo-color: @label_halo_light; } -node|z18-[railway=subway_entrance][city=moscow] { icon-image: subway-moscow-m.svg; font-size: 13; } -node|z18[railway=subway_entrance][city=moscow] { font-size: 11; text: int_name; } /* SAINT PETERSBURG SUBWAY */ -node|z12[railway=station][transport=subway][city=spb] { icon-image: subway-spb-s.svg; text-offset: 5; z-index: 15000; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } -node|z13[railway=station][transport=subway][city=spb] { icon-image: subway-spb-s.svg; text-offset: 5; z-index: 15000; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } -node|z13[railway=station][transport=subway][city=spb]::int_name { icon-image: subway-spb-s.svg; text-offset: 5; z-index: 15000; font-size: 10; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z11[railway=station][transport=subway][city=spb] { icon-image: subway-spb-s.svg; z-index: 2900; } +node|z12[railway=station][transport=subway][city=spb] { icon-image: subway-spb-s.svg; text-offset: 8; z-index: 2900; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z12[railway=station][transport=subway][city=spb]::int_name { icon-image: subway-spb-s.svg; text-offset: 5; z-index: 2900; font-size: 9; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } -node|z14[railway=station][transport=subway][city=spb] { icon-image: subway-spb-s.svg; text-offset: 5; z-index: 15000; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } -node|z14[railway=station][transport=subway][city=spb]::int_name { icon-image: subway-spb-s.svg; text-offset: 5; z-index: 15000; font-size: 10; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z13[railway=station][transport=subway][city=spb] { icon-image: subway-spb-s.svg; text-offset: 8; z-index: 2900; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z13[railway=station][transport=subway][city=spb]::int_name { icon-image: subway-spb-s.svg; text-offset: 5; z-index: 2900; font-size: 9; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } + +node|z14[railway=station][transport=subway][city=spb] { icon-image: subway-spb-s.svg; text-offset: 8; z-index: 2900; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z14[railway=station][transport=subway][city=spb]::int_name { icon-image: subway-spb-s.svg; text-offset: 8; z-index: 2900; font-size: 10; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } + +node|z15[railway=station][transport=subway][city=spb] { icon-image: subway-spb-s.svg; text-offset: 8; z-index: 2900; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z15[railway=station][transport=subway][city=spb]::int_name { icon-image: subway-spb-s.svg; text-offset: 8; z-index: 2900; font-size: 10; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } + +node|z16[railway=station][transport=subway][city=spb] { icon-image: subway-spb-m.svg; font-size: 12; text: name; text-color: @district_label; text-halo-radius: 0;z-index: 2900 } +node|z16[railway=station][transport=subway][city=spb]::int_name { font-size: 11; text: int_name; text-color: @district_label; text-halo-radius: 0;z-index: 2900 } -node|z15[railway=station][transport=subway][city=spb] { icon-image: subway-spb-m.svg; } +node|z17-[railway=station][transport=subway][city=spb] { icon-image: subway-spb-m.svg; font-size: 12; text: name; text-color: @district_label; text-halo-radius: 0; z-index: 2900} +node|z17-[railway=station][transport=subway][city=spb]::int_name { font-size: 11; text: int_name; text-color: @district_label; text-halo-radius: 0;z-index: 2900 } -node|z16[railway=station][transport=subway][city=spb] { icon-image: none.svg; font-size: 10; text: name; text-color: @district_label; text-halo-radius: 0; } -node|z16[railway=station][transport=subway][city=spb]::int_name { font-size: 9; text: int_name; text-color: @district_label; text-halo-radius: 0; } +node|z16-[railway=subway_entrance][city=spb] { icon-image: subway-spb-m.svg; text-offset: 8; z-index: 2800; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z16-[railway=subway_entrance][city=spb]::int_name { z-index: 2800; font-size: 11; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z17-[railway=subway_entrance][city=spb] { icon-image: subway-spb-m.svg; text-offset: 8; z-index: 2800; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z17-[railway=subway_entrance][city=spb]::int_name { z-index: 2800; font-size: 11; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } -node|z17-[railway=station][transport=subway][city=spb] { icon-image: none.svg; font-size: 10; text: name; text-color: @district_label; text-halo-radius: 0; } -node|z17-[railway=station][transport=subway][city=spb]::int_name { font-size: 9; text: int_name; text-color: @district_label; text-halo-radius: 0; } - -node|z16-[railway=subway_entrance][city=spb] { icon-image: subway-spb-m.svg; text-offset: 8; z-index: 15000; font-size: 13; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } -node|z16-[railway=subway_entrance][city=spb]::int_name { z-index: 15000; font-size: 11; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - -node|z17[railway=subway_entrance][city=spb] { icon-image: subway-spb-m.svg; } -node|z18-[railway=subway_entrance][city=spb] { icon-image: subway-spb-m.svg; } - +node|z18-[railway=subway_entrance][city=spb] { icon-image: subway-spb-m.svg; text-offset: 8; z-index: 2800; font-size: 13; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z18-[railway=subway_entrance][city=spb]::int_name { z-index: 2800; font-size: 12; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } /* LONDON ICONS */ node|z14[railway=station][transport=subway][city=london] { icon-image: subway-london-s.svg; } @@ -533,11 +583,11 @@ node|z17[railway=subway_entrance][city=london] { icon-image: subway-london-s.svg node|z18-[railway=subway_entrance][city=london] { icon-image: subway-london-m.svg; } /* PARIS ICONS */ -node|z113[railway=station][transport=subway][city=paris] { icon-image: none.svg; } +node|z13[railway=station][transport=subway][city=paris] { icon-image: subway-paris-s.svg; } node|z14[railway=station][transport=subway][city=paris] { icon-image: subway-paris-s.svg; } -node|z15[railway=station][transport=subway][city=paris] { icon-image: subway-paris-m.svg;} +node|z15[railway=station][transport=subway][city=paris] { icon-image: subway-paris-m.svg; } node|z16-[railway=station][transport=subway][city=paris] { icon-image: subway-paris-l.svg; } -node|z17-[railway=subway_entrance][city=paris] { icon-image: subway-paris-s.svg; z-index: } +node|z17-[railway=subway_entrance][city=paris] { icon-image: subway-paris-s.svg; } /* BARCELONA ICONS */ node|z14[railway=station][transport=subway][city=barcelona] { icon-image: subway-barcelona-s.svg; } @@ -568,22 +618,22 @@ node|z17-[railway=station][transport=subway][city=roma] { icon-image: none.svg; node|z17-[railway=subway_entrance][city=roma] { icon-image: subway-rome-m.svg; } /* MINSK ICONS */ -node|z13[railway=station][transport=subway][city=minsk] { icon-image: subway-minsk-s.svg; text-offset: 4; z-index: 15000; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z13[railway=station][transport=subway][city=minsk] { icon-image: subway-minsk-s.svg; text-offset: 4; z-index: 2800; font-size: 9; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } node|z14[railway=station][transport=subway][city=minsk] { icon-image: subway-minsk-m.svg; text-offset: 5; } node|z15[railway=station][transport=subway][city=minsk] { icon-image: subway-minsk-l.svg; text-offset: 5; } node|z16[railway=station][transport=subway][city=minsk] { icon-image: none.svg; font-size: 10; text: name; text-color: @district_label; text-halo-radius: 0; } node|z17-[railway=station][transport=subway][city=minsk] { icon-image: none.svg; font-size: 10; text: name; text-color: @district_label; text-halo-radius: 0; } -node|z16-[railway=subway_entrance][city=minsk] { icon-image: subway-minsk-m.svg; text-offset: 6; z-index: 15000; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z16-[railway=subway_entrance][city=minsk] { icon-image: subway-minsk-m.svg; text-offset: 6; z-index: 2800; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } node|z17[railway=subway_entrance][city=minsk] { icon-image: subway-minsk-m.svg; font-size: 13; } node|z18-[railway=subway_entrance][city=minsk] { icon-image: subway-minsk-m.svg; font-size: 13; } /* KIEV ICONS */ -node|z13[railway=station][transport=subway][city=kiev] { icon-image: subway-kiev-s.svg; text-offset: 8; z-index: 15000; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z13[railway=station][transport=subway][city=kiev] { icon-image: subway-kiev-s.svg; text-offset: 8; z-index: 2; font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } node|z14[railway=station][transport=subway][city=kiev] { icon-image: subway-kiev-s.svg; } node|z15[railway=station][transport=subway][city=kiev] { icon-image: subway-kiev-m.svg; } node|z16-[railway=station][transport=subway][city=kiev] { icon-image: none.svg; font-size: 10; text: name; text-color: @district_label; text-halo-radius: 0; } -node|z16-[railway=subway_entrance][city=kiev] { icon-image: subway-kiev-m.svg; text-offset: 6; z-index: 15000; font-size: 12; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } +node|z16-[railway=subway_entrance][city=kiev] { icon-image: subway-kiev-m.svg; text-offset: 6; z-index: 2; font-size: 11; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } node|z17[railway=subway_entrance][city=kiev] { icon-image: subway-kiev-m.svg; font-size: 13; } node|z18-[railway=subway_entrance][city=kiev] { icon-image: subway-kiev-m.svg; font-size: 13; } @@ -601,17 +651,16 @@ node|z15-16[railway=tram_stop], area|z15-16[railway=tram_stop] { icon-image: tram-m.svg; - z-index: 4000; + z-index: 2800; } node|z17[railway=tram_stop], area|z17[railway=tram_stop] { icon-image: tram-l.svg; - z-index: 4000; text-offset: 8; - font-size: 11; - z-index: 5000; + font-size: 10; + z-index: 2800; text: name; text-color: @label_dark; text-halo-radius: 1; @@ -622,10 +671,9 @@ area|z17[railway=tram_stop] node|z17[railway=tram_stop]::int_name, area|z17[railway=tram_stop]::int_name { - z-index: 4000; text-offset: 8; - font-size: 10; - z-index: 5000; + font-size: 9; + z-index: 2800; text: int_name; text-color: @label_dark; text-halo-radius: 1; @@ -639,8 +687,8 @@ area|z18-[railway=tram_stop] icon-image: tram-l.svg; z-index: 4000; text-offset: 8; - font-size: 12; - z-index: 5000; + font-size: 10; + z-index: 2800; text: name; text-color: @label_dark; text-halo-radius: 1; @@ -651,10 +699,9 @@ area|z18-[railway=tram_stop] node|z18-[railway=tram_stop]::int_name, area|z18-[railway=tram_stop]::int_name { - z-index: 4000; text-offset: 8; - font-size: 10; - z-index: 5000; + font-size: 9; + z-index: 2800; text: int_name; text-color: @label_dark; text-halo-radius: 1; @@ -668,7 +715,7 @@ node|z17[highway=bus_stop], area|z17[highway=bus_stop] { icon-image: bus-m.svg; - z-index: 4000; + z-index: 27000; } node|z18-19[highway=bus_stop], @@ -677,10 +724,9 @@ node|z16-17[public_transport=station], area|z16-17[public_transport=station] { icon-image: bus-l.svg; - z-index: 9000; + z-index: 27000; text-offset: 10; - font-size: 11; - z-index: 5000; + font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; @@ -693,10 +739,9 @@ area|z18-19[highway=bus_stop]::int_name, node|z16-17[public_transport=station]::int_name, area|z16-17[public_transport=station]::int_name { - z-index: 9000; text-offset: 10; font-size: 9; - z-index: 5000; + z-index: 27000; text: int_name; text-color: @label_dark; text-halo-radius: 1; @@ -704,16 +749,14 @@ area|z16-17[public_transport=station]::int_name text-halo-color: @label_halo_light; } - node|z15[amenity=bus_station], area|z16-[amenity=bus_station] { icon-image: bus-l.svg; } node|z16-17[amenity=bus_station], area|z16-[amenity=bus_station] { icon-image: bus-l.svg; - z-index: 4000; text-offset: 8; - font-size: 11; - z-index: 5000; + font-size: 10; + z-index: 27000; text: name; text-color: @label_dark; text-halo-radius: 1; @@ -722,10 +765,9 @@ node|z16-17[amenity=bus_station], area|z16-[amenity=bus_station] { } node|z16-17[amenity=bus_station]::int_name, area|z16-[amenity=bus_station]::int_name { - z-index: 4000; text-offset: 8; font-size: 9; - z-index: 5000; + z-index: 27000; text: int_name; text-color: @label_dark; text-halo-radius: 1; @@ -735,10 +777,9 @@ node|z16-17[amenity=bus_station]::int_name, area|z16-[amenity=bus_station]::int_ node|z18[amenity=bus_station], area|z18[amenity=bus_station] { icon-image: bus-l.svg; - z-index: 4000; + z-index: 27000; text-offset: 8; - font-size: 12; - z-index: 5000; + font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; @@ -746,12 +787,10 @@ node|z18[amenity=bus_station], area|z18[amenity=bus_station] { text-halo-color: @label_halo_light; } - node|z18[amenity=bus_station]::int_name, area|z18[amenity=bus_station]::int_name { - z-index: 4000; text-offset: 8; font-size: 9; - z-index: 5000; + z-index: 27000; text: int_name; text-color: @label_dark; text-halo-radius: 1; @@ -761,42 +800,38 @@ node|z18[amenity=bus_station]::int_name, area|z18[amenity=bus_station]::int_name node|z19-[amenity=bus_station], area|z19-[amenity=bus_station] { icon-image: bus-l.svg; - z-index: 9000; + z-index: 27000; text-offset: 10; - font-size: 12; - z-index: 9000; + font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - node|z19-[amenity=bus_station]::int_name, area|z19-[amenity=bus_station]::int_name { - z-index: 9000; text-offset: 10; - font-size: 10; - z-index: 9000; + font-size: 9; + z-index: 27000; text: int_name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; } - /* FERRY */ node|z14-15[amenity=ferry_terminal] { icon-image: ship-s.svg; - z-index: 10000; + z-index: 27000; } node|z16-[amenity=ferry_terminal] { icon-image: ship-m.svg; - z-index: 10000; + z-index: 27000; text-offset: 8; - font-size: 11; + font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; @@ -806,7 +841,7 @@ node|z16-[amenity=ferry_terminal] { node|z17[amenity=ferry_terminal] { icon-image: ship-l.svg; - z-index: 9000; + z-index: 27000; text-offset: 10; font-size: 12; text: name; @@ -818,7 +853,7 @@ node|z17[amenity=ferry_terminal] { node|z18-[amenity=ferry_terminal] { icon-image: ship-l.svg; - z-index: 9000; + z-index: 27000; text-offset: 10; font-size: 12; text: name; @@ -828,9 +863,6 @@ node|z18-[amenity=ferry_terminal] { text-halo-color: @label_halo_light; } - - - /* AIRPORTS */ area|z10[aeroway=airport][aerodrome=international], @@ -846,10 +878,9 @@ node|z10[aeroway=aerodrome][aerodrome=international] text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; - z-index: 10000; + z-index: 2900; fill-opacity: 1; - z-index: 100; - fill-color: @aerodrome; + } area|z11-14[aeroway=airport][aerodrome=international], @@ -859,15 +890,15 @@ node|z11-14[aeroway=aerodrome][aerodrome=international] { icon-image: airport-m.svg; text-offset: 7; - font-size: 11; + font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; - z-index: 10000; -} + z-index: 2900; +} area|z11-14[aeroway=airport][aerodrome=international]::int_name, area|z11-14[aeroway=aerodrome][aerodrome=international]::int_name, node|z11-14[aeroway=airport][aerodrome=international]::int_name, @@ -879,23 +910,24 @@ node|z11-14[aeroway=aerodrome][aerodrome=international]::int_name text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; - z-index: 10000; + z-index: 2900; } -area|z15-[aeroway=airport], -area|z15-[aeroway=aerodrome], -node|z15-[aeroway=airport], -node|z15-[aeroway=aerodrome] +area|z14-[aeroway=airport], +area|z14-[aeroway=aerodrome], +node|z14-[aeroway=airport], +node|z14-[aeroway=aerodrome] { icon-image: airport-l.svg; text-offset: 8; - font-size: 14; + font-size: 10; text: name; text-color: @label_dark; text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; - z-index: 10000; + z-index: 2900; + } area|z15-[aeroway=airport]::int_name, @@ -910,64 +942,68 @@ node|z15-[aeroway=aerodrome]::int_name text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; - z-index: 10000; + z-index: 2900; } -area|z10-11[aeroway=airport][aerodrome=international], -area|z10-11[aeroway=aerodrome][aerodrome=international] { - fill-opacity: 0.7; - z-index: 100; - fill-color: @aerodrome; +area|z10[aeroway=airport][aerodrome=international], +area|z10[aeroway=aerodrome][aerodrome=international] { + fill-opacity: 1; + fill-color: @aerodrome0; + fill-position: background; + z-index: 1; +} +area|z11[aeroway=airport][aerodrome=international], +area|z11[aeroway=aerodrome][aerodrome=international] { + fill-opacity: 1; + fill-color: @aerodrome1; + fill-position: background; + z-index: 1; } -area|z12[aeroway=airport][aerodrome=international], -area|z12[aeroway=aerodrome][aerodrome=international] { - fill-opacity: 0.6; - z-index: 100; - fill-color: @aerodrome; +area|z12-[aeroway=airport][aerodrome=international], +area|z12-[aeroway=aerodrome][aerodrome=international], +area|z12-[aeroway=airport], +area|z12-[aeroway=aerodrome] { + fill-opacity: 1; + fill-color: @aerodrome2; + fill-position: background; + z-index: 1; + } area|z13[aeroway=airport][aerodrome=international], -area|z13[aeroway=aerodrome][aerodrome=international] { - fill-opacity: 0.5; - z-index: 100; - fill-color: @aerodrome; +area|z13[aeroway=aerodrome][aerodrome=international], +area|z13[aeroway=airport], +area|z13[aeroway=aerodrome] { + fill-opacity: 1; + fill-color: @aerodrome3; + fill-position: background; + z-index: 1; + +} +area|z14[aeroway=airport][aerodrome=international], +area|z14[aeroway=aerodrome][aerodrome=international], +area|z14[aeroway=airport], +area|z14[aeroway=aerodrome] { + fill-opacity: 1; + fill-color: @aerodrome4; + fill-position: background; + z-index: 1; } -area|z14-[aeroway=airport][aerodrome=international], -area|z14-[aeroway=aerodrome][aerodrome=international], -area|z14-[aeroway=airport], -area|z14-[aeroway=aerodrome] { fill-opacity: 0.3; z-index: 100; fill-color: @aerodrome; } - -line|z12[aeroway=runway] { width: 1; opacity: 0.5; color: @unclassified; } -line|z13[aeroway=runway] { width: 1.5; opacity: 0.8; color: @unclassified; } -line|z14-16[aeroway=runway] { opacity: 1; width: 5; color: @unclassified; } -line|z17-[aeroway=runway] { width: 8; color: @unclassified; } - -line|z14[aeroway=taxiway] { width: 0.5; opacity: 0.6; color: @unclassified; } -line|z15-[aeroway=taxiway] { width: 1; opacity: 0.6; color: @unclassified; } - - - -/* TERMINAL -node|z10-[aeroway=terminal] { - icon-image: airport-l.svg; -} - -area|z10-[aeroway=terminal] { - fill-color: @building; -} -*/ - - - -/* -node|z17[aeroway=helipad], area|z17[aeroway=helipad] { icon-image: helipad-s.svg; z-index: 10000; } -node|z18-[aeroway=helipad], area|z18-[aeroway=helipad] { icon-image: helipad-m.svg; z-index: 10000; } -*/ +area|z15-19[aeroway=airport][aerodrome=international], +area|z15-19[aeroway=aerodrome][aerodrome=international], +area|z15-19[aeroway=airport], +area|z15-19[aeroway=aerodrome] { fill-opacity: 1; fill-color: @aerodrome5; fill-position: background;z-index: 1;} +line|z12[aeroway=runway] { width: 1; opacity: 0.5; color: @unclassified;z-index: 50; } +line|z13[aeroway=runway] { width: 1.5; opacity: 0.8; color: @unclassified; z-index: 50;} +line|z14-15[aeroway=runway] { opacity: 1; width: 2.4; color: @unclassified; z-index: 50;} +line|z16-[aeroway=runway] { width: 4; color: @unclassified;z-index: 50; } +line|z14[aeroway=taxiway] { width: 0.6; opacity: 0.6; color: @unclassified; z-index: 50;} +line|z15-[aeroway=taxiway] { width: 1.2; opacity: 0.6; color: @unclassified;z-index: 50; } /* AERIALWAYS */ @@ -978,8 +1014,8 @@ line|z14-15[aerialway=gondola], line|z14-15[aerialway=mixed_lift] { color: @aerialway; width: 0.5; - opacity: 0.6; - z-index: 6888; + opacity: 1; + z-index: 1050; } line|z16[aerialway=cable_car], @@ -988,8 +1024,8 @@ line|z16[aerialway=gondola], line|z16[aerialway=mixed_lift] { color: @aerialway; width: 1; - opacity: 0.7; - z-index: 6888; + opacity: 1; + z-index: 1050; } line|z17-[aerialway=cable_car], @@ -998,7 +1034,7 @@ line|z17-[aerialway=gondola], line|z17-[aerialway=mixed_lift] { color: @aerialway; width: 1; - z-index: 6888; + z-index: 1050; } line|z14[aerialway=cable_car]::dash, @@ -1009,8 +1045,8 @@ line|z14[aerialway=mixed_lift]::dash color: @aerialway; width: 2.5; opacity: 0.6; - z-index: 6887; - dashes: 1, 20; + z-index: 1049; + dashes: 0.9,18; } line|z15-[aerialway=cable_car]::dash, @@ -1019,8 +1055,8 @@ line|z15-[aerialway=gondola]::dash, line|z15-[aerialway=mixed_lift]::dash { color: @aerialway; width: 2.5; - z-index: 6887; - dashes: 1, 20; + z-index: 1049; + dashes: 0.9,18; } node|z14[aerialway=station], @@ -1029,7 +1065,7 @@ node|z14[aerialway=chair_lift], node|z14[aerialway=gondola], node|z14[aerialway=mixed_lift] { icon-image: cable-car-s.svg; - z-index: 10000;} + z-index: 26000;} node|z15[aerialway=station], node|z15[aerialway=cable_car], @@ -1037,7 +1073,7 @@ node|z15[aerialway=chair_lift], node|z15[aerialway=gondola], node|z15[aerialway=mixed_lift] { icon-image: cable-car-s.svg; - z-index: 10000; + z-index: 26000; text-offset: 6; font-size: 10; text: name; @@ -1045,7 +1081,6 @@ node|z15[aerialway=mixed_lift] { text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; - z-index: 10000; } node|z16-17[aerialway=station], @@ -1061,7 +1096,7 @@ node|z16-17[aerialway=mixed_lift]{ text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; - z-index: 10000; + z-index: 26000; } node|z18-[aerialway=station], @@ -1077,5 +1112,5 @@ node|z18[aerialway=mixed_lift] { text-halo-radius: 1; text-halo-opacity: 0.5; text-halo-color: @label_halo_light; - z-index: 10000; + z-index: 26000; } diff --git a/data/styles/clear/style-clear/6plus/route_from.png b/data/styles/clear/style-clear/6plus/route_from.png index f073e4df01..130060ea78 100644 Binary files a/data/styles/clear/style-clear/6plus/route_from.png and b/data/styles/clear/style-clear/6plus/route_from.png differ diff --git a/data/styles/clear/style-clear/6plus/route_to.png b/data/styles/clear/style-clear/6plus/route_to.png index 41d23aafad..4c3f8b727b 100644 Binary files a/data/styles/clear/style-clear/6plus/route_to.png and b/data/styles/clear/style-clear/6plus/route_to.png differ diff --git a/data/styles/clear/style-clear/colors.mapcss b/data/styles/clear/style-clear/colors.mapcss index 91346150ee..9677c18fa7 100644 --- a/data/styles/clear/style-clear/colors.mapcss +++ b/data/styles/clear/style-clear/colors.mapcss @@ -1,12 +1,12 @@ /* BASE */ @white: #ffffff; -@background: #DDDDCC; /* #EDEAE1; /* @background: #f1eee8; */ -@backgroundone: #DEDECD; +@background: #E3E1D2; /* E6E6D5 #EDEAE1; /* @background: #f1eee8; */ +/*@backgroundone: #DEDECD; /* BOUNDARIES */ -@border_country: #73736D; -@border_country_light: #73736D; -@border_region: #73736D; +@border_country: #63635C; +@border_country_light: #73726B; +@border_region: #73726B; /* ROADS */ @@ -23,14 +23,14 @@ @trunk_yellow_case: #CD764C; /* ORANGE ROADS BUNDLE */ -@trunk_orange: #FF5102; -@trunk_orange_hard: #F7632C; -@trunk_orange_medium: #F86B39; -@trunk_orange_light: #F87C4A; + @trunk_orange: #FF5919; + @trunk_orange_hard: #FF5E1F; + @trunk_orange_medium: #FF6626; + @trunk_orange_light: #FF7326;/*F57A45*/ @trunk_orange_case: #DDDDCC; -@primary_orange: #FF864E; -@primary_orange_medium: #FC9757; -@primary_orange_light: #FCA462; + @primary_orange: #FF8726; + @primary_orange_medium: #FF9440; +@primary_orange_light: #FFA14C; @primary_orange_case: #DDDDCC; @trunk_tunnel_orange: #FF8800; @@ -38,20 +38,20 @@ @primary_light: #FCD757; @secondary: #FFFFFF; @residential: #F8F8F8; -@tertiary: #F8F8F8; +@tertiary: #f9f9f9; @unclassified: #F8F8F8; @pedestrian: #F8F8F8; @footway: #F8F8F8; @cycleway: #FF87AD; @steps: #FFFFFF; @construction: #BBBBAA; -@track: #887744;/*888844*/ -@bridleway: #887744; +@track: #635730;/*888844*/ +@bridleway: #3D361E; /* bridges */ -@bridge_background: #EEEEDD; +@bridge_background: #E3E1D2; @bridge_casing: #808080; /* tunnels */ @@ -76,38 +76,54 @@ /* TRANSPORT */ -@railway_light: #BBBBAA; -@railway: #999988; +@railway_light: #B2B1A2; +@railway: #969586; @railway_dash: #EEEEEE; @railway_tunnel: #555555; @aerialway: #777777; @tram: #555555; @ferry: #4499Bb; -@aerodrome: #C1B1E1; + +/*aerodrome*/ +@aerodrome0: #D4BFF2; +@aerodrome1: #D4BFF2; +@aerodrome2: #D1C0EB; +@aerodrome3: #CFC1E8; +@aerodrome4: #CDC0E3; +@aerodrome5: #C8BCDE; /* NATURAL */ @glacier: #FFFFFF; -@water: #83C6D2; -@river: #6ea4bd; -@forest: #AABB66; -@park: #AABB66; /* #A4B275 #BCCC74*/ -@beach: #ffeeaa; - +@water: #8BD3E0; +@river: #36B0BF; +@forest: #AABF65; +@park: #AABF65; /* A5BF60 #A4B275 #BCCC74*/ +@beach: #FCEC7E; +/*forest-park*/ +@green0: #CFD5A8; +@green1: #C6CF93; +@green2: #BCC87E; +@green3: #B3C471; +@green4: #AEC26B; +@green5: #B0C270; /* BUILDINGS */ -@housename: #7F7F7F; -@building: #CCCCBE; -@building_dark: #BBBBAA; +@housename: #7F7E76; +@building: #C9C8BB; +@building_dark: #C2C0B3; /* LANDUSE */ -@pedestrian_area: #FFFFFF; -@unversity: #DDCCAA; -@hospital: #FFAAAA; -@industrial: #D1D1D1; -@sport: #CCCCAA; -@parking: #EeEeCC; + +@pedestrian_area: #E3E1D2; +@pedestrian_area_light: #EDEBDB; + +@unversity: #EBD8B0; +@hospital: #EBCECE;/*FADCDB*/ +@industrial: #E4E2EB; +@sport: #D1CDA7; +@parking: #F2F2CE; /* BARRIERS */ -@fence: #BBBBAA; +@fence: #7F7E76; /* LABELS COLORS */ @label_extra_dark: #000000; @@ -116,9 +132,9 @@ @label_light: #444444; @label_extra_light: #7F7F7F; -@label_halo_bg: #DDDDCC; -@label_halo_dark: #DDDDCC; -@label_halo_medium: #EEEEDD; +@label_halo_bg: #E3E1D2; +@label_halo_dark: #E3E1D2; +@label_halo_medium: #EDEBDB; @label_halo_light: #FFFFFF; @@ -141,7 +157,7 @@ @road_label_halo: #FFFFFF; @shield: #fff; @shield_halo: #498F46; -/* blue - #2E89B0; #498F46; #598DBE; */ +/* blue - #2E89B0; #687E94; #598DBE; */ @label_dark: #333333; @label_light: #444444; @@ -150,17 +166,17 @@ /* NATURAL LABELS */ @water_label: #4499Bb; @park_label: #3A7921; -@halo_park_lable: #fff; +@halo_park_lable: #FFFFFF; @halo_water_lable: #fff; /* UNIVERSAL HALO */ @label_halo: #FFFFFF; /* OTHER LABELS */ -@building_label: #7F7F7F; +@building_label: #656565; /* PISTE */ -@piste: #7766ff; +@piste: #C47AFF; @piste_novice: #11dd00; @piste_easy: #11dd00; @piste_intermadiate: #ff0000; diff --git a/data/styles/clear/style-clear/hdpi/route_from.png b/data/styles/clear/style-clear/hdpi/route_from.png index 793fa6b817..b457b0f2a5 100644 Binary files a/data/styles/clear/style-clear/hdpi/route_from.png and b/data/styles/clear/style-clear/hdpi/route_from.png differ diff --git a/data/styles/clear/style-clear/hdpi/route_to.png b/data/styles/clear/style-clear/hdpi/route_to.png index 718f6d1b0e..4b0ecaab94 100644 Binary files a/data/styles/clear/style-clear/hdpi/route_to.png and b/data/styles/clear/style-clear/hdpi/route_to.png differ diff --git a/data/styles/clear/style-clear/ldpi/route_from.png b/data/styles/clear/style-clear/ldpi/route_from.png index 541626a1d5..e305504f3b 100644 Binary files a/data/styles/clear/style-clear/ldpi/route_from.png and b/data/styles/clear/style-clear/ldpi/route_from.png differ diff --git a/data/styles/clear/style-clear/ldpi/route_to.png b/data/styles/clear/style-clear/ldpi/route_to.png index da6017cf44..4c87d967b2 100644 Binary files a/data/styles/clear/style-clear/ldpi/route_to.png and b/data/styles/clear/style-clear/ldpi/route_to.png differ diff --git a/data/styles/clear/style-clear/mdpi/route_from.png b/data/styles/clear/style-clear/mdpi/route_from.png index 8d22b8243d..c3d31ff777 100644 Binary files a/data/styles/clear/style-clear/mdpi/route_from.png and b/data/styles/clear/style-clear/mdpi/route_from.png differ diff --git a/data/styles/clear/style-clear/mdpi/route_to.png b/data/styles/clear/style-clear/mdpi/route_to.png index 581bb0e408..47d548989f 100644 Binary files a/data/styles/clear/style-clear/mdpi/route_to.png and b/data/styles/clear/style-clear/mdpi/route_to.png differ diff --git a/data/styles/clear/style-clear/symbols/alcohol-l.svg b/data/styles/clear/style-clear/symbols/alcohol-l.svg index c2e51faa7e..f02811ee18 100644 --- a/data/styles/clear/style-clear/symbols/alcohol-l.svg +++ b/data/styles/clear/style-clear/symbols/alcohol-l.svg @@ -1,14 +1,14 @@ - + alcohol-l Created with Sketch. - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/alcohol-m.svg b/data/styles/clear/style-clear/symbols/alcohol-m.svg index a9b561dbc3..1ddfa3d8fd 100644 --- a/data/styles/clear/style-clear/symbols/alcohol-m.svg +++ b/data/styles/clear/style-clear/symbols/alcohol-m.svg @@ -1,14 +1,14 @@ - + alcohol-m Created with Sketch. - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/alcohol-s.svg b/data/styles/clear/style-clear/symbols/alcohol-s.svg index 820631405a..9f872239fa 100644 --- a/data/styles/clear/style-clear/symbols/alcohol-s.svg +++ b/data/styles/clear/style-clear/symbols/alcohol-s.svg @@ -1,6 +1,6 @@ - + alcohol-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/alpine_hut-l.svg b/data/styles/clear/style-clear/symbols/alpine_hut-l.svg new file mode 100644 index 0000000000..71fbcdca72 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/alpine_hut-l.svg @@ -0,0 +1,16 @@ + + + + alpine_hut-l + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/alpine_hut-m.svg b/data/styles/clear/style-clear/symbols/alpine_hut-m.svg new file mode 100644 index 0000000000..1045f8b932 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/alpine_hut-m.svg @@ -0,0 +1,16 @@ + + + + alpine_hut-m + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/america-football-l.svg b/data/styles/clear/style-clear/symbols/america-football-l.svg index 67f0eb5a65..af06d96be2 100644 --- a/data/styles/clear/style-clear/symbols/america-football-l.svg +++ b/data/styles/clear/style-clear/symbols/america-football-l.svg @@ -1,6 +1,6 @@ - + america-football-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/america-football-m.svg b/data/styles/clear/style-clear/symbols/america-football-m.svg index ec5f9d43e2..6608d6f374 100644 --- a/data/styles/clear/style-clear/symbols/america-football-m.svg +++ b/data/styles/clear/style-clear/symbols/america-football-m.svg @@ -1,6 +1,6 @@ - + america-football-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/america-football-s.svg b/data/styles/clear/style-clear/symbols/america-football-s.svg new file mode 100644 index 0000000000..c4d9d88d74 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/america-football-s.svg @@ -0,0 +1,14 @@ + + + + america-football-s + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/archery-l.svg b/data/styles/clear/style-clear/symbols/archery-l.svg new file mode 100644 index 0000000000..76a05a7fb0 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/archery-l.svg @@ -0,0 +1,14 @@ + + + + archery-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/archery-m.svg b/data/styles/clear/style-clear/symbols/archery-m.svg new file mode 100644 index 0000000000..cd8927fd32 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/archery-m.svg @@ -0,0 +1,14 @@ + + + + archery-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/atm-l.svg b/data/styles/clear/style-clear/symbols/atm-l.svg index 1981c79502..dcf2e24d76 100644 --- a/data/styles/clear/style-clear/symbols/atm-l.svg +++ b/data/styles/clear/style-clear/symbols/atm-l.svg @@ -1,6 +1,6 @@ - + atm-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/atm-m.svg b/data/styles/clear/style-clear/symbols/atm-m.svg index 457665cfb5..18d8a15580 100644 --- a/data/styles/clear/style-clear/symbols/atm-m.svg +++ b/data/styles/clear/style-clear/symbols/atm-m.svg @@ -1,6 +1,6 @@ - + atm-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/atm-s.svg b/data/styles/clear/style-clear/symbols/atm-s.svg index 713c2afec6..688af7c172 100644 --- a/data/styles/clear/style-clear/symbols/atm-s.svg +++ b/data/styles/clear/style-clear/symbols/atm-s.svg @@ -1,6 +1,6 @@ - + atm-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/australian-football-l.svg b/data/styles/clear/style-clear/symbols/australian-football-l.svg new file mode 100644 index 0000000000..544de5e84b --- /dev/null +++ b/data/styles/clear/style-clear/symbols/australian-football-l.svg @@ -0,0 +1,14 @@ + + + + australian-football-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/australian-football-m.svg b/data/styles/clear/style-clear/symbols/australian-football-m.svg new file mode 100644 index 0000000000..7f4517b1b7 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/australian-football-m.svg @@ -0,0 +1,14 @@ + + + + australian-football-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bakery-l.svg b/data/styles/clear/style-clear/symbols/bakery-l.svg new file mode 100644 index 0000000000..9ae107b564 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/bakery-l.svg @@ -0,0 +1,14 @@ + + + + bakery-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bakery-m.svg b/data/styles/clear/style-clear/symbols/bakery-m.svg new file mode 100644 index 0000000000..5c6a2bfdb1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/bakery-m.svg @@ -0,0 +1,14 @@ + + + + bakery-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bank-l.svg b/data/styles/clear/style-clear/symbols/bank-l.svg index 297c734307..3b984ff746 100644 --- a/data/styles/clear/style-clear/symbols/bank-l.svg +++ b/data/styles/clear/style-clear/symbols/bank-l.svg @@ -1,6 +1,6 @@ - + bank-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/bank-m.svg b/data/styles/clear/style-clear/symbols/bank-m.svg index 45b3d09b85..151c4847cc 100644 --- a/data/styles/clear/style-clear/symbols/bank-m.svg +++ b/data/styles/clear/style-clear/symbols/bank-m.svg @@ -1,6 +1,6 @@ - + bank-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/bank-s.svg b/data/styles/clear/style-clear/symbols/bank-s.svg index a0bb1cc0a5..037534abae 100644 --- a/data/styles/clear/style-clear/symbols/bank-s.svg +++ b/data/styles/clear/style-clear/symbols/bank-s.svg @@ -1,16 +1,14 @@ - + bank-s Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/banknote-l.svg b/data/styles/clear/style-clear/symbols/banknote-l.svg index 2db7264e71..e1b9050db1 100644 --- a/data/styles/clear/style-clear/symbols/banknote-l.svg +++ b/data/styles/clear/style-clear/symbols/banknote-l.svg @@ -1,6 +1,6 @@ - + banknote-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/banknote-m.svg b/data/styles/clear/style-clear/symbols/banknote-m.svg index 877c4b2ee8..6f696b0073 100644 --- a/data/styles/clear/style-clear/symbols/banknote-m.svg +++ b/data/styles/clear/style-clear/symbols/banknote-m.svg @@ -1,6 +1,6 @@ - + banknote-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/bar-l.svg b/data/styles/clear/style-clear/symbols/bar-l.svg index e95b12e07d..94bb9b29a4 100644 --- a/data/styles/clear/style-clear/symbols/bar-l.svg +++ b/data/styles/clear/style-clear/symbols/bar-l.svg @@ -1,6 +1,6 @@ - + bar-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/bar-m.svg b/data/styles/clear/style-clear/symbols/bar-m.svg index 34211c9850..858a43cbd1 100644 --- a/data/styles/clear/style-clear/symbols/bar-m.svg +++ b/data/styles/clear/style-clear/symbols/bar-m.svg @@ -1,6 +1,6 @@ - + bar-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/bar-s.svg b/data/styles/clear/style-clear/symbols/bar-s.svg index 2b57de50e4..7221c0f977 100644 --- a/data/styles/clear/style-clear/symbols/bar-s.svg +++ b/data/styles/clear/style-clear/symbols/bar-s.svg @@ -1,6 +1,6 @@ - + bar-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/baseball-l.svg b/data/styles/clear/style-clear/symbols/baseball-l.svg index 1919ca13de..5fa812d4c7 100644 --- a/data/styles/clear/style-clear/symbols/baseball-l.svg +++ b/data/styles/clear/style-clear/symbols/baseball-l.svg @@ -1,6 +1,6 @@ - + baseball-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/baseball-m.svg b/data/styles/clear/style-clear/symbols/baseball-m.svg index 7768f0dc46..687dfd3632 100644 --- a/data/styles/clear/style-clear/symbols/baseball-m.svg +++ b/data/styles/clear/style-clear/symbols/baseball-m.svg @@ -1,6 +1,6 @@ - + baseball-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/baseball-s.svg b/data/styles/clear/style-clear/symbols/baseball-s.svg index ad1eb9dbb4..12c51b73ce 100644 --- a/data/styles/clear/style-clear/symbols/baseball-s.svg +++ b/data/styles/clear/style-clear/symbols/baseball-s.svg @@ -1,6 +1,6 @@ - + baseball-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/basketball-l.svg b/data/styles/clear/style-clear/symbols/basketball-l.svg index 44a8d9c759..12195efb4c 100644 --- a/data/styles/clear/style-clear/symbols/basketball-l.svg +++ b/data/styles/clear/style-clear/symbols/basketball-l.svg @@ -1,6 +1,6 @@ - + basketball-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/basketball-m.svg b/data/styles/clear/style-clear/symbols/basketball-m.svg index e992ce9add..9ef1a6e5cf 100644 --- a/data/styles/clear/style-clear/symbols/basketball-m.svg +++ b/data/styles/clear/style-clear/symbols/basketball-m.svg @@ -1,6 +1,6 @@ - + basketball-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/basketball-s.svg b/data/styles/clear/style-clear/symbols/basketball-s.svg index bb8476fb97..a15cfe6deb 100644 --- a/data/styles/clear/style-clear/symbols/basketball-s.svg +++ b/data/styles/clear/style-clear/symbols/basketball-s.svg @@ -1,6 +1,6 @@ - + basketball-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/bbq-l.svg b/data/styles/clear/style-clear/symbols/bbq-l.svg new file mode 100644 index 0000000000..abdf106e1a --- /dev/null +++ b/data/styles/clear/style-clear/symbols/bbq-l.svg @@ -0,0 +1,14 @@ + + + + bbq-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bbq-m.svg b/data/styles/clear/style-clear/symbols/bbq-m.svg new file mode 100644 index 0000000000..ffc219702e --- /dev/null +++ b/data/styles/clear/style-clear/symbols/bbq-m.svg @@ -0,0 +1,14 @@ + + + + bbq-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bcontrol-l.svg b/data/styles/clear/style-clear/symbols/bcontrol-l.svg new file mode 100644 index 0000000000..1ea69f1c75 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/bcontrol-l.svg @@ -0,0 +1,20 @@ + + + + bcontrol-l + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bcontrol-m.svg b/data/styles/clear/style-clear/symbols/bcontrol-m.svg index 8244645cf9..b870122ad9 100644 --- a/data/styles/clear/style-clear/symbols/bcontrol-m.svg +++ b/data/styles/clear/style-clear/symbols/bcontrol-m.svg @@ -1,22 +1,20 @@ - + bcontrol-m Created with Sketch. - - - - - - - - - - - - + + + + + + + + + + diff --git a/data/styles/clear/style-clear/symbols/bcontrol-s.svg b/data/styles/clear/style-clear/symbols/bcontrol-s.svg new file mode 100644 index 0000000000..08055d4269 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/bcontrol-s.svg @@ -0,0 +1,19 @@ + + + + bcontrol-s + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/beach-l.svg b/data/styles/clear/style-clear/symbols/beach-l.svg new file mode 100644 index 0000000000..1942534218 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/beach-l.svg @@ -0,0 +1,14 @@ + + + + beach-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/beach-m.svg b/data/styles/clear/style-clear/symbols/beach-m.svg new file mode 100644 index 0000000000..326c4d579f --- /dev/null +++ b/data/styles/clear/style-clear/symbols/beach-m.svg @@ -0,0 +1,14 @@ + + + + beach-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/beauty-l.svg b/data/styles/clear/style-clear/symbols/beauty-l.svg new file mode 100644 index 0000000000..edeff2bfda --- /dev/null +++ b/data/styles/clear/style-clear/symbols/beauty-l.svg @@ -0,0 +1,14 @@ + + + + beauty-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/beauty-m.svg b/data/styles/clear/style-clear/symbols/beauty-m.svg new file mode 100644 index 0000000000..b152dd3f26 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/beauty-m.svg @@ -0,0 +1,14 @@ + + + + beauty-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/beer-l.svg b/data/styles/clear/style-clear/symbols/beer-l.svg old mode 100644 new mode 100755 index 8bf2ece4ab..21266c561f --- a/data/styles/clear/style-clear/symbols/beer-l.svg +++ b/data/styles/clear/style-clear/symbols/beer-l.svg @@ -1,14 +1,18 @@ - + beer-l Created with Sketch. - - - + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/beer-m.svg b/data/styles/clear/style-clear/symbols/beer-m.svg old mode 100644 new mode 100755 index 8086c0b291..8906e3e4b9 --- a/data/styles/clear/style-clear/symbols/beer-m.svg +++ b/data/styles/clear/style-clear/symbols/beer-m.svg @@ -1,14 +1,18 @@ - + beer-m Created with Sketch. - - - + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/beer-s.svg b/data/styles/clear/style-clear/symbols/beer-s.svg index d65eaed025..15c4dc4ffa 100644 --- a/data/styles/clear/style-clear/symbols/beer-s.svg +++ b/data/styles/clear/style-clear/symbols/beer-s.svg @@ -1,14 +1,8 @@ - + beer-s Created with Sketch. - - - - - - - + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bicycle-l.svg b/data/styles/clear/style-clear/symbols/bicycle-l.svg index a3f479229d..560d4e2a4e 100644 --- a/data/styles/clear/style-clear/symbols/bicycle-l.svg +++ b/data/styles/clear/style-clear/symbols/bicycle-l.svg @@ -1,6 +1,6 @@ - + bicycle-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/bicycle-m.svg b/data/styles/clear/style-clear/symbols/bicycle-m.svg index 0141856c90..ce16686b8c 100644 --- a/data/styles/clear/style-clear/symbols/bicycle-m.svg +++ b/data/styles/clear/style-clear/symbols/bicycle-m.svg @@ -1,6 +1,6 @@ - + bicycle-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/bicycle-s.svg b/data/styles/clear/style-clear/symbols/bicycle-s.svg index 6407b26c2a..6f11f61440 100644 --- a/data/styles/clear/style-clear/symbols/bicycle-s.svg +++ b/data/styles/clear/style-clear/symbols/bicycle-s.svg @@ -1,6 +1,6 @@ - + bicycle-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/book-shop-l.svg b/data/styles/clear/style-clear/symbols/book-shop-l.svg new file mode 100644 index 0000000000..dbe04c7d9c --- /dev/null +++ b/data/styles/clear/style-clear/symbols/book-shop-l.svg @@ -0,0 +1,14 @@ + + + + book-shop-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/book-shop-m.svg b/data/styles/clear/style-clear/symbols/book-shop-m.svg new file mode 100644 index 0000000000..c886131ca3 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/book-shop-m.svg @@ -0,0 +1,14 @@ + + + + book-shop-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/book-shop-s.svg b/data/styles/clear/style-clear/symbols/book-shop-s.svg new file mode 100644 index 0000000000..2f97a3b11c --- /dev/null +++ b/data/styles/clear/style-clear/symbols/book-shop-s.svg @@ -0,0 +1,8 @@ + + + + book-shop-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/boundary_stone-l.svg b/data/styles/clear/style-clear/symbols/boundary_stone-l.svg new file mode 100644 index 0000000000..88a50136d1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/boundary_stone-l.svg @@ -0,0 +1,14 @@ + + + + boundary_stone-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/boundary_stone-m.svg b/data/styles/clear/style-clear/symbols/boundary_stone-m.svg new file mode 100644 index 0000000000..36d6623975 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/boundary_stone-m.svg @@ -0,0 +1,14 @@ + + + + boundary_stone-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bowls-l.svg b/data/styles/clear/style-clear/symbols/bowls-l.svg new file mode 100644 index 0000000000..80032c9804 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/bowls-l.svg @@ -0,0 +1,14 @@ + + + + bowls-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/bowls-m.svg b/data/styles/clear/style-clear/symbols/bowls-m.svg new file mode 100644 index 0000000000..4b9ded13bb --- /dev/null +++ b/data/styles/clear/style-clear/symbols/bowls-m.svg @@ -0,0 +1,14 @@ + + + + bowls-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/butcher-l.svg b/data/styles/clear/style-clear/symbols/butcher-l.svg new file mode 100644 index 0000000000..f475a176ed --- /dev/null +++ b/data/styles/clear/style-clear/symbols/butcher-l.svg @@ -0,0 +1,14 @@ + + + + butcher-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/butcher-m.svg b/data/styles/clear/style-clear/symbols/butcher-m.svg new file mode 100644 index 0000000000..a31eef173b --- /dev/null +++ b/data/styles/clear/style-clear/symbols/butcher-m.svg @@ -0,0 +1,14 @@ + + + + butcher-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/cafe-l.svg b/data/styles/clear/style-clear/symbols/cafe-l.svg index 3b452c3dee..6a2bbbd3ac 100644 --- a/data/styles/clear/style-clear/symbols/cafe-l.svg +++ b/data/styles/clear/style-clear/symbols/cafe-l.svg @@ -1,6 +1,6 @@ - + cafe-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/cafe-m.svg b/data/styles/clear/style-clear/symbols/cafe-m.svg index 14a3a8914b..4fa8bee328 100644 --- a/data/styles/clear/style-clear/symbols/cafe-m.svg +++ b/data/styles/clear/style-clear/symbols/cafe-m.svg @@ -1,6 +1,6 @@ - + cafe-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/cafe-s.svg b/data/styles/clear/style-clear/symbols/cafe-s.svg index e76c5f0946..f60d5e08cf 100644 --- a/data/styles/clear/style-clear/symbols/cafe-s.svg +++ b/data/styles/clear/style-clear/symbols/cafe-s.svg @@ -1,6 +1,6 @@ - + cafe-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/campsite-l.svg b/data/styles/clear/style-clear/symbols/campsite-l.svg index 6cf998d9c1..dce5f81f7e 100644 --- a/data/styles/clear/style-clear/symbols/campsite-l.svg +++ b/data/styles/clear/style-clear/symbols/campsite-l.svg @@ -1,6 +1,6 @@ - + campsite-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/campsite-m.svg b/data/styles/clear/style-clear/symbols/campsite-m.svg index 7b17385350..0520a7023b 100644 --- a/data/styles/clear/style-clear/symbols/campsite-m.svg +++ b/data/styles/clear/style-clear/symbols/campsite-m.svg @@ -1,6 +1,6 @@ - + campsite-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/campsite-s.svg b/data/styles/clear/style-clear/symbols/campsite-s.svg index ac8ab3d5ad..f92e20054f 100644 --- a/data/styles/clear/style-clear/symbols/campsite-s.svg +++ b/data/styles/clear/style-clear/symbols/campsite-s.svg @@ -1,6 +1,6 @@ - + campsite-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/car-repair-l.svg b/data/styles/clear/style-clear/symbols/car-repair-l.svg new file mode 100755 index 0000000000..0c7892005d --- /dev/null +++ b/data/styles/clear/style-clear/symbols/car-repair-l.svg @@ -0,0 +1,18 @@ + + + + car-repair-l + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/car-repair-m.svg b/data/styles/clear/style-clear/symbols/car-repair-m.svg new file mode 100755 index 0000000000..2558608e19 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/car-repair-m.svg @@ -0,0 +1,18 @@ + + + + car-repair-m + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/car-repair-s.svg b/data/styles/clear/style-clear/symbols/car-repair-s.svg new file mode 100644 index 0000000000..0b886153ae --- /dev/null +++ b/data/styles/clear/style-clear/symbols/car-repair-s.svg @@ -0,0 +1,8 @@ + + + + car-repair-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/car_sharing-l.svg b/data/styles/clear/style-clear/symbols/car_sharing-l.svg new file mode 100644 index 0000000000..a9c5a86d21 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/car_sharing-l.svg @@ -0,0 +1,14 @@ + + + + car_sharing-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/car_sharing-m.svg b/data/styles/clear/style-clear/symbols/car_sharing-m.svg new file mode 100644 index 0000000000..0b4db09d2a --- /dev/null +++ b/data/styles/clear/style-clear/symbols/car_sharing-m.svg @@ -0,0 +1,14 @@ + + + + car_sharing-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/caravan_site-l.svg b/data/styles/clear/style-clear/symbols/caravan_site-l.svg new file mode 100644 index 0000000000..de1bbddc7f --- /dev/null +++ b/data/styles/clear/style-clear/symbols/caravan_site-l.svg @@ -0,0 +1,14 @@ + + + + caravan_site-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/caravan_site-m.svg b/data/styles/clear/style-clear/symbols/caravan_site-m.svg new file mode 100644 index 0000000000..4bcd1d52d0 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/caravan_site-m.svg @@ -0,0 +1,14 @@ + + + + caravan_site-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/casino-l.svg b/data/styles/clear/style-clear/symbols/casino-l.svg new file mode 100644 index 0000000000..9d0c776912 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/casino-l.svg @@ -0,0 +1,14 @@ + + + + casino-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/casino-m.svg b/data/styles/clear/style-clear/symbols/casino-m.svg new file mode 100644 index 0000000000..733b4b86ec --- /dev/null +++ b/data/styles/clear/style-clear/symbols/casino-m.svg @@ -0,0 +1,14 @@ + + + + casino-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/casino-s.svg b/data/styles/clear/style-clear/symbols/casino-s.svg new file mode 100644 index 0000000000..738c72be33 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/casino-s.svg @@ -0,0 +1,8 @@ + + + + casino-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/cave-l.svg b/data/styles/clear/style-clear/symbols/cave-l.svg index 0de66ef01b..97d5eab61f 100644 --- a/data/styles/clear/style-clear/symbols/cave-l.svg +++ b/data/styles/clear/style-clear/symbols/cave-l.svg @@ -1,6 +1,6 @@ - + cave-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/cave-m.svg b/data/styles/clear/style-clear/symbols/cave-m.svg index 84119c320b..4b288e0996 100644 --- a/data/styles/clear/style-clear/symbols/cave-m.svg +++ b/data/styles/clear/style-clear/symbols/cave-m.svg @@ -1,6 +1,6 @@ - + cave-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/cave-s.svg b/data/styles/clear/style-clear/symbols/cave-s.svg index 4d082c45a9..61ac63a03e 100644 --- a/data/styles/clear/style-clear/symbols/cave-s.svg +++ b/data/styles/clear/style-clear/symbols/cave-s.svg @@ -1,6 +1,6 @@ - + cave-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/cemetery-l.svg b/data/styles/clear/style-clear/symbols/cemetery-l.svg index bdc54a6307..c747b6df30 100644 --- a/data/styles/clear/style-clear/symbols/cemetery-l.svg +++ b/data/styles/clear/style-clear/symbols/cemetery-l.svg @@ -1,11 +1,11 @@ - - cementry-l + + cemetery-l Created with Sketch. - + diff --git a/data/styles/clear/style-clear/symbols/cemetery-m.svg b/data/styles/clear/style-clear/symbols/cemetery-m.svg index 3a839809bd..4e00f91536 100644 --- a/data/styles/clear/style-clear/symbols/cemetery-m.svg +++ b/data/styles/clear/style-clear/symbols/cemetery-m.svg @@ -1,11 +1,11 @@ - - cementry-m + + cemetery-m Created with Sketch. - + diff --git a/data/styles/clear/style-clear/symbols/cemetery-s.svg b/data/styles/clear/style-clear/symbols/cemetery-s.svg index b8ca3e075a..e25fe59678 100644 --- a/data/styles/clear/style-clear/symbols/cemetery-s.svg +++ b/data/styles/clear/style-clear/symbols/cemetery-s.svg @@ -1,11 +1,11 @@ - - cementry-s + + cemetery-s Created with Sketch. - + diff --git a/data/styles/clear/style-clear/symbols/chemist-l.svg b/data/styles/clear/style-clear/symbols/chemist-l.svg new file mode 100644 index 0000000000..1b80c63c82 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/chemist-l.svg @@ -0,0 +1,14 @@ + + + + chemist-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/chemist-m.svg b/data/styles/clear/style-clear/symbols/chemist-m.svg new file mode 100644 index 0000000000..6b5a563e60 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/chemist-m.svg @@ -0,0 +1,14 @@ + + + + chemist-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/cinema-l.svg b/data/styles/clear/style-clear/symbols/cinema-l.svg index 67d2fc20e6..66bf235454 100644 --- a/data/styles/clear/style-clear/symbols/cinema-l.svg +++ b/data/styles/clear/style-clear/symbols/cinema-l.svg @@ -1,6 +1,6 @@ - + cinema-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/cinema-m.svg b/data/styles/clear/style-clear/symbols/cinema-m.svg index d21bfed3b7..cd777a494a 100644 --- a/data/styles/clear/style-clear/symbols/cinema-m.svg +++ b/data/styles/clear/style-clear/symbols/cinema-m.svg @@ -1,6 +1,6 @@ - + cinema-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/cinema-s.svg b/data/styles/clear/style-clear/symbols/cinema-s.svg index 4373d00455..084226cdad 100644 --- a/data/styles/clear/style-clear/symbols/cinema-s.svg +++ b/data/styles/clear/style-clear/symbols/cinema-s.svg @@ -1,6 +1,6 @@ - + cinema-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/clothes-l.svg b/data/styles/clear/style-clear/symbols/clothes-l.svg new file mode 100644 index 0000000000..7aa86c7dc3 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/clothes-l.svg @@ -0,0 +1,14 @@ + + + + clothes-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/clothes-m.svg b/data/styles/clear/style-clear/symbols/clothes-m.svg new file mode 100644 index 0000000000..e845b9aef2 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/clothes-m.svg @@ -0,0 +1,14 @@ + + + + clothes-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/college-l.svg b/data/styles/clear/style-clear/symbols/college-l.svg index 03fa7a0106..7bf7e9ad09 100644 --- a/data/styles/clear/style-clear/symbols/college-l.svg +++ b/data/styles/clear/style-clear/symbols/college-l.svg @@ -1,6 +1,6 @@ - + college-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/college-m.svg b/data/styles/clear/style-clear/symbols/college-m.svg index 9a54685894..3eb510b27d 100644 --- a/data/styles/clear/style-clear/symbols/college-m.svg +++ b/data/styles/clear/style-clear/symbols/college-m.svg @@ -1,6 +1,6 @@ - + college-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/college-s.svg b/data/styles/clear/style-clear/symbols/college-s.svg index 39fbbdd218..a317ce71c1 100644 --- a/data/styles/clear/style-clear/symbols/college-s.svg +++ b/data/styles/clear/style-clear/symbols/college-s.svg @@ -1,6 +1,6 @@ - + college-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/color_test2.sketch b/data/styles/clear/style-clear/symbols/color_test2.sketch new file mode 100644 index 0000000000..427022690a Binary files /dev/null and b/data/styles/clear/style-clear/symbols/color_test2.sketch differ diff --git a/data/styles/clear/style-clear/symbols/computer-l.svg b/data/styles/clear/style-clear/symbols/computer-l.svg new file mode 100644 index 0000000000..c324e6a292 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/computer-l.svg @@ -0,0 +1,14 @@ + + + + computer-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/computer-m.svg b/data/styles/clear/style-clear/symbols/computer-m.svg new file mode 100644 index 0000000000..8b539535f0 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/computer-m.svg @@ -0,0 +1,14 @@ + + + + computer-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/convenience-l.svg b/data/styles/clear/style-clear/symbols/convenience-l.svg new file mode 100644 index 0000000000..dd9865e906 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/convenience-l.svg @@ -0,0 +1,14 @@ + + + + convenience-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/convenience-m.svg b/data/styles/clear/style-clear/symbols/convenience-m.svg new file mode 100644 index 0000000000..d6c4e0c3d6 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/convenience-m.svg @@ -0,0 +1,14 @@ + + + + convenience-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/cricket-l.svg b/data/styles/clear/style-clear/symbols/cricket-l.svg new file mode 100644 index 0000000000..945b6d0e56 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/cricket-l.svg @@ -0,0 +1,14 @@ + + + + cricket-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/cricket-m.svg b/data/styles/clear/style-clear/symbols/cricket-m.svg new file mode 100644 index 0000000000..0bee681985 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/cricket-m.svg @@ -0,0 +1,14 @@ + + + + cricket-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/curling-l.svg b/data/styles/clear/style-clear/symbols/curling-l.svg new file mode 100644 index 0000000000..09b7713976 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/curling-l.svg @@ -0,0 +1,14 @@ + + + + curling-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/curling-m.svg b/data/styles/clear/style-clear/symbols/curling-m.svg new file mode 100644 index 0000000000..608ff01610 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/curling-m.svg @@ -0,0 +1,14 @@ + + + + curling-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/department_store-l.svg b/data/styles/clear/style-clear/symbols/department_store-l.svg new file mode 100644 index 0000000000..09d679a7d5 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/department_store-l.svg @@ -0,0 +1,14 @@ + + + + department_store-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/department_store-m.svg b/data/styles/clear/style-clear/symbols/department_store-m.svg new file mode 100644 index 0000000000..88073533d4 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/department_store-m.svg @@ -0,0 +1,14 @@ + + + + department_store-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/diving-l.svg b/data/styles/clear/style-clear/symbols/diving-l.svg new file mode 100644 index 0000000000..744dc79e62 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/diving-l.svg @@ -0,0 +1,14 @@ + + + + diving-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/diving-m.svg b/data/styles/clear/style-clear/symbols/diving-m.svg new file mode 100644 index 0000000000..d56006f9fe --- /dev/null +++ b/data/styles/clear/style-clear/symbols/diving-m.svg @@ -0,0 +1,14 @@ + + + + diving-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/dog_park-l.svg b/data/styles/clear/style-clear/symbols/dog_park-l.svg new file mode 100644 index 0000000000..fd8caae411 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/dog_park-l.svg @@ -0,0 +1,14 @@ + + + + dog_park-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/dog_park-m.svg b/data/styles/clear/style-clear/symbols/dog_park-m.svg new file mode 100644 index 0000000000..d638c78f5e --- /dev/null +++ b/data/styles/clear/style-clear/symbols/dog_park-m.svg @@ -0,0 +1,14 @@ + + + + dog_park-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/doityourself-l.svg b/data/styles/clear/style-clear/symbols/doityourself-l.svg new file mode 100644 index 0000000000..03f64e99db --- /dev/null +++ b/data/styles/clear/style-clear/symbols/doityourself-l.svg @@ -0,0 +1,14 @@ + + + + doityourself-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/doityourself-m.svg b/data/styles/clear/style-clear/symbols/doityourself-m.svg new file mode 100644 index 0000000000..eda8c3dd03 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/doityourself-m.svg @@ -0,0 +1,14 @@ + + + + doityourself-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/dot-m.svg b/data/styles/clear/style-clear/symbols/dot-m.svg index 55b0e04ded..81836212b5 100644 --- a/data/styles/clear/style-clear/symbols/dot-m.svg +++ b/data/styles/clear/style-clear/symbols/dot-m.svg @@ -1,19 +1,17 @@ - + dot-m Created with Sketch. - - - - - - - - - + + + + + + + diff --git a/data/styles/clear/style-clear/symbols/dot-s-light.svg b/data/styles/clear/style-clear/symbols/dot-s-light.svg index 511d360f47..2609f295a6 100644 --- a/data/styles/clear/style-clear/symbols/dot-s-light.svg +++ b/data/styles/clear/style-clear/symbols/dot-s-light.svg @@ -1,20 +1,18 @@ - + dot-s-light Created with Sketch. - - - - - - - - - - + + + + + + + + diff --git a/data/styles/clear/style-clear/symbols/dot-s.svg b/data/styles/clear/style-clear/symbols/dot-s.svg index c28f1d0636..305b66e454 100644 --- a/data/styles/clear/style-clear/symbols/dot-s.svg +++ b/data/styles/clear/style-clear/symbols/dot-s.svg @@ -1,20 +1,18 @@ - + dot-s Created with Sketch. - - - - - - - - - - + + + + + + + + diff --git a/data/styles/clear/style-clear/symbols/drinking-water-l.svg b/data/styles/clear/style-clear/symbols/drinking-water-l.svg index 3f2a51e554..c26c38d4a9 100644 --- a/data/styles/clear/style-clear/symbols/drinking-water-l.svg +++ b/data/styles/clear/style-clear/symbols/drinking-water-l.svg @@ -1,6 +1,6 @@ - + drinking-water-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/drinking-water-m.svg b/data/styles/clear/style-clear/symbols/drinking-water-m.svg index 8121e3adac..6efb474ba2 100644 --- a/data/styles/clear/style-clear/symbols/drinking-water-m.svg +++ b/data/styles/clear/style-clear/symbols/drinking-water-m.svg @@ -1,6 +1,6 @@ - + drinking-water-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/drinking-water-s.svg b/data/styles/clear/style-clear/symbols/drinking-water-s.svg index 4766fb21e3..666dd71763 100644 --- a/data/styles/clear/style-clear/symbols/drinking-water-s.svg +++ b/data/styles/clear/style-clear/symbols/drinking-water-s.svg @@ -1,6 +1,6 @@ - + drinking-water-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/electronics-l.svg b/data/styles/clear/style-clear/symbols/electronics-l.svg new file mode 100644 index 0000000000..87caae73af --- /dev/null +++ b/data/styles/clear/style-clear/symbols/electronics-l.svg @@ -0,0 +1,14 @@ + + + + electronics-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/electronics-m.svg b/data/styles/clear/style-clear/symbols/electronics-m.svg new file mode 100644 index 0000000000..1f6b6b29ef --- /dev/null +++ b/data/styles/clear/style-clear/symbols/electronics-m.svg @@ -0,0 +1,14 @@ + + + + electronics-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/embassy-l.svg b/data/styles/clear/style-clear/symbols/embassy-l.svg index d24db1ebd6..bd0dc633fa 100644 --- a/data/styles/clear/style-clear/symbols/embassy-l.svg +++ b/data/styles/clear/style-clear/symbols/embassy-l.svg @@ -1,6 +1,6 @@ - + embassy-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/embassy-m.svg b/data/styles/clear/style-clear/symbols/embassy-m.svg index b8845353fd..67f099df91 100644 --- a/data/styles/clear/style-clear/symbols/embassy-m.svg +++ b/data/styles/clear/style-clear/symbols/embassy-m.svg @@ -1,6 +1,6 @@ - + embassy-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/embassy-s.svg b/data/styles/clear/style-clear/symbols/embassy-s.svg index 880dc8c2ab..c196e97af4 100644 --- a/data/styles/clear/style-clear/symbols/embassy-s.svg +++ b/data/styles/clear/style-clear/symbols/embassy-s.svg @@ -1,6 +1,6 @@ - + embassy-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/fastfood-l.svg b/data/styles/clear/style-clear/symbols/fastfood-l.svg index 13725eed77..813c5598d5 100644 --- a/data/styles/clear/style-clear/symbols/fastfood-l.svg +++ b/data/styles/clear/style-clear/symbols/fastfood-l.svg @@ -1,6 +1,6 @@ - + fastfood-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/fastfood-m.svg b/data/styles/clear/style-clear/symbols/fastfood-m.svg index 3abe23623d..dc03c99ebe 100644 --- a/data/styles/clear/style-clear/symbols/fastfood-m.svg +++ b/data/styles/clear/style-clear/symbols/fastfood-m.svg @@ -1,6 +1,6 @@ - + fastfood-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/fastfood-s.svg b/data/styles/clear/style-clear/symbols/fastfood-s.svg index aba730e059..512744fd0b 100644 --- a/data/styles/clear/style-clear/symbols/fastfood-s.svg +++ b/data/styles/clear/style-clear/symbols/fastfood-s.svg @@ -1,6 +1,6 @@ - + fastfood-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/fire_station-l.svg b/data/styles/clear/style-clear/symbols/fire_station-l.svg new file mode 100644 index 0000000000..06b5140b5c --- /dev/null +++ b/data/styles/clear/style-clear/symbols/fire_station-l.svg @@ -0,0 +1,14 @@ + + + + fire_station-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/fire_station-m.svg b/data/styles/clear/style-clear/symbols/fire_station-m.svg new file mode 100644 index 0000000000..40a1af5a69 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/fire_station-m.svg @@ -0,0 +1,14 @@ + + + + fire_station-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/fire_station-s.svg b/data/styles/clear/style-clear/symbols/fire_station-s.svg new file mode 100644 index 0000000000..91393e2a23 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/fire_station-s.svg @@ -0,0 +1,8 @@ + + + + fire_station-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/florist-l.svg b/data/styles/clear/style-clear/symbols/florist-l.svg new file mode 100644 index 0000000000..a2f9f5da8b --- /dev/null +++ b/data/styles/clear/style-clear/symbols/florist-l.svg @@ -0,0 +1,14 @@ + + + + florist-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/florist-m.svg b/data/styles/clear/style-clear/symbols/florist-m.svg new file mode 100644 index 0000000000..4e3fefadf5 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/florist-m.svg @@ -0,0 +1,14 @@ + + + + florist-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/fountain-l.svg b/data/styles/clear/style-clear/symbols/fountain-l.svg index 04e019472f..03df4cf2d9 100644 --- a/data/styles/clear/style-clear/symbols/fountain-l.svg +++ b/data/styles/clear/style-clear/symbols/fountain-l.svg @@ -1,6 +1,6 @@ - - + + fountain-l Created with Sketch. @@ -8,14 +8,10 @@ - - - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/fountain-m.svg b/data/styles/clear/style-clear/symbols/fountain-m.svg index e6b41558e9..8e322576b4 100644 --- a/data/styles/clear/style-clear/symbols/fountain-m.svg +++ b/data/styles/clear/style-clear/symbols/fountain-m.svg @@ -1,6 +1,6 @@ - - + + fountain-m Created with Sketch. @@ -8,12 +8,10 @@ - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/fountain-s.svg b/data/styles/clear/style-clear/symbols/fountain-s.svg index 83113ccbdc..6394050672 100644 --- a/data/styles/clear/style-clear/symbols/fountain-s.svg +++ b/data/styles/clear/style-clear/symbols/fountain-s.svg @@ -1,6 +1,6 @@ - - + + fountain-s Created with Sketch. @@ -8,12 +8,10 @@ - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/fuel-l.svg b/data/styles/clear/style-clear/symbols/fuel-l.svg index 026595ca38..027288d765 100644 --- a/data/styles/clear/style-clear/symbols/fuel-l.svg +++ b/data/styles/clear/style-clear/symbols/fuel-l.svg @@ -1,6 +1,6 @@ - + fuel-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/fuel-m.svg b/data/styles/clear/style-clear/symbols/fuel-m.svg index c0c1b78697..b6beceb60d 100644 --- a/data/styles/clear/style-clear/symbols/fuel-m.svg +++ b/data/styles/clear/style-clear/symbols/fuel-m.svg @@ -1,6 +1,6 @@ - + fuel-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/fuel-s.svg b/data/styles/clear/style-clear/symbols/fuel-s.svg index 186e5df857..9ee7e9c156 100644 --- a/data/styles/clear/style-clear/symbols/fuel-s.svg +++ b/data/styles/clear/style-clear/symbols/fuel-s.svg @@ -1,6 +1,6 @@ - + fuel-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/furniture-l.svg b/data/styles/clear/style-clear/symbols/furniture-l.svg new file mode 100644 index 0000000000..37ddaa5b1c --- /dev/null +++ b/data/styles/clear/style-clear/symbols/furniture-l.svg @@ -0,0 +1,14 @@ + + + + furniture-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/furniture-m.svg b/data/styles/clear/style-clear/symbols/furniture-m.svg new file mode 100644 index 0000000000..32d51ff7c3 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/furniture-m.svg @@ -0,0 +1,14 @@ + + + + furniture-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/gallery-l.svg b/data/styles/clear/style-clear/symbols/gallery-l.svg index 52ae7eacb9..5b7fd1eb17 100644 --- a/data/styles/clear/style-clear/symbols/gallery-l.svg +++ b/data/styles/clear/style-clear/symbols/gallery-l.svg @@ -1,6 +1,6 @@ - + gallery-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/gallery-m.svg b/data/styles/clear/style-clear/symbols/gallery-m.svg index 23890967cd..ae735174e9 100644 --- a/data/styles/clear/style-clear/symbols/gallery-m.svg +++ b/data/styles/clear/style-clear/symbols/gallery-m.svg @@ -1,6 +1,6 @@ - + gallery-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/gallery-s.svg b/data/styles/clear/style-clear/symbols/gallery-s.svg index be89bde4c6..f9a6a91c67 100644 --- a/data/styles/clear/style-clear/symbols/gallery-s.svg +++ b/data/styles/clear/style-clear/symbols/gallery-s.svg @@ -1,6 +1,6 @@ - + gallery-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/garden-l.svg b/data/styles/clear/style-clear/symbols/garden-l.svg index 35310d13bf..f181c5322e 100644 --- a/data/styles/clear/style-clear/symbols/garden-l.svg +++ b/data/styles/clear/style-clear/symbols/garden-l.svg @@ -1,16 +1,14 @@ - + garden-l Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/garden-m.svg b/data/styles/clear/style-clear/symbols/garden-m.svg index 9bcbdcb62a..a31fec1421 100644 --- a/data/styles/clear/style-clear/symbols/garden-m.svg +++ b/data/styles/clear/style-clear/symbols/garden-m.svg @@ -1,16 +1,14 @@ - + garden-m Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/garden-s.svg b/data/styles/clear/style-clear/symbols/garden-s.svg index 0d6eee8994..3d5d59bcee 100644 --- a/data/styles/clear/style-clear/symbols/garden-s.svg +++ b/data/styles/clear/style-clear/symbols/garden-s.svg @@ -1,16 +1,14 @@ - + garden-s Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/garden_center-l.svg b/data/styles/clear/style-clear/symbols/garden_center-l.svg new file mode 100644 index 0000000000..235d748f7d --- /dev/null +++ b/data/styles/clear/style-clear/symbols/garden_center-l.svg @@ -0,0 +1,14 @@ + + + + garden_center-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/garden_center-m.svg b/data/styles/clear/style-clear/symbols/garden_center-m.svg new file mode 100644 index 0000000000..08d571bd07 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/garden_center-m.svg @@ -0,0 +1,14 @@ + + + + garden_center-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/gate-l.svg b/data/styles/clear/style-clear/symbols/gate-l.svg new file mode 100644 index 0000000000..a4865180d1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/gate-l.svg @@ -0,0 +1,14 @@ + + + + gate-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/gate-m.svg b/data/styles/clear/style-clear/symbols/gate-m.svg new file mode 100644 index 0000000000..1d9ef8bd87 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/gate-m.svg @@ -0,0 +1,14 @@ + + + + gate-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/gift-l.svg b/data/styles/clear/style-clear/symbols/gift-l.svg new file mode 100644 index 0000000000..4cab46d5a5 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/gift-l.svg @@ -0,0 +1,14 @@ + + + + gift-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/gift-m.svg b/data/styles/clear/style-clear/symbols/gift-m.svg new file mode 100644 index 0000000000..647a5450b8 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/gift-m.svg @@ -0,0 +1,14 @@ + + + + gift-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/golf-l.svg b/data/styles/clear/style-clear/symbols/golf-l.svg index 0219a47684..5f8034cbf9 100644 --- a/data/styles/clear/style-clear/symbols/golf-l.svg +++ b/data/styles/clear/style-clear/symbols/golf-l.svg @@ -1,6 +1,6 @@ - + golf-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/golf-m.svg b/data/styles/clear/style-clear/symbols/golf-m.svg index af017c9553..3fe997525c 100644 --- a/data/styles/clear/style-clear/symbols/golf-m.svg +++ b/data/styles/clear/style-clear/symbols/golf-m.svg @@ -1,6 +1,6 @@ - + golf-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/golf-s.svg b/data/styles/clear/style-clear/symbols/golf-s.svg index 9c99fadab7..06dc6f0c6f 100644 --- a/data/styles/clear/style-clear/symbols/golf-s.svg +++ b/data/styles/clear/style-clear/symbols/golf-s.svg @@ -1,6 +1,6 @@ - + golf-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/greengrocer-l.svg b/data/styles/clear/style-clear/symbols/greengrocer-l.svg new file mode 100644 index 0000000000..c1114fceff --- /dev/null +++ b/data/styles/clear/style-clear/symbols/greengrocer-l.svg @@ -0,0 +1,14 @@ + + + + greengrocer-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/greengrocer-m.svg b/data/styles/clear/style-clear/symbols/greengrocer-m.svg new file mode 100644 index 0000000000..b784be4841 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/greengrocer-m.svg @@ -0,0 +1,14 @@ + + + + greengrocer-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/grocery-l.svg b/data/styles/clear/style-clear/symbols/grocery-l.svg index 22e9a6a238..0a8d73ea4a 100644 --- a/data/styles/clear/style-clear/symbols/grocery-l.svg +++ b/data/styles/clear/style-clear/symbols/grocery-l.svg @@ -1,6 +1,6 @@ - + grocery-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/grocery-m.svg b/data/styles/clear/style-clear/symbols/grocery-m.svg index f16a373cc8..ab4d2f6674 100644 --- a/data/styles/clear/style-clear/symbols/grocery-m.svg +++ b/data/styles/clear/style-clear/symbols/grocery-m.svg @@ -1,6 +1,6 @@ - + grocery-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/grocery-s.svg b/data/styles/clear/style-clear/symbols/grocery-s.svg index a60b856e2a..0d37f91bd5 100644 --- a/data/styles/clear/style-clear/symbols/grocery-s.svg +++ b/data/styles/clear/style-clear/symbols/grocery-s.svg @@ -1,6 +1,6 @@ - + grocery-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/hairdresser-l.svg b/data/styles/clear/style-clear/symbols/hairdresser-l.svg new file mode 100644 index 0000000000..dc3bda1582 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/hairdresser-l.svg @@ -0,0 +1,14 @@ + + + + hairdresser-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/hairdresser-m.svg b/data/styles/clear/style-clear/symbols/hairdresser-m.svg new file mode 100644 index 0000000000..ae87a9246d --- /dev/null +++ b/data/styles/clear/style-clear/symbols/hairdresser-m.svg @@ -0,0 +1,14 @@ + + + + hairdresser-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/hardware-l.svg b/data/styles/clear/style-clear/symbols/hardware-l.svg new file mode 100644 index 0000000000..26c215eece --- /dev/null +++ b/data/styles/clear/style-clear/symbols/hardware-l.svg @@ -0,0 +1,14 @@ + + + + hardware-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/hardware-m.svg b/data/styles/clear/style-clear/symbols/hardware-m.svg new file mode 100644 index 0000000000..0b54c5a2ca --- /dev/null +++ b/data/styles/clear/style-clear/symbols/hardware-m.svg @@ -0,0 +1,14 @@ + + + + hardware-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/heliport-l.svg b/data/styles/clear/style-clear/symbols/heliport-l.svg new file mode 100644 index 0000000000..e51ec898fc --- /dev/null +++ b/data/styles/clear/style-clear/symbols/heliport-l.svg @@ -0,0 +1,12 @@ + + + + heliport-l + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/heliport-m.svg b/data/styles/clear/style-clear/symbols/heliport-m.svg new file mode 100644 index 0000000000..89173cb40e --- /dev/null +++ b/data/styles/clear/style-clear/symbols/heliport-m.svg @@ -0,0 +1,13 @@ + + + + heliport-m + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/heliport-s.svg b/data/styles/clear/style-clear/symbols/heliport-s.svg new file mode 100644 index 0000000000..09993548fb --- /dev/null +++ b/data/styles/clear/style-clear/symbols/heliport-s.svg @@ -0,0 +1,12 @@ + + + + heliport-s + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/historic-ship-l.svg b/data/styles/clear/style-clear/symbols/historic-ship-l.svg new file mode 100644 index 0000000000..e98c223fd2 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/historic-ship-l.svg @@ -0,0 +1,14 @@ + + + + historic-ship-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/historic-ship-m.svg b/data/styles/clear/style-clear/symbols/historic-ship-m.svg new file mode 100644 index 0000000000..7e2f06d907 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/historic-ship-m.svg @@ -0,0 +1,14 @@ + + + + historic-ship-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/hospital-l.svg b/data/styles/clear/style-clear/symbols/hospital-l.svg index 6011000b32..22fb7fb4b2 100644 --- a/data/styles/clear/style-clear/symbols/hospital-l.svg +++ b/data/styles/clear/style-clear/symbols/hospital-l.svg @@ -1,6 +1,6 @@ - + hospital-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/hospital-m.svg b/data/styles/clear/style-clear/symbols/hospital-m.svg index 4bae1c9620..fea2f89044 100644 --- a/data/styles/clear/style-clear/symbols/hospital-m.svg +++ b/data/styles/clear/style-clear/symbols/hospital-m.svg @@ -1,6 +1,6 @@ - + hospital-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/hospital-s.svg b/data/styles/clear/style-clear/symbols/hospital-s.svg index 464c515a13..191881843d 100644 --- a/data/styles/clear/style-clear/symbols/hospital-s.svg +++ b/data/styles/clear/style-clear/symbols/hospital-s.svg @@ -1,6 +1,6 @@ - + hospital-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/hotel-l.svg b/data/styles/clear/style-clear/symbols/hotel-l.svg index cb14d957a6..aa6efb586c 100644 --- a/data/styles/clear/style-clear/symbols/hotel-l.svg +++ b/data/styles/clear/style-clear/symbols/hotel-l.svg @@ -1,6 +1,6 @@ - + hotel-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/hotel-m.svg b/data/styles/clear/style-clear/symbols/hotel-m.svg index 12437fe887..177cbce4fe 100644 --- a/data/styles/clear/style-clear/symbols/hotel-m.svg +++ b/data/styles/clear/style-clear/symbols/hotel-m.svg @@ -1,6 +1,6 @@ - + hotel-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/hotel-s.svg b/data/styles/clear/style-clear/symbols/hotel-s.svg index 6b7d79891f..727db6388b 100644 --- a/data/styles/clear/style-clear/symbols/hotel-s.svg +++ b/data/styles/clear/style-clear/symbols/hotel-s.svg @@ -1,6 +1,6 @@ - + hotel-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/hunting-tower-l.svg b/data/styles/clear/style-clear/symbols/hunting-tower-l.svg new file mode 100755 index 0000000000..a2d83ef315 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/hunting-tower-l.svg @@ -0,0 +1,18 @@ + + + + hunting-tower-l + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/hunting-tower-m.svg b/data/styles/clear/style-clear/symbols/hunting-tower-m.svg new file mode 100755 index 0000000000..81deec076a --- /dev/null +++ b/data/styles/clear/style-clear/symbols/hunting-tower-m.svg @@ -0,0 +1,18 @@ + + + + hunting-tower-m + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/hunting-tower-s.svg b/data/styles/clear/style-clear/symbols/hunting-tower-s.svg new file mode 100644 index 0000000000..2653eddbac --- /dev/null +++ b/data/styles/clear/style-clear/symbols/hunting-tower-s.svg @@ -0,0 +1,8 @@ + + + + hunting-tower-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/information-l.svg b/data/styles/clear/style-clear/symbols/information-l.svg index 692b247d32..552865d8ec 100644 --- a/data/styles/clear/style-clear/symbols/information-l.svg +++ b/data/styles/clear/style-clear/symbols/information-l.svg @@ -1,6 +1,6 @@ - + information-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/information-m.svg b/data/styles/clear/style-clear/symbols/information-m.svg index b9a9b28919..92d3ea840e 100644 --- a/data/styles/clear/style-clear/symbols/information-m.svg +++ b/data/styles/clear/style-clear/symbols/information-m.svg @@ -1,6 +1,6 @@ - + information-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/information-s.svg b/data/styles/clear/style-clear/symbols/information-s.svg index 61e69cbe07..bcfd4f26bf 100644 --- a/data/styles/clear/style-clear/symbols/information-s.svg +++ b/data/styles/clear/style-clear/symbols/information-s.svg @@ -1,6 +1,6 @@ - + information-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/jewelry-l.svg b/data/styles/clear/style-clear/symbols/jewelry-l.svg new file mode 100644 index 0000000000..1cf195b902 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/jewelry-l.svg @@ -0,0 +1,14 @@ + + + + jewelry-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/jewelry-m.svg b/data/styles/clear/style-clear/symbols/jewelry-m.svg new file mode 100644 index 0000000000..d08f967c74 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/jewelry-m.svg @@ -0,0 +1,14 @@ + + + + jewelry-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/kindergarten-l.svg b/data/styles/clear/style-clear/symbols/kindergarten-l.svg index 5a0997757c..25fe546cd9 100644 --- a/data/styles/clear/style-clear/symbols/kindergarten-l.svg +++ b/data/styles/clear/style-clear/symbols/kindergarten-l.svg @@ -1,6 +1,6 @@ - + kindergarten-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/kindergarten-m.svg b/data/styles/clear/style-clear/symbols/kindergarten-m.svg index 062ae9cf3e..946ce2dc67 100644 --- a/data/styles/clear/style-clear/symbols/kindergarten-m.svg +++ b/data/styles/clear/style-clear/symbols/kindergarten-m.svg @@ -1,6 +1,6 @@ - + kindergarten-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/kindergarten-s.svg b/data/styles/clear/style-clear/symbols/kindergarten-s.svg index 4961a884bd..b7ffa902d9 100644 --- a/data/styles/clear/style-clear/symbols/kindergarten-s.svg +++ b/data/styles/clear/style-clear/symbols/kindergarten-s.svg @@ -1,6 +1,6 @@ - + kindergarten-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/kiosk-l.svg b/data/styles/clear/style-clear/symbols/kiosk-l.svg new file mode 100644 index 0000000000..e8e262a2aa --- /dev/null +++ b/data/styles/clear/style-clear/symbols/kiosk-l.svg @@ -0,0 +1,14 @@ + + + + kiosk-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/kiosk-m.svg b/data/styles/clear/style-clear/symbols/kiosk-m.svg new file mode 100644 index 0000000000..31a1397cf8 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/kiosk-m.svg @@ -0,0 +1,14 @@ + + + + kiosk-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/laundry-l.svg b/data/styles/clear/style-clear/symbols/laundry-l.svg index a73f13e604..94dae25fea 100755 --- a/data/styles/clear/style-clear/symbols/laundry-l.svg +++ b/data/styles/clear/style-clear/symbols/laundry-l.svg @@ -1,17 +1,16 @@ - - - - - - - - - - - - + + + + laundry-l + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/laundry-m.svg b/data/styles/clear/style-clear/symbols/laundry-m.svg index 1320986bb9..8a191d5751 100755 --- a/data/styles/clear/style-clear/symbols/laundry-m.svg +++ b/data/styles/clear/style-clear/symbols/laundry-m.svg @@ -1,15 +1,16 @@ - - - - - - - - - - - - + + + + laundry-m + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/library-l.svg b/data/styles/clear/style-clear/symbols/library-l.svg index 11c91ff10f..a548d17932 100644 --- a/data/styles/clear/style-clear/symbols/library-l.svg +++ b/data/styles/clear/style-clear/symbols/library-l.svg @@ -1,6 +1,6 @@ - + library-l Created with Sketch. @@ -8,7 +8,8 @@ - + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/library-m.svg b/data/styles/clear/style-clear/symbols/library-m.svg index bce2cea040..01d5d78da0 100644 --- a/data/styles/clear/style-clear/symbols/library-m.svg +++ b/data/styles/clear/style-clear/symbols/library-m.svg @@ -1,6 +1,6 @@ - + library-m Created with Sketch. @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/library-s.svg b/data/styles/clear/style-clear/symbols/library-s.svg index 5456d5f080..2a039f33f3 100644 --- a/data/styles/clear/style-clear/symbols/library-s.svg +++ b/data/styles/clear/style-clear/symbols/library-s.svg @@ -1,6 +1,6 @@ - + library-s Created with Sketch. @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/lift_gate-l.svg b/data/styles/clear/style-clear/symbols/lift_gate-l.svg new file mode 100644 index 0000000000..389d268abd --- /dev/null +++ b/data/styles/clear/style-clear/symbols/lift_gate-l.svg @@ -0,0 +1,14 @@ + + + + lift_gate-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/lift_gate-m.svg b/data/styles/clear/style-clear/symbols/lift_gate-m.svg new file mode 100644 index 0000000000..4b8c7759b1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/lift_gate-m.svg @@ -0,0 +1,14 @@ + + + + lift_gate-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/lighthouse-l.svg b/data/styles/clear/style-clear/symbols/lighthouse-l.svg index 9f6d7a0ae8..5a1d2313cd 100644 --- a/data/styles/clear/style-clear/symbols/lighthouse-l.svg +++ b/data/styles/clear/style-clear/symbols/lighthouse-l.svg @@ -1,6 +1,6 @@ - + lighthouse-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/lighthouse-m.svg b/data/styles/clear/style-clear/symbols/lighthouse-m.svg index 36eee26010..c37cc8f7c6 100644 --- a/data/styles/clear/style-clear/symbols/lighthouse-m.svg +++ b/data/styles/clear/style-clear/symbols/lighthouse-m.svg @@ -1,6 +1,6 @@ - + lighthouse-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/lighthouse-s.svg b/data/styles/clear/style-clear/symbols/lighthouse-s.svg index 42330b04a7..3ba3648ffd 100644 --- a/data/styles/clear/style-clear/symbols/lighthouse-s.svg +++ b/data/styles/clear/style-clear/symbols/lighthouse-s.svg @@ -1,6 +1,6 @@ - + lighthouse-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/mail-l.svg b/data/styles/clear/style-clear/symbols/mail-l.svg index 3a5ebbb303..fd76776160 100644 --- a/data/styles/clear/style-clear/symbols/mail-l.svg +++ b/data/styles/clear/style-clear/symbols/mail-l.svg @@ -1,6 +1,6 @@ - + mail-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/mail-m.svg b/data/styles/clear/style-clear/symbols/mail-m.svg index 61a5b0cb69..4c7f7b1456 100644 --- a/data/styles/clear/style-clear/symbols/mail-m.svg +++ b/data/styles/clear/style-clear/symbols/mail-m.svg @@ -1,6 +1,6 @@ - + mail-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/mail-s.svg b/data/styles/clear/style-clear/symbols/mail-s.svg index 08e4b8486d..005a33f779 100644 --- a/data/styles/clear/style-clear/symbols/mail-s.svg +++ b/data/styles/clear/style-clear/symbols/mail-s.svg @@ -1,6 +1,6 @@ - + mail-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/marketplace-l.svg b/data/styles/clear/style-clear/symbols/marketplace-l.svg new file mode 100644 index 0000000000..7a27774177 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/marketplace-l.svg @@ -0,0 +1,14 @@ + + + + marketplace-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/marketplace-m.svg b/data/styles/clear/style-clear/symbols/marketplace-m.svg new file mode 100644 index 0000000000..84d6d1bfd1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/marketplace-m.svg @@ -0,0 +1,14 @@ + + + + marketplace-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/military-l.svg b/data/styles/clear/style-clear/symbols/military-l.svg index 6125af9799..e02806758d 100644 --- a/data/styles/clear/style-clear/symbols/military-l.svg +++ b/data/styles/clear/style-clear/symbols/military-l.svg @@ -1,19 +1,14 @@ - - - millitary-l + + + military-l Created with Sketch. - + - - - - - - + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/military-m.svg b/data/styles/clear/style-clear/symbols/military-m.svg index d6dba43a82..2acc091383 100644 --- a/data/styles/clear/style-clear/symbols/military-m.svg +++ b/data/styles/clear/style-clear/symbols/military-m.svg @@ -1,19 +1,14 @@ - - - millitary-m + + + military-m Created with Sketch. - + - - - - - - + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/military-s.svg b/data/styles/clear/style-clear/symbols/military-s.svg index 1336e0c9cd..602973073f 100644 --- a/data/styles/clear/style-clear/symbols/military-s.svg +++ b/data/styles/clear/style-clear/symbols/military-s.svg @@ -1,19 +1,14 @@ - - - millitary-s + + + military-s Created with Sketch. - + - - - - - - + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/mobile_phone-l.svg b/data/styles/clear/style-clear/symbols/mobile_phone-l.svg new file mode 100644 index 0000000000..e5ec653bbb --- /dev/null +++ b/data/styles/clear/style-clear/symbols/mobile_phone-l.svg @@ -0,0 +1,14 @@ + + + + mobile_phone-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/mobile_phone-m.svg b/data/styles/clear/style-clear/symbols/mobile_phone-m.svg new file mode 100644 index 0000000000..37d40cfb32 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/mobile_phone-m.svg @@ -0,0 +1,14 @@ + + + + mobile_phone-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/monument-l.svg b/data/styles/clear/style-clear/symbols/monument-l.svg index de13ebd49a..7e44dd8ffc 100644 --- a/data/styles/clear/style-clear/symbols/monument-l.svg +++ b/data/styles/clear/style-clear/symbols/monument-l.svg @@ -1,6 +1,6 @@ - + monument-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/monument-m.svg b/data/styles/clear/style-clear/symbols/monument-m.svg index 290fa54a21..ecf6de53fa 100644 --- a/data/styles/clear/style-clear/symbols/monument-m.svg +++ b/data/styles/clear/style-clear/symbols/monument-m.svg @@ -1,6 +1,6 @@ - + monument-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/monument-s.svg b/data/styles/clear/style-clear/symbols/monument-s.svg index f8a311376e..9e54000f49 100644 --- a/data/styles/clear/style-clear/symbols/monument-s.svg +++ b/data/styles/clear/style-clear/symbols/monument-s.svg @@ -1,6 +1,6 @@ - + monument-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/motel-l.svg b/data/styles/clear/style-clear/symbols/motel-l.svg new file mode 100644 index 0000000000..ef3a37d094 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/motel-l.svg @@ -0,0 +1,14 @@ + + + + motel-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/motel-m.svg b/data/styles/clear/style-clear/symbols/motel-m.svg new file mode 100644 index 0000000000..3bc4e3ce13 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/motel-m.svg @@ -0,0 +1,14 @@ + + + + motel-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/museum-l.svg b/data/styles/clear/style-clear/symbols/museum-l.svg index 9eab95e186..abe0ee61cc 100644 --- a/data/styles/clear/style-clear/symbols/museum-l.svg +++ b/data/styles/clear/style-clear/symbols/museum-l.svg @@ -1,6 +1,6 @@ - + museum-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/museum-m.svg b/data/styles/clear/style-clear/symbols/museum-m.svg index 75beab17b0..d3ae23e85c 100644 --- a/data/styles/clear/style-clear/symbols/museum-m.svg +++ b/data/styles/clear/style-clear/symbols/museum-m.svg @@ -1,6 +1,6 @@ - + museum-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/museum-s.svg b/data/styles/clear/style-clear/symbols/museum-s.svg index 62e3eac9de..8c04b519dd 100644 --- a/data/styles/clear/style-clear/symbols/museum-s.svg +++ b/data/styles/clear/style-clear/symbols/museum-s.svg @@ -1,6 +1,6 @@ - + museum-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/none.svg b/data/styles/clear/style-clear/symbols/none.svg index 5a9a954ab1..07bf72d5f2 100644 --- a/data/styles/clear/style-clear/symbols/none.svg +++ b/data/styles/clear/style-clear/symbols/none.svg @@ -1,6 +1,6 @@ - + none Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/npark-l.svg b/data/styles/clear/style-clear/symbols/npark-l.svg index 48e9fe068a..f4c14e1c03 100644 --- a/data/styles/clear/style-clear/symbols/npark-l.svg +++ b/data/styles/clear/style-clear/symbols/npark-l.svg @@ -1,18 +1,16 @@ - + npark-l Created with Sketch. - - - - - - - - + + + + + + diff --git a/data/styles/clear/style-clear/symbols/npark-m.svg b/data/styles/clear/style-clear/symbols/npark-m.svg index 0a1605465f..b5801bea0a 100644 --- a/data/styles/clear/style-clear/symbols/npark-m.svg +++ b/data/styles/clear/style-clear/symbols/npark-m.svg @@ -1,18 +1,16 @@ - + npark-m Created with Sketch. - - - - - - - - + + + + + + diff --git a/data/styles/clear/style-clear/symbols/npark-s.svg b/data/styles/clear/style-clear/symbols/npark-s.svg index 05a52d92f9..2bd64cdbce 100644 --- a/data/styles/clear/style-clear/symbols/npark-s.svg +++ b/data/styles/clear/style-clear/symbols/npark-s.svg @@ -1,16 +1,16 @@ - + npark-s Created with Sketch. - - - - - - + + + + + + diff --git a/data/styles/clear/style-clear/symbols/nparkF-l.svg b/data/styles/clear/style-clear/symbols/nparkF-l.svg index 27d832ec07..015ba7265e 100644 --- a/data/styles/clear/style-clear/symbols/nparkF-l.svg +++ b/data/styles/clear/style-clear/symbols/nparkF-l.svg @@ -1,16 +1,12 @@ - + nparkF-l Created with Sketch. - - - - - - - + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/nparkF-m .svg b/data/styles/clear/style-clear/symbols/nparkF-m .svg new file mode 100644 index 0000000000..f164f87a60 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/nparkF-m .svg @@ -0,0 +1,14 @@ + + + + nparkF-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/nparkF-m.svg b/data/styles/clear/style-clear/symbols/nparkF-m.svg index bb4fc09983..a1d146778a 100644 --- a/data/styles/clear/style-clear/symbols/nparkF-m.svg +++ b/data/styles/clear/style-clear/symbols/nparkF-m.svg @@ -1,16 +1,14 @@ - - nparkF-m + + nparkF-m Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/nparkF-s.svg b/data/styles/clear/style-clear/symbols/nparkF-s.svg index 6e68d478d6..d4513bfa8d 100644 --- a/data/styles/clear/style-clear/symbols/nparkF-s.svg +++ b/data/styles/clear/style-clear/symbols/nparkF-s.svg @@ -1,16 +1,12 @@ - + nparkF-s Created with Sketch. - - - - - - - + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/office-l.svg b/data/styles/clear/style-clear/symbols/office-l.svg new file mode 100644 index 0000000000..13d2ffcfc1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/office-l.svg @@ -0,0 +1,12 @@ + + + + office-l + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/office-m.svg b/data/styles/clear/style-clear/symbols/office-m.svg new file mode 100644 index 0000000000..cd44c60e07 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/office-m.svg @@ -0,0 +1,12 @@ + + + + office-m + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/office-s.svg b/data/styles/clear/style-clear/symbols/office-s.svg new file mode 100644 index 0000000000..f7d4f088e1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/office-s.svg @@ -0,0 +1,12 @@ + + + + office-s + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/optician-l.svg b/data/styles/clear/style-clear/symbols/optician-l.svg new file mode 100644 index 0000000000..4ab9fd687d --- /dev/null +++ b/data/styles/clear/style-clear/symbols/optician-l.svg @@ -0,0 +1,14 @@ + + + + optician-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/optician-m.svg b/data/styles/clear/style-clear/symbols/optician-m.svg new file mode 100644 index 0000000000..5a90a153b1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/optician-m.svg @@ -0,0 +1,14 @@ + + + + optician-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/park-l.svg b/data/styles/clear/style-clear/symbols/park-l.svg index 1ed591c375..96ac8b5c69 100644 --- a/data/styles/clear/style-clear/symbols/park-l.svg +++ b/data/styles/clear/style-clear/symbols/park-l.svg @@ -1,16 +1,14 @@ - + park-l Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/park-m.svg b/data/styles/clear/style-clear/symbols/park-m.svg index e80e23f317..4cb9417e3b 100644 --- a/data/styles/clear/style-clear/symbols/park-m.svg +++ b/data/styles/clear/style-clear/symbols/park-m.svg @@ -1,16 +1,14 @@ - + park-m Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/park-s.svg b/data/styles/clear/style-clear/symbols/park-s.svg index 5985bc5698..847e37fb9e 100644 --- a/data/styles/clear/style-clear/symbols/park-s.svg +++ b/data/styles/clear/style-clear/symbols/park-s.svg @@ -1,16 +1,14 @@ - + park-s Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/parking-meter-l.svg b/data/styles/clear/style-clear/symbols/parking-meter-l.svg new file mode 100644 index 0000000000..728c73be13 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/parking-meter-l.svg @@ -0,0 +1,19 @@ + + + + parking-meter-l + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/parking-meter-m.svg b/data/styles/clear/style-clear/symbols/parking-meter-m.svg new file mode 100644 index 0000000000..29a4f7f014 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/parking-meter-m.svg @@ -0,0 +1,14 @@ + + + + parking-meter-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/peak-l.svg b/data/styles/clear/style-clear/symbols/peak-l.svg index 1c3cc243f1..e034cb4507 100644 --- a/data/styles/clear/style-clear/symbols/peak-l.svg +++ b/data/styles/clear/style-clear/symbols/peak-l.svg @@ -1,6 +1,6 @@ - + peak-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/peak-m.svg b/data/styles/clear/style-clear/symbols/peak-m.svg index ab61d09476..49476090cd 100644 --- a/data/styles/clear/style-clear/symbols/peak-m.svg +++ b/data/styles/clear/style-clear/symbols/peak-m.svg @@ -1,6 +1,6 @@ - + peak-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/peak-s.svg b/data/styles/clear/style-clear/symbols/peak-s.svg index f86850e915..787f109822 100644 --- a/data/styles/clear/style-clear/symbols/peak-s.svg +++ b/data/styles/clear/style-clear/symbols/peak-s.svg @@ -1,6 +1,6 @@ - + peak-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/peakt-l.svg b/data/styles/clear/style-clear/symbols/peakt-l.svg index d8b6c95fb8..ad5fdc3b6d 100644 --- a/data/styles/clear/style-clear/symbols/peakt-l.svg +++ b/data/styles/clear/style-clear/symbols/peakt-l.svg @@ -1,6 +1,6 @@ - + peakt-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/peakt-m.svg b/data/styles/clear/style-clear/symbols/peakt-m.svg index 267f70ed5d..f06f774576 100644 --- a/data/styles/clear/style-clear/symbols/peakt-m.svg +++ b/data/styles/clear/style-clear/symbols/peakt-m.svg @@ -1,6 +1,6 @@ - + peakt-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/peakt-s.svg b/data/styles/clear/style-clear/symbols/peakt-s.svg index f472e358cd..95d62e9dfc 100644 --- a/data/styles/clear/style-clear/symbols/peakt-s.svg +++ b/data/styles/clear/style-clear/symbols/peakt-s.svg @@ -1,6 +1,6 @@ - + peakt-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/pharmacy-l.svg b/data/styles/clear/style-clear/symbols/pharmacy-l.svg index be8f1ca80a..d6be362bdb 100644 --- a/data/styles/clear/style-clear/symbols/pharmacy-l.svg +++ b/data/styles/clear/style-clear/symbols/pharmacy-l.svg @@ -1,6 +1,6 @@ - + pharmacy-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/pharmacy-m.svg b/data/styles/clear/style-clear/symbols/pharmacy-m.svg index 5b04516129..7bb17776bd 100644 --- a/data/styles/clear/style-clear/symbols/pharmacy-m.svg +++ b/data/styles/clear/style-clear/symbols/pharmacy-m.svg @@ -1,6 +1,6 @@ - + pharmacy-m Created with Sketch. @@ -8,10 +8,10 @@ - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/phone-l.svg b/data/styles/clear/style-clear/symbols/phone-l.svg index afbb7216fb..ac2c99865d 100644 --- a/data/styles/clear/style-clear/symbols/phone-l.svg +++ b/data/styles/clear/style-clear/symbols/phone-l.svg @@ -1,6 +1,6 @@ - + phone-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/phone-m.svg b/data/styles/clear/style-clear/symbols/phone-m.svg index 50f8542d4c..49471edd25 100644 --- a/data/styles/clear/style-clear/symbols/phone-m.svg +++ b/data/styles/clear/style-clear/symbols/phone-m.svg @@ -1,6 +1,6 @@ - + phone-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/phone-s.svg b/data/styles/clear/style-clear/symbols/phone-s.svg index b007b0278b..e5e917ddbe 100644 --- a/data/styles/clear/style-clear/symbols/phone-s.svg +++ b/data/styles/clear/style-clear/symbols/phone-s.svg @@ -1,6 +1,6 @@ - + phone-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/picnic-l.svg b/data/styles/clear/style-clear/symbols/picnic-l.svg new file mode 100644 index 0000000000..21b23e8bcc --- /dev/null +++ b/data/styles/clear/style-clear/symbols/picnic-l.svg @@ -0,0 +1,16 @@ + + + + picnic-l + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/picnic-m.svg b/data/styles/clear/style-clear/symbols/picnic-m.svg new file mode 100644 index 0000000000..d8609fff63 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/picnic-m.svg @@ -0,0 +1,14 @@ + + + + picnic-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/picnic-s.svg b/data/styles/clear/style-clear/symbols/picnic-s.svg new file mode 100644 index 0000000000..6cfd9671dc --- /dev/null +++ b/data/styles/clear/style-clear/symbols/picnic-s.svg @@ -0,0 +1,14 @@ + + + + picnic-s + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/pitch-l.svg b/data/styles/clear/style-clear/symbols/pitch-l.svg index 053b931561..07931f7537 100644 --- a/data/styles/clear/style-clear/symbols/pitch-l.svg +++ b/data/styles/clear/style-clear/symbols/pitch-l.svg @@ -1,6 +1,6 @@ - + pitch-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/pitch-m.svg b/data/styles/clear/style-clear/symbols/pitch-m.svg index c8cd71d4b6..9ae3290094 100644 --- a/data/styles/clear/style-clear/symbols/pitch-m.svg +++ b/data/styles/clear/style-clear/symbols/pitch-m.svg @@ -1,6 +1,6 @@ - + pitch-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/pitch-s.svg b/data/styles/clear/style-clear/symbols/pitch-s.svg index 0f08384f3e..f87f42ba21 100644 --- a/data/styles/clear/style-clear/symbols/pitch-s.svg +++ b/data/styles/clear/style-clear/symbols/pitch-s.svg @@ -1,6 +1,6 @@ - + pitch-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/place-of-worship-l.svg b/data/styles/clear/style-clear/symbols/place-of-worship-l.svg index a053039572..24b4b9c5a9 100644 --- a/data/styles/clear/style-clear/symbols/place-of-worship-l.svg +++ b/data/styles/clear/style-clear/symbols/place-of-worship-l.svg @@ -1,6 +1,6 @@ - + place-of-worship-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/place-of-worship-m.svg b/data/styles/clear/style-clear/symbols/place-of-worship-m.svg index ab8ebab2b9..311f5f48eb 100644 --- a/data/styles/clear/style-clear/symbols/place-of-worship-m.svg +++ b/data/styles/clear/style-clear/symbols/place-of-worship-m.svg @@ -1,6 +1,6 @@ - + place-of-worship-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/place-of-worship-s.svg b/data/styles/clear/style-clear/symbols/place-of-worship-s.svg index 38e9e6e69f..8a573373d0 100644 --- a/data/styles/clear/style-clear/symbols/place-of-worship-s.svg +++ b/data/styles/clear/style-clear/symbols/place-of-worship-s.svg @@ -1,6 +1,6 @@ - + place-of-worship-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/police-l.svg b/data/styles/clear/style-clear/symbols/police-l.svg index bc02020dd5..ecae1eb9a7 100644 --- a/data/styles/clear/style-clear/symbols/police-l.svg +++ b/data/styles/clear/style-clear/symbols/police-l.svg @@ -1,6 +1,6 @@ - + police-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/police-m.svg b/data/styles/clear/style-clear/symbols/police-m.svg index 65f8721aad..1c71083197 100644 --- a/data/styles/clear/style-clear/symbols/police-m.svg +++ b/data/styles/clear/style-clear/symbols/police-m.svg @@ -1,6 +1,6 @@ - + police-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/police-s.svg b/data/styles/clear/style-clear/symbols/police-s.svg index 4706310dd1..5416197136 100644 --- a/data/styles/clear/style-clear/symbols/police-s.svg +++ b/data/styles/clear/style-clear/symbols/police-s.svg @@ -1,6 +1,6 @@ - + police-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/postbox-l.svg b/data/styles/clear/style-clear/symbols/postbox-l.svg new file mode 100644 index 0000000000..a2245b219f --- /dev/null +++ b/data/styles/clear/style-clear/symbols/postbox-l.svg @@ -0,0 +1,14 @@ + + + + postbox-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/postbox-m.svg b/data/styles/clear/style-clear/symbols/postbox-m.svg new file mode 100644 index 0000000000..5a5128dea3 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/postbox-m.svg @@ -0,0 +1,14 @@ + + + + postbox-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/pub-l.svg b/data/styles/clear/style-clear/symbols/pub-l.svg index 9f5fb6b63b..c4562e047f 100644 --- a/data/styles/clear/style-clear/symbols/pub-l.svg +++ b/data/styles/clear/style-clear/symbols/pub-l.svg @@ -1,6 +1,6 @@ - + pub-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/pub-m.svg b/data/styles/clear/style-clear/symbols/pub-m.svg index c37ea3b7bd..f369f2d1e9 100644 --- a/data/styles/clear/style-clear/symbols/pub-m.svg +++ b/data/styles/clear/style-clear/symbols/pub-m.svg @@ -1,6 +1,6 @@ - + pub-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/pub-s.svg b/data/styles/clear/style-clear/symbols/pub-s.svg index 0a5fb87f39..bd6a2fba78 100644 --- a/data/styles/clear/style-clear/symbols/pub-s.svg +++ b/data/styles/clear/style-clear/symbols/pub-s.svg @@ -1,6 +1,6 @@ - + pub-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/recycling-l.svg b/data/styles/clear/style-clear/symbols/recycling-l.svg index 1af617015e..6ee6cf1d77 100644 --- a/data/styles/clear/style-clear/symbols/recycling-l.svg +++ b/data/styles/clear/style-clear/symbols/recycling-l.svg @@ -1,6 +1,6 @@ - + recycling-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/recycling-m.svg b/data/styles/clear/style-clear/symbols/recycling-m.svg index b6923906e0..f3059f9e5b 100644 --- a/data/styles/clear/style-clear/symbols/recycling-m.svg +++ b/data/styles/clear/style-clear/symbols/recycling-m.svg @@ -1,6 +1,6 @@ - + recycling-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/recycling-s.svg b/data/styles/clear/style-clear/symbols/recycling-s.svg index 939a835df3..a8b13ac6bc 100644 --- a/data/styles/clear/style-clear/symbols/recycling-s.svg +++ b/data/styles/clear/style-clear/symbols/recycling-s.svg @@ -1,6 +1,6 @@ - + recycling-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/remains-l.svg b/data/styles/clear/style-clear/symbols/remains-l.svg new file mode 100644 index 0000000000..c6c51a1b72 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/remains-l.svg @@ -0,0 +1,15 @@ + + + + remains-l + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/remains-m.svg b/data/styles/clear/style-clear/symbols/remains-m.svg new file mode 100644 index 0000000000..164a552141 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/remains-m.svg @@ -0,0 +1,15 @@ + + + + remains-m + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/remains-s.svg b/data/styles/clear/style-clear/symbols/remains-s.svg new file mode 100644 index 0000000000..c1794c510e --- /dev/null +++ b/data/styles/clear/style-clear/symbols/remains-s.svg @@ -0,0 +1,15 @@ + + + + remains-s + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/restaurant-l.svg b/data/styles/clear/style-clear/symbols/restaurant-l.svg index 0ec81a4fa2..2db3abf92a 100644 --- a/data/styles/clear/style-clear/symbols/restaurant-l.svg +++ b/data/styles/clear/style-clear/symbols/restaurant-l.svg @@ -1,6 +1,6 @@ - + restaurant-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/restaurant-m.svg b/data/styles/clear/style-clear/symbols/restaurant-m.svg index 63afd1e673..2d7b34f63a 100644 --- a/data/styles/clear/style-clear/symbols/restaurant-m.svg +++ b/data/styles/clear/style-clear/symbols/restaurant-m.svg @@ -1,6 +1,6 @@ - + restaurant-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/restaurant-s.svg b/data/styles/clear/style-clear/symbols/restaurant-s.svg index bd22f3ef8a..2dfe91a59d 100644 --- a/data/styles/clear/style-clear/symbols/restaurant-s.svg +++ b/data/styles/clear/style-clear/symbols/restaurant-s.svg @@ -1,6 +1,6 @@ - + restaurant-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/school-l.svg b/data/styles/clear/style-clear/symbols/school-l.svg index 20bf8b5148..af0870b514 100644 --- a/data/styles/clear/style-clear/symbols/school-l.svg +++ b/data/styles/clear/style-clear/symbols/school-l.svg @@ -1,6 +1,6 @@ - + school-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/school-m.svg b/data/styles/clear/style-clear/symbols/school-m.svg index 9c663faa1b..aebcad165f 100644 --- a/data/styles/clear/style-clear/symbols/school-m.svg +++ b/data/styles/clear/style-clear/symbols/school-m.svg @@ -1,6 +1,6 @@ - + school-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/school-s.svg b/data/styles/clear/style-clear/symbols/school-s.svg index 5de5bc9c30..71c7d7e9a6 100644 --- a/data/styles/clear/style-clear/symbols/school-s.svg +++ b/data/styles/clear/style-clear/symbols/school-s.svg @@ -1,6 +1,6 @@ - + school-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/shoes-l.svg b/data/styles/clear/style-clear/symbols/shoes-l.svg new file mode 100644 index 0000000000..8583cd3ec8 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/shoes-l.svg @@ -0,0 +1,14 @@ + + + + shoes-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/shoes-m.svg b/data/styles/clear/style-clear/symbols/shoes-m.svg new file mode 100644 index 0000000000..ec211b59bb --- /dev/null +++ b/data/styles/clear/style-clear/symbols/shoes-m.svg @@ -0,0 +1,14 @@ + + + + shoes-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/shop-bicycle-l.svg b/data/styles/clear/style-clear/symbols/shop-bicycle-l.svg new file mode 100644 index 0000000000..0638879f1f --- /dev/null +++ b/data/styles/clear/style-clear/symbols/shop-bicycle-l.svg @@ -0,0 +1,14 @@ + + + + shop-bicycle-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/shop-bicycle-m.svg b/data/styles/clear/style-clear/symbols/shop-bicycle-m.svg new file mode 100644 index 0000000000..13cd39c075 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/shop-bicycle-m.svg @@ -0,0 +1,14 @@ + + + + shop-bicycle-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/shop-l.svg b/data/styles/clear/style-clear/symbols/shop-l.svg index 14169b1f5e..6e854dbb98 100644 --- a/data/styles/clear/style-clear/symbols/shop-l.svg +++ b/data/styles/clear/style-clear/symbols/shop-l.svg @@ -1,6 +1,6 @@ - + shop-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/shop-m.svg b/data/styles/clear/style-clear/symbols/shop-m.svg index e4571957cb..9ee99c4035 100644 --- a/data/styles/clear/style-clear/symbols/shop-m.svg +++ b/data/styles/clear/style-clear/symbols/shop-m.svg @@ -1,6 +1,6 @@ - + shop-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/shop-s.svg b/data/styles/clear/style-clear/symbols/shop-s.svg index d64c9c2595..dda14266b8 100644 --- a/data/styles/clear/style-clear/symbols/shop-s.svg +++ b/data/styles/clear/style-clear/symbols/shop-s.svg @@ -1,6 +1,6 @@ - + shop-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/skiing-l.svg b/data/styles/clear/style-clear/symbols/skiing-l.svg index 283f67e528..524108988e 100644 --- a/data/styles/clear/style-clear/symbols/skiing-l.svg +++ b/data/styles/clear/style-clear/symbols/skiing-l.svg @@ -1,6 +1,6 @@ - + skiing-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/skiing-m.svg b/data/styles/clear/style-clear/symbols/skiing-m.svg index 10971400ed..7385c3b9c7 100644 --- a/data/styles/clear/style-clear/symbols/skiing-m.svg +++ b/data/styles/clear/style-clear/symbols/skiing-m.svg @@ -1,6 +1,6 @@ - + skiing-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/skiing-s.svg b/data/styles/clear/style-clear/symbols/skiing-s.svg index 94c4912bd5..3d193da508 100644 --- a/data/styles/clear/style-clear/symbols/skiing-s.svg +++ b/data/styles/clear/style-clear/symbols/skiing-s.svg @@ -1,6 +1,6 @@ - + skiing-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/soccer-l.svg b/data/styles/clear/style-clear/symbols/soccer-l.svg index e4a9c21ef0..2a255d649b 100644 --- a/data/styles/clear/style-clear/symbols/soccer-l.svg +++ b/data/styles/clear/style-clear/symbols/soccer-l.svg @@ -1,6 +1,6 @@ - + soccer-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/soccer-m.svg b/data/styles/clear/style-clear/symbols/soccer-m.svg index c17e3f8f74..5a3b52d109 100644 --- a/data/styles/clear/style-clear/symbols/soccer-m.svg +++ b/data/styles/clear/style-clear/symbols/soccer-m.svg @@ -1,6 +1,6 @@ - + soccer-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/soccer-s.svg b/data/styles/clear/style-clear/symbols/soccer-s.svg index ae2b77d6f9..1b19ed6f35 100644 --- a/data/styles/clear/style-clear/symbols/soccer-s.svg +++ b/data/styles/clear/style-clear/symbols/soccer-s.svg @@ -1,6 +1,6 @@ - + soccer-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/sports-l.svg b/data/styles/clear/style-clear/symbols/sports-l.svg new file mode 100644 index 0000000000..de824ca65a --- /dev/null +++ b/data/styles/clear/style-clear/symbols/sports-l.svg @@ -0,0 +1,14 @@ + + + + sports-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/sports-m.svg b/data/styles/clear/style-clear/symbols/sports-m.svg new file mode 100644 index 0000000000..e1a91a8cc9 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/sports-m.svg @@ -0,0 +1,14 @@ + + + + sports-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/star-l.svg b/data/styles/clear/style-clear/symbols/star-l.svg index c39fc66ae0..5ff4cc3f8b 100644 --- a/data/styles/clear/style-clear/symbols/star-l.svg +++ b/data/styles/clear/style-clear/symbols/star-l.svg @@ -1,21 +1,19 @@ - + star-l Created with Sketch. - - - - - - - - - - - + + + + + + + + + diff --git a/data/styles/clear/style-clear/symbols/star-m.svg b/data/styles/clear/style-clear/symbols/star-m.svg index 75da5ac573..9fb4c8f04b 100644 --- a/data/styles/clear/style-clear/symbols/star-m.svg +++ b/data/styles/clear/style-clear/symbols/star-m.svg @@ -1,18 +1,16 @@ - + star-m Created with Sketch. - - - - - - - - + + + + + + diff --git a/data/styles/clear/style-clear/symbols/star-s.svg b/data/styles/clear/style-clear/symbols/star-s.svg index 14f0ea2205..26a35e9ee8 100644 --- a/data/styles/clear/style-clear/symbols/star-s.svg +++ b/data/styles/clear/style-clear/symbols/star-s.svg @@ -1,18 +1,16 @@ - + star-s Created with Sketch. - - - - - - - - + + + + + + diff --git a/data/styles/clear/style-clear/symbols/sweets-l.svg b/data/styles/clear/style-clear/symbols/sweets-l.svg new file mode 100644 index 0000000000..fda7de9d98 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/sweets-l.svg @@ -0,0 +1,14 @@ + + + + sweets-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/sweets-m.svg b/data/styles/clear/style-clear/symbols/sweets-m.svg new file mode 100644 index 0000000000..b2ace25d9a --- /dev/null +++ b/data/styles/clear/style-clear/symbols/sweets-m.svg @@ -0,0 +1,14 @@ + + + + sweets-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/swimming-l.svg b/data/styles/clear/style-clear/symbols/swimming-l.svg index 7af693668b..4d9146f909 100644 --- a/data/styles/clear/style-clear/symbols/swimming-l.svg +++ b/data/styles/clear/style-clear/symbols/swimming-l.svg @@ -1,6 +1,6 @@ - + swimming-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/swimming-m.svg b/data/styles/clear/style-clear/symbols/swimming-m.svg index 3cf0ae5d7a..bd947eb836 100644 --- a/data/styles/clear/style-clear/symbols/swimming-m.svg +++ b/data/styles/clear/style-clear/symbols/swimming-m.svg @@ -1,6 +1,6 @@ - + swimming-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/swimming-s.svg b/data/styles/clear/style-clear/symbols/swimming-s.svg index dfe7f02390..711165e4a2 100644 --- a/data/styles/clear/style-clear/symbols/swimming-s.svg +++ b/data/styles/clear/style-clear/symbols/swimming-s.svg @@ -1,6 +1,6 @@ - + swimming-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/taxi-l.svg b/data/styles/clear/style-clear/symbols/taxi-l.svg new file mode 100644 index 0000000000..c130620c29 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/taxi-l.svg @@ -0,0 +1,14 @@ + + + + taxi-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/taxi-m.svg b/data/styles/clear/style-clear/symbols/taxi-m.svg new file mode 100644 index 0000000000..0f5d7bc52e --- /dev/null +++ b/data/styles/clear/style-clear/symbols/taxi-m.svg @@ -0,0 +1,14 @@ + + + + taxi-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/tennis-l.svg b/data/styles/clear/style-clear/symbols/tennis-l.svg index 53c9e0adfb..1c7897aa73 100644 --- a/data/styles/clear/style-clear/symbols/tennis-l.svg +++ b/data/styles/clear/style-clear/symbols/tennis-l.svg @@ -1,6 +1,6 @@ - + tennis-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/tennis-m.svg b/data/styles/clear/style-clear/symbols/tennis-m.svg index 572f9df247..6aee12f4f0 100644 --- a/data/styles/clear/style-clear/symbols/tennis-m.svg +++ b/data/styles/clear/style-clear/symbols/tennis-m.svg @@ -1,6 +1,6 @@ - + tennis-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/tennis-s.svg b/data/styles/clear/style-clear/symbols/tennis-s.svg index a3b7a8ef61..ece6db4f0b 100644 --- a/data/styles/clear/style-clear/symbols/tennis-s.svg +++ b/data/styles/clear/style-clear/symbols/tennis-s.svg @@ -1,6 +1,6 @@ - + tennis-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/theatre-l.svg b/data/styles/clear/style-clear/symbols/theatre-l.svg index 462acd29f8..53e952b4f9 100644 --- a/data/styles/clear/style-clear/symbols/theatre-l.svg +++ b/data/styles/clear/style-clear/symbols/theatre-l.svg @@ -1,6 +1,6 @@ - + theatre-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/theatre-m.svg b/data/styles/clear/style-clear/symbols/theatre-m.svg index 2ac58044b4..cb70517c0f 100644 --- a/data/styles/clear/style-clear/symbols/theatre-m.svg +++ b/data/styles/clear/style-clear/symbols/theatre-m.svg @@ -1,6 +1,6 @@ - + theatre-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/theatre-s.svg b/data/styles/clear/style-clear/symbols/theatre-s.svg index 996906487e..f56a79279a 100644 --- a/data/styles/clear/style-clear/symbols/theatre-s.svg +++ b/data/styles/clear/style-clear/symbols/theatre-s.svg @@ -1,6 +1,6 @@ - + theatre-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/toilets-l.svg b/data/styles/clear/style-clear/symbols/toilets-l.svg index 50f82600c9..69e9728815 100644 --- a/data/styles/clear/style-clear/symbols/toilets-l.svg +++ b/data/styles/clear/style-clear/symbols/toilets-l.svg @@ -1,6 +1,6 @@ - + toilets-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/toilets-m.svg b/data/styles/clear/style-clear/symbols/toilets-m.svg index ad2a1d72ba..80120b7cc2 100644 --- a/data/styles/clear/style-clear/symbols/toilets-m.svg +++ b/data/styles/clear/style-clear/symbols/toilets-m.svg @@ -1,6 +1,6 @@ - + toilets-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/toilets-s.svg b/data/styles/clear/style-clear/symbols/toilets-s.svg index 840f5b1ed4..d962c0d239 100644 --- a/data/styles/clear/style-clear/symbols/toilets-s.svg +++ b/data/styles/clear/style-clear/symbols/toilets-s.svg @@ -1,6 +1,6 @@ - + toilets-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/toll_booth-l.svg b/data/styles/clear/style-clear/symbols/toll_booth-l.svg new file mode 100644 index 0000000000..4c9b5f2ad1 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/toll_booth-l.svg @@ -0,0 +1,14 @@ + + + + toll_booth-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/toll_booth-m.svg b/data/styles/clear/style-clear/symbols/toll_booth-m.svg new file mode 100644 index 0000000000..d65854a1bf --- /dev/null +++ b/data/styles/clear/style-clear/symbols/toll_booth-m.svg @@ -0,0 +1,14 @@ + + + + toll_booth-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/tomb-l.svg b/data/styles/clear/style-clear/symbols/tomb-l.svg new file mode 100644 index 0000000000..d6f5f0f84f --- /dev/null +++ b/data/styles/clear/style-clear/symbols/tomb-l.svg @@ -0,0 +1,14 @@ + + + + tomb-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/tomb-m.svg b/data/styles/clear/style-clear/symbols/tomb-m.svg new file mode 100644 index 0000000000..32496aa502 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/tomb-m.svg @@ -0,0 +1,14 @@ + + + + tomb-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/tourism-l.svg b/data/styles/clear/style-clear/symbols/tourism-l.svg index 2b289f7a13..73e78f7af4 100644 --- a/data/styles/clear/style-clear/symbols/tourism-l.svg +++ b/data/styles/clear/style-clear/symbols/tourism-l.svg @@ -1,6 +1,6 @@ - + tourism-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/tourism-m.svg b/data/styles/clear/style-clear/symbols/tourism-m.svg index 612359e271..20c7ff4535 100644 --- a/data/styles/clear/style-clear/symbols/tourism-m.svg +++ b/data/styles/clear/style-clear/symbols/tourism-m.svg @@ -1,6 +1,6 @@ - + tourism-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/tourism-s.svg b/data/styles/clear/style-clear/symbols/tourism-s.svg index 288c4ff536..7a41894707 100644 --- a/data/styles/clear/style-clear/symbols/tourism-s.svg +++ b/data/styles/clear/style-clear/symbols/tourism-s.svg @@ -1,6 +1,6 @@ - + tourism-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/townhall-l.svg b/data/styles/clear/style-clear/symbols/townhall-l.svg index f38c419232..e661febd38 100644 --- a/data/styles/clear/style-clear/symbols/townhall-l.svg +++ b/data/styles/clear/style-clear/symbols/townhall-l.svg @@ -1,6 +1,6 @@ - + townhall-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/townhall-m.svg b/data/styles/clear/style-clear/symbols/townhall-m.svg index 680bfe4871..146e8e889d 100644 --- a/data/styles/clear/style-clear/symbols/townhall-m.svg +++ b/data/styles/clear/style-clear/symbols/townhall-m.svg @@ -1,6 +1,6 @@ - + townhall-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/townhall-s.svg b/data/styles/clear/style-clear/symbols/townhall-s.svg index f9371ba706..9d2dd1e62f 100644 --- a/data/styles/clear/style-clear/symbols/townhall-s.svg +++ b/data/styles/clear/style-clear/symbols/townhall-s.svg @@ -1,6 +1,6 @@ - + townhall-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/toys-l.svg b/data/styles/clear/style-clear/symbols/toys-l.svg new file mode 100644 index 0000000000..a87524e8c4 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/toys-l.svg @@ -0,0 +1,14 @@ + + + + toys-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/toys-m.svg b/data/styles/clear/style-clear/symbols/toys-m.svg new file mode 100644 index 0000000000..d925e646f5 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/toys-m.svg @@ -0,0 +1,14 @@ + + + + toys-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/vending-l.svg b/data/styles/clear/style-clear/symbols/vending-l.svg new file mode 100644 index 0000000000..1fce37f5bc --- /dev/null +++ b/data/styles/clear/style-clear/symbols/vending-l.svg @@ -0,0 +1,18 @@ + + + + vending-l + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/vending-m.svg b/data/styles/clear/style-clear/symbols/vending-m.svg new file mode 100644 index 0000000000..b4f92349ff --- /dev/null +++ b/data/styles/clear/style-clear/symbols/vending-m.svg @@ -0,0 +1,14 @@ + + + + vending-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/volcano-l.svg b/data/styles/clear/style-clear/symbols/volcano-l.svg index c147fe095d..adbd2f86a6 100644 --- a/data/styles/clear/style-clear/symbols/volcano-l.svg +++ b/data/styles/clear/style-clear/symbols/volcano-l.svg @@ -1,6 +1,6 @@ - + volcano-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/volcano-m.svg b/data/styles/clear/style-clear/symbols/volcano-m.svg index 9cb5040bee..1eb0e32fef 100644 --- a/data/styles/clear/style-clear/symbols/volcano-m.svg +++ b/data/styles/clear/style-clear/symbols/volcano-m.svg @@ -1,6 +1,6 @@ - + volcano-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/volcano-s.svg b/data/styles/clear/style-clear/symbols/volcano-s.svg index 8989b41416..3a07308a43 100644 --- a/data/styles/clear/style-clear/symbols/volcano-s.svg +++ b/data/styles/clear/style-clear/symbols/volcano-s.svg @@ -1,6 +1,6 @@ - + volcano-s Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/waterfall-l.svg b/data/styles/clear/style-clear/symbols/waterfall-l.svg index 919661137a..031061ba23 100644 --- a/data/styles/clear/style-clear/symbols/waterfall-l.svg +++ b/data/styles/clear/style-clear/symbols/waterfall-l.svg @@ -1,11 +1,11 @@ - - + + waterfall-l Created with Sketch. - + diff --git a/data/styles/clear/style-clear/symbols/waterfall-m.svg b/data/styles/clear/style-clear/symbols/waterfall-m.svg index f3fd3c201e..d82c11ebd3 100644 --- a/data/styles/clear/style-clear/symbols/waterfall-m.svg +++ b/data/styles/clear/style-clear/symbols/waterfall-m.svg @@ -1,11 +1,11 @@ - - + + waterfall-m Created with Sketch. - + diff --git a/data/styles/clear/style-clear/symbols/waterfall-s.svg b/data/styles/clear/style-clear/symbols/waterfall-s.svg index 85c9eb9474..73e6a7890b 100644 --- a/data/styles/clear/style-clear/symbols/waterfall-s.svg +++ b/data/styles/clear/style-clear/symbols/waterfall-s.svg @@ -1,11 +1,11 @@ - - + + waterfall-s Created with Sketch. - + diff --git a/data/styles/clear/style-clear/symbols/wayside_cross-l.svg b/data/styles/clear/style-clear/symbols/wayside_cross-l.svg new file mode 100644 index 0000000000..4db333b26f --- /dev/null +++ b/data/styles/clear/style-clear/symbols/wayside_cross-l.svg @@ -0,0 +1,14 @@ + + + + wayside_cross-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/wayside_cross-m.svg b/data/styles/clear/style-clear/symbols/wayside_cross-m.svg new file mode 100644 index 0000000000..cde43f09dc --- /dev/null +++ b/data/styles/clear/style-clear/symbols/wayside_cross-m.svg @@ -0,0 +1,14 @@ + + + + wayside_cross-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/wayside_shrine-l.svg b/data/styles/clear/style-clear/symbols/wayside_shrine-l.svg new file mode 100644 index 0000000000..e3446c65bf --- /dev/null +++ b/data/styles/clear/style-clear/symbols/wayside_shrine-l.svg @@ -0,0 +1,14 @@ + + + + wayside_shrine-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/wayside_shrine-m.svg b/data/styles/clear/style-clear/symbols/wayside_shrine-m.svg new file mode 100644 index 0000000000..4ac9257dcb --- /dev/null +++ b/data/styles/clear/style-clear/symbols/wayside_shrine-m.svg @@ -0,0 +1,14 @@ + + + + wayside_shrine-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/windmill-l.svg b/data/styles/clear/style-clear/symbols/windmill-l.svg new file mode 100644 index 0000000000..df15776d96 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/windmill-l.svg @@ -0,0 +1,14 @@ + + + + windmill-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/windmill-m.svg b/data/styles/clear/style-clear/symbols/windmill-m.svg new file mode 100644 index 0000000000..2f191b24b0 --- /dev/null +++ b/data/styles/clear/style-clear/symbols/windmill-m.svg @@ -0,0 +1,14 @@ + + + + windmill-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/windmill-s.svg b/data/styles/clear/style-clear/symbols/windmill-s.svg new file mode 100644 index 0000000000..129bf5fa3d --- /dev/null +++ b/data/styles/clear/style-clear/symbols/windmill-s.svg @@ -0,0 +1,8 @@ + + + + windmill-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-clear/symbols/zoo-l.svg b/data/styles/clear/style-clear/symbols/zoo-l.svg index ae1834d1ed..6918122e61 100644 --- a/data/styles/clear/style-clear/symbols/zoo-l.svg +++ b/data/styles/clear/style-clear/symbols/zoo-l.svg @@ -1,6 +1,6 @@ - + zoo-l Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/zoo-m.svg b/data/styles/clear/style-clear/symbols/zoo-m.svg index c17f610f17..ace97b8c5c 100644 --- a/data/styles/clear/style-clear/symbols/zoo-m.svg +++ b/data/styles/clear/style-clear/symbols/zoo-m.svg @@ -1,6 +1,6 @@ - + zoo-m Created with Sketch. diff --git a/data/styles/clear/style-clear/symbols/zoo-s.svg b/data/styles/clear/style-clear/symbols/zoo-s.svg index f0e5160e55..f542531f04 100644 --- a/data/styles/clear/style-clear/symbols/zoo-s.svg +++ b/data/styles/clear/style-clear/symbols/zoo-s.svg @@ -1,6 +1,6 @@ - + zoo-s Created with Sketch. diff --git a/data/styles/clear/style-clear/xhdpi/route_from.png b/data/styles/clear/style-clear/xhdpi/route_from.png index be419ee49d..3e2de72ae2 100644 Binary files a/data/styles/clear/style-clear/xhdpi/route_from.png and b/data/styles/clear/style-clear/xhdpi/route_from.png differ diff --git a/data/styles/clear/style-clear/xhdpi/route_to.png b/data/styles/clear/style-clear/xhdpi/route_to.png index 7226f77951..71ac6ff4ec 100644 Binary files a/data/styles/clear/style-clear/xhdpi/route_to.png and b/data/styles/clear/style-clear/xhdpi/route_to.png differ diff --git a/data/styles/clear/style-clear/xxhdpi/route_from.png b/data/styles/clear/style-clear/xxhdpi/route_from.png index 347cf712fb..3464497403 100644 Binary files a/data/styles/clear/style-clear/xxhdpi/route_from.png and b/data/styles/clear/style-clear/xxhdpi/route_from.png differ diff --git a/data/styles/clear/style-clear/xxhdpi/route_to.png b/data/styles/clear/style-clear/xxhdpi/route_to.png index 452f859594..449b7be1b7 100644 Binary files a/data/styles/clear/style-clear/xxhdpi/route_to.png and b/data/styles/clear/style-clear/xxhdpi/route_to.png differ diff --git a/data/styles/clear/style-night/colors.mapcss b/data/styles/clear/style-night/colors.mapcss index 1410ae5e60..dd239b8a69 100644 --- a/data/styles/clear/style-night/colors.mapcss +++ b/data/styles/clear/style-night/colors.mapcss @@ -85,7 +85,13 @@ @tram: #5C5C51; @ferry: #2A4541; @aerodrome: #2A1444; - +/*aerodrome*/ +@aerodrome0: #2A1444; +@aerodrome1: #2A1444; +@aerodrome2: #2A1444; +@aerodrome3: #2A1444; +@aerodrome4: #2A1444; +@aerodrome5: #2A1444; /* NATURAL */ @glacier: #111111; @water: #002222; @@ -93,7 +99,13 @@ @forest: #1B2500; @park: #1B2500; @beach: #28281A; - +/*forest-park*/ +@green0: #1B2500; +@green1: #1B2500; +@green2: #1B2500; +@green3: #1B2500; +@green4: #1B2500; +@green5: #1B2500; /* BUILDINGS */ @housename: #555555; @building: #222222; @@ -101,6 +113,7 @@ /* LANDUSE */ @pedestrian_area: #2E2E1C; +@pedestrian_area_light: #2E2E1C; @unversity: #2C2A17; @hospital: #3B2D23; @industrial: #141400; @@ -144,6 +157,9 @@ @shield_halo: #000000; /* blue - #2E89B0; #498F46; #598DBE; */ +@label_dark: #333333; +@label_light: #444444; +@dark: #333333; /* NATURAL LABELS */ @water_label: #004466; diff --git a/data/styles/clear/style-night/symbols/alcohol-l.svg b/data/styles/clear/style-night/symbols/alcohol-l.svg index 1451834094..673935cb3e 100644 --- a/data/styles/clear/style-night/symbols/alcohol-l.svg +++ b/data/styles/clear/style-night/symbols/alcohol-l.svg @@ -1,14 +1,14 @@ - + alcohol-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/alcohol-m.svg b/data/styles/clear/style-night/symbols/alcohol-m.svg index d3fcf2f090..a7cd7f3a12 100644 --- a/data/styles/clear/style-night/symbols/alcohol-m.svg +++ b/data/styles/clear/style-night/symbols/alcohol-m.svg @@ -1,14 +1,14 @@ - + alcohol-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/alcohol-s.svg b/data/styles/clear/style-night/symbols/alcohol-s.svg index 00a8360ec5..6959c3243b 100644 --- a/data/styles/clear/style-night/symbols/alcohol-s.svg +++ b/data/styles/clear/style-night/symbols/alcohol-s.svg @@ -1,14 +1,14 @@ - + alcohol-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/alpine_hut-l.svg b/data/styles/clear/style-night/symbols/alpine_hut-l.svg new file mode 100644 index 0000000000..a78f684d5f --- /dev/null +++ b/data/styles/clear/style-night/symbols/alpine_hut-l.svg @@ -0,0 +1,16 @@ + + + + alpine_hut-l + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/alpine_hut-m.svg b/data/styles/clear/style-night/symbols/alpine_hut-m.svg new file mode 100644 index 0000000000..b17e36d68e --- /dev/null +++ b/data/styles/clear/style-night/symbols/alpine_hut-m.svg @@ -0,0 +1,16 @@ + + + + alpine_hut-m + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/america-football-l.svg b/data/styles/clear/style-night/symbols/america-football-l.svg index c4a3be13ec..3e0e7a89b5 100644 --- a/data/styles/clear/style-night/symbols/america-football-l.svg +++ b/data/styles/clear/style-night/symbols/america-football-l.svg @@ -1,14 +1,14 @@ - + america-football-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/america-football-m.svg b/data/styles/clear/style-night/symbols/america-football-m.svg index 97542f0741..664272a691 100644 --- a/data/styles/clear/style-night/symbols/america-football-m.svg +++ b/data/styles/clear/style-night/symbols/america-football-m.svg @@ -1,14 +1,14 @@ - + america-football-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/archery-l.svg b/data/styles/clear/style-night/symbols/archery-l.svg new file mode 100644 index 0000000000..e088b3f17d --- /dev/null +++ b/data/styles/clear/style-night/symbols/archery-l.svg @@ -0,0 +1,14 @@ + + + + archery-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/archery-m.svg b/data/styles/clear/style-night/symbols/archery-m.svg new file mode 100644 index 0000000000..365ca0fd90 --- /dev/null +++ b/data/styles/clear/style-night/symbols/archery-m.svg @@ -0,0 +1,14 @@ + + + + archery-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/atm-l.svg b/data/styles/clear/style-night/symbols/atm-l.svg index d5d4c4a519..a97b78d156 100644 --- a/data/styles/clear/style-night/symbols/atm-l.svg +++ b/data/styles/clear/style-night/symbols/atm-l.svg @@ -1,14 +1,14 @@ - + atm-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/atm-m.svg b/data/styles/clear/style-night/symbols/atm-m.svg index fcdfcc2cfb..6368080e67 100644 --- a/data/styles/clear/style-night/symbols/atm-m.svg +++ b/data/styles/clear/style-night/symbols/atm-m.svg @@ -1,14 +1,14 @@ - + atm-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/atm-s.svg b/data/styles/clear/style-night/symbols/atm-s.svg index 8071e448a1..e4d0dc93d3 100644 --- a/data/styles/clear/style-night/symbols/atm-s.svg +++ b/data/styles/clear/style-night/symbols/atm-s.svg @@ -1,14 +1,14 @@ - + atm-s Created with Sketch. - - + + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/australian-football-l.svg b/data/styles/clear/style-night/symbols/australian-football-l.svg new file mode 100644 index 0000000000..991f8106c6 --- /dev/null +++ b/data/styles/clear/style-night/symbols/australian-football-l.svg @@ -0,0 +1,14 @@ + + + + australian-football-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/australian-football-m.svg b/data/styles/clear/style-night/symbols/australian-football-m.svg new file mode 100644 index 0000000000..1c1d354161 --- /dev/null +++ b/data/styles/clear/style-night/symbols/australian-football-m.svg @@ -0,0 +1,14 @@ + + + + australian-football-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bakery-l.svg b/data/styles/clear/style-night/symbols/bakery-l.svg new file mode 100644 index 0000000000..c04c949ba9 --- /dev/null +++ b/data/styles/clear/style-night/symbols/bakery-l.svg @@ -0,0 +1,14 @@ + + + + bakery-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bakery-m.svg b/data/styles/clear/style-night/symbols/bakery-m.svg new file mode 100644 index 0000000000..ab95116cd3 --- /dev/null +++ b/data/styles/clear/style-night/symbols/bakery-m.svg @@ -0,0 +1,14 @@ + + + + bakery-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bank-l.svg b/data/styles/clear/style-night/symbols/bank-l.svg index 1901c94ced..e819746790 100644 --- a/data/styles/clear/style-night/symbols/bank-l.svg +++ b/data/styles/clear/style-night/symbols/bank-l.svg @@ -1,14 +1,14 @@ - + bank-l Created with Sketch. - + - + diff --git a/data/styles/clear/style-night/symbols/bank-m.svg b/data/styles/clear/style-night/symbols/bank-m.svg index 22920356d1..9436bd3f60 100644 --- a/data/styles/clear/style-night/symbols/bank-m.svg +++ b/data/styles/clear/style-night/symbols/bank-m.svg @@ -1,14 +1,14 @@ - + bank-m Created with Sketch. - + - + diff --git a/data/styles/clear/style-night/symbols/bank-s.svg b/data/styles/clear/style-night/symbols/bank-s.svg index a0bb1cc0a5..037534abae 100644 --- a/data/styles/clear/style-night/symbols/bank-s.svg +++ b/data/styles/clear/style-night/symbols/bank-s.svg @@ -1,16 +1,14 @@ - + bank-s Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/banknote-l.svg b/data/styles/clear/style-night/symbols/banknote-l.svg index 5af731b345..c04c0f0e67 100644 --- a/data/styles/clear/style-night/symbols/banknote-l.svg +++ b/data/styles/clear/style-night/symbols/banknote-l.svg @@ -1,17 +1,17 @@ - + banknote-l Created with Sketch. - + - + - - + + diff --git a/data/styles/clear/style-night/symbols/banknote-m.svg b/data/styles/clear/style-night/symbols/banknote-m.svg index 9c652e10f5..46804a0400 100644 --- a/data/styles/clear/style-night/symbols/banknote-m.svg +++ b/data/styles/clear/style-night/symbols/banknote-m.svg @@ -1,18 +1,18 @@ - + banknote-m Created with Sketch. - + - + - - + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bar-l.svg b/data/styles/clear/style-night/symbols/bar-l.svg index 5b3ce6091a..c630b00c69 100644 --- a/data/styles/clear/style-night/symbols/bar-l.svg +++ b/data/styles/clear/style-night/symbols/bar-l.svg @@ -1,14 +1,14 @@ - + bar-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bar-m.svg b/data/styles/clear/style-night/symbols/bar-m.svg index 793d5f4492..1de4e73066 100644 --- a/data/styles/clear/style-night/symbols/bar-m.svg +++ b/data/styles/clear/style-night/symbols/bar-m.svg @@ -1,14 +1,14 @@ - + bar-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bar-s.svg b/data/styles/clear/style-night/symbols/bar-s.svg index b852dec087..e274cc95c9 100644 --- a/data/styles/clear/style-night/symbols/bar-s.svg +++ b/data/styles/clear/style-night/symbols/bar-s.svg @@ -1,14 +1,14 @@ - + bar-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/baseball-l.svg b/data/styles/clear/style-night/symbols/baseball-l.svg index f9e77b79db..a325dfc779 100644 --- a/data/styles/clear/style-night/symbols/baseball-l.svg +++ b/data/styles/clear/style-night/symbols/baseball-l.svg @@ -1,14 +1,14 @@ - + baseball-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/baseball-m.svg b/data/styles/clear/style-night/symbols/baseball-m.svg index 0ca0ad4e7f..1cb5eff830 100644 --- a/data/styles/clear/style-night/symbols/baseball-m.svg +++ b/data/styles/clear/style-night/symbols/baseball-m.svg @@ -1,14 +1,14 @@ - + baseball-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/baseball-s.svg b/data/styles/clear/style-night/symbols/baseball-s.svg index 16a5463a0a..f089434431 100644 --- a/data/styles/clear/style-night/symbols/baseball-s.svg +++ b/data/styles/clear/style-night/symbols/baseball-s.svg @@ -1,14 +1,14 @@ - + baseball-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/basketball-l.svg b/data/styles/clear/style-night/symbols/basketball-l.svg index 43e812ccdc..8824c7d890 100644 --- a/data/styles/clear/style-night/symbols/basketball-l.svg +++ b/data/styles/clear/style-night/symbols/basketball-l.svg @@ -1,14 +1,14 @@ - + basketball-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/basketball-m.svg b/data/styles/clear/style-night/symbols/basketball-m.svg index fde7cec7c7..aa70744bed 100644 --- a/data/styles/clear/style-night/symbols/basketball-m.svg +++ b/data/styles/clear/style-night/symbols/basketball-m.svg @@ -1,14 +1,14 @@ - + basketball-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/basketball-s.svg b/data/styles/clear/style-night/symbols/basketball-s.svg index e63ee0ef57..e9c4746983 100644 --- a/data/styles/clear/style-night/symbols/basketball-s.svg +++ b/data/styles/clear/style-night/symbols/basketball-s.svg @@ -1,14 +1,14 @@ - + basketball-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bbq-l.svg b/data/styles/clear/style-night/symbols/bbq-l.svg new file mode 100644 index 0000000000..d30d03b5bb --- /dev/null +++ b/data/styles/clear/style-night/symbols/bbq-l.svg @@ -0,0 +1,14 @@ + + + + bbq-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bbq-m.svg b/data/styles/clear/style-night/symbols/bbq-m.svg new file mode 100644 index 0000000000..726afc82e2 --- /dev/null +++ b/data/styles/clear/style-night/symbols/bbq-m.svg @@ -0,0 +1,14 @@ + + + + bbq-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bcontrol-l.svg b/data/styles/clear/style-night/symbols/bcontrol-l.svg new file mode 100644 index 0000000000..59b928e292 --- /dev/null +++ b/data/styles/clear/style-night/symbols/bcontrol-l.svg @@ -0,0 +1,20 @@ + + + + bcontrol-l + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bcontrol-m.svg b/data/styles/clear/style-night/symbols/bcontrol-m.svg index 09691e98a0..09c1ea777c 100644 --- a/data/styles/clear/style-night/symbols/bcontrol-m.svg +++ b/data/styles/clear/style-night/symbols/bcontrol-m.svg @@ -1,20 +1,16 @@ - - + + bcontrol-m Created with Sketch. - - - - - - - - - - - + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bcontrol-s.svg b/data/styles/clear/style-night/symbols/bcontrol-s.svg new file mode 100644 index 0000000000..55b2040441 --- /dev/null +++ b/data/styles/clear/style-night/symbols/bcontrol-s.svg @@ -0,0 +1,21 @@ + + + + bcontrol-s + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/beach-l.svg b/data/styles/clear/style-night/symbols/beach-l.svg new file mode 100644 index 0000000000..ffd6eda0f9 --- /dev/null +++ b/data/styles/clear/style-night/symbols/beach-l.svg @@ -0,0 +1,14 @@ + + + + beach-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/beach-m.svg b/data/styles/clear/style-night/symbols/beach-m.svg new file mode 100644 index 0000000000..9abe411217 --- /dev/null +++ b/data/styles/clear/style-night/symbols/beach-m.svg @@ -0,0 +1,14 @@ + + + + beach-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/beauty-l.svg b/data/styles/clear/style-night/symbols/beauty-l.svg new file mode 100644 index 0000000000..97e7373cef --- /dev/null +++ b/data/styles/clear/style-night/symbols/beauty-l.svg @@ -0,0 +1,14 @@ + + + + beauty-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/beauty-m.svg b/data/styles/clear/style-night/symbols/beauty-m.svg new file mode 100644 index 0000000000..62345bf0e2 --- /dev/null +++ b/data/styles/clear/style-night/symbols/beauty-m.svg @@ -0,0 +1,14 @@ + + + + beauty-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/beer-l.svg b/data/styles/clear/style-night/symbols/beer-l.svg index d4b56565e9..ab70cadf7e 100644 --- a/data/styles/clear/style-night/symbols/beer-l.svg +++ b/data/styles/clear/style-night/symbols/beer-l.svg @@ -1,14 +1,18 @@ - + beer-l Created with Sketch. - - - + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/beer-m.svg b/data/styles/clear/style-night/symbols/beer-m.svg index 954ac7c8b8..acd5d923d7 100644 --- a/data/styles/clear/style-night/symbols/beer-m.svg +++ b/data/styles/clear/style-night/symbols/beer-m.svg @@ -1,14 +1,18 @@ - + beer-m Created with Sketch. - - - + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bicycle-l.svg b/data/styles/clear/style-night/symbols/bicycle-l.svg index 843cd3d53f..960761c772 100644 --- a/data/styles/clear/style-night/symbols/bicycle-l.svg +++ b/data/styles/clear/style-night/symbols/bicycle-l.svg @@ -1,14 +1,14 @@ - + bicycle-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bicycle-m.svg b/data/styles/clear/style-night/symbols/bicycle-m.svg index 60802d583d..4fa0bbb09b 100644 --- a/data/styles/clear/style-night/symbols/bicycle-m.svg +++ b/data/styles/clear/style-night/symbols/bicycle-m.svg @@ -1,15 +1,15 @@ - + bicycle-m Created with Sketch. - + - + diff --git a/data/styles/clear/style-night/symbols/bicycle-s.svg b/data/styles/clear/style-night/symbols/bicycle-s.svg index 0b342c88a8..9827ff610e 100644 --- a/data/styles/clear/style-night/symbols/bicycle-s.svg +++ b/data/styles/clear/style-night/symbols/bicycle-s.svg @@ -1,14 +1,14 @@ - + bicycle-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/book-shop-l.svg b/data/styles/clear/style-night/symbols/book-shop-l.svg new file mode 100644 index 0000000000..03b63e4ad4 --- /dev/null +++ b/data/styles/clear/style-night/symbols/book-shop-l.svg @@ -0,0 +1,14 @@ + + + + book-shop-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/book-shop-m.svg b/data/styles/clear/style-night/symbols/book-shop-m.svg new file mode 100644 index 0000000000..6260a57052 --- /dev/null +++ b/data/styles/clear/style-night/symbols/book-shop-m.svg @@ -0,0 +1,14 @@ + + + + book-shop-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/book-shop-s.svg b/data/styles/clear/style-night/symbols/book-shop-s.svg new file mode 100644 index 0000000000..2f97a3b11c --- /dev/null +++ b/data/styles/clear/style-night/symbols/book-shop-s.svg @@ -0,0 +1,8 @@ + + + + book-shop-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/boundary_stone-l.svg b/data/styles/clear/style-night/symbols/boundary_stone-l.svg new file mode 100644 index 0000000000..f27051a707 --- /dev/null +++ b/data/styles/clear/style-night/symbols/boundary_stone-l.svg @@ -0,0 +1,14 @@ + + + + boundary_stone-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/boundary_stone-m.svg b/data/styles/clear/style-night/symbols/boundary_stone-m.svg new file mode 100644 index 0000000000..521603983a --- /dev/null +++ b/data/styles/clear/style-night/symbols/boundary_stone-m.svg @@ -0,0 +1,14 @@ + + + + boundary_stone-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bowls-l.svg b/data/styles/clear/style-night/symbols/bowls-l.svg new file mode 100644 index 0000000000..4b3821e6db --- /dev/null +++ b/data/styles/clear/style-night/symbols/bowls-l.svg @@ -0,0 +1,14 @@ + + + + bowls-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/bowls-m.svg b/data/styles/clear/style-night/symbols/bowls-m.svg new file mode 100644 index 0000000000..4658342388 --- /dev/null +++ b/data/styles/clear/style-night/symbols/bowls-m.svg @@ -0,0 +1,14 @@ + + + + bowls-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/butcher-l.svg b/data/styles/clear/style-night/symbols/butcher-l.svg new file mode 100644 index 0000000000..a3b5e50d1f --- /dev/null +++ b/data/styles/clear/style-night/symbols/butcher-l.svg @@ -0,0 +1,14 @@ + + + + butcher-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/butcher-m.svg b/data/styles/clear/style-night/symbols/butcher-m.svg new file mode 100644 index 0000000000..4d343b0b77 --- /dev/null +++ b/data/styles/clear/style-night/symbols/butcher-m.svg @@ -0,0 +1,14 @@ + + + + butcher-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cafe-l.svg b/data/styles/clear/style-night/symbols/cafe-l.svg index 2f489b6838..37b19279c1 100644 --- a/data/styles/clear/style-night/symbols/cafe-l.svg +++ b/data/styles/clear/style-night/symbols/cafe-l.svg @@ -1,14 +1,14 @@ - + cafe-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cafe-m.svg b/data/styles/clear/style-night/symbols/cafe-m.svg index 97aeadd975..ab616ee6f3 100644 --- a/data/styles/clear/style-night/symbols/cafe-m.svg +++ b/data/styles/clear/style-night/symbols/cafe-m.svg @@ -1,14 +1,14 @@ - + cafe-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cafe-s.svg b/data/styles/clear/style-night/symbols/cafe-s.svg index 92c042667d..ae6aca90d1 100644 --- a/data/styles/clear/style-night/symbols/cafe-s.svg +++ b/data/styles/clear/style-night/symbols/cafe-s.svg @@ -1,14 +1,14 @@ - + cafe-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/campsite-l.svg b/data/styles/clear/style-night/symbols/campsite-l.svg index d906f5931b..84ccbf1cc4 100644 --- a/data/styles/clear/style-night/symbols/campsite-l.svg +++ b/data/styles/clear/style-night/symbols/campsite-l.svg @@ -1,14 +1,14 @@ - + campsite-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/campsite-m.svg b/data/styles/clear/style-night/symbols/campsite-m.svg index 8599f22779..00fb6307a8 100644 --- a/data/styles/clear/style-night/symbols/campsite-m.svg +++ b/data/styles/clear/style-night/symbols/campsite-m.svg @@ -1,14 +1,14 @@ - + campsite-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/campsite-s.svg b/data/styles/clear/style-night/symbols/campsite-s.svg index b5df92c40c..b8dbf95fa5 100644 --- a/data/styles/clear/style-night/symbols/campsite-s.svg +++ b/data/styles/clear/style-night/symbols/campsite-s.svg @@ -1,14 +1,14 @@ - + campsite-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/car-repair-l.svg b/data/styles/clear/style-night/symbols/car-repair-l.svg new file mode 100644 index 0000000000..b48f077795 --- /dev/null +++ b/data/styles/clear/style-night/symbols/car-repair-l.svg @@ -0,0 +1,18 @@ + + + + car-repair-l + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/car-repair-m.svg b/data/styles/clear/style-night/symbols/car-repair-m.svg new file mode 100644 index 0000000000..8f50dce43b --- /dev/null +++ b/data/styles/clear/style-night/symbols/car-repair-m.svg @@ -0,0 +1,18 @@ + + + + car-repair-m + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/car-repair-s.svg b/data/styles/clear/style-night/symbols/car-repair-s.svg new file mode 100644 index 0000000000..0b886153ae --- /dev/null +++ b/data/styles/clear/style-night/symbols/car-repair-s.svg @@ -0,0 +1,8 @@ + + + + car-repair-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/car_sharing-l.svg b/data/styles/clear/style-night/symbols/car_sharing-l.svg new file mode 100644 index 0000000000..12f257bd29 --- /dev/null +++ b/data/styles/clear/style-night/symbols/car_sharing-l.svg @@ -0,0 +1,14 @@ + + + + car_sharing-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/car_sharing-m.svg b/data/styles/clear/style-night/symbols/car_sharing-m.svg new file mode 100644 index 0000000000..954fab19bc --- /dev/null +++ b/data/styles/clear/style-night/symbols/car_sharing-m.svg @@ -0,0 +1,14 @@ + + + + car_sharing-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/caravan_site-l.svg b/data/styles/clear/style-night/symbols/caravan_site-l.svg new file mode 100644 index 0000000000..122ce4ef3e --- /dev/null +++ b/data/styles/clear/style-night/symbols/caravan_site-l.svg @@ -0,0 +1,14 @@ + + + + caravan_site-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/caravan_site-m.svg b/data/styles/clear/style-night/symbols/caravan_site-m.svg new file mode 100644 index 0000000000..a50d96296c --- /dev/null +++ b/data/styles/clear/style-night/symbols/caravan_site-m.svg @@ -0,0 +1,14 @@ + + + + caravan_site-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/casino-l.svg b/data/styles/clear/style-night/symbols/casino-l.svg new file mode 100644 index 0000000000..58b53fa9e1 --- /dev/null +++ b/data/styles/clear/style-night/symbols/casino-l.svg @@ -0,0 +1,14 @@ + + + + casino-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/casino-m.svg b/data/styles/clear/style-night/symbols/casino-m.svg new file mode 100644 index 0000000000..6f12f334b8 --- /dev/null +++ b/data/styles/clear/style-night/symbols/casino-m.svg @@ -0,0 +1,14 @@ + + + + casino-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/casino-s.svg b/data/styles/clear/style-night/symbols/casino-s.svg new file mode 100644 index 0000000000..738c72be33 --- /dev/null +++ b/data/styles/clear/style-night/symbols/casino-s.svg @@ -0,0 +1,8 @@ + + + + casino-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cave-l.svg b/data/styles/clear/style-night/symbols/cave-l.svg index 54d30490af..cec5cc54a3 100644 --- a/data/styles/clear/style-night/symbols/cave-l.svg +++ b/data/styles/clear/style-night/symbols/cave-l.svg @@ -1,16 +1,16 @@ - + cave-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cave-m.svg b/data/styles/clear/style-night/symbols/cave-m.svg index d6c3c200b1..648618834f 100644 --- a/data/styles/clear/style-night/symbols/cave-m.svg +++ b/data/styles/clear/style-night/symbols/cave-m.svg @@ -1,14 +1,14 @@ - + cave-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cave-s.svg b/data/styles/clear/style-night/symbols/cave-s.svg index 6b7046485c..81030556b5 100644 --- a/data/styles/clear/style-night/symbols/cave-s.svg +++ b/data/styles/clear/style-night/symbols/cave-s.svg @@ -1,14 +1,14 @@ - + cave-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cemetery-l.svg b/data/styles/clear/style-night/symbols/cemetery-l.svg index d15896e2a4..c49fea04d0 100644 --- a/data/styles/clear/style-night/symbols/cemetery-l.svg +++ b/data/styles/clear/style-night/symbols/cemetery-l.svg @@ -1,14 +1,14 @@ - + cemetery-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cemetery-m.svg b/data/styles/clear/style-night/symbols/cemetery-m.svg index b49b6d9304..bcf8441535 100644 --- a/data/styles/clear/style-night/symbols/cemetery-m.svg +++ b/data/styles/clear/style-night/symbols/cemetery-m.svg @@ -1,14 +1,14 @@ - + cemetery-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cemetery-s.svg b/data/styles/clear/style-night/symbols/cemetery-s.svg index a82105c7a5..c3621ebbb1 100644 --- a/data/styles/clear/style-night/symbols/cemetery-s.svg +++ b/data/styles/clear/style-night/symbols/cemetery-s.svg @@ -1,14 +1,14 @@ - + cemetery-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/chemist-l.svg b/data/styles/clear/style-night/symbols/chemist-l.svg new file mode 100644 index 0000000000..899f3515aa --- /dev/null +++ b/data/styles/clear/style-night/symbols/chemist-l.svg @@ -0,0 +1,14 @@ + + + + chemist-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/chemist-m.svg b/data/styles/clear/style-night/symbols/chemist-m.svg new file mode 100644 index 0000000000..88d7b0b1a8 --- /dev/null +++ b/data/styles/clear/style-night/symbols/chemist-m.svg @@ -0,0 +1,14 @@ + + + + chemist-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cinema-l.svg b/data/styles/clear/style-night/symbols/cinema-l.svg index da33c96268..898ab552fc 100644 --- a/data/styles/clear/style-night/symbols/cinema-l.svg +++ b/data/styles/clear/style-night/symbols/cinema-l.svg @@ -1,14 +1,14 @@ - + cinema-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cinema-m.svg b/data/styles/clear/style-night/symbols/cinema-m.svg index 2414ecbc03..7c7f1adf82 100644 --- a/data/styles/clear/style-night/symbols/cinema-m.svg +++ b/data/styles/clear/style-night/symbols/cinema-m.svg @@ -1,14 +1,14 @@ - + cinema-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cinema-s.svg b/data/styles/clear/style-night/symbols/cinema-s.svg index 00b1d99db6..3b055a7e9e 100644 --- a/data/styles/clear/style-night/symbols/cinema-s.svg +++ b/data/styles/clear/style-night/symbols/cinema-s.svg @@ -1,14 +1,14 @@ - + cinema-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/clothes-l.svg b/data/styles/clear/style-night/symbols/clothes-l.svg new file mode 100644 index 0000000000..adc3bfd157 --- /dev/null +++ b/data/styles/clear/style-night/symbols/clothes-l.svg @@ -0,0 +1,14 @@ + + + + clothes-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/clothes-m.svg b/data/styles/clear/style-night/symbols/clothes-m.svg new file mode 100644 index 0000000000..3aa160348d --- /dev/null +++ b/data/styles/clear/style-night/symbols/clothes-m.svg @@ -0,0 +1,14 @@ + + + + clothes-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/college-l.svg b/data/styles/clear/style-night/symbols/college-l.svg index c263632efe..1e703b3286 100644 --- a/data/styles/clear/style-night/symbols/college-l.svg +++ b/data/styles/clear/style-night/symbols/college-l.svg @@ -1,14 +1,14 @@ - + college-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/college-m.svg b/data/styles/clear/style-night/symbols/college-m.svg index e74b461dee..b9dc560734 100644 --- a/data/styles/clear/style-night/symbols/college-m.svg +++ b/data/styles/clear/style-night/symbols/college-m.svg @@ -1,14 +1,14 @@ - + college-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/college-s.svg b/data/styles/clear/style-night/symbols/college-s.svg index b50a356bf3..e6d5639436 100644 --- a/data/styles/clear/style-night/symbols/college-s.svg +++ b/data/styles/clear/style-night/symbols/college-s.svg @@ -1,14 +1,14 @@ - + college-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/computer-l.svg b/data/styles/clear/style-night/symbols/computer-l.svg new file mode 100644 index 0000000000..676f2d9a64 --- /dev/null +++ b/data/styles/clear/style-night/symbols/computer-l.svg @@ -0,0 +1,14 @@ + + + + computer-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/computer-m.svg b/data/styles/clear/style-night/symbols/computer-m.svg new file mode 100644 index 0000000000..74f0f4830b --- /dev/null +++ b/data/styles/clear/style-night/symbols/computer-m.svg @@ -0,0 +1,14 @@ + + + + computer-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/convenience-l.svg b/data/styles/clear/style-night/symbols/convenience-l.svg new file mode 100644 index 0000000000..09ae9590ea --- /dev/null +++ b/data/styles/clear/style-night/symbols/convenience-l.svg @@ -0,0 +1,14 @@ + + + + convenience-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/convenience-m.svg b/data/styles/clear/style-night/symbols/convenience-m.svg new file mode 100644 index 0000000000..724545a28f --- /dev/null +++ b/data/styles/clear/style-night/symbols/convenience-m.svg @@ -0,0 +1,14 @@ + + + + convenience-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cricket-l.svg b/data/styles/clear/style-night/symbols/cricket-l.svg new file mode 100644 index 0000000000..d9433a5974 --- /dev/null +++ b/data/styles/clear/style-night/symbols/cricket-l.svg @@ -0,0 +1,14 @@ + + + + cricket-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/cricket-m.svg b/data/styles/clear/style-night/symbols/cricket-m.svg new file mode 100644 index 0000000000..257795813b --- /dev/null +++ b/data/styles/clear/style-night/symbols/cricket-m.svg @@ -0,0 +1,14 @@ + + + + cricket-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/curling-l.svg b/data/styles/clear/style-night/symbols/curling-l.svg new file mode 100644 index 0000000000..03fac16547 --- /dev/null +++ b/data/styles/clear/style-night/symbols/curling-l.svg @@ -0,0 +1,14 @@ + + + + curling-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/curling-m.svg b/data/styles/clear/style-night/symbols/curling-m.svg new file mode 100644 index 0000000000..abdff6e19b --- /dev/null +++ b/data/styles/clear/style-night/symbols/curling-m.svg @@ -0,0 +1,14 @@ + + + + curling-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/department_store-l.svg b/data/styles/clear/style-night/symbols/department_store-l.svg new file mode 100644 index 0000000000..6f6dc4d975 --- /dev/null +++ b/data/styles/clear/style-night/symbols/department_store-l.svg @@ -0,0 +1,14 @@ + + + + department_store-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/department_store-m.svg b/data/styles/clear/style-night/symbols/department_store-m.svg new file mode 100644 index 0000000000..32d57d0d44 --- /dev/null +++ b/data/styles/clear/style-night/symbols/department_store-m.svg @@ -0,0 +1,14 @@ + + + + department_store-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/diving-l.svg b/data/styles/clear/style-night/symbols/diving-l.svg new file mode 100644 index 0000000000..ac50408023 --- /dev/null +++ b/data/styles/clear/style-night/symbols/diving-l.svg @@ -0,0 +1,14 @@ + + + + diving-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/diving-m.svg b/data/styles/clear/style-night/symbols/diving-m.svg new file mode 100644 index 0000000000..4057c987af --- /dev/null +++ b/data/styles/clear/style-night/symbols/diving-m.svg @@ -0,0 +1,14 @@ + + + + diving-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/dog_park-l.svg b/data/styles/clear/style-night/symbols/dog_park-l.svg new file mode 100644 index 0000000000..620e260506 --- /dev/null +++ b/data/styles/clear/style-night/symbols/dog_park-l.svg @@ -0,0 +1,14 @@ + + + + dog_park-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/dog_park-m.svg b/data/styles/clear/style-night/symbols/dog_park-m.svg new file mode 100644 index 0000000000..6a9e6db37c --- /dev/null +++ b/data/styles/clear/style-night/symbols/dog_park-m.svg @@ -0,0 +1,14 @@ + + + + dog_park-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/doityourself-l.svg b/data/styles/clear/style-night/symbols/doityourself-l.svg new file mode 100644 index 0000000000..7c8918c093 --- /dev/null +++ b/data/styles/clear/style-night/symbols/doityourself-l.svg @@ -0,0 +1,14 @@ + + + + doityourself-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/doityourself-m.svg b/data/styles/clear/style-night/symbols/doityourself-m.svg new file mode 100644 index 0000000000..22dcf14d08 --- /dev/null +++ b/data/styles/clear/style-night/symbols/doityourself-m.svg @@ -0,0 +1,14 @@ + + + + doityourself-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/dot-m.svg b/data/styles/clear/style-night/symbols/dot-m.svg index 55b0e04ded..81836212b5 100644 --- a/data/styles/clear/style-night/symbols/dot-m.svg +++ b/data/styles/clear/style-night/symbols/dot-m.svg @@ -1,19 +1,17 @@ - + dot-m Created with Sketch. - - - - - - - - - + + + + + + + diff --git a/data/styles/clear/style-night/symbols/dot-s-light.svg b/data/styles/clear/style-night/symbols/dot-s-light.svg index 511d360f47..2609f295a6 100644 --- a/data/styles/clear/style-night/symbols/dot-s-light.svg +++ b/data/styles/clear/style-night/symbols/dot-s-light.svg @@ -1,20 +1,18 @@ - + dot-s-light Created with Sketch. - - - - - - - - - - + + + + + + + + diff --git a/data/styles/clear/style-night/symbols/dot-s.svg b/data/styles/clear/style-night/symbols/dot-s.svg index c28f1d0636..305b66e454 100644 --- a/data/styles/clear/style-night/symbols/dot-s.svg +++ b/data/styles/clear/style-night/symbols/dot-s.svg @@ -1,20 +1,18 @@ - + dot-s Created with Sketch. - - - - - - - - - - + + + + + + + + diff --git a/data/styles/clear/style-night/symbols/drinking-water-l.svg b/data/styles/clear/style-night/symbols/drinking-water-l.svg index f3c516fa1b..43ac3c3d48 100644 --- a/data/styles/clear/style-night/symbols/drinking-water-l.svg +++ b/data/styles/clear/style-night/symbols/drinking-water-l.svg @@ -1,14 +1,14 @@ - + drinking-water-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/drinking-water-m.svg b/data/styles/clear/style-night/symbols/drinking-water-m.svg index d7f41ae306..a4a68b9093 100644 --- a/data/styles/clear/style-night/symbols/drinking-water-m.svg +++ b/data/styles/clear/style-night/symbols/drinking-water-m.svg @@ -1,14 +1,14 @@ - + drinking-water-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/drinking-water-s.svg b/data/styles/clear/style-night/symbols/drinking-water-s.svg index 302759bc8f..8be3345ffc 100644 --- a/data/styles/clear/style-night/symbols/drinking-water-s.svg +++ b/data/styles/clear/style-night/symbols/drinking-water-s.svg @@ -1,14 +1,14 @@ - + drinking-water-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/electronics-l.svg b/data/styles/clear/style-night/symbols/electronics-l.svg new file mode 100644 index 0000000000..e468c31ba7 --- /dev/null +++ b/data/styles/clear/style-night/symbols/electronics-l.svg @@ -0,0 +1,14 @@ + + + + electronics-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/electronics-m.svg b/data/styles/clear/style-night/symbols/electronics-m.svg new file mode 100644 index 0000000000..10274e7ddc --- /dev/null +++ b/data/styles/clear/style-night/symbols/electronics-m.svg @@ -0,0 +1,14 @@ + + + + electronics-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/embassy-l.svg b/data/styles/clear/style-night/symbols/embassy-l.svg index a9e0af8f0f..06905e8a54 100644 --- a/data/styles/clear/style-night/symbols/embassy-l.svg +++ b/data/styles/clear/style-night/symbols/embassy-l.svg @@ -1,14 +1,14 @@ - + embassy-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/embassy-m.svg b/data/styles/clear/style-night/symbols/embassy-m.svg index 207919dedb..e2bd70e3b9 100644 --- a/data/styles/clear/style-night/symbols/embassy-m.svg +++ b/data/styles/clear/style-night/symbols/embassy-m.svg @@ -1,14 +1,14 @@ - + embassy-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/embassy-s.svg b/data/styles/clear/style-night/symbols/embassy-s.svg index 2047b14330..117b6b60b2 100644 --- a/data/styles/clear/style-night/symbols/embassy-s.svg +++ b/data/styles/clear/style-night/symbols/embassy-s.svg @@ -1,14 +1,14 @@ - + embassy-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fastfood-l.svg b/data/styles/clear/style-night/symbols/fastfood-l.svg index bb90910f53..0bb1e9b505 100644 --- a/data/styles/clear/style-night/symbols/fastfood-l.svg +++ b/data/styles/clear/style-night/symbols/fastfood-l.svg @@ -1,14 +1,14 @@ - + fastfood-l Created with Sketch. - + - + diff --git a/data/styles/clear/style-night/symbols/fastfood-m.svg b/data/styles/clear/style-night/symbols/fastfood-m.svg index cf19682b26..6db7aaa7d7 100644 --- a/data/styles/clear/style-night/symbols/fastfood-m.svg +++ b/data/styles/clear/style-night/symbols/fastfood-m.svg @@ -1,14 +1,14 @@ - + fastfood-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fastfood-s.svg b/data/styles/clear/style-night/symbols/fastfood-s.svg index f8121dd1af..fef23f206c 100644 --- a/data/styles/clear/style-night/symbols/fastfood-s.svg +++ b/data/styles/clear/style-night/symbols/fastfood-s.svg @@ -1,14 +1,14 @@ - + fastfood-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fire_station-l.svg b/data/styles/clear/style-night/symbols/fire_station-l.svg new file mode 100644 index 0000000000..ab98b1528a --- /dev/null +++ b/data/styles/clear/style-night/symbols/fire_station-l.svg @@ -0,0 +1,14 @@ + + + + fire_station-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fire_station-m.svg b/data/styles/clear/style-night/symbols/fire_station-m.svg new file mode 100644 index 0000000000..0b754cf60d --- /dev/null +++ b/data/styles/clear/style-night/symbols/fire_station-m.svg @@ -0,0 +1,14 @@ + + + + fire_station-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fire_station-s.svg b/data/styles/clear/style-night/symbols/fire_station-s.svg new file mode 100644 index 0000000000..91393e2a23 --- /dev/null +++ b/data/styles/clear/style-night/symbols/fire_station-s.svg @@ -0,0 +1,8 @@ + + + + fire_station-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/florist-l.svg b/data/styles/clear/style-night/symbols/florist-l.svg new file mode 100644 index 0000000000..ee5b86f4f6 --- /dev/null +++ b/data/styles/clear/style-night/symbols/florist-l.svg @@ -0,0 +1,14 @@ + + + + florist-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/florist-m.svg b/data/styles/clear/style-night/symbols/florist-m.svg new file mode 100644 index 0000000000..842bdb3451 --- /dev/null +++ b/data/styles/clear/style-night/symbols/florist-m.svg @@ -0,0 +1,14 @@ + + + + florist-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fountain-l.svg b/data/styles/clear/style-night/symbols/fountain-l.svg index 1e8e65f5f7..0835b2b160 100644 --- a/data/styles/clear/style-night/symbols/fountain-l.svg +++ b/data/styles/clear/style-night/symbols/fountain-l.svg @@ -1,14 +1,14 @@ - - + + fountain-l Created with Sketch. - - + + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fountain-m.svg b/data/styles/clear/style-night/symbols/fountain-m.svg index 365b2f2ec5..6ba71530c4 100644 --- a/data/styles/clear/style-night/symbols/fountain-m.svg +++ b/data/styles/clear/style-night/symbols/fountain-m.svg @@ -1,14 +1,14 @@ - - + + fountain-m Created with Sketch. - - + + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fountain-s.svg b/data/styles/clear/style-night/symbols/fountain-s.svg index 7fcbf1dc62..fd749d4469 100644 --- a/data/styles/clear/style-night/symbols/fountain-s.svg +++ b/data/styles/clear/style-night/symbols/fountain-s.svg @@ -1,14 +1,14 @@ - - + + fountain-s Created with Sketch. - - + + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fuel-l.svg b/data/styles/clear/style-night/symbols/fuel-l.svg index 97cb0e1ebe..3e9c261d11 100644 --- a/data/styles/clear/style-night/symbols/fuel-l.svg +++ b/data/styles/clear/style-night/symbols/fuel-l.svg @@ -1,14 +1,14 @@ - + fuel-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fuel-m.svg b/data/styles/clear/style-night/symbols/fuel-m.svg index 829a79ab0d..69e4968d85 100644 --- a/data/styles/clear/style-night/symbols/fuel-m.svg +++ b/data/styles/clear/style-night/symbols/fuel-m.svg @@ -1,14 +1,14 @@ - + fuel-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/fuel-s.svg b/data/styles/clear/style-night/symbols/fuel-s.svg index f4b0519e14..0b5ffeb274 100644 --- a/data/styles/clear/style-night/symbols/fuel-s.svg +++ b/data/styles/clear/style-night/symbols/fuel-s.svg @@ -1,14 +1,14 @@ - + fuel-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/furniture-l.svg b/data/styles/clear/style-night/symbols/furniture-l.svg new file mode 100644 index 0000000000..66769e58da --- /dev/null +++ b/data/styles/clear/style-night/symbols/furniture-l.svg @@ -0,0 +1,14 @@ + + + + furniture-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/furniture-m.svg b/data/styles/clear/style-night/symbols/furniture-m.svg new file mode 100644 index 0000000000..2711c982ee --- /dev/null +++ b/data/styles/clear/style-night/symbols/furniture-m.svg @@ -0,0 +1,14 @@ + + + + furniture-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/gallery-l.svg b/data/styles/clear/style-night/symbols/gallery-l.svg index ef1558f56b..3f3aa20db2 100644 --- a/data/styles/clear/style-night/symbols/gallery-l.svg +++ b/data/styles/clear/style-night/symbols/gallery-l.svg @@ -1,14 +1,14 @@ - + gallery-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/gallery-m.svg b/data/styles/clear/style-night/symbols/gallery-m.svg index 404cb5eb0a..68fb5a55cb 100644 --- a/data/styles/clear/style-night/symbols/gallery-m.svg +++ b/data/styles/clear/style-night/symbols/gallery-m.svg @@ -1,14 +1,14 @@ - + gallery-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/gallery-s.svg b/data/styles/clear/style-night/symbols/gallery-s.svg index 138837d8ec..aed0afb712 100644 --- a/data/styles/clear/style-night/symbols/gallery-s.svg +++ b/data/styles/clear/style-night/symbols/gallery-s.svg @@ -1,14 +1,14 @@ - + gallery-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/garden-l.svg b/data/styles/clear/style-night/symbols/garden-l.svg index bed4236f81..35869cd2c0 100644 --- a/data/styles/clear/style-night/symbols/garden-l.svg +++ b/data/styles/clear/style-night/symbols/garden-l.svg @@ -1,16 +1,14 @@ - + garden-l Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/garden-m.svg b/data/styles/clear/style-night/symbols/garden-m.svg index 33dc61fb1b..7dd5381af7 100644 --- a/data/styles/clear/style-night/symbols/garden-m.svg +++ b/data/styles/clear/style-night/symbols/garden-m.svg @@ -1,16 +1,14 @@ - + garden-m Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/garden-s.svg b/data/styles/clear/style-night/symbols/garden-s.svg index d23a2c15a1..3d109d06c9 100644 --- a/data/styles/clear/style-night/symbols/garden-s.svg +++ b/data/styles/clear/style-night/symbols/garden-s.svg @@ -1,16 +1,14 @@ - + garden-s Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/garden_center-l.svg b/data/styles/clear/style-night/symbols/garden_center-l.svg new file mode 100644 index 0000000000..918822ce52 --- /dev/null +++ b/data/styles/clear/style-night/symbols/garden_center-l.svg @@ -0,0 +1,14 @@ + + + + garden_center-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/garden_center-m.svg b/data/styles/clear/style-night/symbols/garden_center-m.svg new file mode 100644 index 0000000000..e853599770 --- /dev/null +++ b/data/styles/clear/style-night/symbols/garden_center-m.svg @@ -0,0 +1,14 @@ + + + + garden_center-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/gate-l.svg b/data/styles/clear/style-night/symbols/gate-l.svg new file mode 100644 index 0000000000..0d9dc5d5e7 --- /dev/null +++ b/data/styles/clear/style-night/symbols/gate-l.svg @@ -0,0 +1,14 @@ + + + + gate-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/gate-m.svg b/data/styles/clear/style-night/symbols/gate-m.svg new file mode 100644 index 0000000000..44728faffd --- /dev/null +++ b/data/styles/clear/style-night/symbols/gate-m.svg @@ -0,0 +1,14 @@ + + + + gate-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/gift-l.svg b/data/styles/clear/style-night/symbols/gift-l.svg new file mode 100644 index 0000000000..933cfe6777 --- /dev/null +++ b/data/styles/clear/style-night/symbols/gift-l.svg @@ -0,0 +1,14 @@ + + + + gift-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/gift-m.svg b/data/styles/clear/style-night/symbols/gift-m.svg new file mode 100644 index 0000000000..b79a21a686 --- /dev/null +++ b/data/styles/clear/style-night/symbols/gift-m.svg @@ -0,0 +1,14 @@ + + + + gift-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/golf-l.svg b/data/styles/clear/style-night/symbols/golf-l.svg index f79aa0d9be..c7b1c957b4 100644 --- a/data/styles/clear/style-night/symbols/golf-l.svg +++ b/data/styles/clear/style-night/symbols/golf-l.svg @@ -1,14 +1,14 @@ - + golf-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/golf-m.svg b/data/styles/clear/style-night/symbols/golf-m.svg index 30b19a823d..5fb7e73e20 100644 --- a/data/styles/clear/style-night/symbols/golf-m.svg +++ b/data/styles/clear/style-night/symbols/golf-m.svg @@ -1,14 +1,14 @@ - + golf-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/golf-s.svg b/data/styles/clear/style-night/symbols/golf-s.svg index b97e614467..3c495f3683 100644 --- a/data/styles/clear/style-night/symbols/golf-s.svg +++ b/data/styles/clear/style-night/symbols/golf-s.svg @@ -1,14 +1,14 @@ - + golf-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/greengrocer-l.svg b/data/styles/clear/style-night/symbols/greengrocer-l.svg new file mode 100644 index 0000000000..c0b6fa50aa --- /dev/null +++ b/data/styles/clear/style-night/symbols/greengrocer-l.svg @@ -0,0 +1,14 @@ + + + + greengrocer-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/greengrocer-m.svg b/data/styles/clear/style-night/symbols/greengrocer-m.svg new file mode 100644 index 0000000000..2df33a5410 --- /dev/null +++ b/data/styles/clear/style-night/symbols/greengrocer-m.svg @@ -0,0 +1,14 @@ + + + + greengrocer-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/grocery-l.svg b/data/styles/clear/style-night/symbols/grocery-l.svg index c6245b94e0..943238da7f 100644 --- a/data/styles/clear/style-night/symbols/grocery-l.svg +++ b/data/styles/clear/style-night/symbols/grocery-l.svg @@ -1,14 +1,14 @@ - + grocery-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/grocery-m.svg b/data/styles/clear/style-night/symbols/grocery-m.svg index c04a9b9531..abc7f1feed 100644 --- a/data/styles/clear/style-night/symbols/grocery-m.svg +++ b/data/styles/clear/style-night/symbols/grocery-m.svg @@ -1,15 +1,15 @@ - + grocery-m Created with Sketch. - + - + diff --git a/data/styles/clear/style-night/symbols/grocery-s.svg b/data/styles/clear/style-night/symbols/grocery-s.svg index abdabc0ce7..8ae67454eb 100644 --- a/data/styles/clear/style-night/symbols/grocery-s.svg +++ b/data/styles/clear/style-night/symbols/grocery-s.svg @@ -1,14 +1,14 @@ - + grocery-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hairdresser-l.svg b/data/styles/clear/style-night/symbols/hairdresser-l.svg new file mode 100644 index 0000000000..1de3c1eefa --- /dev/null +++ b/data/styles/clear/style-night/symbols/hairdresser-l.svg @@ -0,0 +1,14 @@ + + + + hairdresser-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hairdresser-m.svg b/data/styles/clear/style-night/symbols/hairdresser-m.svg new file mode 100644 index 0000000000..c8defa57d1 --- /dev/null +++ b/data/styles/clear/style-night/symbols/hairdresser-m.svg @@ -0,0 +1,14 @@ + + + + hairdresser-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hardware-l.svg b/data/styles/clear/style-night/symbols/hardware-l.svg new file mode 100644 index 0000000000..f0528ea4d8 --- /dev/null +++ b/data/styles/clear/style-night/symbols/hardware-l.svg @@ -0,0 +1,14 @@ + + + + hardware-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hardware-m.svg b/data/styles/clear/style-night/symbols/hardware-m.svg new file mode 100644 index 0000000000..3313889b69 --- /dev/null +++ b/data/styles/clear/style-night/symbols/hardware-m.svg @@ -0,0 +1,14 @@ + + + + hardware-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/heliport-l.svg b/data/styles/clear/style-night/symbols/heliport-l.svg new file mode 100644 index 0000000000..052d12b414 --- /dev/null +++ b/data/styles/clear/style-night/symbols/heliport-l.svg @@ -0,0 +1,12 @@ + + + + heliport-l + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/heliport-m.svg b/data/styles/clear/style-night/symbols/heliport-m.svg new file mode 100644 index 0000000000..544ec98bba --- /dev/null +++ b/data/styles/clear/style-night/symbols/heliport-m.svg @@ -0,0 +1,13 @@ + + + + heliport-m + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/heliport-s.svg b/data/styles/clear/style-night/symbols/heliport-s.svg new file mode 100644 index 0000000000..014f1b2f8e --- /dev/null +++ b/data/styles/clear/style-night/symbols/heliport-s.svg @@ -0,0 +1,12 @@ + + + + heliport-s + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/historic-ship-l.svg b/data/styles/clear/style-night/symbols/historic-ship-l.svg new file mode 100644 index 0000000000..92e614441a --- /dev/null +++ b/data/styles/clear/style-night/symbols/historic-ship-l.svg @@ -0,0 +1,14 @@ + + + + historic-ship-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/historic-ship-m.svg b/data/styles/clear/style-night/symbols/historic-ship-m.svg new file mode 100644 index 0000000000..89dde7611c --- /dev/null +++ b/data/styles/clear/style-night/symbols/historic-ship-m.svg @@ -0,0 +1,14 @@ + + + + historic-ship-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hospital-l.svg b/data/styles/clear/style-night/symbols/hospital-l.svg index 57e6c322c4..7ffc9b6bec 100644 --- a/data/styles/clear/style-night/symbols/hospital-l.svg +++ b/data/styles/clear/style-night/symbols/hospital-l.svg @@ -1,14 +1,14 @@ - + hospital-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hospital-m.svg b/data/styles/clear/style-night/symbols/hospital-m.svg index cd09db6d03..405339c1c0 100644 --- a/data/styles/clear/style-night/symbols/hospital-m.svg +++ b/data/styles/clear/style-night/symbols/hospital-m.svg @@ -1,14 +1,14 @@ - + hospital-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hospital-s.svg b/data/styles/clear/style-night/symbols/hospital-s.svg index e837b367b1..177c21c9ad 100644 --- a/data/styles/clear/style-night/symbols/hospital-s.svg +++ b/data/styles/clear/style-night/symbols/hospital-s.svg @@ -1,14 +1,14 @@ - + hospital-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hotel-l.svg b/data/styles/clear/style-night/symbols/hotel-l.svg index 49ac5a51ba..1c4e12f305 100644 --- a/data/styles/clear/style-night/symbols/hotel-l.svg +++ b/data/styles/clear/style-night/symbols/hotel-l.svg @@ -1,14 +1,14 @@ - + hotel-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hotel-m.svg b/data/styles/clear/style-night/symbols/hotel-m.svg index 4d277f6679..36b61c031d 100644 --- a/data/styles/clear/style-night/symbols/hotel-m.svg +++ b/data/styles/clear/style-night/symbols/hotel-m.svg @@ -1,14 +1,14 @@ - + hotel-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hotel-s.svg b/data/styles/clear/style-night/symbols/hotel-s.svg index f62a343c2b..a01d996ffb 100644 --- a/data/styles/clear/style-night/symbols/hotel-s.svg +++ b/data/styles/clear/style-night/symbols/hotel-s.svg @@ -1,14 +1,14 @@ - + hotel-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hunting-tower-l.svg b/data/styles/clear/style-night/symbols/hunting-tower-l.svg new file mode 100644 index 0000000000..ee83ef7501 --- /dev/null +++ b/data/styles/clear/style-night/symbols/hunting-tower-l.svg @@ -0,0 +1,18 @@ + + + + hunting-tower-l + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/hunting-tower-m.svg b/data/styles/clear/style-night/symbols/hunting-tower-m.svg new file mode 100644 index 0000000000..e126d10874 --- /dev/null +++ b/data/styles/clear/style-night/symbols/hunting-tower-m.svg @@ -0,0 +1,18 @@ + + + + hunting-tower-m + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/information-l.svg b/data/styles/clear/style-night/symbols/information-l.svg index a3834674e0..c06953cb8d 100644 --- a/data/styles/clear/style-night/symbols/information-l.svg +++ b/data/styles/clear/style-night/symbols/information-l.svg @@ -1,14 +1,14 @@ - + information-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/information-m.svg b/data/styles/clear/style-night/symbols/information-m.svg index 464df06c13..ba649a5f3a 100644 --- a/data/styles/clear/style-night/symbols/information-m.svg +++ b/data/styles/clear/style-night/symbols/information-m.svg @@ -1,14 +1,14 @@ - + information-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/information-s.svg b/data/styles/clear/style-night/symbols/information-s.svg index 79d9ede015..f40bf98a0a 100644 --- a/data/styles/clear/style-night/symbols/information-s.svg +++ b/data/styles/clear/style-night/symbols/information-s.svg @@ -1,14 +1,14 @@ - + information-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/jewelry-l.svg b/data/styles/clear/style-night/symbols/jewelry-l.svg new file mode 100644 index 0000000000..9517cbde45 --- /dev/null +++ b/data/styles/clear/style-night/symbols/jewelry-l.svg @@ -0,0 +1,14 @@ + + + + jewelry-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/jewelry-m.svg b/data/styles/clear/style-night/symbols/jewelry-m.svg new file mode 100644 index 0000000000..3b1968046d --- /dev/null +++ b/data/styles/clear/style-night/symbols/jewelry-m.svg @@ -0,0 +1,14 @@ + + + + jewelry-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/kindergarten-l.svg b/data/styles/clear/style-night/symbols/kindergarten-l.svg index 9fb398e91f..a8b4a402dd 100644 --- a/data/styles/clear/style-night/symbols/kindergarten-l.svg +++ b/data/styles/clear/style-night/symbols/kindergarten-l.svg @@ -1,14 +1,14 @@ - + kindergarten-l Created with Sketch. - + - + diff --git a/data/styles/clear/style-night/symbols/kindergarten-m.svg b/data/styles/clear/style-night/symbols/kindergarten-m.svg index fdb67df3c1..bce1607fc6 100644 --- a/data/styles/clear/style-night/symbols/kindergarten-m.svg +++ b/data/styles/clear/style-night/symbols/kindergarten-m.svg @@ -1,14 +1,14 @@ - + kindergarten-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/kindergarten-s.svg b/data/styles/clear/style-night/symbols/kindergarten-s.svg index 5ca5995ca3..e0d41986ef 100644 --- a/data/styles/clear/style-night/symbols/kindergarten-s.svg +++ b/data/styles/clear/style-night/symbols/kindergarten-s.svg @@ -1,14 +1,14 @@ - + kindergarten-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/kiosk-l.svg b/data/styles/clear/style-night/symbols/kiosk-l.svg new file mode 100644 index 0000000000..3698791024 --- /dev/null +++ b/data/styles/clear/style-night/symbols/kiosk-l.svg @@ -0,0 +1,14 @@ + + + + kiosk-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/kiosk-m.svg b/data/styles/clear/style-night/symbols/kiosk-m.svg new file mode 100644 index 0000000000..16bdfea695 --- /dev/null +++ b/data/styles/clear/style-night/symbols/kiosk-m.svg @@ -0,0 +1,14 @@ + + + + kiosk-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/laundry-l.svg b/data/styles/clear/style-night/symbols/laundry-l.svg index 4a0d0ae1e3..1502993461 100644 --- a/data/styles/clear/style-night/symbols/laundry-l.svg +++ b/data/styles/clear/style-night/symbols/laundry-l.svg @@ -1,18 +1,16 @@ - + laundry-l Created with Sketch. - - - - - - - - + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/laundry-m.svg b/data/styles/clear/style-night/symbols/laundry-m.svg index fea76aaa11..fe12545539 100644 --- a/data/styles/clear/style-night/symbols/laundry-m.svg +++ b/data/styles/clear/style-night/symbols/laundry-m.svg @@ -1,18 +1,16 @@ - + laundry-m Created with Sketch. - - - - - - - - + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/library-l.svg b/data/styles/clear/style-night/symbols/library-l.svg index a7a2000fe0..b06f2e4a1e 100644 --- a/data/styles/clear/style-night/symbols/library-l.svg +++ b/data/styles/clear/style-night/symbols/library-l.svg @@ -1,14 +1,14 @@ - + library-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/library-m.svg b/data/styles/clear/style-night/symbols/library-m.svg index ac3e1f0f19..4d438965ae 100644 --- a/data/styles/clear/style-night/symbols/library-m.svg +++ b/data/styles/clear/style-night/symbols/library-m.svg @@ -1,14 +1,14 @@ - + library-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/library-s.svg b/data/styles/clear/style-night/symbols/library-s.svg index b7e7f337d3..2d35acdc4b 100644 --- a/data/styles/clear/style-night/symbols/library-s.svg +++ b/data/styles/clear/style-night/symbols/library-s.svg @@ -1,14 +1,14 @@ - + library-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/lift_gate-l.svg b/data/styles/clear/style-night/symbols/lift_gate-l.svg new file mode 100644 index 0000000000..e4d093c141 --- /dev/null +++ b/data/styles/clear/style-night/symbols/lift_gate-l.svg @@ -0,0 +1,14 @@ + + + + lift_gate-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/lift_gate-m.svg b/data/styles/clear/style-night/symbols/lift_gate-m.svg new file mode 100644 index 0000000000..4cd4d64faa --- /dev/null +++ b/data/styles/clear/style-night/symbols/lift_gate-m.svg @@ -0,0 +1,14 @@ + + + + lift_gate-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/lighthouse-l.svg b/data/styles/clear/style-night/symbols/lighthouse-l.svg index e249735f9f..e8dee12ed3 100644 --- a/data/styles/clear/style-night/symbols/lighthouse-l.svg +++ b/data/styles/clear/style-night/symbols/lighthouse-l.svg @@ -1,14 +1,14 @@ - + lighthouse-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/lighthouse-m.svg b/data/styles/clear/style-night/symbols/lighthouse-m.svg index f41eff8f9a..0e2ae38822 100644 --- a/data/styles/clear/style-night/symbols/lighthouse-m.svg +++ b/data/styles/clear/style-night/symbols/lighthouse-m.svg @@ -1,14 +1,14 @@ - + lighthouse-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/lighthouse-s.svg b/data/styles/clear/style-night/symbols/lighthouse-s.svg index 58779c960c..f565dea08b 100644 --- a/data/styles/clear/style-night/symbols/lighthouse-s.svg +++ b/data/styles/clear/style-night/symbols/lighthouse-s.svg @@ -1,14 +1,14 @@ - + lighthouse-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/mail-l.svg b/data/styles/clear/style-night/symbols/mail-l.svg index 94df13c7db..1b4ff848cc 100644 --- a/data/styles/clear/style-night/symbols/mail-l.svg +++ b/data/styles/clear/style-night/symbols/mail-l.svg @@ -1,14 +1,14 @@ - + mail-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/mail-m.svg b/data/styles/clear/style-night/symbols/mail-m.svg index 16e2c8f7cf..4a46ab4ddb 100644 --- a/data/styles/clear/style-night/symbols/mail-m.svg +++ b/data/styles/clear/style-night/symbols/mail-m.svg @@ -1,14 +1,14 @@ - + mail-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/mail-s.svg b/data/styles/clear/style-night/symbols/mail-s.svg index 950553d058..822c0eb0c4 100644 --- a/data/styles/clear/style-night/symbols/mail-s.svg +++ b/data/styles/clear/style-night/symbols/mail-s.svg @@ -1,14 +1,14 @@ - + mail-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/marketplace-l.svg b/data/styles/clear/style-night/symbols/marketplace-l.svg new file mode 100644 index 0000000000..110b43c770 --- /dev/null +++ b/data/styles/clear/style-night/symbols/marketplace-l.svg @@ -0,0 +1,14 @@ + + + + marketplace-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/marketplace-m.svg b/data/styles/clear/style-night/symbols/marketplace-m.svg new file mode 100644 index 0000000000..49213f1ab2 --- /dev/null +++ b/data/styles/clear/style-night/symbols/marketplace-m.svg @@ -0,0 +1,14 @@ + + + + marketplace-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/military-l.svg b/data/styles/clear/style-night/symbols/military-l.svg index f0e228dc12..c4fac5dc8a 100644 --- a/data/styles/clear/style-night/symbols/military-l.svg +++ b/data/styles/clear/style-night/symbols/military-l.svg @@ -1,14 +1,14 @@ - - + + military-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/military-m.svg b/data/styles/clear/style-night/symbols/military-m.svg index 77f53d8ff1..286f0c675e 100644 --- a/data/styles/clear/style-night/symbols/military-m.svg +++ b/data/styles/clear/style-night/symbols/military-m.svg @@ -1,14 +1,14 @@ - - - military-m copy + + + military-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/military-s.svg b/data/styles/clear/style-night/symbols/military-s.svg index e21dca17c3..6e3695188a 100644 --- a/data/styles/clear/style-night/symbols/military-s.svg +++ b/data/styles/clear/style-night/symbols/military-s.svg @@ -1,14 +1,14 @@ - - + + military-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/mobile_phone-l.svg b/data/styles/clear/style-night/symbols/mobile_phone-l.svg new file mode 100644 index 0000000000..2564642f83 --- /dev/null +++ b/data/styles/clear/style-night/symbols/mobile_phone-l.svg @@ -0,0 +1,14 @@ + + + + mobile_phone-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/mobile_phone-m.svg b/data/styles/clear/style-night/symbols/mobile_phone-m.svg new file mode 100644 index 0000000000..dee2452efa --- /dev/null +++ b/data/styles/clear/style-night/symbols/mobile_phone-m.svg @@ -0,0 +1,14 @@ + + + + mobile_phone-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/monument-l.svg b/data/styles/clear/style-night/symbols/monument-l.svg index cedc15769a..691da22726 100644 --- a/data/styles/clear/style-night/symbols/monument-l.svg +++ b/data/styles/clear/style-night/symbols/monument-l.svg @@ -1,19 +1,19 @@ - + monument-l Created with Sketch. - + - + - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/monument-m.svg b/data/styles/clear/style-night/symbols/monument-m.svg index 3dc39f9562..7de5c9cb24 100644 --- a/data/styles/clear/style-night/symbols/monument-m.svg +++ b/data/styles/clear/style-night/symbols/monument-m.svg @@ -1,19 +1,19 @@ - + monument-m Created with Sketch. - + - + - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/monument-s.svg b/data/styles/clear/style-night/symbols/monument-s.svg index cfdd33f8e9..3e3ba1fe67 100644 --- a/data/styles/clear/style-night/symbols/monument-s.svg +++ b/data/styles/clear/style-night/symbols/monument-s.svg @@ -1,19 +1,19 @@ - + monument-s Created with Sketch. - + - + - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/motel-l.svg b/data/styles/clear/style-night/symbols/motel-l.svg new file mode 100644 index 0000000000..0c62947cf5 --- /dev/null +++ b/data/styles/clear/style-night/symbols/motel-l.svg @@ -0,0 +1,14 @@ + + + + motel-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/motel-m.svg b/data/styles/clear/style-night/symbols/motel-m.svg new file mode 100644 index 0000000000..09f5f98a23 --- /dev/null +++ b/data/styles/clear/style-night/symbols/motel-m.svg @@ -0,0 +1,14 @@ + + + + motel-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/museum-l.svg b/data/styles/clear/style-night/symbols/museum-l.svg index d7680e1faa..a06df246e9 100644 --- a/data/styles/clear/style-night/symbols/museum-l.svg +++ b/data/styles/clear/style-night/symbols/museum-l.svg @@ -1,14 +1,14 @@ - + museum-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/museum-m.svg b/data/styles/clear/style-night/symbols/museum-m.svg index 6b82071537..2b047a1e69 100644 --- a/data/styles/clear/style-night/symbols/museum-m.svg +++ b/data/styles/clear/style-night/symbols/museum-m.svg @@ -1,14 +1,14 @@ - + museum-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/museum-s.svg b/data/styles/clear/style-night/symbols/museum-s.svg index 52ea6ab9f9..d21f1537c8 100644 --- a/data/styles/clear/style-night/symbols/museum-s.svg +++ b/data/styles/clear/style-night/symbols/museum-s.svg @@ -1,15 +1,15 @@ - + museum-s Created with Sketch. - + - + diff --git a/data/styles/clear/style-night/symbols/none.svg b/data/styles/clear/style-night/symbols/none.svg index 5a9a954ab1..07bf72d5f2 100644 --- a/data/styles/clear/style-night/symbols/none.svg +++ b/data/styles/clear/style-night/symbols/none.svg @@ -1,6 +1,6 @@ - + none Created with Sketch. diff --git a/data/styles/clear/style-night/symbols/npark-l.svg b/data/styles/clear/style-night/symbols/npark-l.svg index 7a51d0b962..1b0be89f7e 100644 --- a/data/styles/clear/style-night/symbols/npark-l.svg +++ b/data/styles/clear/style-night/symbols/npark-l.svg @@ -1,16 +1,14 @@ - + npark-l Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/npark-m.svg b/data/styles/clear/style-night/symbols/npark-m.svg index 4242e4e2c6..71839fae3a 100644 --- a/data/styles/clear/style-night/symbols/npark-m.svg +++ b/data/styles/clear/style-night/symbols/npark-m.svg @@ -1,16 +1,14 @@ - + npark-m Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/npark-s.svg b/data/styles/clear/style-night/symbols/npark-s.svg index 8b780d2f19..5281cc5803 100644 --- a/data/styles/clear/style-night/symbols/npark-s.svg +++ b/data/styles/clear/style-night/symbols/npark-s.svg @@ -1,16 +1,14 @@ - - npark-s + + npark-s Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/nparkF-l.svg b/data/styles/clear/style-night/symbols/nparkF-l.svg index d2fc5c3415..9c9bdc759b 100644 --- a/data/styles/clear/style-night/symbols/nparkF-l.svg +++ b/data/styles/clear/style-night/symbols/nparkF-l.svg @@ -1,14 +1,14 @@ - + nparkF-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/nparkF-m.svg b/data/styles/clear/style-night/symbols/nparkF-m.svg index 4acd240520..a1d146778a 100644 --- a/data/styles/clear/style-night/symbols/nparkF-m.svg +++ b/data/styles/clear/style-night/symbols/nparkF-m.svg @@ -1,14 +1,14 @@ - - nparkF-m + + nparkF-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/nparkF-s.svg b/data/styles/clear/style-night/symbols/nparkF-s.svg index ce83354621..3931c96f9c 100644 --- a/data/styles/clear/style-night/symbols/nparkF-s.svg +++ b/data/styles/clear/style-night/symbols/nparkF-s.svg @@ -1,14 +1,14 @@ - + nparkF-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/office-l.svg b/data/styles/clear/style-night/symbols/office-l.svg new file mode 100644 index 0000000000..41a59dfd5c --- /dev/null +++ b/data/styles/clear/style-night/symbols/office-l.svg @@ -0,0 +1,12 @@ + + + + office-l + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/office-m.svg b/data/styles/clear/style-night/symbols/office-m.svg new file mode 100644 index 0000000000..dcc9563ea9 --- /dev/null +++ b/data/styles/clear/style-night/symbols/office-m.svg @@ -0,0 +1,12 @@ + + + + office-m + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/office-s.svg b/data/styles/clear/style-night/symbols/office-s.svg new file mode 100644 index 0000000000..1934e2e55f --- /dev/null +++ b/data/styles/clear/style-night/symbols/office-s.svg @@ -0,0 +1,12 @@ + + + + office-s + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/optician-l.svg b/data/styles/clear/style-night/symbols/optician-l.svg new file mode 100644 index 0000000000..b3b0b0910e --- /dev/null +++ b/data/styles/clear/style-night/symbols/optician-l.svg @@ -0,0 +1,14 @@ + + + + optician-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/optician-m.svg b/data/styles/clear/style-night/symbols/optician-m.svg new file mode 100644 index 0000000000..a5ea17ef0f --- /dev/null +++ b/data/styles/clear/style-night/symbols/optician-m.svg @@ -0,0 +1,14 @@ + + + + optician-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/park-l.svg b/data/styles/clear/style-night/symbols/park-l.svg index d1bdf305a3..8094074b3a 100644 --- a/data/styles/clear/style-night/symbols/park-l.svg +++ b/data/styles/clear/style-night/symbols/park-l.svg @@ -1,16 +1,14 @@ - + park-l Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/park-m.svg b/data/styles/clear/style-night/symbols/park-m.svg index d9da9acc89..ae0f065e70 100644 --- a/data/styles/clear/style-night/symbols/park-m.svg +++ b/data/styles/clear/style-night/symbols/park-m.svg @@ -1,16 +1,14 @@ - + park-m Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/park-s.svg b/data/styles/clear/style-night/symbols/park-s.svg index a75029b0bb..264a1e882d 100644 --- a/data/styles/clear/style-night/symbols/park-s.svg +++ b/data/styles/clear/style-night/symbols/park-s.svg @@ -1,16 +1,14 @@ - + park-s Created with Sketch. - - - - - - + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/parking-meter-l.svg b/data/styles/clear/style-night/symbols/parking-meter-l.svg new file mode 100644 index 0000000000..e892ad517e --- /dev/null +++ b/data/styles/clear/style-night/symbols/parking-meter-l.svg @@ -0,0 +1,14 @@ + + + + parking-meter-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/parking-meter-m.svg b/data/styles/clear/style-night/symbols/parking-meter-m.svg new file mode 100644 index 0000000000..59a66cdc24 --- /dev/null +++ b/data/styles/clear/style-night/symbols/parking-meter-m.svg @@ -0,0 +1,14 @@ + + + + parking-meter-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/peak-l.svg b/data/styles/clear/style-night/symbols/peak-l.svg index 7e6f2db5ad..a71222e6da 100644 --- a/data/styles/clear/style-night/symbols/peak-l.svg +++ b/data/styles/clear/style-night/symbols/peak-l.svg @@ -1,14 +1,12 @@ - + peak-l Created with Sketch. - - - - + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/peak-m.svg b/data/styles/clear/style-night/symbols/peak-m.svg index d57db16930..f2608d795e 100644 --- a/data/styles/clear/style-night/symbols/peak-m.svg +++ b/data/styles/clear/style-night/symbols/peak-m.svg @@ -1,14 +1,12 @@ - + peak-m Created with Sketch. - - - - + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/peak-s.svg b/data/styles/clear/style-night/symbols/peak-s.svg index 40c2ae4fc1..4070108292 100644 --- a/data/styles/clear/style-night/symbols/peak-s.svg +++ b/data/styles/clear/style-night/symbols/peak-s.svg @@ -1,14 +1,12 @@ - + peak-s Created with Sketch. - - - - + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/peakt-l.svg b/data/styles/clear/style-night/symbols/peakt-l.svg index 65e2491cc5..e6f4c34bb7 100644 --- a/data/styles/clear/style-night/symbols/peakt-l.svg +++ b/data/styles/clear/style-night/symbols/peakt-l.svg @@ -1,10 +1,10 @@ - + peakt-l Created with Sketch. - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/peakt-m.svg b/data/styles/clear/style-night/symbols/peakt-m.svg index 3bac8f8bd6..25f2cfc1d5 100644 --- a/data/styles/clear/style-night/symbols/peakt-m.svg +++ b/data/styles/clear/style-night/symbols/peakt-m.svg @@ -1,10 +1,10 @@ - + peakt-m Created with Sketch. - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/peakt-s.svg b/data/styles/clear/style-night/symbols/peakt-s.svg index 3f147b47f8..9ae67984b5 100644 --- a/data/styles/clear/style-night/symbols/peakt-s.svg +++ b/data/styles/clear/style-night/symbols/peakt-s.svg @@ -1,10 +1,10 @@ - + peakt-s Created with Sketch. - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/pharmacy-l.svg b/data/styles/clear/style-night/symbols/pharmacy-l.svg index 03567fe39f..62215b7b91 100644 --- a/data/styles/clear/style-night/symbols/pharmacy-l.svg +++ b/data/styles/clear/style-night/symbols/pharmacy-l.svg @@ -1,14 +1,14 @@ - + pharmacy-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/pharmacy-m.svg b/data/styles/clear/style-night/symbols/pharmacy-m.svg index f7fddf48f5..7f72818fa1 100644 --- a/data/styles/clear/style-night/symbols/pharmacy-m.svg +++ b/data/styles/clear/style-night/symbols/pharmacy-m.svg @@ -1,16 +1,16 @@ - + pharmacy-m Created with Sketch. - + - - + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/phone-l.svg b/data/styles/clear/style-night/symbols/phone-l.svg index df87477b5b..f399fd69ea 100644 --- a/data/styles/clear/style-night/symbols/phone-l.svg +++ b/data/styles/clear/style-night/symbols/phone-l.svg @@ -1,14 +1,14 @@ - + phone-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/phone-m.svg b/data/styles/clear/style-night/symbols/phone-m.svg index f6e6796f3c..3f2a31a958 100644 --- a/data/styles/clear/style-night/symbols/phone-m.svg +++ b/data/styles/clear/style-night/symbols/phone-m.svg @@ -1,14 +1,14 @@ - + phone-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/phone-s.svg b/data/styles/clear/style-night/symbols/phone-s.svg index bac0cf88dd..d052272eee 100644 --- a/data/styles/clear/style-night/symbols/phone-s.svg +++ b/data/styles/clear/style-night/symbols/phone-s.svg @@ -1,14 +1,14 @@ - + phone-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/picnic-l.svg b/data/styles/clear/style-night/symbols/picnic-l.svg new file mode 100644 index 0000000000..03dbd5aa58 --- /dev/null +++ b/data/styles/clear/style-night/symbols/picnic-l.svg @@ -0,0 +1,14 @@ + + + + picnic-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/picnic-m.svg b/data/styles/clear/style-night/symbols/picnic-m.svg new file mode 100644 index 0000000000..b5c3a637dd --- /dev/null +++ b/data/styles/clear/style-night/symbols/picnic-m.svg @@ -0,0 +1,14 @@ + + + + picnic-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/picnic-s.svg b/data/styles/clear/style-night/symbols/picnic-s.svg new file mode 100644 index 0000000000..58e038837c --- /dev/null +++ b/data/styles/clear/style-night/symbols/picnic-s.svg @@ -0,0 +1,14 @@ + + + + picnic-s + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/pitch-l.svg b/data/styles/clear/style-night/symbols/pitch-l.svg index 37a483a9bf..59ee956969 100644 --- a/data/styles/clear/style-night/symbols/pitch-l.svg +++ b/data/styles/clear/style-night/symbols/pitch-l.svg @@ -1,14 +1,14 @@ - + pitch-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/pitch-m.svg b/data/styles/clear/style-night/symbols/pitch-m.svg index 4d60026224..255745d0a3 100644 --- a/data/styles/clear/style-night/symbols/pitch-m.svg +++ b/data/styles/clear/style-night/symbols/pitch-m.svg @@ -1,14 +1,14 @@ - + pitch-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/pitch-s.svg b/data/styles/clear/style-night/symbols/pitch-s.svg index 6f47cd0028..ba5d6ebc7c 100644 --- a/data/styles/clear/style-night/symbols/pitch-s.svg +++ b/data/styles/clear/style-night/symbols/pitch-s.svg @@ -1,14 +1,14 @@ - + pitch-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/place-of-worship-l.svg b/data/styles/clear/style-night/symbols/place-of-worship-l.svg index 66a893c514..ff15114c44 100644 --- a/data/styles/clear/style-night/symbols/place-of-worship-l.svg +++ b/data/styles/clear/style-night/symbols/place-of-worship-l.svg @@ -1,14 +1,14 @@ - + place-of-worship-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/place-of-worship-m.svg b/data/styles/clear/style-night/symbols/place-of-worship-m.svg index b934a24366..7198629d27 100644 --- a/data/styles/clear/style-night/symbols/place-of-worship-m.svg +++ b/data/styles/clear/style-night/symbols/place-of-worship-m.svg @@ -1,14 +1,14 @@ - + place-of-worship-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/place-of-worship-s.svg b/data/styles/clear/style-night/symbols/place-of-worship-s.svg index e701192ea2..2f73d2cafc 100644 --- a/data/styles/clear/style-night/symbols/place-of-worship-s.svg +++ b/data/styles/clear/style-night/symbols/place-of-worship-s.svg @@ -1,14 +1,14 @@ - + place-of-worship-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/police-l.svg b/data/styles/clear/style-night/symbols/police-l.svg index a81098cb64..2e2468f08b 100644 --- a/data/styles/clear/style-night/symbols/police-l.svg +++ b/data/styles/clear/style-night/symbols/police-l.svg @@ -1,14 +1,14 @@ - + police-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/police-m.svg b/data/styles/clear/style-night/symbols/police-m.svg index 8cbb6f9b42..ced0a3782a 100644 --- a/data/styles/clear/style-night/symbols/police-m.svg +++ b/data/styles/clear/style-night/symbols/police-m.svg @@ -1,14 +1,14 @@ - + police-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/police-s.svg b/data/styles/clear/style-night/symbols/police-s.svg index 1c2a4d30e1..939a4d84b8 100644 --- a/data/styles/clear/style-night/symbols/police-s.svg +++ b/data/styles/clear/style-night/symbols/police-s.svg @@ -1,14 +1,14 @@ - + police-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/postbox-l.svg b/data/styles/clear/style-night/symbols/postbox-l.svg new file mode 100644 index 0000000000..5a726b4c29 --- /dev/null +++ b/data/styles/clear/style-night/symbols/postbox-l.svg @@ -0,0 +1,14 @@ + + + + postbox-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/postbox-m.svg b/data/styles/clear/style-night/symbols/postbox-m.svg new file mode 100644 index 0000000000..9ca9db34c0 --- /dev/null +++ b/data/styles/clear/style-night/symbols/postbox-m.svg @@ -0,0 +1,14 @@ + + + + postbox-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/pub-l.svg b/data/styles/clear/style-night/symbols/pub-l.svg index 6f10864cc2..bc22c8639e 100644 --- a/data/styles/clear/style-night/symbols/pub-l.svg +++ b/data/styles/clear/style-night/symbols/pub-l.svg @@ -1,14 +1,14 @@ - + pub-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/pub-m.svg b/data/styles/clear/style-night/symbols/pub-m.svg index 8a6b256f1d..b315d618e1 100644 --- a/data/styles/clear/style-night/symbols/pub-m.svg +++ b/data/styles/clear/style-night/symbols/pub-m.svg @@ -1,14 +1,14 @@ - + pub-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/pub-s.svg b/data/styles/clear/style-night/symbols/pub-s.svg index 7dce8d2d90..1bd8fcfb6e 100644 --- a/data/styles/clear/style-night/symbols/pub-s.svg +++ b/data/styles/clear/style-night/symbols/pub-s.svg @@ -1,14 +1,14 @@ - + pub-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/recycling-l.svg b/data/styles/clear/style-night/symbols/recycling-l.svg index 3c16955498..eab9a0ef0f 100644 --- a/data/styles/clear/style-night/symbols/recycling-l.svg +++ b/data/styles/clear/style-night/symbols/recycling-l.svg @@ -1,14 +1,14 @@ - + recycling-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/recycling-m.svg b/data/styles/clear/style-night/symbols/recycling-m.svg index a6d1bf4ac0..b9262987fe 100644 --- a/data/styles/clear/style-night/symbols/recycling-m.svg +++ b/data/styles/clear/style-night/symbols/recycling-m.svg @@ -1,14 +1,14 @@ - + recycling-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/recycling-s.svg b/data/styles/clear/style-night/symbols/recycling-s.svg index a6ac179fd0..064868f821 100644 --- a/data/styles/clear/style-night/symbols/recycling-s.svg +++ b/data/styles/clear/style-night/symbols/recycling-s.svg @@ -1,14 +1,14 @@ - + recycling-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/remains-l.svg b/data/styles/clear/style-night/symbols/remains-l.svg new file mode 100644 index 0000000000..dea5f4d449 --- /dev/null +++ b/data/styles/clear/style-night/symbols/remains-l.svg @@ -0,0 +1,15 @@ + + + + remains-l + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/remains-m.svg b/data/styles/clear/style-night/symbols/remains-m.svg new file mode 100644 index 0000000000..1f47de498f --- /dev/null +++ b/data/styles/clear/style-night/symbols/remains-m.svg @@ -0,0 +1,15 @@ + + + + remains-m + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/remains-s.svg b/data/styles/clear/style-night/symbols/remains-s.svg new file mode 100644 index 0000000000..42ccc28d43 --- /dev/null +++ b/data/styles/clear/style-night/symbols/remains-s.svg @@ -0,0 +1,15 @@ + + + + remains-s + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/restaurant-l.svg b/data/styles/clear/style-night/symbols/restaurant-l.svg index d2633d200c..52ebf318e6 100644 --- a/data/styles/clear/style-night/symbols/restaurant-l.svg +++ b/data/styles/clear/style-night/symbols/restaurant-l.svg @@ -1,14 +1,14 @@ - + restaurant-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/restaurant-m.svg b/data/styles/clear/style-night/symbols/restaurant-m.svg index 16d7ab55fc..ba528ecfc5 100644 --- a/data/styles/clear/style-night/symbols/restaurant-m.svg +++ b/data/styles/clear/style-night/symbols/restaurant-m.svg @@ -1,14 +1,14 @@ - + restaurant-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/restaurant-s.svg b/data/styles/clear/style-night/symbols/restaurant-s.svg index 556e07bcb2..db51413a3f 100644 --- a/data/styles/clear/style-night/symbols/restaurant-s.svg +++ b/data/styles/clear/style-night/symbols/restaurant-s.svg @@ -1,14 +1,14 @@ - + restaurant-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/school-l.svg b/data/styles/clear/style-night/symbols/school-l.svg index 00577370a8..2b6f340cab 100644 --- a/data/styles/clear/style-night/symbols/school-l.svg +++ b/data/styles/clear/style-night/symbols/school-l.svg @@ -1,14 +1,14 @@ - + school-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/school-m.svg b/data/styles/clear/style-night/symbols/school-m.svg index 7ea1532cc0..13fe8fd9ca 100644 --- a/data/styles/clear/style-night/symbols/school-m.svg +++ b/data/styles/clear/style-night/symbols/school-m.svg @@ -1,14 +1,14 @@ - + school-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/school-s.svg b/data/styles/clear/style-night/symbols/school-s.svg index facec15ba5..c901d013c3 100644 --- a/data/styles/clear/style-night/symbols/school-s.svg +++ b/data/styles/clear/style-night/symbols/school-s.svg @@ -1,14 +1,14 @@ - + school-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/shoes-l.svg b/data/styles/clear/style-night/symbols/shoes-l.svg new file mode 100644 index 0000000000..6fd4d1be23 --- /dev/null +++ b/data/styles/clear/style-night/symbols/shoes-l.svg @@ -0,0 +1,14 @@ + + + + shoes-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/shoes-m.svg b/data/styles/clear/style-night/symbols/shoes-m.svg new file mode 100644 index 0000000000..991b1e164a --- /dev/null +++ b/data/styles/clear/style-night/symbols/shoes-m.svg @@ -0,0 +1,14 @@ + + + + shoes-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/shop-bicycle-l.svg b/data/styles/clear/style-night/symbols/shop-bicycle-l.svg new file mode 100644 index 0000000000..bfb16fbc22 --- /dev/null +++ b/data/styles/clear/style-night/symbols/shop-bicycle-l.svg @@ -0,0 +1,14 @@ + + + + shop-bicycle-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/shop-bicycle-m.svg b/data/styles/clear/style-night/symbols/shop-bicycle-m.svg new file mode 100644 index 0000000000..95de7481ce --- /dev/null +++ b/data/styles/clear/style-night/symbols/shop-bicycle-m.svg @@ -0,0 +1,14 @@ + + + + shop-bicycle-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/shop-l.svg b/data/styles/clear/style-night/symbols/shop-l.svg index 08424f85cf..ff4e0c001e 100644 --- a/data/styles/clear/style-night/symbols/shop-l.svg +++ b/data/styles/clear/style-night/symbols/shop-l.svg @@ -1,14 +1,14 @@ - + shop-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/shop-m.svg b/data/styles/clear/style-night/symbols/shop-m.svg index e61e019316..6df66b0854 100644 --- a/data/styles/clear/style-night/symbols/shop-m.svg +++ b/data/styles/clear/style-night/symbols/shop-m.svg @@ -1,14 +1,14 @@ - + shop-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/shop-s.svg b/data/styles/clear/style-night/symbols/shop-s.svg index 9a1af19dde..affc2670a6 100644 --- a/data/styles/clear/style-night/symbols/shop-s.svg +++ b/data/styles/clear/style-night/symbols/shop-s.svg @@ -1,14 +1,14 @@ - + shop-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/skiing-l.svg b/data/styles/clear/style-night/symbols/skiing-l.svg index fa35bbef9f..bc80c458d1 100644 --- a/data/styles/clear/style-night/symbols/skiing-l.svg +++ b/data/styles/clear/style-night/symbols/skiing-l.svg @@ -1,14 +1,14 @@ - + skiing-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/skiing-m.svg b/data/styles/clear/style-night/symbols/skiing-m.svg index f293c25d37..bc10cd6e13 100644 --- a/data/styles/clear/style-night/symbols/skiing-m.svg +++ b/data/styles/clear/style-night/symbols/skiing-m.svg @@ -1,14 +1,14 @@ - + skiing-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/skiing-s.svg b/data/styles/clear/style-night/symbols/skiing-s.svg index 0d1622a54a..baa9d759a3 100644 --- a/data/styles/clear/style-night/symbols/skiing-s.svg +++ b/data/styles/clear/style-night/symbols/skiing-s.svg @@ -1,14 +1,14 @@ - + skiing-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/soccer-l.svg b/data/styles/clear/style-night/symbols/soccer-l.svg index 79e2156d56..c2dbd03949 100644 --- a/data/styles/clear/style-night/symbols/soccer-l.svg +++ b/data/styles/clear/style-night/symbols/soccer-l.svg @@ -1,14 +1,14 @@ - + soccer-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/soccer-m.svg b/data/styles/clear/style-night/symbols/soccer-m.svg index 101cb24f27..86907fa2c1 100644 --- a/data/styles/clear/style-night/symbols/soccer-m.svg +++ b/data/styles/clear/style-night/symbols/soccer-m.svg @@ -1,14 +1,14 @@ - + soccer-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/soccer-s.svg b/data/styles/clear/style-night/symbols/soccer-s.svg index 4916118387..cce7be8b5c 100644 --- a/data/styles/clear/style-night/symbols/soccer-s.svg +++ b/data/styles/clear/style-night/symbols/soccer-s.svg @@ -1,14 +1,14 @@ - + soccer-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/sports-l.svg b/data/styles/clear/style-night/symbols/sports-l.svg new file mode 100644 index 0000000000..63c934db94 --- /dev/null +++ b/data/styles/clear/style-night/symbols/sports-l.svg @@ -0,0 +1,14 @@ + + + + sports-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/sports-m.svg b/data/styles/clear/style-night/symbols/sports-m.svg new file mode 100644 index 0000000000..82b901e674 --- /dev/null +++ b/data/styles/clear/style-night/symbols/sports-m.svg @@ -0,0 +1,14 @@ + + + + sports-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/star-l.svg b/data/styles/clear/style-night/symbols/star-l.svg index c39fc66ae0..5ff4cc3f8b 100644 --- a/data/styles/clear/style-night/symbols/star-l.svg +++ b/data/styles/clear/style-night/symbols/star-l.svg @@ -1,21 +1,19 @@ - + star-l Created with Sketch. - - - - - - - - - - - + + + + + + + + + diff --git a/data/styles/clear/style-night/symbols/star-m.svg b/data/styles/clear/style-night/symbols/star-m.svg index 75da5ac573..9fb4c8f04b 100644 --- a/data/styles/clear/style-night/symbols/star-m.svg +++ b/data/styles/clear/style-night/symbols/star-m.svg @@ -1,18 +1,16 @@ - + star-m Created with Sketch. - - - - - - - - + + + + + + diff --git a/data/styles/clear/style-night/symbols/star-s.svg b/data/styles/clear/style-night/symbols/star-s.svg index 14f0ea2205..26a35e9ee8 100644 --- a/data/styles/clear/style-night/symbols/star-s.svg +++ b/data/styles/clear/style-night/symbols/star-s.svg @@ -1,18 +1,16 @@ - + star-s Created with Sketch. - - - - - - - - + + + + + + diff --git a/data/styles/clear/style-night/symbols/sweets-l.svg b/data/styles/clear/style-night/symbols/sweets-l.svg new file mode 100644 index 0000000000..57b1417ddd --- /dev/null +++ b/data/styles/clear/style-night/symbols/sweets-l.svg @@ -0,0 +1,14 @@ + + + + sweets-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/sweets-m.svg b/data/styles/clear/style-night/symbols/sweets-m.svg new file mode 100644 index 0000000000..83853a4981 --- /dev/null +++ b/data/styles/clear/style-night/symbols/sweets-m.svg @@ -0,0 +1,14 @@ + + + + sweets-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/swimming-l.svg b/data/styles/clear/style-night/symbols/swimming-l.svg index 2b84d81ee7..6a9a7405bf 100644 --- a/data/styles/clear/style-night/symbols/swimming-l.svg +++ b/data/styles/clear/style-night/symbols/swimming-l.svg @@ -1,14 +1,14 @@ - + swimming-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/swimming-m.svg b/data/styles/clear/style-night/symbols/swimming-m.svg index 689beecc24..93f35a7db7 100644 --- a/data/styles/clear/style-night/symbols/swimming-m.svg +++ b/data/styles/clear/style-night/symbols/swimming-m.svg @@ -1,14 +1,14 @@ - + swimming-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/swimming-s.svg b/data/styles/clear/style-night/symbols/swimming-s.svg index 5c2978d945..b7d4dae4b5 100644 --- a/data/styles/clear/style-night/symbols/swimming-s.svg +++ b/data/styles/clear/style-night/symbols/swimming-s.svg @@ -1,14 +1,14 @@ - + swimming-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/taxi-l.svg b/data/styles/clear/style-night/symbols/taxi-l.svg new file mode 100644 index 0000000000..b93427fe2f --- /dev/null +++ b/data/styles/clear/style-night/symbols/taxi-l.svg @@ -0,0 +1,14 @@ + + + + taxi-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/taxi-m.svg b/data/styles/clear/style-night/symbols/taxi-m.svg new file mode 100644 index 0000000000..fed0f8607c --- /dev/null +++ b/data/styles/clear/style-night/symbols/taxi-m.svg @@ -0,0 +1,14 @@ + + + + taxi-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/tennis-l.svg b/data/styles/clear/style-night/symbols/tennis-l.svg index 1b766156c6..35434677a7 100644 --- a/data/styles/clear/style-night/symbols/tennis-l.svg +++ b/data/styles/clear/style-night/symbols/tennis-l.svg @@ -1,14 +1,14 @@ - + tennis-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/tennis-m.svg b/data/styles/clear/style-night/symbols/tennis-m.svg index be81fe11cd..5336cec76a 100644 --- a/data/styles/clear/style-night/symbols/tennis-m.svg +++ b/data/styles/clear/style-night/symbols/tennis-m.svg @@ -1,14 +1,14 @@ - + tennis-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/tennis-s.svg b/data/styles/clear/style-night/symbols/tennis-s.svg index 0e3e8aa2dd..2f58fabd0b 100644 --- a/data/styles/clear/style-night/symbols/tennis-s.svg +++ b/data/styles/clear/style-night/symbols/tennis-s.svg @@ -1,14 +1,14 @@ - + tennis-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/theatre-l.svg b/data/styles/clear/style-night/symbols/theatre-l.svg index b49419e41c..04e2744e37 100644 --- a/data/styles/clear/style-night/symbols/theatre-l.svg +++ b/data/styles/clear/style-night/symbols/theatre-l.svg @@ -1,14 +1,14 @@ - + theatre-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/theatre-m.svg b/data/styles/clear/style-night/symbols/theatre-m.svg index 2f7aeaa3f0..7312fd59e6 100644 --- a/data/styles/clear/style-night/symbols/theatre-m.svg +++ b/data/styles/clear/style-night/symbols/theatre-m.svg @@ -1,14 +1,14 @@ - + theatre-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/theatre-s.svg b/data/styles/clear/style-night/symbols/theatre-s.svg index ef85c1970c..3b1287e387 100644 --- a/data/styles/clear/style-night/symbols/theatre-s.svg +++ b/data/styles/clear/style-night/symbols/theatre-s.svg @@ -1,14 +1,14 @@ - + theatre-s Created with Sketch. - + - + diff --git a/data/styles/clear/style-night/symbols/toilets-l.svg b/data/styles/clear/style-night/symbols/toilets-l.svg index 2b60631d91..364ddc3a8c 100644 --- a/data/styles/clear/style-night/symbols/toilets-l.svg +++ b/data/styles/clear/style-night/symbols/toilets-l.svg @@ -1,14 +1,14 @@ - + toilets-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/toilets-m.svg b/data/styles/clear/style-night/symbols/toilets-m.svg index cac3e6f368..975ba53a80 100644 --- a/data/styles/clear/style-night/symbols/toilets-m.svg +++ b/data/styles/clear/style-night/symbols/toilets-m.svg @@ -1,14 +1,14 @@ - + toilets-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/toilets-s.svg b/data/styles/clear/style-night/symbols/toilets-s.svg index 42060e4b6b..8cace03d88 100644 --- a/data/styles/clear/style-night/symbols/toilets-s.svg +++ b/data/styles/clear/style-night/symbols/toilets-s.svg @@ -1,14 +1,14 @@ - + toilets-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/toll_booth-l.svg b/data/styles/clear/style-night/symbols/toll_booth-l.svg new file mode 100644 index 0000000000..1a4ce33913 --- /dev/null +++ b/data/styles/clear/style-night/symbols/toll_booth-l.svg @@ -0,0 +1,14 @@ + + + + toll_booth-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/toll_booth-m.svg b/data/styles/clear/style-night/symbols/toll_booth-m.svg new file mode 100644 index 0000000000..f3c7c59a17 --- /dev/null +++ b/data/styles/clear/style-night/symbols/toll_booth-m.svg @@ -0,0 +1,14 @@ + + + + toll_booth-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/tomb-l.svg b/data/styles/clear/style-night/symbols/tomb-l.svg new file mode 100644 index 0000000000..487438cf36 --- /dev/null +++ b/data/styles/clear/style-night/symbols/tomb-l.svg @@ -0,0 +1,14 @@ + + + + tomb-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/tomb-m.svg b/data/styles/clear/style-night/symbols/tomb-m.svg new file mode 100644 index 0000000000..e0026c2009 --- /dev/null +++ b/data/styles/clear/style-night/symbols/tomb-m.svg @@ -0,0 +1,14 @@ + + + + tomb-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/tourism-l.svg b/data/styles/clear/style-night/symbols/tourism-l.svg index b9f5b6e2b8..063760600b 100644 --- a/data/styles/clear/style-night/symbols/tourism-l.svg +++ b/data/styles/clear/style-night/symbols/tourism-l.svg @@ -1,14 +1,14 @@ - + tourism-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/tourism-m.svg b/data/styles/clear/style-night/symbols/tourism-m.svg index f0d97afda9..7ac55b3bf9 100644 --- a/data/styles/clear/style-night/symbols/tourism-m.svg +++ b/data/styles/clear/style-night/symbols/tourism-m.svg @@ -1,14 +1,14 @@ - + tourism-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/tourism-s.svg b/data/styles/clear/style-night/symbols/tourism-s.svg index 83d4cc734f..b5d0f5768e 100644 --- a/data/styles/clear/style-night/symbols/tourism-s.svg +++ b/data/styles/clear/style-night/symbols/tourism-s.svg @@ -1,14 +1,14 @@ - + tourism-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/townhall-l.svg b/data/styles/clear/style-night/symbols/townhall-l.svg index cf0dffd27a..d9f0473b97 100644 --- a/data/styles/clear/style-night/symbols/townhall-l.svg +++ b/data/styles/clear/style-night/symbols/townhall-l.svg @@ -1,14 +1,14 @@ - + townhall-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/townhall-m.svg b/data/styles/clear/style-night/symbols/townhall-m.svg index 0715960b63..9bdf28a203 100644 --- a/data/styles/clear/style-night/symbols/townhall-m.svg +++ b/data/styles/clear/style-night/symbols/townhall-m.svg @@ -1,14 +1,14 @@ - + townhall-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/townhall-s.svg b/data/styles/clear/style-night/symbols/townhall-s.svg index fdbbfe94aa..6a6e4b6c04 100644 --- a/data/styles/clear/style-night/symbols/townhall-s.svg +++ b/data/styles/clear/style-night/symbols/townhall-s.svg @@ -1,14 +1,14 @@ - + townhall-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/toys-l.svg b/data/styles/clear/style-night/symbols/toys-l.svg new file mode 100644 index 0000000000..ffc146de88 --- /dev/null +++ b/data/styles/clear/style-night/symbols/toys-l.svg @@ -0,0 +1,14 @@ + + + + toys-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/toys-m.svg b/data/styles/clear/style-night/symbols/toys-m.svg new file mode 100644 index 0000000000..1fccedd60e --- /dev/null +++ b/data/styles/clear/style-night/symbols/toys-m.svg @@ -0,0 +1,14 @@ + + + + toys-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/vending-l.svg b/data/styles/clear/style-night/symbols/vending-l.svg new file mode 100644 index 0000000000..f940f25a28 --- /dev/null +++ b/data/styles/clear/style-night/symbols/vending-l.svg @@ -0,0 +1,14 @@ + + + + vending-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/vending-m.svg b/data/styles/clear/style-night/symbols/vending-m.svg new file mode 100644 index 0000000000..11fdfa4ee3 --- /dev/null +++ b/data/styles/clear/style-night/symbols/vending-m.svg @@ -0,0 +1,14 @@ + + + + vending-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/volcano-l.svg b/data/styles/clear/style-night/symbols/volcano-l.svg index 080484b03f..b99754ea29 100644 --- a/data/styles/clear/style-night/symbols/volcano-l.svg +++ b/data/styles/clear/style-night/symbols/volcano-l.svg @@ -1,16 +1,16 @@ - + volcano-l Created with Sketch. - + - - - + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/volcano-m.svg b/data/styles/clear/style-night/symbols/volcano-m.svg index 630dc57016..2430ae7f62 100644 --- a/data/styles/clear/style-night/symbols/volcano-m.svg +++ b/data/styles/clear/style-night/symbols/volcano-m.svg @@ -1,16 +1,16 @@ - + volcano-m Created with Sketch. - + - - - + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/volcano-s.svg b/data/styles/clear/style-night/symbols/volcano-s.svg index e79e70ee38..eef7162d2f 100644 --- a/data/styles/clear/style-night/symbols/volcano-s.svg +++ b/data/styles/clear/style-night/symbols/volcano-s.svg @@ -1,16 +1,16 @@ - + volcano-s Created with Sketch. - + - - - + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/waterfall-l.svg b/data/styles/clear/style-night/symbols/waterfall-l.svg index d19046e6f6..02c0a558e1 100644 --- a/data/styles/clear/style-night/symbols/waterfall-l.svg +++ b/data/styles/clear/style-night/symbols/waterfall-l.svg @@ -1,19 +1,19 @@ - + waterfall-l Created with Sketch. - + - - - - - - + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/waterfall-m.svg b/data/styles/clear/style-night/symbols/waterfall-m.svg index 72644223c6..58befcf773 100644 --- a/data/styles/clear/style-night/symbols/waterfall-m.svg +++ b/data/styles/clear/style-night/symbols/waterfall-m.svg @@ -1,19 +1,19 @@ - + waterfall-m Created with Sketch. - + - - - - - - + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/waterfall-s.svg b/data/styles/clear/style-night/symbols/waterfall-s.svg index fc7052fd2f..2608376ed4 100644 --- a/data/styles/clear/style-night/symbols/waterfall-s.svg +++ b/data/styles/clear/style-night/symbols/waterfall-s.svg @@ -1,18 +1,18 @@ - + waterfall-s Created with Sketch. - + - - - - - + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/wayside_cross-l.svg b/data/styles/clear/style-night/symbols/wayside_cross-l.svg new file mode 100644 index 0000000000..e8af1ca8d6 --- /dev/null +++ b/data/styles/clear/style-night/symbols/wayside_cross-l.svg @@ -0,0 +1,14 @@ + + + + wayside_cross-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/wayside_cross-m.svg b/data/styles/clear/style-night/symbols/wayside_cross-m.svg new file mode 100644 index 0000000000..a22e2fcec3 --- /dev/null +++ b/data/styles/clear/style-night/symbols/wayside_cross-m.svg @@ -0,0 +1,14 @@ + + + + wayside_cross-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/wayside_shrine-l.svg b/data/styles/clear/style-night/symbols/wayside_shrine-l.svg new file mode 100644 index 0000000000..e3c2341dcc --- /dev/null +++ b/data/styles/clear/style-night/symbols/wayside_shrine-l.svg @@ -0,0 +1,14 @@ + + + + wayside_shrine-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/wayside_shrine-m.svg b/data/styles/clear/style-night/symbols/wayside_shrine-m.svg new file mode 100644 index 0000000000..7305e180ad --- /dev/null +++ b/data/styles/clear/style-night/symbols/wayside_shrine-m.svg @@ -0,0 +1,14 @@ + + + + wayside_shrine-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/windmill-l.svg b/data/styles/clear/style-night/symbols/windmill-l.svg new file mode 100644 index 0000000000..d23e19594c --- /dev/null +++ b/data/styles/clear/style-night/symbols/windmill-l.svg @@ -0,0 +1,14 @@ + + + + windmill-l + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/windmill-m.svg b/data/styles/clear/style-night/symbols/windmill-m.svg new file mode 100644 index 0000000000..3a3aa8ac34 --- /dev/null +++ b/data/styles/clear/style-night/symbols/windmill-m.svg @@ -0,0 +1,14 @@ + + + + windmill-m + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/windmill-s.svg b/data/styles/clear/style-night/symbols/windmill-s.svg new file mode 100644 index 0000000000..129bf5fa3d --- /dev/null +++ b/data/styles/clear/style-night/symbols/windmill-s.svg @@ -0,0 +1,8 @@ + + + + windmill-s + Created with Sketch. + + + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/zoo-l.svg b/data/styles/clear/style-night/symbols/zoo-l.svg index cae8d1e1ed..2e73a01eb7 100644 --- a/data/styles/clear/style-night/symbols/zoo-l.svg +++ b/data/styles/clear/style-night/symbols/zoo-l.svg @@ -1,14 +1,14 @@ - + zoo-l Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/zoo-m.svg b/data/styles/clear/style-night/symbols/zoo-m.svg index e558baa722..d44d7210c0 100644 --- a/data/styles/clear/style-night/symbols/zoo-m.svg +++ b/data/styles/clear/style-night/symbols/zoo-m.svg @@ -1,14 +1,14 @@ - + zoo-m Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/clear/style-night/symbols/zoo-s.svg b/data/styles/clear/style-night/symbols/zoo-s.svg index 5311646f17..6d0ccc7a6f 100644 --- a/data/styles/clear/style-night/symbols/zoo-s.svg +++ b/data/styles/clear/style-night/symbols/zoo-s.svg @@ -1,14 +1,14 @@ - + zoo-s Created with Sketch. - + - + \ No newline at end of file diff --git a/data/styles/legacy/style-dark/6plus/route-arrow.png b/data/styles/legacy/style-dark/6plus/route-arrow.png index 59e4a8e7bd..e073e8f9f6 100644 Binary files a/data/styles/legacy/style-dark/6plus/route-arrow.png and b/data/styles/legacy/style-dark/6plus/route-arrow.png differ diff --git a/data/styles/legacy/style-dark/hdpi/route-arrow.png b/data/styles/legacy/style-dark/hdpi/route-arrow.png index 1961f84d94..c54422803b 100644 Binary files a/data/styles/legacy/style-dark/hdpi/route-arrow.png and b/data/styles/legacy/style-dark/hdpi/route-arrow.png differ diff --git a/data/styles/legacy/style-dark/ldpi/route-arrow.png b/data/styles/legacy/style-dark/ldpi/route-arrow.png index 0bd2f6990a..a1bd3fe78d 100644 Binary files a/data/styles/legacy/style-dark/ldpi/route-arrow.png and b/data/styles/legacy/style-dark/ldpi/route-arrow.png differ diff --git a/data/styles/legacy/style-dark/mdpi/route-arrow.png b/data/styles/legacy/style-dark/mdpi/route-arrow.png index 3e0e083ba4..a68598e98c 100644 Binary files a/data/styles/legacy/style-dark/mdpi/route-arrow.png and b/data/styles/legacy/style-dark/mdpi/route-arrow.png differ diff --git a/data/styles/legacy/style-dark/xhdpi/route-arrow.png b/data/styles/legacy/style-dark/xhdpi/route-arrow.png index c6a62c47f9..1a0d0027a0 100644 Binary files a/data/styles/legacy/style-dark/xhdpi/route-arrow.png and b/data/styles/legacy/style-dark/xhdpi/route-arrow.png differ diff --git a/data/styles/legacy/style-dark/xxhdpi/route-arrow.png b/data/styles/legacy/style-dark/xxhdpi/route-arrow.png index 59201f3ceb..c56c043bb9 100644 Binary files a/data/styles/legacy/style-dark/xxhdpi/route-arrow.png and b/data/styles/legacy/style-dark/xxhdpi/route-arrow.png differ diff --git a/data/types.txt b/data/types.txt index 23133f5069..17095d87ef 100644 --- a/data/types.txt +++ b/data/types.txt @@ -1038,3 +1038,5 @@ amenity|clinic barrier|entrance barrier|border_control shop|laundry +amenity|vending_machine|parking_tickets +amenity|vending_machine|public_transport_tickets diff --git a/data/visibility.txt b/data/visibility.txt index 048c7098d8..e7c1a65385 100644 --- a/data/visibility.txt +++ b/data/visibility.txt @@ -88,6 +88,10 @@ world 00000000000000000000 + toilets 00000000000000000111 - townhall 00000000000000001111 - university 00000000000001111111 - + vending_machine 00000000000000000000 + + parking_tickets 00000000000000000111 - + public_transport_tickets 00000000000000000111 - + {} waste_disposal 00000000000000000111 - {} area:highway 00000000000000000000 + diff --git a/drape/attribute_buffer_mutator.hpp b/drape/attribute_buffer_mutator.hpp index d5846c849c..b23ee8e68e 100644 --- a/drape/attribute_buffer_mutator.hpp +++ b/drape/attribute_buffer_mutator.hpp @@ -14,16 +14,16 @@ namespace dp struct MutateRegion { MutateRegion() : m_offset(0), m_count(0) {} - MutateRegion(uint16_t offset, uint16_t count) : m_offset(offset), m_count(count) {} + MutateRegion(uint32_t offset, uint32_t count) : m_offset(offset), m_count(count) {} - uint16_t m_offset; // Offset from buffer begin in "Elements" not in bytes - uint16_t m_count; // Count of "Elements". + uint32_t m_offset; // Offset from buffer begin in "Elements" not in bytes + uint32_t m_count; // Count of "Elements". }; struct MutateNode { MutateRegion m_region; - RefPointer m_data; + ref_ptr m_data; }; class AttributeBufferMutator diff --git a/drape/attribute_provider.cpp b/drape/attribute_provider.cpp index 940030240b..1271c8feb0 100644 --- a/drape/attribute_provider.cpp +++ b/drape/attribute_provider.cpp @@ -6,7 +6,7 @@ #define CHECK_STREAMS CheckStreams() #define INIT_STREAM(x) InitCheckStream((x)) #else - #include "../../base/macros.hpp" + #include "base/macros.hpp" #define INIT_CHECK_INFO(x) UNUSED_VALUE((x)) #define CHECK_STREAMS #define INIT_STREAM(x) UNUSED_VALUE((x)) @@ -15,7 +15,7 @@ namespace dp { -AttributeProvider::AttributeProvider(uint8_t streamCount, uint16_t vertexCount) +AttributeProvider::AttributeProvider(uint8_t streamCount, uint32_t vertexCount) : m_vertexCount(vertexCount) { m_streams.resize(streamCount); @@ -29,7 +29,7 @@ bool AttributeProvider::IsDataExists() const return m_vertexCount > 0; } -uint16_t AttributeProvider::GetVertexCount() const +uint32_t AttributeProvider::GetVertexCount() const { return m_vertexCount; } @@ -43,7 +43,7 @@ void const * AttributeProvider::GetRawPointer(uint8_t streamIndex) { ASSERT_LESS(streamIndex, GetStreamCount(), ()); CHECK_STREAMS; - return m_streams[streamIndex].m_data.GetRaw(); + return m_streams[streamIndex].m_data.get(); } BindingInfo const & AttributeProvider::GetBindingInfo(uint8_t streamIndex) const @@ -53,7 +53,7 @@ BindingInfo const & AttributeProvider::GetBindingInfo(uint8_t streamIndex) const return m_streams[streamIndex].m_binding; } -void AttributeProvider::Advance(uint16_t vertexCount) +void AttributeProvider::Advance(uint32_t vertexCount) { ASSERT_LESS_OR_EQUAL(vertexCount, m_vertexCount, ()); CHECK_STREAMS; @@ -64,8 +64,8 @@ void AttributeProvider::Advance(uint16_t vertexCount) { BindingInfo const & info = m_streams[i].m_binding; uint32_t offset = vertexCount * info.GetElementSize(); - void * rawPointer = m_streams[i].m_data.GetRaw(); - m_streams[i].m_data = MakeStackRefPointer((void *)(((uint8_t *)rawPointer) + offset)); + void * rawPointer = m_streams[i].m_data.get(); + m_streams[i].m_data = make_ref((void *)(((uint8_t *)rawPointer) + offset)); } } @@ -74,7 +74,7 @@ void AttributeProvider::Advance(uint16_t vertexCount) void AttributeProvider::InitStream(uint8_t streamIndex, BindingInfo const & bindingInfo, - RefPointer data) + ref_ptr data) { ASSERT_LESS(streamIndex, GetStreamCount(), ()); AttributeStream s; diff --git a/drape/attribute_provider.hpp b/drape/attribute_provider.hpp index 8aa473d334..05432e7484 100644 --- a/drape/attribute_provider.hpp +++ b/drape/attribute_provider.hpp @@ -11,21 +11,21 @@ namespace dp class AttributeProvider { public: - AttributeProvider(uint8_t streamCount, uint16_t vertexCount); + AttributeProvider(uint8_t streamCount, uint32_t vertexCount); /// interface for batcher bool IsDataExists() const; - uint16_t GetVertexCount() const; + uint32_t GetVertexCount() const; uint8_t GetStreamCount() const; void const * GetRawPointer(uint8_t streamIndex); BindingInfo const & GetBindingInfo(uint8_t streamIndex) const; - void Advance(uint16_t vertexCount); + void Advance(uint32_t vertexCount); void InitStream(uint8_t streamIndex, BindingInfo const & bindingInfo, - RefPointer data); + ref_ptr data); private: int32_t m_vertexCount; @@ -33,7 +33,7 @@ private: struct AttributeStream { BindingInfo m_binding; - RefPointer m_data; + ref_ptr m_data; }; vector m_streams; #ifdef DEBUG diff --git a/drape/batcher.cpp b/drape/batcher.cpp index cbb7159a89..5f4e38c0cc 100644 --- a/drape/batcher.cpp +++ b/drape/batcher.cpp @@ -1,9 +1,12 @@ #include "drape/batcher.hpp" -#include "drape/cpu_buffer.hpp" #include "drape/batcher_helpers.hpp" +#include "drape/cpu_buffer.hpp" +#include "drape/glextensions_list.hpp" +#include "drape/index_storage.hpp" #include "drape/vertex_array_buffer.hpp" #include "base/assert.hpp" +#include "base/stl_add.hpp" #include "std/bind.hpp" @@ -13,40 +16,41 @@ namespace dp class Batcher::CallbacksWrapper { public: - CallbacksWrapper(GLState const & state, RefPointer overlay) + CallbacksWrapper(GLState const & state, ref_ptr overlay) : m_state(state) , m_overlay(overlay) + , m_vaoChanged(false) { - } - void SetVAO(RefPointer buffer) + void SetVAO(ref_ptr buffer) { + // invocation with non-null VAO will cause to invalid range of indices. + // It means that VAO has been changed during batching + if (m_buffer != nullptr) + m_vaoChanged = true; + m_buffer = buffer; + m_indicesRange.m_idxStart = m_buffer->GetIndexCount(); } - bool IsVAOFilled() const + void FlushData(BindingInfo const & info, void const * data, uint32_t count) { - return m_buffer->IsFilled(); - } - - void FlushData(BindingInfo const & info, void const * data, uint16_t count) - { - if (!m_overlay.IsNull() && info.IsDynamic()) + if (m_overlay != nullptr && info.IsDynamic()) { - uint16_t offset = m_buffer->GetDynamicBufferOffset(info); + uint32_t offset = m_buffer->GetDynamicBufferOffset(info); m_overlay->AddDynamicAttribute(info, offset, count); } m_buffer->UploadData(info, data, count); } - uint16_t * GetIndexStorage(uint16_t size, uint16_t & startIndex) + void * GetIndexStorage(uint32_t size, uint32_t & startIndex) { startIndex = m_buffer->GetStartIndexValue(); - if (m_overlay.IsNull()) + if (m_overlay == nullptr || !m_overlay->IndexesRequired()) { - m_indexStorage.resize(size); - return &m_indexStorage[0]; + m_indexStorage.Resize(size); + return m_indexStorage.GetRaw(); } else return m_overlay->IndexStorage(size); @@ -54,16 +58,16 @@ public: void SubmitIndexes() { - if (m_overlay.IsNull()) - m_buffer->UploadIndexes(&m_indexStorage[0], m_indexStorage.size()); + if (m_overlay == nullptr || !m_overlay->IndexesRequired()) + m_buffer->UploadIndexes(m_indexStorage.GetRawConst(), m_indexStorage.Size()); } - uint16_t GetAvailableVertexCount() const + uint32_t GetAvailableVertexCount() const { return m_buffer->GetAvailableVertexCount(); } - uint16_t GetAvailableIndexCount() const + uint32_t GetAvailableIndexCount() const { return m_buffer->GetAvailableIndexCount(); } @@ -73,11 +77,23 @@ public: return m_state; } + IndicesRange const & Finish() + { + if (!m_vaoChanged) + m_indicesRange.m_idxCount = m_buffer->GetIndexCount() - m_indicesRange.m_idxStart; + else + m_indicesRange = IndicesRange(); + + return m_indicesRange; + } + private: GLState const & m_state; - RefPointer m_buffer; - RefPointer m_overlay; - vector m_indexStorage; + ref_ptr m_buffer; + ref_ptr m_overlay; + IndexStorage m_indexStorage; + IndicesRange m_indicesRange; + bool m_vaoChanged; }; //////////////////////////////////////////////////////////////// @@ -90,56 +106,55 @@ Batcher::Batcher(uint32_t indexBufferSize, uint32_t vertexBufferSize) Batcher::~Batcher() { - buckets_t::iterator it = m_buckets.begin(); - for (; it != m_buckets.end(); ++it) - it->second.Destroy(); + m_buckets.clear(); } -void Batcher::InsertTriangleList(GLState const & state, RefPointer params) +void Batcher::InsertTriangleList(GLState const & state, ref_ptr params) { - InsertTriangleList(state, params, MovePointer(NULL)); + InsertTriangleList(state, params, nullptr); } -void Batcher::InsertTriangleList(GLState const & state, RefPointer params, - TransferPointer handle) +IndicesRange Batcher::InsertTriangleList(GLState const & state, ref_ptr params, + drape_ptr && handle) { - InsertTriangles(state, params, handle); + return InsertTriangles(state, params, move(handle)); } -void Batcher::InsertTriangleStrip(GLState const & state, RefPointer params) +void Batcher::InsertTriangleStrip(GLState const & state, ref_ptr params) { - InsertTriangleStrip(state, params, MovePointer(NULL)); + InsertTriangleStrip(state, params, nullptr); } -void Batcher::InsertTriangleStrip(GLState const & state, RefPointer params, - TransferPointer handle) +IndicesRange Batcher::InsertTriangleStrip(GLState const & state, ref_ptr params, + drape_ptr && handle) { - InsertTriangles(state, params, handle); + return InsertTriangles(state, params, move(handle)); } -void Batcher::InsertTriangleFan(GLState const & state, RefPointer params) +void Batcher::InsertTriangleFan(GLState const & state, ref_ptr params) { - InsertTriangleFan(state, params, MovePointer(NULL)); + InsertTriangleFan(state, params, nullptr); } -void Batcher::InsertTriangleFan(GLState const & state, RefPointer params, - TransferPointer handle) +IndicesRange Batcher::InsertTriangleFan(GLState const & state, ref_ptr params, + drape_ptr && handle) { - InsertTriangles(state, params, handle); + return InsertTriangles(state, params, move(handle)); } -void Batcher::InsertListOfStrip(GLState const & state, RefPointer params, uint8_t vertexStride) +void Batcher::InsertListOfStrip(GLState const & state, ref_ptr params, + uint8_t vertexStride) { - InsertListOfStrip(state, params, MovePointer(NULL), vertexStride); + InsertListOfStrip(state, params, nullptr, vertexStride); } -void Batcher::InsertListOfStrip(GLState const & state, RefPointer params, - TransferPointer handle, uint8_t vertexStride) +IndicesRange Batcher::InsertListOfStrip(GLState const & state, ref_ptr params, + drape_ptr && handle, uint8_t vertexStride) { - InsertTriangles(state, params, handle, vertexStride); + return InsertTriangles(state, params, move(handle), vertexStride); } -void Batcher::StartSession(flush_fn const & flusher) +void Batcher::StartSession(TFlushFn const & flusher) { m_flushInterface = flusher; } @@ -147,67 +162,66 @@ void Batcher::StartSession(flush_fn const & flusher) void Batcher::EndSession() { Flush(); - m_flushInterface = flush_fn(); + m_flushInterface = TFlushFn(); } -void Batcher::ChangeBuffer(RefPointer wrapper, bool checkFilledBuffer) +void Batcher::ChangeBuffer(ref_ptr wrapper) { - if (wrapper->IsVAOFilled() || checkFilledBuffer == false) - { - GLState const & state = wrapper->GetState(); - FinalizeBucket(state); + GLState const & state = wrapper->GetState(); + FinalizeBucket(state); - RefPointer bucket = GetBucket(state); - wrapper->SetVAO(bucket->GetBuffer()); - } + ref_ptr bucket = GetBucket(state); + wrapper->SetVAO(bucket->GetBuffer()); } -RefPointer Batcher::GetBucket(GLState const & state) +ref_ptr Batcher::GetBucket(GLState const & state) { - buckets_t::iterator it = m_buckets.find(state); + TBuckets::iterator it = m_buckets.find(state); if (it != m_buckets.end()) - return it->second.GetRefPointer(); + return make_ref(it->second); - MasterPointer vao(new VertexArrayBuffer(m_indexBufferSize, m_vertexBufferSize)); - MasterPointer buffer(new RenderBucket(vao.Move())); - m_buckets.insert(make_pair(state, buffer)); - return buffer.GetRefPointer(); + drape_ptr vao = make_unique_dp(m_indexBufferSize, m_vertexBufferSize); + drape_ptr buffer = make_unique_dp(move(vao)); + ref_ptr result = make_ref(buffer); + m_buckets.emplace(state, move(buffer)); + + return result; } void Batcher::FinalizeBucket(GLState const & state) { - ASSERT(m_buckets.find(state) != m_buckets.end(), ("Have no bucket for finalize with given state")); - MasterPointer bucket = m_buckets[state]; + TBuckets::iterator it = m_buckets.find(state); + ASSERT(it != m_buckets.end(), ("Have no bucket for finalize with given state")); + drape_ptr bucket = move(it->second); m_buckets.erase(state); bucket->GetBuffer()->Preflush(); - m_flushInterface(state, bucket.Move()); + m_flushInterface(state, move(bucket)); } void Batcher::Flush() { ASSERT(m_flushInterface != NULL, ()); - for (buckets_t::iterator it = m_buckets.begin(); it != m_buckets.end(); ++it) + for_each(m_buckets.begin(), m_buckets.end(), [this](TBuckets::value_type & bucket) { - it->second->GetBuffer()->Preflush(); - m_flushInterface(it->first, it->second.Move()); - } + ASSERT(bucket.second != nullptr, ()); + bucket.second->GetBuffer()->Preflush(); + m_flushInterface(bucket.first, move(bucket.second)); + }); m_buckets.clear(); } template -void Batcher::InsertTriangles(GLState const & state, - RefPointer params, - TransferPointer transferHandle, - uint8_t vertexStride) +IndicesRange Batcher::InsertTriangles(GLState const & state, ref_ptr params, + drape_ptr && transferHandle, uint8_t vertexStride) { - RefPointer bucket = GetBucket(state); - RefPointer vao = bucket->GetBuffer(); + ref_ptr vao = GetBucket(state)->GetBuffer(); + IndicesRange range; - MasterPointer handle(transferHandle); + drape_ptr handle = move(transferHandle); { - Batcher::CallbacksWrapper wrapper(state, handle.GetRefPointer()); + Batcher::CallbacksWrapper wrapper(state, make_ref(handle)); wrapper.SetVAO(vao); BatchCallbacks callbacks; @@ -216,16 +230,38 @@ void Batcher::InsertTriangles(GLState const & state, callbacks.m_submitIndex = bind(&CallbacksWrapper::SubmitIndexes, &wrapper); callbacks.m_getAvailableVertex = bind(&CallbacksWrapper::GetAvailableVertexCount, &wrapper); callbacks.m_getAvailableIndex = bind(&CallbacksWrapper::GetAvailableIndexCount, &wrapper); - callbacks.m_changeBuffer = bind(&Batcher::ChangeBuffer, this, MakeStackRefPointer(&wrapper), _1); + callbacks.m_changeBuffer = bind(&Batcher::ChangeBuffer, this, make_ref(&wrapper)); TBatcher batch(callbacks); - batch.SetIsCanDevideStreams(handle.IsNull()); + batch.SetIsCanDevideStreams(handle == nullptr); batch.SetVertexStride(vertexStride); batch.BatchData(params); + + range = wrapper.Finish(); } - if (!handle.IsNull()) - bucket->AddOverlayHandle(handle.Move()); + if (handle != nullptr) + GetBucket(state)->AddOverlayHandle(move(handle)); + + return range; +} + +Batcher * BatcherFactory::GetNew() const +{ + uint32_t const kIndexBufferSize = 5000; + uint32_t const kVertexBufferSize = 5000; + return new Batcher(kIndexBufferSize, kVertexBufferSize); +} + +SessionGuard::SessionGuard(Batcher & batcher, const Batcher::TFlushFn & flusher) + : m_batcher(batcher) +{ + m_batcher.StartSession(flusher); +} + +SessionGuard::~SessionGuard() +{ + m_batcher.EndSession(); } } // namespace dp diff --git a/drape/batcher.hpp b/drape/batcher.hpp index 82b6d835bc..edb224fa0a 100644 --- a/drape/batcher.hpp +++ b/drape/batcher.hpp @@ -1,10 +1,13 @@ #pragma once -#include "drape/pointers.hpp" -#include "drape/glstate.hpp" -#include "drape/render_bucket.hpp" #include "drape/attribute_provider.hpp" +#include "drape/glstate.hpp" #include "drape/overlay_handle.hpp" +#include "drape/pointers.hpp" +#include "drape/render_bucket.hpp" +#include "drape/vertex_array_buffer.hpp" + +#include "base/macros.hpp" #include "std/map.hpp" #include "std/function.hpp" @@ -19,51 +22,51 @@ class OverlayHandle; class Batcher { public: - Batcher(uint32_t indexBufferSize = 9000, uint32_t vertexBufferSize = 10000); + static uint32_t const IndexPerTriangle = 3; + static uint32_t const IndexPerQuad = 6; + static uint32_t const VertexPerQuad = 4; + + Batcher(uint32_t indexBufferSize, uint32_t vertexBufferSize); ~Batcher(); - void InsertTriangleList(GLState const & state, RefPointer params); - void InsertTriangleList(GLState const & state, RefPointer params, - TransferPointer handle); + void InsertTriangleList(GLState const & state, ref_ptr params); + IndicesRange InsertTriangleList(GLState const & state, ref_ptr params, + drape_ptr && handle); - void InsertTriangleStrip(GLState const & state, RefPointer params); - void InsertTriangleStrip(GLState const & state, RefPointer params, - TransferPointer handle); + void InsertTriangleStrip(GLState const & state, ref_ptr params); + IndicesRange InsertTriangleStrip(GLState const & state, ref_ptr params, + drape_ptr && handle); - void InsertTriangleFan(GLState const & state, RefPointer params); - void InsertTriangleFan(GLState const & state, RefPointer params, - TransferPointer handle); + void InsertTriangleFan(GLState const & state, ref_ptr params); + IndicesRange InsertTriangleFan(GLState const & state, ref_ptr params, + drape_ptr && handle); - void InsertListOfStrip(GLState const & state, RefPointer params, uint8_t vertexStride); - void InsertListOfStrip(GLState const & state, RefPointer params, - TransferPointer handle, uint8_t vertexStride); + void InsertListOfStrip(GLState const & state, ref_ptr params, uint8_t vertexStride); + IndicesRange InsertListOfStrip(GLState const & state, ref_ptr params, + drape_ptr && handle, uint8_t vertexStride); - - typedef function )> flush_fn; - void StartSession(flush_fn const & flusher); + typedef function &&)> TFlushFn; + void StartSession(TFlushFn const & flusher); void EndSession(); private: - template - void InsertTriangles(GLState const & state, - RefPointer params, - TransferPointer handle, - uint8_t vertexStride = 0); + IndicesRange InsertTriangles(GLState const & state, ref_ptr params, + drape_ptr && handle, uint8_t vertexStride = 0); class CallbacksWrapper; - void ChangeBuffer(RefPointer wrapper, bool checkFilledBuffer); - RefPointer GetBucket(GLState const & state); + void ChangeBuffer(ref_ptr wrapper); + ref_ptr GetBucket(GLState const & state); void FinalizeBucket(GLState const & state); void Flush(); private: - flush_fn m_flushInterface; + TFlushFn m_flushInterface; private: - typedef map > buckets_t; - buckets_t m_buckets; + using TBuckets = map>; + TBuckets m_buckets; uint32_t m_indexBufferSize; uint32_t m_vertexBufferSize; @@ -72,7 +75,18 @@ private: class BatcherFactory { public: - Batcher * GetNew() const { return new Batcher(); } + Batcher * GetNew() const; +}; + +class SessionGuard +{ +public: + SessionGuard(Batcher & batcher, Batcher::TFlushFn const & flusher); + ~SessionGuard(); + + DISALLOW_COPY_AND_MOVE(SessionGuard); +private: + Batcher & m_batcher; }; } // namespace dp diff --git a/drape/batcher_helpers.cpp b/drape/batcher_helpers.cpp index 3b92aaec37..3d3b1c9930 100644 --- a/drape/batcher_helpers.cpp +++ b/drape/batcher_helpers.cpp @@ -1,8 +1,11 @@ #include "drape/batcher_helpers.hpp" #include "drape/attribute_provider.hpp" #include "drape/cpu_buffer.hpp" +#include "drape/index_storage.hpp" +#include "drape/glextensions_list.hpp" #include "base/assert.hpp" +#include "base/math.hpp" #include "std/algorithm.hpp" @@ -12,50 +15,95 @@ namespace dp namespace { -bool IsEnoughMemory(uint16_t avVertex, uint16_t existVertex, uint16_t avIndex, uint16_t existIndex) +bool IsEnoughMemory(uint32_t avVertex, uint32_t existVertex, uint32_t avIndex, uint32_t existIndex) { return avVertex >= existVertex && avIndex >= existIndex; } +template void GenerateIndices(void * indexStorage, uint32_t count, uint32_t startIndex) +{ + GenerateIndices(indexStorage, count, TGenerator(startIndex)); +} + +template void GenerateIndices(void * indexStorage, uint32_t count, TGenerator const & generator) +{ + if (dp::IndexStorage::IsSupported32bit()) + { + uint32_t * pIndexStorage = static_cast(indexStorage); + generate(pIndexStorage, pIndexStorage + count, generator); + } + else + { + uint16_t * pIndexStorage = static_cast(indexStorage); + generate(pIndexStorage, pIndexStorage + count, generator); + } +} + class IndexGenerator { public: - IndexGenerator(uint16_t startIndex) : m_startIndex(startIndex) , m_counter(0) {} + IndexGenerator(uint32_t startIndex) + : m_startIndex(startIndex) + , m_counter(0) + , m_minStriptCounter(0) {} protected: - uint16_t GetCounter() { return m_counter++; } - void ResetCounter() { m_counter = 0; } - uint16_t const m_startIndex; + uint32_t GetCounter() { return m_counter++; } + void ResetCounter() + { + m_counter = 0; + m_minStriptCounter = 0; + } + + uint32_t const m_startIndex; + + int16_t GetCWNormalizer() + { + int16_t tmp = m_minStriptCounter; + m_minStriptCounter = my::cyclicClamp(m_minStriptCounter + 1, 0, 5); + switch (tmp) + { + case 4: return 1; + case 5: return -1; + default: return 0; + } + } private: - uint16_t m_counter; + uint32_t m_counter; + uint8_t m_minStriptCounter; }; class ListIndexGenerator : public IndexGenerator { public: - ListIndexGenerator(uint16_t startIndex) : IndexGenerator(startIndex) {} - uint16_t operator()() { return m_startIndex + GetCounter(); } + ListIndexGenerator(uint32_t startIndex) : IndexGenerator(startIndex) {} + uint32_t operator()() { return m_startIndex + GetCounter(); } }; class StripIndexGenerator : public IndexGenerator { public: - StripIndexGenerator(uint16_t startIndex) : IndexGenerator(startIndex) {} - uint16_t operator()() + StripIndexGenerator(uint32_t startIndex) + : IndexGenerator(startIndex) + , m_minStriptCounter(0) {} + uint32_t operator()() { - uint16_t const counter = GetCounter(); - return m_startIndex + counter - 2 * (counter / 3); + uint32_t const counter = GetCounter(); + return m_startIndex + counter - 2 * (counter / 3) + GetCWNormalizer(); } + +private: + uint32_t m_minStriptCounter; }; class FanIndexGenerator : public IndexGenerator { public: - FanIndexGenerator(uint16_t startIndex) : IndexGenerator(startIndex) {} - uint16_t operator()() + FanIndexGenerator(uint32_t startIndex) : IndexGenerator(startIndex) {} + uint32_t operator()() { - uint16_t const counter = GetCounter(); + uint32_t const counter = GetCounter(); if ((counter % 3) == 0) return m_startIndex; return m_startIndex + counter - 2 * (counter / 3); @@ -65,16 +113,16 @@ public: class ListOfStriptGenerator : public IndexGenerator { public: - ListOfStriptGenerator(uint16_t startIndex, uint16_t vertexStride, uint16_t indexPerStrip) + ListOfStriptGenerator(uint32_t startIndex, uint32_t vertexStride, uint32_t indexPerStrip) : IndexGenerator(startIndex) , m_vertexStride(vertexStride) , m_indexPerStrip(indexPerStrip) , m_base(0) {} - uint16_t operator()() + uint32_t operator()() { - uint16_t const counter = GetCounter(); - uint16_t const result = m_startIndex + m_base + counter - 2 * (counter / 3); + uint32_t const counter = GetCounter(); + uint32_t const result = m_startIndex + m_base + counter - 2 * (counter / 3) + GetCWNormalizer(); if (counter + 1 == m_indexPerStrip) { m_base += m_vertexStride; @@ -85,9 +133,9 @@ public: } private: - uint16_t m_vertexStride; - uint16_t m_indexPerStrip; - uint16_t m_base; + uint32_t m_vertexStride; + uint32_t m_indexPerStrip; + uint32_t m_base; }; } // namespace @@ -113,19 +161,19 @@ void TriangleBatch::SetVertexStride(uint8_t vertexStride) m_vertexStride = vertexStride; } -void TriangleBatch::FlushData(RefPointer streams, uint16_t vertexVount) const +void TriangleBatch::FlushData(ref_ptr streams, uint32_t vertexCount) const { for (uint8_t i = 0; i < streams->GetStreamCount(); ++i) - FlushData(streams->GetBindingInfo(i), streams->GetRawPointer(i), vertexVount); + FlushData(streams->GetBindingInfo(i), streams->GetRawPointer(i), vertexCount); } -void TriangleBatch::FlushData(BindingInfo const & info, void const * data, uint16_t elementCount) const +void TriangleBatch::FlushData(BindingInfo const & info, void const * data, uint32_t elementCount) const { ASSERT(m_callbacks.m_flushVertex != NULL, ()); return m_callbacks.m_flushVertex(info, data, elementCount); } -uint16_t * TriangleBatch::GetIndexStorage(uint16_t indexCount, uint16_t & startIndex) +void * TriangleBatch::GetIndexStorage(uint32_t indexCount, uint32_t & startIndex) { ASSERT(m_callbacks.m_getIndexStorage, ()); return m_callbacks.m_getIndexStorage(indexCount, startIndex); @@ -137,22 +185,22 @@ void TriangleBatch::SubmitIndex() m_callbacks.m_submitIndex(); } -uint16_t TriangleBatch::GetAvailableVertexCount() const +uint32_t TriangleBatch::GetAvailableVertexCount() const { ASSERT(m_callbacks.m_getAvailableVertex!= NULL, ()); return m_callbacks.m_getAvailableVertex(); } -uint16_t TriangleBatch::GetAvailableIndexCount() const +uint32_t TriangleBatch::GetAvailableIndexCount() const { ASSERT(m_callbacks.m_getAvailableIndex != NULL, ()); return m_callbacks.m_getAvailableIndex(); } -void TriangleBatch::ChangeBuffer(bool checkFilled) const +void TriangleBatch::ChangeBuffer() const { ASSERT(m_callbacks.m_changeBuffer != NULL, ()); - m_callbacks.m_changeBuffer(checkFilled); + m_callbacks.m_changeBuffer(); } uint8_t TriangleBatch::GetVertexStride() const @@ -160,15 +208,23 @@ uint8_t TriangleBatch::GetVertexStride() const return m_vertexStride; } +bool TriangleBatch::IsBufferFilled(uint32_t availableVerticesCount, uint32_t availableIndicesCount) const +{ + return availableVerticesCount < 3 || availableIndicesCount < 3; +} + TriangleListBatch::TriangleListBatch(BatchCallbacks const & callbacks) : TBase(callbacks) {} -void TriangleListBatch::BatchData(RefPointer streams) +void TriangleListBatch::BatchData(ref_ptr streams) { while (streams->IsDataExists()) { - uint16_t avVertex = GetAvailableVertexCount(); - uint16_t avIndex = GetAvailableIndexCount(); - uint16_t vertexCount = streams->GetVertexCount(); + if (IsBufferFilled(GetAvailableVertexCount(), GetAvailableIndexCount())) + ChangeBuffer(); + + uint32_t avVertex = GetAvailableVertexCount(); + uint32_t avIndex = GetAvailableIndexCount(); + uint32_t vertexCount = streams->GetVertexCount(); if (IsCanDevideStreams()) { @@ -179,69 +235,67 @@ void TriangleListBatch::BatchData(RefPointer streams) } else if (!IsEnoughMemory(avVertex, vertexCount, avIndex, vertexCount)) { - ChangeBuffer(false); + ChangeBuffer(); avVertex = GetAvailableVertexCount(); avIndex = GetAvailableIndexCount(); ASSERT(IsEnoughMemory(avVertex, vertexCount, avIndex, vertexCount), ()); ASSERT(vertexCount % 3 == 0, ()); } - uint16_t startIndex = 0; - uint16_t * pIndexStorage = GetIndexStorage(vertexCount, startIndex); - generate(pIndexStorage, pIndexStorage + vertexCount, ListIndexGenerator(startIndex)); + uint32_t startIndex = 0; + void * indicesStorage = GetIndexStorage(vertexCount, startIndex); + GenerateIndices(indicesStorage, vertexCount, startIndex); SubmitIndex(); FlushData(streams, vertexCount); streams->Advance(vertexCount); - ChangeBuffer(true); } } - FanStripHelper::FanStripHelper(BatchCallbacks const & callbacks) : TBase(callbacks) , m_isFullUploaded(false) { } -uint16_t FanStripHelper::BatchIndexes(uint16_t vertexCount) +uint32_t FanStripHelper::BatchIndexes(uint32_t vertexCount) { - uint16_t avVertex = GetAvailableVertexCount(); - uint16_t avIndex = GetAvailableIndexCount(); + uint32_t avVertex = GetAvailableVertexCount(); + uint32_t avIndex = GetAvailableIndexCount(); - uint16_t batchVertexCount = 0; - uint16_t batchIndexCount = 0; + uint32_t batchVertexCount = 0; + uint32_t batchIndexCount = 0; CalcBatchPortion(vertexCount, avVertex, avIndex, batchVertexCount, batchIndexCount); if (!IsFullUploaded() && !IsCanDevideStreams()) { - ChangeBuffer(false); + ChangeBuffer(); avVertex = GetAvailableVertexCount(); avIndex = GetAvailableIndexCount(); CalcBatchPortion(vertexCount, avVertex, avIndex, batchVertexCount, batchIndexCount); ASSERT(IsFullUploaded(), ()); } - uint16_t startIndex = 0; - uint16_t * pIndexStorage = GetIndexStorage(batchIndexCount, startIndex); + uint32_t startIndex = 0; + void * pIndexStorage = GetIndexStorage(batchIndexCount, startIndex); GenerateIndexes(pIndexStorage, batchIndexCount, startIndex); SubmitIndex(); return batchVertexCount; } -void FanStripHelper::CalcBatchPortion(uint16_t vertexCount, uint16_t avVertex, uint16_t avIndex, - uint16_t & batchVertexCount, uint16_t & batchIndexCount) +void FanStripHelper::CalcBatchPortion(uint32_t vertexCount, uint32_t avVertex, uint32_t avIndex, + uint32_t & batchVertexCount, uint32_t & batchIndexCount) { - uint16_t const indexCount = VtoICount(vertexCount); + uint32_t const indexCount = VtoICount(vertexCount); batchVertexCount = vertexCount; batchIndexCount = indexCount; m_isFullUploaded = true; if (vertexCount > avVertex || indexCount > avIndex) { - uint16_t alignedAvVertex = AlignVCount(avVertex); - uint16_t alignedAvIndex = AlignICount(avIndex); + uint32_t alignedAvVertex = AlignVCount(avVertex); + uint32_t alignedAvIndex = AlignICount(avIndex); uint32_t indexCountForAvailableVertexCount = VtoICount(alignedAvVertex); if (indexCountForAvailableVertexCount <= alignedAvIndex) { @@ -262,50 +316,52 @@ bool FanStripHelper::IsFullUploaded() const return m_isFullUploaded; } -uint16_t FanStripHelper::VtoICount(uint16_t vCount) const +uint32_t FanStripHelper::VtoICount(uint32_t vCount) const { return 3 * (vCount - 2); } -uint16_t FanStripHelper::ItoVCount(uint16_t iCount) const +uint32_t FanStripHelper::ItoVCount(uint32_t iCount) const { return iCount / 3 + 2; } -uint16_t FanStripHelper::AlignVCount(uint16_t vCount) const +uint32_t FanStripHelper::AlignVCount(uint32_t vCount) const { return vCount; } -uint16_t FanStripHelper::AlignICount(uint16_t iCount) const +uint32_t FanStripHelper::AlignICount(uint32_t iCount) const { return iCount - iCount % 3; } -void FanStripHelper::GenerateIndexes(uint16_t * indexStorage, uint16_t count, uint16_t startIndex) const -{ - generate(indexStorage, indexStorage + count, StripIndexGenerator(startIndex)); -} - TriangleStripBatch::TriangleStripBatch(BatchCallbacks const & callbacks) : TBase(callbacks) { } -void TriangleStripBatch::BatchData(RefPointer streams) +void TriangleStripBatch::BatchData(ref_ptr streams) { while (streams->IsDataExists()) { - uint16_t const batchVertexCount = BatchIndexes(streams->GetVertexCount()); + if (IsBufferFilled(GetAvailableVertexCount(), GetAvailableIndexCount())) + ChangeBuffer(); + + uint32_t const batchVertexCount = BatchIndexes(streams->GetVertexCount()); FlushData(streams, batchVertexCount); - uint16_t const advanceCount = IsFullUploaded() ? batchVertexCount : (batchVertexCount - 2); + uint32_t const advanceCount = IsFullUploaded() ? batchVertexCount : (batchVertexCount - 2); streams->Advance(advanceCount); - ChangeBuffer(true); } } +void TriangleStripBatch::GenerateIndexes(void * indexStorage, uint32_t count, uint32_t startIndex) const +{ + GenerateIndices(indexStorage, count, startIndex); +} + TriangleFanBatch::TriangleFanBatch(BatchCallbacks const & callbacks) : TBase(callbacks) {} @@ -327,13 +383,16 @@ TriangleFanBatch::TriangleFanBatch(BatchCallbacks const & callbacks) : TBase(cal * second part of data. But to avoid 2 separate call of glBufferSubData we at first do a copy of * data from params to cpuBuffer and than copy continuous block of memory from cpuBuffer */ -void TriangleFanBatch::BatchData(RefPointer streams) +void TriangleFanBatch::BatchData(ref_ptr streams) { vector cpuBuffers; while (streams->IsDataExists()) { - uint16_t vertexCount = streams->GetVertexCount(); - uint16_t batchVertexCount = BatchIndexes(vertexCount); + if (IsBufferFilled(GetAvailableVertexCount(), GetAvailableIndexCount())) + ChangeBuffer(); + + uint32_t vertexCount = streams->GetVertexCount(); + uint32_t batchVertexCount = BatchIndexes(vertexCount); if (!cpuBuffers.empty()) { @@ -359,7 +418,7 @@ void TriangleFanBatch::BatchData(RefPointer streams) cpuBuffer.Seek(1); } - uint16_t advanceCount = batchVertexCount; + uint32_t advanceCount = batchVertexCount; if (!IsFullUploaded()) { // not all data was moved on gpu and last vertex of fan @@ -402,40 +461,52 @@ void TriangleFanBatch::BatchData(RefPointer streams) streams->Advance(batchVertexCount - 1); } } - - ChangeBuffer(true); } } +void TriangleFanBatch::GenerateIndexes(void * indexStorage, uint32_t count, uint32_t startIndex) const +{ + GenerateIndices(indexStorage, count, startIndex); +} TriangleListOfStripBatch::TriangleListOfStripBatch(BatchCallbacks const & callbacks) : TBase(callbacks) { } -void TriangleListOfStripBatch::BatchData(RefPointer streams) +void TriangleListOfStripBatch::BatchData(ref_ptr streams) { while (streams->IsDataExists()) { - uint16_t const batchVertexCount = BatchIndexes(streams->GetVertexCount()); + if (IsBufferFilled(GetAvailableVertexCount(), GetAvailableIndexCount())) + ChangeBuffer(); + + uint32_t const batchVertexCount = BatchIndexes(streams->GetVertexCount()); FlushData(streams, batchVertexCount); streams->Advance(batchVertexCount); - - ChangeBuffer(true); } } -uint16_t TriangleListOfStripBatch::VtoICount(uint16_t vCount) const +bool TriangleListOfStripBatch::IsBufferFilled(uint32_t availableVerticesCount, uint32_t availableIndicesCount) const +{ + uint8_t const vertexStride = GetVertexStride(); + ASSERT_GREATER_OR_EQUAL(vertexStride, 4, ()); + + uint32_t const indicesPerStride = TBase::VtoICount(vertexStride); + return availableVerticesCount < vertexStride || availableIndicesCount < indicesPerStride; +} + +uint32_t TriangleListOfStripBatch::VtoICount(uint32_t vCount) const { uint8_t const vertexStride = GetVertexStride(); ASSERT_GREATER_OR_EQUAL(vertexStride, 4, ()); ASSERT_EQUAL(vCount % vertexStride, 0, ()); - uint16_t const striptCount = vCount / vertexStride; + uint32_t const striptCount = vCount / vertexStride; return striptCount * TBase::VtoICount(vertexStride); } -uint16_t TriangleListOfStripBatch::ItoVCount(uint16_t iCount) const +uint32_t TriangleListOfStripBatch::ItoVCount(uint32_t iCount) const { uint8_t const vertexStride = GetVertexStride(); ASSERT_GREATER_OR_EQUAL(vertexStride, 4, ()); @@ -444,15 +515,24 @@ uint16_t TriangleListOfStripBatch::ItoVCount(uint16_t iCount) const return vertexStride * iCount / TBase::VtoICount(vertexStride); } -uint16_t TriangleListOfStripBatch::AlignVCount(uint16_t vCount) const +uint32_t TriangleListOfStripBatch::AlignVCount(uint32_t vCount) const { return vCount - vCount % GetVertexStride(); } -void TriangleListOfStripBatch::GenerateIndexes(uint16_t * indexStorage, uint16_t count, uint16_t startIndex) const +uint32_t TriangleListOfStripBatch::AlignICount(uint32_t iCount) const { uint8_t const vertexStride = GetVertexStride(); - generate(indexStorage, indexStorage + count, ListOfStriptGenerator(startIndex, vertexStride, VtoICount(vertexStride))); + ASSERT_GREATER_OR_EQUAL(vertexStride, 4, ()); + + uint32_t const indicesPerStride = TBase::VtoICount(vertexStride); + return iCount - iCount % indicesPerStride; +} + +void TriangleListOfStripBatch::GenerateIndexes(void * indexStorage, uint32_t count, uint32_t startIndex) const +{ + uint8_t const vertexStride = GetVertexStride(); + GenerateIndices(indexStorage, count, ListOfStriptGenerator(startIndex, vertexStride, VtoICount(vertexStride))); } } // namespace dp diff --git a/drape/batcher_helpers.hpp b/drape/batcher_helpers.hpp index 0270e097ec..2f91685f8e 100644 --- a/drape/batcher_helpers.hpp +++ b/drape/batcher_helpers.hpp @@ -13,11 +13,11 @@ class BindingInfo; class BatchCallbacks { public: - typedef function TFlushVertexFn; - typedef function TGetIndexStorageFn; + typedef function TFlushVertexFn; + typedef function TGetIndexStorageFn; typedef function TSubmitIndexFn; - typedef function TGetAvailableFn; - typedef function ChangeBufferFn; + typedef function TGetAvailableFn; + typedef function ChangeBufferFn; TFlushVertexFn m_flushVertex; TGetIndexStorageFn m_getIndexStorage; @@ -31,22 +31,24 @@ class TriangleBatch { public: TriangleBatch(BatchCallbacks const & callbacks); + virtual ~TriangleBatch(){} - virtual void BatchData(RefPointer streams) = 0; + virtual void BatchData(ref_ptr streams) = 0; void SetIsCanDevideStreams(bool canDevide); bool IsCanDevideStreams() const; void SetVertexStride(uint8_t vertexStride); protected: - void FlushData(RefPointer streams, uint16_t vertexVount) const; - void FlushData(BindingInfo const & info, void const * data, uint16_t elementCount) const; - uint16_t * GetIndexStorage(uint16_t indexCount, uint16_t & startIndex); + void FlushData(ref_ptr streams, uint32_t vertexCount) const; + void FlushData(BindingInfo const & info, void const * data, uint32_t elementCount) const; + void * GetIndexStorage(uint32_t indexCount, uint32_t & startIndex); void SubmitIndex(); - uint16_t GetAvailableVertexCount() const; - uint16_t GetAvailableIndexCount() const; - void ChangeBuffer(bool checkFilled) const; + uint32_t GetAvailableVertexCount() const; + uint32_t GetAvailableIndexCount() const; + void ChangeBuffer() const; uint8_t GetVertexStride() const; + virtual bool IsBufferFilled(uint32_t availableVerticesCount, uint32_t availableIndicesCount) const; private: BatchCallbacks m_callbacks; @@ -61,7 +63,7 @@ class TriangleListBatch : public TriangleBatch public: TriangleListBatch(BatchCallbacks const & callbacks); - virtual void BatchData(RefPointer streams); + virtual void BatchData(ref_ptr streams); }; class FanStripHelper : public TriangleBatch @@ -72,16 +74,16 @@ public: FanStripHelper(BatchCallbacks const & callbacks); protected: - uint16_t BatchIndexes(uint16_t vertexCount); - void CalcBatchPortion(uint16_t vertexCount, uint16_t avVertex, uint16_t avIndex, - uint16_t & batchVertexCount, uint16_t & batchIndexCount); + uint32_t BatchIndexes(uint32_t vertexCount); + void CalcBatchPortion(uint32_t vertexCount, uint32_t avVertex, uint32_t avIndex, + uint32_t & batchVertexCount, uint32_t & batchIndexCount); bool IsFullUploaded() const; - virtual uint16_t VtoICount(uint16_t vCount) const; - virtual uint16_t ItoVCount(uint16_t iCount) const; - virtual uint16_t AlignVCount(uint16_t vCount) const; - virtual uint16_t AlignICount(uint16_t vCount) const; - virtual void GenerateIndexes(uint16_t * indexStorage, uint16_t count, uint16_t startIndex) const; + virtual uint32_t VtoICount(uint32_t vCount) const; + virtual uint32_t ItoVCount(uint32_t iCount) const; + virtual uint32_t AlignVCount(uint32_t vCount) const; + virtual uint32_t AlignICount(uint32_t vCount) const; + virtual void GenerateIndexes(void * indexStorage, uint32_t count, uint32_t startIndex) const = 0; private: bool m_isFullUploaded; @@ -94,7 +96,9 @@ class TriangleStripBatch : public FanStripHelper public: TriangleStripBatch(BatchCallbacks const & callbacks); - virtual void BatchData(RefPointer streams); + virtual void BatchData(ref_ptr streams); +protected: + virtual void GenerateIndexes(void * indexStorage, uint32_t count, uint32_t startIndex) const; }; class TriangleFanBatch : public FanStripHelper @@ -104,7 +108,9 @@ class TriangleFanBatch : public FanStripHelper public: TriangleFanBatch(BatchCallbacks const & callbacks); - virtual void BatchData(RefPointer streams); + virtual void BatchData(ref_ptr streams); +protected: + virtual void GenerateIndexes(void * indexStorage, uint32_t count, uint32_t startIndex) const; }; class TriangleListOfStripBatch : public FanStripHelper @@ -114,13 +120,15 @@ class TriangleListOfStripBatch : public FanStripHelper public: TriangleListOfStripBatch(BatchCallbacks const & callbacks); - virtual void BatchData(RefPointer streams); + virtual void BatchData(ref_ptr streams); protected: - virtual uint16_t VtoICount(uint16_t vCount) const; - virtual uint16_t ItoVCount(uint16_t iCount) const; - virtual uint16_t AlignVCount(uint16_t vCount) const; - virtual void GenerateIndexes(uint16_t * indexStorage, uint16_t count, uint16_t startIndex) const; + virtual bool IsBufferFilled(uint32_t availableVerticesCount, uint32_t availableIndicesCount) const; + virtual uint32_t VtoICount(uint32_t vCount) const; + virtual uint32_t ItoVCount(uint32_t iCount) const; + virtual uint32_t AlignVCount(uint32_t vCount) const; + virtual uint32_t AlignICount(uint32_t iCount) const; + virtual void GenerateIndexes(void * indexStorage, uint32_t count, uint32_t startIndex) const; }; } // namespace dp diff --git a/drape/binding_info.hpp b/drape/binding_info.hpp index 3aa858d37a..eee6513df2 100644 --- a/drape/binding_info.hpp +++ b/drape/binding_info.hpp @@ -1,6 +1,7 @@ #pragma once #include "drape/glfunctions.hpp" +#include "drape/glsl_types.hpp" #include "std/string.hpp" #include "std/shared_array.hpp" @@ -10,11 +11,11 @@ namespace dp struct BindingDecl { - string m_attributeName; - uint8_t m_componentCount; - glConst m_componentType; - uint8_t m_stride; - uint16_t m_offset; + string m_attributeName; + uint8_t m_componentCount; + glConst m_componentType; + uint8_t m_stride; + uint8_t m_offset; bool operator != (BindingDecl const & other) const; bool operator < (BindingDecl const & other) const; @@ -41,4 +42,40 @@ protected: uint16_t m_info; }; +template +uint8_t FillDecl(size_t index, string const & attrName, dp::BindingInfo & info, uint8_t offset) +{ + dp::BindingDecl & decl = info.GetBindingDecl(index); + decl.m_attributeName = attrName; + decl.m_componentCount = glsl::GetComponentCount(); + decl.m_componentType = gl_const::GLFloatType; + decl.m_offset = offset; + decl.m_stride = sizeof(TVertexType); + + return sizeof(TFieldType); +} + +template +class BindingFiller +{ +public: + BindingFiller(uint8_t count, uint8_t id = 0) + : m_info(count, id) + { + } + + template + void FillDecl(string const & attrName) + { + m_offset += dp::FillDecl(m_index, attrName, m_info, m_offset); + ++m_index; + } + + dp::BindingInfo m_info; + +private: + size_t m_index = 0; + uint8_t m_offset = 0; +}; + } // namespace dp diff --git a/drape/buffer_base.cpp b/drape/buffer_base.cpp index 34aa81bcdb..99170b9a83 100644 --- a/drape/buffer_base.cpp +++ b/drape/buffer_base.cpp @@ -4,29 +4,29 @@ namespace dp { -BufferBase::BufferBase(uint8_t elementSize, uint16_t capacity) +BufferBase::BufferBase(uint8_t elementSize, uint32_t capacity) : m_elementSize(elementSize) , m_capacity(capacity) , m_size(0) { } -uint16_t BufferBase::GetCapacity() const +uint32_t BufferBase::GetCapacity() const { return m_capacity; } -uint16_t BufferBase::GetCurrentSize() const +uint32_t BufferBase::GetCurrentSize() const { return m_size; } -uint16_t BufferBase::GetAvailableSize() const +uint32_t BufferBase::GetAvailableSize() const { return m_capacity - m_size; } -void BufferBase::Resize(uint16_t elementCount) +void BufferBase::Resize(uint32_t elementCount) { m_capacity = elementCount; m_size = 0; @@ -37,16 +37,22 @@ uint8_t BufferBase::GetElementSize() const return m_elementSize; } -void BufferBase::Seek(uint16_t elementNumber) +void BufferBase::Seek(uint32_t elementNumber) { ASSERT(elementNumber <= m_capacity, ()); m_size = elementNumber; } -void BufferBase::UploadData(uint16_t elementCount) +void BufferBase::UploadData(uint32_t elementCount) { ASSERT(m_size + elementCount <= m_capacity, ()); m_size += elementCount; } +void BufferBase::SetDataSize(uint32_t elementCount) +{ + ASSERT(elementCount <= m_capacity, ()); + m_size = elementCount; +} + } // namespace dp diff --git a/drape/buffer_base.hpp b/drape/buffer_base.hpp index bc7234a1e6..78b0ee4194 100644 --- a/drape/buffer_base.hpp +++ b/drape/buffer_base.hpp @@ -8,22 +8,25 @@ namespace dp class BufferBase { public: - BufferBase(uint8_t elementSize, uint16_t capacity); + BufferBase(uint8_t elementSize, uint32_t capacity); - uint16_t GetCapacity() const; - uint16_t GetCurrentSize() const; - uint16_t GetAvailableSize() const; + uint32_t GetCapacity() const; + uint32_t GetCurrentSize() const; + uint32_t GetAvailableSize() const; + + uint8_t GetElementSize() const; + + void Seek(uint32_t elementNumber); protected: - void Resize(uint16_t elementCount); - uint8_t GetElementSize() const; - void Seek(uint16_t elementNumber); - void UploadData(uint16_t elementCount); + void Resize(uint32_t elementCount); + void UploadData(uint32_t elementCount); + void SetDataSize(uint32_t elementCount); private: uint8_t m_elementSize; - uint16_t m_capacity; - uint16_t m_size; + uint32_t m_capacity; + uint32_t m_size; }; } // namespace dp diff --git a/drape/color.cpp b/drape/color.cpp index 32f3ca9886..e0b3ea0eba 100644 --- a/drape/color.cpp +++ b/drape/color.cpp @@ -11,6 +11,7 @@ static const uint8_t MaxChannelValue = 255; } // namespace #define EXTRACT_BYTE(x, n) (((x) >> 8 * (n)) & 0xFF); +#define CHANNEL_TO_FLOAT(x) ((x) / static_cast(MaxChannelValue)) Color::Color() : m_rgba(MaxChannelValue) @@ -42,6 +43,26 @@ uint8_t Color::GetAlfa() const return EXTRACT_BYTE(m_rgba, 0); } +float Color::GetRedF() const +{ + return CHANNEL_TO_FLOAT(GetRed()); +} + +float Color::GetGreenF() const +{ + return CHANNEL_TO_FLOAT(GetGreen()); +} + +float Color::GetBlueF() const +{ + return CHANNEL_TO_FLOAT(GetBlue()); +} + +float Color::GetAlfaF() const +{ + return CHANNEL_TO_FLOAT(GetAlfa()); +} + uint8_t ExtractRed(uint32_t argb) { return (argb >> 16) & 0xFF; diff --git a/drape/color.hpp b/drape/color.hpp index 16e7c7bac9..7903b1e9c0 100644 --- a/drape/color.hpp +++ b/drape/color.hpp @@ -1,6 +1,8 @@ #pragma once #include "std/cstdint.hpp" +#include "std/sstream.hpp" +#include "std/string.hpp" namespace dp { @@ -15,13 +17,18 @@ struct Color uint8_t GetBlue() const; uint8_t GetAlfa() const; + float GetRedF() const; + float GetGreenF() const; + float GetBlueF() const; + float GetAlfaF() const; + + bool operator==(Color const & other) const { return m_rgba == other.m_rgba; } bool operator< (Color const & other) const { return m_rgba < other.m_rgba; } - static Color Black() { return Color(0, 0, 0, 255); } - static Color White() { return Color(255, 255, 255, 255); } - static Color Red() { return Color(255, 0, 0, 255); } - static Color Transparent() { return Color(0, 0, 0, 0); } - static Color RoadNumberOutline() { return Color(150, 75, 0, 255); } + static Color Black() { return Color(0, 0, 0, 255); } + static Color White() { return Color(255, 255, 255, 255); } + static Color Red() { return Color(255, 0, 0, 255); } + static Color Transparent() { return Color(0, 0, 0, 0); } private: uint32_t m_rgba; @@ -34,4 +41,14 @@ inline uint8_t ExtractAlfa(uint32_t argb); Color Extract(uint32_t argb); Color Extract(uint32_t xrgb, uint8_t a); +inline string DebugPrint(Color const & c) +{ + ostringstream out; + out << "R = " << c.GetRed() + << "G = " << c.GetGreen() + << "B = " << c.GetBlue() + << "A = " << c.GetAlfa(); + return out.str(); +} + } diff --git a/drape/cpu_buffer.cpp b/drape/cpu_buffer.cpp index c22d38502d..7aa72ef528 100644 --- a/drape/cpu_buffer.cpp +++ b/drape/cpu_buffer.cpp @@ -9,8 +9,8 @@ namespace dp { -CPUBuffer::CPUBuffer(uint8_t elementSize, uint16_t capacity) - : base_t(elementSize, capacity) +CPUBuffer::CPUBuffer(uint8_t elementSize, uint32_t capacity) + : TBase(elementSize, capacity) { uint32_t memorySize = my::NextPowOf2(GetCapacity() * GetElementSize()); m_memory = SharedBufferManager::instance().reserveSharedBuffer(memorySize); @@ -23,7 +23,7 @@ CPUBuffer::~CPUBuffer() SharedBufferManager::instance().freeSharedBuffer(m_memory->size(), m_memory); } -void CPUBuffer::UploadData(void const * data, uint16_t elementCount) +void CPUBuffer::UploadData(void const * data, uint32_t elementCount) { uint32_t byteCountToCopy = GetElementSize() * elementCount; #ifdef DEBUG @@ -32,20 +32,20 @@ void CPUBuffer::UploadData(void const * data, uint16_t elementCount) #endif memcpy(GetCursor(), data, byteCountToCopy); - base_t::UploadData(elementCount); + TBase::UploadData(elementCount); } -void CPUBuffer::Seek(uint16_t elementNumber) +void CPUBuffer::Seek(uint32_t elementNumber) { uint32_t offsetFromBegin = GetElementSize() * elementNumber; ASSERT(Data() + offsetFromBegin <= Data() + m_memory->size(), ()); - base_t::Seek(elementNumber); + TBase::Seek(elementNumber); m_memoryCursor = NonConstData() + offsetFromBegin; } -uint16_t CPUBuffer::GetCurrentElementNumber() const +uint32_t CPUBuffer::GetCurrentElementNumber() const { - uint16_t pointerDiff = GetCursor() - Data(); + uint32_t pointerDiff = GetCursor() - Data(); ASSERT(pointerDiff % GetElementSize() == 0, ()); return pointerDiff / GetElementSize(); } diff --git a/drape/cpu_buffer.hpp b/drape/cpu_buffer.hpp index d0836919b9..addbce9bff 100644 --- a/drape/cpu_buffer.hpp +++ b/drape/cpu_buffer.hpp @@ -10,17 +10,17 @@ namespace dp class CPUBuffer : public BufferBase { - typedef BufferBase base_t; + typedef BufferBase TBase; public: - CPUBuffer(uint8_t elementSize, uint16_t capacity); + CPUBuffer(uint8_t elementSize, uint32_t capacity); ~CPUBuffer(); - void UploadData(void const * data, uint16_t elementCount); + void UploadData(void const * data, uint32_t elementCount); // Set memory cursor on element with number == "elementNumber" // Element numbers start from 0 - void Seek(uint16_t elementNumber); + void Seek(uint32_t elementNumber); // Check function. In real world use must use it only in assert - uint16_t GetCurrentElementNumber() const; + uint32_t GetCurrentElementNumber() const; unsigned char const * Data() const; private: diff --git a/drape/data_buffer.cpp b/drape/data_buffer.cpp index e5180739d7..fccc4fa7f9 100644 --- a/drape/data_buffer.cpp +++ b/drape/data_buffer.cpp @@ -1,11 +1,46 @@ #include "drape/data_buffer.hpp" +#include "drape/data_buffer_impl.hpp" namespace dp { -DataBuffer::DataBuffer(uint8_t elementSize, uint16_t capacity) - : GPUBuffer(GPUBuffer::ElementBuffer, elementSize, capacity) +DataBuffer::DataBuffer(uint8_t elementSize, uint32_t capacity) + : m_impl(make_unique_dp(elementSize, capacity)) { } +ref_ptr DataBuffer::GetBuffer() const +{ + ASSERT(m_impl != nullptr, ()); + return make_ref(m_impl); +} + +void DataBuffer::MoveToGPU(GPUBuffer::Target target) +{ + // if currentSize is 0 buffer hasn't been filled on preparation stage, let it be filled further + uint32_t const currentSize = m_impl->GetCurrentSize(); + if (currentSize != 0) + m_impl = make_unique_dp(target, m_impl->Data(),m_impl->GetElementSize(), currentSize); + else + m_impl = make_unique_dp(target, nullptr, m_impl->GetElementSize(), m_impl->GetAvailableSize()); +} + + +DataBufferMapper::DataBufferMapper(ref_ptr buffer) + : m_buffer(buffer) +{ + m_buffer->GetBuffer()->Bind(); + m_ptr = m_buffer->GetBuffer()->Map(); +} + +DataBufferMapper::~DataBufferMapper() +{ + m_buffer->GetBuffer()->Unmap(); +} + +void DataBufferMapper::UpdateData(void const * data, uint32_t elementOffset, uint32_t elementCount) +{ + m_buffer->GetBuffer()->UpdateData(m_ptr, data, elementOffset, elementCount); +} + } diff --git a/drape/data_buffer.hpp b/drape/data_buffer.hpp index f22c7a31c9..0c82228449 100644 --- a/drape/data_buffer.hpp +++ b/drape/data_buffer.hpp @@ -1,14 +1,56 @@ #pragma once +#include "drape/pointers.hpp" #include "drape/gpu_buffer.hpp" namespace dp { -class DataBuffer : public GPUBuffer +class DataBufferBase { public: - DataBuffer(uint8_t elementSize, uint16_t capacity); + virtual ~DataBufferBase() {} + + virtual uint32_t GetCapacity() const = 0; + virtual uint32_t GetCurrentSize() const = 0; + virtual uint32_t GetAvailableSize() const = 0; + virtual uint8_t GetElementSize() const = 0; + virtual void Seek(uint32_t elementNumber) = 0; + virtual void const * Data() const = 0; + + virtual void UploadData(void const * data, uint32_t elementCount) = 0; + virtual void UpdateData(void * destPtr, void const * srcPtr, uint32_t elementOffset, uint32_t elementCount) = 0; + + virtual void Bind() = 0; + virtual void * Map() = 0; + virtual void Unmap() = 0; +}; + + +class DataBuffer +{ +public: + DataBuffer(uint8_t elementSize, uint32_t capacity); + + ref_ptr GetBuffer() const; + void MoveToGPU(GPUBuffer::Target target); + +private: + drape_ptr m_impl; +}; + + +class DataBufferMapper +{ +public: + DataBufferMapper(ref_ptr buffer); + ~DataBufferMapper(); + + void UpdateData(void const * data, uint32_t elementOffset, uint32_t elementCount); + +private: + ref_ptr m_buffer; + void * m_ptr; }; } // namespace dp diff --git a/drape/data_buffer_impl.hpp b/drape/data_buffer_impl.hpp new file mode 100644 index 0000000000..562e9a0913 --- /dev/null +++ b/drape/data_buffer_impl.hpp @@ -0,0 +1,132 @@ +#pragma once + +#include "data_buffer.hpp" +#include "cpu_buffer.hpp" +#include "gpu_buffer.hpp" +#include "std/utility.hpp" + +namespace dp +{ + +/// generic implementation of data buffer +template +class DataBufferImpl : public DataBufferBase +{ +public: + template DataBufferImpl(Args&&... params) + : m_buffer(make_unique_dp(forward(params)...)) + { + } + + uint32_t GetCapacity() const override + { + return m_buffer->GetCapacity(); + } + + uint32_t GetCurrentSize() const override + { + return m_buffer->GetCurrentSize(); + } + + uint32_t GetAvailableSize() const override + { + return m_buffer->GetAvailableSize(); + } + + uint8_t GetElementSize() const override + { + return m_buffer->GetElementSize(); + } + + void Seek(uint32_t elementNumber) override + { + m_buffer->Seek(elementNumber); + } + +protected: + drape_ptr m_buffer; +}; + +/// CPU implementation of data buffer +class CpuBufferImpl : public DataBufferImpl +{ +public: + template CpuBufferImpl(Args&&... params) + : DataBufferImpl(forward(params)...) + {} + + void const * Data() const override + { + return m_buffer->Data(); + } + + void UploadData(void const * data, uint32_t elementCount) override + { + m_buffer->UploadData(data, elementCount); + uint32_t const newOffset = m_buffer->GetCurrentSize(); + m_buffer->Seek(newOffset); + } + + void UpdateData(void * destPtr, void const * srcPtr, uint32_t elementOffset, uint32_t elementCount) override + { + ASSERT(false, ("Data updating is unavailable for CPU buffer")); + } + + void Bind() override + { + ASSERT(false, ("Binding is unavailable for CPU buffer")); + } + + void * Map() override + { + ASSERT(false, ("Mapping is unavailable for CPU buffer")); + return nullptr; + } + + void Unmap() override + { + ASSERT(false, ("Unmapping is unavailable for CPU buffer")); + } +}; + +/// GPU implementation of data buffer +class GpuBufferImpl : public DataBufferImpl +{ +public: + template GpuBufferImpl(Args&&... params) + : DataBufferImpl(forward(params)...) + {} + + void const * Data() const override + { + ASSERT(false, ("Retrieving of raw data is unavailable for GPU buffer")); + return nullptr; + } + + void UploadData(void const * data, uint32_t elementCount) override + { + m_buffer->UploadData(data, elementCount); + } + + void UpdateData(void * destPtr, void const * srcPtr, uint32_t elementOffset, uint32_t elementCount) override + { + m_buffer->UpdateData(destPtr, srcPtr, elementOffset, elementCount); + } + + void Bind() override + { + m_buffer->Bind(); + } + + void * Map() override + { + return m_buffer->Map(); + } + + void Unmap() override + { + return m_buffer->Unmap(); + } +}; + +} // namespace dp diff --git a/drape/debug_rect_renderer.cpp b/drape/debug_rect_renderer.cpp new file mode 100644 index 0000000000..e4043ccb48 --- /dev/null +++ b/drape/debug_rect_renderer.cpp @@ -0,0 +1,117 @@ +#include "drape/debug_rect_renderer.hpp" + +#include "drape/gpu_program_manager.hpp" +#include "drape/glfunctions.hpp" +#include "drape/shader_def.hpp" + +namespace dp +{ + +namespace +{ + +m2::PointF PixelPointToScreenSpace(ScreenBase const & screen, m2::PointF const & pt) +{ + float const szX = static_cast(screen.PixelRect().SizeX()); + float const szY = static_cast(screen.PixelRect().SizeY()); + return m2::PointF(pt.x / szX - 0.5f, -pt.y / szY + 0.5f) * 2.0f; +} + +} + +DebugRectRenderer & DebugRectRenderer::Instance() +{ + static DebugRectRenderer renderer; + return renderer; +} + +DebugRectRenderer::DebugRectRenderer() + : m_VAO(0) + , m_vertexBuffer(0) + , m_isEnabled(true) +{ +} + +DebugRectRenderer::~DebugRectRenderer() +{ + ASSERT_EQUAL(m_VAO, 0, ()); + ASSERT_EQUAL(m_vertexBuffer, 0, ()); +} + +void DebugRectRenderer::Init(ref_ptr mng) +{ + m_vertexBuffer = GLFunctions::glGenBuffer(); + GLFunctions::glBindBuffer(m_vertexBuffer, gl_const::GLArrayBuffer); + + m_VAO = GLFunctions::glGenVertexArray(); + GLFunctions::glBindVertexArray(m_VAO); + + m_program = mng->GetProgram(gpu::DEBUG_RECT_PROGRAM); + int8_t attributeLocation = m_program->GetAttributeLocation("a_position"); + ASSERT_NOT_EQUAL(attributeLocation, -1, ()); + GLFunctions::glEnableVertexAttribute(attributeLocation); + GLFunctions::glVertexAttributePointer(attributeLocation, 2, gl_const::GLFloatType, false, sizeof(float) * 2, 0); + + GLFunctions::glBindBuffer(0, gl_const::GLArrayBuffer); + GLFunctions::glBindVertexArray(0); +} + +void DebugRectRenderer::Destroy() +{ + if (m_vertexBuffer != 0) + { + GLFunctions::glDeleteBuffer(m_vertexBuffer); + m_vertexBuffer = 0; + } + + if (m_VAO != 0) + { + GLFunctions::glDeleteVertexArray(m_VAO); + m_VAO = 0; + } + + m_program = nullptr; +} + +bool DebugRectRenderer::IsEnabled() const +{ + return m_isEnabled; +} + +void DebugRectRenderer::SetEnabled(bool enabled) +{ + m_isEnabled = enabled; +} + +void DebugRectRenderer::DrawRect(ScreenBase const & screen, m2::RectF const & rect) const +{ + if (!m_isEnabled) + return; + + ASSERT(m_program != nullptr, ()); + m_program->Bind(); + + GLFunctions::glBindBuffer(m_vertexBuffer, gl_const::GLArrayBuffer); + GLFunctions::glBindVertexArray(m_VAO); + + GLFunctions::glDisable(gl_const::GLDepthTest); + + array vertices; + vertices[0] = PixelPointToScreenSpace(screen, rect.LeftBottom()); + vertices[1] = PixelPointToScreenSpace(screen, rect.LeftTop()); + vertices[2] = PixelPointToScreenSpace(screen, rect.RightTop()); + vertices[3] = PixelPointToScreenSpace(screen, rect.RightBottom()); + vertices[4] = vertices[0]; + + GLFunctions::glBufferData(gl_const::GLArrayBuffer, vertices.size() * sizeof(vertices[0]), + vertices.data(), gl_const::GLStaticDraw); + + GLFunctions::glDrawArrays(gl_const::GLLineStrip, 0, vertices.size()); + + GLFunctions::glEnable(gl_const::GLDepthTest); + + GLFunctions::glBindBuffer(0, gl_const::GLArrayBuffer); + GLFunctions::glBindVertexArray(0); +} + +} // namespace dp diff --git a/drape/debug_rect_renderer.hpp b/drape/debug_rect_renderer.hpp new file mode 100644 index 0000000000..0d769da17e --- /dev/null +++ b/drape/debug_rect_renderer.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include "drape/gpu_program_manager.hpp" +#include "drape/pointers.hpp" + +#include "geometry/rect2d.hpp" +#include "geometry/screenbase.hpp" + +//#define RENDER_DEBUG_RECTS + +namespace dp +{ + +class DebugRectRenderer +{ +public: + static DebugRectRenderer & Instance(); + void Init(ref_ptr mng); + void Destroy(); + + bool IsEnabled() const; + void SetEnabled(bool enabled); + + void DrawRect(ScreenBase const & screen, m2::RectF const & rect) const; + +private: + DebugRectRenderer(); + ~DebugRectRenderer(); + + int m_VAO; + int m_vertexBuffer; + ref_ptr m_program; + bool m_isEnabled; +}; + +} // namespace dp diff --git a/drape/depth_constants.hpp b/drape/depth_constants.hpp new file mode 100644 index 0000000000..e5e8b7dd14 --- /dev/null +++ b/drape/depth_constants.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "utils/projection.hpp" + +namespace dp +{ + +namespace depth +{ + +float const POSITION_ACCURACY = minDepth; +float const MY_POSITION_MARK = maxDepth; + +} // namespace depth + +} // namespace dp diff --git a/drape/drape.pro b/drape/drape.pro index 3a629deadd..f359d45be5 100644 --- a/drape/drape.pro +++ b/drape/drape.pro @@ -12,10 +12,20 @@ include($$DRAPE_DIR/drape_common.pri) SOURCES += glfunctions.cpp OTHER_FILES += \ - shaders/texturing_vertex_shader.vsh \ - shaders/texturing_fragment_shader.fsh \ - shaders/shader_index.txt \ - shaders/line_vertex_shader.vsh \ + shaders/compass_vertex_shader.vsh \ + shaders/dashed_fragment_shader.fsh \ + shaders/dashed_vertex_shader.vsh \ shaders/line_fragment_shader.fsh \ + shaders/line_vertex_shader.vsh \ + shaders/my_position_shader.vsh \ + shaders/position_accuracy_shader.vsh \ + shaders/ruler_vertex_shader.vsh \ + shaders/shader_index.txt \ shaders/text_fragment_shader.fsh \ shaders/text_vertex_shader.vsh \ + shaders/texturing_fragment_shader.fsh \ + shaders/texturing_vertex_shader.vsh \ + shaders/user_mark.vsh \ + shaders/circle_shader.fsh \ + shaders/circle_shader.vsh \ + shaders/area_vertex_shader.vsh \ diff --git a/drape/drape_common.pri b/drape/drape_common.pri index 304a0173ad..694ec54e78 100644 --- a/drape/drape_common.pri +++ b/drape/drape_common.pri @@ -6,85 +6,107 @@ INCLUDEPATH *= $$ROOT_DIR/3party/freetype/include SOURCES += \ $$ROOT_DIR/3party/sdf_image/sdf_image.cpp \ $$ROOT_DIR/3party/stb_image/stb_image.c \ - $$DRAPE_DIR/data_buffer.cpp \ - $$DRAPE_DIR/binding_info.cpp \ - $$DRAPE_DIR/batcher.cpp \ + $$DRAPE_DIR/attribute_buffer_mutator.cpp \ $$DRAPE_DIR/attribute_provider.cpp \ - $$DRAPE_DIR/vertex_array_buffer.cpp \ - $$DRAPE_DIR/uniform_value.cpp \ - $$DRAPE_DIR/texture.cpp \ - $$DRAPE_DIR/shader.cpp \ - $$DRAPE_DIR/index_buffer.cpp \ + $$DRAPE_DIR/batcher.cpp \ + $$DRAPE_DIR/batcher_helpers.cpp \ + $$DRAPE_DIR/binding_info.cpp \ + $$DRAPE_DIR/buffer_base.cpp \ + $$DRAPE_DIR/color.cpp \ + $$DRAPE_DIR/cpu_buffer.cpp \ + $$DRAPE_DIR/data_buffer.cpp \ + $$DRAPE_DIR/debug_rect_renderer.cpp \ + $$DRAPE_DIR/font_texture.cpp \ + $$DRAPE_DIR/fribidi.cpp \ + $$DRAPE_DIR/glconstants.cpp \ + $$DRAPE_DIR/glextensions_list.cpp \ + $$DRAPE_DIR/glstate.cpp \ + $$DRAPE_DIR/glyph_manager.cpp \ + $$DRAPE_DIR/gpu_buffer.cpp \ $$DRAPE_DIR/gpu_program.cpp \ $$DRAPE_DIR/gpu_program_manager.cpp \ - $$DRAPE_DIR/glconstants.cpp \ - $$DRAPE_DIR/glstate.cpp \ - $$DRAPE_DIR/gpu_buffer.cpp \ - $$DRAPE_DIR/shader_def.cpp \ - $$DRAPE_DIR/glextensions_list.cpp \ - $$DRAPE_DIR/pointers.cpp \ - $$DRAPE_DIR/uniform_values_storage.cpp \ - $$DRAPE_DIR/color.cpp \ - $$DRAPE_DIR/oglcontextfactory.cpp \ - $$DRAPE_DIR/buffer_base.cpp \ - $$DRAPE_DIR/cpu_buffer.cpp \ - $$DRAPE_DIR/symbols_texture.cpp \ - $$DRAPE_DIR/texture_manager.cpp \ - $$DRAPE_DIR/render_bucket.cpp \ - $$DRAPE_DIR/overlay_handle.cpp \ + $$DRAPE_DIR/hw_texture.cpp \ + $$DRAPE_DIR/index_buffer.cpp \ $$DRAPE_DIR/index_buffer_mutator.cpp \ - $$DRAPE_DIR/batcher_helpers.cpp \ + $$DRAPE_DIR/index_storage.cpp \ + $$DRAPE_DIR/oglcontextfactory.cpp \ + $$DRAPE_DIR/overlay_handle.cpp \ $$DRAPE_DIR/overlay_tree.cpp \ - $$DRAPE_DIR/font_texture.cpp \ - $$DRAPE_DIR/attribute_buffer_mutator.cpp \ + $$DRAPE_DIR/pointers.cpp \ + $$DRAPE_DIR/render_bucket.cpp \ + $$DRAPE_DIR/shader.cpp \ + $$DRAPE_DIR/shader_def.cpp \ $$DRAPE_DIR/stipple_pen_resource.cpp \ + $$DRAPE_DIR/symbols_texture.cpp \ + $$DRAPE_DIR/texture.cpp \ + $$DRAPE_DIR/texture_manager.cpp \ $$DRAPE_DIR/texture_of_colors.cpp \ - $$DRAPE_DIR/glyph_manager.cpp \ - $$DRAPE_DIR/utils/vertex_decl.cpp + $$DRAPE_DIR/uniform_value.cpp \ + $$DRAPE_DIR/uniform_values_storage.cpp \ + $$DRAPE_DIR/utils/glyph_usage_tracker.cpp \ + $$DRAPE_DIR/utils/gpu_mem_tracker.cpp \ + $$DRAPE_DIR/utils/projection.cpp \ + $$DRAPE_DIR/utils/vertex_decl.cpp \ + $$DRAPE_DIR/vertex_array_buffer.cpp \ HEADERS += \ $$ROOT_DIR/3party/sdf_image/sdf_image.h \ $$ROOT_DIR/3party/stb_image/stb_image.h \ - $$DRAPE_DIR/data_buffer.hpp \ - $$DRAPE_DIR/binding_info.hpp \ - $$DRAPE_DIR/batcher.hpp \ + $$DRAPE_DIR/attribute_buffer_mutator.hpp \ $$DRAPE_DIR/attribute_provider.hpp \ - $$DRAPE_DIR/vertex_array_buffer.hpp \ - $$DRAPE_DIR/uniform_value.hpp \ - $$DRAPE_DIR/texture.hpp \ - $$DRAPE_DIR/shader.hpp \ - $$DRAPE_DIR/pointers.hpp \ - $$DRAPE_DIR/index_buffer.hpp \ + $$DRAPE_DIR/batcher.hpp \ + $$DRAPE_DIR/batcher_helpers.hpp \ + $$DRAPE_DIR/binding_info.hpp \ + $$DRAPE_DIR/buffer_base.hpp \ + $$DRAPE_DIR/color.hpp \ + $$DRAPE_DIR/cpu_buffer.hpp \ + $$DRAPE_DIR/data_buffer.hpp \ + $$DRAPE_DIR/data_buffer_impl.hpp \ + $$DRAPE_DIR/debug_rect_renderer.hpp \ + $$DRAPE_DIR/depth_constants.hpp \ + $$DRAPE_DIR/drape_global.hpp \ + $$DRAPE_DIR/dynamic_texture.hpp \ + $$DRAPE_DIR/font_texture.hpp \ + $$DRAPE_DIR/fribidi.hpp \ + $$DRAPE_DIR/glconstants.hpp \ + $$DRAPE_DIR/glextensions_list.hpp \ + $$DRAPE_DIR/glfunctions.hpp \ + $$DRAPE_DIR/glIncludes.hpp \ + $$DRAPE_DIR/glsl_func.hpp \ + $$DRAPE_DIR/glsl_types.hpp \ + $$DRAPE_DIR/glstate.hpp \ + $$DRAPE_DIR/glyph_manager.hpp \ + $$DRAPE_DIR/gpu_buffer.hpp \ $$DRAPE_DIR/gpu_program.hpp \ $$DRAPE_DIR/gpu_program_manager.hpp \ - $$DRAPE_DIR/glstate.hpp \ - $$DRAPE_DIR/glIncludes.hpp \ - $$DRAPE_DIR/glconstants.hpp \ - $$DRAPE_DIR/glfunctions.hpp \ - $$DRAPE_DIR/gpu_buffer.hpp \ - $$DRAPE_DIR/shader_def.hpp \ - $$DRAPE_DIR/glextensions_list.hpp \ - $$DRAPE_DIR/oglcontext.hpp \ - $$DRAPE_DIR/uniform_values_storage.hpp \ - $$DRAPE_DIR/color.hpp \ - $$DRAPE_DIR/oglcontextfactory.hpp \ - $$DRAPE_DIR/buffer_base.hpp \ - $$DRAPE_DIR/cpu_buffer.hpp \ - $$DRAPE_DIR/symbols_texture.hpp \ - $$DRAPE_DIR/texture_manager.hpp \ - $$DRAPE_DIR/render_bucket.hpp \ - $$DRAPE_DIR/overlay_handle.hpp \ + $$DRAPE_DIR/hw_texture.hpp \ + $$DRAPE_DIR/index_buffer.hpp \ $$DRAPE_DIR/index_buffer_mutator.hpp \ - $$DRAPE_DIR/batcher_helpers.hpp \ - $$DRAPE_DIR/overlay_tree.hpp \ - $$DRAPE_DIR/font_texture.hpp \ - $$DRAPE_DIR/attribute_buffer_mutator.hpp \ - $$DRAPE_DIR/drape_global.hpp \ + $$DRAPE_DIR/index_storage.hpp \ $$DRAPE_DIR/object_pool.hpp \ + $$DRAPE_DIR/oglcontext.hpp \ + $$DRAPE_DIR/oglcontextfactory.hpp \ + $$DRAPE_DIR/overlay_handle.hpp \ + $$DRAPE_DIR/overlay_tree.hpp \ + $$DRAPE_DIR/pointers.hpp \ + $$DRAPE_DIR/render_bucket.hpp \ + $$DRAPE_DIR/shader.hpp \ + $$DRAPE_DIR/shader_def.hpp \ $$DRAPE_DIR/stipple_pen_resource.hpp \ - $$DRAPE_DIR/dynamic_texture.hpp \ + $$DRAPE_DIR/symbols_texture.hpp \ + $$DRAPE_DIR/texture.hpp \ + $$DRAPE_DIR/texture_manager.hpp \ $$DRAPE_DIR/texture_of_colors.hpp \ - $$DRAPE_DIR/glsl_types.hpp \ - $$DRAPE_DIR/glsl_func.hpp \ - $$DRAPE_DIR/glyph_manager.hpp \ - $$DRAPE_DIR/utils/vertex_decl.hpp + $$DRAPE_DIR/uniform_value.hpp \ + $$DRAPE_DIR/uniform_values_storage.hpp \ + $$DRAPE_DIR/utils/glyph_usage_tracker.hpp \ + $$DRAPE_DIR/utils/gpu_mem_tracker.hpp \ + $$DRAPE_DIR/utils/projection.hpp \ + $$DRAPE_DIR/utils/vertex_decl.hpp \ + $$DRAPE_DIR/vertex_array_buffer.hpp \ + $$DRAPE_DIR/visual_scale.hpp \ + +iphone*{ + HEADERS += $$DRAPE_DIR/hw_texture_ios.hpp + OBJECTIVE_SOURCES += $$DRAPE_DIR/hw_texture_ios.mm +} diff --git a/drape/drape_global.hpp b/drape/drape_global.hpp index f9be7fd035..8487ad7f8d 100644 --- a/drape/drape_global.hpp +++ b/drape/drape_global.hpp @@ -1,16 +1,38 @@ #pragma once +#include "color.hpp" + +#include "base/assert.hpp" + namespace dp { enum TextureFormat { RGBA8, - RGBA4, ALPHA, UNSPECIFIED }; +inline uint8_t GetBytesPerPixel(TextureFormat format) +{ + uint8_t result = 0; + switch (format) + { + case RGBA8: + result = 4; + break; + case ALPHA: + result = 1; + break; + default: + ASSERT(false, ()); + break; + } + + return result; +} + enum Anchor { Center = 0, @@ -27,15 +49,30 @@ enum Anchor enum LineCap { SquareCap = -1, - RoundCap = 0, - ButtCap = 1, + RoundCap = 0, + ButtCap = 1, }; enum LineJoin { - MiterJoin = -1, - BevelJoin = 0, + MiterJoin = -1, + BevelJoin = 0, RoundJoin = 1, }; +struct FontDecl +{ + FontDecl() = default; + FontDecl(Color const & color, float size, Color const & outlineColor = Color::Transparent()) + : m_color(color) + , m_outlineColor(outlineColor) + , m_size(size) + { + } + + Color m_color = Color::Transparent(); + Color m_outlineColor = Color::Transparent(); + float m_size = 0; +}; + } diff --git a/drape/drape_tests/attribute_provides_tests.cpp b/drape/drape_tests/attribute_provides_tests.cpp index abacefdb1e..8b3b7ffb9f 100644 --- a/drape/drape_tests/attribute_provides_tests.cpp +++ b/drape/drape_tests/attribute_provides_tests.cpp @@ -31,7 +31,7 @@ UNIT_TEST(InitStreamsTest) decl.m_componentType = gl_const::GLFloatType; decl.m_offset = 0; decl.m_stride = 0; - provider.InitStream(0, zeroStreamBinding, MakeStackRefPointer(positions)); + provider.InitStream(0, zeroStreamBinding, make_ref(positions)); } { @@ -42,7 +42,7 @@ UNIT_TEST(InitStreamsTest) decl.m_componentType = gl_const::GLFloatType; decl.m_offset = 0; decl.m_stride = 0; - provider.InitStream(1, firstStreamBinding, MakeStackRefPointer(depth)); + provider.InitStream(1, firstStreamBinding, make_ref(depth)); } { @@ -53,7 +53,7 @@ UNIT_TEST(InitStreamsTest) decl.m_componentType = gl_const::GLFloatType; decl.m_offset = 0; decl.m_stride = 0; - provider.InitStream(2, secondStreamBinding, MakeStackRefPointer(normals)); + provider.InitStream(2, secondStreamBinding, make_ref(normals)); } TEST_EQUAL(provider.IsDataExists(), true, ()); @@ -116,7 +116,7 @@ UNIT_TEST(InterleavedStreamTest) decl.m_stride = 5 * sizeof(float); } - provider.InitStream(0, binding, MakeStackRefPointer(data)); + provider.InitStream(0, binding, make_ref(data)); TEST_EQUAL(provider.IsDataExists(), true, ()); TEST_EQUAL(provider.GetVertexCount(), 10, ()); @@ -169,7 +169,7 @@ UNIT_TEST(MixedStreamsTest) decl.m_stride = 3 * sizeof(float); } - provider.InitStream(0, binding, MakeStackRefPointer(position)); + provider.InitStream(0, binding, make_ref(position)); } { @@ -180,7 +180,7 @@ UNIT_TEST(MixedStreamsTest) decl.m_componentType = gl_const::GLFloatType; decl.m_offset = 0; decl.m_stride = 0; - provider.InitStream(1, binding, MakeStackRefPointer(normal)); + provider.InitStream(1, binding, make_ref(normal)); } TEST_EQUAL(provider.IsDataExists(), true, ()); diff --git a/drape/drape_tests/batcher_tests.cpp b/drape/drape_tests/batcher_tests.cpp index 5061a46d79..0b8da62565 100644 --- a/drape/drape_tests/batcher_tests.cpp +++ b/drape/drape_tests/batcher_tests.cpp @@ -4,6 +4,7 @@ #include "drape/glconstants.hpp" #include "drape/batcher.hpp" #include "drape/gpu_program_manager.hpp" +#include "drape/index_storage.hpp" #include "drape/shader_def.hpp" #include "drape/vertex_array_buffer.hpp" @@ -31,12 +32,12 @@ namespace struct VAOAcceptor { - virtual void FlushFullBucket(GLState const & /*state*/, TransferPointer bucket) + virtual void FlushFullBucket(GLState const & /*state*/, drape_ptr && bucket) { - m_vao.push_back(MasterPointer(bucket)); + m_vao.push_back(move(bucket)); } - vector > m_vao; + vector > m_vao; }; class BatcherExpectations @@ -48,14 +49,14 @@ public: { } - typedef function)> TBatcherCallFn; - void RunTest(float * vertexes, uint16_t * indexes, - uint16_t vertexCount, uint16_t vertexComponentCount, - uint16_t indexCount, TBatcherCallFn const & fn) + template + void RunTest(float * vertexes, void * indexes, + uint32_t vertexCount, uint32_t vertexComponentCount, + uint32_t indexCount, TBatcherCall const & fn) { int const vertexSize = vertexCount * vertexComponentCount; MemoryComparer const dataCmp(vertexes, vertexSize * sizeof(float)); - MemoryComparer const indexCmp(indexes, indexCount * sizeof(uint16_t)); + MemoryComparer const indexCmp(indexes, indexCount * dp::IndexStorage::SizeOfIndex()); ExpectBufferCreation(vertexSize, indexCount, indexCmp, dataCmp); @@ -70,45 +71,37 @@ public: decl.m_stride = 0; AttributeProvider provider(1, vertexCount); - provider.InitStream(0, binding, MakeStackRefPointer(vertexes)); + provider.InitStream(0, binding, make_ref(vertexes)); VAOAcceptor vaoAcceptor; - Batcher batcher; + Batcher batcher(65000, 65000); batcher.StartSession(bind(&VAOAcceptor::FlushFullBucket, &vaoAcceptor, _1, _2)); - fn(&batcher, state, MakeStackRefPointer(&provider)); + fn(&batcher, state, make_ref(&provider)); batcher.EndSession(); ExpectBufferDeletion(); for (size_t i = 0; i < vaoAcceptor.m_vao.size(); ++i) - vaoAcceptor.m_vao[i].Destroy(); + vaoAcceptor.m_vao[i].reset(); } - void ExpectBufferCreation(uint16_t vertxeCount, uint16_t indexCount, + void ExpectBufferCreation(uint32_t vertexCount, uint32_t indexCount, MemoryComparer const & indexCmp, MemoryComparer const & vertexCmp) { InSequence seq; - // Index buffer creation - EXPECTGL(glGenBuffer()).WillOnce(Return(m_indexBufferID)); - EXPECTGL(glBindBuffer(m_indexBufferID, gl_const::GLElementArrayBuffer)); - EXPECTGL(glBufferData(gl_const::GLElementArrayBuffer, _, NULL, _)); - - // upload indexes - EXPECTGL(glBindBuffer(m_indexBufferID, gl_const::GLElementArrayBuffer)); - EXPECTGL(glBufferSubData(gl_const::GLElementArrayBuffer, indexCount * sizeof(unsigned short), _, 0)) - .WillOnce(Invoke(&indexCmp, &MemoryComparer::cmpSubBuffer)); - // data buffer creation EXPECTGL(glGenBuffer()).WillOnce(Return(m_dataBufferID)); EXPECTGL(glBindBuffer(m_dataBufferID, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferData(gl_const::GLArrayBuffer, _, NULL, _)); - - // upload data - EXPECTGL(glBindBuffer(m_dataBufferID, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferSubData(gl_const::GLArrayBuffer, vertxeCount * sizeof(float), _, 0)) + EXPECTGL(glBufferData(gl_const::GLArrayBuffer, vertexCount * sizeof(float), _, gl_const::GLDynamicDraw)) .WillOnce(Invoke(&vertexCmp, &MemoryComparer::cmpSubBuffer)); + // Index buffer creation + EXPECTGL(glGenBuffer()).WillOnce(Return(m_indexBufferID)); + EXPECTGL(glBindBuffer(m_indexBufferID, gl_const::GLElementArrayBuffer)); + EXPECTGL(glBufferData(gl_const::GLElementArrayBuffer, indexCount * dp::IndexStorage::SizeOfIndex(), _, gl_const::GLDynamicDraw)) + .WillOnce(Invoke(&indexCmp, &MemoryComparer::cmpSubBuffer)); + EXPECTGL(glBindBuffer(0, gl_const::GLElementArrayBuffer)); EXPECTGL(glBindBuffer(0, gl_const::GLArrayBuffer)); } @@ -137,16 +130,17 @@ UNIT_TEST(BatchLists_Test) for (int i = 0; i < FLOAT_COUNT; ++i) data[i] = (float)i; - unsigned short indexes[VERTEX_COUNT]; + vector indexesRaw(VERTEX_COUNT); for (int i = 0; i < VERTEX_COUNT; ++i) - indexes[i] = i; + indexesRaw[i] = i; + dp::IndexStorage indexes(move(indexesRaw)); BatcherExpectations expectations; - // @TODO Avoid std::bind overload compile error in the better way - void (Batcher::*fn)(GLState const &, - RefPointer) = &Batcher::InsertTriangleList; - expectations.RunTest(data, indexes, VERTEX_COUNT, 3, VERTEX_COUNT, - bind(fn, _1, _2, _3)); + auto fn = [](Batcher * batcher, GLState const & state, ref_ptr p) + { + batcher->InsertTriangleList(state, p); + }; + expectations.RunTest(data, indexes.GetRaw(), VERTEX_COUNT, 3, VERTEX_COUNT, fn); } UNIT_TEST(BatchListOfStript_4stride) @@ -158,13 +152,16 @@ UNIT_TEST(BatchListOfStript_4stride) for (int i = 0; i < VERTEX_COUNT * 3; ++i) data[i] = (float)i; - unsigned short indexes[INDEX_COUNT] = - { 0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7, 8, 9, 10, 9, 10, 11}; + vector indexesRaw = { 0, 1, 2, 1, 3, 2, 4, 5, 6, 5, 7, 6, 8, 9, 10, 9, 11, 10}; + dp::IndexStorage indexes(move(indexesRaw)); BatcherExpectations expectations; - // @TODO Avoid std::bind overload compile error in the better way - void (Batcher::*fn)(GLState const &, RefPointer, uint8_t) = &Batcher::InsertListOfStrip; - expectations.RunTest(data, indexes, VERTEX_COUNT, 3, INDEX_COUNT, bind(fn, _1, _2, _3, 4)); + auto fn = [](Batcher * batcher, GLState const & state, ref_ptr p) + { + batcher->InsertListOfStrip(state, p, dp::Batcher::VertexPerQuad); + }; + + expectations.RunTest(data, indexes.GetRaw(), VERTEX_COUNT, 3, INDEX_COUNT, fn); } UNIT_TEST(BatchListOfStript_5stride) @@ -176,21 +173,24 @@ UNIT_TEST(BatchListOfStript_5stride) for (int i = 0; i < VERTEX_COUNT * 3; ++i) data[i] = (float)i; - unsigned short indexes[INDEX_COUNT] = + vector indexesRaw = { 0, 1, 2, - 1, 2, 3, + 1, 3, 2, 2, 3, 4, 5, 6, 7, - 6, 7, 8, + 6, 8, 7, 7, 8, 9, 10, 11, 12, - 11, 12, 13, + 11, 13, 12, 12, 13, 14 }; + dp::IndexStorage indexes(move(indexesRaw)); BatcherExpectations expectations; - // @TODO Avoid std::bind overload compile error in the better way - void (Batcher::*fn)(GLState const &, RefPointer, uint8_t) = &Batcher::InsertListOfStrip; - expectations.RunTest(data, indexes, VERTEX_COUNT, 3, INDEX_COUNT, bind(fn, _1, _2, _3, 5)); + auto fn = [](Batcher * batcher, GLState const & state, ref_ptr p) + { + batcher->InsertListOfStrip(state, p, 5); + }; + expectations.RunTest(data, indexes.GetRaw(), VERTEX_COUNT, 3, INDEX_COUNT, fn); } UNIT_TEST(BatchListOfStript_6stride) @@ -202,24 +202,27 @@ UNIT_TEST(BatchListOfStript_6stride) for (int i = 0; i < VERTEX_COUNT * 3; ++i) data[i] = (float)i; - unsigned short indexes[INDEX_COUNT] = + vector indexesRaw = { 0, 1, 2, - 1, 2, 3, + 1, 3, 2, 2, 3, 4, - 3, 4, 5, + 3, 5, 4, 6, 7, 8, - 7, 8, 9, + 7, 9, 8, 8, 9, 10, - 9, 10, 11, + 9, 11, 10, 12, 13, 14, - 13, 14, 15, + 13, 15, 14, 14, 15, 16, - 15, 16, 17}; + 15, 17, 16}; + dp::IndexStorage indexes(move(indexesRaw)); BatcherExpectations expectations; - // @TODO Avoid std::bind overload compile error in the better way - void (Batcher::*fn)(GLState const &, RefPointer, uint8_t) = &Batcher::InsertListOfStrip; - expectations.RunTest(data, indexes, VERTEX_COUNT, 3, INDEX_COUNT, bind(fn, _1, _2, _3, 6)); + auto fn = [](Batcher * batcher, GLState const & state, ref_ptr p) + { + batcher->InsertListOfStrip(state, p, 6); + }; + expectations.RunTest(data, indexes.GetRaw(), VERTEX_COUNT, 3, INDEX_COUNT, fn); } namespace @@ -265,30 +268,26 @@ namespace currentNode.m_indexBufferID = m_bufferIDCounter++; currentNode.m_vertexBufferID = m_bufferIDCounter++; - // Index buffer creation - EXPECTGL(glGenBuffer()).WillOnce(Return(currentNode.m_indexBufferID)); - EXPECTGL(glBindBuffer(currentNode.m_indexBufferID, gl_const::GLElementArrayBuffer)); - EXPECTGL(glBufferData(gl_const::GLElementArrayBuffer, _, NULL, _)); - - m_comparators.push_back(new MemoryComparer(currentNode.m_indexData, currentNode.m_indexByteCount)); - MemoryComparer * indexComparer = m_comparators.back(); - // upload indexes - EXPECTGL(glBindBuffer(currentNode.m_indexBufferID, gl_const::GLElementArrayBuffer)); - EXPECTGL(glBufferSubData(gl_const::GLElementArrayBuffer, currentNode.m_indexByteCount, _, 0)) - .WillOnce(Invoke(indexComparer, &MemoryComparer::cmpSubBuffer)); - // data buffer creation EXPECTGL(glGenBuffer()).WillOnce(Return(currentNode.m_vertexBufferID)); EXPECTGL(glBindBuffer(currentNode.m_vertexBufferID, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferData(gl_const::GLArrayBuffer, _, NULL, _)); m_comparators.push_back(new MemoryComparer(currentNode.m_vertexData, currentNode.m_vertexByteCount)); MemoryComparer * vertexComparer = m_comparators.back(); - // upload data - EXPECTGL(glBindBuffer(currentNode.m_vertexBufferID, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferSubData(gl_const::GLArrayBuffer, currentNode.m_vertexByteCount, _, 0)) + + EXPECTGL(glBufferData(gl_const::GLArrayBuffer, currentNode.m_vertexByteCount, _, gl_const::GLDynamicDraw)) .WillOnce(Invoke(vertexComparer, &MemoryComparer::cmpSubBuffer)); + // Index buffer creation + EXPECTGL(glGenBuffer()).WillOnce(Return(currentNode.m_indexBufferID)); + EXPECTGL(glBindBuffer(currentNode.m_indexBufferID, gl_const::GLElementArrayBuffer)); + + m_comparators.push_back(new MemoryComparer(currentNode.m_indexData, currentNode.m_indexByteCount)); + MemoryComparer * indexComparer = m_comparators.back(); + + EXPECTGL(glBufferData(gl_const::GLElementArrayBuffer, currentNode.m_indexByteCount, _, gl_const::GLDynamicDraw)) + .WillOnce(Invoke(indexComparer, &MemoryComparer::cmpSubBuffer)); + EXPECTGL(glBindBuffer(0, gl_const::GLElementArrayBuffer)); EXPECTGL(glBindBuffer(0, gl_const::GLArrayBuffer)); } @@ -328,23 +327,24 @@ UNIT_TEST(BatchListOfStript_partial) for (uint32_t i = 0; i < VertexArraySize; ++i) vertexData[i] = (float)i; - uint16_t indexData[IndexCount] = + vector indexDataRaw = { 0, 1, 2, - 1, 2, 3, + 1, 3, 2, 4, 5, 6, - 5, 6, 7, + 5, 7, 6, 8, 9, 10, - 9, 10, 11, + 9, 11, 10, 0, 1, 2, // start new buffer - 1, 2, 3}; + 1, 3, 2}; + dp::IndexStorage indexData(move(indexDataRaw)); - PartialBatcherTest::BufferNode node1(FirstBufferIndexPortion * sizeof(uint16_t), + PartialBatcherTest::BufferNode node1(FirstBufferIndexPortion * dp::IndexStorage::SizeOfIndex(), FirstBufferVertexPortion * ComponentCount * sizeof(float), - indexData, vertexData); + indexData.GetRaw(), vertexData); - PartialBatcherTest::BufferNode node2(SecondBufferIndexPortion * sizeof(uint16_t), + PartialBatcherTest::BufferNode node2(SecondBufferIndexPortion * dp::IndexStorage::SizeOfIndex(), SecondBufferVertexPortion * ComponentCount * sizeof(float), - indexData + FirstBufferIndexPortion, + indexData.GetRaw(FirstBufferIndexPortion), vertexData + FirstBufferVertexPortion * ComponentCount); typedef pair IndexVertexCount; @@ -373,15 +373,15 @@ UNIT_TEST(BatchListOfStript_partial) decl.m_stride = 0; AttributeProvider provider(1, VertexCount); - provider.InitStream(0, binding, MakeStackRefPointer(vertexData)); + provider.InitStream(0, binding, make_ref(vertexData)); VAOAcceptor vaoAcceptor; Batcher batcher(srcData[i].first, srcData[i].second); batcher.StartSession(bind(&VAOAcceptor::FlushFullBucket, &vaoAcceptor, _1, _2)); - batcher.InsertListOfStrip(state, MakeStackRefPointer(&provider), 4); + batcher.InsertListOfStrip(state, make_ref(&provider), 4); batcher.EndSession(); for (size_t i = 0; i < vaoAcceptor.m_vao.size(); ++i) - vaoAcceptor.m_vao[i].Destroy(); + vaoAcceptor.m_vao[i].reset(); } } diff --git a/drape/drape_tests/buffer_tests.cpp b/drape/drape_tests/buffer_tests.cpp index 116c4d7a3d..1cc91da836 100644 --- a/drape/drape_tests/buffer_tests.cpp +++ b/drape/drape_tests/buffer_tests.cpp @@ -2,31 +2,34 @@ #include "drape/drape_tests/glmock_functions.hpp" -#include "drape/gpu_buffer.hpp" #include "drape/data_buffer.hpp" +#include "drape/gpu_buffer.hpp" #include "drape/index_buffer.hpp" +#include "drape/index_storage.hpp" #include "std/cstdlib.hpp" +#include "std/unique_ptr.hpp" #include using namespace emul; -using ::testing::_; -using ::testing::Return; -using ::testing::InSequence; using namespace dp; +using ::testing::_; +using ::testing::InSequence; +using ::testing::Return; + UNIT_TEST(CreateDestroyDataBufferTest) { InSequence s; EXPECTGL(glGenBuffer()).WillOnce(Return(1)); EXPECTGL(glBindBuffer(1, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferData(gl_const::GLArrayBuffer, 3 * 100 * sizeof(float), NULL, gl_const::GLStaticDraw)); + EXPECTGL(glBufferData(gl_const::GLArrayBuffer, 3 * 100 * sizeof(float), NULL, gl_const::GLDynamicDraw)); EXPECTGL(glBindBuffer(0, gl_const::GLArrayBuffer)); EXPECTGL(glDeleteBuffer(1)); - GPUBuffer * buffer = new DataBuffer(3 * sizeof(float), 100); - delete buffer; + unique_ptr buffer(new DataBuffer(3 * sizeof(float), 100)); + buffer->MoveToGPU(GPUBuffer::ElementBuffer); } UNIT_TEST(CreateDestroyIndexBufferTest) @@ -34,12 +37,12 @@ UNIT_TEST(CreateDestroyIndexBufferTest) InSequence s; EXPECTGL(glGenBuffer()).WillOnce(Return(1)); EXPECTGL(glBindBuffer(1, gl_const::GLElementArrayBuffer)); - EXPECTGL(glBufferData(gl_const::GLElementArrayBuffer, 100 * sizeof(uint16_t), NULL, gl_const::GLStaticDraw)); + EXPECTGL(glBufferData(gl_const::GLElementArrayBuffer, 100 * dp::IndexStorage::SizeOfIndex(), NULL, gl_const::GLDynamicDraw)); EXPECTGL(glBindBuffer(0, gl_const::GLElementArrayBuffer)); EXPECTGL(glDeleteBuffer(1)); - GPUBuffer * buffer = new IndexBuffer(100); - delete buffer; + unique_ptr buffer(new IndexBuffer(100)); + buffer->MoveToGPU(GPUBuffer::IndexBuffer); } UNIT_TEST(UploadDataTest) @@ -48,18 +51,17 @@ UNIT_TEST(UploadDataTest) for (int i = 0; i < 3 * 100; ++i) data[i] = (float)i; + unique_ptr buffer(new DataBuffer(3 * sizeof(float), 100)); + InSequence s; EXPECTGL(glGenBuffer()).WillOnce(Return(1)); EXPECTGL(glBindBuffer(1, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferData(gl_const::GLArrayBuffer, 3 * 100 * sizeof(float), NULL, gl_const::GLStaticDraw)); - EXPECTGL(glBindBuffer(1, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferSubData(gl_const::GLArrayBuffer, 3 * 100 * sizeof(float), data, 0)); + EXPECTGL(glBufferData(gl_const::GLArrayBuffer, 3 * 100 * sizeof(float), buffer->GetBuffer()->Data(), gl_const::GLDynamicDraw)); EXPECTGL(glBindBuffer(0, gl_const::GLArrayBuffer)); EXPECTGL(glDeleteBuffer(1)); - GPUBuffer * buffer = new GPUBuffer(GPUBuffer::ElementBuffer, 3 * sizeof(float), 100); - buffer->UploadData(data, 100); - delete buffer; + buffer->GetBuffer()->UploadData(data, 100); + buffer->MoveToGPU(GPUBuffer::ElementBuffer); } UNIT_TEST(ParticalUploadDataTest) @@ -74,31 +76,28 @@ UNIT_TEST(ParticalUploadDataTest) for (int i = 0; i < kPart2Size; ++i) part2Data[i] = (float)i; + unique_ptr buffer(new DataBuffer(3 * sizeof(float), 100)); + InSequence s; EXPECTGL(glGenBuffer()).WillOnce(Return(1)); EXPECTGL(glBindBuffer(1, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferData(gl_const::GLArrayBuffer, 3 * 100 * sizeof(float), NULL, gl_const::GLStaticDraw)); - EXPECTGL(glBindBuffer(1, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferSubData(gl_const::GLArrayBuffer, 3 * 30 * sizeof(float), part1Data, 0)); - EXPECTGL(glBindBuffer(1, gl_const::GLArrayBuffer)); - EXPECTGL(glBufferSubData(gl_const::GLArrayBuffer, 3 * 70 * sizeof(float), part2Data, 3 * 30 * sizeof(float))); + EXPECTGL(glBufferData(gl_const::GLArrayBuffer, 3 * 100 * sizeof(float), buffer->GetBuffer()->Data(), gl_const::GLDynamicDraw)); EXPECTGL(glBindBuffer(0, gl_const::GLArrayBuffer)); EXPECTGL(glDeleteBuffer(1)); - GPUBuffer * buffer = new GPUBuffer(GPUBuffer::ElementBuffer, 3 * sizeof(float), 100); - TEST_EQUAL(buffer->GetCapacity(), 100, ()); - TEST_EQUAL(buffer->GetAvailableSize(), 100, ()); - TEST_EQUAL(buffer->GetCurrentSize(), 0, ()); + TEST_EQUAL(buffer->GetBuffer()->GetCapacity(), 100, ()); + TEST_EQUAL(buffer->GetBuffer()->GetAvailableSize(), 100, ()); + TEST_EQUAL(buffer->GetBuffer()->GetCurrentSize(), 0, ()); - buffer->UploadData(part1Data, 30); - TEST_EQUAL(buffer->GetCapacity(), 100, ()); - TEST_EQUAL(buffer->GetAvailableSize(), 70, ()); - TEST_EQUAL(buffer->GetCurrentSize(), 30, ()); + buffer->GetBuffer()->UploadData(part1Data, 30); + TEST_EQUAL(buffer->GetBuffer()->GetCapacity(), 100, ()); + TEST_EQUAL(buffer->GetBuffer()->GetAvailableSize(), 70, ()); + TEST_EQUAL(buffer->GetBuffer()->GetCurrentSize(), 30, ()); - buffer->UploadData(part2Data , 70); - TEST_EQUAL(buffer->GetCapacity(), 100, ()); - TEST_EQUAL(buffer->GetAvailableSize(), 0, ()); - TEST_EQUAL(buffer->GetCurrentSize(), 100, ()); + buffer->GetBuffer()->UploadData(part2Data, 70); + TEST_EQUAL(buffer->GetBuffer()->GetCapacity(), 100, ()); + TEST_EQUAL(buffer->GetBuffer()->GetAvailableSize(), 0, ()); + TEST_EQUAL(buffer->GetBuffer()->GetCurrentSize(), 100, ()); - delete buffer; + buffer->MoveToGPU(GPUBuffer::ElementBuffer); } diff --git a/drape/drape_tests/compile_shaders_test.cpp b/drape/drape_tests/compile_shaders_test.cpp index 2962581d73..9ab527df19 100644 --- a/drape/drape_tests/compile_shaders_test.cpp +++ b/drape/drape_tests/compile_shaders_test.cpp @@ -109,6 +109,7 @@ void ForEachShader(vector const & shaders, { QTemporaryFile srcFile; TEST(srcFile.open(), ("Temporary File can't be created!")); + //srcFile.setAutoRemove(false); WriteShaderToFile(srcFile, src); RunShaderTest(glslCompiler, srcFile.fileName(), procPrepare, argsPrepare, successComparator, errorLog); @@ -188,7 +189,7 @@ void TestMaliShaders(QString const & driver, shaderType = "-f"; ForEachShader(gpu::FragmentEnum, compilerPath, procPrepare, argForming, succesComparator, ss); - TEST(errorLog.isEmpty(), (errorLog)); + TEST(errorLog.isEmpty(), (shaderType,release, hardware, driver, errorLog)); } UNIT_TEST(MALI_CompileShaders_Test) diff --git a/drape/drape_tests/drape_tests.pro b/drape/drape_tests/drape_tests.pro index e71a26affa..787e9d161d 100644 --- a/drape/drape_tests/drape_tests.pro +++ b/drape/drape_tests/drape_tests.pro @@ -4,7 +4,7 @@ CONFIG -= app_bundle TEMPLATE = app DEFINES += OGL_TEST_ENABLED GTEST_DONT_DEFINE_TEST COMPILER_TESTS -DEPENDENCIES = qt_tstfrm platform coding base gmock freetype expat tomcrypt +DEPENDENCIES = qt_tstfrm platform coding base gmock freetype fribidi expat tomcrypt ROOT_DIR = ../.. SHADER_COMPILE_ARGS = $$PWD/../shaders shader_index.txt shader_def include($$ROOT_DIR/common.pri) @@ -19,26 +19,27 @@ INCLUDEPATH *= $$ROOT_DIR/3party/gmock/include $$ROOT_DIR/3party/gmock/gtest/inc macx-* : LIBS *= "-framework CoreLocation" SOURCES += \ - glfunctions.cpp \ - testingmain.cpp \ - failure_reporter.cpp \ - glmock_functions.cpp \ - buffer_tests.cpp \ - uniform_value_tests.cpp \ attribute_provides_tests.cpp \ - compile_shaders_test.cpp \ batcher_tests.cpp \ - pointers_tests.cpp \ bingind_info_tests.cpp \ - stipple_pen_tests.cpp \ - texture_of_colors_tests.cpp \ + buffer_tests.cpp \ + compile_shaders_test.cpp \ + failure_reporter.cpp \ + font_texture_tests.cpp \ + fribidi_tests.cpp \ + glfunctions.cpp \ + glmock_functions.cpp \ glyph_mng_tests.cpp \ glyph_packer_test.cpp \ - font_texture_tests.cpp \ img.cpp \ + pointers_tests.cpp \ + stipple_pen_tests.cpp \ + testingmain.cpp \ + texture_of_colors_tests.cpp \ + uniform_value_tests.cpp \ HEADERS += \ - glmock_functions.hpp \ - memory_comparer.hpp \ - img.hpp \ dummy_texture.hpp \ + glmock_functions.hpp \ + img.hpp \ + memory_comparer.hpp \ diff --git a/drape/drape_tests/dummy_texture.hpp b/drape/drape_tests/dummy_texture.hpp index 50ab40df2f..4d2095bae4 100644 --- a/drape/drape_tests/dummy_texture.hpp +++ b/drape/drape_tests/dummy_texture.hpp @@ -6,8 +6,14 @@ class DummyTexture : public dp::Texture { public: - virtual dp::RefPointer FindResource(Key const & /*key*/) const + ref_ptr FindResource(Key const & key) { - return dp::RefPointer(); + bool dummy = false; + return FindResource(key, dummy); + } + + virtual ref_ptr FindResource(Key const & /*key*/, bool & /*newResource*/) + { + return nullptr; } }; diff --git a/drape/drape_tests/font_texture_tests.cpp b/drape/drape_tests/font_texture_tests.cpp index c60f4c502c..f397397b43 100644 --- a/drape/drape_tests/font_texture_tests.cpp +++ b/drape/drape_tests/font_texture_tests.cpp @@ -58,10 +58,28 @@ namespace QPoint m_pen; QVector > m_images; }; + + class DummyGlyphIndex : public GlyphIndex + { + typedef GlyphIndex TBase; + public: + DummyGlyphIndex(m2::PointU size, ref_ptr mng) + : TBase(size, mng) + { + } + + ref_ptr MapResource(GlyphKey const & key) + { + bool dummy = false; + return TBase::MapResource(key, dummy); + } + }; } UNIT_TEST(UploadingGlyphs) { + // This unit test creates window so can't be run in GUI-less Linux machine. +#ifndef OMIM_OS_LINUX EXPECTGL(glHasExtension(_)).Times(AnyNumber()); EXPECTGL(glBindTexture(_)).Times(AnyNumber()); EXPECTGL(glDeleteTexture(_)).Times(AnyNumber()); @@ -77,15 +95,21 @@ UNIT_TEST(UploadingGlyphs) GetPlatform().GetFontNames(args.m_fonts); GlyphManager mng(args); - GlyphIndex index(m2::PointU(64, 64), MakeStackRefPointer(&mng)); + DummyGlyphIndex index(m2::PointU(64, 64), make_ref(&mng)); index.MapResource(GlyphKey(0x58)); index.MapResource(GlyphKey(0x59)); index.MapResource(GlyphKey(0x61)); + while(index.HasAsyncRoutines()); + + Texture::Params p; + p.m_allocator = GetDefaultAllocator(); + p.m_format = dp::ALPHA; + p.m_width = p.m_height = 64; DummyTexture tex; - tex.Create(64, 64, dp::ALPHA, MakeStackRefPointer(nullptr)); + tex.Create(p); EXPECTGL(glTexSubImage2D(_, _, _, _, _, _, _)).WillOnce(Invoke(&r, &UploadedRender::glMemoryToQImage)); - index.UploadResources(MakeStackRefPointer(&tex)); + index.UploadResources(make_ref(&tex)); index.MapResource(GlyphKey(0x68)); index.MapResource(GlyphKey(0x30)); @@ -93,9 +117,12 @@ UNIT_TEST(UploadingGlyphs) index.MapResource(GlyphKey(0x65)); index.MapResource(GlyphKey(0x400)); index.MapResource(GlyphKey(0x401)); + while(index.HasAsyncRoutines()); + EXPECTGL(glTexSubImage2D(_, _, _, _, _, _, _)).WillOnce(Invoke(&r, &UploadedRender::glMemoryToQImage)) .WillOnce(Invoke(&r, &UploadedRender::glMemoryToQImage)); - index.UploadResources(MakeStackRefPointer(&tex)); + index.UploadResources(make_ref(&tex)); RunTestLoop("UploadingGlyphs", bind(&UploadedRender::Render, &r, _1)); +#endif } diff --git a/drape_frontend/drape_frontend_tests/fribidi_tests.cpp b/drape/drape_tests/fribidi_tests.cpp similarity index 91% rename from drape_frontend/drape_frontend_tests/fribidi_tests.cpp rename to drape/drape_tests/fribidi_tests.cpp index ac3e2a9464..4dd39af892 100644 --- a/drape_frontend/drape_frontend_tests/fribidi_tests.cpp +++ b/drape/drape_tests/fribidi_tests.cpp @@ -1,7 +1,8 @@ #include "base/SRC_FIRST.hpp" #include "testing/testing.hpp" -#include "drape_frontend/fribidi.hpp" +#include "drape/fribidi.hpp" + UNIT_TEST(FribidiDirection) { diff --git a/drape/drape_tests/glfunctions.cpp b/drape/drape_tests/glfunctions.cpp index 13ae00e13c..ed968b2ecb 100644 --- a/drape/drape_tests/glfunctions.cpp +++ b/drape/drape_tests/glfunctions.cpp @@ -239,9 +239,8 @@ int32_t GLFunctions::glGetInteger(glConst pname) return MOCK_CALL(glGetInteger(pname)); } -void CheckGLError() {} +void CheckGLError(my::SrcPoint const & /*srcPt*/) {} -// @TODO add actual unit tests void GLFunctions::glEnable(glConst mode) {} void GLFunctions::glBlendEquation(glConst function) {} @@ -256,6 +255,13 @@ void * GLFunctions::glMapBuffer(glConst target) { return 0; } void GLFunctions::glUnmapBuffer(glConst target) {} -void GLFunctions::glDrawElements(uint16_t indexCount) {} +void GLFunctions::glDrawElements(uint32_t sizeOfIndex, uint32_t indexCount, uint32_t startIndex) {} + +void GLFunctions::glDrawArrays(glConst mode, int32_t first, uint32_t count) {} void GLFunctions::glPixelStore(glConst name, uint32_t value) {} + +int32_t GLFunctions::glGetBufferParameter(glConst target, glConst name) +{ + return MOCK_CALL(glGetBufferParameter(target, name)); +} diff --git a/drape/drape_tests/glmock_functions.hpp b/drape/drape_tests/glmock_functions.hpp index b4442a9c44..c02e94adee 100644 --- a/drape/drape_tests/glmock_functions.hpp +++ b/drape/drape_tests/glmock_functions.hpp @@ -27,6 +27,7 @@ public: MOCK_METHOD1(glDeleteBuffer, void(uint32_t vbo)); MOCK_METHOD4(glBufferData, void(glConst target, uint32_t size, void const * data, glConst usage)); MOCK_METHOD4(glBufferSubData, void(glConst target, uint32_t size, void const * data, uint32_t offset)); + MOCK_METHOD2(glGetBufferParameter, int32_t(glConst target, glConst name)); MOCK_METHOD2(glGetUniformLocation, int8_t(uint32_t programID, string const & name)); MOCK_METHOD2(glUniformValuei, void(int8_t location, int32_t v)); diff --git a/drape/drape_tests/glyph_mng_tests.cpp b/drape/drape_tests/glyph_mng_tests.cpp index d976529d40..326750e25d 100644 --- a/drape/drape_tests/glyph_mng_tests.cpp +++ b/drape/drape_tests/glyph_mng_tests.cpp @@ -37,9 +37,16 @@ namespace void RenderGlyphs(QPaintDevice * device) { vector glyphs; - glyphs.push_back(m_mng->GetGlyph(0xC0)); - glyphs.push_back(m_mng->GetGlyph(0x79)); - glyphs.push_back(m_mng->GetGlyph(0x122)); + auto generateGlyph = [this, &glyphs](strings::UniChar c) + { + dp::GlyphManager::Glyph g = m_mng->GetGlyph(c); + glyphs.push_back(m_mng->GenerateGlyph(g)); + g.m_image.Destroy(); + }; + + generateGlyph(0xC0); + generateGlyph(0x79); + generateGlyph(0x122); QPainter painter(device); painter.fillRect(QRectF(0.0, 0.0, device->width(), device->height()), Qt::white); @@ -70,6 +77,9 @@ namespace UNIT_TEST(GlyphLoadingTest) { + // This unit test creates window so can't be run in GUI-less Linux machine. +#ifndef OMIM_OS_LINUX GlyphRenderer renderer; RunTestLoop("GlyphLoadingTest", bind(&GlyphRenderer::RenderGlyphs, &renderer, _1)); +#endif } diff --git a/drape/drape_tests/pointers_tests.cpp b/drape/drape_tests/pointers_tests.cpp index 6fe1b527ff..5b43a9a384 100644 --- a/drape/drape_tests/pointers_tests.cpp +++ b/drape/drape_tests/pointers_tests.cpp @@ -1,367 +1,97 @@ #include "testing/testing.hpp" - #include "drape/pointers.hpp" -#include "base/assert.hpp" +#include "base/base.hpp" +#include "std/algorithm.hpp" #include "std/string.hpp" -#include "std/shared_ptr.hpp" - -#include - -using ::testing::_; -using ::testing::MatcherInterface; -using ::testing::MatchResultListener; -using ::testing::Matcher; - -using my::SrcPoint; -using namespace dp; namespace { - -template -void EmptyFunction(RefPointer p){} - -template -void EmptyFunction(TransferPointer p, ToDo & toDo) -{ - toDo(p); -} - -template -void PointerDeleter(TransferPointer p) -{ - p.Destroy(); -} - -#ifdef DEBUG -#ifdef CHECK_POINTERS -class MockAssertExpector -{ -public: - MOCK_CONST_METHOD2(Assert, void(SrcPoint const &, string const &)); -}; - -MockAssertExpector * g_asserter; -my::AssertFailedFn m_defaultAssertFn; -void MyOnAssertFailed(SrcPoint const & src, string const & msg) -{ - g_asserter->Assert(src, msg); -} - -MockAssertExpector * InitAsserter() -{ - if (g_asserter != NULL) - delete g_asserter; - - g_asserter = new MockAssertExpector(); - - m_defaultAssertFn = my::SetAssertFunction(&MyOnAssertFailed); - - return g_asserter; -} - -void DestroyAsserter() -{ - my::SetAssertFunction(m_defaultAssertFn); - delete g_asserter; - g_asserter = NULL; -} -#endif - -SrcPoint ConstructSrcPoint(char const * fileName, char const * function) -{ -#ifndef __OBJC__ - return SrcPoint(fileName, 0, function, "()"); -#else - return SrcPoint(fileName, 0, function); -#endif -} -#endif - -} // namespace - -#ifdef DEBUG - -class SrcPointMatcher : public MatcherInterface -{ -public: - SrcPointMatcher(char const * fileName, char const * function) - : m_srcPoint(ConstructSrcPoint(fileName, function)) + class Tester { - } + public: + Tester() = default; + }; - virtual bool MatchAndExplain(SrcPoint const & x, MatchResultListener * listener) const +#if defined(TRACK_POINTERS) + bool g_assertRaised = false; + void OnAssertRaised(my::SrcPoint const & /*srcPoint*/, string const & /*msg*/) { - bool res = strcmp(x.FileName(), m_srcPoint.FileName()) == 0 && - strcmp(x.Function(), m_srcPoint.Function()) == 0; - - if (res == false) - (*listener) << "Actual parameter : " << DebugPrint(x); - - return res; - } - - virtual void DescribeTo(::std::ostream * os) const - { - *os << "Expected assert : " << DebugPrint(m_srcPoint); - } - - virtual void DescribeNegationTo(::std::ostream * os) const - { - *os << "Unexpected assert. Expect this : " << DebugPrint(m_srcPoint); - } - -private: - SrcPoint m_srcPoint; -}; - -inline Matcher SrcPointEq(char const * fileName, char const * function) -{ - return ::testing::MakeMatcher(new SrcPointMatcher(fileName, function)); -} - -#endif - -UNIT_TEST(RefPointer_Positive) -{ - MasterPointer p(new int); - RefPointer refP = p.GetRefPointer(); - - TEST_EQUAL(p.IsNull(), false, ()); - TEST_EQUAL(p.GetRaw(), refP.GetRaw(), ()); - - RefPointer refP2(refP); - - TEST_EQUAL(p.IsNull(), false, ()); - TEST_EQUAL(p.GetRaw(), refP.GetRaw(), ()); - TEST_EQUAL(refP2.GetRaw(), refP.GetRaw(), ()); - - *refP.GetRaw() = 10; - - EmptyFunction(refP); - TEST_EQUAL(p.IsNull(), false, ()); - TEST_EQUAL(p.GetRaw(), refP.GetRaw(), ()); - TEST_EQUAL(refP2.GetRaw(), refP.GetRaw(), ()); - - EmptyFunction(refP2); - TEST_EQUAL(p.IsNull(), false, ()); - TEST_EQUAL(p.GetRaw(), refP.GetRaw(), ()); - TEST_EQUAL(refP2.GetRaw(), refP.GetRaw(), ()); - - refP2 = refP = RefPointer(); - - TEST_EQUAL(p.IsNull(), false, ()); - TEST_EQUAL(refP.IsNull(), true, ()); - TEST_EQUAL(refP2.GetRaw(), refP.GetRaw(), ()); - - p.Destroy(); - TEST_EQUAL(p.IsNull(), true, ()); -} - -#if defined(CHECK_POINTERS) - UNIT_TEST(MasterPointerDestroy_Negative) - { - MockAssertExpector * asserter = InitAsserter(); - - EXPECT_CALL(*asserter, Assert(SrcPointEq("drape/pointers.cpp", "Destroy"), _)).Times(1); - - MasterPointer p(new int); - RefPointer refP(p.GetRefPointer()); - p.Destroy(); - - DestroyAsserter(); - } - - UNIT_TEST(MasterPointer_Leak) - { - MockAssertExpector * asserter = InitAsserter(); - - ::testing::InSequence s; - - EXPECT_CALL(*asserter, Assert(SrcPointEq("drape/pointers.cpp", "Deref"), _)); - - { - MasterPointer p(new int); - } - - DestroyAsserter(); + g_assertRaised = true; } #endif - -UNIT_TEST(TransferPointerConvertion_Positive) -{ - MasterPointer p(new int); - TEST_EQUAL(p.IsNull(), false, ()); - - int * rawP = p.GetRaw(); - - TransferPointer trP = p.Move(); - TEST_EQUAL(p.IsNull(), true, ()); - TEST_EQUAL(trP.IsNull(), false, ()); - - MasterPointer p2(trP); - TEST_EQUAL(p.IsNull(), true, ()); - TEST_EQUAL(trP.IsNull(), true, ()); - TEST_EQUAL(p2.GetRaw(), rawP, ()); - - p2.Destroy(); } -UNIT_TEST(TransferPointer_Positive) +UNIT_TEST(PointersTrackingTest) { - MasterPointer p(new int); - TEST_EQUAL(p.IsNull(), false, ()); +#if defined(TRACK_POINTERS) - TransferPointer trP = p.Move(); - TEST_EQUAL(p.IsNull(), true, ()); - TEST_EQUAL(trP.IsNull(), false, ()); - PointerDeleter(trP); -} + DpPointerTracker::TAlivePointers const & alivePointers = DpPointerTracker::Instance().GetAlivePointers(); -namespace -{ + drape_ptr ptr = make_unique_dp(); + void * ptrAddress = ptr.get(); + string const ptrTypeName = typeid(Tester*).name(); -template -struct MasterPointerAccum -{ -public: - MasterPointer m_p; + // no references + TEST(alivePointers.find(ptrAddress) == alivePointers.end(), ()); - void operator() (TransferPointer p) + // create a reference + ref_ptr refPtr = make_ref(ptr); + + DpPointerTracker::TAlivePointers::const_iterator found = alivePointers.find(ptrAddress); + TEST(found != alivePointers.end(), ()); + TEST_EQUAL(found->second.first, 1, ()); + TEST_EQUAL(found->second.second, ptrTypeName, ()); + + // copy reference + ref_ptr refPtr2 = refPtr; + + found = alivePointers.find(ptrAddress); + TEST_EQUAL(found->second.first, 2, ()); + + // remove reference { - TEST_EQUAL(p.IsNull(), false, ()); - m_p = MasterPointer(p); - TEST_EQUAL(p.IsNull(), true, ()); + ref_ptr refPtrInScope = refPtr2; + TEST_EQUAL(found->second.first, 3, ()); } -}; + TEST_EQUAL(found->second.first, 2, ()); -} // namespace + // move reference + ref_ptr refPtr3 = move(refPtr2); + TEST_EQUAL(found->second.first, 2, ()); -UNIT_TEST(TransferPointerConvertion2_Positive) -{ - MasterPointer p(new int); - TEST_EQUAL(p.IsNull(), false, ()); + // assign reference + ref_ptr refPtr4; + refPtr4 = refPtr3; + TEST_EQUAL(found->second.first, 3, ()); - int * rawP = p.GetRaw(); + // move-assign reference + refPtr4 = move(refPtr3); + TEST_EQUAL(found->second.first, 2, ()); - MasterPointerAccum accum; - EmptyFunction(p.Move(), accum); - TEST_EQUAL(p.IsNull(), true, ()); - TEST_EQUAL(accum.m_p.GetRaw(), rawP, ()); - - accum.m_p.Destroy(); -} - -#if defined(CHECK_POINTERS) - -namespace -{ - -template -struct EmptyTransferAccepter -{ -public: - void operator() (TransferPointer p) - { - TEST_EQUAL(p.IsNull(), false, ()); - TransferPointer p2(p); - TEST_EQUAL(p.IsNull(), true, ()); - TEST_EQUAL(p2.IsNull(), false, ()); - } -}; - -} - -UNIT_TEST(TransferPointer_Leak) -{ - MockAssertExpector * asserter = InitAsserter(); - MasterPointer p(new int); - TEST_EQUAL(p.IsNull(), false, ()); - - EXPECT_CALL(*asserter, Assert(SrcPointEq("drape/pointers.hpp", "~TransferPointer"), _)); - - EmptyTransferAccepter toDo; - EmptyFunction(p.Move(), toDo); - TEST_EQUAL(p.IsNull(), true, ()); - - DestroyAsserter(); -} - -UNIT_TEST(PointerConversionAndLeak) -{ - MockAssertExpector * asserter = InitAsserter(); - - EXPECT_CALL(*asserter, Assert(SrcPointEq("drape/pointers.cpp", "Deref"), _)); - - { - MasterPointer p(new int); - TEST_EQUAL(p.IsNull(), false, ()); - - int * rawP = p.GetRaw(); - - MasterPointerAccum accum; - EmptyFunction(p.Move(), accum); - TEST_EQUAL(p.IsNull(), true, ()); - TEST_EQUAL(accum.m_p.GetRaw(), rawP, ()); - } - - DestroyAsserter(); -} + // create another reference + ref_ptr refPtr5 = make_ref(ptr); + TEST_EQUAL(found->second.first, 3, ()); #endif - -class Base -{ -public: - Base() {} - virtual ~Base() {} -}; - -class Derived : public Base -{ -public: - Derived() {} -}; - -UNIT_TEST(RefPointerCast) -{ - MasterPointer p(new Derived()); - TEST_EQUAL(p.IsNull(), false, ()); - - { - RefPointer refP(p.GetRefPointer()); - TEST_EQUAL(p.IsNull(), false, ()); - TEST_EQUAL(p.GetRaw(), refP.GetRaw(), ()); - - RefPointer refBaseP(refP); - TEST_EQUAL(p.IsNull(), false, ()); - TEST_EQUAL(p.GetRaw(), refP.GetRaw(), ()); - TEST_EQUAL(p.GetRaw(), refBaseP.GetRaw(), ()); - } - - p.Destroy(); } -UNIT_TEST(StackPointers) +UNIT_TEST(RefPointerExpiringTest) { - int data[10]; - { - RefPointer p = MakeStackRefPointer(data); - TEST_EQUAL(p.GetRaw(), data, ()); - } -} - -UNIT_TEST(MoveFreePointers) -{ - int * data = new int; - TransferPointer p = MovePointer(data); - TEST_EQUAL(p.IsNull(), false, ()); - - MasterPointer mP(p); - TEST_EQUAL(p.IsNull(), true, ()); - TEST_EQUAL(mP.GetRaw(), data, ()); - - mP.Destroy(); +#if defined(TRACK_POINTERS) + + g_assertRaised = false; + my::AssertFailedFn prevFn = my::SetAssertFunction(OnAssertRaised); + + drape_ptr ptr = make_unique_dp(); + ref_ptr refPtr1 = make_ref(ptr); + ref_ptr refPtr2 = make_ref(ptr); + ptr.reset(); + + my::SetAssertFunction(prevFn); + + TEST(g_assertRaised, ()); + +#endif } diff --git a/drape/drape_tests/stipple_pen_tests.cpp b/drape/drape_tests/stipple_pen_tests.cpp index ac8b2d4d55..22c2c57f0a 100644 --- a/drape/drape_tests/stipple_pen_tests.cpp +++ b/drape/drape_tests/stipple_pen_tests.cpp @@ -35,79 +35,36 @@ namespace my::AlmostEqualULPs(r1.maxX(), r2.maxX()) && my::AlmostEqualULPs(r1.maxY(), r2.maxY()); } + + class DummyStipplePenIndex : public StipplePenIndex + { + typedef StipplePenIndex TBase; + public: + DummyStipplePenIndex(m2::PointU const & size) + : TBase(size) + { + } + + ref_ptr MapResource(StipplePenKey const & key) + { + bool dummy = false; + return TBase::MapResource(key, dummy); + } + }; } UNIT_TEST(SimpleStipplePackTest) { - StipplePenPacker packer(m2::PointU(1024, 8)); - TestPacker(packer, 30, m2::RectU(0, 0, 32, 2)); - TestPacker(packer, 254, m2::RectU(0, 2, 256, 4)); - TestPacker(packer, 1, m2::RectU(0, 4, 3, 6)); - TestPacker(packer, 250, m2::RectU(0, 6, 252, 8)); - TestPacker(packer, 249, m2::RectU(256, 0, 507, 2)); + StipplePenPacker packer(m2::PointU(512, 8)); + TestPacker(packer, 30, m2::RectU(0, 0, 30, 1)); + TestPacker(packer, 254, m2::RectU(0, 1, 254, 2)); + TestPacker(packer, 1, m2::RectU(0, 2, 1, 3)); + TestPacker(packer, 250, m2::RectU(0, 3, 250, 4)); + TestPacker(packer, 249, m2::RectU(0, 4, 249, 5)); - m2::RectF mapped = packer.MapTextureCoords(m2::RectU(0, 2, 256, 4)); - TEST(IsRectsEqual(mapped, m2::RectF(1.0f / 1024.0f, 3.0f / 8.0f, - 255.0f / 1024.0f, 3.0f / 8.0f)), ()); -} - -UNIT_TEST(SimpleStippleTest) -{ - StipplePenKey info; - info.m_pattern.push_back(12); - info.m_pattern.push_back(12); - info.m_pattern.push_back(8); - info.m_pattern.push_back(9); - - StipplePenRasterizator res(info); - TEST_EQUAL(res.GetSize(), 246, ()); - TEST_EQUAL(res.GetBufferSize(), 246, ()); - - uint8_t buffer[256 * 2]; - memset(buffer, 127, ARRAY_SIZE(buffer) * sizeof(uint8_t)); - res.Rasterize(buffer); - - typedef pair TRange; - typedef pair TCheckNode; - - TCheckNode nodes[] = - { - make_pair(make_pair(0, 13), 255), - make_pair(make_pair(13, 25), 0), - make_pair(make_pair(25, 33), 255), - make_pair(make_pair(33, 42), 0), - make_pair(make_pair(42, 54), 255), - make_pair(make_pair(54, 66), 0), - make_pair(make_pair(66, 74), 255), - make_pair(make_pair(74, 83), 0), - make_pair(make_pair(83, 95), 255), - make_pair(make_pair(95, 107), 0), - make_pair(make_pair(107, 115), 255), - make_pair(make_pair(115, 124), 0), - make_pair(make_pair(124, 136), 255), - make_pair(make_pair(136, 148), 0), - make_pair(make_pair(148, 156), 255), - make_pair(make_pair(156, 165), 0), - make_pair(make_pair(165, 177), 255), - make_pair(make_pair(177, 189), 0), - make_pair(make_pair(189, 197), 255), - make_pair(make_pair(197, 206), 0), - make_pair(make_pair(206, 218), 255), - make_pair(make_pair(218, 230), 0), - make_pair(make_pair(230, 238), 255), - make_pair(make_pair(238, 248), 0), - make_pair(make_pair(248, 256), 127), - }; - - for (size_t i = 0; i < ARRAY_SIZE(nodes); ++i) - { - TCheckNode const & node = nodes[i]; - for (size_t r = node.first.first; r < node.first.second; ++r) - { - TEST_EQUAL(buffer[r], node.second, (r)); - TEST_EQUAL(buffer[r + 256], node.second, (r)); - } - } + m2::RectF mapped = packer.MapTextureCoords(m2::RectU(0, 0, 256, 1)); + TEST(IsRectsEqual(mapped, m2::RectF(0.5f / 512.0f, 0.5f / 8.0f, + 255.5f / 512.0f, 0.5f / 8.0f)), ()); } UNIT_TEST(SimplePatternKey) @@ -140,328 +97,3 @@ UNIT_TEST(SimplePatternKey) TEST_EQUAL(StipplePenHandle(info), StipplePenHandle(0xE2C58711FFFA74E0), ()); } } - -namespace -{ - uint8_t firstUploadEtalon[] = - { - // first pattern = [2, 2, 10, 10] -/*1*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*2*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*3*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*5*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*6*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*7*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*8*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*9*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*10*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*ep*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*1*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*2*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*3*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*5*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*6*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*7*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*8*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*9*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*10*/ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*ep*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // first pattern = [4, 4] -/*1*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*7*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*10*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*13*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*16*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*19*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*22*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*25*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*28*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*31*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -/*ep*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*1*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*7*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*10*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*13*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*16*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*19*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*22*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*25*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*28*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -/*31*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -/*ep*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*1*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*2*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*3*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*5*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*6*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*7*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*8*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*9*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*10*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*11*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*1*/ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*2*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*3*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*5*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*6*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*7*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*8*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*9*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*10*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*11*/ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - - uint8_t secondUploadFirstPartEtalon[] = - { -/*1*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*2*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*3*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*5*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*6*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 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, -/*1*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*2*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*3*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*5*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*6*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 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, - }; - - uint8_t secondUploadSecondPartEtalon[] = - { -/*1*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*2*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*3*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 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, -/*1*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*2*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*3*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/*4*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 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, - }; -} - -UNIT_TEST(StippleMappingTest) -{ - float const width = 512; - float const height = 8; - StipplePenIndex index(m2::PointU(width, height)); - - StipplePenKey info; - info.m_pattern.push_back(2); - info.m_pattern.push_back(2); - info.m_pattern.push_back(10); - info.m_pattern.push_back(10); - - RefPointer r1 = index.MapResource(info); - TEST(IsRectsEqual(r1->GetTexRect(), m2::RectF(1.0f / width, 1.0f / height, - 241.0f / width, 1.0f / height)), ()); - - RefPointer r2 = index.MapResource(info); - TEST(IsRectsEqual(r1->GetTexRect(), r2->GetTexRect()), ()); - - info.m_pattern.clear(); - info.m_pattern.push_back(4); - info.m_pattern.push_back(4); - r1 = index.MapResource(info); - TEST(IsRectsEqual(r1->GetTexRect(), m2::RectF(1.0f / width, 3.0f / height, - 249.0f / width, 3.0f / height)), ()); - - info.m_pattern.clear(); - info.m_pattern.push_back(3); - info.m_pattern.push_back(20); - r1 = index.MapResource(info); - TEST(IsRectsEqual(r1->GetTexRect(), m2::RectF(1.0f / width, 5.0f / height, - 254.0f / width, 5.0f / height)), ()); - - InSequence seq; - EXPECTGL(glHasExtension(_)).WillRepeatedly(Return(true)); - EXPECTGL(glGenTexture()).WillOnce(Return(1)); - EXPECTGL(glBindTexture(1)).WillOnce(Return()); - EXPECTGL(glTexImage2D(512, 8, AnyOf(gl_const::GLAlpha, gl_const::GLAlpha8), gl_const::GL8BitOnChannel, NULL)); - EXPECTGL(glTexParameter(gl_const::GLMinFilter, gl_const::GLLinear)); - EXPECTGL(glTexParameter(gl_const::GLMagFilter, gl_const::GLLinear)); - EXPECTGL(glTexParameter(gl_const::GLWrapS, gl_const::GLClampToEdge)); - EXPECTGL(glTexParameter(gl_const::GLWrapT, gl_const::GLClampToEdge)); - MemoryComparer cmp(firstUploadEtalon, ARRAY_SIZE(firstUploadEtalon)); - EXPECTGL(glTexSubImage2D(0, 0, 256, 6, AnyOf(gl_const::GLAlpha, gl_const::GLAlpha8), gl_const::GL8BitOnChannel, _)) - .WillOnce(Invoke(&cmp, &MemoryComparer::cmpSubImage)); - - DummyTexture texture; - texture.Create(width, height, dp::ALPHA); - index.UploadResources(MakeStackRefPointer(&texture)); - - StipplePenKey secInfo; - secInfo.m_pattern.push_back(20); - secInfo.m_pattern.push_back(20); - RefPointer r12 = index.MapResource(secInfo); - TEST(IsRectsEqual(r12->GetTexRect(), m2::RectF(1.0f / width, 7.0f / height, - 241.0f / width, 7.0f / height)), ()); - - secInfo.m_pattern.push_back(10); - secInfo.m_pattern.push_back(10); - r12 = index.MapResource(secInfo); - TEST(IsRectsEqual(r12->GetTexRect(), m2::RectF(257.0f / width, 1.0f / height, - 497.0f / width, 1.0f / height)), ()); - - MemoryComparer cmp21(secondUploadFirstPartEtalon, ARRAY_SIZE(secondUploadFirstPartEtalon)); - EXPECTGL(glTexSubImage2D(0, 6, 256, 2, AnyOf(gl_const::GLAlpha, gl_const::GLAlpha8), gl_const::GL8BitOnChannel, _)) - .WillOnce(Invoke(&cmp21, &MemoryComparer::cmpSubImage)); - - MemoryComparer cmp22(secondUploadSecondPartEtalon, ARRAY_SIZE(secondUploadSecondPartEtalon)); - EXPECTGL(glTexSubImage2D(256, 0, 256, 2, AnyOf(gl_const::GLAlpha, gl_const::GLAlpha8), gl_const::GL8BitOnChannel, _)) - .WillOnce(Invoke(&cmp22, &MemoryComparer::cmpSubImage)); - index.UploadResources(MakeStackRefPointer(&texture)); - EXPECTGL(glDeleteTexture(1)); -} diff --git a/drape/drape_tests/texture_of_colors_tests.cpp b/drape/drape_tests/texture_of_colors_tests.cpp index e784378f02..0b5f1cb2bf 100644 --- a/drape/drape_tests/texture_of_colors_tests.cpp +++ b/drape/drape_tests/texture_of_colors_tests.cpp @@ -41,19 +41,38 @@ void InitOpenGLTextures(int const w, int const h) EXPECTGL(glTexParameter(gl_const::GLMagFilter, gl_const::GLLinear)); EXPECTGL(glTexParameter(gl_const::GLWrapS, gl_const::GLClampToEdge)); EXPECTGL(glTexParameter(gl_const::GLWrapT, gl_const::GLClampToEdge)); + EXPECTGL(glBindTexture(0)).WillOnce(Return()); } + +class DummyColorPallete : public ColorPalette +{ + typedef ColorPalette TBase; +public: + DummyColorPallete(m2::PointU const & size) + : TBase(size) + { + } + + ref_ptr MapResource(ColorKey const & key) + { + bool dummy = false; + return TBase::MapResource(key, dummy); + } +}; + } UNIT_TEST(ColorPalleteMappingTests) { - ColorPalette cp(m2::PointU(32, 16)); + DummyColorPallete cp(m2::PointU(32, 16)); - RefPointer info1 = cp.MapResource(dp::Color(0, 0, 0, 0)); - RefPointer info2 = cp.MapResource(dp::Color(1, 1, 1, 1)); - RefPointer info3 = cp.MapResource(dp::Color(0, 0, 0, 0)); + ref_ptr info1 = cp.MapResource(dp::Color(0, 0, 0, 0)); + ref_ptr info2 = cp.MapResource(dp::Color(1, 1, 1, 1)); + ref_ptr info3 = cp.MapResource(dp::Color(0, 0, 0, 0)); + + TEST_NOT_EQUAL(info1, info2, ()); + TEST_EQUAL(info1, info3, ()); - TEST_NOT_EQUAL(info1.GetRaw(), info2.GetRaw(), ()); - TEST_EQUAL(info1.GetRaw(), info3.GetRaw(), ()); TestRects(info1->GetTexRect(), m2::RectF(1.0f / 32.0f, 1.0f / 16, 1.0f / 32.0f, 1.0f / 16)); TestRects(info2->GetTexRect(), m2::RectF(3.0f / 32.0f, 1.0f / 16, @@ -74,10 +93,16 @@ UNIT_TEST(ColorPalleteUploadingSingleRow) int const height = 16; InitOpenGLTextures(width, height); + Texture::Params p; + p.m_allocator = GetDefaultAllocator(); + p.m_format = dp::RGBA8; + p.m_width = width; + p.m_height = height; + DummyTexture texture; - texture.Create(width, height, dp::RGBA8); - ColorPalette cp(m2::PointU(width, height)); - cp.UploadResources(MakeStackRefPointer(&texture)); + texture.Create(p); + DummyColorPallete cp(m2::PointU(width, height)); + cp.UploadResources(make_ref(&texture)); { cp.MapResource(dp::Color(0xFF, 0, 0, 0)); @@ -88,21 +113,34 @@ UNIT_TEST(ColorPalleteUploadingSingleRow) uint8_t memoryEtalon[] = { - // 1 pixel 2 pixel 3 pixel 4 pixel - 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, - 0xAA, 0xBB, 0xCC, 0xDD, 0xAA, 0xBB, 0xCC, 0xDD, - // second row - 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, - 0xAA, 0xBB, 0xCC, 0xDD, 0xAA, 0xBB, 0xCC, 0xDD + 0xFF, 0x00, 0x00, 0x00, // 1 pixel (1st row) + 0xFF, 0x00, 0x00, 0x00, // 1 pixel (1st row) + 0x00, 0xFF, 0x00, 0x00, // 2 pixel (1st row) + 0x00, 0xFF, 0x00, 0x00, // 2 pixel (1st row) + 0x00, 0x00, 0xFF, 0x00, // 3 pixel (1st row) + 0x00, 0x00, 0xFF, 0x00, // 3 pixel (1st row) + 0x00, 0x00, 0x00, 0xFF, // 4 pixel (1st row) + 0x00, 0x00, 0x00, 0xFF, // 4 pixel (1st row) + 0xAA, 0xBB, 0xCC, 0xDD, // 5 pixel (1st row) + 0xAA, 0xBB, 0xCC, 0xDD, // 5 pixel (1st row) + + 0xFF, 0x00, 0x00, 0x00, // 1 pixel (2nd row) + 0xFF, 0x00, 0x00, 0x00, // 1 pixel (2nd row) + 0x00, 0xFF, 0x00, 0x00, // 2 pixel (2nd row) + 0x00, 0xFF, 0x00, 0x00, // 2 pixel (2nd row) + 0x00, 0x00, 0xFF, 0x00, // 3 pixel (2nd row) + 0x00, 0x00, 0xFF, 0x00, // 3 pixel (2nd row) + 0x00, 0x00, 0x00, 0xFF, // 4 pixel (2nd row) + 0x00, 0x00, 0x00, 0xFF, // 4 pixel (2nd row) + 0xAA, 0xBB, 0xCC, 0xDD, // 5 pixel (2nd row) + 0xAA, 0xBB, 0xCC, 0xDD // 5 pixel (2nd row) }; MemoryComparer cmp(memoryEtalon, ARRAY_SIZE(memoryEtalon)); EXPECTGL(glTexSubImage2D(0, 0, 10, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) .WillOnce(Invoke(&cmp, &MemoryComparer::cmpSubImage)); - cp.UploadResources(MakeStackRefPointer(&texture)); + cp.UploadResources(make_ref(&texture)); } { @@ -114,21 +152,34 @@ UNIT_TEST(ColorPalleteUploadingSingleRow) uint8_t memoryEtalon[] = { - // 1 pixel 2 pixel 3 pixel 4 pixel - 0xFF, 0xAA, 0x00, 0x00, 0xFF, 0xAA, 0x00, 0x00, 0xAA, 0xFF, 0x00, 0x00, 0xAA, 0xFF, 0x00, 0x00, - 0xAA, 0x00, 0xFF, 0x00, 0xAA, 0x00, 0xFF, 0x00, 0xAA, 0x00, 0x00, 0xFF, 0xAA, 0x00, 0x00, 0xFF, - 0x00, 0xBB, 0xCC, 0xDD, 0x00, 0xBB, 0xCC, 0xDD, - // second row - 0xFF, 0xAA, 0x00, 0x00, 0xFF, 0xAA, 0x00, 0x00, 0xAA, 0xFF, 0x00, 0x00, 0xAA, 0xFF, 0x00, 0x00, - 0xAA, 0x00, 0xFF, 0x00, 0xAA, 0x00, 0xFF, 0x00, 0xAA, 0x00, 0x00, 0xFF, 0xAA, 0x00, 0x00, 0xFF, - 0x00, 0xBB, 0xCC, 0xDD, 0x00, 0xBB, 0xCC, 0xDD, + 0xFF, 0xAA, 0x00, 0x00, // 1 pixel (1st row) + 0xFF, 0xAA, 0x00, 0x00, // 1 pixel (1st row) + 0xAA, 0xFF, 0x00, 0x00, // 2 pixel (1st row) + 0xAA, 0xFF, 0x00, 0x00, // 2 pixel (1st row) + 0xAA, 0x00, 0xFF, 0x00, // 3 pixel (1st row) + 0xAA, 0x00, 0xFF, 0x00, // 3 pixel (1st row) + 0xAA, 0x00, 0x00, 0xFF, // 4 pixel (1st row) + 0xAA, 0x00, 0x00, 0xFF, // 4 pixel (1st row) + 0x00, 0xBB, 0xCC, 0xDD, // 5 pixel (1st row) + 0x00, 0xBB, 0xCC, 0xDD, // 5 pixel (1st row) + + 0xFF, 0xAA, 0x00, 0x00, // 1 pixel (2nd row) + 0xFF, 0xAA, 0x00, 0x00, // 1 pixel (2nd row) + 0xAA, 0xFF, 0x00, 0x00, // 2 pixel (2nd row) + 0xAA, 0xFF, 0x00, 0x00, // 2 pixel (2nd row) + 0xAA, 0x00, 0xFF, 0x00, // 3 pixel (2nd row) + 0xAA, 0x00, 0xFF, 0x00, // 3 pixel (2nd row) + 0xAA, 0x00, 0x00, 0xFF, // 4 pixel (2nd row) + 0xAA, 0x00, 0x00, 0xFF, // 4 pixel (2nd row) + 0x00, 0xBB, 0xCC, 0xDD, // 5 pixel (2nd row) + 0x00, 0xBB, 0xCC, 0xDD // 5 pixel (2nd row) }; MemoryComparer cmp(memoryEtalon, ARRAY_SIZE(memoryEtalon)); EXPECTGL(glTexSubImage2D(10, 0, 10, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) .WillOnce(Invoke(&cmp, &MemoryComparer::cmpSubImage)); - cp.UploadResources(MakeStackRefPointer(&texture)); + cp.UploadResources(make_ref(&texture)); } EXPECTGL(glDeleteTexture(1)); @@ -136,40 +187,43 @@ UNIT_TEST(ColorPalleteUploadingSingleRow) UNIT_TEST(ColorPalleteUploadingPartialyRow) { - int const width = 16; - int const height = 16; + int const width = 8; + int const height = 8; InitOpenGLTextures(width, height); + Texture::Params p; + p.m_allocator = GetDefaultAllocator(); + p.m_format = dp::RGBA8; + p.m_width = width; + p.m_height = height; + DummyTexture texture; - dp::ColorKey key(dp::Color(0, 0, 0, 0)); - texture.Create(width, height, dp::RGBA8); - ColorPalette cp(m2::PointU(width, height)); + texture.Create(p); + + DummyColorPallete cp(m2::PointU(width, height)); { cp.MapResource(dp::Color(0xFF, 0, 0, 0)); cp.MapResource(dp::Color(0xFF, 0xFF, 0, 0)); - cp.MapResource(dp::Color(0xFF, 0xFF, 0xFF, 0)); - cp.MapResource(dp::Color(0xFF, 0xFF, 0xFF, 0xFF)); - cp.MapResource(dp::Color(0, 0, 0, 0xFF)); - cp.MapResource(dp::Color(0, 0, 0xFF, 0xFF)); uint8_t memoryEtalon[] = { - // 1 pixel 2 pixel 3 pixel 4 pixel - 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - // second row - 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF + 0xFF, 0x00, 0x00, 0x00, // 1 pixel + 0xFF, 0x00, 0x00, 0x00, // 1 pixel + 0xFF, 0xFF, 0x00, 0x00, // 2 pixel + 0xFF, 0xFF, 0x00, 0x00, // 2 pixel + + 0xFF, 0x00, 0x00, 0x00, // 1 pixel + 0xFF, 0x00, 0x00, 0x00, // 1 pixel + 0xFF, 0xFF, 0x00, 0x00, // 2 pixel + 0xFF, 0xFF, 0x00, 0x00 // 2 pixel }; MemoryComparer cmp(memoryEtalon, ARRAY_SIZE(memoryEtalon)); - EXPECTGL(glTexSubImage2D(0, 0, 12, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) + EXPECTGL(glTexSubImage2D(0, 0, 4, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) .WillOnce(Invoke(&cmp, &MemoryComparer::cmpSubImage)); - cp.UploadResources(MakeStackRefPointer(&texture)); + cp.UploadResources(make_ref(&texture)); } { @@ -180,45 +234,61 @@ UNIT_TEST(ColorPalleteUploadingPartialyRow) uint8_t memoryEtalon1[] = { - // 1 pixel 2 pixel 3 pixel 4 pixel - 0xAA, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, - // second row - 0xAA, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, + 0xAA, 0x00, 0x00, 0x00, // 1 pixel + 0xAA, 0x00, 0x00, 0x00, // 1 pixel + 0xAA, 0xAA, 0x00, 0x00, // 2 pixel + 0xAA, 0xAA, 0x00, 0x00, // 2 pixel + + 0xAA, 0x00, 0x00, 0x00, // 1 pixel + 0xAA, 0x00, 0x00, 0x00, // 1 pixel + 0xAA, 0xAA, 0x00, 0x00, // 2 pixel + 0xAA, 0xAA, 0x00, 0x00 // 2 pixel }; uint8_t memoryEtalon2[] = { - // 1 pixel 2 pixel 3 pixel 4 pixel - 0xAA, 0xAA, 0xAA, 0x00, 0xAA, 0xAA, 0xAA, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, - // second row - 0xAA, 0xAA, 0xAA, 0x00, 0xAA, 0xAA, 0xAA, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA + 0xAA, 0xAA, 0xAA, 0x00, // 1 pixel + 0xAA, 0xAA, 0xAA, 0x00, // 1 pixel + 0xAA, 0xAA, 0xAA, 0xAA, // 2 pixel + 0xAA, 0xAA, 0xAA, 0xAA, // 2 pixel + + 0xAA, 0xAA, 0xAA, 0x00, // 1 pixel + 0xAA, 0xAA, 0xAA, 0x00, // 1 pixel + 0xAA, 0xAA, 0xAA, 0xAA, // 2 pixel + 0xAA, 0xAA, 0xAA, 0xAA // 2 pixel }; MemoryComparer cmp1(memoryEtalon1, ARRAY_SIZE(memoryEtalon1)); - EXPECTGL(glTexSubImage2D(12, 0, 4, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) + EXPECTGL(glTexSubImage2D(4, 0, 4, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) .WillOnce(Invoke(&cmp1, &MemoryComparer::cmpSubImage)); MemoryComparer cmp2(memoryEtalon2, ARRAY_SIZE(memoryEtalon2)); EXPECTGL(glTexSubImage2D(0, 2, 4, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) .WillOnce(Invoke(&cmp2, &MemoryComparer::cmpSubImage)); - cp.UploadResources(MakeStackRefPointer(&texture)); + cp.UploadResources(make_ref(&texture)); } EXPECTGL(glDeleteTexture(1)); } -UNIT_TEST(ColorPalleteUploadingMultipyRow) +UNIT_TEST(ColorPalleteUploadingMultiplyRow) { - int const width = 8; - int const height = 16; + int const width = 4; + int const height = 8; InitOpenGLTextures(width, height); + Texture::Params p; + p.m_allocator = GetDefaultAllocator(); + p.m_format = dp::RGBA8; + p.m_width = width; + p.m_height = height; + DummyTexture texture; - dp::ColorKey key(dp::Color(0, 0, 0, 0)); - texture.Create(width, height, dp::RGBA8); - ColorPalette cp(m2::PointU(width, height)); + texture.Create(p); + + DummyColorPallete cp(m2::PointU(width, height)); cp.SetIsDebug(true); { @@ -227,16 +297,22 @@ UNIT_TEST(ColorPalleteUploadingMultipyRow) uint8_t memoryEtalon[] = { - // 1 pixel 2 pixel 3 pixel 4 pixel - 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, - 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00 + 0xFF, 0x00, 0x00, 0x00, // 1 pixel + 0xFF, 0x00, 0x00, 0x00, // 1 pixel + 0xAA, 0x00, 0x00, 0x00, // 2 pixel + 0xAA, 0x00, 0x00, 0x00, // 2 pixel + + 0xFF, 0x00, 0x00, 0x00, // 1 pixel + 0xFF, 0x00, 0x00, 0x00, // 1 pixel + 0xAA, 0x00, 0x00, 0x00, // 2 pixel + 0xAA, 0x00, 0x00, 0x00, // 2 pixel }; MemoryComparer cmp(memoryEtalon, ARRAY_SIZE(memoryEtalon)); EXPECTGL(glTexSubImage2D(0, 0, 4, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) .WillOnce(Invoke(&cmp, &MemoryComparer::cmpSubImage)); - cp.UploadResources(MakeStackRefPointer(&texture)); + cp.UploadResources(make_ref(&texture)); } { @@ -244,43 +320,35 @@ UNIT_TEST(ColorPalleteUploadingMultipyRow) cp.MapResource(dp::Color(0xFF, 0xFF, 0, 0)); cp.MapResource(dp::Color(0xFF, 0xFF, 0xFF, 0)); cp.MapResource(dp::Color(0xFF, 0xFF, 0xFF, 0xFF)); - cp.MapResource(dp::Color(0, 0, 0, 0xFF)); - cp.MapResource(dp::Color(0, 0, 0xFF, 0xFF)); - cp.MapResource(dp::Color(0, 0, 0xAA, 0xAA)); uint8_t memoryEtalon1[] = { - // 1 pixel 2 pixel 3 pixel 4 pixel - 0xCC, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xCC, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - }; + 0xCC, 0x00, 0x00, 0x00, // 1 pixel + 0xCC, 0x00, 0x00, 0x00, // 1 pixel + 0xFF, 0xFF, 0x00, 0x00, // 2 pixel + 0xFF, 0xFF, 0x00, 0x00, // 2 pixel - uint8_t memoryEtalon2[] = - { - // 1 pixel 2 pixel 3 pixel 4 pixel - 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 5 pixel 6 pixel 7 pixel 8 pixel - 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - // second row - 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - // next row - 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // next row - 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCC, 0x00, 0x00, 0x00, // 1 pixel + 0xCC, 0x00, 0x00, 0x00, // 1 pixel + 0xFF, 0xFF, 0x00, 0x00, // 2 pixel + 0xFF, 0xFF, 0x00, 0x00, // 2 pixel + + 0xFF, 0xFF, 0xFF, 0x00, // 1 pixel + 0xFF, 0xFF, 0xFF, 0x00, // 1 pixel + 0xFF, 0xFF, 0xFF, 0xFF, // 2 pixel + 0xFF, 0xFF, 0xFF, 0xFF, // 2 pixel + + 0xFF, 0xFF, 0xFF, 0x00, // 1 pixel + 0xFF, 0xFF, 0xFF, 0x00, // 1 pixel + 0xFF, 0xFF, 0xFF, 0xFF, // 2 pixel + 0xFF, 0xFF, 0xFF, 0xFF, // 2 pixel }; MemoryComparer cmp1(memoryEtalon1, ARRAY_SIZE(memoryEtalon1)); - EXPECTGL(glTexSubImage2D(4, 0, 4, 2, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) + EXPECTGL(glTexSubImage2D(0, 2, 4, 4, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) .WillOnce(Invoke(&cmp1, &MemoryComparer::cmpSubImage)); - MemoryComparer cmp2(memoryEtalon2, ARRAY_SIZE(memoryEtalon2)); - EXPECTGL(glTexSubImage2D(0, 2, 8, 4, AnyOf(gl_const::GLRGBA, gl_const::GLRGBA8), gl_const::GL8BitOnChannel, _)) - .WillOnce(Invoke(&cmp2, &MemoryComparer::cmpSubImage)); - - cp.UploadResources(MakeStackRefPointer(&texture)); + cp.UploadResources(make_ref(&texture)); } EXPECTGL(glDeleteTexture(1)); diff --git a/drape/drape_tests/uniform_value_tests.cpp b/drape/drape_tests/uniform_value_tests.cpp index 728471906d..12d2994b9a 100644 --- a/drape/drape_tests/uniform_value_tests.cpp +++ b/drape/drape_tests/uniform_value_tests.cpp @@ -49,7 +49,6 @@ private: uint32_t m_size; }; -#ifdef DEBUG void mock_glGetActiveUniform(uint32_t programID, uint32_t index, int32_t * size, @@ -77,7 +76,6 @@ void mock_glGetActiveUniform(uint32_t programID, else ASSERT(false, ("Undefined index:", index)); } -#endif } // namespace @@ -85,7 +83,7 @@ UNIT_TEST(UniformValueTest) { uint32_t const VertexShaderID = 1; uint32_t const FragmentShaderID = 2; - uint32_t const ProgramID = 3; + uint32_t const ProgramID = 2; int32_t const positionLoc = 10; int32_t const modelViewLoc = 11; @@ -105,12 +103,11 @@ UNIT_TEST(UniformValueTest) InSequence seq; // vertexShader->Ref() EXPECTGL(glCreateShader(gl_const::GLVertexShader)).WillOnce(Return(VertexShaderID)); - //EXPECTGL(glGetInteger(gl_const::GLMaxFragmentTextures)).WillOnce(Return(8)); EXPECTGL(glShaderSource(VertexShaderID, _)).Times(1); EXPECTGL(glCompileShader(VertexShaderID, _)).WillOnce(Return(true)); // fragmentShader->Ref() EXPECTGL(glCreateShader(gl_const::GLFragmentShader)).WillOnce(Return(FragmentShaderID)); - EXPECTGL(glGetInteger(gl_const::GLMaxFragmentTextures)).WillOnce(Return(8)); + //EXPECTGL(glGetInteger(gl_const::GLMaxFragmentTextures)).WillOnce(Return(8)); EXPECTGL(glShaderSource(FragmentShaderID, _)).Times(1); EXPECTGL(glCompileShader(FragmentShaderID, _)).WillOnce(Return(true)); @@ -120,53 +117,44 @@ UNIT_TEST(UniformValueTest) EXPECTGL(glLinkProgram(ProgramID, _)).WillOnce(Return(true)); + EXPECTGL(glGetProgramiv(ProgramID, gl_const::GLActiveUniforms)).WillOnce(Return(9)); + for (int i = 0; i < 9; i++) + { + EXPECTGL(glGetActiveUniform(ProgramID, _, _, _, _)).WillOnce(Invoke(mock_glGetActiveUniform)); + EXPECTGL(glGetUniformLocation(ProgramID, _)).WillOnce(Return(i == 8 ? modelViewLoc : positionLoc)); + } + EXPECTGL(glDetachShader(ProgramID, VertexShaderID)); EXPECTGL(glDetachShader(ProgramID, FragmentShaderID)); -#ifdef DEBUG - EXPECTGL(glGetProgramiv(ProgramID, gl_const::GLActiveUniforms)).WillOnce(Return(9)); - EXPECTGL(glGetActiveUniform(ProgramID, _, _, _, _)).Times(9).WillRepeatedly(Invoke(mock_glGetActiveUniform)); -#endif - EXPECTGL(glUseProgram(ProgramID)); - EXPECTGL(glGetUniformLocation(ProgramID, "position0")).WillOnce(Return(positionLoc)); EXPECTGL(glUniformValuei(positionLoc, 1)); - EXPECTGL(glGetUniformLocation(ProgramID, "position1")).WillOnce(Return(positionLoc)); EXPECTGL(glUniformValuei(positionLoc, 1, 2)); - EXPECTGL(glGetUniformLocation(ProgramID, "position2")).WillOnce(Return(positionLoc)); EXPECTGL(glUniformValuei(positionLoc, 1, 2, 3)); - EXPECTGL(glGetUniformLocation(ProgramID, "position3")).WillOnce(Return(positionLoc)); EXPECTGL(glUniformValuei(positionLoc, 1, 2, 3, 4)); - EXPECTGL(glGetUniformLocation(ProgramID, "position4")).WillOnce(Return(positionLoc)); EXPECTGL(glUniformValuef(positionLoc, 1.0f)); - EXPECTGL(glGetUniformLocation(ProgramID, "position5")).WillOnce(Return(positionLoc)); EXPECTGL(glUniformValuef(positionLoc, 1.0f, 2.0f)); - EXPECTGL(glGetUniformLocation(ProgramID, "position6")).WillOnce(Return(positionLoc)); EXPECTGL(glUniformValuef(positionLoc, 1.0f, 2.0f, 3.0f)); - EXPECTGL(glGetUniformLocation(ProgramID, "position7")).WillOnce(Return(positionLoc)); EXPECTGL(glUniformValuef(positionLoc, 1.0f, 2.0f, 3.0f, 4.0f)); - EXPECTGL(glGetUniformLocation(ProgramID, "viewModel")).WillOnce(Return(modelViewLoc)); EXPECTGL(glUniformMatrix4x4Value(modelViewLoc, _)) .WillOnce(Invoke(&comparer, &MemoryComparer::Compare)); EXPECTGL(glUseProgram(0)); EXPECTGL(glDeleteProgram(ProgramID)); - - EXPECTGL(glDeleteShader(VertexShaderID)); - EXPECTGL(glDeleteShader(FragmentShaderID)); + EXPECTGL(glDeleteShader(AnyOf(VertexShaderID, FragmentShaderID))).Times(2); } - GpuProgramManager * manager = new GpuProgramManager(); - RefPointer program = manager->GetProgram(gpu::TEXTURING_PROGRAM); + drape_ptr manager = make_unique_dp(); + ref_ptr program = manager->GetProgram(gpu::TEXTURING_PROGRAM); program->Bind(); @@ -214,7 +202,4 @@ UNIT_TEST(UniformValueTest) UniformValue v("viewModel", matrix); v.Apply(program); } - - program = RefPointer(); - delete manager; } diff --git a/drape/dynamic_texture.hpp b/drape/dynamic_texture.hpp index c35e84f035..41c593b98c 100644 --- a/drape/dynamic_texture.hpp +++ b/drape/dynamic_texture.hpp @@ -12,24 +12,23 @@ class DynamicTexture : public Texture public: virtual ~DynamicTexture() { - ASSERT(m_indexer.IsNull(), ()); + ASSERT(m_indexer == nullptr, ()); } - virtual RefPointer FindResource(Key const & key) const + virtual ref_ptr FindResource(Key const & key, bool & newResource) { - ASSERT(!m_indexer.IsNull(), ()); + ASSERT(m_indexer != nullptr, ()); if (key.GetType() != TResourceType) - return RefPointer(); + return nullptr; - return m_indexer->MapResource(static_cast(key)); + return m_indexer->MapResource(static_cast(key), newResource); } virtual void UpdateState() { - ASSERT(!m_indexer.IsNull(), ()); - + ASSERT(m_indexer != nullptr, ()); Bind(); - m_indexer->UploadResources(MakeStackRefPointer(this)); + m_indexer->UploadResources(make_ref(this)); } protected: @@ -39,29 +38,34 @@ protected: { m2::PointU m_size; dp::TextureFormat m_format; - glConst m_minFilter; - glConst m_magFilter; + glConst m_filter; }; - void Init(RefPointer indexer, TextureParams const & params) + void Init(ref_ptr allocator, ref_ptr indexer, TextureParams const & params) { - Init(indexer, params, MakeStackRefPointer(nullptr)); + Init(allocator, indexer, params, nullptr); } - void Init(RefPointer indexer, TextureParams const & params, RefPointer data) + void Init(ref_ptr allocator, ref_ptr indexer, TextureParams const & params, + ref_ptr data) { m_indexer = indexer; - Create(params.m_size.x, params.m_size.y, params.m_format, data); - SetFilterParams(params.m_minFilter, params.m_magFilter); + Texture::Params p; + p.m_allocator = allocator; + p.m_width = params.m_size.x; + p.m_height = params.m_size.y; + p.m_format = params.m_format; + p.m_filter = params.m_filter; + + Create(p, data); } void Reset() { - m_indexer = RefPointer(); + m_indexer = nullptr; } -private: - mutable RefPointer m_indexer; + ref_ptr m_indexer; }; } diff --git a/drape/font_texture.cpp b/drape/font_texture.cpp index 793e4ae505..07dd29e893 100644 --- a/drape/font_texture.cpp +++ b/drape/font_texture.cpp @@ -9,6 +9,7 @@ #include "base/string_utils.hpp" #include "base/stl_add.hpp" +#include "std/chrono.hpp" #include "std/string.hpp" #include "std/vector.hpp" #include "std/map.hpp" @@ -76,57 +77,177 @@ m2::RectF GlyphPacker::MapTextureCoords(const m2::RectU & pixelRect) const bool GlyphPacker::IsFull() const { return m_isFull; } -GlyphIndex::GlyphIndex(m2::PointU size, RefPointer mng) - : m_packer(size) - , m_mng(mng) +GlyphGenerator::GlyphGenerator(ref_ptr mng, TCompletionHandler const & completionHandler) + : m_mng(mng) + , m_completionHandler(completionHandler) + , m_isRunning(true) + , m_isSuspended(false) + , m_thread(&GlyphGenerator::Routine, this) { + ASSERT(m_completionHandler != nullptr, ()); } -RefPointer GlyphIndex::MapResource(GlyphKey const & key) +GlyphGenerator::~GlyphGenerator() { + m_isRunning = false; + m_condition.notify_one(); + m_thread.join(); + m_completionHandler = nullptr; + + for (GlyphGenerationData & data : m_queue) + data.m_glyph.m_image.Destroy(); + m_queue.clear(); +} + +void GlyphGenerator::WaitForGlyph(list & queue) +{ + unique_lock lock(m_queueLock); + m_isSuspended = true; + m_condition.wait(lock, [this] { return !m_queue.empty() || !m_isRunning; }); + m_isSuspended = false; + queue.swap(m_queue); +} + +bool GlyphGenerator::IsSuspended() const +{ + lock_guard lock(m_queueLock); + return m_isSuspended; +} + +void GlyphGenerator::Routine(GlyphGenerator * generator) +{ + ASSERT(generator != nullptr, ()); + while (generator->m_isRunning) + { + list queue; + generator->WaitForGlyph(queue); + + // generate glyphs + for (GlyphGenerationData & data : queue) + { + GlyphManager::Glyph glyph = generator->m_mng->GenerateGlyph(data.m_glyph); + data.m_glyph.m_image.Destroy(); + generator->m_completionHandler(data.m_rect, glyph); + } + } +} + +void GlyphGenerator::GenerateGlyph(m2::RectU const & rect, GlyphManager::Glyph const & glyph) +{ + lock_guard lock(m_queueLock); + m_queue.emplace_back(rect, glyph); + m_condition.notify_one(); +} + +GlyphIndex::GlyphIndex(m2::PointU size, ref_ptr mng) + : m_packer(size) + , m_mng(mng) + , m_generator(new GlyphGenerator(mng, bind(&GlyphIndex::OnGlyphGenerationCompletion, this, _1, _2))) +{ + // Cache invalid glyph. + GlyphKey const key = GlyphKey(m_mng->GetInvalidGlyph().m_code); + bool newResource = false; + MapResource(key, newResource); +} + +GlyphIndex::~GlyphIndex() +{ + m_generator.reset(); + { + threads::MutexGuard g(m_lock); + for_each(m_pendingNodes.begin(), m_pendingNodes.end(), [](TPendingNode & node) + { + node.second.m_image.Destroy(); + }); + m_pendingNodes.clear(); + } +} + +ref_ptr GlyphIndex::MapResource(GlyphKey const & key, bool & newResource) +{ + newResource = false; strings::UniChar uniChar = key.GetUnicodePoint(); auto it = m_index.find(uniChar); if (it != m_index.end()) - return MakeStackRefPointer(&it->second); + return make_ref(&it->second); + + newResource = true; GlyphManager::Glyph glyph = m_mng->GetGlyph(uniChar); m2::RectU r; if (!m_packer.PackGlyph(glyph.m_image.m_width, glyph.m_image.m_height, r)) { glyph.m_image.Destroy(); - return RefPointer(); + LOG(LWARNING, ("Glyphs packer could not pack a glyph", uniChar)); + + auto invalidGlyph = m_index.find(m_mng->GetInvalidGlyph().m_code); + if (invalidGlyph != m_index.end()) + return make_ref(&invalidGlyph->second); + + return nullptr; } - m_pendingNodes.emplace_back(r, glyph); + m_generator->GenerateGlyph(r, glyph); auto res = m_index.emplace(uniChar, GlyphInfo(m_packer.MapTextureCoords(r), glyph.m_metrics)); ASSERT(res.second, ()); - return MakeStackRefPointer(&res.first->second); + return make_ref(&res.first->second); } -void GlyphIndex::UploadResources(RefPointer texture) +bool GlyphIndex::HasAsyncRoutines() const +{ + return !m_generator->IsSuspended(); +} + +void GlyphIndex::OnGlyphGenerationCompletion(m2::RectU const & rect, GlyphManager::Glyph const & glyph) +{ + threads::MutexGuard g(m_lock); + m_pendingNodes.emplace_back(rect, glyph); +} + +void GlyphIndex::UploadResources(ref_ptr texture) { if (m_pendingNodes.empty()) return; + TPendingNodes pendingNodes; + { + threads::MutexGuard g(m_lock); + m_pendingNodes.swap(pendingNodes); + } + + for (auto it = pendingNodes.begin(); it != pendingNodes.end();) + { + m_mng->MarkGlyphReady(it->second); + + if (!it->second.m_image.m_data) + it = pendingNodes.erase(it); + else + ++it; + } + + if (pendingNodes.empty()) + return; + buffer_vector ranges; buffer_vector maxHeights; ranges.push_back(0); - uint32_t maxHeight = m_pendingNodes[0].first.SizeY(); - for (size_t i = 1; i < m_pendingNodes.size(); ++i) + uint32_t maxHeight = pendingNodes[0].first.SizeY(); + for (size_t i = 1; i < pendingNodes.size(); ++i) { - TPendingNode const & prevNode = m_pendingNodes[i - 1]; - maxHeight = max(maxHeight, prevNode.first.SizeY()); - TPendingNode const & currentNode = m_pendingNodes[i]; + TPendingNode const & prevNode = pendingNodes[i - 1]; + TPendingNode const & currentNode = pendingNodes[i]; if (ranges.size() < 2 && prevNode.first.minY() < currentNode.first.minY()) { ranges.push_back(i); maxHeights.push_back(maxHeight); maxHeight = currentNode.first.SizeY(); } + + maxHeight = max(maxHeight, currentNode.first.SizeY()); } maxHeights.push_back(maxHeight); - ranges.push_back(m_pendingNodes.size()); + ranges.push_back(pendingNodes.size()); ASSERT(maxHeights.size() < 3, ()); ASSERT(ranges.size() < 4, ()); @@ -136,17 +257,21 @@ void GlyphIndex::UploadResources(RefPointer texture) size_t startIndex = ranges[i - 1]; size_t endIndex = ranges[i]; uint32_t height = maxHeights[i - 1]; - uint32_t width = m_pendingNodes[endIndex - 1].first.maxX() - m_pendingNodes[startIndex].first.minX(); + uint32_t width = pendingNodes[endIndex - 1].first.maxX() - pendingNodes[startIndex].first.minX(); uint32_t byteCount = my::NextPowOf2(height * width); - m2::PointU zeroPoint = m_pendingNodes[startIndex].first.LeftBottom(); + + if (byteCount == 0) + continue; + + m2::PointU zeroPoint = pendingNodes[startIndex].first.LeftBottom(); SharedBufferManager::shared_buffer_ptr_t buffer = SharedBufferManager::instance().reserveSharedBuffer(byteCount); uint8_t * dstMemory = SharedBufferManager::GetRawPointer(buffer); view_t dstView = interleaved_view(width, height, (pixel_t *)dstMemory, width); for (size_t node = startIndex; node < endIndex; ++node) { - GlyphManager::Glyph & glyph = m_pendingNodes[node].second; - m2::RectU rect = m_pendingNodes[node].first; + GlyphManager::Glyph & glyph = pendingNodes[node].second; + m2::RectU rect = pendingNodes[node].first; if (rect.SizeX() == 0 || rect.SizeY() == 0) continue; @@ -157,6 +282,7 @@ void GlyphIndex::UploadResources(RefPointer texture) ASSERT_EQUAL(glyph.m_image.m_width, w, ()); ASSERT_EQUAL(glyph.m_image.m_height, h, ()); + ASSERT_GREATER_OR_EQUAL(height, h, ()); view_t dstSubView = subimage_view(dstView, rect.minX(), rect.minY(), w, h); uint8_t * srcMemory = SharedBufferManager::GetRawPointer(glyph.m_image.m_data); @@ -166,11 +292,9 @@ void GlyphIndex::UploadResources(RefPointer texture) glyph.m_image.Destroy(); } - texture->UploadData(zeroPoint.x, zeroPoint.y, width, height, dp::ALPHA, MakeStackRefPointer(dstMemory)); + texture->UploadData(zeroPoint.x, zeroPoint.y, width, height, make_ref(dstMemory)); SharedBufferManager::instance().freeSharedBuffer(byteCount, buffer); } - - m_pendingNodes.clear(); } } // namespace dp diff --git a/drape/font_texture.hpp b/drape/font_texture.hpp index 633920c924..5d8ccb3bd5 100644 --- a/drape/font_texture.hpp +++ b/drape/font_texture.hpp @@ -5,9 +5,13 @@ #include "drape/glyph_manager.hpp" #include "drape/dynamic_texture.hpp" +#include "std/atomic.hpp" +#include "std/condition_variable.hpp" +#include "std/list.hpp" #include "std/map.hpp" #include "std/vector.hpp" #include "std/string.hpp" +#include "std/thread.hpp" namespace dp { @@ -47,8 +51,7 @@ public: GlyphInfo(m2::RectF const & texRect, GlyphManager::GlyphMetrics const & metrics) : TBase(texRect) , m_metrics(metrics) - { - } + {} virtual Texture::ResourceType GetType() const { return Texture::Glyph; } GlyphManager::GlyphMetrics const & GetMetrics() const { return m_metrics; } @@ -57,21 +60,62 @@ private: GlyphManager::GlyphMetrics m_metrics; }; +class GlyphGenerator +{ +public: + using TCompletionHandler = function; + + struct GlyphGenerationData + { + m2::RectU m_rect; + GlyphManager::Glyph m_glyph; + + GlyphGenerationData(m2::RectU const & rect, GlyphManager::Glyph const & glyph) + : m_rect(rect), m_glyph(glyph) + {} + }; + + GlyphGenerator(ref_ptr mng, TCompletionHandler const & completionHandler); + ~GlyphGenerator(); + + void GenerateGlyph(m2::RectU const & rect, GlyphManager::Glyph const & glyph); + + bool IsSuspended() const; + +private: + static void Routine(GlyphGenerator * generator); + void WaitForGlyph(list & queue); + + ref_ptr m_mng; + TCompletionHandler m_completionHandler; + + list m_queue; + mutable mutex m_queueLock; + + atomic m_isRunning; + condition_variable m_condition; + bool m_isSuspended; + thread m_thread; +}; + class GlyphIndex { public: - GlyphIndex(m2::PointU size, RefPointer mng); + GlyphIndex(m2::PointU size, ref_ptr mng); + ~GlyphIndex(); /// can return nullptr - RefPointer MapResource(GlyphKey const & key); - void UploadResources(RefPointer texture); + ref_ptr MapResource(GlyphKey const & key, bool & newResource); + void UploadResources(ref_ptr texture); - glConst GetMinFilter() const { return gl_const::GLLinear; } - glConst GetMagFilter() const { return gl_const::GLLinear; } + bool HasAsyncRoutines() const; private: + void OnGlyphGenerationCompletion(m2::RectU const & rect, GlyphManager::Glyph const & glyph); + GlyphPacker m_packer; - RefPointer m_mng; + ref_ptr m_mng; + unique_ptr m_generator; typedef map TResourceMapping; typedef pair TPendingNode; @@ -79,27 +123,32 @@ private: TResourceMapping m_index; TPendingNodes m_pendingNodes; + threads::Mutex m_lock; }; class FontTexture : public DynamicTexture { typedef DynamicTexture TBase; public: - FontTexture(m2::PointU const & size, RefPointer glyphMng) + FontTexture(m2::PointU const & size, ref_ptr glyphMng, ref_ptr allocator) : m_index(size, glyphMng) { TBase::TextureParams params; params.m_size = size; params.m_format = TextureFormat::ALPHA; - params.m_minFilter = gl_const::GLLinear; - params.m_magFilter = gl_const::GLLinear; + params.m_filter = gl_const::GLLinear; vector initData(params.m_size.x * params.m_size.y, 0); - TBase::Init(MakeStackRefPointer(&m_index), params, MakeStackRefPointer(initData.data())); + TBase::Init(allocator, make_ref(&m_index), params, make_ref(initData.data())); } ~FontTexture() { TBase::Reset(); } + bool HasAsyncRoutines() const override + { + return m_index.HasAsyncRoutines(); + } + private: GlyphIndex m_index; }; diff --git a/drape_frontend/fribidi.hpp b/drape/fribidi.cpp similarity index 62% rename from drape_frontend/fribidi.hpp rename to drape/fribidi.cpp index 184912fc24..ac123b39b4 100644 --- a/drape_frontend/fribidi.hpp +++ b/drape/fribidi.cpp @@ -1,14 +1,16 @@ -#pragma once - #include "base/string_utils.hpp" #include "3party/fribidi/lib/fribidi.h" +#include "std/mutex.hpp" + namespace fribidi { strings::UniString log2vis(strings::UniString const & str) { + static mutex log2visMutex; + size_t const count = str.size(); if (count == 0) return str; @@ -16,7 +18,13 @@ strings::UniString log2vis(strings::UniString const & str) strings::UniString res(count); FriBidiParType dir = FRIBIDI_PAR_LTR; // requested base direction - fribidi_log2vis(&str[0], count, &dir, &res[0], 0, 0, 0); + + // call fribidi_log2vis synchronously + { + lock_guard lock(log2visMutex); + fribidi_log2vis(&str[0], count, &dir, &res[0], 0, 0, 0); + } + return res; } diff --git a/drape/fribidi.hpp b/drape/fribidi.hpp new file mode 100644 index 0000000000..b3db34601d --- /dev/null +++ b/drape/fribidi.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "base/string_utils.hpp" + +#include "3party/fribidi/lib/fribidi.h" + +namespace fribidi +{ + +strings::UniString log2vis(strings::UniString const & str); + +} diff --git a/drape/glIncludes.hpp b/drape/glIncludes.hpp index 3dd15129b9..5f87f1670e 100644 --- a/drape/glIncludes.hpp +++ b/drape/glIncludes.hpp @@ -10,10 +10,15 @@ #include #include #elif defined(OMIM_OS_WINDOWS) - #include "../std/windows.hpp" + #include "std/windows.hpp" #define GL_GLEXT_PROTOTYPES #include - #include "../3party/GL/glext.h" + #include "3party/GL/glext.h" +#elif defined(OMIM_OS_ANDROID) + #include + #include + #define GL_GLEXT_PROTOTYPES + #include #else #define GL_GLEXT_PROTOTYPES #include diff --git a/drape/glconstants.cpp b/drape/glconstants.cpp index bd7d524899..b7518e19de 100644 --- a/drape/glconstants.cpp +++ b/drape/glconstants.cpp @@ -45,6 +45,9 @@ const glConst GLMaxTextureSize = GL_MAX_TEXTURE_SIZE; const glConst GLArrayBuffer = GL_ARRAY_BUFFER; const glConst GLElementArrayBuffer = GL_ELEMENT_ARRAY_BUFFER; +const glConst GLBufferSize = GL_BUFFER_SIZE; +const glConst GLBufferUsage = GL_BUFFER_USAGE; + const glConst GLWriteOnly = WRITE_ONLY_DEF; const glConst GLStaticDraw = GL_STATIC_DRAW; @@ -122,6 +125,14 @@ const glConst GLOneMinusDstAlfa = GL_ONE_MINUS_DST_ALPHA; const glConst GLDepthTest = GL_DEPTH_TEST; const glConst GLBlending = GL_BLEND; +const glConst GLCullFace = GL_CULL_FACE; + +const glConst GLClockwise = GL_CW; +const glConst GLCounterClockwise = GL_CCW; + +const glConst GLFront = GL_FRONT; +const glConst GLBack = GL_BACK; +const glConst GLFrontAndBack = GL_FRONT_AND_BACK; const glConst GLNever = GL_NEVER; const glConst GLLess = GL_LESS; @@ -134,4 +145,6 @@ const glConst GLAlways = GL_ALWAYS; const glConst GLActiveUniforms = GL_ACTIVE_UNIFORMS; +const glConst GLLineStrip = GL_LINE_STRIP; + } // namespace GLConst diff --git a/drape/glconstants.hpp b/drape/glconstants.hpp index ec226720e9..ca75e3ec14 100644 --- a/drape/glconstants.hpp +++ b/drape/glconstants.hpp @@ -17,6 +17,10 @@ extern const glConst GLMaxTextureSize; extern const glConst GLArrayBuffer; extern const glConst GLElementArrayBuffer; +/// Buffer params +extern const glConst GLBufferSize; +extern const glConst GLBufferUsage; + /// VBO Access extern const glConst GLWriteOnly; @@ -109,6 +113,16 @@ extern const glConst GLOneMinusDstAlfa; /// OpenGL states extern const glConst GLDepthTest; extern const glConst GLBlending; +extern const glConst GLCullFace; + +/// Triangle faces order +extern const glConst GLClockwise; +extern const glConst GLCounterClockwise; + +/// Triangle face +extern const glConst GLFront; +extern const glConst GLBack; +extern const glConst GLFrontAndBack; /// OpenGL depth functions extern const glConst GLNever; @@ -123,4 +137,7 @@ extern const glConst GLAlways; /// Program object parameter names extern const glConst GLActiveUniforms; +/// Draw primitives +extern const glConst GLLineStrip; + } // namespace GLConst diff --git a/drape/glextensions_list.cpp b/drape/glextensions_list.cpp index 385e0be348..f34b629d62 100644 --- a/drape/glextensions_list.cpp +++ b/drape/glextensions_list.cpp @@ -9,14 +9,24 @@ namespace dp { #ifdef DEBUG - #include "../std/map.hpp" + #include "std/map.hpp" class GLExtensionsList::Impl { public: void CheckExtension(GLExtensionsList::ExtensionName const & enumName, const string & extName) { - m_supportedMap[enumName] = GLFunctions::glHasExtension(extName); +#ifdef OMIM_OS_ANDROID + if (enumName == GLExtensionsList::VertexArrayObject) + m_supportedMap[enumName] = false; + else +#endif + m_supportedMap[enumName] = GLFunctions::glHasExtension(extName); + } + + void SetExtension(GLExtensionsList::ExtensionName const & enumName, bool isSupported) + { + m_supportedMap[enumName] = isSupported; } bool IsSupported(GLExtensionsList::ExtensionName const & enumName) const @@ -33,17 +43,27 @@ namespace dp map m_supportedMap; }; #else - #include "../std/set.hpp" + #include "std/set.hpp" class GLExtensionsList::Impl { public: void CheckExtension(GLExtensionsList::ExtensionName const & enumName, const string & extName) { +#ifdef OMIM_OS_ANDROID + if (enumName == GLExtensionsList::VertexArrayObject) + return; +#endif if (GLFunctions::glHasExtension(extName)) m_supported.insert(enumName); } + void SetExtension(GLExtensionsList::ExtensionName const & enumName, bool isSupported) + { + if (isSupported) + m_supported.insert(enumName); + } + bool IsSupported(GLExtensionsList::ExtensionName const & enumName) const { if (m_supported.find(enumName) != m_supported.end()) @@ -62,14 +82,22 @@ GLExtensionsList::GLExtensionsList() { #if defined(OMIM_OS_MOBILE) m_impl->CheckExtension(VertexArrayObject, "GL_OES_vertex_array_object"); - m_impl->CheckExtension(TextureNPOT, "GL_OES_texture_npot"); m_impl->CheckExtension(RequiredInternalFormat, "GL_OES_required_internalformat"); + m_impl->CheckExtension(TextureNPOT, "GL_OES_texture_npot"); m_impl->CheckExtension(MapBuffer, "GL_OES_mapbuffer"); + m_impl->CheckExtension(UintIndices, "GL_OES_element_index_uint"); +#elif defined(OMIM_OS_WINDOWS) + m_impl->CheckExtension(TextureNPOT, "GL_ARB_texture_non_power_of_two"); + m_impl->SetExtension(VertexArrayObject, false); + m_impl->SetExtension(RequiredInternalFormat, false); + m_impl->SetExtension(MapBuffer, true); + m_impl->SetExtension(UintIndices, true); #else m_impl->CheckExtension(VertexArrayObject, "GL_APPLE_vertex_array_object"); m_impl->CheckExtension(TextureNPOT, "GL_ARB_texture_non_power_of_two"); - m_impl->CheckExtension(RequiredInternalFormat, "GL_OES_required_internalformat"); - m_impl->CheckExtension(MapBuffer, "GL_OES_mapbuffer"); + m_impl->SetExtension(RequiredInternalFormat, false); + m_impl->SetExtension(MapBuffer, true); + m_impl->SetExtension(UintIndices, true); #endif } diff --git a/drape/glextensions_list.hpp b/drape/glextensions_list.hpp index 49b36ebfce..623e8e55dc 100644 --- a/drape/glextensions_list.hpp +++ b/drape/glextensions_list.hpp @@ -13,7 +13,8 @@ public: VertexArrayObject, TextureNPOT, RequiredInternalFormat, - MapBuffer + MapBuffer, + UintIndices, }; static GLExtensionsList & Instance(); diff --git a/drape/glfunctions.cpp b/drape/glfunctions.cpp index 759bfaf039..abc2d0b702 100644 --- a/drape/glfunctions.cpp +++ b/drape/glfunctions.cpp @@ -1,19 +1,24 @@ #include "drape/glfunctions.hpp" #include "drape/glIncludes.hpp" +#include "drape/glextensions_list.hpp" #include "base/assert.hpp" #include "base/logging.hpp" +#include "base/macros.hpp" +#include "base/mutex.hpp" +#include "base/string_utils.hpp" #ifdef DEBUG #include "base/thread.hpp" -#include "base/mutex.hpp" #include "std/map.hpp" #endif -#include "std/cstring.hpp" - -#ifndef OMIM_OS_WINDOWS -#define APIENTRY +#if defined(OMIM_OS_WINDOWS) +#define DP_APIENTRY __stdcall +#elif defined(OMIM_OS_ANDROID) +#define DP_APIENTRY __NDK_FPABI__ +#else +#define DP_APIENTRY #endif namespace @@ -26,90 +31,322 @@ namespace threads::Mutex g_mutex; #endif - inline GLboolean convert(bool v) +inline GLboolean convert(bool v) +{ + return (v == true) ? GL_TRUE : GL_FALSE; +} + +typedef void (DP_APIENTRY *TglClearColorFn)(GLfloat r, GLfloat g, GLfloat b, GLfloat a); +typedef void (DP_APIENTRY *TglClearFn)(GLbitfield mask); +typedef void (DP_APIENTRY *TglViewportFn)(GLint x, GLint y, GLsizei w, GLsizei h); +typedef void (DP_APIENTRY *TglFlushFn)(); + +typedef void (DP_APIENTRY *TglBindFramebufferFn)(GLenum target, GLuint id); +typedef void (DP_APIENTRY *TglActiveTextureFn)(GLenum texture); +typedef void (DP_APIENTRY *TglBlendEquationFn)(GLenum mode); + +typedef void (DP_APIENTRY *TglGenVertexArraysFn)(GLsizei n, GLuint * ids); +typedef void (DP_APIENTRY *TglBindVertexArrayFn)(GLuint id); +typedef void (DP_APIENTRY *TglDeleteVertexArrayFn)(GLsizei n, GLuint const * ids); + +typedef void (DP_APIENTRY *TglGetBufferParameterFn)(GLenum target, GLenum value, GLint * data); +typedef void (DP_APIENTRY *TglGenBuffersFn)(GLsizei n, GLuint * buffers); +typedef void (DP_APIENTRY *TglBindBufferFn)(GLenum target, GLuint buffer); +typedef void (DP_APIENTRY *TglDeleteBuffersFn)(GLsizei n, GLuint const * buffers); +typedef void (DP_APIENTRY *TglBufferDataFn)(GLenum target, GLsizeiptr size, GLvoid const * data, GLenum usage); +typedef void (DP_APIENTRY *TglBufferSubDataFn)(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid const * data); +typedef void * (DP_APIENTRY *TglMapBufferFn)(GLenum target, GLenum access); +typedef GLboolean(DP_APIENTRY *TglUnmapBufferFn)(GLenum target); + +typedef GLuint(DP_APIENTRY *TglCreateShaderFn)(GLenum type); +typedef void (DP_APIENTRY *TglShaderSourceFn)(GLuint shaderID, GLsizei count, GLchar const ** string, GLint const * length); +typedef void (DP_APIENTRY *TglCompileShaderFn)(GLuint shaderID); +typedef void (DP_APIENTRY *TglDeleteShaderFn)(GLuint shaderID); +typedef void (DP_APIENTRY *TglGetShaderivFn)(GLuint shaderID, GLenum name, GLint * p); +typedef void (DP_APIENTRY *TglGetShaderInfoLogFn)(GLuint shaderID, GLsizei maxLength, GLsizei * length, GLchar * infoLog); + +typedef GLuint(DP_APIENTRY *TglCreateProgramFn)(); +typedef void (DP_APIENTRY *TglAttachShaderFn)(GLuint programID, GLuint shaderID); +typedef void (DP_APIENTRY *TglDetachShaderFn)(GLuint programID, GLuint shaderID); +typedef void (DP_APIENTRY *TglLinkProgramFn)(GLuint programID); +typedef void (DP_APIENTRY *TglDeleteProgramFn)(GLuint programID); +typedef void (DP_APIENTRY *TglGetProgramivFn)(GLuint programID, GLenum name, GLint * p); +typedef void (DP_APIENTRY *TglGetProgramInfoLogFn)(GLuint programID, GLsizei maxLength, GLsizei * length, GLchar * infoLog); + +typedef void (DP_APIENTRY *TglUseProgramFn)(GLuint programID); +typedef GLint (DP_APIENTRY *TglGetAttribLocationFn)(GLuint program, GLchar const * name); +typedef void (DP_APIENTRY *TglBindAttribLocationFn)(GLuint program, GLuint index, GLchar const * name); + +typedef void (DP_APIENTRY *TglEnableVertexAttributeFn)(GLuint location); +typedef void (DP_APIENTRY *TglVertexAttributePointerFn)(GLuint index, GLint count, GLenum type, GLboolean normalize, + GLsizei stride, GLvoid const * p); +typedef GLint(DP_APIENTRY *TglGetUniformLocationFn)(GLuint programID, GLchar const * name); +typedef void (DP_APIENTRY *TglGetActiveUniformFn)(GLuint programID, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, + GLint * size, GLenum * type, GLchar * name); +typedef void (DP_APIENTRY *TglUniform1iFn)(GLint location, GLint value); +typedef void (DP_APIENTRY *TglUniform2iFn)(GLint location, GLint v1, GLint v2); +typedef void (DP_APIENTRY *TglUniform3iFn)(GLint location, GLint v1, GLint v2, GLint v3); +typedef void (DP_APIENTRY *TglUniform4iFn)(GLint location, GLint v1, GLint v2, GLint v3, GLint v4); +typedef void (DP_APIENTRY *TglUniform1ivFn)(GLint location, GLsizei count, GLint const * value); +typedef void (DP_APIENTRY *TglUniform1fFn)(GLint location, GLfloat value); +typedef void (DP_APIENTRY *TglUniform2fFn)(GLint location, GLfloat v1, GLfloat v2); +typedef void (DP_APIENTRY *TglUniform3fFn)(GLint location, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (DP_APIENTRY *TglUniform4fFn)(GLint location, GLfloat v1, GLfloat v2, GLfloat v3, GLfloat v4); +typedef void (DP_APIENTRY *TglUniform1fvFn)(GLint location, GLsizei count, GLfloat const * value); +typedef void (DP_APIENTRY *TglUniformMatrix4fvFn)(GLint location, GLsizei count, GLboolean transpose, GLfloat const * value); + +TglClearColorFn glClearColorFn = nullptr; +TglClearFn glClearFn = nullptr; +TglViewportFn glViewportFn = nullptr; +TglFlushFn glFlushFn = nullptr; + +TglBindFramebufferFn glBindFramebufferFn = nullptr; +TglActiveTextureFn glActiveTextureFn = nullptr; +TglBlendEquationFn glBlendEquationFn = nullptr; + +/// VAO +TglGenVertexArraysFn glGenVertexArraysFn = nullptr; +TglBindVertexArrayFn glBindVertexArrayFn = nullptr; +TglDeleteVertexArrayFn glDeleteVertexArrayFn = nullptr; + +/// VBO +TglGetBufferParameterFn glGetBufferParameterFn = nullptr; +TglGenBuffersFn glGenBuffersFn = nullptr; +TglBindBufferFn glBindBufferFn = nullptr; +TglDeleteBuffersFn glDeleteBuffersFn = nullptr; +TglBufferDataFn glBufferDataFn = nullptr; +TglBufferSubDataFn glBufferSubDataFn = nullptr; +TglMapBufferFn glMapBufferFn = nullptr; +TglUnmapBufferFn glUnmapBufferFn = nullptr; + +/// Shaders +TglCreateShaderFn glCreateShaderFn = nullptr; +TglShaderSourceFn glShaderSourceFn = nullptr; +TglCompileShaderFn glCompileShaderFn = nullptr; +TglDeleteShaderFn glDeleteShaderFn = nullptr; +TglGetShaderivFn glGetShaderivFn = nullptr; +TglGetShaderInfoLogFn glGetShaderInfoLogFn = nullptr; + +TglCreateProgramFn glCreateProgramFn = nullptr; +TglAttachShaderFn glAttachShaderFn = nullptr; +TglDetachShaderFn glDetachShaderFn = nullptr; +TglLinkProgramFn glLinkProgramFn = nullptr; +TglDeleteProgramFn glDeleteProgramFn = nullptr; +TglGetProgramivFn glGetProgramivFn = nullptr; +TglGetProgramInfoLogFn glGetProgramInfoLogFn = nullptr; + +TglUseProgramFn glUseProgramFn = nullptr; +TglGetAttribLocationFn glGetAttribLocationFn = nullptr; +TglBindAttribLocationFn glBindAttribLocationFn = nullptr; + +TglEnableVertexAttributeFn glEnableVertexAttributeFn = nullptr; +TglVertexAttributePointerFn glVertexAttributePointerFn = nullptr; +TglGetUniformLocationFn glGetUniformLocationFn = nullptr; +TglGetActiveUniformFn glGetActiveUniformFn = nullptr; +TglUniform1iFn glUniform1iFn = nullptr; +TglUniform2iFn glUniform2iFn = nullptr; +TglUniform3iFn glUniform3iFn = nullptr; +TglUniform4iFn glUniform4iFn = nullptr; +TglUniform1ivFn glUniform1ivFn = nullptr; +TglUniform1fFn glUniform1fFn = nullptr; +TglUniform2fFn glUniform2fFn = nullptr; +TglUniform3fFn glUniform3fFn = nullptr; +TglUniform4fFn glUniform4fFn = nullptr; +TglUniform1fvFn glUniform1fvFn = nullptr; +TglUniformMatrix4fvFn glUniformMatrix4fvFn = nullptr; + +int const GLCompileStatus = GL_COMPILE_STATUS; +int const GLLinkStatus = GL_LINK_STATUS; + +threads::Mutex s_mutex; +bool s_inited = false; + +class GLFunctionsCache +{ +public: + GLFunctionsCache() = default; + + void SetThread(thread::id const & threadId) { - return (v == true) ? GL_TRUE : GL_FALSE; + m_threadId = threadId; + + m_glBindTextureCache = CachedParam(); + m_glActiveTextureCache = CachedParam(); + m_glUseProgramCache = CachedParam(); + m_glStateCache.clear(); + m_uniformsCache.clear(); } - void (APIENTRY *glClearColorFn)(GLfloat r, GLfloat g, GLfloat b, GLfloat a) = NULL; - void (APIENTRY *glClearFn)(GLbitfield mask) = NULL; - void (APIENTRY *glViewportFn)(GLint x, GLint y, GLsizei w, GLsizei h) = NULL; - void (APIENTRY *glFlushFn)() = NULL; + void glBindTexture(uint32_t textureID) + { + if (!IsCachedThread() || m_glBindTextureCache.Assign(textureID)) + GLCHECK(::glBindTexture(GL_TEXTURE_2D, textureID)); + } - void (APIENTRY *glBindFramebufferFn)(GLenum target, GLuint id) = NULL; + void glActiveTexture(glConst texBlock) + { + if (!IsCachedThread() || m_glActiveTextureCache.Assign(texBlock)) + { + ASSERT(glActiveTextureFn != nullptr, ()); + GLCHECK(glActiveTextureFn(texBlock)); + } + } - /// VAO - void (APIENTRY *glGenVertexArraysFn)(GLsizei n, GLuint * ids) = NULL; - void (APIENTRY *glBindVertexArrayFn)(GLuint id) = NULL; - void (APIENTRY *glDeleteVertexArrayFn)(GLsizei n, GLuint const * ids) = NULL; + void glUseProgram(uint32_t programID) + { + if (!IsCachedThread() || m_glUseProgramCache.Assign(programID)) + { + ASSERT(glUseProgramFn != nullptr, ()); + GLCHECK(glUseProgramFn(programID)); + } + } - /// VBO - void (APIENTRY *glGenBuffersFn)(GLsizei n, GLuint * buffers) = NULL; - void (APIENTRY *glBindBufferFn)(GLenum target, GLuint buffer) = NULL; - void (APIENTRY *glDeleteBuffersFn)(GLsizei n, GLuint const * buffers) = NULL; - void (APIENTRY *glBufferDataFn)(GLenum target, GLsizeiptr size, GLvoid const * data, GLenum usage) = NULL; - void (APIENTRY *glBufferSubDataFn)(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid const * data) = NULL; - void * (APIENTRY *glMapBufferFn)(GLenum target, GLenum access) = NULL; - GLboolean (APIENTRY *glUnmapBufferFn)(GLenum target) = NULL; + void glEnable(glConst mode) + { + if (!IsCachedThread() || m_glStateCache[mode].Assign(true)) + GLCHECK(::glEnable(mode)); + } - /// Shaders - GLuint (APIENTRY *glCreateShaderFn)(GLenum type) = NULL; - void (APIENTRY *glShaderSourceFn)(GLuint shaderID, GLsizei count, GLchar const ** string, GLint const * length) = NULL; - void (APIENTRY *glCompileShaderFn)(GLuint shaderID) = NULL; - void (APIENTRY *glDeleteShaderFn)(GLuint shaderID) = NULL; - void (APIENTRY *glGetShaderivFn)(GLuint shaderID, GLenum name, GLint * p) = NULL; - void (APIENTRY *glGetShaderInfoLogFn)(GLuint shaderID, GLsizei maxLength, GLsizei * length, GLchar * infoLog) = NULL; + void glDisable(glConst mode) + { + if (!IsCachedThread() || m_glStateCache[mode].Assign(false)) + GLCHECK(::glDisable(mode)); + } - GLuint (APIENTRY *glCreateProgramFn)() = NULL; - void (APIENTRY *glAttachShaderFn)(GLuint programID, GLuint shaderID) = NULL; - void (APIENTRY *glDetachShaderFn)(GLuint programID, GLuint shaderID) = NULL; - void (APIENTRY *glLinkProgramFn)(GLuint programID) = NULL; - void (APIENTRY *glDeleteProgramFn)(GLuint programID) = NULL; - void (APIENTRY *glGetProgramivFn)(GLuint programID, GLenum name, GLint * p) = NULL; - void (APIENTRY *glGetProgramInfoLogFn)(GLuint programID, GLsizei maxLength, GLsizei * length, GLchar * infoLog) = NULL; + void glUniformValuei(int8_t location, int32_t v) + { + if (!IsCachedThread() || GetCacheForCurrentProgram().Assign(location, v)) + { + ASSERT(glUniform1iFn != nullptr, ()); + ASSERT(location != -1, ()); + GLCHECK(glUniform1iFn(location, v)); + } + } - void (APIENTRY *glUseProgramFn)(GLuint programID) = NULL; - GLint (APIENTRY *glGetAttribLocationFn)(GLuint program, GLchar const * name) = NULL; - void (APIENTRY *glBindAttribLocationFn)(GLuint program, GLuint index, GLchar const * name) = NULL; + void glUniformValuef(int8_t location, float v) + { + if (!IsCachedThread() || GetCacheForCurrentProgram().Assign(location, v)) + { + ASSERT(glUniform1fFn != nullptr, ()); + ASSERT(location != -1, ()); + GLCHECK(glUniform1fFn(location, v)); + } + } - void (APIENTRY *glEnableVertexAttributeFn)(GLuint location) = NULL; - void (APIENTRY *glVertexAttributePointerFn)(GLuint index, - GLint count, - GLenum type, - GLboolean normalize, - GLsizei stride, - GLvoid const * p) = NULL; +private: - GLint (APIENTRY *glGetUniformLocationFn)(GLuint programID, GLchar const * name) = NULL; + template + struct CachedParam + { + TValue m_value; + bool m_inited; - void (APIENTRY *glGetActiveUniformFn)(GLuint programID, - GLuint uniformIndex, - GLsizei bufSize, - GLsizei * length, - GLint * size, - GLenum * type, - GLchar * name) = NULL; + CachedParam() + : m_value(TValue()) + , m_inited(false) + { + } - void (APIENTRY *glUniform1iFn)(GLint location, GLint value) = NULL; - void (APIENTRY *glUniform2iFn)(GLint location, GLint v1, GLint v2) = NULL; - void (APIENTRY *glUniform3iFn)(GLint location, GLint v1, GLint v2, GLint v3) = NULL; - void (APIENTRY *glUniform4iFn)(GLint location, GLint v1, GLint v2, GLint v3, GLint v4) = NULL; - void (APIENTRY *glUniform1ivFn)(GLint location, GLsizei count, GLint const * value) = NULL; + explicit CachedParam(TValue const & value) + : m_value(value) + , m_inited(true) + { + } - void (APIENTRY *glUniform1fFn)(GLint location, GLfloat value) = NULL; - void (APIENTRY *glUniform2fFn)(GLint location, GLfloat v1, GLfloat v2) = NULL; - void (APIENTRY *glUniform3fFn)(GLint location, GLfloat v1, GLfloat v2, GLfloat v3) = NULL; - void (APIENTRY *glUniform4fFn)(GLint location, GLfloat v1, GLfloat v2, GLfloat v3, GLfloat v4) = NULL; - void (APIENTRY *glUniform1fvFn)(GLint location, GLsizei count, GLfloat const * value) = NULL; + bool Assign(TValue const & newValue) + { + if (m_inited && newValue == m_value) + return false; - void (APIENTRY *glUniformMatrix4fvFn)(GLint location, GLsizei count, GLboolean transpose, GLfloat const * value) = NULL; + m_value = newValue; + m_inited = true; + return true; + } - int const GLCompileStatus = GL_COMPILE_STATUS; - int const GLLinkStatus = GL_LINK_STATUS; + bool operator!=(TValue const & value) const + { + return m_value != value; + } + + CachedParam & operator=(TValue const & param) + { + m_value = param; + m_inited = true; + return *this; + } + }; + + template using UniformCache = map>; + using StateParams = map>; + + struct UniformsCache + { + UniformCache m_glUniform1iCache; + UniformCache m_glUniform1fCache; + + bool Assign(int8_t location, int32_t value) { return Assign(location, value, m_glUniform1iCache); } + bool Assign(int8_t location, float value) { return Assign(location, value, m_glUniform1fCache); } + + template + bool Assign(int8_t location, TValue const & value, UniformCache & cache) + { + return cache[location].Assign(value); + } + }; + + GLFunctionsCache::UniformsCache & GetCacheForCurrentProgram() + { + ASSERT(m_glUseProgramCache.m_inited, ()); + return m_uniformsCache[m_glUseProgramCache.m_value]; + } + + bool IsCachedThread() const + { + return this_thread::get_id() == m_threadId; + } + + CachedParam m_glBindTextureCache; + CachedParam m_glActiveTextureCache; + CachedParam m_glUseProgramCache; + StateParams m_glStateCache; + + map m_uniformsCache; + + thread::id m_threadId; +}; + +GLFunctionsCache s_cache; + +} // namespace + +#ifdef OMIM_OS_WINDOWS + +template +TFunc LoadExtension(string const & ext) +{ + TFunc func = reinterpret_cast(wglGetProcAddress(ext.c_str())); + if (func == nullptr) + { + func = reinterpret_cast(wglGetProcAddress((ext + "EXT").c_str())); + ASSERT(func, ()); + } + + return func; } + #define LOAD_GL_FUNC(type, func) LoadExtension(#func); +#else + #define LOAD_GL_FUNC(type, func) &::func +#endif + + void GLFunctions::Init() { + threads::MutexGuard g(s_mutex); + if (s_inited) + return; + + s_inited = true; /// VAO #if defined(OMIM_OS_MAC) glGenVertexArraysFn = &glGenVertexArraysAPPLE; @@ -123,75 +360,107 @@ void GLFunctions::Init() glDeleteVertexArrayFn = &::glDeleteVertexArrays; glMapBufferFn = &::glMapBuffer; // I don't know correct name for linux! glUnmapBufferFn = &::glUnmapBuffer; // I don't know correct name for linux! +#elif defined(OMIM_OS_ANDROID) + glGenVertexArraysFn = (TglGenVertexArraysFn)eglGetProcAddress("glGenVertexArraysOES"); + glBindVertexArrayFn = (TglBindVertexArrayFn)eglGetProcAddress("glBindVertexArrayOES"); + glDeleteVertexArrayFn = (TglDeleteVertexArrayFn)eglGetProcAddress("glDeleteVertexArraysOES"); + glMapBufferFn = &::glMapBufferOES; + glUnmapBufferFn = &::glUnmapBufferOES; #elif defined(OMIM_OS_MOBILE) glGenVertexArraysFn = &glGenVertexArraysOES; glBindVertexArrayFn = &glBindVertexArrayOES; glDeleteVertexArrayFn = &glDeleteVertexArraysOES; glMapBufferFn = &::glMapBufferOES; glUnmapBufferFn = &::glUnmapBufferOES; -#endif +#elif defined(OMIM_OS_WINDOWS) + if (dp::GLExtensionsList::Instance().IsSupported(dp::GLExtensionsList::VertexArrayObject)) + { + glGenVertexArraysFn = LOAD_GL_FUNC(TglGenVertexArraysFn, glGenVertexArrays); + glBindVertexArrayFn = LOAD_GL_FUNC(TglBindVertexArrayFn, glBindVertexArray); + glDeleteVertexArrayFn = LOAD_GL_FUNC(TglDeleteVertexArrayFn, glDeleteVertexArrays); + } - glBindFramebufferFn = &::glBindFramebuffer; + glMapBufferFn = LOAD_GL_FUNC(TglMapBufferFn, glMapBuffer); + glUnmapBufferFn = LOAD_GL_FUNC(TglUnmapBufferFn, glUnmapBuffer); +#endif glClearColorFn = &::glClearColor; glClearFn = &::glClear; glViewportFn = &::glViewport; glFlushFn = &::glFlush; + glBindFramebufferFn = LOAD_GL_FUNC(TglBindFramebufferFn, glBindFramebuffer); + glActiveTextureFn = LOAD_GL_FUNC(TglActiveTextureFn, glActiveTexture); + glBlendEquationFn = LOAD_GL_FUNC(TglBlendEquationFn, glBlendEquation); + /// VBO - glGenBuffersFn = &::glGenBuffers; - glBindBufferFn = &::glBindBuffer; - glDeleteBuffersFn = &::glDeleteBuffers; - glBufferDataFn = &::glBufferData; - glBufferSubDataFn = &::glBufferSubData; + glGetBufferParameterFn = LOAD_GL_FUNC(TglGetBufferParameterFn, glGetBufferParameteriv); + glGenBuffersFn = LOAD_GL_FUNC(TglGenBuffersFn, glGenBuffers); + glBindBufferFn = LOAD_GL_FUNC(TglBindBufferFn, glBindBuffer); + glDeleteBuffersFn = LOAD_GL_FUNC(TglDeleteBuffersFn, glDeleteBuffers); + glBufferDataFn = LOAD_GL_FUNC(TglBufferDataFn, glBufferData); + glBufferSubDataFn = LOAD_GL_FUNC(TglBufferSubDataFn, glBufferSubData); /// Shaders - glCreateShaderFn = &::glCreateShader; - typedef void (APIENTRY *glShaderSource_Type)(GLuint shaderID, GLsizei count, GLchar const ** string, GLint const * length); + glCreateShaderFn = LOAD_GL_FUNC(TglCreateShaderFn, glCreateShader); +#ifdef OMIM_OS_WINDOWS + glShaderSourceFn = LOAD_GL_FUNC(TglShaderSourceFn, glShaderSource); +#else + typedef void (DP_APIENTRY *glShaderSource_Type)(GLuint shaderID, GLsizei count, GLchar const ** string, GLint const * length); glShaderSourceFn = reinterpret_cast(&::glShaderSource); - glCompileShaderFn = &::glCompileShader; - glDeleteShaderFn = &::glDeleteShader; - glGetShaderivFn = &::glGetShaderiv; - glGetShaderInfoLogFn = &::glGetShaderInfoLog; +#endif + glCompileShaderFn = LOAD_GL_FUNC(TglCompileShaderFn, glCompileShader); + glDeleteShaderFn = LOAD_GL_FUNC(TglDeleteShaderFn, glDeleteShader); + glGetShaderivFn = LOAD_GL_FUNC(TglGetShaderivFn, glGetShaderiv); + glGetShaderInfoLogFn = LOAD_GL_FUNC(TglGetShaderInfoLogFn, glGetShaderInfoLog); - glCreateProgramFn = &::glCreateProgram; - glAttachShaderFn = &::glAttachShader; - glDetachShaderFn = &::glDetachShader; - glLinkProgramFn = &::glLinkProgram; - glDeleteProgramFn = &::glDeleteProgram; - glGetProgramivFn = &::glGetProgramiv; - glGetProgramInfoLogFn = &::glGetProgramInfoLog; + glCreateProgramFn = LOAD_GL_FUNC(TglCreateProgramFn, glCreateProgram); + glAttachShaderFn = LOAD_GL_FUNC(TglAttachShaderFn, glAttachShader); + glDetachShaderFn = LOAD_GL_FUNC(TglDetachShaderFn, glDetachShader); + glLinkProgramFn = LOAD_GL_FUNC(TglLinkProgramFn, glLinkProgram); + glDeleteProgramFn = LOAD_GL_FUNC(TglDeleteProgramFn, glDeleteProgram); + glGetProgramivFn = LOAD_GL_FUNC(TglGetProgramivFn, glGetProgramiv); + glGetProgramInfoLogFn = LOAD_GL_FUNC(TglGetProgramInfoLogFn, glGetProgramInfoLog); - glUseProgramFn = &::glUseProgram; - glGetAttribLocationFn = &::glGetAttribLocation; - glBindAttribLocationFn = &::glBindAttribLocation; + glUseProgramFn = LOAD_GL_FUNC(TglUseProgramFn, glUseProgram); + glGetAttribLocationFn = LOAD_GL_FUNC(TglGetAttribLocationFn, glGetAttribLocation); + glBindAttribLocationFn = LOAD_GL_FUNC(TglBindAttribLocationFn, glBindAttribLocation); - glEnableVertexAttributeFn = &::glEnableVertexAttribArray; - glVertexAttributePointerFn = &::glVertexAttribPointer; + glEnableVertexAttributeFn = LOAD_GL_FUNC(TglEnableVertexAttributeFn, glEnableVertexAttribArray); + glVertexAttributePointerFn = LOAD_GL_FUNC(TglVertexAttributePointerFn, glVertexAttribPointer); - glGetUniformLocationFn = &::glGetUniformLocation; - glGetActiveUniformFn = &::glGetActiveUniform; - glUniform1iFn = &::glUniform1i; - glUniform2iFn = &::glUniform2i; - glUniform3iFn = &::glUniform3i; - glUniform4iFn = &::glUniform4i; - glUniform1ivFn = &::glUniform1iv; + glGetUniformLocationFn = LOAD_GL_FUNC(TglGetUniformLocationFn, glGetUniformLocation); + glGetActiveUniformFn = LOAD_GL_FUNC(TglGetActiveUniformFn, glGetActiveUniform); + glUniform1iFn = LOAD_GL_FUNC(TglUniform1iFn, glUniform1i); + glUniform2iFn = LOAD_GL_FUNC(TglUniform2iFn, glUniform2i); + glUniform3iFn = LOAD_GL_FUNC(TglUniform3iFn, glUniform3i); + glUniform4iFn = LOAD_GL_FUNC(TglUniform4iFn, glUniform4i); + glUniform1ivFn = LOAD_GL_FUNC(TglUniform1ivFn, glUniform1iv); - glUniform1fFn = &::glUniform1f; - glUniform2fFn = &::glUniform2f; - glUniform3fFn = &::glUniform3f; - glUniform4fFn = &::glUniform4f; - glUniform1fvFn = &::glUniform1fv; + glUniform1fFn = LOAD_GL_FUNC(TglUniform1fFn, glUniform1f); + glUniform2fFn = LOAD_GL_FUNC(TglUniform2fFn, glUniform2f); + glUniform3fFn = LOAD_GL_FUNC(TglUniform3fFn, glUniform3f); + glUniform4fFn = LOAD_GL_FUNC(TglUniform4fFn, glUniform4f); + glUniform1fvFn = LOAD_GL_FUNC(TglUniform1fvFn, glUniform1fv); - glUniformMatrix4fvFn = &glUniformMatrix4fv; + glUniformMatrix4fvFn = LOAD_GL_FUNC(TglUniformMatrix4fvFn, glUniformMatrix4fv); +} + +void GLFunctions::AttachCache(thread::id const & threadId) +{ + s_cache.SetThread(threadId); } bool GLFunctions::glHasExtension(string const & name) { - char const* extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); + char const * extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); + GLCHECKCALL(); + if (extensions == nullptr) + return false; + char const * extName = name.c_str(); - char const * ptr = NULL; - while ((ptr = strstr(extensions, extName)) != NULL) + char const * ptr = nullptr; + while ((ptr = strstr(extensions, extName)) != nullptr) { char const * end = ptr + strlen(extName); if (isspace(*end) || *end == '\0') @@ -205,34 +474,49 @@ bool GLFunctions::glHasExtension(string const & name) void GLFunctions::glClearColor(float r, float g, float b, float a) { - ASSERT(glClearColorFn != NULL, ()); + ASSERT(glClearColorFn != nullptr, ()); GLCHECK(glClearColorFn(r, g, b, a)); } void GLFunctions::glClear() { - ASSERT(glClearFn != NULL, ()); + ASSERT(glClearFn != nullptr, ()); GLCHECK(glClearFn(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); } void GLFunctions::glClearDepth() { - ASSERT(glClearFn != NULL, ()); + ASSERT(glClearFn != nullptr, ()); GLCHECK(glClearFn(GL_DEPTH_BUFFER_BIT)); } void GLFunctions::glViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h) { - ASSERT(glViewportFn != NULL, ()); + ASSERT(glViewportFn != nullptr, ()); GLCHECK(glViewportFn(x, y, w, h)); } void GLFunctions::glFlush() { - ASSERT(glFlushFn != NULL, ()); + ASSERT(glFlushFn != nullptr, ()); GLCHECK(glFlushFn()); } +void GLFunctions::glFinish() +{ + GLCHECK(::glFinish()); +} + +void GLFunctions::glFrontFace(glConst mode) +{ + GLCHECK(::glFrontFace(mode)); +} + +void GLFunctions::glCullFace(glConst face) +{ + GLCHECK(::glCullFace(face)); +} + void GLFunctions::glPixelStore(glConst name, uint32_t value) { GLCHECK(::glPixelStorei(name, value)); @@ -245,19 +529,27 @@ int32_t GLFunctions::glGetInteger(glConst pname) return (int32_t)value; } +int32_t GLFunctions::glGetBufferParameter(glConst target, glConst name) +{ + GLint result; + ASSERT(glGetBufferParameterFn != nullptr, ()); + GLCHECK(glGetBufferParameterFn(target, name, &result)); + return static_cast(result); +} + void GLFunctions::glEnable(glConst mode) { - GLCHECK(::glEnable(mode)); + s_cache.glEnable(mode); } void GLFunctions::glDisable(glConst mode) { - GLCHECK(::glDisable(mode)); + s_cache.glDisable(mode); } void GLFunctions::glClearDepthValue(double depth) { -#ifdef OMIM_OS_IPHONE +#if defined(OMIM_OS_IPHONE) || defined(OMIM_OS_ANDROID) GLCHECK(::glClearDepthf(static_cast(depth))); #else GLCHECK(::glClearDepth(depth)); @@ -276,7 +568,8 @@ void GLFunctions::glDepthFunc(glConst depthFunc) void GLFunctions::glBlendEquation(glConst function) { - GLCHECK(::glBlendEquation(function)); + ASSERT(glBlendEquationFn != nullptr, ()); + GLCHECK(glBlendEquationFn(function)); } void GLFunctions::glBlendFunc(glConst srcFactor, glConst dstFactor) @@ -286,13 +579,13 @@ void GLFunctions::glBlendFunc(glConst srcFactor, glConst dstFactor) void GLFunctions::glBindFramebuffer(glConst target, uint32_t id) { - ASSERT(glBindFramebufferFn != NULL, ()); + ASSERT(glBindFramebufferFn != nullptr, ()); GLCHECK(glBindFramebufferFn(target, id)); } uint32_t GLFunctions::glGenVertexArray() { - ASSERT(glGenVertexArraysFn != NULL, ()); + ASSERT(glGenVertexArraysFn != nullptr, ()); GLuint result = 0; GLCHECK(glGenVertexArraysFn(1, &result)); return result; @@ -300,19 +593,19 @@ uint32_t GLFunctions::glGenVertexArray() void GLFunctions::glBindVertexArray(uint32_t vao) { - ASSERT(glBindVertexArrayFn != NULL, ()); + ASSERT(glBindVertexArrayFn != nullptr, ()); GLCHECK(glBindVertexArrayFn(vao)); } void GLFunctions::glDeleteVertexArray(uint32_t vao) { - ASSERT(glDeleteVertexArrayFn != NULL, ()); + ASSERT(glDeleteVertexArrayFn != nullptr, ()); GLCHECK(glDeleteVertexArrayFn(1, &vao)); } uint32_t GLFunctions::glGenBuffer() { - ASSERT(glGenBuffersFn != NULL, ()); + ASSERT(glGenBuffersFn != nullptr, ()); GLuint result = (GLuint)-1; GLCHECK(glGenBuffersFn(1, &result)); return result; @@ -320,7 +613,7 @@ uint32_t GLFunctions::glGenBuffer() void GLFunctions::glBindBuffer(uint32_t vbo, uint32_t target) { - ASSERT(glBindBufferFn != NULL, ()); + ASSERT(glBindBufferFn != nullptr, ()); #ifdef DEBUG threads::MutexGuard guard(g_mutex); g_boundBuffers[make_pair(threads::GetCurrentThreadID(), target)] = vbo; @@ -330,30 +623,32 @@ void GLFunctions::glBindBuffer(uint32_t vbo, uint32_t target) void GLFunctions::glDeleteBuffer(uint32_t vbo) { - ASSERT(glDeleteBuffersFn != NULL, ()); + ASSERT(glDeleteBuffersFn != nullptr, ()); #ifdef DEBUG threads::MutexGuard guard(g_mutex); for (TNode const & n : g_boundBuffers) + { ASSERT(n.second != vbo, ()); + } #endif GLCHECK(glDeleteBuffersFn(1, &vbo)); } void GLFunctions::glBufferData(glConst target, uint32_t size, void const * data, glConst usage) { - ASSERT(glBufferDataFn != NULL, ()); + ASSERT(glBufferDataFn != nullptr, ()); GLCHECK(glBufferDataFn(target, size, data, usage)); } void GLFunctions::glBufferSubData(glConst target, uint32_t size, void const * data, uint32_t offset) { - ASSERT(glBufferSubDataFn != NULL, ()); + ASSERT(glBufferSubDataFn != nullptr, ()); GLCHECK(glBufferSubDataFn(target, offset, size, data)); } void * GLFunctions::glMapBuffer(glConst target) { - ASSERT(glMapBufferFn != NULL, ()); + ASSERT(glMapBufferFn != nullptr, ()); void * result = glMapBufferFn(target, gl_const::GLWriteOnly); GLCHECKCALL(); return result; @@ -361,14 +656,14 @@ void * GLFunctions::glMapBuffer(glConst target) void GLFunctions::glUnmapBuffer(glConst target) { - ASSERT(glUnmapBufferFn != NULL, ()); + ASSERT(glUnmapBufferFn != nullptr, ()); VERIFY(glUnmapBufferFn(target) == GL_TRUE, ()); GLCHECKCALL(); } uint32_t GLFunctions::glCreateShader(glConst type) { - ASSERT(glCreateShaderFn != NULL, ()); + ASSERT(glCreateShaderFn != nullptr, ()); GLuint result = glCreateShaderFn(type); GLCHECKCALL(); return result; @@ -376,7 +671,7 @@ uint32_t GLFunctions::glCreateShader(glConst type) void GLFunctions::glShaderSource(uint32_t shaderID, string const & src) { - ASSERT(glShaderSourceFn != NULL, ()); + ASSERT(glShaderSourceFn != nullptr, ()); GLchar const * source = src.c_str(); GLint length = src.size(); GLCHECK(glShaderSourceFn(shaderID, 1, &source, &length)); @@ -384,9 +679,9 @@ void GLFunctions::glShaderSource(uint32_t shaderID, string const & src) bool GLFunctions::glCompileShader(uint32_t shaderID, string &errorLog) { - ASSERT(glCompileShaderFn != NULL, ()); - ASSERT(glGetShaderivFn != NULL, ()); - ASSERT(glGetShaderInfoLogFn != NULL, ()); + ASSERT(glCompileShaderFn != nullptr, ()); + ASSERT(glGetShaderivFn != nullptr, ()); + ASSERT(glGetShaderInfoLogFn != nullptr, ()); GLCHECK(glCompileShaderFn(shaderID)); GLint result = GL_FALSE; @@ -403,13 +698,13 @@ bool GLFunctions::glCompileShader(uint32_t shaderID, string &errorLog) void GLFunctions::glDeleteShader(uint32_t shaderID) { - ASSERT(glDeleteShaderFn != NULL, ()); + ASSERT(glDeleteShaderFn != nullptr, ()); GLCHECK(glDeleteBuffersFn(1, &shaderID)); } uint32_t GLFunctions::glCreateProgram() { - ASSERT(glCreateProgramFn != NULL, ()); + ASSERT(glCreateProgramFn != nullptr, ()); GLuint result = glCreateProgramFn(); GLCHECKCALL(); return result; @@ -417,21 +712,21 @@ uint32_t GLFunctions::glCreateProgram() void GLFunctions::glAttachShader(uint32_t programID, uint32_t shaderID) { - ASSERT(glAttachShaderFn != NULL, ()); + ASSERT(glAttachShaderFn != nullptr, ()); GLCHECK(glAttachShaderFn(programID, shaderID)); } void GLFunctions::glDetachShader(uint32_t programID, uint32_t shaderID) { - ASSERT(glDetachShaderFn != NULL, ()); + ASSERT(glDetachShaderFn != nullptr, ()); GLCHECK(glDetachShaderFn(programID, shaderID)); } bool GLFunctions::glLinkProgram(uint32_t programID, string & errorLog) { - ASSERT(glLinkProgramFn != NULL, ()); - ASSERT(glGetProgramivFn != NULL, ()); - ASSERT(glGetProgramInfoLogFn != NULL, ()); + ASSERT(glLinkProgramFn != nullptr, ()); + ASSERT(glGetProgramivFn != nullptr, ()); + ASSERT(glGetProgramInfoLogFn != nullptr, ()); GLCHECK(glLinkProgramFn(programID)); GLint result = GL_FALSE; @@ -449,19 +744,18 @@ bool GLFunctions::glLinkProgram(uint32_t programID, string & errorLog) void GLFunctions::glDeleteProgram(uint32_t programID) { - ASSERT(glDeleteProgramFn != NULL, ()); + ASSERT(glDeleteProgramFn != nullptr, ()); GLCHECK(glDeleteProgramFn(programID)); } void GLFunctions::glUseProgram(uint32_t programID) { - ASSERT(glUseProgramFn != NULL, ()); - GLCHECK(glUseProgramFn(programID)); + s_cache.glUseProgram(programID); } int8_t GLFunctions::glGetAttribLocation(uint32_t programID, string const & name) { - ASSERT(glGetAttribLocationFn != NULL, ()); + ASSERT(glGetAttribLocationFn != nullptr, ()); int result = glGetAttribLocationFn(programID, name.c_str()); GLCHECKCALL(); ASSERT(result != -1, ()); @@ -470,13 +764,13 @@ int8_t GLFunctions::glGetAttribLocation(uint32_t programID, string const & name) void GLFunctions::glBindAttribLocation(uint32_t programID, uint8_t index, string const & name) { - ASSERT(glBindAttribLocationFn != NULL, ()); + ASSERT(glBindAttribLocationFn != nullptr, ()); GLCHECK(glBindAttribLocationFn(programID, index, name.c_str())); } void GLFunctions::glEnableVertexAttribute(int attributeLocation) { - ASSERT(glEnableVertexAttributeFn != NULL, ()); + ASSERT(glEnableVertexAttributeFn != nullptr, ()); GLCHECK(glEnableVertexAttributeFn(attributeLocation)); } @@ -487,7 +781,7 @@ void GLFunctions::glVertexAttributePointer(int attrLocation, uint32_t stride, uint32_t offset) { - ASSERT(glVertexAttributePointerFn != NULL, ()); + ASSERT(glVertexAttributePointerFn != nullptr, ()); GLCHECK(glVertexAttributePointerFn(attrLocation, count, type, @@ -499,15 +793,15 @@ void GLFunctions::glVertexAttributePointer(int attrLocation, void GLFunctions::glGetActiveUniform(uint32_t programID, uint32_t uniformIndex, int32_t * uniformSize, glConst * type, string & name) { - ASSERT(glGetActiveUniformFn != NULL, ()); - char buff[256]; - GLCHECK(glGetActiveUniformFn(programID, uniformIndex, 256, NULL, uniformSize, type, buff)); + ASSERT(glGetActiveUniformFn != nullptr, ()); + GLchar buff[256]; + GLCHECK(glGetActiveUniformFn(programID, uniformIndex, ARRAY_SIZE(buff), nullptr, uniformSize, type, buff)); name = buff; } int8_t GLFunctions::glGetUniformLocation(uint32_t programID, string const & name) { - ASSERT(glGetUniformLocationFn != NULL, ()); + ASSERT(glGetUniformLocationFn != nullptr, ()); int result = glGetUniformLocationFn(programID, name.c_str()); GLCHECKCALL(); ASSERT(result != -1, ()); @@ -516,77 +810,73 @@ int8_t GLFunctions::glGetUniformLocation(uint32_t programID, string const & name void GLFunctions::glUniformValuei(int8_t location, int32_t v) { - ASSERT(glUniform1iFn != NULL, ()); - ASSERT(location != -1, ()); - GLCHECK(glUniform1iFn(location, v)); + s_cache.glUniformValuei(location, v); } void GLFunctions::glUniformValuei(int8_t location, int32_t v1, int32_t v2) { - ASSERT(glUniform2iFn != NULL, ()); + ASSERT(glUniform2iFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniform2iFn(location, v1, v2)); } void GLFunctions::glUniformValuei(int8_t location, int32_t v1, int32_t v2, int32_t v3) { - ASSERT(glUniform3iFn != NULL, ()); + ASSERT(glUniform3iFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniform3iFn(location, v1, v2, v3)); } void GLFunctions::glUniformValuei(int8_t location, int32_t v1, int32_t v2, int32_t v3, int32_t v4) { - ASSERT(glUniform4iFn != NULL, ()); + ASSERT(glUniform4iFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniform4iFn(location, v1, v2, v3, v4)); } void GLFunctions::glUniformValueiv(int8_t location, int32_t * v, uint32_t size) { - ASSERT(glUniform1ivFn != NULL, ()); + ASSERT(glUniform1ivFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniform1ivFn(location, size, v)); } void GLFunctions::glUniformValuef(int8_t location, float v) { - ASSERT(glUniform1fFn != NULL, ()); - ASSERT(location != -1, ()); - GLCHECK(glUniform1fFn(location, v)); + s_cache.glUniformValuef(location, v); } void GLFunctions::glUniformValuef(int8_t location, float v1, float v2) { - ASSERT(glUniform2fFn != NULL, ()); + ASSERT(glUniform2fFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniform2fFn(location, v1, v2)); } void GLFunctions::glUniformValuef(int8_t location, float v1, float v2, float v3) { - ASSERT(glUniform3fFn != NULL, ()); + ASSERT(glUniform3fFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniform3fFn(location, v1, v2, v3)); } void GLFunctions::glUniformValuef(int8_t location, float v1, float v2, float v3, float v4) { - ASSERT(glUniform4fFn != NULL, ()); + ASSERT(glUniform4fFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniform4fFn(location, v1, v2, v3, v4)); } void GLFunctions::glUniformValuefv(int8_t location, float * v, uint32_t size) { - ASSERT(glUniform1fvFn != NULL, ()); + ASSERT(glUniform1fvFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniform1fvFn(location, size, v)); } void GLFunctions::glUniformMatrix4x4Value(int8_t location, float const * values) { - ASSERT(glUniformMatrix4fvFn != NULL, ()); + ASSERT(glUniformMatrix4fvFn != nullptr, ()); ASSERT(location != -1, ()); GLCHECK(glUniformMatrix4fvFn(location, 1, GL_FALSE, values)); } @@ -600,7 +890,7 @@ uint32_t GLFunctions::glGetCurrentProgram() int32_t GLFunctions::glGetProgramiv(uint32_t program, glConst paramName) { - ASSERT(glGetProgramivFn != NULL, ()); + ASSERT(glGetProgramivFn != nullptr, ()); GLint paramValue = 0; GLCHECK(glGetProgramivFn(program, paramName, ¶mValue)); return paramValue; @@ -608,7 +898,7 @@ int32_t GLFunctions::glGetProgramiv(uint32_t program, glConst paramName) void GLFunctions::glActiveTexture(glConst texBlock) { - GLCHECK(::glActiveTexture(texBlock)); + s_cache.glActiveTexture(texBlock); } uint32_t GLFunctions::glGenTexture() @@ -625,7 +915,7 @@ void GLFunctions::glDeleteTexture(uint32_t id) void GLFunctions::glBindTexture(uint32_t textureID) { - GLCHECK(::glBindTexture(GL_TEXTURE_2D, textureID)); + s_cache.glBindTexture(textureID); } void GLFunctions::glTexImage2D(int width, int height, glConst layout, glConst pixelType, void const * data) @@ -643,17 +933,40 @@ void GLFunctions::glTexParameter(glConst param, glConst value) GLCHECK(::glTexParameteri(GL_TEXTURE_2D, param, value)); } -void GLFunctions::glDrawElements(uint16_t indexCount) +void GLFunctions::glDrawElements(uint32_t sizeOfIndex, uint32_t indexCount, uint32_t startIndex) { - GLCHECK(::glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0)); + GLCHECK(::glDrawElements(GL_TRIANGLES, indexCount, sizeOfIndex == sizeof(uint32_t) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT, + reinterpret_cast(startIndex * sizeOfIndex))); } -void CheckGLError() +void GLFunctions::glDrawArrays(glConst mode, int32_t first, uint32_t count) +{ + GLCHECK(::glDrawArrays(mode, first, count)); +} + +namespace +{ + +string GetGLError(GLenum error) +{ + switch (error) + { + case GL_INVALID_ENUM: return "GL_INVALID_ENUM"; + case GL_INVALID_VALUE: return "GL_INVALID_VALUE"; + case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION"; + case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY"; + default: return strings::to_string(error); + } +} + +} // namespace + +void CheckGLError(my::SrcPoint const & srcPoint) { GLenum result = glGetError(); while (result != GL_NO_ERROR) { - LOG(LERROR, ("GLError:", result)); + LOG(LINFO, ("SrcPoint ", srcPoint, "GLError:", GetGLError(result))); result = glGetError(); } } diff --git a/drape/glfunctions.hpp b/drape/glfunctions.hpp index 5dbc544a30..d2b479bf5a 100644 --- a/drape/glfunctions.hpp +++ b/drape/glfunctions.hpp @@ -1,23 +1,41 @@ #pragma once #include "drape/glconstants.hpp" + +#include "base/src_point.hpp" + #include "std/string.hpp" +#include "std/thread.hpp" class GLFunctions { + friend class GLFunctionsCache; + public: static void Init(); + /// Attaches cache of gl-functions to specified thread. The only cache + /// is available, so invoking of this method on other thread leads to + /// disabling of current cache and enabling another + static void AttachCache(thread::id const & threadId); + static bool glHasExtension(string const & name); static void glClearColor(float r, float g, float b, float a); static void glClear(); static void glClearDepth(); static void glViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h); static void glFlush(); + static void glFinish(); + + static void glFrontFace(glConst mode); + static void glCullFace(glConst face); static void glPixelStore(glConst name, uint32_t value); static int32_t glGetInteger(glConst pname); + /// target = { gl_const::GLArrayBuffer, gl_const::GLElementArrayBuffer } + /// name = { gl_const::GLBufferSize, gl_const::GLBufferUsage } + static int32_t glGetBufferParameter(glConst target, glConst name); static void glEnable(glConst mode); static void glDisable(glConst mode); @@ -111,10 +129,16 @@ public: static void glTexParameter(glConst param, glConst value); // Draw support - static void glDrawElements(uint16_t indexCount); + static void glDrawElements(uint32_t sizeOfIndex, uint32_t indexCount, uint32_t startIndex = 0); + static void glDrawArrays(glConst mode, int32_t first, uint32_t count); }; -void CheckGLError(); +void CheckGLError(my::SrcPoint const &src); -#define GLCHECK(x) do { (x); CheckGLError(); } while (false) -#define GLCHECKCALL() do { CheckGLError(); } while (false) +#ifdef DEBUG + #define GLCHECK(x) do { (x); CheckGLError(SRC()); } while (false) + #define GLCHECKCALL() do { CheckGLError(SRC()); } while (false) +#else + #define GLCHECK(x) (x) + #define GLCHECKCALL() +#endif diff --git a/drape/glsl_func.hpp b/drape/glsl_func.hpp index 9e97fbb050..0a45cb70da 100644 --- a/drape/glsl_func.hpp +++ b/drape/glsl_func.hpp @@ -5,6 +5,8 @@ #include #include +#include + namespace glsl { @@ -17,6 +19,7 @@ using glm::distance; using glm::translate; using glm::rotate; using glm::scale; +using glm::transpose; using glm::value_ptr; diff --git a/drape/glsl_types.hpp b/drape/glsl_types.hpp index fb3244bf69..48f3a27092 100644 --- a/drape/glsl_types.hpp +++ b/drape/glsl_types.hpp @@ -2,6 +2,8 @@ #include "geometry/point2d.hpp" +#include "drape/color.hpp" + #include #include #include @@ -54,11 +56,24 @@ inline vec2 ToVec2(m2::PointD const & pt) return glsl::vec2(pt.x, pt.y); } +inline vec4 ToVec4(dp::Color const & color) +{ + return glsl::vec4(double(color.GetRed()) / 255, + double(color.GetGreen()) / 255, + double(color.GetBlue()) / 255, + double(color.GetAlfa()) / 255); +} + +template::value || is_floating_point::value>::type> +inline uint8_t GetArithmeticComponentCount() +{ + return 1; +} + template inline uint8_t GetComponentCount() { - ASSERT(false, ()); - return 0; + return GetArithmeticComponentCount(); } template <> diff --git a/drape/glstate.cpp b/drape/glstate.cpp index 495cf9f193..d8e89834fe 100644 --- a/drape/glstate.cpp +++ b/drape/glstate.cpp @@ -9,52 +9,71 @@ namespace dp { -Blending::Blending(bool isEnabled) - : m_isEnabled(isEnabled) - , m_blendFunction(gl_const::GLAddBlend) +BlendingParams::BlendingParams() + : m_blendFunction(gl_const::GLAddBlend) , m_blendSrcFactor(gl_const::GLSrcAlfa) , m_blendDstFactor(gl_const::GLOneMinusSrcAlfa) { } +void BlendingParams::Apply() const +{ + GLFunctions::glBlendEquation(m_blendFunction); + GLFunctions::glBlendFunc(m_blendSrcFactor, m_blendDstFactor); +} + +Blending::Blending(bool isEnabled) + : m_isEnabled(isEnabled) +{} + void Blending::Apply() const { if (m_isEnabled) - { GLFunctions::glEnable(gl_const::GLBlending); - GLFunctions::glBlendEquation(m_blendFunction); - GLFunctions::glBlendFunc(m_blendSrcFactor, m_blendDstFactor); - } else GLFunctions::glDisable(gl_const::GLBlending); } bool Blending::operator < (Blending const & other) const { - if (m_isEnabled != other.m_isEnabled) - return m_isEnabled < other.m_isEnabled; - if (m_blendFunction != other.m_blendFunction) - return m_blendFunction < other.m_blendFunction; - if (m_blendSrcFactor != other.m_blendSrcFactor) - return m_blendSrcFactor < other.m_blendSrcFactor; - - return m_blendDstFactor < other.m_blendDstFactor; + return m_isEnabled < other.m_isEnabled; } bool Blending::operator == (Blending const & other) const { - return m_isEnabled == other.m_isEnabled && - m_blendFunction == other.m_blendFunction && - m_blendSrcFactor == other.m_blendSrcFactor && - m_blendDstFactor == other.m_blendDstFactor; + return m_isEnabled == other.m_isEnabled; } GLState::GLState(uint32_t gpuProgramIndex, DepthLayer depthLayer) : m_gpuProgramIndex(gpuProgramIndex) , m_depthLayer(depthLayer) + , m_depthFunction(gl_const::GLLessOrEqual) + , m_textureFilter(gl_const::GLLinear) + , m_colorTexture(nullptr) + , m_maskTexture(nullptr) { } +glConst GLState::GetDepthFunction() const +{ + return m_depthFunction; +} + +void GLState::SetDepthFunction(glConst functionName) +{ + m_depthFunction = functionName; +} + +glConst GLState::GetTextureFilter() const +{ + return m_textureFilter; +} + +void GLState::SetTextureFilter(glConst filter) +{ + m_textureFilter = filter; +} + bool GLState::operator<(GLState const & other) const { if (m_depthLayer != other.m_depthLayer) @@ -63,10 +82,10 @@ bool GLState::operator<(GLState const & other) const return m_blending < other.m_blending; if (m_gpuProgramIndex != other.m_gpuProgramIndex) return m_gpuProgramIndex < other.m_gpuProgramIndex; - if (m_colorTexture.GetRaw() != other.m_colorTexture.GetRaw()) - return m_colorTexture.GetRaw() < other.m_colorTexture.GetRaw(); + if (m_colorTexture != other.m_colorTexture) + return m_colorTexture < other.m_colorTexture; - return m_maskTexture.GetRaw() < other.m_maskTexture.GetRaw(); + return m_maskTexture < other.m_maskTexture; } bool GLState::operator==(GLState const & other) const @@ -80,37 +99,72 @@ bool GLState::operator==(GLState const & other) const namespace { - void ApplyUniformValue(UniformValue const & value, RefPointer program) + void ApplyUniformValue(UniformValue const & value, ref_ptr program) { value.Apply(program); } } -void ApplyUniforms(UniformValuesStorage const & uniforms, RefPointer program) +void ApplyUniforms(UniformValuesStorage const & uniforms, ref_ptr program) { uniforms.ForeachValue(bind(&ApplyUniformValue, _1, program)); } -void ApplyState(GLState state, RefPointer program) +void ApplyTextures(GLState state, ref_ptr program) { - RefPointer tex = state.GetColorTexture(); - if (!tex.IsNull()) + ref_ptr tex = state.GetColorTexture(); + if (tex != nullptr) { int8_t const colorTexLoc = program->GetUniformLocation("u_colorTex"); GLFunctions::glActiveTexture(gl_const::GLTexture0); tex->Bind(); GLFunctions::glUniformValuei(colorTexLoc, 0); + tex->SetFilter(state.GetTextureFilter()); + } + else + { + // Some Android devices (Galaxy Nexus) require to reset texture state explicitly. + // It's caused by a bug in OpenGL driver (for Samsung Nexus, maybe others). Normally + // we don't need to explicitly call glBindTexture(GL_TEXTURE2D, 0) after glUseProgram + // in case of the GPU-program doesn't use textures. Here we have to do it to work around + // graphics artefacts. The overhead isn't significant, we don't know on which devices + // it may happen so do it for all Android devices. +#ifdef OMIM_OS_ANDROID + GLFunctions::glActiveTexture(gl_const::GLTexture0); + GLFunctions::glBindTexture(0); +#endif } tex = state.GetMaskTexture(); - if (!tex.IsNull()) + if (tex != nullptr) { int8_t const maskTexLoc = program->GetUniformLocation("u_maskTex"); GLFunctions::glActiveTexture(gl_const::GLTexture0 + 1); tex->Bind(); GLFunctions::glUniformValuei(maskTexLoc, 1); + tex->SetFilter(state.GetTextureFilter()); } + else + { + // Some Android devices (Galaxy Nexus) require to reset texture state explicitly. + // See detailed description above. +#ifdef OMIM_OS_ANDROID + GLFunctions::glActiveTexture(gl_const::GLTexture0 + 1); + GLFunctions::glBindTexture(0); +#endif + } +} + +void ApplyBlending(GLState state, ref_ptr program) +{ state.GetBlending().Apply(); } +void ApplyState(GLState state, ref_ptr program) +{ + ApplyTextures(state, program); + ApplyBlending(state, program); + GLFunctions::glDepthFunc(state.GetDepthFunction()); +} + } diff --git a/drape/glstate.hpp b/drape/glstate.hpp index 32da30401e..e5a4e481e5 100644 --- a/drape/glstate.hpp +++ b/drape/glstate.hpp @@ -8,9 +8,20 @@ namespace dp { +struct BlendingParams +{ + BlendingParams(); + + void Apply() const; + + glConst m_blendFunction; + glConst m_blendSrcFactor; + glConst m_blendDstFactor; +}; + struct Blending { - Blending(bool isEnabled = false); + Blending(bool isEnabled = true); void Apply() const; @@ -18,9 +29,6 @@ struct Blending bool operator == (Blending const & other) const; bool m_isEnabled; - glConst m_blendFunction; - glConst m_blendSrcFactor; - glConst m_blendDstFactor; }; class GLState @@ -31,24 +39,32 @@ public: /// Do not change order GeometryLayer, DynamicGeometry, - OverlayLayer + OverlayLayer, + UserMarkLayer, + Gui }; GLState(uint32_t gpuProgramIndex, DepthLayer depthLayer); DepthLayer const & GetDepthLayer() const { return m_depthLayer; } - void SetColorTexture(RefPointer tex) { m_colorTexture = tex; } - RefPointer GetColorTexture() const { return m_colorTexture; } + void SetColorTexture(ref_ptr tex) { m_colorTexture = tex; } + ref_ptr GetColorTexture() const { return m_colorTexture; } - void SetMaskTexture(RefPointer tex) { m_maskTexture = tex; } - RefPointer GetMaskTexture() const { return m_maskTexture; } + void SetMaskTexture(ref_ptr tex) { m_maskTexture = tex; } + ref_ptr GetMaskTexture() const { return m_maskTexture; } void SetBlending(Blending const & blending) { m_blending = blending; } Blending const & GetBlending() const { return m_blending; } int GetProgramIndex() const { return m_gpuProgramIndex; } + glConst GetDepthFunction() const; + void SetDepthFunction(glConst functionName); + + glConst GetTextureFilter() const; + void SetTextureFilter(glConst filter); + bool operator<(GLState const & other) const; bool operator==(GLState const & other) const; @@ -56,12 +72,16 @@ private: uint32_t m_gpuProgramIndex; DepthLayer m_depthLayer; Blending m_blending; + glConst m_depthFunction; + glConst m_textureFilter; - RefPointer m_colorTexture; - RefPointer m_maskTexture; + ref_ptr m_colorTexture; + ref_ptr m_maskTexture; }; -void ApplyUniforms(UniformValuesStorage const & uniforms, RefPointer program); -void ApplyState(GLState state, RefPointer program); +void ApplyUniforms(UniformValuesStorage const & uniforms, ref_ptr program); +void ApplyState(GLState state, ref_ptr program); +void ApplyTextures(GLState state, ref_ptr program); +void ApplyBlending(GLState state, ref_ptr program); } // namespace dp diff --git a/drape/glyph_manager.cpp b/drape/glyph_manager.cpp index d1640318bf..19f0f4b79a 100644 --- a/drape/glyph_manager.cpp +++ b/drape/glyph_manager.cpp @@ -10,6 +10,9 @@ #include "base/math.hpp" #include "base/timer.hpp" +#include "std/unique_ptr.hpp" +#include "std/unordered_set.hpp" + #include #include FT_TYPES_H #include FT_SYSTEM_H @@ -26,7 +29,9 @@ { int m_code; char const * m_message; - } g_FT_Errors[] + }; + + FreetypeError g_FT_Errors[] = #include FT_ERRORS_H #define FREETYPE_CHECK(x) \ @@ -58,8 +63,8 @@ namespace dp namespace { -int const SDF_SCALE_FACTOR = 4; -int const SDF_BORDER = 4 * SDF_SCALE_FACTOR; +uint32_t const kSdfBorder = 4; +int const kInvalidFont = -1; template void ParseUniBlocks(string const & uniBlocksFile, ToDo toDo) @@ -119,8 +124,9 @@ void ParseFontList(string const & fontListFile, ToDo toDo) class Font { public: - Font(ReaderPtr fontReader, FT_Library lib) + Font(uint32_t sdfScale, ReaderPtr fontReader, FT_Library lib) : m_fontReader(fontReader) + , m_sdfScale(sdfScale) { m_stream.base = 0; m_stream.size = m_fontReader.Size(); @@ -159,7 +165,7 @@ public: GlyphManager::Glyph GetGlyph(strings::UniChar unicodePoint, uint32_t baseHeight) const { - FREETYPE_CHECK(FT_Set_Pixel_Sizes(m_fontFace, SDF_SCALE_FACTOR * baseHeight, SDF_SCALE_FACTOR * baseHeight)); + FREETYPE_CHECK(FT_Set_Pixel_Sizes(m_fontFace, m_sdfScale * baseHeight, m_sdfScale * baseHeight)); FREETYPE_CHECK(FT_Load_Glyph(m_fontFace, FT_Get_Char_Index(m_fontFace, unicodePoint), FT_LOAD_RENDER)); FT_Glyph glyph; @@ -170,47 +176,76 @@ public: FT_Bitmap bitmap = m_fontFace->glyph->bitmap; + float const scale = 1.0f / m_sdfScale; + SharedBufferManager::shared_buffer_ptr_t data; - size_t bufferSize = 0; - int imgWidth = bitmap.width; - int imgHeigh = bitmap.rows; + int imageWidth = bitmap.width; + int imageHeight = bitmap.rows; if (bitmap.buffer != nullptr) { - SdfImage img(bitmap.rows, bitmap.pitch, bitmap.buffer, SDF_BORDER); - img.GenerateSDF(1.0f / (float)SDF_SCALE_FACTOR); + sdf_image::SdfImage img(bitmap.rows, bitmap.pitch, bitmap.buffer, m_sdfScale * kSdfBorder); + imageWidth = img.GetWidth() * scale; + imageHeight = img.GetHeight() * scale; - imgWidth = img.GetWidth(); - imgHeigh = img.GetHeight(); - - size_t byteSize = imgWidth * imgHeigh; - bufferSize = my::NextPowOf2(byteSize); + size_t bufferSize = bitmap.rows * bitmap.pitch; data = SharedBufferManager::instance().reserveSharedBuffer(bufferSize); - - img.GetData(*data); + memcpy(&(*data)[0], bitmap.buffer, bufferSize); } GlyphManager::Glyph result; result.m_image = GlyphManager::GlyphImage { - imgWidth, - imgHeigh, + imageWidth, imageHeight, + static_cast(bitmap.rows), bitmap.pitch, data }; result.m_metrics = GlyphManager::GlyphMetrics { - static_cast(glyph->advance.x >> 16) / SDF_SCALE_FACTOR, - static_cast(glyph->advance.y >> 16) / SDF_SCALE_FACTOR, - static_cast(bbox.xMin) / SDF_SCALE_FACTOR, - static_cast(bbox.yMin) / SDF_SCALE_FACTOR, + static_cast(glyph->advance.x >> 16) * scale, + static_cast(glyph->advance.y >> 16) * scale, + static_cast(bbox.xMin) * scale, + static_cast(bbox.yMin) * scale, true }; + result.m_code = unicodePoint; + FT_Done_Glyph(glyph); return result; } + GlyphManager::Glyph GenerateGlyph(GlyphManager::Glyph const & glyph) const + { + if (glyph.m_image.m_data != nullptr) + { + GlyphManager::Glyph resultGlyph; + resultGlyph.m_metrics = glyph.m_metrics; + resultGlyph.m_fontIndex = glyph.m_fontIndex; + resultGlyph.m_code = glyph.m_code; + + sdf_image::SdfImage img(glyph.m_image.m_bitmapRows, glyph.m_image.m_bitmapPitch, + glyph.m_image.m_data->data(), m_sdfScale * kSdfBorder); + + img.GenerateSDF(1.0f / (float)m_sdfScale); + + ASSERT(img.GetWidth() == glyph.m_image.m_width, ()); + ASSERT(img.GetHeight() == glyph.m_image.m_height, ()); + + size_t bufferSize = my::NextPowOf2(glyph.m_image.m_width * glyph.m_image.m_height); + resultGlyph.m_image.m_width = glyph.m_image.m_width; + resultGlyph.m_image.m_height = glyph.m_image.m_height; + resultGlyph.m_image.m_bitmapRows = 0; + resultGlyph.m_image.m_bitmapPitch = 0; + resultGlyph.m_image.m_data = SharedBufferManager::instance().reserveSharedBuffer(bufferSize); + + img.GetData(*resultGlyph.m_image.m_data); + return resultGlyph; + } + return glyph; + } + void GetCharcodes(vector & charcodes) { FT_UInt gindex; @@ -235,10 +270,23 @@ public: static void Close(FT_Stream){} + void MarkGlyphReady(strings::UniChar code) + { + m_readyGlyphs.insert(code); + } + + bool IsGlyphReady(strings::UniChar code) const + { + return m_readyGlyphs.find(code) != m_readyGlyphs.end(); + } + private: ReaderPtr m_fontReader; FT_StreamRec_ m_stream; FT_Face m_fontFace; + uint32_t m_sdfScale; + + unordered_set m_readyGlyphs; }; } @@ -261,13 +309,15 @@ struct UnicodeBlock int GetFontOffset(int idx) const { - ASSERT(!m_fontsWeight.empty(), ()); + if (m_fontsWeight.empty()) + return kInvalidFont; + int maxWight = 0; int upperBoundWeight = numeric_limits::max(); - if (idx != -1) + if (idx != kInvalidFont) upperBoundWeight = m_fontsWeight[idx]; - int index = -1; + int index = kInvalidFont; for (size_t i = 0; i < m_fontsWeight.size(); ++i) { int w = m_fontsWeight[i]; @@ -295,7 +345,7 @@ struct GlyphManager::Impl FT_Library m_library; TUniBlocks m_blocks; TUniBlockIter m_lastUsedBlock; - vector m_fonts; + vector> m_fonts; uint32_t m_baseGlyphHeight; }; @@ -346,8 +396,8 @@ GlyphManager::GlyphManager(GlyphManager::Params const & params) vector charCodes; try { - m_impl->m_fonts.emplace_back(GetPlatform().GetReader(fontName), m_impl->m_library); - m_impl->m_fonts.back().GetCharcodes(charCodes); + m_impl->m_fonts.emplace_back(make_unique(params.m_sdfScale, GetPlatform().GetReader(fontName), m_impl->m_library)); + m_impl->m_fonts.back()->GetCharcodes(charCodes); } catch(RootException const & e) { @@ -424,18 +474,20 @@ GlyphManager::GlyphManager(GlyphManager::Params const & params) GlyphManager::~GlyphManager() { - for (Font & f : m_impl->m_fonts) - f.DestroyFont(); + for (auto const & f : m_impl->m_fonts) + f->DestroyFont(); FREETYPE_CHECK(FT_Done_FreeType(m_impl->m_library)); delete m_impl; } -GlyphManager::Glyph GlyphManager::GetGlyph(strings::UniChar unicodePoint) +int GlyphManager::GetFontIndex(strings::UniChar unicodePoint) { TUniBlockIter iter = m_impl->m_blocks.end(); if (m_impl->m_lastUsedBlock != m_impl->m_blocks.end() && m_impl->m_lastUsedBlock->HasSymbol(unicodePoint)) + { iter = m_impl->m_lastUsedBlock; + } else { if (iter == m_impl->m_blocks.end() || !iter->HasSymbol(unicodePoint)) @@ -449,27 +501,59 @@ GlyphManager::Glyph GlyphManager::GetGlyph(strings::UniChar unicodePoint) } if (iter == m_impl->m_blocks.end() || !iter->HasSymbol(unicodePoint)) - return GetInvalidGlyph(); + return kInvalidFont; m_impl->m_lastUsedBlock = iter; - int fontIndex = -1; - UnicodeBlock const & block = *iter; - ASSERT(block.HasSymbol(unicodePoint), ()); - do + return FindFontIndexInBlock(*m_impl->m_lastUsedBlock, unicodePoint); +} + +int GlyphManager::GetFontIndexImmutable(strings::UniChar unicodePoint) const +{ + TUniBlockIter iter = lower_bound(m_impl->m_blocks.begin(), m_impl->m_blocks.end(), unicodePoint, + [](UnicodeBlock const & block, strings::UniChar const & v) { - if (fontIndex != -1) - { - ASSERT_LESS(fontIndex, m_impl->m_fonts.size(), ()); - Font const & f = m_impl->m_fonts[fontIndex]; - if (f.HasGlyph(unicodePoint)) - return f.GetGlyph(unicodePoint, m_impl->m_baseGlyphHeight); - } + return block.m_end < v; + }); - fontIndex = block.GetFontOffset(fontIndex); - } while(fontIndex != -1); + if (iter == m_impl->m_blocks.end() || !iter->HasSymbol(unicodePoint)) + return kInvalidFont; - return GetInvalidGlyph(); + return FindFontIndexInBlock(*iter, unicodePoint); +} + +int GlyphManager::FindFontIndexInBlock(UnicodeBlock const & block, strings::UniChar unicodePoint) const +{ + ASSERT(block.HasSymbol(unicodePoint), ()); + for (int fontIndex = block.GetFontOffset(kInvalidFont); fontIndex != kInvalidFont; fontIndex = block.GetFontOffset(fontIndex)) + { + ASSERT_LESS(fontIndex, m_impl->m_fonts.size(), ()); + auto const & f = m_impl->m_fonts[fontIndex]; + if (f->HasGlyph(unicodePoint)) + return fontIndex; + } + + return kInvalidFont; +} + +GlyphManager::Glyph GlyphManager::GetGlyph(strings::UniChar unicodePoint) +{ + int const fontIndex = GetFontIndex(unicodePoint); + if (fontIndex == kInvalidFont) + return GetInvalidGlyph(); + + auto const & f = m_impl->m_fonts[fontIndex]; + Glyph glyph = f->GetGlyph(unicodePoint, m_impl->m_baseGlyphHeight); + glyph.m_fontIndex = fontIndex; + return glyph; +} + +GlyphManager::Glyph GlyphManager::GenerateGlyph(Glyph const & glyph) const +{ + ASSERT_NOT_EQUAL(glyph.m_fontIndex, -1, ()); + ASSERT_LESS(glyph.m_fontIndex, m_impl->m_fonts.size(), ()); + auto const & f = m_impl->m_fonts[glyph.m_fontIndex]; + return f->GenerateGlyph(glyph); } void GlyphManager::ForEachUnicodeBlock(GlyphManager::TUniBlockCallback const & fn) const @@ -478,16 +562,43 @@ void GlyphManager::ForEachUnicodeBlock(GlyphManager::TUniBlockCallback const & f fn(uni.m_start, uni.m_end); } +void GlyphManager::MarkGlyphReady(Glyph const & glyph) +{ + ASSERT_GREATER_OR_EQUAL(glyph.m_fontIndex, 0, ()); + ASSERT_LESS(glyph.m_fontIndex, m_impl->m_fonts.size(), ()); + m_impl->m_fonts[glyph.m_fontIndex]->MarkGlyphReady(glyph.m_code); +} + +bool GlyphManager::AreGlyphsReady(strings::UniString const & str) const +{ + for (auto const & code : str) + { + int const fontIndex = GetFontIndexImmutable(code); + if (fontIndex == kInvalidFont) + continue; + + if (!m_impl->m_fonts[fontIndex]->IsGlyphReady(code)) + return false; + } + + return true; +} + GlyphManager::Glyph GlyphManager::GetInvalidGlyph() const { + strings::UniChar const kInvalidGlyphCode = 0x9; + int const kFontId = 0; + static bool s_inited = false; static Glyph s_glyph; if (!s_inited) { ASSERT(!m_impl->m_fonts.empty(), ()); - s_glyph = m_impl->m_fonts[0].GetGlyph(0x9, m_impl->m_baseGlyphHeight); + s_glyph = m_impl->m_fonts[kFontId]->GetGlyph(kInvalidGlyphCode, m_impl->m_baseGlyphHeight); s_glyph.m_metrics.m_isValid = false; + s_glyph.m_fontIndex = kFontId; + s_glyph.m_code = kInvalidGlyphCode; s_inited = true; } diff --git a/drape/glyph_manager.hpp b/drape/glyph_manager.hpp index 9102c6c13e..0e2b8c2cf6 100644 --- a/drape/glyph_manager.hpp +++ b/drape/glyph_manager.hpp @@ -12,6 +12,8 @@ namespace dp { +struct UnicodeBlock; + class GlyphManager { public: @@ -24,6 +26,7 @@ public: vector m_fonts; uint32_t m_baseGlyphHeight = 20; + uint32_t m_sdfScale = 4; }; struct GlyphMetrics @@ -39,17 +42,24 @@ public: { ~GlyphImage() { - ASSERT(!m_data.unique(), ()); + ASSERT(!m_data.unique(), ("Probably you forgot to call Destroy()")); } void Destroy() { - SharedBufferManager::instance().freeSharedBuffer(m_data->size(), m_data); + if (m_data != nullptr) + { + SharedBufferManager::instance().freeSharedBuffer(m_data->size(), m_data); + m_data = nullptr; + } } int m_width; int m_height; + int m_bitmapRows; + int m_bitmapPitch; + SharedBufferManager::shared_buffer_ptr_t m_data; }; @@ -57,19 +67,30 @@ public: { GlyphMetrics m_metrics; GlyphImage m_image; + int m_fontIndex; + strings::UniChar m_code; }; GlyphManager(Params const & params); ~GlyphManager(); Glyph GetGlyph(strings::UniChar unicodePoints); + Glyph GenerateGlyph(Glyph const & glyph) const; + + void MarkGlyphReady(Glyph const & glyph); + bool AreGlyphsReady(strings::UniString const & str) const; typedef function TUniBlockCallback; void ForEachUnicodeBlock(TUniBlockCallback const & fn) const; -private: Glyph GetInvalidGlyph() const; +private: + int GetFontIndex(strings::UniChar unicodePoint); + // Immutable version can be called from any thread and doesn't require internal synchronization. + int GetFontIndexImmutable(strings::UniChar unicodePoint) const; + int FindFontIndexInBlock(UnicodeBlock const & block, strings::UniChar unicodePoint) const; + private: struct Impl; Impl * m_impl; diff --git a/drape/gpu_buffer.cpp b/drape/gpu_buffer.cpp index 5577ec860d..5d91dc06f2 100644 --- a/drape/gpu_buffer.cpp +++ b/drape/gpu_buffer.cpp @@ -1,11 +1,14 @@ #include "drape/gpu_buffer.hpp" #include "drape/glfunctions.hpp" #include "drape/glextensions_list.hpp" +#include "drape/utils/gpu_mem_tracker.hpp" #include "base/assert.hpp" #include "std/cstring.hpp" +//#define CHECK_VBO_BOUNDS + namespace dp { @@ -26,33 +29,47 @@ glConst glTarget(GPUBuffer::Target t) return gl_const::GLElementArrayBuffer; } -GPUBuffer::GPUBuffer(Target t, uint8_t elementSize, uint16_t capacity) - : base_t(elementSize, capacity) +GPUBuffer::GPUBuffer(Target t, void const * data, uint8_t elementSize, uint32_t capacity) + : TBase(elementSize, capacity) , m_t(t) #ifdef DEBUG , m_isMapped(false) #endif { m_bufferID = GLFunctions::glGenBuffer(); - Resize(capacity); + Resize(data, capacity); } - GPUBuffer::~GPUBuffer() { GLFunctions::glBindBuffer(0, glTarget(m_t)); GLFunctions::glDeleteBuffer(m_bufferID); + +#if defined(TRACK_GPU_MEM) + dp::GPUMemTracker::Inst().RemoveDeallocated("VBO", m_bufferID); +#endif } -void GPUBuffer::UploadData(void const * data, uint16_t elementCount) +void GPUBuffer::UploadData(void const * data, uint32_t elementCount) { ASSERT(m_isMapped == false, ()); - uint16_t currentSize = GetCurrentSize(); + uint32_t currentSize = GetCurrentSize(); uint8_t elementSize = GetElementSize(); ASSERT(GetCapacity() >= elementCount + currentSize, ("Not enough memory to upload ", elementCount, " elements")); Bind(); + +#if defined(CHECK_VBO_BOUNDS) + int32_t size = GLFunctions::glGetBufferParameter(glTarget(m_t), gl_const::GLBufferSize); + ASSERT_EQUAL(GetCapacity() * elementSize, size, ()); + ASSERT_LESS_OR_EQUAL((elementCount + currentSize) * elementSize, size,()); +#endif + GLFunctions::glBufferSubData(glTarget(m_t), elementCount * elementSize, data, currentSize * elementSize); - base_t::UploadData(elementCount); + TBase::UploadData(elementCount); + +#if defined(TRACK_GPU_MEM) + dp::GPUMemTracker::Inst().SetUsed("VBO", m_bufferID, (currentSize + elementCount) * elementSize); +#endif } void GPUBuffer::Bind() @@ -73,12 +90,20 @@ void * GPUBuffer::Map() return NULL; } -void GPUBuffer::UpdateData(void * gpuPtr, void const * data, uint16_t elementOffset, uint16_t elementCount) +void GPUBuffer::UpdateData(void * gpuPtr, void const * data, uint32_t elementOffset, uint32_t elementCount) { - uint16_t const elementSize = GetElementSize(); - uint32_t const byteOffset = elementOffset * (uint32_t)elementSize; - uint32_t const byteCount = elementCount * (uint32_t)elementSize; + uint32_t const elementSize = GetElementSize(); + uint32_t const byteOffset = elementOffset * elementSize; + uint32_t const byteCount = elementCount * elementSize; + uint32_t const byteCapacity = GetCapacity() * elementSize; ASSERT(m_isMapped == true, ()); + +#if defined(CHECK_VBO_BOUNDS) + int32_t size = GLFunctions::glGetBufferParameter(glTarget(m_t), gl_const::GLBufferSize); + ASSERT_EQUAL(size, byteCapacity, ()); + ASSERT_LESS(byteOffset + byteCount, size, ()); +#endif + if (IsMapBufferSupported()) { ASSERT(gpuPtr != NULL, ()); @@ -87,7 +112,7 @@ void GPUBuffer::UpdateData(void * gpuPtr, void const * data, uint16_t elementOff else { ASSERT(gpuPtr == NULL, ()); - if (byteOffset == 0 && byteCount == GetCapacity()) + if (byteOffset == 0 && byteCount == byteCapacity) GLFunctions::glBufferData(glTarget(m_t), byteCount, data, gl_const::GLStaticDraw); else GLFunctions::glBufferSubData(glTarget(m_t), byteCount, data, byteOffset); @@ -104,60 +129,23 @@ void GPUBuffer::Unmap() GLFunctions::glUnmapBuffer(glTarget(m_t)); } -void GPUBuffer::Resize(uint16_t elementCount) +void GPUBuffer::Resize(void const * data, uint32_t elementCount) { - base_t::Resize(elementCount); + TBase::Resize(elementCount); Bind(); - GLFunctions::glBufferData(glTarget(m_t), GetCapacity() * GetElementSize(), NULL, gl_const::GLStaticDraw); -} + GLFunctions::glBufferData(glTarget(m_t), GetCapacity() * GetElementSize(), data, gl_const::GLDynamicDraw); -//////////////////////////////////////////////////////////////////////////// -GPUBufferMapper::GPUBufferMapper(RefPointer buffer) - : m_buffer(buffer) -{ -#ifdef DEBUG - if (m_buffer->m_t == GPUBuffer::ElementBuffer) - { - ASSERT(m_mappedDataBuffer == 0, ()); - m_mappedDataBuffer = m_buffer->m_bufferID; - } - else - { - ASSERT(m_mappedIndexBuffer == 0, ()); - m_mappedIndexBuffer = m_buffer->m_bufferID; - } + // if we have set up data already (in glBufferData), we have to call SetDataSize + if (data != nullptr) + SetDataSize(elementCount); + +#if defined(TRACK_GPU_MEM) + dp::GPUMemTracker & memTracker = dp::GPUMemTracker::Inst(); + memTracker.RemoveDeallocated("VBO", m_bufferID); + memTracker.AddAllocated("VBO", m_bufferID, GetCapacity() * GetElementSize()); + if (data != nullptr) + dp::GPUMemTracker::Inst().SetUsed("VBO", m_bufferID, GetCurrentSize() * GetElementSize()); #endif - - m_buffer->Bind(); - m_gpuPtr = m_buffer->Map(); } -GPUBufferMapper::~GPUBufferMapper() -{ -#ifdef DEBUG - if (m_buffer->m_t == GPUBuffer::ElementBuffer) - { - ASSERT(m_mappedDataBuffer == m_buffer->m_bufferID, ()); - m_mappedDataBuffer = 0; - } - else - { - ASSERT(m_mappedIndexBuffer == m_buffer->m_bufferID, ()); - m_mappedIndexBuffer = 0; - } -#endif - - m_buffer->Unmap(); -} - -void GPUBufferMapper::UpdateData(void const * data, uint16_t elementOffset, uint16_t elementCount) -{ - m_buffer->UpdateData(m_gpuPtr, data, elementOffset, elementCount); -} - -#ifdef DEBUG - uint32_t GPUBufferMapper::m_mappedDataBuffer; - uint32_t GPUBufferMapper::m_mappedIndexBuffer; -#endif - } // namespace dp diff --git a/drape/gpu_buffer.hpp b/drape/gpu_buffer.hpp index 7617379c09..ec65cd47d7 100644 --- a/drape/gpu_buffer.hpp +++ b/drape/gpu_buffer.hpp @@ -8,7 +8,7 @@ namespace dp class GPUBuffer : public BufferBase { - typedef BufferBase base_t; + typedef BufferBase TBase; public: enum Target { @@ -17,19 +17,19 @@ public: }; public: - GPUBuffer(Target t, uint8_t elementSize, uint16_t capacity); + GPUBuffer(Target t, void const * data, uint8_t elementSize, uint32_t capacity); ~GPUBuffer(); - void UploadData(void const * data, uint16_t elementCount); + void UploadData(void const * data, uint32_t elementCount); void Bind(); -protected: void * Map(); - void UpdateData(void * gpuPtr, void const * data, uint16_t elementOffset, uint16_t elementCount); + void UpdateData(void * gpuPtr, void const * data, uint32_t elementOffset, uint32_t elementCount); void Unmap(); +protected: /// discard old data - void Resize(uint16_t elementCount); + void Resize(void const * data, uint32_t elementCount); private: friend class GPUBufferMapper; @@ -41,22 +41,4 @@ private: #endif }; -class GPUBufferMapper -{ -public: - GPUBufferMapper(RefPointer buffer); - ~GPUBufferMapper(); - - void UpdateData(void const * data, uint16_t elementOffset, uint16_t elementCount); - -private: -#ifdef DEBUG - static uint32_t m_mappedDataBuffer; - static uint32_t m_mappedIndexBuffer; -#endif - - RefPointer m_buffer; - void * m_gpuPtr; -}; - } // namespace dp diff --git a/drape/gpu_program.cpp b/drape/gpu_program.cpp index b0d6a7e3e1..4ce50a0e82 100644 --- a/drape/gpu_program.cpp +++ b/drape/gpu_program.cpp @@ -5,55 +5,13 @@ #include "base/logging.hpp" #ifdef DEBUG - #include "../std/map.hpp" + #include "std/map.hpp" #endif namespace dp { -#ifdef DEBUG - class UniformValidator - { - private: - uint32_t m_programID; - map m_uniformsMap; - - public: - UniformValidator(uint32_t programId) - : m_programID(programId) - { - int32_t numberOfUnis = GLFunctions::glGetProgramiv(m_programID, gl_const::GLActiveUniforms); - for (size_t unIndex = 0; unIndex < numberOfUnis; ++unIndex) - { - string name; - glConst type; - UniformSize size; - GLCHECK(GLFunctions::glGetActiveUniform(m_programID, unIndex, &size, &type, name)); - m_uniformsMap[name] = make_pair(type, size); - } - } - - bool HasValidTypeAndSizeForName(string const & name, glConst type, UniformSize size) - { - map::iterator it = m_uniformsMap.find(name); - if (it != m_uniformsMap.end()) - { - UniformTypeAndSize actualParams = (*it).second; - return type == actualParams.first && size == actualParams.second; - } - else - return false; - } - }; - - bool GpuProgram::HasUniform(string const & name, glConst type, UniformSize size) - { - return m_validator->HasValidTypeAndSizeForName(name, type, size); - } -#endif // UniformValidator - - -GpuProgram::GpuProgram(RefPointer vertexShader, RefPointer fragmentShader) +GpuProgram::GpuProgram(ref_ptr vertexShader, ref_ptr fragmentShader) { m_programID = GLFunctions::glCreateProgram(); GLFunctions::glAttachShader(m_programID, vertexShader->GetID()); @@ -61,15 +19,14 @@ GpuProgram::GpuProgram(RefPointer vertexShader, RefPointer fragm string errorLog; if (!GLFunctions::glLinkProgram(m_programID, errorLog)) - LOG(LINFO, ("Program ", m_programID, " link error = ", errorLog)); + LOG(LERROR, ("Program ", m_programID, " link error = ", errorLog)); + + // originaly i detached shaders there, but then i try it on Tegra3 device. + // on Tegra3, glGetActiveUniform will not work if you detach shaders after linking + LoadUniformLocations(); GLFunctions::glDetachShader(m_programID, vertexShader->GetID()); GLFunctions::glDetachShader(m_programID, fragmentShader->GetID()); - - -#ifdef DEBUG - m_validator.reset(new UniformValidator(m_programID)); -#endif } GpuProgram::~GpuProgram() @@ -95,7 +52,24 @@ int8_t GpuProgram::GetAttributeLocation(string const & attributeName) const int8_t GpuProgram::GetUniformLocation(string const & uniformName) const { - return GLFunctions::glGetUniformLocation(m_programID, uniformName); + auto const it = m_uniforms.find(uniformName); + if (it == m_uniforms.end()) + return -1; + + return it->second; +} + +void GpuProgram::LoadUniformLocations() +{ + int32_t uniformsCount = GLFunctions::glGetProgramiv(m_programID, gl_const::GLActiveUniforms); + for (int32_t i = 0; i < uniformsCount; ++i) + { + int32_t size = 0; + glConst type = gl_const::GLFloatVec4; + string name; + GLFunctions::glGetActiveUniform(m_programID, i, &size, &type, name); + m_uniforms[name] = GLFunctions::glGetUniformLocation(m_programID, name); + } } } // namespace dp diff --git a/drape/gpu_program.hpp b/drape/gpu_program.hpp index 09c03724f2..4092dfaefd 100644 --- a/drape/gpu_program.hpp +++ b/drape/gpu_program.hpp @@ -7,23 +7,17 @@ #include "std/string.hpp" #ifdef DEBUG - #include "../std/unique_ptr.hpp" + #include "std/unique_ptr.hpp" #endif namespace dp { -#ifdef DEBUG - class UniformValidator; - typedef int32_t UniformSize; - typedef pair UniformTypeAndSize; -#endif - class GpuProgram { public: - GpuProgram(RefPointer vertexShader, - RefPointer fragmentShader); + GpuProgram(ref_ptr vertexShader, + ref_ptr fragmentShader); ~GpuProgram(); void Bind(); @@ -32,15 +26,14 @@ public: int8_t GetAttributeLocation(string const & attributeName) const; int8_t GetUniformLocation(string const & uniformName) const; +private: + void LoadUniformLocations(); + private: uint32_t m_programID; -#ifdef DEBUG -private: - unique_ptr m_validator; -public: - bool HasUniform(string const & name, glConst type, UniformSize size); -#endif + using TUniformLocations = map; + TUniformLocations m_uniforms; }; } // namespace dp diff --git a/drape/gpu_program_manager.cpp b/drape/gpu_program_manager.cpp index b47b1cb1fa..7d6c8aabce 100644 --- a/drape/gpu_program_manager.cpp +++ b/drape/gpu_program_manager.cpp @@ -35,40 +35,42 @@ static ShaderMapper s_mapper; GpuProgramManager::~GpuProgramManager() { - (void)GetRangeDeletor(m_programs, MasterPointerDeleter())(); - (void)GetRangeDeletor(m_shaders, MasterPointerDeleter())(); + m_programs.clear(); + m_shaders.clear(); } -RefPointer GpuProgramManager::GetProgram(int index) +ref_ptr GpuProgramManager::GetProgram(int index) { program_map_t::iterator it = m_programs.find(index); if (it != m_programs.end()) - return it->second.GetRefPointer(); + return make_ref(it->second); gpu::ProgramInfo const & programInfo = s_mapper.GetShaders(index); - RefPointer vertexShader = GetShader(programInfo.m_vertexIndex, - programInfo.m_vertexSource, - Shader::VertexShader); - RefPointer fragmentShader = GetShader(programInfo.m_fragmentIndex, - programInfo.m_fragmentSource, - Shader::FragmentShader); + ref_ptr vertexShader = GetShader(programInfo.m_vertexIndex, + programInfo.m_vertexSource, + Shader::VertexShader); + ref_ptr fragmentShader = GetShader(programInfo.m_fragmentIndex, + programInfo.m_fragmentSource, + Shader::FragmentShader); - MasterPointer & result = m_programs[index]; - result.Reset(new GpuProgram(vertexShader, fragmentShader)); - return result.GetRefPointer(); + drape_ptr program = make_unique_dp(vertexShader, fragmentShader); + ref_ptr result = make_ref(program); + m_programs.emplace(index, move(program)); + + return result; } -RefPointer GpuProgramManager::GetShader(int index, string const & source, Shader::Type t) +ref_ptr GpuProgramManager::GetShader(int index, string const & source, Shader::Type t) { shader_map_t::iterator it = m_shaders.find(index); if (it == m_shaders.end()) { - MasterPointer & shader = m_shaders[index]; - shader.Reset(new Shader(source, t)); - return shader.GetRefPointer(); + drape_ptr shader = make_unique_dp(source, t); + ref_ptr result = make_ref(shader); + m_shaders.emplace(index, move(shader)); + return result; } - else - return it->second.GetRefPointer(); + return make_ref(it->second); } } // namespace dp diff --git a/drape/gpu_program_manager.hpp b/drape/gpu_program_manager.hpp index 5a7a5662d9..d8ad24ceb5 100644 --- a/drape/gpu_program_manager.hpp +++ b/drape/gpu_program_manager.hpp @@ -15,14 +15,14 @@ class GpuProgramManager : public noncopyable public: ~GpuProgramManager(); - RefPointer GetProgram(int index); + ref_ptr GetProgram(int index); private: - RefPointer GetShader(int index, string const & source, Shader::Type t); + ref_ptr GetShader(int index, string const & source, Shader::Type t); private: - typedef map > program_map_t; - typedef map > shader_map_t; + typedef map > program_map_t; + typedef map > shader_map_t; program_map_t m_programs; shader_map_t m_shaders; }; diff --git a/drape/hw_texture.cpp b/drape/hw_texture.cpp new file mode 100644 index 0000000000..5e6f09bef7 --- /dev/null +++ b/drape/hw_texture.cpp @@ -0,0 +1,189 @@ +#include "hw_texture.hpp" + +#include "glfunctions.hpp" +#include "glextensions_list.hpp" + +#include "base/math.hpp" + +#if defined(OMIM_OS_IPHONE) +#include "hw_texture_ios.hpp" +#endif + +#define ASSERT_ID ASSERT(GetID() != -1, ()) + +namespace dp +{ + +HWTexture::HWTexture() + : m_width(0) + , m_height(0) + , m_format(UNSPECIFIED) + , m_textureID(-1) + , m_filter(gl_const::GLLinear) +{ +} + +void HWTexture::Create(Params const & params) +{ + Create(params, nullptr); +} + +void HWTexture::Create(Params const & params, ref_ptr /*data*/) +{ + m_width = params.m_width; + m_height = params.m_height; + m_format = params.m_format; + m_filter = params.m_filter; + +#if defined(TRACK_GPU_MEM) + glConst layout; + glConst pixelType; + UnpackFormat(format, layout, pixelType); + + uint32_t channelBitSize = 8; + uint32_t channelCount = 4; + if (pixelType == gl_const::GL4BitOnChannel) + channelBitSize = 4; + + if (layout == gl_const::GLAlpha) + channelCount = 1; + + uint32_t bitCount = channelBitSize * channelCount * m_width * m_height; + uint32_t memSize = bitCount >> 3; + dp::GPUMemTracker::Inst().AddAllocated("Texture", m_textureID, memSize); + dp::GPUMemTracker::Inst().SetUsed("Texture", m_textureID, memSize); +#endif +} + +TextureFormat HWTexture::GetFormat() const +{ + return m_format; +} + +uint32_t HWTexture::GetWidth() const +{ + ASSERT_ID; + return m_width; +} + +uint32_t HWTexture::GetHeight() const +{ + ASSERT_ID; + return m_height; +} + +float HWTexture::GetS(uint32_t x) const +{ + ASSERT_ID; + return x / (float)m_width; +} + +float HWTexture::GetT(uint32_t y) const +{ + ASSERT_ID; + return y / (float)m_height; +} + +void HWTexture::UnpackFormat(TextureFormat format, glConst & layout, glConst & pixelType) +{ + switch (format) + { + case RGBA8: + layout = gl_const::GLRGBA; + pixelType = gl_const::GL8BitOnChannel; + break; + case ALPHA: + layout = gl_const::GLAlpha; + pixelType = gl_const::GL8BitOnChannel; + break; + default: + ASSERT(false, ()); + break; + } +} + +void HWTexture::Bind() const +{ + ASSERT_ID; + GLFunctions::glBindTexture(GetID()); +} + +void HWTexture::SetFilter(glConst filter) +{ + if (m_filter != filter) + { + m_filter = filter; + GLFunctions::glTexParameter(gl_const::GLMinFilter, m_filter); + GLFunctions::glTexParameter(gl_const::GLMagFilter, m_filter); + } +} + +int32_t HWTexture::GetID() const +{ + return m_textureID; +} + +OpenGLHWTexture::~OpenGLHWTexture() +{ + if (m_textureID != -1) + GLFunctions::glDeleteTexture(m_textureID); +} + +void OpenGLHWTexture::Create(Params const & params, ref_ptr data) +{ + TBase::Create(params, data); + + if (!GLExtensionsList::Instance().IsSupported(GLExtensionsList::TextureNPOT)) + { + m_width = my::NextPowOf2(m_width); + m_height = my::NextPowOf2(m_height); + } + + m_textureID = GLFunctions::glGenTexture(); + Bind(); + + glConst layout; + glConst pixelType; + UnpackFormat(m_format, layout, pixelType); + + GLFunctions::glTexImage2D(m_width, m_height, layout, pixelType, data.get()); + GLFunctions::glTexParameter(gl_const::GLMinFilter, params.m_filter); + GLFunctions::glTexParameter(gl_const::GLMagFilter, params.m_filter); + GLFunctions::glTexParameter(gl_const::GLWrapS, params.m_wrapSMode); + GLFunctions::glTexParameter(gl_const::GLWrapT, params.m_wrapTMode); + + GLFunctions::glFlush(); + GLFunctions::glBindTexture(0); +} + +void OpenGLHWTexture::UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, ref_ptr data) +{ + ASSERT_ID; + glConst layout; + glConst pixelType; + UnpackFormat(m_format, layout, pixelType); + + GLFunctions::glTexSubImage2D(x, y, width, height, layout, pixelType, data.get()); +} + +drape_ptr OpenGLHWTextureAllocator::CreateTexture() +{ + return make_unique_dp(); +} + +drape_ptr CreateAllocator() +{ +#if defined(OMIM_OS_IPHONE) && !defined(OMIM_OS_IPHONE_SIMULATOR) + return make_unique_dp(); +#else + return make_unique_dp(); +#endif +} + +ref_ptr GetDefaultAllocator() +{ + static OpenGLHWTextureAllocator s_allocator; + return make_ref(&s_allocator); +} + +} diff --git a/drape/hw_texture.hpp b/drape/hw_texture.hpp new file mode 100644 index 0000000000..a408ee384f --- /dev/null +++ b/drape/hw_texture.hpp @@ -0,0 +1,94 @@ +#pragma once + +#include "glconstants.hpp" +#include "pointers.hpp" +#include "drape_global.hpp" + +#include "std/cstdint.hpp" + +namespace dp +{ + +class HWTextureAllocator; +class HWTexture +{ +public: + HWTexture(); + virtual ~HWTexture() {} + + struct Params + { + Params() + : m_filter(gl_const::GLLinear) + , m_wrapSMode(gl_const::GLClampToEdge) + , m_wrapTMode(gl_const::GLClampToEdge) + , m_format(UNSPECIFIED) + { + } + + uint32_t m_width; + uint32_t m_height; + glConst m_filter; + glConst m_wrapSMode; + glConst m_wrapTMode; + TextureFormat m_format; + + ref_ptr m_allocator; + }; + + void Create(Params const & params); + virtual void Create(Params const & params, ref_ptr data) = 0; + virtual void UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, ref_ptr data) = 0; + + void Bind() const; + + // Texture must be bound before calling this method. + void SetFilter(glConst filter); + + TextureFormat GetFormat() const; + uint32_t GetWidth() const; + uint32_t GetHeight() const; + float GetS(uint32_t x) const; + float GetT(uint32_t y) const; + +protected: + void UnpackFormat(TextureFormat format, glConst & layout, glConst & pixelType); + int32_t GetID() const; + + uint32_t m_width; + uint32_t m_height; + TextureFormat m_format; + int32_t m_textureID; + glConst m_filter; +}; + +class HWTextureAllocator +{ +public: + virtual ~HWTextureAllocator() {} + + virtual drape_ptr CreateTexture() = 0; + virtual void Flush() = 0; +}; + +class OpenGLHWTexture : public HWTexture +{ + using TBase = HWTexture; + +public: + ~OpenGLHWTexture(); + void Create(Params const & params, ref_ptr data) override; + void UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, ref_ptr data) override; +}; + +class OpenGLHWTextureAllocator : public HWTextureAllocator +{ +public: + drape_ptr CreateTexture() override; + void Flush() override {} +}; + +ref_ptr GetDefaultAllocator(); +drape_ptr CreateAllocator(); + +} diff --git a/drape/hw_texture_ios.hpp b/drape/hw_texture_ios.hpp new file mode 100644 index 0000000000..f93ca15f9f --- /dev/null +++ b/drape/hw_texture_ios.hpp @@ -0,0 +1,62 @@ +#pragma once + +#import "hw_texture.hpp" + +#ifndef OMIM_OS_IPHONE + #error Only for ios +#endif + +#import +#import +#import + +namespace dp +{ + +class HWTextureAllocatorApple : public HWTextureAllocator +{ +public: + HWTextureAllocatorApple(); + ~HWTextureAllocatorApple(); + + CVPixelBufferRef CVCreatePixelBuffer(uint32_t width, uint32_t height, int format); + void CVDestroyPixelBuffer(CVPixelBufferRef buffer); + + CVOpenGLESTextureRef CVCreateTexture(CVPixelBufferRef buffer, uint32_t width, uint32_t height, + glConst layout, glConst pixelType); + void CVDestroyTexture(CVOpenGLESTextureRef texture); + + void RiseFlushFlag(); + + drape_ptr CreateTexture() override; + void Flush() override; + +private: + bool m_needFlush; + CVOpenGLESTextureCacheRef m_textureCache; +}; + +class HWTextureApple : public HWTexture +{ + using TBase = HWTexture; + +public: + HWTextureApple(ref_ptr allocator); + ~HWTextureApple(); + + void Create(Params const & params, ref_ptr data); + void UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, ref_ptr data); + +private: + void Lock(); + void Unlock(); + +private: + CVPixelBufferRef m_directBuffer; + CVOpenGLESTextureRef m_texture; + ref_ptr m_allocator; + + void * m_directPointer; +}; + +} diff --git a/drape/hw_texture_ios.mm b/drape/hw_texture_ios.mm new file mode 100644 index 0000000000..63ca499cc9 --- /dev/null +++ b/drape/hw_texture_ios.mm @@ -0,0 +1,205 @@ +#include "hw_texture_ios.hpp" + +#include "base/logging.hpp" + +#include "drape/glfunctions.hpp" + +#import + +#import +#import + +#include +#include +#include + +using boost::gil::gray8c_pixel_t; +using boost::gil::gray8_pixel_t; +using boost::gil::gray8c_view_t; +using boost::gil::gray8_view_t; +using boost::gil::rgba8c_pixel_t; +using boost::gil::rgba8_pixel_t; +using boost::gil::rgba8c_view_t; +using boost::gil::rgba8_view_t; +using boost::gil::interleaved_view; +using boost::gil::subimage_view; +using boost::gil::copy_pixels; + +namespace dp +{ + +HWTextureAllocatorApple::HWTextureAllocatorApple() +{ + CVReturn cvRetval = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, nullptr, + [EAGLContext currentContext], + nullptr, &m_textureCache); + + CHECK_EQUAL(cvRetval, kCVReturnSuccess, ()); +} + +HWTextureAllocatorApple::~HWTextureAllocatorApple() +{ + CFRelease(m_textureCache); +} + +CVPixelBufferRef HWTextureAllocatorApple::CVCreatePixelBuffer(uint32_t width, uint32_t height, int format) +{ + NSDictionary * attrs = [NSDictionary dictionaryWithObjectsAndKeys: + [NSDictionary dictionary], kCVPixelBufferIOSurfacePropertiesKey, + [NSNumber numberWithInt:16], kCVPixelBufferBytesPerRowAlignmentKey, + [NSNumber numberWithBool:YES], kCVPixelBufferOpenGLESCompatibilityKey, + nil]; + + CFDictionaryRef attrsRef = (CFDictionaryRef)attrs; + + CVPixelBufferRef result; + CVReturn cvRetval; + switch (format) + { + case dp::RGBA8: + cvRetval = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32BGRA, attrsRef, &result); + break; + case dp::ALPHA: + cvRetval = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_OneComponent8, + attrsRef, &result); + break; + default: + ASSERT(false, ()); + break; + } + + CHECK_EQUAL(cvRetval, kCVReturnSuccess, ()); + + return result; +} + +void HWTextureAllocatorApple::CVDestroyPixelBuffer(CVPixelBufferRef buffer) +{ + CFRelease(buffer); +} + +CVOpenGLESTextureRef HWTextureAllocatorApple::CVCreateTexture(CVPixelBufferRef buffer, uint32_t width, uint32_t height, + glConst layout, glConst pixelType) +{ + CVOpenGLESTextureRef texture; + CVReturn cvRetval = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, m_textureCache, buffer, + nullptr, gl_const::GLTexture2D, layout, + width, height, layout, pixelType, 0, &texture); + + CHECK_EQUAL(cvRetval, kCVReturnSuccess, ()); + + return texture; +} + +void HWTextureAllocatorApple::CVDestroyTexture(CVOpenGLESTextureRef texture) +{ + CFRelease(texture); +} + +void HWTextureAllocatorApple::RiseFlushFlag() +{ + m_needFlush = true; +} + +drape_ptr HWTextureAllocatorApple::CreateTexture() +{ + return make_unique_dp(make_ref(this)); +} + +void HWTextureAllocatorApple::Flush() +{ + if (m_needFlush) + { + CVOpenGLESTextureCacheFlush(m_textureCache, 0); + m_needFlush = false; + } +} + +HWTextureApple::HWTextureApple(ref_ptr allocator) + : m_directBuffer(nullptr) + , m_texture(nullptr) + , m_allocator(nullptr) + , m_directPointer(nullptr) +{ +} + +HWTextureApple::~HWTextureApple() +{ + if (m_allocator == nullptr) + { + m_allocator->CVDestroyTexture(m_texture); + m_allocator->CVDestroyPixelBuffer(m_directBuffer); + } +} + +void HWTextureApple::Create(Params const & params, ref_ptr data) +{ + TBase::Create(params, data); + + m_allocator = params.m_allocator.downcast(); + m_directBuffer = m_allocator->CVCreatePixelBuffer(params.m_width, params.m_height, params.m_format); + + glConst layout, pixelType; + UnpackFormat(params.m_format, layout, pixelType); + m_texture = m_allocator->CVCreateTexture(m_directBuffer, params.m_width, params.m_height, + layout, pixelType); + + m_textureID = CVOpenGLESTextureGetName(m_texture); + GLFunctions::glBindTexture(m_textureID); + GLFunctions::glTexParameter(gl_const::GLMinFilter, params.m_filter); + GLFunctions::glTexParameter(gl_const::GLMagFilter, params.m_filter); + GLFunctions::glTexParameter(gl_const::GLWrapS, params.m_wrapSMode); + GLFunctions::glTexParameter(gl_const::GLWrapT, params.m_wrapTMode); + + if (data == nullptr) + return; + + Lock(); + memcpy(m_directPointer, data.get(), m_width * m_height * GetBytesPerPixel(m_format)); + Unlock(); +} + +void HWTextureApple::UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, ref_ptr data) +{ + uint8_t bytesPerPixel = GetBytesPerPixel(GetFormat()); + Lock(); + if (bytesPerPixel == 1) + { + gray8c_view_t srcView = interleaved_view(width, height, (gray8c_pixel_t *)data.get(), width); + gray8_view_t dstView = interleaved_view(m_width, m_height, (gray8_pixel_t *)m_directPointer, m_width); + gray8_view_t subDstView = subimage_view(dstView, x, y, width, height); + copy_pixels(srcView, subDstView); + } + else if (bytesPerPixel == 4) + { + rgba8c_view_t srcView = interleaved_view(width, height, + (rgba8c_pixel_t *)data.get(), + width * bytesPerPixel); + rgba8_view_t dstView = interleaved_view(m_width, m_height, + (rgba8_pixel_t *)m_directPointer, + m_width * bytesPerPixel); + rgba8_view_t subDstView = subimage_view(dstView, x, y, width, height); + copy_pixels(srcView, subDstView); + } + Unlock(); +} + +void HWTextureApple::Lock() +{ + ASSERT(m_directPointer == nullptr, ()); + + CHECK_EQUAL(CVPixelBufferLockBaseAddress(m_directBuffer, 0), kCVReturnSuccess, ()); + + ASSERT_EQUAL(CVPixelBufferGetBytesPerRow(m_directBuffer), m_width * GetBytesPerPixel(m_format), ()); + m_directPointer = CVPixelBufferGetBaseAddress(m_directBuffer); +} + +void HWTextureApple::Unlock() +{ + ASSERT(m_directPointer != nullptr, ()); + m_directPointer = nullptr; + CHECK_EQUAL(CVPixelBufferUnlockBaseAddress(m_directBuffer, 0), kCVReturnSuccess, ()); + m_allocator->RiseFlushFlag(); +} + +} diff --git a/drape/index_buffer.cpp b/drape/index_buffer.cpp index 60fff3d9c5..cf8aab332b 100644 --- a/drape/index_buffer.cpp +++ b/drape/index_buffer.cpp @@ -1,22 +1,26 @@ #include "drape/index_buffer.hpp" +#include "drape/index_storage.hpp" namespace dp { -IndexBuffer::IndexBuffer(uint16_t capacity) - : GPUBuffer(GPUBuffer::IndexBuffer, sizeof(uint16_t), capacity) +IndexBuffer::IndexBuffer(uint32_t capacity) + : DataBuffer((uint8_t)IndexStorage::SizeOfIndex(), capacity) { } -void IndexBuffer::UploadData(uint16_t const * data, uint16_t size) +void IndexBuffer::UploadData(void const * data, uint32_t size) { - GPUBuffer::UploadData((void *)data, size); + GetBuffer()->UploadData((void const *)data, size); } -void IndexBuffer::UpdateData(uint16_t const * data, uint16_t size) +void IndexBuffer::UpdateData(void const * data, uint32_t size) { - GPUBuffer::Resize(size); - UploadData(data, size); + ASSERT_LESS_OR_EQUAL(size, GetBuffer()->GetCapacity(), ()); + + GetBuffer()->Seek(0); + if (size > 0) + UploadData(data, size); } } // namespace dp diff --git a/drape/index_buffer.hpp b/drape/index_buffer.hpp index 7572854d30..85509b85be 100644 --- a/drape/index_buffer.hpp +++ b/drape/index_buffer.hpp @@ -1,19 +1,19 @@ #pragma once -#include "drape/gpu_buffer.hpp" +#include "drape/data_buffer.hpp" namespace dp { -class IndexBuffer : public GPUBuffer +class IndexBuffer : public DataBuffer { public: - IndexBuffer(uint16_t capacity); + IndexBuffer(uint32_t capacity); /// check size of buffer and size of uploaded data - void UploadData(uint16_t const * data, uint16_t size); + void UploadData(void const * data, uint32_t size); /// resize buffer to new size, and discard old data - void UpdateData(uint16_t const * data, uint16_t size); + void UpdateData(void const * data, uint32_t size); }; } // namespace dp diff --git a/drape/index_buffer_mutator.cpp b/drape/index_buffer_mutator.cpp index 8179122789..b0d5858416 100644 --- a/drape/index_buffer_mutator.cpp +++ b/drape/index_buffer_mutator.cpp @@ -1,34 +1,34 @@ #include "drape/index_buffer_mutator.hpp" #include "drape/vertex_array_buffer.hpp" -#include "../std/cstring.hpp" // for memcpy -#include "../std/algorithm.hpp" // for max +#include "std/cstring.hpp" // for memcpy +#include "std/algorithm.hpp" // for max namespace dp { -IndexBufferMutator::IndexBufferMutator(uint16_t baseSize) +IndexBufferMutator::IndexBufferMutator(uint32_t baseSize) : m_activeSize(0) { - m_buffer.resize(baseSize); + m_buffer.Resize(baseSize); } -void IndexBufferMutator::AppendIndexes(uint16_t const * indexes, uint16_t count) +void IndexBufferMutator::AppendIndexes(void const * indexes, uint32_t count) { - size_t dstActiveSize = m_activeSize + count; - if (dstActiveSize > m_buffer.size()) - m_buffer.resize(max(m_buffer.size() * 2, dstActiveSize)); + uint32_t dstActiveSize = m_activeSize + count; + if (dstActiveSize > m_buffer.Size()) + m_buffer.Resize(max(m_buffer.Size() * 2, dstActiveSize)); - memcpy(&m_buffer[m_activeSize], indexes, count * sizeof(uint16_t)); + memcpy(m_buffer.GetRaw(m_activeSize), indexes, count * IndexStorage::SizeOfIndex()); m_activeSize = dstActiveSize; } -uint16_t const * IndexBufferMutator::GetIndexes() const +void const * IndexBufferMutator::GetIndexes() const { - return &m_buffer[0]; + return m_buffer.GetRawConst(); } -uint16_t IndexBufferMutator::GetIndexCount() const +uint32_t IndexBufferMutator::GetIndexCount() const { return m_activeSize; } diff --git a/drape/index_buffer_mutator.hpp b/drape/index_buffer_mutator.hpp index 06799d3138..978cb29014 100644 --- a/drape/index_buffer_mutator.hpp +++ b/drape/index_buffer_mutator.hpp @@ -1,7 +1,10 @@ #pragma once +#include "drape/index_storage.hpp" #include "drape/pointers.hpp" +#include "std/cstdint.hpp" + namespace dp { @@ -10,18 +13,18 @@ class VertexArrayBuffer; class IndexBufferMutator { public: - IndexBufferMutator(uint16_t baseSize); + IndexBufferMutator(uint32_t baseSize); - void AppendIndexes(uint16_t const * indexes, uint16_t count); + void AppendIndexes(void const * indexes, uint32_t count); private: friend class VertexArrayBuffer; - uint16_t const * GetIndexes() const; - uint16_t GetIndexCount() const; + void const * GetIndexes() const; + uint32_t GetIndexCount() const; private: - vector m_buffer; - uint16_t m_activeSize; + IndexStorage m_buffer; + uint32_t m_activeSize; }; } // namespace dp diff --git a/drape/index_storage.cpp b/drape/index_storage.cpp new file mode 100644 index 0000000000..6a217ff7b4 --- /dev/null +++ b/drape/index_storage.cpp @@ -0,0 +1,74 @@ +#include "drape/index_storage.hpp" +#include "drape/glextensions_list.hpp" + +#include "std/utility.hpp" + +namespace dp +{ + +IndexStorage::IndexStorage() + : m_size(0) +{} + +IndexStorage::IndexStorage(vector && initial) +{ + m_size = (uint32_t)initial.size(); + if (IsSupported32bit()) + { + m_storage = move(initial); + } + else + { + /// we pack 2 uint16_t indices into single m_storage element + /// every element of "initial" vector is single index + m_storage.resize(GetStorageSize(m_size)); + for (size_t i = 0; i < initial.size(); i++) + { + uint16_t * ptr = reinterpret_cast(m_storage.data()) + i; + *ptr = (uint16_t)initial[i]; + } + } +} + +void IndexStorage::Resize(uint32_t size) +{ + m_size = size; + m_storage.resize(GetStorageSize(m_size)); +} + +uint32_t IndexStorage::Size() const +{ + return m_size; +} + +void * IndexStorage::GetRaw(uint32_t offsetInElements) +{ + if (IsSupported32bit()) + return &m_storage[offsetInElements]; + + return reinterpret_cast(m_storage.data()) + offsetInElements; +} + +void const * IndexStorage::GetRawConst() const +{ + return static_cast(m_storage.data()); +} + +bool IndexStorage::IsSupported32bit() +{ + // We do not use 32-bit indices now to reduce size of index buffers. + static bool const supports32Bit = false;//GLExtensionsList::Instance().IsSupported(GLExtensionsList::UintIndices); + return supports32Bit; +} + +uint32_t IndexStorage::SizeOfIndex() +{ + return IsSupported32bit() ? sizeof(uint32_t) : sizeof(uint16_t); +} + +uint32_t IndexStorage::GetStorageSize(uint32_t elementsCount) const +{ + return IsSupported32bit() ? elementsCount : (elementsCount / 2 + 1); +} + +} diff --git a/drape/index_storage.hpp b/drape/index_storage.hpp new file mode 100644 index 0000000000..447f28d351 --- /dev/null +++ b/drape/index_storage.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "std/vector.hpp" +#include "std/cstdint.hpp" + +namespace dp +{ + +class IndexStorage +{ +public: + IndexStorage(); + IndexStorage(vector && initial); + + uint32_t Size() const; + void Resize(uint32_t size); + + void * GetRaw(uint32_t offsetInElements = 0); + void const * GetRawConst() const; + + static bool IsSupported32bit(); + static uint32_t SizeOfIndex(); + +private: + vector m_storage; + uint32_t m_size; + + uint32_t GetStorageSize(uint32_t elementsCount) const; +}; + + +} // namespace dp diff --git a/drape/oglcontext.hpp b/drape/oglcontext.hpp index 672f772a00..bc33c9f462 100644 --- a/drape/oglcontext.hpp +++ b/drape/oglcontext.hpp @@ -9,9 +9,11 @@ public: virtual ~OGLContext() {} virtual void present() = 0; virtual void makeCurrent() = 0; + virtual void doneCurrent() {} virtual void setDefaultFramebuffer() = 0; /// @ param w, h - pixel size of render target (logical size * visual scale) virtual void resize(int /*w*/, int /*h*/) {} + virtual void setRenderingEnabled(bool enabled) {} }; } // namespace dp diff --git a/drape/oglcontextfactory.cpp b/drape/oglcontextfactory.cpp index f4ffcc19fc..4408c4e01b 100644 --- a/drape/oglcontextfactory.cpp +++ b/drape/oglcontextfactory.cpp @@ -3,8 +3,9 @@ namespace dp { -ThreadSafeFactory::ThreadSafeFactory(OGLContextFactory * factory) +ThreadSafeFactory::ThreadSafeFactory(OGLContextFactory * factory, bool enableSharing) : m_factory(factory) + , m_enableSharing(enableSharing) { } @@ -13,16 +14,31 @@ ThreadSafeFactory::~ThreadSafeFactory() delete m_factory; } -OGLContext *ThreadSafeFactory::getDrawContext() +OGLContext * ThreadSafeFactory::getDrawContext() { - threads::MutexGuard lock(m_mutex); - return m_factory->getDrawContext(); + return CreateContext([this](){ return m_factory->getDrawContext(); }, + [this](){ return m_factory->isUploadContextCreated(); }); } OGLContext *ThreadSafeFactory::getResourcesUploadContext() { - threads::MutexGuard lock(m_mutex); - return m_factory->getResourcesUploadContext(); + return CreateContext([this](){ return m_factory->getResourcesUploadContext(); }, + [this](){ return m_factory->isDrawContextCreated(); }); +} + +OGLContext * ThreadSafeFactory::CreateContext(TCreateCtxFn const & createFn, TIsSeparateCreatedFn const checkFn) +{ + threads::ConditionGuard g(m_contidion); + OGLContext * ctx = createFn(); + if (m_enableSharing) + { + if (!checkFn()) + g.Wait(); + else + g.Signal(); + } + + return ctx; } } // namespace dp diff --git a/drape/oglcontextfactory.hpp b/drape/oglcontextfactory.hpp index 9d725c80df..c015781843 100644 --- a/drape/oglcontextfactory.hpp +++ b/drape/oglcontextfactory.hpp @@ -2,7 +2,10 @@ #include "drape/oglcontext.hpp" -#include "base/mutex.hpp" +#include "base/condition.hpp" +#include "base/assert.hpp" + +#include "std/function.hpp" namespace dp { @@ -13,19 +16,34 @@ public: virtual ~OGLContextFactory() {} virtual OGLContext * getDrawContext() = 0; virtual OGLContext * getResourcesUploadContext() = 0; + virtual bool isDrawContextCreated() const { return false; } + virtual bool isUploadContextCreated() const { return false; } }; class ThreadSafeFactory : public OGLContextFactory { public: - ThreadSafeFactory(OGLContextFactory * factory); + ThreadSafeFactory(OGLContextFactory * factory, bool enableSharing = true); ~ThreadSafeFactory(); virtual OGLContext * getDrawContext(); virtual OGLContext * getResourcesUploadContext(); + template + T * CastFactory() + { + ASSERT(dynamic_cast(m_factory) != nullptr, ()); + return static_cast(m_factory); + } + +protected: + typedef function TCreateCtxFn; + typedef function TIsSeparateCreatedFn; + OGLContext * CreateContext(TCreateCtxFn const & createFn, TIsSeparateCreatedFn const checkFn); + private: OGLContextFactory * m_factory; - threads::Mutex m_mutex; + threads::Condition m_contidion; + bool m_enableSharing; }; } // namespace dp diff --git a/drape/overlay_handle.cpp b/drape/overlay_handle.cpp index 9aa17e16d0..a8e9bdf9f4 100644 --- a/drape/overlay_handle.cpp +++ b/drape/overlay_handle.cpp @@ -19,23 +19,17 @@ private: uint8_t m_bufferID; }; -OverlayHandle::OverlayHandle(FeatureID const & id, - dp::Anchor anchor, - double priority) +OverlayHandle::OverlayHandle(FeatureID const & id, dp::Anchor anchor, uint64_t priority) : m_id(id) , m_anchor(anchor) , m_priority(priority) + , m_overlayRank(OverlayRank0) , m_isVisible(false) - , m_isValid(true) { } bool OverlayHandle::IsVisible() const { -#ifdef DEBUG - if (m_isVisible) - ASSERT(m_isValid, ()); -#endif return m_isVisible; } @@ -44,13 +38,32 @@ void OverlayHandle::SetIsVisible(bool isVisible) m_isVisible = isVisible; } -bool OverlayHandle::IsIntersect(ScreenBase const & screen, OverlayHandle const & h) const +m2::PointD OverlayHandle::GetPivot(ScreenBase const & screen) const +{ + m2::RectD r = GetPixelRect(screen); + m2::PointD size(0.5 * r.SizeX(), 0.5 * r.SizeY()); + m2::PointD result = r.Center(); + + if (m_anchor & dp::Left) + result.x -= size.x; + else if (m_anchor & dp::Right) + result.x += size.x; + + if (m_anchor & dp::Top) + result.y -= size.y; + else if (m_anchor & dp::Bottom) + result.y += size.y; + + return result; +} + +bool OverlayHandle::IsIntersect(ScreenBase const & screen, ref_ptr const h) const { Rects ar1; Rects ar2; GetPixelShape(screen, ar1); - h.GetPixelShape(screen, ar2); + h->GetPixelShape(screen, ar2); for (size_t i = 0; i < ar1.size(); ++i) for (size_t j = 0; j < ar2.size(); ++j) @@ -60,26 +73,23 @@ bool OverlayHandle::IsIntersect(ScreenBase const & screen, OverlayHandle const & return false; } -uint16_t * OverlayHandle::IndexStorage(uint16_t size) +void * OverlayHandle::IndexStorage(uint32_t size) { - m_indexes.resize(size); - return &m_indexes[0]; + m_indexes.Resize(size); + return m_indexes.GetRaw(); } -size_t OverlayHandle::GetIndexCount() const -{ - return m_indexes.size(); -} - -void OverlayHandle::GetElementIndexes(RefPointer mutator) const +void OverlayHandle::GetElementIndexes(ref_ptr mutator) const { ASSERT_EQUAL(m_isVisible, true, ()); - mutator->AppendIndexes(&m_indexes[0], m_indexes.size()); + mutator->AppendIndexes(m_indexes.GetRawConst(), m_indexes.Size()); } -void OverlayHandle::GetAttributeMutation(RefPointer mutator, const ScreenBase & screen) const +void OverlayHandle::GetAttributeMutation(ref_ptr mutator, + ScreenBase const & screen) const { UNUSED_VALUE(mutator); + UNUSED_VALUE(screen); } bool OverlayHandle::HasDynamicAttributes() const @@ -87,7 +97,7 @@ bool OverlayHandle::HasDynamicAttributes() const return !m_offsets.empty(); } -void OverlayHandle::AddDynamicAttribute(BindingInfo const & binding, uint16_t offset, uint16_t count) +void OverlayHandle::AddDynamicAttribute(BindingInfo const & binding, uint32_t offset, uint32_t count) { ASSERT(binding.IsDynamic(), ()); ASSERT(find_if(m_offsets.begin(), m_offsets.end(), OffsetNodeFinder(binding.GetID())) == m_offsets.end(), ()); @@ -99,7 +109,7 @@ FeatureID const & OverlayHandle::GetFeatureID() const return m_id; } -double const & OverlayHandle::GetPriority() const +uint64_t const & OverlayHandle::GetPriority() const { return m_priority; } @@ -111,16 +121,13 @@ OverlayHandle::TOffsetNode const & OverlayHandle::GetOffsetNode(uint8_t bufferID return *it; } -//////////////////////////////////////////////////////////////////////////////// - SquareHandle::SquareHandle(FeatureID const & id, dp::Anchor anchor, m2::PointD const & gbPivot, m2::PointD const & pxSize, - double priority) - : base_t(id, anchor, priority) + uint64_t priority) + : TBase(id, anchor, priority) , m_gbPivot(gbPivot) , m_pxHalfSize(pxSize.x / 2.0, pxSize.y / 2.0) -{ -} +{} m2::RectD SquareHandle::GetPixelRect(ScreenBase const & screen) const { @@ -148,4 +155,24 @@ void SquareHandle::GetPixelShape(ScreenBase const & screen, Rects & rects) const rects.push_back(m2::RectF(rd.minX(), rd.minY(), rd.maxX(), rd.maxY())); } +uint64_t CalculateOverlayPriority(int minZoomLevel, uint8_t rank, float depth) +{ + // Overlay priority consider the following: + // - Minimum visible zoom level (the less the better); + // - Manual priority from styles (equals to the depth); + // - Rank of the feature (the more the better); + // [1 byte - zoom][4 bytes - priority][1 byte - rank][1 byte - reserved][1 byte - reserved]. + uint8_t const minZoom = 0xFF - static_cast(max(minZoomLevel, 0)); + + float const kMinDepth = -100000.0f; + float const kMaxDepth = 100000.0f; + float const d = my::clamp(depth, kMinDepth, kMaxDepth) + kMaxDepth; + uint32_t const priority = static_cast(d); + + return (static_cast(minZoom) << 56) | + (static_cast(priority) << 24) | + (static_cast(rank) << 16) | + static_cast(0xFFFF); +} + } // namespace dp diff --git a/drape/overlay_handle.hpp b/drape/overlay_handle.hpp index fbbd235db7..0c4889b7ed 100644 --- a/drape/overlay_handle.hpp +++ b/drape/overlay_handle.hpp @@ -3,6 +3,7 @@ #include "drape/drape_global.hpp" #include "drape/binding_info.hpp" #include "drape/index_buffer_mutator.hpp" +#include "drape/index_storage.hpp" #include "drape/attribute_buffer_mutator.hpp" #include "indexer/feature_decl.hpp" @@ -16,56 +17,75 @@ namespace dp { +enum OverlayRank +{ + OverlayRank0 = 0, + OverlayRank1, + OverlayRank2, + + OverlayRanksCount +}; + +uint64_t constexpr kPriorityMaskZoomLevel = 0xFF0000000000FFFF; +uint64_t constexpr kPriorityMaskManual = 0x00FFFFFFFF00FFFF; +uint64_t constexpr kPriorityMaskRank = 0x0000000000FFFFFF; +uint64_t constexpr kPriorityMaskAll = kPriorityMaskZoomLevel | + kPriorityMaskManual | + kPriorityMaskRank; class OverlayHandle { public: typedef vector Rects; - OverlayHandle(FeatureID const & id, - dp::Anchor anchor, - double priority); + OverlayHandle(FeatureID const & id, dp::Anchor anchor, uint64_t priority); virtual ~OverlayHandle() {} bool IsVisible() const; void SetIsVisible(bool isVisible); - bool IsValid() const { return m_isValid; } + m2::PointD GetPivot(ScreenBase const & screen) const; - virtual void Update(ScreenBase const & /*screen*/) {} + virtual bool Update(ScreenBase const & /*screen*/) { return true; } virtual m2::RectD GetPixelRect(ScreenBase const & screen) const = 0; virtual void GetPixelShape(ScreenBase const & screen, Rects & rects) const = 0; - bool IsIntersect(ScreenBase const & screen, OverlayHandle const & h) const; + bool IsIntersect(ScreenBase const & screen, ref_ptr const h) const; - uint16_t * IndexStorage(uint16_t size); - size_t GetIndexCount() const; - void GetElementIndexes(RefPointer mutator) const; - virtual void GetAttributeMutation(RefPointer mutator, ScreenBase const & screen) const; + virtual bool IndexesRequired() const { return true; } + void * IndexStorage(uint32_t size); + void GetElementIndexes(ref_ptr mutator) const; + virtual void GetAttributeMutation(ref_ptr mutator, + ScreenBase const & screen) const; bool HasDynamicAttributes() const; - void AddDynamicAttribute(BindingInfo const & binding, uint16_t offset, uint16_t count); + void AddDynamicAttribute(BindingInfo const & binding, uint32_t offset, uint32_t count); FeatureID const & GetFeatureID() const; - double const & GetPriority() const; + uint64_t const & GetPriority() const; -protected: - void SetIsValid(bool isValid) { m_isValid = isValid; } + virtual uint64_t GetPriorityMask() const { return kPriorityMaskAll; } + + virtual bool IsBound() const { return false; } + + int GetOverlayRank() const { return m_overlayRank; } + void SetOverlayRank(int overlayRank) { m_overlayRank = overlayRank; } protected: FeatureID const m_id; dp::Anchor const m_anchor; - double const m_priority; + uint64_t const m_priority; + + int m_overlayRank; typedef pair TOffsetNode; TOffsetNode const & GetOffsetNode(uint8_t bufferID) const; private: bool m_isVisible; - bool m_isValid; - vector m_indexes; + dp::IndexStorage m_indexes; struct LessOffsetNode { bool operator()(TOffsetNode const & node1, TOffsetNode const & node2) const @@ -81,13 +101,14 @@ private: class SquareHandle : public OverlayHandle { - typedef OverlayHandle base_t; + using TBase = OverlayHandle; + public: SquareHandle(FeatureID const & id, dp::Anchor anchor, m2::PointD const & gbPivot, m2::PointD const & pxSize, - double priority); + uint64_t priority); virtual m2::RectD GetPixelRect(ScreenBase const & screen) const; virtual void GetPixelShape(ScreenBase const & screen, Rects & rects) const; @@ -97,4 +118,6 @@ private: m2::PointD m_pxHalfSize; }; +uint64_t CalculateOverlayPriority(int minZoomLevel, uint8_t rank, float depth); + } // namespace dp diff --git a/drape/overlay_tree.cpp b/drape/overlay_tree.cpp index 846025ce56..cf4576f05d 100644 --- a/drape/overlay_tree.cpp +++ b/drape/overlay_tree.cpp @@ -1,25 +1,91 @@ #include "drape/overlay_tree.hpp" +#include "std/algorithm.hpp" #include "std/bind.hpp" namespace dp { -void OverlayTree::StartOverlayPlacing(ScreenBase const & screen, bool canOverlap) +int const kFrameUpdarePeriod = 10; +int const kAverageHandlesCount[dp::OverlayRanksCount] = { 300, 200, 100 }; + +using TOverlayContainer = buffer_vector; + +namespace { - m_traits.m_modelView = screen; - m_canOverlap = canOverlap; - ASSERT(IsEmpty(), ()); + +class HandleComparator +{ +public: + bool operator()(OverlayTree::THandle const & l, OverlayTree::THandle const & r) const + { + return IsGreater(l.first, r.first); + } + + bool IsGreater(ref_ptr const & l, ref_ptr const & r) const + { + uint64_t const mask = l->GetPriorityMask() & r->GetPriorityMask(); + uint64_t const priorityLeft = l->GetPriority() & mask; + uint64_t const priorityRight = r->GetPriority() & mask; + if (priorityLeft > priorityRight) + return true; + + if (priorityLeft == priorityRight) + { + auto const & hashLeft = l->GetFeatureID(); + auto const & hashRight = r->GetFeatureID(); + if (hashLeft < hashRight) + return true; + + if (hashLeft == hashRight) + return l.get() < r.get(); + } + + return false; + } +}; + +} // namespace + +OverlayTree::OverlayTree() + : m_frameCounter(-1) +{ + for (size_t i = 0; i < m_handles.size(); i++) + m_handles[i].reserve(kAverageHandlesCount[i]); } -void OverlayTree::Add(RefPointer handle) +void OverlayTree::Frame() +{ + m_frameCounter++; + if (m_frameCounter >= kFrameUpdarePeriod) + m_frameCounter = -1; +} + +bool OverlayTree::IsNeedUpdate() const +{ + return m_frameCounter == -1; +} + +void OverlayTree::ForceUpdate() +{ + Clear(); + m_frameCounter = -1; +} + +void OverlayTree::StartOverlayPlacing(ScreenBase const & screen) +{ + ASSERT(IsNeedUpdate(), ()); + Clear(); + m_traits.m_modelView = screen; +} + +void OverlayTree::Add(ref_ptr handle, bool isTransparent) { ScreenBase const & modelView = GetModelView(); - handle->SetIsVisible(m_canOverlap); - handle->Update(modelView); + handle->SetIsVisible(false); - if (!handle->IsValid()) + if (!handle->Update(modelView)) return; m2::RectD const pixelRect = handle->GetPixelRect(modelView); @@ -29,43 +95,149 @@ void OverlayTree::Add(RefPointer handle) return; } - typedef buffer_vector, 8> OverlayContainerT; - OverlayContainerT elements; - /* - * Find elements that already on OverlayTree and it's pixel rect - * intersect with handle pixel rect ("Intersected elements") - */ - ForEachInRect(pixelRect, [&] (RefPointer r) + int const rank = handle->GetOverlayRank(); + ASSERT_LESS(rank, m_handles.size(), ()); + m_handles[rank].emplace_back(make_pair(handle, isTransparent)); +} + +void OverlayTree::InsertHandle(ref_ptr handle, bool isTransparent, + detail::OverlayInfo const & parentOverlay) +{ + ScreenBase const & modelView = GetModelView(); + m2::RectD const pixelRect = handle->GetPixelRect(modelView); + + TOverlayContainer elements; + + // Find elements that already on OverlayTree and it's pixel rect + // intersect with handle pixel rect ("Intersected elements"). + ForEachInRect(pixelRect, [&] (detail::OverlayInfo const & info) { - if (handle->IsIntersect(modelView, *r.GetRaw())) - elements.push_back(r); + bool const isParent = (info == parentOverlay); + if (!isParent && isTransparent == info.m_isTransparent && + handle->IsIntersect(modelView, info.m_handle)) + elements.push_back(info); }); - double const inputPriority = handle->GetPriority(); - /* - * In this loop we decide which element must be visible - * If input element "handle" more priority than all "Intersected elements" - * than we remove all "Intersected elements" and insert input element "handle" - * But if some of already inserted elements more priority than we don't insert "handle" - */ - for (OverlayContainerT::const_iterator it = elements.begin(); it != elements.end(); ++it) - if (inputPriority < (*it)->GetPriority()) + bool const boundToParent = (parentOverlay.m_handle != nullptr && handle->IsBound()); + + // If handle is bound to its parent, parent's handle will be used. + ref_ptr handleToCompare = handle; + if (boundToParent) + handleToCompare = parentOverlay.m_handle; + + // In this loop we decide which element must be visible. + // If input element "handle" more priority than all "Intersected elements" + // than we remove all "Intersected elements" and insert input element "handle". + // But if some of already inserted elements more priority than we don't insert "handle". + HandleComparator comparator; + for (auto const & info : elements) + { + if (comparator.IsGreater(info.m_handle, handleToCompare)) + { + // Handle is displaced and bound to its parent, parent will be displaced too. + if (boundToParent) + Erase(parentOverlay); return; + } + } - for (OverlayContainerT::const_iterator it = elements.begin(); it != elements.end(); ++it) - Erase(*it); + // Current overlay displaces other overlay, delete them. + for (auto const & info : elements) + AddHandleToDelete(info); - BaseT::Add(handle, pixelRect); + for (auto const & handle : m_handlesToDelete) + Erase(handle); + + m_handlesToDelete.clear(); + + TBase::Add(detail::OverlayInfo(handle, isTransparent), pixelRect); } void OverlayTree::EndOverlayPlacing() { - ForEach([] (RefPointer handle) - { - handle->SetIsVisible(true); - }); + HandleComparator comparator; - Clear(); + for (int rank = 0; rank < dp::OverlayRanksCount; rank++) + { + sort(m_handles[rank].begin(), m_handles[rank].end(), comparator); + for (auto const & handle : m_handles[rank]) + { + detail::OverlayInfo parentOverlay; + if (!CheckHandle(handle.first, rank, parentOverlay)) + continue; + + InsertHandle(handle.first, handle.second, parentOverlay); + } + + m_handles[rank].clear(); + } + + ForEach([] (detail::OverlayInfo const & info) + { + info.m_handle->SetIsVisible(true); + }); +} + +bool OverlayTree::CheckHandle(ref_ptr handle, int currentRank, + detail::OverlayInfo & parentOverlay) const +{ + if (currentRank == dp::OverlayRank0) + return true; + + int const seachingRank = currentRank - 1; + return FindNode([&](detail::OverlayInfo const & info) -> bool + { + if (info.m_handle->GetFeatureID() == handle->GetFeatureID() && + info.m_handle->GetOverlayRank() == seachingRank) + { + parentOverlay = info; + return true; + } + return false; + }); +} + +void OverlayTree::AddHandleToDelete(detail::OverlayInfo const & overlay) +{ + if (overlay.m_handle->IsBound()) + { + ForEach([&](detail::OverlayInfo const & info) + { + if (info.m_handle->GetFeatureID() == overlay.m_handle->GetFeatureID()) + { + if (find(m_handlesToDelete.begin(), + m_handlesToDelete.end(), info) == m_handlesToDelete.end()) + m_handlesToDelete.push_back(info); + } + }); + } + else + { + if (find(m_handlesToDelete.begin(), + m_handlesToDelete.end(), overlay) == m_handlesToDelete.end()) + m_handlesToDelete.push_back(overlay); + } +} + +void OverlayTree::Select(m2::RectD const & rect, TSelectResult & result) const +{ + ScreenBase screen = m_traits.m_modelView; + ForEachInRect(rect, [&](detail::OverlayInfo const & info) + { + if (info.m_handle->IsVisible() && info.m_handle->GetFeatureID().IsValid()) + { + OverlayHandle::Rects shape; + info.m_handle->GetPixelShape(screen, shape); + for (m2::RectF const & rShape : shape) + { + if (rShape.IsIntersect(m2::RectF(rect))) + { + result.push_back(info.m_handle); + break; + } + } + } + }); } } // namespace dp diff --git a/drape/overlay_tree.hpp b/drape/overlay_tree.hpp index 252c60dab4..1644c6775c 100644 --- a/drape/overlay_tree.hpp +++ b/drape/overlay_tree.hpp @@ -5,6 +5,10 @@ #include "geometry/screenbase.hpp" #include "geometry/tree4d.hpp" +#include "base/buffer_vector.hpp" + +#include "std/array.hpp" +#include "std/vector.hpp" namespace dp { @@ -12,32 +16,66 @@ namespace dp namespace detail { +struct OverlayInfo +{ + ref_ptr m_handle; + bool m_isTransparent = false; + + OverlayInfo() = default; + OverlayInfo(ref_ptr handle, bool isTransparent) + : m_handle(handle) + , m_isTransparent(isTransparent) + {} + + bool operator==(OverlayInfo const & rhs) const + { + return m_handle == rhs.m_handle && m_isTransparent == rhs.m_isTransparent; + } +}; + struct OverlayTraits { ScreenBase m_modelView; - inline m2::RectD const LimitRect(RefPointer handle) + inline m2::RectD const LimitRect(OverlayInfo const & info) { - return handle->GetPixelRect(m_modelView); + return info.m_handle->GetPixelRect(m_modelView); } }; } -class OverlayTree : public m4::Tree, detail::OverlayTraits> +class OverlayTree : public m4::Tree { - typedef m4::Tree, detail::OverlayTraits> BaseT; + using TBase = m4::Tree; public: - void StartOverlayPlacing(ScreenBase const & screen, bool canOverlap = false); - void Add(RefPointer handle); + OverlayTree(); + + void Frame(); + bool IsNeedUpdate() const; + void ForceUpdate(); + + void StartOverlayPlacing(ScreenBase const & screen); + void Add(ref_ptr handle, bool isTransparent); void EndOverlayPlacing(); + using TSelectResult = buffer_vector, 8>; + void Select(m2::RectD const & rect, TSelectResult & result) const; + + using THandle = pair, bool>; + private: ScreenBase const & GetModelView() const { return m_traits.m_modelView; } + void InsertHandle(ref_ptr handle, bool isTransparent, + detail::OverlayInfo const & parentOverlay); + bool CheckHandle(ref_ptr handle, int currentRank, + detail::OverlayInfo & parentOverlay) const; + void AddHandleToDelete(detail::OverlayInfo const & overlay); -private: - bool m_canOverlap; + int m_frameCounter; + array, dp::OverlayRanksCount> m_handles; + vector m_handlesToDelete; }; } // namespace dp diff --git a/drape/pointers.cpp b/drape/pointers.cpp index fef3831d88..5b8c28c205 100644 --- a/drape/pointers.cpp +++ b/drape/pointers.cpp @@ -1,46 +1,59 @@ #include "drape/pointers.hpp" +#include "base/logging.hpp" -namespace dp +DpPointerTracker & DpPointerTracker::Instance() { - -PointerTracker::~PointerTracker() -{ - ASSERT(m_countMap.empty(), ()); + static DpPointerTracker pointersTracker; + return pointersTracker; } -void PointerTracker::Deref(void * p) +DpPointerTracker::~DpPointerTracker() { - threads::MutexGuard g(m_mutex); - if (p == NULL) - return; + ASSERT(m_alivePointers.empty(), ()); +} - map_t::iterator it = m_countMap.find(p); - ASSERT(it != m_countMap.end(), ()); - ASSERT(it->second.first > 0, ()); - - if (--it->second.first == 0) +void DpPointerTracker::RefPtrNamed(void * refPtr, string const & name) +{ + lock_guard lock(m_mutex); + if (refPtr != nullptr) { - ASSERT(m_alivePointers.find(p) == m_alivePointers.end(), ("Pointer leak for type : ", it->second.second)); - m_countMap.erase(it); + auto it = m_alivePointers.find(refPtr); + if (it != m_alivePointers.end()) + it->second.first++; + else + m_alivePointers.insert(make_pair(refPtr, make_pair(1, name))); } } -void PointerTracker::Destroy(void * p) +void DpPointerTracker::DestroyPtr(void * p) { - threads::MutexGuard g(m_mutex); - if (p == NULL) - return; - - map_t::iterator it = m_countMap.find(p); - if (it == m_countMap.end()) // suppress warning in release build - ASSERT(false, ()); - - ASSERT(it->second.first == 1, ("Delete memory with more than one user : ", it->second.second)); - ASSERT(m_alivePointers.erase(p) == 1, ()); + lock_guard lock(m_mutex); + ASSERT(p != nullptr, ()); + auto it = m_alivePointers.find(p); + if (it != m_alivePointers.end()) + { + ASSERT(it->second.first == 0, ("Drape pointer [", it->second.second, p, + "] was destroyed, but had references, ref count = ", + it->second.first)); + m_alivePointers.erase(it); + } } -#if defined(CHECK_POINTERS) - PointerTracker g_tracker; -#endif +void DpPointerTracker::DerefPtr(void * p) +{ + lock_guard lock(m_mutex); + if (p != nullptr) + { + auto it = m_alivePointers.find(p); + if (it != m_alivePointers.end()) + { + ASSERT(it->second.first > 0, ()); + it->second.first--; + } + } +} -} // namespace dp +DpPointerTracker::TAlivePointers const & DpPointerTracker::GetAlivePointers() const +{ + return m_alivePointers; +} diff --git a/drape/pointers.hpp b/drape/pointers.hpp index e5b64b9709..66a4eeea09 100644 --- a/drape/pointers.hpp +++ b/drape/pointers.hpp @@ -4,298 +4,209 @@ #include "base/mutex.hpp" #include "std/map.hpp" +#include "std/mutex.hpp" +#include "std/type_traits.hpp" #include "std/typeinfo.hpp" -namespace dp -{ +//#define TRACK_POINTERS -class PointerTracker +/// This class tracks usage of drape_ptr's and ref_ptr's +class DpPointerTracker { public: - ~PointerTracker(); + typedef map > TAlivePointers; + + static DpPointerTracker & Instance(); template - void Ref(T * p, bool needDestroyCheck) + void RefPtr(T * refPtr) { - threads::MutexGuard g(m_mutex); - if (p == NULL) - return; - - map_t::iterator it = m_countMap.find(p); - if (it == m_countMap.end()) - { - m_countMap.insert(make_pair((void *)p, make_pair(1, typeid(p).name()))); - if (needDestroyCheck) - m_alivePointers.insert(p); - } - else - it->second.first++; + RefPtrNamed(static_cast(refPtr), typeid(refPtr).name()); } - void Deref(void * p); - void Destroy(void * p); + void DerefPtr(void * p); + + void DestroyPtr(void * p); + + TAlivePointers const & GetAlivePointers() const; private: - typedef map > map_t; - map_t m_countMap; - typedef set alive_pointers_t; - alive_pointers_t m_alivePointers; - threads::Mutex m_mutex; + DpPointerTracker() = default; + ~DpPointerTracker(); + + void RefPtrNamed(void * refPtr, string const & name); + + TAlivePointers m_alivePointers; + mutex m_mutex; }; -#define DISABLE_DEBUG_PRT_TRACKING +// Custom deleter for unique_ptr +class DpPointerDeleter +{ +public: + template + void operator()(T * p) + { + DpPointerTracker::Instance().DestroyPtr(p); + delete p; + } +}; -#if defined(DEBUG) && !defined(DISABLE_DEBUG_PRT_TRACKING) - #define CHECK_POINTERS -#endif - -#if defined(CHECK_POINTERS) - extern PointerTracker g_tracker; - - #define REF_POINTER(p, c) g_tracker.Ref(p, c) - #define DEREF_POINTER(p) g_tracker.Deref(p) - #define DESTROY_POINTER(p) g_tracker.Destroy(p) - - #define DECLARE_CHECK bool m_checkOnDestroy - #define DECLARE_CHECK_GET bool IsCheckOnDestroy() const { return m_checkOnDestroy; } - #define DECLARE_CHECK_SET void SetCheckOnDestroy(bool doCheck) { m_checkOnDestroy = doCheck; } - #define SET_CHECK_FLAG(x) SetCheckOnDestroy(x) - #define GET_CHECK_FLAG(x) (x).IsCheckOnDestroy() - #define ASSERT_CHECK_FLAG(x) ASSERT(GET_CHECK_FLAG(x), ()) +#if defined(TRACK_POINTERS) +template using drape_ptr = unique_ptr; #else - #define REF_POINTER(p, c) - #define DEREF_POINTER(p) - #define DESTROY_POINTER(p) - - #define DECLARE_CHECK - #define DECLARE_CHECK_GET - #define DECLARE_CHECK_SET - #define SET_CHECK_FLAG(x) - #define GET_CHECK_FLAG(x) false - #define ASSERT_CHECK_FLAG(x) +template using drape_ptr = unique_ptr; #endif -template -class DrapePointer +template +drape_ptr make_unique_dp(Args &&... args) +{ + return drape_ptr(new T(std::forward(args)...)); +} + +template +class ref_ptr { public: - DrapePointer() : m_p(NULL) { SET_CHECK_FLAG(true); } + ref_ptr() + : m_ptr(nullptr), m_isOwnerUnique(false) + {} - bool operator==(DrapePointer const & other) const + ref_ptr(T * ptr, bool isOwnerUnique = false) + : m_ptr(ptr), m_isOwnerUnique(isOwnerUnique) { - return m_p == other.m_p; +#if defined(TRACK_POINTERS) + if (m_isOwnerUnique) + DpPointerTracker::Instance().RefPtr(m_ptr); +#endif } -protected: - DrapePointer(T * p, bool needDestroyedCheck = true) - : m_p(p) + ref_ptr(ref_ptr const & rhs) + : m_ptr(rhs.m_ptr), m_isOwnerUnique(rhs.m_isOwnerUnique) { - SET_CHECK_FLAG(needDestroyedCheck); - REF_POINTER(m_p, GET_CHECK_FLAG(*this)); +#if defined(TRACK_POINTERS) + if (m_isOwnerUnique) + DpPointerTracker::Instance().RefPtr(m_ptr); +#endif } - DrapePointer(DrapePointer const & other) - : m_p(NULL) + ref_ptr(ref_ptr && rhs) { - SET_CHECK_FLAG(GET_CHECK_FLAG(other)); - Reset(other.GetNonConstRaw()); + m_ptr = rhs.m_ptr; + rhs.m_ptr = nullptr; + + m_isOwnerUnique = rhs.m_isOwnerUnique; + rhs.m_isOwnerUnique = false; } - DrapePointer & operator=(DrapePointer const & other) + ~ref_ptr() { - SET_CHECK_FLAG(GET_CHECK_FLAG(other)); - Reset(other.GetNonConstRaw()); +#if defined(TRACK_POINTERS) + if (m_isOwnerUnique) + DpPointerTracker::Instance().DerefPtr(m_ptr); +#endif + m_ptr = nullptr; + } + + T * operator->() const { return m_ptr; } + + template + operator ref_ptr() const + { + static_assert(is_base_of::value || is_base_of::value || + is_void::value || is_void::value, ""); + return ref_ptr(static_cast(m_ptr), m_isOwnerUnique); + } + + template + ref_ptr downcast() const + { + ASSERT(dynamic_cast(m_ptr) != nullptr, ()); + return ref_ptr(static_cast(m_ptr), m_isOwnerUnique); + } + + operator bool() const { return m_ptr != nullptr; } + + bool operator==(ref_ptr const & rhs) const { return m_ptr == rhs.m_ptr; } + + bool operator==(T * rhs) const { return m_ptr == rhs; } + + bool operator!=(ref_ptr const & rhs) const { return !operator==(rhs); } + + bool operator!=(T * rhs) const { return !operator==(rhs); } + + bool operator<(ref_ptr const & rhs) const { return m_ptr < rhs.m_ptr; } + + template::value>::type> + TResult & operator*() const + { + return *m_ptr; + } + + ref_ptr & operator=(ref_ptr const & rhs) + { + if (this == &rhs) + return *this; + +#if defined(TRACK_POINTERS) + if (m_isOwnerUnique) + DpPointerTracker::Instance().DerefPtr(m_ptr); +#endif + + m_ptr = rhs.m_ptr; + m_isOwnerUnique = rhs.m_isOwnerUnique; + +#if defined(TRACK_POINTERS) + if (m_isOwnerUnique) + DpPointerTracker::Instance().RefPtr(m_ptr); +#endif + return *this; } - void Destroy() + ref_ptr & operator=(ref_ptr && rhs) { - DESTROY_POINTER(m_p); - delete m_p; - DEREF_POINTER(m_p); - m_p = NULL; - } + if (this == &rhs) + return *this; - void Reset(T * p) - { - ResetImpl(p); - } +#if defined(TRACK_POINTERS) + if (m_isOwnerUnique) + DpPointerTracker::Instance().DerefPtr(m_ptr); +#endif - T * GetRaw() { return m_p; } - T const * GetRaw() const { return m_p; } - T * GetNonConstRaw() const { return m_p; } + m_ptr = rhs.m_ptr; + rhs.m_ptr = nullptr; - DECLARE_CHECK_GET; - DECLARE_CHECK_SET; + m_isOwnerUnique = rhs.m_isOwnerUnique; + rhs.m_isOwnerUnique = false; - // Need to be const for copy constructor and assigment operator of TransfromPointer - void SetToNull() const - { - ResetImpl(NULL); - } - -private: - void ResetImpl(T * p) const - { - DEREF_POINTER(m_p); - m_p = p; - REF_POINTER(m_p, GET_CHECK_FLAG(*this)); - } - -private: - // Mutable for Move method - mutable T * m_p; - DECLARE_CHECK; -}; - -template class MasterPointer; - -template -class TransferPointer : public DrapePointer -{ - typedef DrapePointer base_t; -public: - TransferPointer(TransferPointer const & other) - : base_t(other) - { - ASSERT_CHECK_FLAG(other); - other.SetToNull(); - } - - TransferPointer & operator=(TransferPointer const & other) - { - ASSERT_CHECK_FLAG(other); - base_t::operator =(other); - other.SetToNull(); return *this; } - ~TransferPointer() - { - ASSERT(base_t::GetRaw() == NULL, ()); - Destroy(); - } - void Destroy() { base_t::Destroy(); } - // IsNull need for test - bool IsNull() { return base_t::GetRaw() == NULL; } + T * get() const { return m_ptr; } private: - friend class MasterPointer; - TransferPointer() {} - explicit TransferPointer(T * p) : base_t(p) {} -}; + T* m_ptr; + bool m_isOwnerUnique; -template class RefPointer; -template RefPointer MakeStackRefPointer(T * p); - -template -class RefPointer : public DrapePointer -{ - typedef DrapePointer base_t; -public: - RefPointer() : base_t() {} - ~RefPointer() { base_t::Reset(NULL); } - - template - RefPointer(RefPointer const & p) : base_t(p.GetNonConstRaw(), GET_CHECK_FLAG(p)) {} - - bool IsContentLess(RefPointer const & other) const { return *GetRaw() < *other.GetRaw(); } - bool IsNull() const { return base_t::GetRaw() == NULL; } - T * operator->() { return base_t::GetRaw(); } - T const * operator->() const { return base_t::GetRaw(); } - T * GetRaw() { return base_t::GetRaw(); } - T const * GetRaw() const { return base_t::GetRaw(); } - -private: - template friend class RefPointer; - friend class MasterPointer; - friend RefPointer MakeStackRefPointer(T *); - explicit RefPointer(T * p, bool needDestroyedCheck = true) : base_t(p, needDestroyedCheck) {} + template + friend inline string DebugPrint(ref_ptr const & v); }; template -RefPointer MakeStackRefPointer(T * p) { return RefPointer(p, false); } - -template -class MasterPointer : public DrapePointer +inline string DebugPrint(ref_ptr const & v) { - typedef DrapePointer base_t; -public: - MasterPointer() : base_t() {} - explicit MasterPointer(T * p) : base_t(p) {} - explicit MasterPointer(TransferPointer & transferPointer) - { - Reset(transferPointer.GetRaw()); - transferPointer.Reset(NULL); - } - - ~MasterPointer() - { - base_t::Reset(NULL); - } - - RefPointer GetRefPointer() const - { - return RefPointer(base_t::GetNonConstRaw()); - } - - TransferPointer Move() - { - TransferPointer result(GetRaw()); - base_t::Reset(NULL); - return result; - } - - void Destroy() - { - Reset(NULL); - } - - void Reset(T * p) - { - base_t::Destroy(); - base_t::Reset(p); - } - - bool IsNull() const { return base_t::GetRaw() == NULL; } - T * operator->() { return base_t::GetRaw(); } - T const * operator->() const { return base_t::GetRaw(); } - T * GetRaw() { return base_t::GetRaw(); } - T const * GetRaw() const { return base_t::GetRaw(); } -}; - -template -TransferPointer MovePointer(T * p) -{ - return MasterPointer(p).Move(); + return DebugPrint(v.m_ptr); } template -T * NonConstGetter(dp::MasterPointer & p) +ref_ptr make_ref(drape_ptr const & drapePtr) { - return p.GetRaw(); + return ref_ptr(drapePtr.get(), true); } -struct MasterPointerDeleter +template +ref_ptr make_ref(T* ptr) { - template - void operator() (pair > & value) - { - Destroy(value.second); - } - - template - void operator() (MasterPointer & value) - { - Destroy(value); - } - -private: - template - void Destroy(MasterPointer & value) - { - value.Destroy(); - } -}; - -} // namespace dp + return ref_ptr(ptr, false); +} diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp index 6242cdf2cb..b02401d7c5 100644 --- a/drape/render_bucket.cpp +++ b/drape/render_bucket.cpp @@ -1,9 +1,10 @@ #include "drape/render_bucket.hpp" -#include "drape/overlay_handle.hpp" #include "drape/attribute_buffer_mutator.hpp" -#include "drape/vertex_array_buffer.hpp" +#include "drape/debug_rect_renderer.hpp" +#include "drape/overlay_handle.hpp" #include "drape/overlay_tree.hpp" +#include "drape/vertex_array_buffer.hpp" #include "base/stl_add.hpp" #include "std/bind.hpp" @@ -11,63 +12,110 @@ namespace dp { -RenderBucket::RenderBucket(TransferPointer buffer) - : m_buffer(buffer) +RenderBucket::RenderBucket(drape_ptr && buffer) + : m_buffer(move(buffer)) { } RenderBucket::~RenderBucket() { - m_buffer.Destroy(); - (void)GetRangeDeletor(m_overlay, MasterPointerDeleter())(); } -RefPointer RenderBucket::GetBuffer() +ref_ptr RenderBucket::GetBuffer() { - return m_buffer.GetRefPointer(); + return make_ref(m_buffer); } -void RenderBucket::AddOverlayHandle(TransferPointer handle) +drape_ptr && RenderBucket::MoveBuffer() { - m_overlay.push_back(MasterPointer(handle)); + return move(m_buffer); +} + +size_t RenderBucket::GetOverlayHandlesCount() const +{ + return m_overlay.size(); +} + +drape_ptr RenderBucket::PopOverlayHandle() +{ + ASSERT(!m_overlay.empty(), ()); + size_t lastElement = m_overlay.size() - 1; + swap(m_overlay[0], m_overlay[lastElement]); + drape_ptr h = move(m_overlay[lastElement]); + m_overlay.pop_back(); + return h; +} + +ref_ptr RenderBucket::GetOverlayHandle(size_t index) +{ + return make_ref(m_overlay[index]); +} + +void RenderBucket::AddOverlayHandle(drape_ptr && handle) +{ + m_overlay.push_back(move(handle)); } void RenderBucket::Update(ScreenBase const & modelView) { - for_each(m_overlay.begin(), m_overlay.end(), bind(&OverlayHandle::Update, - bind(&dp::NonConstGetter, _1), - modelView)); + for (drape_ptr & overlayHandle : m_overlay) + { + if (overlayHandle->IsVisible()) + overlayHandle->Update(modelView); + } } -void RenderBucket::CollectOverlayHandles(RefPointer tree) +void RenderBucket::CollectOverlayHandles(ref_ptr tree, bool isTransparent) { - for_each(m_overlay.begin(), m_overlay.end(), bind(&OverlayTree::Add, tree.GetRaw(), - bind(&MasterPointer::GetRefPointer, _1))); + for (drape_ptr const & overlayHandle : m_overlay) + tree->Add(make_ref(overlayHandle), isTransparent); } void RenderBucket::Render(ScreenBase const & screen) { + ASSERT(m_buffer != nullptr, ()); + if (!m_overlay.empty()) { // in simple case when overlay is symbol each element will be contains 6 indexes AttributeBufferMutator attributeMutator; IndexBufferMutator indexMutator(6 * m_overlay.size()); - RefPointer rfpIndex = MakeStackRefPointer(&indexMutator); - RefPointer rfpAttrib = MakeStackRefPointer(&attributeMutator); + ref_ptr rfpIndex = make_ref(&indexMutator); + ref_ptr rfpAttrib = make_ref(&attributeMutator); - for_each(m_overlay.begin(), m_overlay.end(), [&] (MasterPointer handle) + bool hasIndexMutation = false; + for (drape_ptr const & handle : m_overlay) { - if (handle->IsValid() && handle->IsVisible()) + if (handle->IndexesRequired()) { - handle->GetElementIndexes(rfpIndex); - if (handle->HasDynamicAttributes()) - handle->GetAttributeMutation(rfpAttrib, screen); + if (handle->IsVisible()) + handle->GetElementIndexes(rfpIndex); + hasIndexMutation = true; } - }); - m_buffer->ApplyMutation(rfpIndex, rfpAttrib); + if (handle->HasDynamicAttributes()) + handle->GetAttributeMutation(rfpAttrib, screen); + } + + m_buffer->ApplyMutation(hasIndexMutation ? rfpIndex : nullptr, rfpAttrib); } m_buffer->Render(); } +void RenderBucket::RenderDebug(ScreenBase const & screen) const +{ +#ifdef RENDER_DEBUG_RECTS + if (!m_overlay.empty()) + { + for (auto const & handle : m_overlay) + { + OverlayHandle::Rects rects; + handle->GetPixelShape(screen, rects); + for (auto const & rect : rects) + DebugRectRenderer::Instance().DrawRect(screen, rect); + } + } +#endif +} + } // namespace dp diff --git a/drape/render_bucket.hpp b/drape/render_bucket.hpp index d2948f1e9a..357ed5c200 100644 --- a/drape/render_bucket.hpp +++ b/drape/render_bucket.hpp @@ -14,28 +14,35 @@ class VertexArrayBuffer; class RenderBucket { public: - RenderBucket(TransferPointer buffer); + RenderBucket(drape_ptr && buffer); ~RenderBucket(); - RefPointer GetBuffer(); + ref_ptr GetBuffer(); + drape_ptr && MoveBuffer(); - void AddOverlayHandle(TransferPointer handle); + size_t GetOverlayHandlesCount() const; + drape_ptr PopOverlayHandle(); + ref_ptr GetOverlayHandle(size_t index); + void AddOverlayHandle(drape_ptr && handle); void Update(ScreenBase const & modelView); - void CollectOverlayHandles(RefPointer tree); + void CollectOverlayHandles(ref_ptr tree, bool isTransparent); void Render(ScreenBase const & screen); - /// Only for testing! Don't use this function in production code! + // Only for testing! Don't use this function in production code! + void RenderDebug(ScreenBase const & screen) const; + + // Only for testing! Don't use this function in production code! template void ForEachOverlay(ToDo const & todo) { - for (MasterPointer & h : m_overlay) - todo(h.GetRaw()); + for (drape_ptr const & h : m_overlay) + todo(make_ref(h)); } private: - vector > m_overlay; - MasterPointer m_buffer; + vector > m_overlay; + drape_ptr m_buffer; }; } // namespace dp diff --git a/drape/shaders/area_vertex_shader.vsh b/drape/shaders/area_vertex_shader.vsh new file mode 100644 index 0000000000..66f51554ea --- /dev/null +++ b/drape/shaders/area_vertex_shader.vsh @@ -0,0 +1,13 @@ +attribute vec3 a_position; +attribute vec2 a_colorTexCoords; + +uniform mat4 modelView; +uniform mat4 projection; + +varying vec2 v_colorTexCoords; + +void main(void) +{ + gl_Position = vec4(a_position, 1) * modelView * projection; + v_colorTexCoords = a_colorTexCoords; +} diff --git a/drape/shaders/button_fragment_shader.fsh b/drape/shaders/button_fragment_shader.fsh new file mode 100644 index 0000000000..c2db173581 --- /dev/null +++ b/drape/shaders/button_fragment_shader.fsh @@ -0,0 +1,9 @@ +uniform vec4 u_color; + +void main(void) +{ + if (u_color.a < 0.1) + discard; + + gl_FragColor = u_color; +} diff --git a/drape/shaders/button_vertex_shader.vsh b/drape/shaders/button_vertex_shader.vsh new file mode 100644 index 0000000000..af433ab884 --- /dev/null +++ b/drape/shaders/button_vertex_shader.vsh @@ -0,0 +1,10 @@ +attribute vec3 a_position; +attribute vec2 a_normal; + +uniform mat4 modelView; +uniform mat4 projection; + +void main(void) +{ + gl_Position = (vec4(a_normal, 0, 0) + vec4(a_position, 1) * modelView) * projection; +} diff --git a/drape/shaders/circle_shader.fsh b/drape/shaders/circle_shader.fsh new file mode 100644 index 0000000000..72d702c683 --- /dev/null +++ b/drape/shaders/circle_shader.fsh @@ -0,0 +1,13 @@ +uniform sampler2D u_colorTex; +uniform float u_opacity; + +varying vec2 v_colorTexCoords; +varying vec3 v_radius; + +void main(void) +{ + vec4 finalColor = texture2D(u_colorTex, v_colorTexCoords); + float stepValue = step(v_radius.z * v_radius.z, v_radius.x * v_radius.x + v_radius.y * v_radius.y); + finalColor.a = finalColor.a * u_opacity * (1.0 - stepValue); + gl_FragColor = finalColor; +} diff --git a/drape/shaders/circle_shader.vsh b/drape/shaders/circle_shader.vsh new file mode 100644 index 0000000000..c69aa2f3c3 --- /dev/null +++ b/drape/shaders/circle_shader.vsh @@ -0,0 +1,16 @@ +attribute vec3 a_position; +attribute vec3 a_normal; +attribute vec2 a_colorTexCoords; + +uniform mat4 modelView; +uniform mat4 projection; + +varying vec3 v_radius; +varying vec2 v_colorTexCoords; + +void main(void) +{ + gl_Position = (vec4(a_normal.xy, 0, 0) + vec4(a_position, 1) * modelView) * projection; + v_colorTexCoords = a_colorTexCoords; + v_radius = a_normal; +} diff --git a/drape/shaders/compass_vertex_shader.vsh b/drape/shaders/compass_vertex_shader.vsh new file mode 100644 index 0000000000..a7d1525415 --- /dev/null +++ b/drape/shaders/compass_vertex_shader.vsh @@ -0,0 +1,13 @@ +attribute vec2 a_position; +attribute vec2 a_colorTexCoords; + +uniform mat4 modelView; +uniform mat4 projection; + +varying vec2 v_colorTexCoords; + +void main(void) +{ + gl_Position = vec4(a_position, 0, 1) * modelView * projection; + v_colorTexCoords = a_colorTexCoords; +} diff --git a/drape/shaders/dashed_fragment_shader.fsh b/drape/shaders/dashed_fragment_shader.fsh new file mode 100644 index 0000000000..aaa41df3fb --- /dev/null +++ b/drape/shaders/dashed_fragment_shader.fsh @@ -0,0 +1,22 @@ +varying vec2 v_colorTexCoord; +varying vec2 v_halfLength; +varying vec2 v_maskTexCoord; + +uniform sampler2D u_colorTex; +uniform sampler2D u_maskTex; +uniform float u_opacity; + +const float aaPixelsCount = 2.5; + +void main(void) +{ + vec4 color = texture2D(u_colorTex, v_colorTexCoord); + vec4 mask = texture2D(u_maskTex, v_maskTexCoord); + color.a = color.a * mask.a * u_opacity; + + float currentW = abs(v_halfLength.x); + float diff = v_halfLength.y - currentW; + color.a *= mix(0.3, 1.0, clamp(diff / aaPixelsCount, 0.0, 1.0)); + + gl_FragColor = color; +} diff --git a/drape/shaders/dashed_vertex_shader.vsh b/drape/shaders/dashed_vertex_shader.vsh new file mode 100644 index 0000000000..411224f0fe --- /dev/null +++ b/drape/shaders/dashed_vertex_shader.vsh @@ -0,0 +1,30 @@ +attribute vec3 a_position; +attribute vec3 a_normal; +attribute vec2 a_colorTexCoord; +attribute vec4 a_maskTexCoord; + +uniform mat4 modelView; +uniform mat4 projection; + +varying vec2 v_colorTexCoord; +varying vec2 v_maskTexCoord; +varying vec2 v_halfLength; + +void main(void) +{ + vec2 normal = a_normal.xy; + float halfWidth = length(normal); + vec2 transformedAxisPos = (vec4(a_position.xy, 0.0, 1.0) * modelView).xy; + if (halfWidth != 0.0) + { + vec4 glbShiftPos = vec4(a_position.xy + normal, 0.0, 1.0); + vec2 shiftPos = (glbShiftPos * modelView).xy; + transformedAxisPos = transformedAxisPos + normalize(shiftPos - transformedAxisPos) * halfWidth; + } + + float uOffset = min(length(vec4(1, 0, 0, 0) * modelView) * a_maskTexCoord.x, 1.0); + v_colorTexCoord = a_colorTexCoord; + v_maskTexCoord = vec2(a_maskTexCoord.y + uOffset * a_maskTexCoord.z, a_maskTexCoord.w); + v_halfLength = vec2(sign(a_normal.z) * halfWidth, abs(a_normal.z)); + gl_Position = vec4(transformedAxisPos, a_position.z, 1.0) * projection; +} diff --git a/drape/shaders/debug_rect_fragment_shader.fsh b/drape/shaders/debug_rect_fragment_shader.fsh new file mode 100644 index 0000000000..688fe5fdba --- /dev/null +++ b/drape/shaders/debug_rect_fragment_shader.fsh @@ -0,0 +1,4 @@ +void main(void) +{ + gl_FragColor = vec4(1, 0, 0, 1); +} diff --git a/drape/shaders/debug_rect_vertex_shader.vsh b/drape/shaders/debug_rect_vertex_shader.vsh new file mode 100644 index 0000000000..c23b6da42d --- /dev/null +++ b/drape/shaders/debug_rect_vertex_shader.vsh @@ -0,0 +1,6 @@ +attribute vec2 a_position; + +void main(void) +{ + gl_Position = vec4(a_position, 0, 1); +} diff --git a/drape/shaders/doc/line_fragment_shader_fsh.txt b/drape/shaders/doc/line_fragment_shader_fsh.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/drape/shaders/doc/line_vertex_shader_vsh.txt b/drape/shaders/doc/line_vertex_shader_vsh.txt deleted file mode 100644 index a26ebcc508..0000000000 --- a/drape/shaders/doc/line_vertex_shader_vsh.txt +++ /dev/null @@ -1,15 +0,0 @@ -Transformation shader for lines. - -Attributes: -- position (vec4) x, y, z, 1 -- direction (vec4) Tx, Ty, lineHalfWidth - -To use this vertex shader you must format vertex data by this rule: - when we draw line we must create 2 triangle on one line segment but 2 vertex that produced by one line point - (vertex + halfWidthNormalVector). must be equal. Width will be computed in this shader. - For example we have one segment line { A = (0, 0), B = (10, 10) } - thiangles must be [ A, A, B, B]. - Direction is the vector for normal calculate, and direction for upper "A" must be opposite for direction for bottom "A" - [B - A, A - B, B - A, A - B] - In this case we can mul direction on modelView separate from position and get line rotation in pixel coordinate, - format normal and create a width of line diff --git a/drape/shaders/doc/normalize_vertex_shader_vsh.txt b/drape/shaders/doc/normalize_vertex_shader_vsh.txt deleted file mode 100644 index a7fe31b62a..0000000000 --- a/drape/shaders/doc/normalize_vertex_shader_vsh.txt +++ /dev/null @@ -1,23 +0,0 @@ -Transform point from mercator to current model view and forming triangles by normals - -mercatorPoint -> currentModelViewPoint -currentModelViewPoint + normal; - -Example: -vertex number 1 2 3 4 -pt stream = [{ 0.0, 0.0}, { 0.0, 0.0} , {0.0, 0.0} , {0.0, 0.0}] -normal stream = [{-1.0, 1.0}, {-1.0, -1.0} , {1.0, 1.0} , {1.0, -1.0}] -Type = Triangle strip - -1 3 -_____ -| /| -| . | -|/__| -2 4 - -attribute a_position - [x, y] - mercator position - [z ] - depth -attribute a_normal - [x, y] - forming normal diff --git a/drape/shaders/doc/simple_vertex_shader_vsh.txt b/drape/shaders/doc/simple_vertex_shader_vsh.txt deleted file mode 100644 index 579e883711..0000000000 --- a/drape/shaders/doc/simple_vertex_shader_vsh.txt +++ /dev/null @@ -1,8 +0,0 @@ -Simple transformation position by modelViewProjection - -Attributes: - - position (vec2) xy of point - - depth (float) z of point - -Uniforms: - - modelViewProjectionMatrix (mat4) \ No newline at end of file diff --git a/drape/shaders/doc/solid_color_fragment_shader_fsh.txt b/drape/shaders/doc/solid_color_fragment_shader_fsh.txt deleted file mode 100644 index e03a883694..0000000000 --- a/drape/shaders/doc/solid_color_fragment_shader_fsh.txt +++ /dev/null @@ -1,4 +0,0 @@ -Translate input uniform color into output gl_FragColor - -Uniforms: - - color (vec4) \ No newline at end of file diff --git a/drape/shaders/doc/texturing_fragment_shader_fsh.txt b/drape/shaders/doc/texturing_fragment_shader_fsh.txt deleted file mode 100644 index e5f77008de..0000000000 --- a/drape/shaders/doc/texturing_fragment_shader_fsh.txt +++ /dev/null @@ -1,7 +0,0 @@ -Transfer color from texture into gl_FragColor - -uniforms: - - textureUnit (sampler2D) - -varying: - - varTexCoords (vec4) coordinates of result color on texture “textureUnit†\ No newline at end of file diff --git a/drape/shaders/doc/texturing_vertex_shader_vsh.txt b/drape/shaders/doc/texturing_vertex_shader_vsh.txt deleted file mode 100644 index 6f20a957a8..0000000000 --- a/drape/shaders/doc/texturing_vertex_shader_vsh.txt +++ /dev/null @@ -1,13 +0,0 @@ -Translate global position into pixels by modelViewProjectionMatrix -Texture coordinates transfer without changes into (gl interpolator) pixel shader - -attributes: -- position (vec2) xy of point -- depth (float) z of point -- texCoords (vec4) texture coordinates of vertex - -uniforms: -- modelViewPorjectionMatrix (mat4) - -varying: -- varTexCoords (vec4) output texture coordinates filled by texCoords \ No newline at end of file diff --git a/drape/shaders/line_fragment_shader.fsh b/drape/shaders/line_fragment_shader.fsh index 8c17753893..addcef8a99 100644 --- a/drape/shaders/line_fragment_shader.fsh +++ b/drape/shaders/line_fragment_shader.fsh @@ -1,19 +1,19 @@ varying vec2 v_colorTexCoord; -varying vec2 v_maskTexCoord; -varying vec2 v_dxdy; +varying vec2 v_halfLength; uniform sampler2D u_colorTex; -uniform sampler2D u_maskTex; +uniform float u_opacity; + +const float aaPixelsCount = 2.5; void main(void) { - float mask = texture2D(u_maskTex, v_maskTexCoord).a; vec4 color = texture2D(u_colorTex, v_colorTexCoord); - - float domen = v_dxdy.x * v_dxdy.x + v_dxdy.y * v_dxdy.y; - - if (mask < 0.1 || domen > 1.0) - discard; - + color.a *= u_opacity; + + float currentW = abs(v_halfLength.x); + float diff = v_halfLength.y - currentW; + color.a *= mix(0.3, 1.0, clamp(diff / aaPixelsCount, 0.0, 1.0)); + gl_FragColor = color; } diff --git a/drape/shaders/line_vertex_shader.vsh b/drape/shaders/line_vertex_shader.vsh index 5df46717b2..957b5a2e3a 100644 --- a/drape/shaders/line_vertex_shader.vsh +++ b/drape/shaders/line_vertex_shader.vsh @@ -1,26 +1,27 @@ attribute vec3 a_position; -attribute vec2 a_normal; +attribute vec3 a_normal; attribute vec2 a_colorTexCoord; -attribute vec2 a_maskTexCoord; -attribute vec2 a_dxdy; uniform mat4 modelView; uniform mat4 projection; varying vec2 v_colorTexCoord; varying vec2 v_maskTexCoord; -varying vec2 v_dxdy; +varying vec2 v_halfLength; void main(void) { - float halfWidth = length(a_normal); + vec2 normal = a_normal.xy; + float halfWidth = length(normal); vec2 transformedAxisPos = (vec4(a_position.xy, 0.0, 1.0) * modelView).xy; - vec4 glbShiftPos = vec4(a_position.xy + a_normal, 0.0, 1.0); - vec2 shiftPos = (glbShiftPos * modelView).xy; - vec2 pxNormal = normalize(shiftPos - transformedAxisPos); + if (halfWidth != 0.0) + { + vec4 glbShiftPos = vec4(a_position.xy + normal, 0.0, 1.0); + vec2 shiftPos = (glbShiftPos * modelView).xy; + transformedAxisPos = transformedAxisPos + normalize(shiftPos - transformedAxisPos) * halfWidth; + } v_colorTexCoord = a_colorTexCoord; - v_maskTexCoord = a_maskTexCoord; - v_dxdy = a_dxdy; - gl_Position = vec4(transformedAxisPos + pxNormal * halfWidth, a_position.z, 1.0) * projection; + v_halfLength = vec2(sign(a_normal.z) * halfWidth, abs(a_normal.z)); + gl_Position = vec4(transformedAxisPos, a_position.z, 1.0) * projection; } diff --git a/drape/shaders/my_position_shader.vsh b/drape/shaders/my_position_shader.vsh new file mode 100644 index 0000000000..191d711799 --- /dev/null +++ b/drape/shaders/my_position_shader.vsh @@ -0,0 +1,29 @@ +attribute vec2 a_normal; +attribute vec2 a_colorTexCoords; + +uniform vec3 u_position; +uniform float u_azimut; + +uniform mat4 modelView; +uniform mat4 projection; + +varying vec2 v_colorTexCoords; + +void main(void) +{ + float sinV = sin(u_azimut); + float cosV = cos(u_azimut); + + mat4 rotation; + rotation[0] = vec4(cosV, sinV, 0.0, 0.0); + rotation[1] = vec4(-sinV, cosV, 0.0, 0.0); + rotation[2] = vec4(0.0, 0.0, 1.0, 0.0); + rotation[3] = vec4(0.0, 0.0, 0.0, 1.0); + + lowp vec4 pos = vec4(u_position, 1.0) * modelView; + highp vec4 normal = vec4(a_normal, 0, 0); + highp vec4 shiftedPos = normal * rotation + pos; + + gl_Position = shiftedPos * projection; + v_colorTexCoords = a_colorTexCoords; +} diff --git a/drape/shaders/path_symbol_vertex_shader.vsh b/drape/shaders/path_symbol_vertex_shader.vsh new file mode 100644 index 0000000000..d7867c1029 --- /dev/null +++ b/drape/shaders/path_symbol_vertex_shader.vsh @@ -0,0 +1,17 @@ +attribute vec3 a_position; +attribute vec2 a_normal; +attribute vec2 a_colorTexCoords; + +uniform mat4 modelView; +uniform mat4 projection; + +varying vec2 v_colorTexCoords; + +void main(void) +{ + lowp vec4 pos = vec4(a_position, 1) * modelView; + highp vec4 norm = vec4(a_normal, 0, 0) * modelView; + highp vec4 shiftedPos = norm + pos; + gl_Position = shiftedPos * projection; + v_colorTexCoords = a_colorTexCoords; +} diff --git a/drape/shaders/position_accuracy_shader.vsh b/drape/shaders/position_accuracy_shader.vsh new file mode 100644 index 0000000000..af33e3f691 --- /dev/null +++ b/drape/shaders/position_accuracy_shader.vsh @@ -0,0 +1,19 @@ +attribute vec2 a_normal; +attribute vec2 a_colorTexCoords; + +uniform vec3 u_position; +uniform float u_accuracy; + +uniform mat4 modelView; +uniform mat4 projection; + +varying vec2 v_colorTexCoords; + +void main(void) +{ + vec4 position = vec4(u_position, 1.0) * modelView; + vec4 normal = vec4(normalize(a_normal) * u_accuracy, 0.0, 0.0); + gl_Position = (position + normal) * projection; + + v_colorTexCoords = a_colorTexCoords; +} diff --git a/drape/shaders/route_arrow_fragment_shader.fsh b/drape/shaders/route_arrow_fragment_shader.fsh new file mode 100644 index 0000000000..e08c95dabe --- /dev/null +++ b/drape/shaders/route_arrow_fragment_shader.fsh @@ -0,0 +1,31 @@ +varying vec3 v_length; + +uniform sampler2D u_colorTex; +uniform vec4 u_textureRect; + +uniform mat4 u_arrowBorders; + +vec2 calculateUv(vec2 len, vec4 arrowBorder) +{ + vec2 uv = vec2(0, 0); + if (len.x >= arrowBorder.x && len.x <= arrowBorder.z) + { + float coef = clamp((len.x - arrowBorder.x) / (arrowBorder.z - arrowBorder.x), 0.0, 1.0); + float u = mix(arrowBorder.y, arrowBorder.w, coef); + float v = 0.5 * len.y + 0.5; + uv = vec2(mix(u_textureRect.x, u_textureRect.z, u), mix(u_textureRect.y, u_textureRect.w, v)); + } + return uv; +} + +void main(void) +{ + vec4 arrowBorder = u_arrowBorders[0]; + vec2 uv = calculateUv(v_length.xy, u_arrowBorders[0]) + + calculateUv(v_length.xy, u_arrowBorders[1]) + + calculateUv(v_length.xy, u_arrowBorders[2]) + + calculateUv(v_length.xy, u_arrowBorders[3]); + + vec4 color = texture2D(u_colorTex, uv); + gl_FragColor = color; +} diff --git a/drape/shaders/route_fragment_shader.fsh b/drape/shaders/route_fragment_shader.fsh new file mode 100644 index 0000000000..55f7232ff7 --- /dev/null +++ b/drape/shaders/route_fragment_shader.fsh @@ -0,0 +1,12 @@ +varying vec3 v_length; + +uniform vec4 u_color; + +void main(void) +{ + vec4 color = u_color; + if (v_length.x < v_length.z) + color.a = 0.0; + + gl_FragColor = color; +} diff --git a/drape/shaders/route_vertex_shader.vsh b/drape/shaders/route_vertex_shader.vsh new file mode 100644 index 0000000000..0097ab1974 --- /dev/null +++ b/drape/shaders/route_vertex_shader.vsh @@ -0,0 +1,32 @@ +attribute vec3 a_position; +attribute vec2 a_normal; +attribute vec3 a_length; + +uniform mat4 modelView; +uniform mat4 projection; + +uniform vec3 u_routeParams; + +varying vec3 v_length; + +void main(void) +{ + float normalLen = length(a_normal); + vec2 transformedAxisPos = (vec4(a_position.xy, 0.0, 1.0) * modelView).xy; + vec2 len = vec2(a_length.x, a_length.z); + if (u_routeParams.x != 0.0 && normalLen != 0.0) + { + vec2 norm = a_normal * u_routeParams.x; + float actualHalfWidth = length(norm); + + vec4 glbShiftPos = vec4(a_position.xy + norm, 0.0, 1.0); + vec2 shiftPos = (glbShiftPos * modelView).xy; + transformedAxisPos = transformedAxisPos + normalize(shiftPos - transformedAxisPos) * actualHalfWidth; + + if (u_routeParams.y != 0.0) + len = vec2(a_length.x + a_length.y * u_routeParams.y, a_length.z); + } + + v_length = vec3(len, u_routeParams.z); + gl_Position = vec4(transformedAxisPos, a_position.z, 1.0) * projection; +} diff --git a/drape/shaders/ruler_vertex_shader.vsh b/drape/shaders/ruler_vertex_shader.vsh new file mode 100644 index 0000000000..3e2575c474 --- /dev/null +++ b/drape/shaders/ruler_vertex_shader.vsh @@ -0,0 +1,15 @@ +attribute vec2 a_position; +attribute vec2 a_normal; +attribute vec2 a_colorTexCoords; + +uniform vec2 u_position; +uniform float u_length; +uniform mat4 projection; + +varying vec2 v_colorTexCoords; + +void main(void) +{ + gl_Position = vec4(u_position + a_position + u_length * a_normal, 0, 1) * projection; + v_colorTexCoords = a_colorTexCoords; +} diff --git a/drape/shaders/shader_index.txt b/drape/shaders/shader_index.txt index eece273841..86bc27a0d5 100644 --- a/drape/shaders/shader_index.txt +++ b/drape/shaders/shader_index.txt @@ -1,3 +1,16 @@ +TEXT_PROGRAM text_vertex_shader.vsh text_fragment_shader.fsh +AREA_PROGRAM area_vertex_shader.vsh texturing_fragment_shader.fsh TEXTURING_PROGRAM texturing_vertex_shader.vsh texturing_fragment_shader.fsh LINE_PROGRAM line_vertex_shader.vsh line_fragment_shader.fsh -TEXT_PROGRAM text_vertex_shader.vsh text_fragment_shader.fsh +CAP_JOIN_PROGRAM circle_shader.vsh circle_shader.fsh +DASHED_LINE_PROGRAM dashed_vertex_shader.vsh dashed_fragment_shader.fsh +PATH_SYMBOL_LINE path_symbol_vertex_shader.vsh texturing_fragment_shader.fsh +COMPASS_PROGRAM compass_vertex_shader.vsh texturing_fragment_shader.fsh +RULER_PROGRAM ruler_vertex_shader.vsh texturing_fragment_shader.fsh +ACCURACY_PROGRAM position_accuracy_shader.vsh texturing_fragment_shader.fsh +MY_POSITION_PROGRAM my_position_shader.vsh texturing_fragment_shader.fsh +BUTTON_PROGRAM button_vertex_shader.vsh button_fragment_shader.fsh +BOOKMARK_PROGRAM user_mark.vsh texturing_fragment_shader.fsh +ROUTE_PROGRAM route_vertex_shader.vsh route_fragment_shader.fsh +ROUTE_ARROW_PROGRAM route_vertex_shader.vsh route_arrow_fragment_shader.fsh +DEBUG_RECT_PROGRAM debug_rect_vertex_shader.vsh debug_rect_fragment_shader.fsh diff --git a/drape/shaders/text_fragment_shader.fsh b/drape/shaders/text_fragment_shader.fsh index 48e021f400..7e9d33e713 100755 --- a/drape/shaders/text_fragment_shader.fsh +++ b/drape/shaders/text_fragment_shader.fsh @@ -1,59 +1,16 @@ varying vec2 v_colorTexCoord; -varying vec2 v_outlineColorTexCoord; varying vec2 v_maskTexCoord; uniform sampler2D u_colorTex; uniform sampler2D u_maskTex; - -const lowp float OUTLINE_MIN_VALUE0 = 0.41; -const lowp float OUTLINE_MIN_VALUE1 = 0.565; -const lowp float OUTLINE_MAX_VALUE0 = 0.57; -const lowp float OUTLINE_MAX_VALUE1 = 0.95; -const lowp float GLYPH_MIN_VALUE = 0.45; -const lowp float GLYPH_MAX_VALUE = 0.6; - -vec4 colorize(vec4 base, vec4 outline, float alpha) -{ - if (alpha > OUTLINE_MAX_VALUE1) - return vec4(outline.rgb, 0); - if (alpha > OUTLINE_MAX_VALUE0) - { - float oFactor = smoothstep(OUTLINE_MAX_VALUE1, OUTLINE_MAX_VALUE0, alpha); - return mix(vec4(outline.rgb,0), outline, oFactor); - } - if (alpha > OUTLINE_MIN_VALUE1) - { - return outline; - } - if (alpha > OUTLINE_MIN_VALUE0) - { - float oFactor = smoothstep(OUTLINE_MIN_VALUE0, OUTLINE_MIN_VALUE1, alpha); - return mix(base, outline, oFactor); - } - return base; -} - -vec4 without_outline(vec4 base, float alpha) -{ - if (alpha > GLYPH_MIN_VALUE) - { - float oFactor = smoothstep(GLYPH_MIN_VALUE, GLYPH_MAX_VALUE, alpha ); - return mix(base, vec4(1, 1, 1, 0), oFactor); - } - return base; -} +uniform float u_opacity; +uniform vec2 u_contrastGamma; void main (void) { - vec4 base = texture2D(u_colorTex, v_colorTexCoord); - vec4 outline = texture2D(u_colorTex, v_outlineColorTexCoord); - float alpha = texture2D(u_maskTex, v_maskTexCoord).a; - - vec4 finalColor; - if (outline.a > 0.1) - finalColor = colorize(base, outline, 1.0 - base.a * alpha); - else - finalColor = without_outline(base, 1.0 - base.a * alpha); - - gl_FragColor = finalColor; + vec4 glyphColor = texture2D(u_colorTex, v_colorTexCoord); + float dist = texture2D(u_maskTex, v_maskTexCoord).a; + float alpha = smoothstep(u_contrastGamma.x - u_contrastGamma.y, u_contrastGamma.x + u_contrastGamma.y, dist) * u_opacity; + glyphColor.a *= alpha; + gl_FragColor = glyphColor; } diff --git a/drape/shaders/text_vertex_shader.vsh b/drape/shaders/text_vertex_shader.vsh index 344a8c049c..4592b4f9d7 100755 --- a/drape/shaders/text_vertex_shader.vsh +++ b/drape/shaders/text_vertex_shader.vsh @@ -6,15 +6,26 @@ attribute vec2 a_maskTexCoord; uniform mat4 modelView; uniform mat4 projection; +uniform float u_isOutlinePass; varying vec2 v_colorTexCoord; varying vec2 v_maskTexCoord; -varying vec2 v_outlineColorTexCoord; + +const float Zero = 0.0; +const float One = 1.0; +const float BaseDepthShoft = -10.0; void main() { - gl_Position = (vec4(a_normal, 0, 0) + a_position * modelView) * projection; - v_colorTexCoord = a_colorTexCoord; + float isOutline = step(0.5, u_isOutlinePass); + float notOutline = One - isOutline; + float depthShift = BaseDepthShoft * isOutline; + + // Here we intentionally decrease precision of 'pos' calculation + // to eliminate jittering effect in process of billboard reconstruction. + lowp vec4 pos = (a_position + vec4(Zero, Zero, depthShift, Zero)) * modelView; + highp vec4 shiftedPos = vec4(a_normal, Zero, Zero) + pos; + gl_Position = shiftedPos * projection; + v_colorTexCoord = a_colorTexCoord * notOutline + a_outlineColorTexCoord * isOutline; v_maskTexCoord = a_maskTexCoord; - v_outlineColorTexCoord = a_outlineColorTexCoord; } diff --git a/drape/shaders/texturing_fragment_shader.fsh b/drape/shaders/texturing_fragment_shader.fsh index 459b4dbfd5..1f70af3dca 100644 --- a/drape/shaders/texturing_fragment_shader.fsh +++ b/drape/shaders/texturing_fragment_shader.fsh @@ -1,12 +1,11 @@ uniform sampler2D u_colorTex; +uniform float u_opacity; varying vec2 v_colorTexCoords; void main(void) { vec4 finalColor = texture2D(u_colorTex, v_colorTexCoords); - if (finalColor.a < 0.1) - discard; - + finalColor.a *= u_opacity; gl_FragColor = finalColor; } diff --git a/drape/shaders/texturing_vertex_shader.vsh b/drape/shaders/texturing_vertex_shader.vsh index f4fe0318be..14486125e1 100644 --- a/drape/shaders/texturing_vertex_shader.vsh +++ b/drape/shaders/texturing_vertex_shader.vsh @@ -9,6 +9,10 @@ varying vec2 v_colorTexCoords; void main(void) { - gl_Position = (vec4(a_normal, 0, 0) + vec4(a_position, 1) * modelView) * projection; + // Here we intentionally decrease precision of 'pos' calculation + // to eliminate jittering effect in process of billboard reconstruction. + lowp vec4 pos = vec4(a_position, 1) * modelView; + highp vec4 shiftedPos = vec4(a_normal, 0, 0) + pos; + gl_Position = shiftedPos * projection; v_colorTexCoords = a_colorTexCoords; } diff --git a/drape/shaders/user_mark.vsh b/drape/shaders/user_mark.vsh new file mode 100644 index 0000000000..1d9a77677e --- /dev/null +++ b/drape/shaders/user_mark.vsh @@ -0,0 +1,19 @@ +attribute vec3 a_position; +attribute vec2 a_normal; +attribute vec2 a_colorTexCoords; +attribute float a_animate; + +uniform mat4 modelView; +uniform mat4 projection; +uniform float u_interpolationT; + +varying vec2 v_colorTexCoords; + +void main(void) +{ + vec2 normal = a_normal; + if (a_animate > 0.0) + normal = u_interpolationT * normal; + gl_Position = (vec4(normal, 0, 0) + vec4(a_position, 1) * modelView) * projection; + v_colorTexCoords = a_colorTexCoords; +} diff --git a/drape/stipple_pen_resource.cpp b/drape/stipple_pen_resource.cpp index dd41e0b637..9f1cdb78e9 100644 --- a/drape/stipple_pen_resource.cpp +++ b/drape/stipple_pen_resource.cpp @@ -11,42 +11,31 @@ namespace dp { -uint32_t const MAX_STIPPLE_PEN_LENGTH = 254; -uint32_t const COLUMN_WIDTH = MAX_STIPPLE_PEN_LENGTH + 2; +uint32_t const MAX_STIPPLE_PEN_LENGTH = 512; +uint32_t const STIPPLE_HEIGHT = 1; StipplePenPacker::StipplePenPacker(m2::PointU const & canvasSize) : m_canvasSize(canvasSize) - , m_currentColumn(0) + , m_currentRow(0) { - uint32_t columnCount = floor(canvasSize.x / static_cast(COLUMN_WIDTH)); - m_columns.resize(columnCount, 0); + ASSERT_LESS_OR_EQUAL(canvasSize.x, MAX_STIPPLE_PEN_LENGTH, ()); } m2::RectU StipplePenPacker::PackResource(uint32_t width) { - ASSERT(m_currentColumn < m_columns.size(), ()); - uint32_t countInColumn = m_columns[m_currentColumn]; - // 2 pixels height on pattern - uint32_t yOffset = countInColumn * 2; - // ASSERT that ne pattern can be packed in current column - ASSERT(yOffset + 1 <= m_canvasSize.y, ()); - ++m_columns[m_currentColumn]; - // 1 + m_currentColumn = reserve 1 pixel border on left side - uint32_t xOffset = m_currentColumn * COLUMN_WIDTH; - // we check if new pattern can be mapped in this column - // yOffset + 4 = 2 pixels on current pattern and 2 for new pattern - if (yOffset + 4 > m_canvasSize.y) - m_currentColumn++; - - return m2::RectU(xOffset, yOffset, xOffset + width + 2, yOffset + 2); + ASSERT_LESS(m_currentRow, m_canvasSize.y, ()); + ASSERT_LESS_OR_EQUAL(width, m_canvasSize.x, ()); + uint32_t yOffset = m_currentRow; + m_currentRow += STIPPLE_HEIGHT; + return m2::RectU(0, yOffset, width, yOffset + STIPPLE_HEIGHT); } m2::RectF StipplePenPacker::MapTextureCoords(m2::RectU const & pixelRect) const { - return m2::RectF((pixelRect.minX() + 1.0f) / m_canvasSize.x, - (pixelRect.minY() + 1.0f) / m_canvasSize.y, - (pixelRect.maxX() - 1.0f) / m_canvasSize.x, - (pixelRect.maxY() - 1.0f) / m_canvasSize.y); + return m2::RectF((pixelRect.minX() + 0.5f) / m_canvasSize.x, + (pixelRect.minY() + 0.5f) / m_canvasSize.y, + (pixelRect.maxX() - 0.5f) / m_canvasSize.x, + (pixelRect.maxY() - 0.5f) / m_canvasSize.y); } StipplePenHandle::StipplePenHandle(buffer_vector const & pattern) @@ -77,8 +66,8 @@ void StipplePenHandle::Init(buffer_vector const & pattern) for (size_t i = 0; i < patternSize; ++i) { m_keyValue <<=7; - ASSERT(pattern[i] > 0, ()); // we have 7 bytes for value. value = 1 encode like 0000000 - ASSERT(pattern[i] < 129, ()); // value = 128 encode like 1111111 + ASSERT_GREATER(pattern[i], 0, ()); // we have 7 bytes for value. value = 1 encode like 0000000 + ASSERT_LESS(pattern[i], 129, ()); // value = 128 encode like 1111111 uint32_t value = pattern[i] - 1; m_keyValue += value; } @@ -90,7 +79,7 @@ StipplePenRasterizator::StipplePenRasterizator(StipplePenKey const & key) : m_key(key) { m_patternLength = accumulate(m_key.m_pattern.begin(), m_key.m_pattern.end(), 0); - ASSERT(m_patternLength < MAX_STIPPLE_PEN_LENGTH, ()); + ASSERT_LESS(m_patternLength, MAX_STIPPLE_PEN_LENGTH, ()); uint32_t count = floor(MAX_STIPPLE_PEN_LENGTH / m_patternLength); m_pixelLength = count * m_patternLength; } @@ -134,103 +123,79 @@ void StipplePenRasterizator::Rasterize(void * buffer) pixels[0] = pixels[1]; pixels[offset] = pixels[offset - 1]; - - memcpy(pixels + COLUMN_WIDTH, pixels, COLUMN_WIDTH); } -RefPointer StipplePenIndex::MapResource(StipplePenKey const & key) +ref_ptr StipplePenIndex::ReserveResource(bool predefined, StipplePenKey const & key, bool & newResource) { + lock_guard g(m_mappingLock); + + newResource = false; StipplePenHandle handle(key); - TResourceMapping::iterator it = m_resourceMapping.find(handle); - if (it != m_resourceMapping.end()) - return MakeStackRefPointer(&it->second); + TResourceMapping & resourceMapping = predefined ? m_predefinedResourceMapping : m_resourceMapping; + TResourceMapping::iterator it = resourceMapping.find(handle); + if (it != resourceMapping.end()) + return make_ref(&it->second); + + newResource = true; StipplePenRasterizator resource(key); m2::RectU pixelRect = m_packer.PackResource(resource.GetSize()); - m_pendingNodes.push_back(make_pair(pixelRect, resource)); + { + lock_guard g(m_lock); + m_pendingNodes.push_back(make_pair(pixelRect, resource)); + } - auto res = m_resourceMapping.emplace(handle, StipplePenResourceInfo(m_packer.MapTextureCoords(pixelRect), - resource.GetSize(), - resource.GetPatternSize())); + auto res = resourceMapping.emplace(handle, StipplePenResourceInfo(m_packer.MapTextureCoords(pixelRect), + resource.GetSize(), + resource.GetPatternSize())); ASSERT(res.second, ()); - return MakeStackRefPointer(&res.first->second); + return make_ref(&res.first->second); } -void StipplePenIndex::UploadResources(RefPointer texture) +ref_ptr StipplePenIndex::MapResource(StipplePenKey const & key, bool & newResource) +{ + StipplePenHandle handle(key); + TResourceMapping::iterator it = m_predefinedResourceMapping.find(handle); + if (it != m_predefinedResourceMapping.end()) + { + newResource = false; + return make_ref(&it->second); + } + + return ReserveResource(false /* predefined */, key, newResource); +} + +void StipplePenIndex::UploadResources(ref_ptr texture) { ASSERT(texture->GetFormat() == dp::ALPHA, ()); if (m_pendingNodes.empty()) return; - buffer_vector ranges; - ranges.push_back(0); - - uint32_t xOffset = m_pendingNodes[0].first.minX(); - for (size_t i = 1; i < m_pendingNodes.size(); ++i) + TPendingNodes pendingNodes; { - m2::RectU & node = m_pendingNodes[i].first; -#ifdef DEBUG - ASSERT(xOffset <= node.minX(), ()); - if (xOffset == node.minX()) - { - m2::RectU const & prevNode = m_pendingNodes[i - 1].first; - ASSERT(prevNode.minY() < node.minY(), ()); - } -#endif - if (node.minX() > xOffset) - ranges.push_back(i); - xOffset = node.minX(); + lock_guard g(m_lock); + m_pendingNodes.swap(pendingNodes); } - ranges.push_back(m_pendingNodes.size()); SharedBufferManager & mng = SharedBufferManager::instance(); + uint32_t const bytesPerNode = MAX_STIPPLE_PEN_LENGTH * STIPPLE_HEIGHT; + uint32_t reserveBufferSize = my::NextPowOf2(pendingNodes.size() * bytesPerNode); + SharedBufferManager::shared_buffer_ptr_t ptr = mng.reserveSharedBuffer(reserveBufferSize); + uint8_t * rawBuffer = SharedBufferManager::GetRawPointer(ptr); + memset(rawBuffer, 0, reserveBufferSize); + for (size_t i = 0; i < pendingNodes.size(); ++i) + pendingNodes[i].second.Rasterize(rawBuffer + i * bytesPerNode); - for (size_t i = 1; i < ranges.size(); ++i) - { - uint32_t rangeStart = ranges[i - 1]; - uint32_t rangeEnd = ranges[i]; - // rangeEnd - rangeStart give us count of patterns in this package - // 2 * range - count of lines for patterns - uint32_t lineCount = 2 * (rangeEnd - rangeStart); - // MAX_STIPPLE_PEN_LENGTH * lineCount - byte count on all patterns - uint32_t bufferSize = COLUMN_WIDTH * lineCount; - uint32_t reserveBufferSize = my::NextPowOf2(bufferSize); - SharedBufferManager::shared_buffer_ptr_t ptr = mng.reserveSharedBuffer(reserveBufferSize); - uint8_t * rawBuffer = SharedBufferManager::GetRawPointer(ptr); - memset(rawBuffer, 0, reserveBufferSize); + texture->UploadData(0, pendingNodes.front().first.minY(), + MAX_STIPPLE_PEN_LENGTH, pendingNodes.size() * STIPPLE_HEIGHT, make_ref(rawBuffer)); - m2::RectU const & startNode = m_pendingNodes[rangeStart].first; - uint32_t minX = startNode.minX(); - uint32_t minY = startNode.minY(); -#ifdef DEBUG - m2::RectU const & endNode = m_pendingNodes[rangeEnd - 1].first; - ASSERT(endNode.maxY() == (minY + lineCount), ()); -#endif - - for (size_t r = rangeStart; r < rangeEnd; ++r) - { - m_pendingNodes[r].second.Rasterize(rawBuffer); - rawBuffer += 2 * COLUMN_WIDTH; - } - - rawBuffer = SharedBufferManager::GetRawPointer(ptr); - texture->UploadData(minX, minY, COLUMN_WIDTH, lineCount, - dp::ALPHA, MakeStackRefPointer(rawBuffer)); - - mng.freeSharedBuffer(reserveBufferSize, ptr); - } - - m_pendingNodes.clear(); + mng.freeSharedBuffer(reserveBufferSize, ptr); } -glConst StipplePenIndex::GetMinFilter() const +void StipplePenTexture::ReservePattern(buffer_vector const & pattern) { - return gl_const::GLNearest; -} - -glConst StipplePenIndex::GetMagFilter() const -{ - return gl_const::GLNearest; + bool newResource = false; + m_indexer->ReserveResource(true /* predefined */, StipplePenKey(pattern), newResource); } string DebugPrint(StipplePenHandle const & key) diff --git a/drape/stipple_pen_resource.hpp b/drape/stipple_pen_resource.hpp index e976bc0a9e..fe406c8395 100644 --- a/drape/stipple_pen_resource.hpp +++ b/drape/stipple_pen_resource.hpp @@ -11,6 +11,7 @@ #include "geometry/rect2d.hpp" #include "std/map.hpp" +#include "std/mutex.hpp" namespace dp { @@ -90,27 +91,29 @@ public: private: m2::PointU m_canvasSize; - buffer_vector m_columns; - uint32_t m_currentColumn; + uint32_t m_currentRow; }; class StipplePenIndex { public: StipplePenIndex(m2::PointU const & canvasSize) : m_packer(canvasSize) {} - RefPointer MapResource(StipplePenKey const & key); - void UploadResources(RefPointer texture); - glConst GetMinFilter() const; - glConst GetMagFilter() const; + ref_ptr ReserveResource(bool predefined, StipplePenKey const & key, bool & newResource); + ref_ptr MapResource(StipplePenKey const & key, bool & newResource); + void UploadResources(ref_ptr texture); private: typedef map TResourceMapping; typedef pair TPendingNode; typedef buffer_vector TPendingNodes; + TResourceMapping m_predefinedResourceMapping; TResourceMapping m_resourceMapping; TPendingNodes m_pendingNodes; StipplePenPacker m_packer; + + mutex m_lock; + mutex m_mappingLock; }; string DebugPrint(StipplePenHandle const & key); @@ -119,15 +122,17 @@ class StipplePenTexture : public DynamicTexture TBase; public: - StipplePenTexture(m2::PointU const & size) + StipplePenTexture(m2::PointU const & size, ref_ptr allocator) : m_index(size) { - TBase::TextureParams params{ size, TextureFormat::ALPHA, gl_const::GLNearest, gl_const::GLNearest }; - TBase::Init(MakeStackRefPointer(&m_index), params); + TBase::TextureParams params{ size, TextureFormat::ALPHA, gl_const::GLNearest }; + TBase::Init(allocator, make_ref(&m_index), params); } ~StipplePenTexture() { TBase::Reset(); } + void ReservePattern(buffer_vector const & pattern); + private: StipplePenIndex m_index; }; diff --git a/drape/symbols_texture.cpp b/drape/symbols_texture.cpp index f8f2434c86..98efbf724e 100644 --- a/drape/symbols_texture.cpp +++ b/drape/symbols_texture.cpp @@ -1,6 +1,8 @@ #include "drape/symbols_texture.hpp" #include "3party/stb_image/stb_image.h" +#include "indexer/map_style_reader.hpp" + #include "platform/platform.hpp" #include "coding/reader.hpp" @@ -11,11 +13,21 @@ namespace dp { -class SymbolsTexture::DefinitionLoader +namespace +{ + +string const SymbolsTextureName = "symbols"; + +using TDefinitionInserter = function; +using TSymbolsLoadingCompletion = function; +using TSymbolsLoadingFailure = function; + +class DefinitionLoader { public: - DefinitionLoader(SymbolsTexture::TSymDefinition & definition) - : m_def(definition) + DefinitionLoader(TDefinitionInserter const & definitionInserter, bool convertToUV) + : m_definitionInserter(definitionInserter) + , m_convertToUV(convertToUV) , m_width(0) , m_height(0) { @@ -29,7 +41,8 @@ public: { ASSERT(!m_name.empty(), ()); ASSERT(m_rect.IsValid(), ()); - m_def.insert(make_pair(m_name, SymbolsTexture::SymbolInfo(m_rect))); + ASSERT(m_definitionInserter != nullptr, ()); + m_definitionInserter(m_name, m_rect); m_name = ""; m_rect.MakeEmpty(); @@ -49,27 +62,35 @@ public: if (attribute == "minX") { ASSERT(m_width != 0, ()); - m_rect.setMinX(v / (float)m_width); + float const scalar = m_convertToUV ? static_cast(m_width) : 1.0f; + m_rect.setMinX(v / scalar); } else if (attribute == "minY") { ASSERT(m_height != 0, ()); - m_rect.setMinY(v / (float)m_height); + float const scalar = m_convertToUV ? static_cast(m_height) : 1.0f; + m_rect.setMinY(v / scalar); } else if (attribute == "maxX") { ASSERT(m_width != 0, ()); - m_rect.setMaxX(v / (float)m_width); + float const scalar = m_convertToUV ? static_cast(m_width) : 1.0f; + m_rect.setMaxX(v / scalar); } else if (attribute == "maxY") { ASSERT(m_height != 0, ()); - m_rect.setMaxY(v / (float)m_height); + float const scalar = m_convertToUV ? static_cast(m_height) : 1.0f; + m_rect.setMaxY(v / scalar); } else if (attribute == "height") + { m_height = v; + } else if (attribute == "width") + { m_width = v; + } } } @@ -79,15 +100,76 @@ public: uint32_t GetHeight() const { return m_height; } private: - SymbolsTexture::TSymDefinition & m_def; + TDefinitionInserter m_definitionInserter; + bool m_convertToUV; + uint32_t m_width; uint32_t m_height; string m_name; m2::RectF m_rect; - }; +void LoadSymbols(string const & skinPathName, bool convertToUV, + TDefinitionInserter const & definitionInserter, + TSymbolsLoadingCompletion const & completionHandler, + TSymbolsLoadingFailure const & failureHandler) +{ + ASSERT(definitionInserter != nullptr, ()); + ASSERT(completionHandler != nullptr, ()); + ASSERT(failureHandler != nullptr, ()); + + vector rawData; + uint32_t width, height; + + try + { + DefinitionLoader loader(definitionInserter, convertToUV); + + { + ReaderPtr reader = GetStyleReader().GetResourceReader(SymbolsTextureName + ".sdf", skinPathName); + ReaderSource > source(reader); + if (!ParseXML(source, loader)) + { + failureHandler("Error parsing skin"); + return; + } + + width = loader.GetWidth(); + height = loader.GetHeight(); + } + + { + ReaderPtr reader = GetStyleReader().GetResourceReader(SymbolsTextureName + ".png", skinPathName); + size_t const size = reader.Size(); + rawData.resize(size); + reader.Read(0, &rawData[0], size); + } + } + catch (RootException & e) + { + failureHandler(e.what()); + return; + } + + int w, h, bpp; + unsigned char * data = stbi_png_load_from_memory(&rawData[0], rawData.size(), &w, &h, &bpp, 0); + ASSERT_EQUAL(bpp, 4, ("Incorrect symbols texture format")); + + if (width == w && height == h) + { + completionHandler(data, width, height); + } + else + { + failureHandler("Error symbols texture creation"); + } + + stbi_image_free(data); +} + +} + SymbolsTexture::SymbolKey::SymbolKey(string const & symbolName) : m_symbolName(symbolName) { @@ -113,71 +195,101 @@ Texture::ResourceType SymbolsTexture::SymbolInfo::GetType() const return Symbol; } -void SymbolsTexture::Load(string const & skinPathName) +SymbolsTexture::SymbolsTexture(string const & skinPathName, ref_ptr allocator) { - vector rawData; - uint32_t width, height; - - try - { - DefinitionLoader loader(m_definition); - - { - ReaderPtr reader = GetPlatform().GetReader(skinPathName + ".sdf"); - ReaderSource > source(reader); - if (!ParseXML(source, loader)) - { - LOG(LERROR, ("Error parsing skin")); - Fail(); - return; - } - - width = loader.GetWidth(); - height = loader.GetHeight(); - } - - { - ReaderPtr reader = GetPlatform().GetReader(skinPathName + ".png"); - size_t const size = reader.Size(); - rawData.resize(size); - reader.Read(0, &rawData[0], size); - } - } - catch (RootException & e) - { - LOG(LERROR, (e.what())); - Fail(); - return; - } - - int w, h, bpp; - unsigned char * data = stbi_png_load_from_memory(&rawData[0], rawData.size(), &w, &h, &bpp, 0); - - if (width == w && height == h) - Create(width, height, RGBA8, MakeStackRefPointer(data)); - else - Fail(); - - stbi_image_free(data); + Load(skinPathName, allocator); } -RefPointer SymbolsTexture::FindResource(Texture::Key const & key) const +void SymbolsTexture::Load(string const & skinPathName, ref_ptr allocator) { + auto definitionInserter = [this](string const & name, m2::RectF const & rect) + { + m_definition.insert(make_pair(name, SymbolsTexture::SymbolInfo(rect))); + }; + + auto completionHandler = [this, &allocator](unsigned char * data, uint32_t width, uint32_t height) + { + Texture::Params p; + p.m_allocator = allocator; + p.m_format = dp::RGBA8; + p.m_width = width; + p.m_height = height; + + Create(p, make_ref(data)); + }; + + auto failureHandler = [this](string const & reason) + { + LOG(LERROR, (reason)); + Fail(); + }; + + LoadSymbols(skinPathName, true /* convertToUV */, definitionInserter, completionHandler, failureHandler); +} + +void SymbolsTexture::Invalidate(string const & skinPathName, ref_ptr allocator) +{ + Destroy(); + m_definition.clear(); + + Load(skinPathName, allocator); +} + +ref_ptr SymbolsTexture::FindResource(Texture::Key const & key, bool & newResource) +{ + newResource = false; if (key.GetType() != Texture::Symbol) - return RefPointer(); + return nullptr; string const & symbolName = static_cast(key).GetSymbolName(); TSymDefinition::iterator it = m_definition.find(symbolName); - ASSERT(it != m_definition.end(), ()); - return MakeStackRefPointer(&it->second); + ASSERT(it != m_definition.end(), (symbolName)); + return make_ref(&it->second); } void SymbolsTexture::Fail() { m_definition.clear(); int32_t alfaTexture = 0; - Create(1, 1, RGBA8, MakeStackRefPointer(&alfaTexture)); + Texture::Params p; + p.m_allocator = GetDefaultAllocator(); + p.m_format = dp::RGBA8; + p.m_width = 1; + p.m_height = 1; + + Create(p, make_ref(&alfaTexture)); +} + +bool SymbolsTexture::DecodeToMemory(string const & skinPathName, vector & symbolsSkin, + map & symbolsIndex, + uint32_t & skinWidth, uint32_t & skinHeight) +{ + auto definitionInserter = [&symbolsIndex](string const & name, m2::RectF const & rect) + { + symbolsIndex.insert(make_pair(name, m2::RectU(rect))); + }; + + bool result = true; + auto completionHandler = [&result, &symbolsSkin, &skinWidth, &skinHeight](unsigned char * data, + uint32_t width, uint32_t height) + { + size_t size = 4 * width * height; + symbolsSkin.resize(size); + memcpy(symbolsSkin.data(), data, size); + skinWidth = width; + skinHeight = height; + result = true; + }; + + auto failureHandler = [&result](string const & reason) + { + LOG(LERROR, (reason)); + result = false; + }; + + LoadSymbols(skinPathName, false /* convertToUV */, definitionInserter, completionHandler, failureHandler); + return result; } } // namespace dp diff --git a/drape/symbols_texture.hpp b/drape/symbols_texture.hpp index c2c80c06d4..1bc8b04565 100644 --- a/drape/symbols_texture.hpp +++ b/drape/symbols_texture.hpp @@ -29,17 +29,21 @@ public: virtual ResourceType GetType() const; }; - void Load(string const & skinPathName); - RefPointer FindResource(Key const & key) const; + explicit SymbolsTexture(string const & skinPathName, ref_ptr allocator); + ref_ptr FindResource(Key const & key, bool & newResource) override; + + void Invalidate(string const & skinPathName, ref_ptr allocator); + + static bool DecodeToMemory(string const & skinPathName, vector & symbolsSkin, + map & symbolsIndex, + uint32_t & skinWidth, uint32_t & skinHeight); private: void Fail(); + void Load(string const & skinPathName, ref_ptr allocator); -private: typedef map TSymDefinition; mutable TSymDefinition m_definition; - - class DefinitionLoader; }; } // namespace dp diff --git a/drape/texture.cpp b/drape/texture.cpp index 84a37232d9..9731cfd25d 100644 --- a/drape/texture.cpp +++ b/drape/texture.cpp @@ -2,6 +2,7 @@ #include "drape/glfunctions.hpp" #include "drape/glextensions_list.hpp" +#include "drape/utils/gpu_mem_tracker.hpp" #include "base/math.hpp" @@ -21,107 +22,72 @@ m2::RectF const & Texture::ResourceInfo::GetTexRect() const ////////////////////////////////////////////////////////////////// Texture::Texture() - : m_textureID(-1) - , m_width(0) - , m_height(0) - , m_format(dp::UNSPECIFIED) { } Texture::~Texture() { - if (m_textureID != -1) - GLFunctions::glDeleteTexture(m_textureID); + Destroy(); } -void Texture::Create(uint32_t width, uint32_t height, TextureFormat format) +void Texture::Create(Params const & params) { - Create(width, height, format, MakeStackRefPointer(NULL)); + if (AllocateTexture(params.m_allocator)) + m_hwTexture->Create(params); } -void Texture::Create(uint32_t width, uint32_t height, TextureFormat format, RefPointer data) +void Texture::Create(Params const & params, ref_ptr data) { - m_format = format; - m_width = width; - m_height = height; - if (!GLExtensionsList::Instance().IsSupported(GLExtensionsList::TextureNPOT)) - { - m_width = my::NextPowOf2(width); - m_height = my::NextPowOf2(height); - } - - m_textureID = GLFunctions::glGenTexture(); - GLFunctions::glBindTexture(m_textureID); - - glConst layout; - glConst pixelType; - UnpackFormat(format, layout, pixelType); - - GLFunctions::glTexImage2D(m_width, m_height, layout, pixelType, data.GetRaw()); - SetFilterParams(gl_const::GLLinear, gl_const::GLLinear); - SetWrapMode(gl_const::GLClampToEdge, gl_const::GLClampToEdge); + if (AllocateTexture(params.m_allocator)) + m_hwTexture->Create(params, data); } -void Texture::SetFilterParams(glConst minFilter, glConst magFilter) +void Texture::UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, ref_ptr data) { - ASSERT_ID; - GLFunctions::glTexParameter(gl_const::GLMinFilter, minFilter); - GLFunctions::glTexParameter(gl_const::GLMagFilter, magFilter); -} - -void Texture::SetWrapMode(glConst sMode, glConst tMode) -{ - ASSERT_ID; - GLFunctions::glTexParameter(gl_const::GLWrapS, sMode); - GLFunctions::glTexParameter(gl_const::GLWrapT, tMode); -} - -void Texture::UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, - TextureFormat format, RefPointer data) -{ - ASSERT_ID; - ASSERT(format == m_format, ()); - glConst layout; - glConst pixelType; - - UnpackFormat(format, layout, pixelType); - - GLFunctions::glTexSubImage2D(x, y, width, height, layout, pixelType, data.GetRaw()); + ASSERT(m_hwTexture != nullptr, ()); + m_hwTexture->UploadData(x, y, width, height, data); } TextureFormat Texture::GetFormat() const { - return m_format; + ASSERT(m_hwTexture != nullptr, ()); + return m_hwTexture->GetFormat(); } uint32_t Texture::GetWidth() const { - ASSERT_ID; - return m_width; + ASSERT(m_hwTexture != nullptr, ()); + return m_hwTexture->GetWidth(); } uint32_t Texture::GetHeight() const { - ASSERT_ID; - return m_height; + ASSERT(m_hwTexture != nullptr, ()); + return m_hwTexture->GetHeight(); } float Texture::GetS(uint32_t x) const { - ASSERT_ID; - return x / (float)m_width; + ASSERT(m_hwTexture != nullptr, ()); + return m_hwTexture->GetS(x); } float Texture::GetT(uint32_t y) const { - ASSERT_ID; - return y / (float)m_height; + ASSERT(m_hwTexture != nullptr, ()); + return m_hwTexture->GetT(y); } void Texture::Bind() const { - ASSERT_ID; - GLFunctions::glBindTexture(GetID()); + ASSERT(m_hwTexture != nullptr, ()); + m_hwTexture->Bind(); +} + +void Texture::SetFilter(glConst filter) +{ + ASSERT(m_hwTexture != nullptr, ()); + m_hwTexture->SetFilter(filter); } uint32_t Texture::GetMaxTextureSize() @@ -129,31 +95,20 @@ uint32_t Texture::GetMaxTextureSize() return GLFunctions::glGetInteger(gl_const::GLMaxTextureSize); } -void Texture::UnpackFormat(TextureFormat format, glConst & layout, glConst & pixelType) +void Texture::Destroy() { - bool requiredFormat = GLExtensionsList::Instance().IsSupported(GLExtensionsList::RequiredInternalFormat); - switch (format) { - case RGBA8: - layout = requiredFormat ? gl_const::GLRGBA8 : gl_const::GLRGBA; - pixelType = gl_const::GL8BitOnChannel; - break; - case RGBA4: - layout = requiredFormat ? gl_const::GLRGBA4 : gl_const::GLRGBA; - pixelType = gl_const::GL4BitOnChannel; - break; - case ALPHA: - layout = requiredFormat ? gl_const::GLAlpha8 : gl_const::GLAlpha; - pixelType = gl_const::GL8BitOnChannel; - break; - default: - ASSERT(false, ()); - break; - } + m_hwTexture.reset(); } -int32_t Texture::GetID() const +bool Texture::AllocateTexture(ref_ptr allocator) { - return m_textureID; + if (allocator != nullptr) + { + m_hwTexture = allocator->CreateTexture(); + return true; + } + + return false; } } // namespace dp diff --git a/drape/texture.hpp b/drape/texture.hpp index f780902237..c88cf4d737 100644 --- a/drape/texture.hpp +++ b/drape/texture.hpp @@ -3,6 +3,7 @@ #include "drape/pointers.hpp" #include "drape/glconstants.hpp" #include "drape/drape_global.hpp" +#include "drape/hw_texture.hpp" #include "geometry/rect2d.hpp" @@ -47,16 +48,16 @@ public: Texture(); virtual ~Texture(); - void Create(uint32_t width, uint32_t height, TextureFormat format); - void Create(uint32_t width, uint32_t height, TextureFormat format, RefPointer data); - void SetFilterParams(glConst minFilter, glConst magFilter); - void SetWrapMode(glConst sMode, glConst tMode); - - void UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, TextureFormat format, - RefPointer data); - - virtual RefPointer FindResource(Key const & key) const = 0; + virtual ref_ptr FindResource(Key const & key, bool & newResource) = 0; virtual void UpdateState() {} + virtual bool HasAsyncRoutines() const { return false; } + + using Params = HWTexture::Params; + + void Create(Params const & params); + void Create(Params const & params, ref_ptr data); + + void UploadData(uint32_t x, uint32_t y, uint32_t width, uint32_t height, ref_ptr data); TextureFormat GetFormat() const; uint32_t GetWidth() const; @@ -66,17 +67,17 @@ public: void Bind() const; + // Texture must be bound before calling this method. + void SetFilter(glConst filter); + static uint32_t GetMaxTextureSize(); -private: - void UnpackFormat(TextureFormat format, glConst & layout, glConst & pixelType); - int32_t GetID() const; +protected: + void Destroy(); + bool AllocateTexture(ref_ptr allocator); private: - int32_t m_textureID; - uint32_t m_width; - uint32_t m_height; - TextureFormat m_format; + drape_ptr m_hwTexture; }; } // namespace dp diff --git a/drape/texture_manager.cpp b/drape/texture_manager.cpp index e30deb3c85..adee67bbbb 100644 --- a/drape/texture_manager.cpp +++ b/drape/texture_manager.cpp @@ -3,14 +3,17 @@ #include "drape/font_texture.hpp" #include "drape/stipple_pen_resource.hpp" #include "drape/texture_of_colors.hpp" - #include "drape/glfunctions.hpp" +#include "drape/utils/glyph_usage_tracker.hpp" #include "platform/platform.hpp" #include "coding/file_name_utils.hpp" +#include "coding/reader.hpp" +#include "base/logging.hpp" #include "base/stl_add.hpp" +#include "base/string_utils.hpp" #include "std/vector.hpp" #include "std/bind.hpp" @@ -18,20 +21,123 @@ namespace dp { -uint32_t const STIPPLE_TEXTURE_SIZE = 1024; -uint32_t const COLOR_TEXTURE_SIZE = 1024; +uint32_t const kMaxTextureSize = 1024; +uint32_t const kStippleTextureWidth = 512; +uint32_t const kMinStippleTextureHeight = 64; +uint32_t const kMinColorTextureSize = 32; +size_t const kInvalidGlyphGroup = numeric_limits::max(); + +// number of glyphs (since 0) which will be in each texture +size_t const kDuplicatedGlyphsCount = 128; + +size_t const kReservedPatterns = 10; +size_t const kReservedColors = 20; + +float const kGlyphAreaMultiplier = 1.2f; +float const kGlyphAreaCoverage = 0.9f; + +namespace +{ + +void MultilineTextToUniString(TextureManager::TMultilineText const & text, strings::UniString & outString) +{ + size_t cnt = 0; + for (strings::UniString const & str : text) + cnt += str.size(); + + outString.clear(); + outString.reserve(cnt); + for (strings::UniString const & str : text) + outString.append(str.begin(), str.end()); +} + +string ReadFileToString(string const & filename) +{ + string result; + try + { + ReaderPtr(GetPlatform().GetReader(filename)).ReadAsString(result); + } + catch(RootException const & e) + { + LOG(LWARNING, ("Error reading file ", filename, " : ", e.what())); + return ""; + } + return result; +} + +template +void ParseColorsList(string const & colorsFile, ToDo toDo) +{ + istringstream fin(ReadFileToString(colorsFile)); + while (true) + { + uint32_t color; + fin >> color; + if (!fin) + break; + + toDo(dp::Extract(color)); + } +} + +template +void ParsePatternsList(string const & patternsFile, ToDo toDo) +{ + strings::Tokenize(ReadFileToString(patternsFile), "\n", [&](string const & patternStr) + { + if (patternStr.empty()) + return; + + buffer_vector pattern; + strings::Tokenize(patternStr, " ", [&](string const & token) + { + double d = 0.0; + VERIFY(strings::to_double(token, d), ()); + pattern.push_back(d); + }); + + bool isValid = true; + for (size_t i = 0; i < pattern.size(); i++) + { + if (fabs(pattern[i]) < 1e-5) + { + LOG(LWARNING, ("Pattern was skipped", patternStr)); + isValid = false; + break; + } + } + + if (isValid) + toDo(pattern); + }); +} + +} // namespace + +TextureManager::TextureManager() + : m_maxTextureSize(0) + , m_maxGlypsCount(0) +{ + m_nothingToUpload.test_and_set(); +} + +TextureManager::BaseRegion::BaseRegion() + : m_info(nullptr) + , m_texture(nullptr) +{} bool TextureManager::BaseRegion::IsValid() const { - return !m_info.IsNull() && !m_texture.IsNull(); + return m_info != nullptr && m_texture != nullptr; } -void TextureManager::BaseRegion::SetResourceInfo(RefPointer info) +void TextureManager::BaseRegion::SetResourceInfo(ref_ptr info) { m_info = info; } -void TextureManager::BaseRegion::SetTexture(RefPointer texture) +void TextureManager::BaseRegion::SetTexture(ref_ptr texture) { m_texture = texture; } @@ -62,84 +168,258 @@ TextureManager::GlyphRegion::GlyphRegion() float TextureManager::GlyphRegion::GetOffsetX() const { ASSERT(m_info->GetType() == Texture::Glyph, ()); - GlyphInfo const * info = static_cast(m_info.GetRaw()); - return info->GetMetrics().m_xOffset; + return ref_ptr(m_info)->GetMetrics().m_xOffset; } float TextureManager::GlyphRegion::GetOffsetY() const { ASSERT(m_info->GetType() == Texture::Glyph, ()); - GlyphInfo const * info = static_cast(m_info.GetRaw()); - return info->GetMetrics().m_yOffset; + return ref_ptr(m_info)->GetMetrics().m_yOffset; } float TextureManager::GlyphRegion::GetAdvanceX() const { ASSERT(m_info->GetType() == Texture::Glyph, ()); - GlyphInfo const * info = static_cast(m_info.GetRaw()); - return info->GetMetrics().m_xAdvance; + return ref_ptr(m_info)->GetMetrics().m_xAdvance; } float TextureManager::GlyphRegion::GetAdvanceY() const { ASSERT(m_info->GetType() == Texture::Glyph, ()); - GlyphInfo const * info = static_cast(m_info.GetRaw()); - return info->GetMetrics().m_yAdvance; + return ref_ptr(m_info)->GetMetrics().m_yAdvance; } uint32_t TextureManager::StippleRegion::GetMaskPixelLength() const { ASSERT(m_info->GetType() == Texture::StipplePen, ()); - return static_cast(m_info.GetRaw())->GetMaskPixelLength(); + return ref_ptr(m_info)->GetMaskPixelLength(); } uint32_t TextureManager::StippleRegion::GetPatternPixelLength() const { ASSERT(m_info->GetType() == Texture::StipplePen, ()); - return static_cast(m_info.GetRaw())->GetPatternPixelLength(); + return ref_ptr(m_info)->GetPatternPixelLength(); } -void TextureManager::UpdateDynamicTextures() +void TextureManager::Release() { + m_glyphGroups.clear(); + m_hybridGlyphGroups.clear(); + + m_symbolTexture.reset(); + m_stipplePenTexture.reset(); + m_colorTexture.reset(); + + m_glyphTextures.clear(); + + m_glyphManager.reset(); +} + +bool TextureManager::UpdateDynamicTextures() +{ + bool const asyncRoutines = HasAsyncRoutines(m_glyphGroups) || HasAsyncRoutines(m_hybridGlyphGroups); + + if (!asyncRoutines && m_nothingToUpload.test_and_set()) + return false; + m_colorTexture->UpdateState(); m_stipplePenTexture->UpdateState(); - for_each(m_glyphGroups.begin(), m_glyphGroups.end(), [](GlyphGroup & g) - { - if (!g.m_texture.IsNull()) - g.m_texture->UpdateState(); - }); - for_each(m_hybridGlyphGroups.begin(), m_hybridGlyphGroups.end(), [](MasterPointer texture) - { - texture->UpdateState(); - }); + UpdateGlyphTextures(m_glyphGroups); + UpdateGlyphTextures(m_hybridGlyphGroups); + + m_textureAllocator->Flush(); + + return true; } -void TextureManager::AllocateGlyphTexture(TextureManager::GlyphGroup & group) const +ref_ptr TextureManager::AllocateGlyphTexture() { - group.m_texture.Reset(new FontTexture(m2::PointU(m_maxTextureSize, m_maxTextureSize), m_glyphManager.GetRefPointer())); + m2::PointU size(m_maxTextureSize, m_maxTextureSize); + m_glyphTextures.push_back(make_unique_dp(size, make_ref(m_glyphManager), make_ref(m_textureAllocator))); + return make_ref(m_glyphTextures.back()); +} + +void TextureManager::GetRegionBase(ref_ptr tex, TextureManager::BaseRegion & region, Texture::Key const & key) +{ + bool isNew = false; + region.SetResourceInfo(tex != nullptr ? tex->FindResource(key, isNew) : nullptr); + region.SetTexture(tex); + ASSERT(region.IsValid(), ()); + if (isNew) + m_nothingToUpload.clear(); +} + +size_t TextureManager::FindGlyphsGroup(strings::UniChar const & c) const +{ + auto const iter = lower_bound(m_glyphGroups.begin(), m_glyphGroups.end(), c, [](GlyphGroup const & g, strings::UniChar const & c) + { + return g.m_endChar < c; + }); + + if (iter == m_glyphGroups.end()) + return kInvalidGlyphGroup; + + return distance(m_glyphGroups.begin(), iter); +} + +size_t TextureManager::FindGlyphsGroup(strings::UniString const & text) const +{ + size_t groupIndex = kInvalidGlyphGroup; + for (auto const & c : text) + { + // skip glyphs which can be duplicated + if (c < kDuplicatedGlyphsCount) + continue; + + size_t currentIndex = FindGlyphsGroup(c); + + // an invalid glyph found + if (currentIndex == kInvalidGlyphGroup) + { +#if defined(TRACK_GLYPH_USAGE) + GlyphUsageTracker::Instance().AddInvalidGlyph(text, c); +#endif + return kInvalidGlyphGroup; + } + + // check if each glyph in text id in one group + if (groupIndex == kInvalidGlyphGroup) + groupIndex = currentIndex; + else if (groupIndex != currentIndex) + { +#if defined(TRACK_GLYPH_USAGE) + GlyphUsageTracker::Instance().AddUnexpectedGlyph(text, c, currentIndex, groupIndex); +#endif + return kInvalidGlyphGroup; + } + } + + // all glyphs in duplicated range + if (groupIndex == kInvalidGlyphGroup) + groupIndex = FindGlyphsGroup(text[0]); + + return groupIndex; +} + +size_t TextureManager::FindGlyphsGroup(TMultilineText const & text) const +{ + strings::UniString combinedString; + MultilineTextToUniString(text, combinedString); + + return FindGlyphsGroup(combinedString); +} + +size_t TextureManager::GetNumberOfUnfoundCharacters(strings::UniString const & text, HybridGlyphGroup const & group) const +{ + size_t cnt = 0; + for (auto const & c : text) + if (group.m_glyphs.find(c) == group.m_glyphs.end()) + cnt++; + + return cnt; +} + +void TextureManager::MarkCharactersUsage(strings::UniString const & text, HybridGlyphGroup & group) +{ + for (auto const & c : text) + group.m_glyphs.emplace(c); +} + +size_t TextureManager::FindHybridGlyphsGroup(strings::UniString const & text) +{ + if (m_hybridGlyphGroups.empty()) + { + m_hybridGlyphGroups.push_back(HybridGlyphGroup()); + return 0; + } + + // if we have got the only hybrid texture (in most cases it is) we can omit checking of glyphs usage + size_t const glyphsCount = m_hybridGlyphGroups.back().m_glyphs.size() + text.size(); + if (m_hybridGlyphGroups.size() == 1 && glyphsCount < m_maxGlypsCount) + return 0; + + // looking for a hybrid texture which contains text entirely + for (size_t i = 0; i < m_hybridGlyphGroups.size() - 1; i++) + if (GetNumberOfUnfoundCharacters(text, m_hybridGlyphGroups[i]) == 0) + return i; + + // check if we can contain text in the last hybrid texture + size_t const unfoundChars = GetNumberOfUnfoundCharacters(text, m_hybridGlyphGroups.back()); + size_t const newCharsCount = m_hybridGlyphGroups.back().m_glyphs.size() + unfoundChars; + if (newCharsCount >= m_maxGlypsCount) + m_hybridGlyphGroups.push_back(HybridGlyphGroup()); + + return m_hybridGlyphGroups.size() - 1; +} + +size_t TextureManager::FindHybridGlyphsGroup(TMultilineText const & text) +{ + strings::UniString combinedString; + MultilineTextToUniString(text, combinedString); + + return FindHybridGlyphsGroup(combinedString); } void TextureManager::Init(Params const & params) { + m_textureAllocator = CreateAllocator(); + + m_maxTextureSize = min(kMaxTextureSize, (uint32_t)GLFunctions::glGetInteger(gl_const::GLMaxTextureSize)); + GLFunctions::glPixelStore(gl_const::GLUnpackAlignment, 1); - SymbolsTexture * symbols = new SymbolsTexture(); - symbols->Load(my::JoinFoldersToPath(string("resources-") + params.m_resPrefix, "symbols")); - m_symbolTexture.Reset(symbols); - m_stipplePenTexture.Reset(new StipplePenTexture(m2::PointU(STIPPLE_TEXTURE_SIZE, STIPPLE_TEXTURE_SIZE))); - m_colorTexture.Reset(new ColorTexture(m2::PointU(COLOR_TEXTURE_SIZE, COLOR_TEXTURE_SIZE))); + m_symbolTexture = make_unique_dp(params.m_resPostfix, make_ref(m_textureAllocator)); - m_glyphManager.Reset(new GlyphManager(params.m_glyphMngParams)); - m_maxTextureSize = GLFunctions::glGetInteger(gl_const::GLMaxTextureSize); + // initialize patterns + buffer_vector, 64> patterns; + double const visualScale = params.m_visualScale; + ParsePatternsList(params.m_patterns, [&patterns, visualScale](buffer_vector const & pattern) + { + buffer_vector p; + for (size_t i = 0; i < pattern.size(); i++) + p.push_back(pattern[i] * visualScale); + patterns.push_back(move(p)); + }); + + uint32_t stippleTextureHeight = max(my::NextPowOf2(patterns.size() + kReservedPatterns), kMinStippleTextureHeight); + stippleTextureHeight = min(m_maxTextureSize, stippleTextureHeight); + m_stipplePenTexture = make_unique_dp(m2::PointU(kStippleTextureWidth, stippleTextureHeight), + make_ref(m_textureAllocator)); + LOG(LDEBUG, ("Patterns texture size = ", m_stipplePenTexture->GetWidth(), m_stipplePenTexture->GetHeight())); + + ref_ptr stipplePenTextureTex = make_ref(m_stipplePenTexture); + for (auto it = patterns.begin(); it != patterns.end(); ++it) + stipplePenTextureTex->ReservePattern(*it); + + // initialize colors + buffer_vector colors; + ParseColorsList(params.m_colors, [&colors](dp::Color const & color) + { + colors.push_back(color); + }); + + uint32_t colorTextureSize = max(my::NextPowOf2(floor(sqrt(colors.size() + kReservedColors))), kMinColorTextureSize); + colorTextureSize *= ColorTexture::GetColorSizeInPixels(); + colorTextureSize = min(m_maxTextureSize, colorTextureSize); + m_colorTexture = make_unique_dp(m2::PointU(colorTextureSize, colorTextureSize), + make_ref(m_textureAllocator)); + LOG(LDEBUG, ("Colors texture size = ", m_colorTexture->GetWidth(), m_colorTexture->GetHeight())); + + ref_ptr colorTex = make_ref(m_colorTexture); + for (auto it = colors.begin(); it != colors.end(); ++it) + colorTex->ReserveColor(*it); + + // initialize glyphs + m_glyphManager = make_unique_dp(params.m_glyphMngParams); uint32_t const textureSquare = m_maxTextureSize * m_maxTextureSize; - uint32_t const baseGlyphHeight = params.m_glyphMngParams.m_baseGlyphHeight; + uint32_t const baseGlyphHeight = params.m_glyphMngParams.m_baseGlyphHeight * kGlyphAreaMultiplier; uint32_t const avarageGlyphSquare = baseGlyphHeight * baseGlyphHeight; m_glyphGroups.push_back(GlyphGroup()); - uint32_t glyphCount = ceil(0.9 * textureSquare / avarageGlyphSquare); - m_glyphManager->ForEachUnicodeBlock([this, glyphCount](strings::UniChar const & start, strings::UniChar const & end) + m_maxGlypsCount = ceil(kGlyphAreaCoverage * textureSquare / avarageGlyphSquare); + m_glyphManager->ForEachUnicodeBlock([this](strings::UniChar const & start, strings::UniChar const & end) { if (m_glyphGroups.empty()) { @@ -150,89 +430,53 @@ void TextureManager::Init(Params const & params) GlyphGroup & group = m_glyphGroups.back(); ASSERT_LESS_OR_EQUAL(group.m_endChar, start, ()); - if (end - group.m_startChar < glyphCount) + if (end - group.m_startChar < m_maxGlypsCount) group.m_endChar = end; else m_glyphGroups.push_back(GlyphGroup(start, end)); }); } -void TextureManager::Release() +void TextureManager::Invalidate(string const & resPostfix) { - m_symbolTexture.Destroy(); - m_stipplePenTexture.Destroy(); - m_colorTexture.Destroy(); - - DeleteRange(m_glyphGroups, [](GlyphGroup & g) - { - g.m_texture.Destroy(); - }); - - DeleteRange(m_hybridGlyphGroups, MasterPointerDeleter()); + ASSERT(m_symbolTexture != nullptr, ()); + ref_ptr symbolsTexture = make_ref(m_symbolTexture); + symbolsTexture->Invalidate(resPostfix, make_ref(m_textureAllocator)); } -void TextureManager::GetSymbolRegion(string const & symbolName, SymbolRegion & region) const +void TextureManager::GetSymbolRegion(string const & symbolName, SymbolRegion & region) { - region.SetResourceInfo(m_symbolTexture->FindResource(SymbolsTexture::SymbolKey(symbolName))); - region.SetTexture(m_symbolTexture.GetRefPointer()); - ASSERT(region.IsValid(), ()); + GetRegionBase(make_ref(m_symbolTexture), region, SymbolsTexture::SymbolKey(symbolName)); } -void TextureManager::GetStippleRegion(TStipplePattern const & pen, StippleRegion & region) const +void TextureManager::GetStippleRegion(TStipplePattern const & pen, StippleRegion & region) { - region.SetResourceInfo(m_stipplePenTexture->FindResource(StipplePenKey(pen))); - region.SetTexture(m_stipplePenTexture.GetRefPointer()); - ASSERT(region.IsValid(), ()); + GetRegionBase(make_ref(m_stipplePenTexture), region, StipplePenKey(pen)); } -void TextureManager::GetColorRegion(Color const & color, ColorRegion & region) const +void TextureManager::GetColorRegion(Color const & color, ColorRegion & region) { - region.SetResourceInfo(m_colorTexture->FindResource(ColorKey(color))); - region.SetTexture(m_colorTexture.GetRefPointer()); - ASSERT(region.IsValid(), ()); + GetRegionBase(make_ref(m_colorTexture), region, ColorKey(color)); } -void TextureManager::GetGlyphRegions(strings::UniString const & text, TGlyphsBuffer & regions) const +void TextureManager::GetGlyphRegions(TMultilineText const & text, TMultilineGlyphsBuffer & buffers) { - size_t const INVALID_GROUP = static_cast(-1); - size_t groupIndex = INVALID_GROUP; - for (strings::UniChar const & c : text) - { - auto const iter = lower_bound(m_glyphGroups.begin(), m_glyphGroups.end(), c, [](GlyphGroup const & g, strings::UniChar const & c) - { - return g.m_endChar < c; - }); - ASSERT(iter != m_glyphGroups.end(), ()); - size_t currentIndex = distance(m_glyphGroups.begin(), iter); - if (groupIndex == INVALID_GROUP) - groupIndex = currentIndex; - else if (groupIndex != currentIndex) - { - groupIndex = INVALID_GROUP; - break; - } - } + CalcGlyphRegions(text, buffers); +} - regions.reserve(text.size()); - if (groupIndex == INVALID_GROUP) - { - /// TODO some magic with hybrid textures - } - else - { - GlyphGroup & group = m_glyphGroups[groupIndex]; - if (group.m_texture.IsNull()) - AllocateGlyphTexture(group); +void TextureManager::GetGlyphRegions(strings::UniString const & text, TGlyphsBuffer & regions) +{ + CalcGlyphRegions(text, regions); +} - RefPointer texture = group.m_texture.GetRefPointer(); - for (strings::UniChar const & c : text) - { - GlyphRegion reg; - reg.SetResourceInfo(texture->FindResource(GlyphKey(c))); - reg.SetTexture(texture); - regions.push_back(reg); - } - } +bool TextureManager::AreGlyphsReady(strings::UniString const & str) const +{ + return m_glyphManager->AreGlyphsReady(str); +} + +constexpr size_t TextureManager::GetInvalidGlyphGroup() +{ + return kInvalidGlyphGroup; } } // namespace dp diff --git a/drape/texture_manager.hpp b/drape/texture_manager.hpp index 68a41b39f7..68404b20d1 100644 --- a/drape/texture_manager.hpp +++ b/drape/texture_manager.hpp @@ -1,24 +1,31 @@ #pragma once +#include "drape/color.hpp" +#include "drape/glyph_manager.hpp" +#include "drape/pointers.hpp" +#include "drape/texture.hpp" +#include "drape/font_texture.hpp" + #include "base/string_utils.hpp" -#include "drape/color.hpp" -#include "drape/pointers.hpp" -#include "drape/texture.hpp" -#include "drape/glyph_manager.hpp" +#include "std/atomic.hpp" +#include "std/unordered_set.hpp" namespace dp { +class HWTextureAllocator; + class TextureManager { public: class BaseRegion { public: - void SetResourceInfo(RefPointer info); - void SetTexture(RefPointer texture); - RefPointer GetTexture() const { return m_texture; } + BaseRegion(); + void SetResourceInfo(ref_ptr info); + void SetTexture(ref_ptr texture); + ref_ptr GetTexture() const { return m_texture; } bool IsValid() const; m2::PointU GetPixelSize() const; @@ -26,8 +33,8 @@ public: m2::RectF const & GetTexRect() const; protected: - RefPointer m_info; - RefPointer m_texture; + ref_ptr m_info; + ref_ptr m_texture; }; class SymbolRegion : public BaseRegion {}; @@ -60,47 +67,170 @@ public: struct Params { - string m_resPrefix; + string m_resPostfix; + double m_visualScale; + string m_colors; + string m_patterns; GlyphManager::Params m_glyphMngParams; }; - void Init(Params const & params); + TextureManager(); void Release(); - void GetSymbolRegion(string const & symbolName, SymbolRegion & region) const; - typedef buffer_vector TStipplePattern; - void GetStippleRegion(TStipplePattern const & pen, StippleRegion & region) const; - void GetColorRegion(Color const & color, ColorRegion & region) const; - typedef buffer_vector TGlyphsBuffer; - void GetGlyphRegions(strings::UniString const & text, TGlyphsBuffer & regions) const; - void UpdateDynamicTextures(); + void Init(Params const & params); + void Invalidate(string const & resPostfix); + + void GetSymbolRegion(string const & symbolName, SymbolRegion & region); + + typedef buffer_vector TStipplePattern; + void GetStippleRegion(TStipplePattern const & pen, StippleRegion & region); + void GetColorRegion(Color const & color, ColorRegion & region); + + typedef buffer_vector TMultilineText; + typedef buffer_vector TGlyphsBuffer; + typedef buffer_vector TMultilineGlyphsBuffer; + + void GetGlyphRegions(TMultilineText const & text, TMultilineGlyphsBuffer & buffers); + void GetGlyphRegions(strings::UniString const & text, TGlyphsBuffer & regions); + + /// On some devices OpenGL driver can't resolve situation when we upload on texture from one thread + /// and use this texture to render on other thread. By this we move UpdateDynamicTextures call into render thread + /// If you implement some kind of dynamic texture, you must synchronyze UploadData and index creation operations + bool UpdateDynamicTextures(); + + /// This method must be called only on Frontend renderer's thread. + bool AreGlyphsReady(strings::UniString const & str) const; private: struct GlyphGroup { - GlyphGroup() = default; + GlyphGroup() + : m_startChar(0), m_endChar(0), m_texture(nullptr) + {} + GlyphGroup(strings::UniChar const & start, strings::UniChar const & end) - : m_startChar(start), m_endChar(end) {} + : m_startChar(start), m_endChar(end), m_texture(nullptr) + {} - strings::UniChar m_startChar = 0; - strings::UniChar m_endChar = 0; + strings::UniChar m_startChar; + strings::UniChar m_endChar; + ref_ptr m_texture; + }; - MasterPointer m_texture; + struct HybridGlyphGroup + { + HybridGlyphGroup() + : m_texture(nullptr) + {} + + unordered_set m_glyphs; + ref_ptr m_texture; }; uint32_t m_maxTextureSize; + uint32_t m_maxGlypsCount; - void AllocateGlyphTexture(TextureManager::GlyphGroup & group) const; + ref_ptr AllocateGlyphTexture(); + void GetRegionBase(ref_ptr tex, TextureManager::BaseRegion & region, Texture::Key const & key); + + size_t FindGlyphsGroup(strings::UniChar const & c) const; + size_t FindGlyphsGroup(strings::UniString const & text) const; + size_t FindGlyphsGroup(TMultilineText const & text) const; + + size_t FindHybridGlyphsGroup(strings::UniString const & text); + size_t FindHybridGlyphsGroup(TMultilineText const & text); + + size_t GetNumberOfUnfoundCharacters(strings::UniString const & text, HybridGlyphGroup const & group) const; + + void MarkCharactersUsage(strings::UniString const & text, HybridGlyphGroup & group); + /// it's a dummy method to support generic code + void MarkCharactersUsage(strings::UniString const & text, GlyphGroup & group) {} + + template + void FillResultBuffer(strings::UniString const & text, TGlyphGroup & group, TGlyphsBuffer & regions) + { + if (group.m_texture == nullptr) + group.m_texture = AllocateGlyphTexture(); + + regions.reserve(text.size()); + for (strings::UniChar const & c : text) + { + GlyphRegion reg; + GetRegionBase(group.m_texture, reg, GlyphKey(c)); + regions.push_back(reg); + } + } + + template + void FillResults(strings::UniString const & text, TGlyphsBuffer & buffers, TGlyphGroup & group) + { + MarkCharactersUsage(text, group); + FillResultBuffer(text, group, buffers); + } + + template + void FillResults(TMultilineText const & text, TMultilineGlyphsBuffer & buffers, TGlyphGroup & group) + { + buffers.resize(text.size()); + for (size_t i = 0; i < text.size(); ++i) + { + strings::UniString const & str = text[i]; + TGlyphsBuffer & buffer = buffers[i]; + FillResults(str, buffer, group); + } + } + + template + void CalcGlyphRegions(TText const & text, TBuffer & buffers) + { + size_t const groupIndex = FindGlyphsGroup(text); + if (groupIndex != GetInvalidGlyphGroup()) + { + GlyphGroup & group = m_glyphGroups[groupIndex]; + FillResults(text, buffers, group); + } + else + { + size_t const hybridGroupIndex = FindHybridGlyphsGroup(text); + ASSERT(hybridGroupIndex != GetInvalidGlyphGroup(), ()); + HybridGlyphGroup & group = m_hybridGlyphGroups[hybridGroupIndex]; + FillResults(text, buffers, group); + } + } + + template + void UpdateGlyphTextures(TGlyphGroups & groups) + { + for (auto & g : groups) + if (g.m_texture != nullptr) + g.m_texture->UpdateState(); + } + + template + bool HasAsyncRoutines(TGlyphGroups const & groups) const + { + for (auto const & g : groups) + if (g.m_texture != nullptr && g.m_texture->HasAsyncRoutines()) + return true; + + return false; + } + + static constexpr size_t GetInvalidGlyphGroup(); private: - MasterPointer m_symbolTexture; - MasterPointer m_stipplePenTexture; - MasterPointer m_colorTexture; + drape_ptr m_symbolTexture; + drape_ptr m_stipplePenTexture; + drape_ptr m_colorTexture; + list> m_glyphTextures; - MasterPointer m_glyphManager; + drape_ptr m_glyphManager; + drape_ptr m_textureAllocator; - mutable buffer_vector m_glyphGroups; - mutable buffer_vector, 4> m_hybridGlyphGroups; + buffer_vector m_glyphGroups; + buffer_vector m_hybridGlyphGroups; + + atomic_flag m_nothingToUpload; }; } // namespace dp diff --git a/drape/texture_of_colors.cpp b/drape/texture_of_colors.cpp index fe290f1668..f6fd7f399b 100644 --- a/drape/texture_of_colors.cpp +++ b/drape/texture_of_colors.cpp @@ -11,8 +11,8 @@ namespace dp namespace { - int const RESOURCE_SIZE = 2; - int const BYTES_PER_PIXEL = 4; + int const kResourceSize = 2; + int const kBytesPerPixel = 4; } ColorPalette::ColorPalette(m2::PointU const & canvasSize) @@ -20,21 +20,28 @@ ColorPalette::ColorPalette(m2::PointU const & canvasSize) , m_cursor(m2::PointU::Zero()) {} -RefPointer ColorPalette::MapResource(ColorKey const & key) +ref_ptr ColorPalette::ReserveResource(bool predefined, ColorKey const & key, bool & newResource) { - TPalette::iterator itm = m_palette.find(key.m_color); - if (itm == m_palette.end()) + lock_guard lock(m_mappingLock); + + TPalette & palette = predefined ? m_predefinedPalette : m_palette; + TPalette::iterator itm = palette.find(key.m_color); + newResource = (itm == palette.end()); + if (newResource) { PendingColor pendingColor; pendingColor.m_color = key.m_color; pendingColor.m_rect = m2::RectU(m_cursor.x, m_cursor.y, - m_cursor.x + RESOURCE_SIZE, m_cursor.y + RESOURCE_SIZE); - m_pendingNodes.push_back(pendingColor); + m_cursor.x + kResourceSize, m_cursor.y + kResourceSize); + { + lock_guard g(m_lock); + m_pendingNodes.push_back(pendingColor); + } - m_cursor.x += RESOURCE_SIZE; + m_cursor.x += kResourceSize; if (m_cursor.x >= m_textureSize.x) { - m_cursor.y += RESOURCE_SIZE; + m_cursor.y += kResourceSize; m_cursor.x = 0; ASSERT(m_cursor.y < m_textureSize.y, ()); @@ -45,26 +52,44 @@ RefPointer ColorPalette::MapResource(ColorKey const & key m2::PointF const resCenter = m2::RectF(pendingColor.m_rect).Center(); float const x = resCenter.x / sizeX; float const y = resCenter.y / sizeY; - auto res = m_palette.emplace(key.m_color, ColorResourceInfo(m2::RectF(x, y, x, y))); + auto res = palette.emplace(key.m_color, ColorResourceInfo(m2::RectF(x, y, x, y))); ASSERT(res.second, ()); itm = res.first; } - return MakeStackRefPointer(&itm->second); + + return make_ref(&itm->second); } -void ColorPalette::UploadResources(RefPointer texture) +ref_ptr ColorPalette::MapResource(ColorKey const & key, bool & newResource) +{ + TPalette::iterator itm = m_predefinedPalette.find(key.m_color); + if (itm != m_predefinedPalette.end()) + { + newResource = false; + return make_ref(&itm->second); + } + return ReserveResource(false /* predefined */, key, newResource); +} + +void ColorPalette::UploadResources(ref_ptr texture) { ASSERT(texture->GetFormat() == dp::RGBA8, ()); if (m_pendingNodes.empty()) return; + buffer_vector pendingNodes; + { + lock_guard g(m_lock); + m_pendingNodes.swap(pendingNodes); + } + buffer_vector ranges; ranges.push_back(0); - uint32_t minX = m_pendingNodes[0].m_rect.minX(); - for (size_t i = 0; i < m_pendingNodes.size(); ++i) + uint32_t minX = pendingNodes[0].m_rect.minX(); + for (size_t i = 0; i < pendingNodes.size(); ++i) { - m2::RectU const & currentRect = m_pendingNodes[i].m_rect; + m2::RectU const & currentRect = pendingNodes[i].m_rect; if (minX > currentRect.minX()) { ranges.push_back(i); @@ -72,15 +97,15 @@ void ColorPalette::UploadResources(RefPointer texture) } } - ranges.push_back(m_pendingNodes.size()); + ranges.push_back(pendingNodes.size()); for (size_t i = 1; i < ranges.size(); ++i) { size_t startRange = ranges[i - 1]; size_t endRange = ranges[i]; - m2::RectU const & startRect = m_pendingNodes[startRange].m_rect; - m2::RectU const & endRect = m_pendingNodes[endRange - 1].m_rect; + m2::RectU const & startRect = pendingNodes[startRange].m_rect; + m2::RectU const & endRect = pendingNodes[endRange - 1].m_rect; m2::RectU uploadRect; if (startRect.minY() == endRect.minY() && @@ -94,72 +119,62 @@ void ColorPalette::UploadResources(RefPointer texture) uploadRect = m2::RectU(0, startRect.minY(), m_textureSize.x, endRect.maxY()); } - size_t pixelStride = uploadRect.SizeX(); - size_t byteCount = BYTES_PER_PIXEL * uploadRect.SizeX() * uploadRect.SizeY(); - size_t bufferSize = my::NextPowOf2(byteCount); + size_t const pixelStride = uploadRect.SizeX(); + size_t const byteCount = kBytesPerPixel * uploadRect.SizeX() * uploadRect.SizeY(); + size_t const bufferSize = my::NextPowOf2(byteCount); SharedBufferManager::shared_buffer_ptr_t buffer = SharedBufferManager::instance().reserveSharedBuffer(bufferSize); uint8_t * pointer = SharedBufferManager::GetRawPointer(buffer); if (m_isDebug) memset(pointer, 0, bufferSize); + uint32_t currentY = startRect.minY(); for (size_t j = startRange; j < endRange; ++j) { ASSERT(pointer < SharedBufferManager::GetRawPointer(buffer) + byteCount, ()); - PendingColor const & c = m_pendingNodes[j]; + PendingColor const & c = pendingNodes[j]; if (c.m_rect.minY() > currentY) { - pointer += BYTES_PER_PIXEL * pixelStride; + pointer += kBytesPerPixel * pixelStride; currentY = c.m_rect.minY(); } - uint32_t byteStride = pixelStride * BYTES_PER_PIXEL; - uint8_t red = c.m_color.GetRed(); - uint8_t green = c.m_color.GetGreen(); - uint8_t blue = c.m_color.GetBlue(); - uint8_t alfa = c.m_color.GetAlfa(); + uint32_t const byteStride = pixelStride * kBytesPerPixel; + uint8_t const red = c.m_color.GetRed(); + uint8_t const green = c.m_color.GetGreen(); + uint8_t const blue = c.m_color.GetBlue(); + uint8_t const alpha = c.m_color.GetAlfa(); - pointer[0] = pointer[4] = red; - pointer[1] = pointer[5] = green; - pointer[2] = pointer[6] = blue; - pointer[3] = pointer[7] = alfa; - pointer[byteStride + 0] = pointer[byteStride + 4] = red; - pointer[byteStride + 1] = pointer[byteStride + 5] = green; - pointer[byteStride + 2] = pointer[byteStride + 6] = blue; - pointer[byteStride + 3] = pointer[byteStride + 7] = alfa; + for (size_t row = 0; row < kResourceSize; row++) + { + for (size_t column = 0; column < kResourceSize; column++) + { + pointer[row * byteStride + column * kBytesPerPixel] = red; + pointer[row * byteStride + column * kBytesPerPixel + 1] = green; + pointer[row * byteStride + column * kBytesPerPixel + 2] = blue; + pointer[row * byteStride + column * kBytesPerPixel + 3] = alpha; + } + } - pointer += 2 * BYTES_PER_PIXEL; + pointer += kResourceSize * kBytesPerPixel; ASSERT(pointer <= SharedBufferManager::GetRawPointer(buffer) + byteCount, ()); } pointer = SharedBufferManager::GetRawPointer(buffer); - texture->UploadData(uploadRect.minX(), uploadRect.minY(), uploadRect.SizeX(), uploadRect.SizeY(), - dp::RGBA8, dp::MakeStackRefPointer(pointer)); + texture->UploadData(uploadRect.minX(), uploadRect.minY(), + uploadRect.SizeX(), uploadRect.SizeY(), make_ref(pointer)); } - - m_pendingNodes.clear(); } -glConst ColorPalette::GetMinFilter() const +void ColorTexture::ReserveColor(dp::Color const & color) { - return gl_const::GLNearest; + bool newResource = false; + m_indexer->ReserveResource(true /* predefined */, ColorKey(color), newResource); } -glConst ColorPalette::GetMagFilter() const +int ColorTexture::GetColorSizeInPixels() { - return gl_const::GLNearest; -} - -void ColorPalette::MoveCursor() -{ - m_cursor.x += RESOURCE_SIZE; - if (m_cursor.x >= m_textureSize.x) - { - m_cursor.y += RESOURCE_SIZE; - m_cursor.x = 0; - } - - ASSERT(m_cursor.y + RESOURCE_SIZE <= m_textureSize.y, ()); + return kResourceSize; } } diff --git a/drape/texture_of_colors.hpp b/drape/texture_of_colors.hpp index e96884add7..98c6ee38f1 100644 --- a/drape/texture_of_colors.hpp +++ b/drape/texture_of_colors.hpp @@ -6,6 +6,8 @@ #include "base/buffer_vector.hpp" +#include "std/mutex.hpp" + namespace dp { @@ -30,16 +32,12 @@ class ColorPalette public: ColorPalette(m2::PointU const & canvasSize); - RefPointer MapResource(ColorKey const & key); - void UploadResources(RefPointer texture); - glConst GetMinFilter() const; - glConst GetMagFilter() const; + ref_ptr ReserveResource(bool predefined, ColorKey const & key, bool & newResource); + ref_ptr MapResource(ColorKey const & key, bool & newResource); + void UploadResources(ref_ptr texture); void SetIsDebug(bool isDebug) { m_isDebug = isDebug; } -private: - void MoveCursor(); - private: typedef map TPalette; @@ -50,30 +48,36 @@ private: }; TPalette m_palette; + TPalette m_predefinedPalette; buffer_vector m_pendingNodes; m2::PointU m_textureSize; m2::PointU m_cursor; bool m_isDebug = false; + mutex m_lock; + mutex m_mappingLock; }; class ColorTexture : public DynamicTexture { typedef DynamicTexture TBase; public: - ColorTexture(m2::PointU const & size) + ColorTexture(m2::PointU const & size, ref_ptr allocator) : m_pallete(size) { TBase::TextureParams params; params.m_size = size; params.m_format = TextureFormat::RGBA8; - params.m_minFilter = gl_const::GLNearest; - params.m_magFilter = gl_const::GLNearest; + params.m_filter = gl_const::GLNearest; - TBase::Init(MakeStackRefPointer(&m_pallete), params); + TBase::Init(allocator, make_ref(&m_pallete), params); } + void ReserveColor(dp::Color const & color); + ~ColorTexture() { TBase::Reset(); } + static int GetColorSizeInPixels(); + private: ColorPalette m_pallete; }; diff --git a/drape/uniform_value.cpp b/drape/uniform_value.cpp index 9baeacb3a6..06597fea20 100644 --- a/drape/uniform_value.cpp +++ b/drape/uniform_value.cpp @@ -230,13 +230,14 @@ void UniformValue::SetMatrix4x4Value(float const * matrixValue) memcpy(CastMemory(), matrixValue, 4 * 4 * sizeof(float)); } -void UniformValue::Apply(RefPointer program) const +void UniformValue::Apply(ref_ptr program) const { - ASSERT(program->HasUniform(m_name, GetCorrespondingGLType(), 1), - ("Failed to find uniform", m_name, GetCorrespondingGLType(), 1)); + int8_t location = program->GetUniformLocation(m_name); + if (location == -1) + return; - uint8_t location = program->GetUniformLocation(m_name); - switch (m_type) { + switch (m_type) + { case Int: ApplyInt(location, CastMemory(), m_componentCount); break; @@ -251,41 +252,6 @@ void UniformValue::Apply(RefPointer program) const } } -#ifdef DEBUG -glConst UniformValue::GetCorrespondingGLType() const -{ - if (Int == m_type) - { - static glConst intTypes[4] = { - gl_const::GLIntType, - gl_const::GLIntVec2, - gl_const::GLIntVec3, - gl_const::GLIntVec4 - }; - return intTypes[m_componentCount - 1]; - } - else if (Float == m_type) - { - static glConst floatTypes[4] = { - gl_const::GLFloatType, - gl_const::GLFloatVec2, - gl_const::GLFloatVec3, - gl_const::GLFloatVec4 - }; - return floatTypes[m_componentCount - 1]; - } - else if (Matrix4x4 == m_type) - { - return gl_const::GLFloatMat4; - } - else - { - ASSERT(false, ()); - return -1; - } -} -#endif - void UniformValue::Allocate(size_t byteCount) { m_values.reset(new uint8_t[byteCount]); diff --git a/drape/uniform_value.hpp b/drape/uniform_value.hpp index 16503637c4..32b6ecdce6 100644 --- a/drape/uniform_value.hpp +++ b/drape/uniform_value.hpp @@ -48,7 +48,7 @@ public: void SetMatrix4x4Value(float const * matrixValue); - void Apply(RefPointer program) const; + void Apply(ref_ptr program) const; bool operator<(UniformValue const & other) const { @@ -64,11 +64,6 @@ public: } private: - -#ifdef DEBUG - glConst GetCorrespondingGLType() const; -#endif - void Allocate(size_t byteCount); template diff --git a/drape/uniform_values_storage.cpp b/drape/uniform_values_storage.cpp index bf6dc28c76..9fbce973e9 100644 --- a/drape/uniform_values_storage.cpp +++ b/drape/uniform_values_storage.cpp @@ -80,13 +80,13 @@ void UniformValuesStorage::SetFloatValue(string const & name, float v1, float v2 m_uniforms.push_back(UniformValue(name, v1, v2, v3, v4)); } -void UniformValuesStorage::SetMatrix4x4Value(string const & name, float * matrixValue) +void UniformValuesStorage::SetMatrix4x4Value(string const & name, float const * matrixValue) { UniformValue * uniform = findByName(name); if (uniform) uniform->SetMatrix4x4Value(matrixValue); else - m_uniforms.push_back(UniformValue(name, matrixValue)); + m_uniforms.emplace_back(name, matrixValue); } void UniformValuesStorage::ForeachValue(enum_uniforms_fn action) const diff --git a/drape/uniform_values_storage.hpp b/drape/uniform_values_storage.hpp index cd91ab24d6..e3e5864182 100644 --- a/drape/uniform_values_storage.hpp +++ b/drape/uniform_values_storage.hpp @@ -22,7 +22,7 @@ public: void SetFloatValue(string const & name, float v1, float v2, float v3); void SetFloatValue(string const & name, float v1, float v2, float v3, float v4); - void SetMatrix4x4Value(string const & name, float * matrixValue); + void SetMatrix4x4Value(string const & name, float const * matrixValue); typedef function enum_uniforms_fn; void ForeachValue(enum_uniforms_fn action) const; diff --git a/drape/utils/glyph_usage_tracker.cpp b/drape/utils/glyph_usage_tracker.cpp new file mode 100644 index 0000000000..b4d4a0f67b --- /dev/null +++ b/drape/utils/glyph_usage_tracker.cpp @@ -0,0 +1,76 @@ +#include "drape/utils/glyph_usage_tracker.hpp" + +#include "platform/preferred_languages.hpp" + +#include "base/assert.hpp" + +#include "std/sstream.hpp" + +namespace dp +{ + +GlyphUsageTracker & GlyphUsageTracker::Instance() +{ + static GlyphUsageTracker s_inst; + return s_inst; +} + +string GlyphUsageTracker::Report() +{ + lock_guard lock(m_mutex); + + ostringstream ss; + ss << "\n ===== Glyphs Usage Report ===== \n"; + ss << " Current language = " << languages::GetCurrentOrig() << "\n"; + ss << " Invalid glyphs count = " << m_invalidGlyphs.size() << "\n"; + ss << " Invalid glyphs: { "; + for (auto const & it : m_invalidGlyphs) + ss << it.first << "(" << it.second << ") "; + ss << "}\n"; + + ss << " Unexpected glyphs count = " << m_unexpectedGlyphs.size() << "\n"; + ss << " Unexpected glyphs: {\n"; + for (auto const & it : m_unexpectedGlyphs) + { + ss << " glyph = " << it.first << ", unique usages = " << it.second.m_counter + << ", group = " << it.second.m_group << ", expected groups = { "; + + for (auto const & gr : it.second.m_expectedGroups) + ss << gr << " "; + ss << "}\n"; + } + ss << " }\n"; + ss << " ===== Glyphs Usage Report ===== \n"; + + return ss.str(); +} + +void GlyphUsageTracker::AddInvalidGlyph(strings::UniString const & str, strings::UniChar const & c) +{ + lock_guard lock(m_mutex); + + if (m_processedStrings.find(strings::ToUtf8(str)) != m_processedStrings.end()) + return; + + ++m_invalidGlyphs[c]; + + m_processedStrings.insert(strings::ToUtf8(str)); +} + +void GlyphUsageTracker::AddUnexpectedGlyph(strings::UniString const & str, strings::UniChar const & c, + size_t const group, size_t const expectedGroup) +{ + lock_guard lock(m_mutex); + + if (m_processedStrings.find(strings::ToUtf8(str)) != m_processedStrings.end()) + return; + + UnexpectedGlyphData & data = m_unexpectedGlyphs[c]; + ++data.m_counter; + data.m_expectedGroups.emplace(expectedGroup); + data.m_group = group; + + m_processedStrings.insert(strings::ToUtf8(str)); +} + +} // namespace dp diff --git a/drape/utils/glyph_usage_tracker.hpp b/drape/utils/glyph_usage_tracker.hpp new file mode 100644 index 0000000000..74a9e61dfa --- /dev/null +++ b/drape/utils/glyph_usage_tracker.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "base/string_utils.hpp" + +#include "std/map.hpp" +#include "std/set.hpp" +#include "std/list.hpp" +#include "std/mutex.hpp" +#include "std/unordered_set.hpp" + +//#define TRACK_GLYPH_USAGE + +namespace dp +{ + +class GlyphUsageTracker +{ +public: + static GlyphUsageTracker & Instance(); + + void AddInvalidGlyph(strings::UniString const & str, strings::UniChar const & c); + void AddUnexpectedGlyph(strings::UniString const & str, strings::UniChar const & c, + size_t const group, size_t const expectedGroup); + + string Report(); + +private: + GlyphUsageTracker() = default; + GlyphUsageTracker(GlyphUsageTracker const & rhs) = delete; + GlyphUsageTracker(GlyphUsageTracker && rhs) = delete; + +private: + using InvalidGlyphs = map; + InvalidGlyphs m_invalidGlyphs; + + struct UnexpectedGlyphData + { + size_t m_counter = 0; + size_t m_group = 0; + set m_expectedGroups; + }; + using UnexpectedGlyphs = map; + UnexpectedGlyphs m_unexpectedGlyphs; + + unordered_set m_processedStrings; + + mutex m_mutex; +}; + +} // namespace dp diff --git a/drape/utils/gpu_mem_tracker.cpp b/drape/utils/gpu_mem_tracker.cpp new file mode 100644 index 0000000000..1d63bdca7a --- /dev/null +++ b/drape/utils/gpu_mem_tracker.cpp @@ -0,0 +1,75 @@ +#include "drape/utils/gpu_mem_tracker.hpp" + +#include "std/tuple.hpp" +#include "std/sstream.hpp" + +namespace dp +{ + +GPUMemTracker & GPUMemTracker::Inst() +{ + static GPUMemTracker s_inst; + return s_inst; +} + +string GPUMemTracker::Report() +{ + uint32_t summaryUsed = 0; + uint32_t summaryAllocated = 0; + + typedef tuple TTagStat; + map tagStats; + + for (auto const it : m_memTracker) + { + TTagStat & stat = tagStats[it.first.first]; + get<0>(stat)++; + get<1>(stat) += it.second.first; + get<2>(stat) += it.second.second; + + summaryAllocated += it.second.first; + summaryUsed += it.second.second; + } + + float byteToMb = static_cast(1024 * 1024); + + ostringstream ss; + ss << " ===== Mem Report ===== \n"; + ss << " Summary Allocated = " << summaryAllocated / byteToMb << "\n"; + ss << " Summary Used = " << summaryUsed / byteToMb << "\n"; + ss << " Tags registered = " << tagStats.size() << "\n"; + + for (auto const it : tagStats) + { + ss << " Tag = " << it.first << " \n"; + ss << " Object count = " << get<0>(it.second) << "\n"; + ss << " Allocated = " << get<1>(it.second) / byteToMb << "\n"; + ss << " Used = " << get<2>(it.second) / byteToMb << "\n"; + } + + ss << " ===== Mem Report ===== \n"; + + return move(ss.str()); +} + +void GPUMemTracker::AddAllocated(string const & tag, uint32_t id, uint32_t size) +{ + threads::MutexGuard g(m_mutex); + m_memTracker[make_pair(tag, id)].first = size; +} + +void GPUMemTracker::SetUsed(string const & tag, uint32_t id, uint32_t size) +{ + threads::MutexGuard g(m_mutex); + TAlocUsedMem & node = m_memTracker[make_pair(tag, id)]; + node.second = size; + ASSERT_LESS_OR_EQUAL(node.second, node.first, ("Can't use more then allocated")); +} + +void GPUMemTracker::RemoveDeallocated(string const & tag, uint32_t id) +{ + threads::MutexGuard g(m_mutex); + m_memTracker.erase(make_pair(tag, id)); +} + +} // namespace dp diff --git a/drape/utils/gpu_mem_tracker.hpp b/drape/utils/gpu_mem_tracker.hpp new file mode 100644 index 0000000000..4a58c52d71 --- /dev/null +++ b/drape/utils/gpu_mem_tracker.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "base/mutex.hpp" + +#include "std/map.hpp" +#include "std/noncopyable.hpp" + +//#define TRACK_GPU_MEM + +namespace dp +{ + +class GPUMemTracker : private noncopyable +{ +public: + static GPUMemTracker & Inst(); + + string Report(); + void AddAllocated(string const & tag, uint32_t id, uint32_t size); + void SetUsed(string const & tag, uint32_t id, uint32_t size); + void RemoveDeallocated(string const & tag, uint32_t id); + +private: + GPUMemTracker() = default; + +private: + typedef pair TAlocUsedMem; + typedef pair TMemTag; + map m_memTracker; + + threads::Mutex m_mutex; +}; + +} // namespace dp diff --git a/drape/utils/projection.cpp b/drape/utils/projection.cpp new file mode 100644 index 0000000000..ba7c30c11a --- /dev/null +++ b/drape/utils/projection.cpp @@ -0,0 +1,23 @@ +#include "projection.hpp" + +namespace dp +{ + +void MakeProjection(array & result, float left, float right, float bottom, float top) +{ + result.fill(0.0f); + + float width = right - left; + float height = top - bottom; + float depth = maxDepth - minDepth; + + result[0] = 2.0f / width; + result[3] = -(right + left) / width; + result[5] = 2.0f / height; + result[7] = -(top + bottom) / height; + result[10] = -2.0f / depth; + result[11] = -(maxDepth + minDepth) / depth; + result[15] = 1.0; +} + +} // namespace dp diff --git a/drape/utils/projection.hpp b/drape/utils/projection.hpp new file mode 100644 index 0000000000..d0051f545d --- /dev/null +++ b/drape/utils/projection.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "std/array.hpp" + +namespace dp +{ + static float const minDepth = -20000.0f; + static float const maxDepth = 20000.0f; + + void MakeProjection(array & result, float left, float right, float bottom, float top); +} // namespace dp diff --git a/drape/utils/vertex_decl.cpp b/drape/utils/vertex_decl.cpp index 5e3dd04891..7d0776f2a3 100644 --- a/drape/utils/vertex_decl.cpp +++ b/drape/utils/vertex_decl.cpp @@ -8,10 +8,13 @@ namespace enum VertexType { + Area, SolidTexturing, TextStatic, TextDynamic, Line, + DashedLine, + Route, TypeCount }; @@ -23,142 +26,109 @@ struct BindingNode typedef dp::BindingInfo (*TInitFunction)(); +dp::BindingInfo AreaBindingInit() +{ + static_assert(sizeof(AreaVertex) == (sizeof(AreaVertex::TPosition) + + sizeof(AreaVertex::TTexCoord)), ""); + + dp::BindingFiller filler(2); + filler.FillDecl("a_position"); + filler.FillDecl("a_colorTexCoords"); + + return filler.m_info; +} + dp::BindingInfo SolidTexturingBindingInit() { static_assert(sizeof(SolidTexturingVertex) == (sizeof(SolidTexturingVertex::TPosition) + sizeof(SolidTexturingVertex::TNormal) + sizeof(SolidTexturingVertex::TTexCoord)), ""); - dp::BindingInfo info(3); + dp::BindingFiller filler(3); + filler.FillDecl("a_position"); + filler.FillDecl("a_normal"); + filler.FillDecl("a_colorTexCoords"); - dp::BindingDecl & posDecl = info.GetBindingDecl(0); - posDecl.m_attributeName = "a_position"; - posDecl.m_componentCount = glsl::GetComponentCount(); - posDecl.m_componentType = gl_const::GLFloatType; - posDecl.m_offset = 0; - posDecl.m_stride = sizeof(SolidTexturingVertex); - - dp::BindingDecl & normalDecl = info.GetBindingDecl(1); - normalDecl.m_attributeName = "a_normal"; - normalDecl.m_componentCount = glsl::GetComponentCount(); - normalDecl.m_componentType = gl_const::GLFloatType; - normalDecl.m_offset = sizeof(SolidTexturingVertex::TPosition); - normalDecl.m_stride = posDecl.m_stride; - - dp::BindingDecl & colorTexCoordDecl = info.GetBindingDecl(2); - colorTexCoordDecl.m_attributeName = "a_colorTexCoords"; - colorTexCoordDecl.m_componentCount = glsl::GetComponentCount(); - colorTexCoordDecl.m_componentType = gl_const::GLFloatType; - colorTexCoordDecl.m_offset = normalDecl.m_offset + sizeof(SolidTexturingVertex::TNormal); - colorTexCoordDecl.m_stride = posDecl.m_stride; - - return info; + return filler.m_info; } dp::BindingInfo TextStaticBindingInit() { static_assert(sizeof(TextStaticVertex) == (sizeof(TextStaticVertex::TPosition) + 3 * sizeof(TextStaticVertex::TTexCoord)), ""); - dp::BindingInfo info(4); - dp::BindingDecl & posDecl = info.GetBindingDecl(0); - posDecl.m_attributeName = "a_position"; - posDecl.m_componentCount = glsl::GetComponentCount(); - posDecl.m_componentType = gl_const::GLFloatType; - posDecl.m_offset = 0; - posDecl.m_stride = sizeof(TextStaticVertex); + dp::BindingFiller filler(4); + filler.FillDecl("a_position"); + filler.FillDecl("a_colorTexCoord"); + filler.FillDecl("a_outlineColorTexCoord"); + filler.FillDecl("a_maskTexCoord"); - dp::BindingDecl & colorDecl = info.GetBindingDecl(1); - colorDecl.m_attributeName = "a_colorTexCoord"; - colorDecl.m_componentCount = glsl::GetComponentCount(); - colorDecl.m_componentType = gl_const::GLFloatType; - colorDecl.m_offset = sizeof(TextStaticVertex::TPosition); - colorDecl.m_stride = posDecl.m_stride; - - dp::BindingDecl & outlineDecl = info.GetBindingDecl(2); - outlineDecl.m_attributeName = "a_outlineColorTexCoord"; - outlineDecl.m_componentCount = glsl::GetComponentCount(); - outlineDecl.m_componentType = gl_const::GLFloatType; - outlineDecl.m_offset = colorDecl.m_offset + sizeof(TextStaticVertex::TTexCoord); - outlineDecl.m_stride = posDecl.m_stride; - - dp::BindingDecl & maskDecl = info.GetBindingDecl(3); - maskDecl.m_attributeName = "a_maskTexCoord"; - maskDecl.m_componentCount = glsl::GetComponentCount(); - maskDecl.m_componentType = gl_const::GLFloatType; - maskDecl.m_offset = outlineDecl.m_offset + sizeof(TextStaticVertex::TTexCoord); - maskDecl.m_stride = posDecl.m_stride; - - return info; + return filler.m_info; } dp::BindingInfo TextDynamicBindingInit() { static_assert(sizeof(TextDynamicVertex) == sizeof(TextDynamicVertex::TNormal), ""); - dp::BindingInfo info(1, TextDynamicVertex::GetDynamicStreamID()); - dp::BindingDecl & decl = info.GetBindingDecl(0); - decl.m_attributeName = "a_normal"; - decl.m_componentCount = glsl::GetComponentCount(); - decl.m_componentType = gl_const::GLFloatType; - decl.m_offset = 0; - decl.m_stride = sizeof(TextDynamicVertex); + dp::BindingFiller filler(1, TextDynamicVertex::GetDynamicStreamID()); + filler.FillDecl("a_normal"); - return info; + return filler.m_info; } dp::BindingInfo LineBindingInit() { static_assert(sizeof(LineVertex) == sizeof(LineVertex::TPosition) + - 2 * sizeof(LineVertex::TNormal) + - 2 * sizeof(LineVertex::TTexCoord), ""); - dp::BindingInfo info(5); + sizeof(LineVertex::TNormal) + + sizeof(LineVertex::TTexCoord), ""); + dp::BindingFiller filler(3); + filler.FillDecl("a_position"); + filler.FillDecl("a_normal"); + filler.FillDecl("a_colorTexCoord"); - dp::BindingDecl & posDecl = info.GetBindingDecl(0); - posDecl.m_attributeName = "a_position"; - posDecl.m_componentCount = glsl::GetComponentCount(); - posDecl.m_componentType = gl_const::GLFloatType; - posDecl.m_offset = 0; - posDecl.m_stride = sizeof(LineVertex); + return filler.m_info; +} - dp::BindingDecl & normalDecl = info.GetBindingDecl(1); - normalDecl.m_attributeName = "a_normal"; - normalDecl.m_componentCount = glsl::GetComponentCount(); - normalDecl.m_componentType = gl_const::GLFloatType; - normalDecl.m_offset = posDecl.m_offset + sizeof(LineVertex::TPosition); - normalDecl.m_stride = posDecl.m_stride; +dp::BindingInfo DashedLineBindingInit() +{ + static_assert(sizeof(DashedLineVertex) == sizeof(DashedLineVertex::TPosition) + + sizeof(DashedLineVertex::TNormal) + + sizeof(DashedLineVertex::TTexCoord) + + sizeof(DashedLineVertex::TMaskTexCoord), ""); - dp::BindingDecl & colorDecl = info.GetBindingDecl(2); - colorDecl.m_attributeName = "a_colorTexCoord"; - colorDecl.m_componentCount = glsl::GetComponentCount(); - colorDecl.m_componentType = gl_const::GLFloatType; - colorDecl.m_offset = normalDecl.m_offset + sizeof(LineVertex::TNormal); - colorDecl.m_stride = posDecl.m_stride; + dp::BindingFiller filler(4); + filler.FillDecl("a_position"); + filler.FillDecl("a_normal"); + filler.FillDecl("a_colorTexCoord"); + filler.FillDecl("a_maskTexCoord"); - dp::BindingDecl & maskDecl = info.GetBindingDecl(3); - maskDecl.m_attributeName = "a_maskTexCoord"; - maskDecl.m_componentCount = glsl::GetComponentCount(); - maskDecl.m_componentType = gl_const::GLFloatType; - maskDecl.m_offset = colorDecl.m_offset + sizeof(LineVertex::TTexCoord); - maskDecl.m_stride = posDecl.m_stride; + return filler.m_info; +} - dp::BindingDecl & dxdyDecl = info.GetBindingDecl(4); - dxdyDecl.m_attributeName = "a_dxdy"; - dxdyDecl.m_componentCount = glsl::GetComponentCount(); - dxdyDecl.m_componentType = gl_const::GLFloatType; - dxdyDecl.m_offset = maskDecl.m_offset + sizeof(LineVertex::TNormal); - dxdyDecl.m_stride = posDecl.m_stride; +dp::BindingInfo RouteBindingInit() +{ + static_assert(sizeof(RouteVertex) == sizeof(RouteVertex::TPosition) + + sizeof(RouteVertex::TNormal) + + sizeof(RouteVertex::TLength), ""); - return info; + dp::BindingFiller filler(3); + filler.FillDecl("a_position"); + filler.FillDecl("a_normal"); + filler.FillDecl("a_length"); + + return filler.m_info; } BindingNode g_bindingNodes[TypeCount]; TInitFunction g_initFunctions[TypeCount] = { + &AreaBindingInit, &SolidTexturingBindingInit, &TextStaticBindingInit, &TextDynamicBindingInit, - &LineBindingInit + &LineBindingInit, + &DashedLineBindingInit, + &RouteBindingInit }; dp::BindingInfo const & GetBinding(VertexType type) @@ -175,6 +145,23 @@ dp::BindingInfo const & GetBinding(VertexType type) } // namespace +AreaVertex::AreaVertex() + : m_position(0.0, 0.0, 0.0) + , m_colorTexCoord(0.0, 0.0) +{ +} + +AreaVertex::AreaVertex(TPosition const & position, TTexCoord const & colorTexCoord) + : m_position(position) + , m_colorTexCoord(colorTexCoord) +{ +} + +dp::BindingInfo const & AreaVertex::GetBindingInfo() +{ + return GetBinding(Area); +} + SolidTexturingVertex::SolidTexturingVertex() : m_position(0.0, 0.0, 0.0) , m_normal(0.0, 0.0) @@ -239,21 +226,15 @@ uint32_t TextDynamicVertex::GetDynamicStreamID() LineVertex::LineVertex() : m_position(0.0, 0.0, 0.0) - , m_normal(0.0, 0.0) + , m_normal(0.0, 0.0, 0.0) , m_colorTexCoord(0.0, 0.0) - , m_maskTexCoord(0.0, 0.0) - , m_dxdy(0.0, 0.0) { } -LineVertex::LineVertex(TPosition const & position, TNormal const & normal, - TTexCoord const & color, TTexCoord const & mask, - TNormal const & dxdy) +LineVertex::LineVertex(TPosition const & position, TNormal const & normal, TTexCoord const & color) : m_position(position) , m_normal(normal) , m_colorTexCoord(color) - , m_maskTexCoord(mask) - , m_dxdy(dxdy) { } @@ -262,5 +243,41 @@ dp::BindingInfo const & LineVertex::GetBindingInfo() return GetBinding(Line); } +DashedLineVertex::DashedLineVertex() + : m_maskTexCoord(0.0, 0.0, 0.0, 0.0) +{ +} + +DashedLineVertex::DashedLineVertex(TPosition const & position, TNormal const & normal, + TTexCoord const & color, TMaskTexCoord const & mask) + : m_position(position) + , m_normal(normal) + , m_colorTexCoord(color) + , m_maskTexCoord(mask) +{ +} + +dp::BindingInfo const & DashedLineVertex::GetBindingInfo() +{ + return GetBinding(DashedLine); +} + +RouteVertex::RouteVertex() + : m_position(0.0, 0.0, 0.0) + , m_normal(0.0, 0.0) + , m_length(0.0, 0.0, 0.0) +{} + +RouteVertex::RouteVertex(TPosition const & position, TNormal const & normal, TLength const & length) + : m_position(position) + , m_normal(normal) + , m_length(length) +{} + +dp::BindingInfo const & RouteVertex::GetBindingInfo() +{ + return GetBinding(Route); +} + } //namespace gpu diff --git a/drape/utils/vertex_decl.hpp b/drape/utils/vertex_decl.hpp index 9a9c888f42..165e9fde24 100644 --- a/drape/utils/vertex_decl.hpp +++ b/drape/utils/vertex_decl.hpp @@ -10,9 +10,20 @@ namespace gpu struct BaseVertex { - typedef glsl::vec3 TPosition; - typedef glsl::vec2 TNormal; - typedef glsl::vec2 TTexCoord; + using TPosition = glsl::vec3; + using TNormal = glsl::vec2; + using TTexCoord = glsl::vec2; +}; + +struct AreaVertex : BaseVertex +{ + AreaVertex(); + AreaVertex(TPosition const & position, TTexCoord const & colorTexCoord); + + TPosition m_position; + TTexCoord m_colorTexCoord; + + static dp::BindingInfo const & GetBindingInfo(); }; struct SolidTexturingVertex : BaseVertex @@ -61,16 +72,45 @@ typedef buffer_vector TTextDynamicVertexBuffer; struct LineVertex : BaseVertex { + using TNormal = glsl::vec3; + LineVertex(); - LineVertex(TPosition const & position, TNormal const & normal, - TTexCoord const & color, TTexCoord const & mask, - TNormal const & dxdy); + LineVertex(TPosition const & position, TNormal const & normal, TTexCoord const & color); TPosition m_position; TNormal m_normal; TTexCoord m_colorTexCoord; - TTexCoord m_maskTexCoord; - TNormal m_dxdy; + + static dp::BindingInfo const & GetBindingInfo(); +}; + +struct DashedLineVertex : BaseVertex +{ + using TNormal = glsl::vec3; + using TMaskTexCoord = glsl::vec4; + + DashedLineVertex(); + DashedLineVertex(TPosition const & position, TNormal const & normal, + TTexCoord const & color, TMaskTexCoord const & mask); + + TPosition m_position; + TNormal m_normal; + TTexCoord m_colorTexCoord; + TMaskTexCoord m_maskTexCoord; + + static dp::BindingInfo const & GetBindingInfo(); +}; + +struct RouteVertex : BaseVertex +{ + typedef glsl::vec3 TLength; + + RouteVertex(); + RouteVertex(TPosition const & position, TNormal const & normal, TLength const & length); + + TPosition m_position; + TNormal m_normal; + TLength m_length; static dp::BindingInfo const & GetBindingInfo(); }; diff --git a/drape/vertex_array_buffer.cpp b/drape/vertex_array_buffer.cpp index 9a528e66d1..f2c6b8bd9f 100644 --- a/drape/vertex_array_buffer.cpp +++ b/drape/vertex_array_buffer.cpp @@ -1,6 +1,7 @@ #include "drape/vertex_array_buffer.hpp" #include "drape/glfunctions.hpp" #include "drape/glextensions_list.hpp" +#include "drape/index_storage.hpp" #include "base/stl_add.hpp" #include "base/assert.hpp" @@ -13,14 +14,14 @@ VertexArrayBuffer::VertexArrayBuffer(uint32_t indexBufferSize, uint32_t dataBuff , m_dataBufferSize(dataBufferSize) , m_program() { - m_indexBuffer.Reset(new IndexBuffer(indexBufferSize)); + m_indexBuffer = make_unique_dp(indexBufferSize); } VertexArrayBuffer::~VertexArrayBuffer() { - m_indexBuffer.Destroy(); - DeleteRange(m_staticBuffers, MasterPointerDeleter()); - DeleteRange(m_dynamicBuffers, MasterPointerDeleter()); + m_indexBuffer.reset(); + m_staticBuffers.clear(); + m_dynamicBuffers.clear(); if (m_VAO != 0) { @@ -34,15 +35,30 @@ VertexArrayBuffer::~VertexArrayBuffer() void VertexArrayBuffer::Preflush() { + /// buffers are ready, so moving them from CPU to GPU + for(auto & buffer : m_staticBuffers) + buffer.second->MoveToGPU(GPUBuffer::ElementBuffer); + + for(auto & buffer : m_dynamicBuffers) + buffer.second->MoveToGPU(GPUBuffer::ElementBuffer); + + ASSERT(m_indexBuffer != nullptr, ()); + m_indexBuffer->MoveToGPU(GPUBuffer::IndexBuffer); + GLFunctions::glBindBuffer(0, gl_const::GLElementArrayBuffer); GLFunctions::glBindBuffer(0, gl_const::GLArrayBuffer); } void VertexArrayBuffer::Render() { - if (!(m_staticBuffers.empty() && m_dynamicBuffers.empty())) + RenderRange(IndicesRange(0, GetIndexBuffer()->GetCurrentSize())); +} + +void VertexArrayBuffer::RenderRange(IndicesRange const & range) +{ + if (!(m_staticBuffers.empty() && m_dynamicBuffers.empty()) && GetIndexCount() > 0) { - ASSERT(!m_program.IsNull(), ("Somebody not call Build. It's very bad. Very very bad")); + ASSERT(m_program != nullptr, ("Somebody not call Build. It's very bad. Very very bad")); /// if OES_vertex_array_object is supported than all bindings already saved in VAO /// and we need only bind VAO. In Bind method have ASSERT("bind already called") if (GLExtensionsList::Instance().IsSupported(GLExtensionsList::VertexArrayObject)) @@ -51,14 +67,14 @@ void VertexArrayBuffer::Render() BindStaticBuffers(); BindDynamicBuffers(); - m_indexBuffer->Bind(); - GLFunctions::glDrawElements(m_indexBuffer->GetCurrentSize()); + GetIndexBuffer()->Bind(); + GLFunctions::glDrawElements(dp::IndexStorage::SizeOfIndex(), range.m_idxCount, range.m_idxStart); } } -void VertexArrayBuffer::Build(RefPointer program) +void VertexArrayBuffer::Build(ref_ptr program) { - ASSERT(m_VAO == 0 && m_program.IsNull(), ("No-no-no! You can't rebuild VertexArrayBuffer")); + ASSERT(m_VAO == 0 && m_program == nullptr, ("No-no-no! You can't rebuild VertexArrayBuffer")); m_program = program; /// if OES_vertex_array_object not supported, than buffers will be bind on each Render call if (!GLExtensionsList::Instance().IsSupported(GLExtensionsList::VertexArrayObject)) @@ -72,34 +88,35 @@ void VertexArrayBuffer::Build(RefPointer program) BindStaticBuffers(); } -void VertexArrayBuffer::UploadData(BindingInfo const & bindingInfo, void const * data, uint16_t count) +void VertexArrayBuffer::UploadData(BindingInfo const & bindingInfo, void const * data, uint32_t count) { - RefPointer buffer; + ref_ptr buffer; if (!bindingInfo.IsDynamic()) buffer = GetOrCreateStaticBuffer(bindingInfo); else buffer = GetOrCreateDynamicBuffer(bindingInfo); - buffer->UploadData(data, count); + + buffer->GetBuffer()->UploadData(data, count); } -RefPointer VertexArrayBuffer::GetOrCreateDynamicBuffer(BindingInfo const & bindingInfo) +ref_ptr VertexArrayBuffer::GetOrCreateDynamicBuffer(BindingInfo const & bindingInfo) { return GetOrCreateBuffer(bindingInfo, true); } -RefPointer VertexArrayBuffer::GetDynamicBuffer(BindingInfo const & bindingInfo) const +ref_ptr VertexArrayBuffer::GetDynamicBuffer(BindingInfo const & bindingInfo) const { return GetBuffer(bindingInfo, true); } -RefPointer VertexArrayBuffer::GetOrCreateStaticBuffer(BindingInfo const & bindingInfo) +ref_ptr VertexArrayBuffer::GetOrCreateStaticBuffer(BindingInfo const & bindingInfo) { return GetOrCreateBuffer(bindingInfo, false); } -RefPointer VertexArrayBuffer::GetBuffer(BindingInfo const & bindingInfo, bool isDynamic) const +ref_ptr VertexArrayBuffer::GetBuffer(BindingInfo const & bindingInfo, bool isDynamic) const { - TBuffersMap const * buffers = NULL; + TBuffersMap const * buffers = nullptr; if (isDynamic) buffers = &m_dynamicBuffers; else @@ -107,14 +124,14 @@ RefPointer VertexArrayBuffer::GetBuffer(BindingInfo const & bindingI TBuffersMap::const_iterator it = buffers->find(bindingInfo); if (it == buffers->end()) - return RefPointer(); + return nullptr; - return it->second.GetRefPointer(); + return make_ref(it->second); } -RefPointer VertexArrayBuffer::GetOrCreateBuffer(BindingInfo const & bindingInfo, bool isDynamic) +ref_ptr VertexArrayBuffer::GetOrCreateBuffer(BindingInfo const & bindingInfo, bool isDynamic) { - TBuffersMap * buffers = NULL; + TBuffersMap * buffers = nullptr; if (isDynamic) buffers = &m_dynamicBuffers; else @@ -123,84 +140,93 @@ RefPointer VertexArrayBuffer::GetOrCreateBuffer(BindingInfo const & TBuffersMap::iterator it = buffers->find(bindingInfo); if (it == buffers->end()) { - MasterPointer & buffer = (*buffers)[bindingInfo]; - buffer.Reset(new DataBuffer(bindingInfo.GetElementSize(), m_dataBufferSize)); - return buffer.GetRefPointer(); + drape_ptr dataBuffer = make_unique_dp(bindingInfo.GetElementSize(), m_dataBufferSize); + ref_ptr result = make_ref(dataBuffer); + (*buffers).insert(make_pair(bindingInfo, move(dataBuffer))); + return result; } - return it->second.GetRefPointer(); + return make_ref(it->second); } -uint16_t VertexArrayBuffer::GetAvailableIndexCount() const +uint32_t VertexArrayBuffer::GetAvailableIndexCount() const { - return m_indexBuffer->GetAvailableSize(); + return GetIndexBuffer()->GetAvailableSize(); } -uint16_t VertexArrayBuffer::GetAvailableVertexCount() const +uint32_t VertexArrayBuffer::GetAvailableVertexCount() const { if (m_staticBuffers.empty()) return m_dataBufferSize; #ifdef DEBUG TBuffersMap::const_iterator it = m_staticBuffers.begin(); - uint16_t prev = it->second->GetAvailableSize(); + uint32_t prev = it->second->GetBuffer()->GetAvailableSize(); for (; it != m_staticBuffers.end(); ++it) - ASSERT(prev == it->second->GetAvailableSize(), ()); + ASSERT(prev == it->second->GetBuffer()->GetAvailableSize(), ()); #endif - return m_staticBuffers.begin()->second->GetAvailableSize(); + return m_staticBuffers.begin()->second->GetBuffer()->GetAvailableSize(); } -uint16_t VertexArrayBuffer::GetStartIndexValue() const +uint32_t VertexArrayBuffer::GetStartIndexValue() const { if (m_staticBuffers.empty()) return 0; #ifdef DEBUG TBuffersMap::const_iterator it = m_staticBuffers.begin(); - uint16_t prev = it->second->GetCurrentSize(); + uint32_t prev = it->second->GetBuffer()->GetCurrentSize(); for (; it != m_staticBuffers.end(); ++it) - ASSERT(prev == it->second->GetCurrentSize(), ()); + ASSERT(prev == it->second->GetBuffer()->GetCurrentSize(), ()); #endif - return m_staticBuffers.begin()->second->GetCurrentSize(); + return m_staticBuffers.begin()->second->GetBuffer()->GetCurrentSize(); } -uint16_t VertexArrayBuffer::GetDynamicBufferOffset(BindingInfo const & bindingInfo) +uint32_t VertexArrayBuffer::GetDynamicBufferOffset(BindingInfo const & bindingInfo) { - return GetOrCreateDynamicBuffer(bindingInfo)->GetCurrentSize(); + return GetOrCreateDynamicBuffer(bindingInfo)->GetBuffer()->GetCurrentSize(); } -bool VertexArrayBuffer::IsFilled() const +uint32_t VertexArrayBuffer::GetIndexCount() const { - return GetAvailableIndexCount() < 3 || GetAvailableVertexCount() < 3; + return GetIndexBuffer()->GetCurrentSize(); } -void VertexArrayBuffer::UploadIndexes(uint16_t const * data, uint16_t count) +void VertexArrayBuffer::UploadIndexes(void const * data, uint32_t count) { - ASSERT(count <= m_indexBuffer->GetAvailableSize(), ()); - m_indexBuffer->UploadData(data, count); + ASSERT(count <= GetIndexBuffer()->GetAvailableSize(), ()); + GetIndexBuffer()->UploadData(data, count); } -void VertexArrayBuffer::ApplyMutation(RefPointer indexMutator, - RefPointer attrMutator) +void VertexArrayBuffer::ApplyMutation(ref_ptr indexMutator, + ref_ptr attrMutator) { - m_indexBuffer->UpdateData(indexMutator->GetIndexes(), indexMutator->GetIndexCount()); + if (indexMutator != nullptr) + { + ASSERT(m_indexBuffer != nullptr, ()); + m_indexBuffer->UpdateData(indexMutator->GetIndexes(), indexMutator->GetIndexCount()); + } + + if (attrMutator == nullptr) + return; typedef AttributeBufferMutator::TMutateData TMutateData; typedef AttributeBufferMutator::TMutateNodes TMutateNodes; TMutateData const & data = attrMutator->GetMutateData(); for (TMutateData::const_iterator it = data.begin(); it != data.end(); ++it) { - RefPointer buffer = GetDynamicBuffer(it->first); - ASSERT(!buffer.IsNull(), ()); - GPUBufferMapper mapper(buffer); + ref_ptr buffer = GetDynamicBuffer(it->first); + ASSERT(buffer != nullptr, ()); + DataBufferMapper mapper(buffer); TMutateNodes const & nodes = it->second; for (size_t i = 0; i < nodes.size(); ++i) { MutateNode const & node = nodes[i]; - mapper.UpdateData(node.m_data.GetRaw(), node.m_region.m_offset, node.m_region.m_count); + ASSERT_GREATER(node.m_region.m_count, 0, ()); + mapper.UpdateData(node.m_data.get(), node.m_region.m_offset, node.m_region.m_count); } } } @@ -227,8 +253,8 @@ void VertexArrayBuffer::BindBuffers(TBuffersMap const & buffers) const for (; it != buffers.end(); ++it) { BindingInfo const & binding = it->first; - RefPointer buffer = it->second.GetRefPointer(); - buffer->Bind(); + ref_ptr buffer = make_ref(it->second); + buffer->GetBuffer()->Bind(); for (uint16_t i = 0; i < binding.GetCount(); ++i) { @@ -246,4 +272,10 @@ void VertexArrayBuffer::BindBuffers(TBuffersMap const & buffers) const } } +ref_ptr VertexArrayBuffer::GetIndexBuffer() const +{ + ASSERT(m_indexBuffer != nullptr, ()); + return m_indexBuffer->GetBuffer(); +} + } // namespace dp diff --git a/drape/vertex_array_buffer.hpp b/drape/vertex_array_buffer.hpp index 1c50564dd5..a153aa408a 100644 --- a/drape/vertex_array_buffer.hpp +++ b/drape/vertex_array_buffer.hpp @@ -13,9 +13,25 @@ namespace dp { +struct IndicesRange +{ + uint32_t m_idxStart; + uint32_t m_idxCount; + + IndicesRange() + : m_idxStart(0), m_idxCount(0) + {} + + IndicesRange(uint32_t idxStart, uint32_t idxCount) + : m_idxStart(idxStart), m_idxCount(idxCount) + {} + + bool IsValid() const { return m_idxCount != 0; } +}; + class VertexArrayBuffer { - typedef map > TBuffersMap; + typedef map > TBuffersMap; public: VertexArrayBuffer(uint32_t indexBufferSize, uint32_t dataBufferSize); ~VertexArrayBuffer(); @@ -28,42 +44,46 @@ public: /// OES_vertex_array_object create OpenGL resource that belong only one GL context (which was created by) /// by this reason Build/Bind and Render must be called only on Frontendrendere thread void Render(); - void Build(RefPointer program); + void RenderRange(IndicesRange const & range); + void Build(ref_ptr program); ///@} - uint16_t GetAvailableVertexCount() const; - uint16_t GetAvailableIndexCount() const; - uint16_t GetStartIndexValue() const; - uint16_t GetDynamicBufferOffset(BindingInfo const & bindingInfo); - bool IsFilled() const; + uint32_t GetAvailableVertexCount() const; + uint32_t GetAvailableIndexCount() const; + uint32_t GetStartIndexValue() const; + uint32_t GetDynamicBufferOffset(BindingInfo const & bindingInfo); + uint32_t GetIndexCount() const; - void UploadData(BindingInfo const & bindingInfo, void const * data, uint16_t count); - void UploadIndexes(uint16_t const * data, uint16_t count); + void UploadData(BindingInfo const & bindingInfo, void const * data, uint32_t count); + void UploadIndexes(void const * data, uint32_t count); - void ApplyMutation(RefPointer indexMutator, - RefPointer attrMutator); + void ApplyMutation(ref_ptr indexMutator, + ref_ptr attrMutator); private: - RefPointer GetOrCreateStaticBuffer(BindingInfo const & bindingInfo); - RefPointer GetOrCreateDynamicBuffer(BindingInfo const & bindingInfo); - RefPointer GetDynamicBuffer(BindingInfo const & bindingInfo) const; + ref_ptr GetOrCreateStaticBuffer(BindingInfo const & bindingInfo); + ref_ptr GetOrCreateDynamicBuffer(BindingInfo const & bindingInfo); + ref_ptr GetDynamicBuffer(BindingInfo const & bindingInfo) const; - RefPointer GetOrCreateBuffer(BindingInfo const & bindingInfo, bool isDynamic); - RefPointer GetBuffer(BindingInfo const & bindingInfo, bool isDynamic) const; + ref_ptr GetOrCreateBuffer(BindingInfo const & bindingInfo, bool isDynamic); + ref_ptr GetBuffer(BindingInfo const & bindingInfo, bool isDynamic) const; void Bind() const; void BindStaticBuffers() const; void BindDynamicBuffers() const; void BindBuffers(TBuffersMap const & buffers) const; + ref_ptr GetIndexBuffer() const; + private: + /// m_VAO - VertexArrayObject name/identificator int m_VAO; TBuffersMap m_staticBuffers; TBuffersMap m_dynamicBuffers; - MasterPointer m_indexBuffer; + drape_ptr m_indexBuffer; uint32_t m_dataBufferSize; - RefPointer m_program; + ref_ptr m_program; }; } // namespace dp diff --git a/drape/visual_scale.hpp b/drape/visual_scale.hpp new file mode 100644 index 0000000000..46b3041e0a --- /dev/null +++ b/drape/visual_scale.hpp @@ -0,0 +1,12 @@ +#pragma once + +namespace dp +{ +inline double VisualScale(double exactDensityDPI) noexcept +{ + double constexpr kMdpiDensityDPI = 160.; + // For some old devices (for example iPad 2) the density could be less than 160 DPI. + // Returns one in that case to keep readable text on the map. + return max(1., exactDensityDPI / kMdpiDensityDPI); +} +} // namespace dp diff --git a/drape_frontend/animation/base_interpolator.cpp b/drape_frontend/animation/base_interpolator.cpp new file mode 100644 index 0000000000..f7f7ca35b4 --- /dev/null +++ b/drape_frontend/animation/base_interpolator.cpp @@ -0,0 +1,52 @@ +#include "drape_frontend/animation/base_interpolator.hpp" +#include "drape_frontend/animation/interpolation_holder.hpp" + +#include "base/assert.hpp" +#include "base/math.hpp" + +namespace df +{ + +BaseInterpolator::BaseInterpolator(double duration, double delay) + : m_elapsedTime(0.0) + , m_duration(duration) + , m_delay(delay) +{ + ASSERT(m_duration > 0.0, ()); + InterpolationHolder::Instance().RegisterInterpolator(this); +} + +BaseInterpolator::~BaseInterpolator() +{ + InterpolationHolder::Instance().DeregisterInterpolator(this); +} + +bool BaseInterpolator::IsFinished() const +{ + return m_elapsedTime > (m_duration + m_delay); +} + +void BaseInterpolator::Advance(double elapsedSeconds) +{ + m_elapsedTime += elapsedSeconds; +} + +double BaseInterpolator::GetT() const +{ + if (IsFinished()) + return 1.0; + + return max(m_elapsedTime - m_delay, 0.0) / m_duration; +} + +double BaseInterpolator::GetElapsedTime() const +{ + return m_elapsedTime; +} + +double BaseInterpolator::GetDuration() const +{ + return m_duration; +} + +} diff --git a/drape_frontend/animation/base_interpolator.hpp b/drape_frontend/animation/base_interpolator.hpp new file mode 100644 index 0000000000..a67e35352a --- /dev/null +++ b/drape_frontend/animation/base_interpolator.hpp @@ -0,0 +1,26 @@ +#pragma once + +namespace df +{ + +class BaseInterpolator +{ +public: + BaseInterpolator(double duration, double delay = 0); + virtual ~BaseInterpolator(); + + bool IsFinished() const; + virtual void Advance(double elapsedSeconds); + +protected: + double GetT() const; + double GetElapsedTime() const; + double GetDuration() const; + +private: + double m_elapsedTime; + double m_duration; + double m_delay; +}; + +} diff --git a/drape_frontend/animation/interpolation_holder.cpp b/drape_frontend/animation/interpolation_holder.cpp new file mode 100644 index 0000000000..95a8533ed0 --- /dev/null +++ b/drape_frontend/animation/interpolation_holder.cpp @@ -0,0 +1,49 @@ +#include "drape_frontend/animation/base_interpolator.hpp" +#include "drape_frontend/animation/interpolation_holder.hpp" + +#include "base/assert.hpp" + +#include "std/algorithm.hpp" +#include "std/bind.hpp" + +namespace df +{ + +InterpolationHolder & InterpolationHolder::Instance() +{ + static InterpolationHolder holder; + return holder; +} + +bool InterpolationHolder::Advance(double elapsedSeconds) +{ + bool hasAnimations = !m_interpolations.empty(); + TInterpolatorSet::iterator iter = m_interpolations.begin(); + while (iter != m_interpolations.end()) + { + (*iter)->Advance(elapsedSeconds); + if ((*iter)->IsFinished()) + iter = m_interpolations.erase(iter); + else + ++iter; + } + + return hasAnimations; +} + +InterpolationHolder::~InterpolationHolder() +{ + ASSERT(m_interpolations.empty(), ()); +} + +void InterpolationHolder::RegisterInterpolator(BaseInterpolator * interpolator) +{ + VERIFY(m_interpolations.insert(interpolator).second, ()); +} + +void InterpolationHolder::DeregisterInterpolator(BaseInterpolator * interpolator) +{ + m_interpolations.erase(interpolator); +} + +} diff --git a/drape_frontend/animation/interpolation_holder.hpp b/drape_frontend/animation/interpolation_holder.hpp new file mode 100644 index 0000000000..0b113e791d --- /dev/null +++ b/drape_frontend/animation/interpolation_holder.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include "base/macros.hpp" + +#include "std/set.hpp" + +namespace df +{ + +class BaseInterpolator; +class InterpolationHolder +{ +public: + static InterpolationHolder & Instance(); + bool Advance(double elapsedSeconds); + +private: + InterpolationHolder() = default; + ~InterpolationHolder(); + DISALLOW_COPY_AND_MOVE(InterpolationHolder); + +private: + friend class BaseInterpolator; + void RegisterInterpolator(BaseInterpolator * interpolator); + void DeregisterInterpolator(BaseInterpolator * interpolator); + + using TInterpolatorSet = set; + TInterpolatorSet m_interpolations; +}; + +} diff --git a/drape_frontend/animation/interpolations.cpp b/drape_frontend/animation/interpolations.cpp new file mode 100644 index 0000000000..90f688ba88 --- /dev/null +++ b/drape_frontend/animation/interpolations.cpp @@ -0,0 +1,58 @@ +#include "drape_frontend/animation/interpolations.hpp" + +#include "geometry/angles.hpp" + +namespace df +{ + +double InterpolateDouble(double startV, double endV, double t) +{ + return startV + (endV - startV) * t; +} + +m2::PointD InterpolatePoint(m2::PointD const & startPt, m2::PointD const & endPt, double t) +{ + m2::PointD diff = endPt - startPt; + return startPt + diff * t; +} + +m2::RectD InterpolateRect(m2::RectD const & startRect, m2::RectD const & endRect, double t) +{ + m2::PointD center = InterpolatePoint(startRect.Center(), endRect.Center(), t); + double halfSizeX = 0.5 * InterpolateDouble(startRect.SizeX(), endRect.SizeX(), t); + double halfSizeY = 0.5 * InterpolateDouble(startRect.SizeY(), endRect.SizeY(), t); + + return m2::RectD(center.x - halfSizeX, center.y - halfSizeY, + center.x + halfSizeX, center.y + halfSizeY); +} + +InerpolateAngle::InerpolateAngle(double startAngle, double endAngle) +{ + m_startAngle = ang::AngleIn2PI(startAngle); + m_delta = ang::GetShortestDistance(m_startAngle, ang::AngleIn2PI(endAngle)); +} + +double InerpolateAngle::Interpolate(double t) const +{ + return m_startAngle + m_delta * t; +} + +InterpolateAnyRect::InterpolateAnyRect(m2::AnyRectD const & startRect, m2::AnyRectD const & endRect) + : m_startZero(startRect.GlobalZero()) + , m_endZero(endRect.GlobalZero()) + , m_angleInterpolator(startRect.Angle().val(), endRect.Angle().val()) + , m_startRect(startRect.GetLocalRect()) + , m_endRect(endRect.GetLocalRect()) +{ +} + +m2::AnyRectD InterpolateAnyRect::Interpolate(double t) const +{ + double angle = m_angleInterpolator.Interpolate(t); + m2::PointD zero = InterpolatePoint(m_startZero, m_endZero, t); + m2::RectD rect = InterpolateRect(m_startRect, m_endRect, t); + + return m2::AnyRectD(zero, angle, rect); +} + +} // namespace df diff --git a/drape_frontend/animation/interpolations.hpp b/drape_frontend/animation/interpolations.hpp new file mode 100644 index 0000000000..552c40cef9 --- /dev/null +++ b/drape_frontend/animation/interpolations.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "geometry/point2d.hpp" +#include "geometry/rect2d.hpp" +#include "geometry/any_rect2d.hpp" + +namespace df +{ + +double InterpolateDouble(double startV, double endV, double t); +m2::PointD InterpolatePoint(m2::PointD const & startPt, m2::PointD const & endPt, double t); +m2::RectD InterpolateRect(m2::RectD const & startRect, m2::RectD const & endRect, double t); + +class InerpolateAngle +{ +public: + InerpolateAngle(double startAngle, double endAngle); + double Interpolate(double t) const; + +private: + double m_startAngle; + double m_delta; +}; + +class InterpolateAnyRect +{ +public: + InterpolateAnyRect(m2::AnyRectD const & startRect, m2::AnyRectD const & endRect); + m2::AnyRectD Interpolate(double t) const; + +private: + m2::PointD m_startZero, m_endZero; + InerpolateAngle m_angleInterpolator; + m2::RectD m_startRect, m_endRect; +}; + +} // namespace df diff --git a/drape_frontend/animation/model_view_animation.cpp b/drape_frontend/animation/model_view_animation.cpp new file mode 100644 index 0000000000..99c5dd94d6 --- /dev/null +++ b/drape_frontend/animation/model_view_animation.cpp @@ -0,0 +1,192 @@ +#include "model_view_animation.hpp" + +namespace df +{ + +ModelViewAnimation::ModelViewAnimation(m2::AnyRectD const & startRect, m2::AnyRectD const & endRect, + double aDuration, double mDuration, double sDuration) + : BaseModelViewAnimation(max(max(aDuration, mDuration), sDuration)) + , m_angleInterpolator(startRect.Angle().val(), endRect.Angle().val()) + , m_startZero(startRect.GlobalZero()) + , m_endZero(endRect.GlobalZero()) + , m_startRect(startRect.GetLocalRect()) + , m_endRect(endRect.GetLocalRect()) + , m_angleDuration(aDuration) + , m_moveDuration(mDuration) + , m_scaleDuration(sDuration) +{ +} + +m2::AnyRectD ModelViewAnimation::GetCurrentRect(ScreenBase const & screen) const +{ + return GetRect(GetElapsedTime()); +} + +m2::AnyRectD ModelViewAnimation::GetTargetRect(ScreenBase const & screen) const +{ + return GetRect(GetDuration()); +} + +namespace +{ + +double GetSafeT(double elapsed, double duration) +{ + if (duration <= 0.0 || elapsed > duration) + return 1.0; + + return elapsed / duration; +} + +} // namespace + +m2::AnyRectD ModelViewAnimation::GetRect(double elapsedTime) const +{ + double dstAngle = m_angleInterpolator.Interpolate(GetSafeT(elapsedTime, m_angleDuration)); + m2::PointD dstZero = InterpolatePoint(m_startZero, m_endZero, GetSafeT(elapsedTime, m_moveDuration)); + m2::RectD dstRect = InterpolateRect(m_startRect, m_endRect, GetSafeT(elapsedTime, m_scaleDuration)); + + return m2::AnyRectD(dstZero, dstAngle, dstRect); +} + +double ModelViewAnimation::GetRotateDuration(double startAngle, double endAngle) +{ + double const kRotateDurationScalar = 0.75; + + return kRotateDurationScalar * fabs(ang::GetShortestDistance(startAngle, endAngle)) / math::pi; +} + +namespace +{ + +double CalcAnimSpeedDuration(double pxDiff, double pxSpeed) +{ + double const kEps = 1e-5; + + if (my::AlmostEqualAbs(pxDiff, 0.0, kEps)) + return 0.0; + + return fabs(pxDiff) / pxSpeed; +} + +} + +double ModelViewAnimation::GetMoveDuration(m2::PointD const & startPt, m2::PointD const & endPt, ScreenBase const & convertor) +{ + double const kMinMoveDuration = 0.2; + double const kMinSpeedScalar = 0.2; + double const kMaxSpeedScalar = 7.0; + double const kEps = 1e-5; + + m2::RectD const & dispPxRect = convertor.PixelRect(); + double const pixelLength = convertor.GtoP(endPt).Length(convertor.GtoP(startPt)); + if (pixelLength < kEps) + return 0.0; + + double const minSize = min(dispPxRect.SizeX(), dispPxRect.SizeY()); + if (pixelLength < kMinSpeedScalar * minSize) + return kMinMoveDuration; + + double const pixelSpeed = kMaxSpeedScalar * minSize; + return CalcAnimSpeedDuration(pixelLength, pixelSpeed); +} + +double ModelViewAnimation::GetScaleDuration(double startSize, double endSize) +{ + // Resize 2.0 times should be done for 0.3 seconds. + double constexpr kPixelSpeed = 2.0 / 0.3; + + if (startSize > endSize) + swap(startSize, endSize); + + return CalcAnimSpeedDuration(endSize / startSize, kPixelSpeed); +} + +ScaleAnimation::ScaleAnimation(m2::AnyRectD const & startRect, m2::AnyRectD const & endRect, + double aDuration, double mDuration, double sDuration, + m2::PointD const & globalPoint, m2::PointD const & pixelOffset) + : ModelViewAnimation(startRect, endRect, aDuration, mDuration, sDuration) + , m_globalPoint(globalPoint) + , m_pixelOffset(pixelOffset) +{ +} + +void ScaleAnimation::ApplyPixelOffset(ScreenBase const & screen, m2::AnyRectD & rect) const +{ + ScreenBase s = screen; + s.SetFromRect(rect); + + m2::PointD const pixelPoint = s.GtoP(m_globalPoint); + m2::PointD const newCenter = s.PtoG(pixelPoint + m_pixelOffset); + + rect = m2::AnyRectD(newCenter, rect.Angle(), rect.GetLocalRect()); +} + +m2::AnyRectD ScaleAnimation::GetCurrentRect(ScreenBase const & screen) const +{ + m2::AnyRectD r = GetRect(GetElapsedTime()); + ApplyPixelOffset(screen, r); + return r; +} + +m2::AnyRectD ScaleAnimation::GetTargetRect(ScreenBase const & screen) const +{ + m2::AnyRectD r = GetRect(GetDuration()); + ApplyPixelOffset(screen, r); + return r; +} + +FollowAndRotateAnimation::FollowAndRotateAnimation(m2::AnyRectD const & startRect, + m2::RectD const & targetLocalRect, + m2::PointD const & userPos, + m2::PointD const & startPixelPos, + m2::PointD const & endPixelPos, + double azimuth, double duration) + : BaseModelViewAnimation(duration) + , m_angleInterpolator(startRect.Angle().val(), -azimuth) + , m_rect(startRect.GetLocalRect()) + , m_target(targetLocalRect) + , m_userPos(userPos) + , m_startPixelPos(startPixelPos) + , m_endPixelPos(endPixelPos) +{} + +m2::AnyRectD FollowAndRotateAnimation::GetCurrentRect(ScreenBase const & screen) const +{ + return GetRect(screen, GetElapsedTime()); +} + +m2::AnyRectD FollowAndRotateAnimation::GetTargetRect(ScreenBase const & screen) const +{ + return GetRect(screen, GetDuration()); +} + +m2::PointD FollowAndRotateAnimation::CalculateCenter(ScreenBase const & screen, m2::PointD const & userPos, + m2::PointD const & pixelPos, double azimuth) +{ + return CalculateCenter(screen.GlobalRect().GetLocalRect(), screen.PixelRect(), userPos, pixelPos, azimuth); +} + +m2::PointD FollowAndRotateAnimation::CalculateCenter(m2::RectD const & localRect, m2::RectD const & pixelRect, + m2::PointD const & userPos, m2::PointD const & pixelPos, + double azimuth) +{ + double const scale = localRect.SizeX() / pixelRect.SizeX(); + m2::PointD formingVector = (pixelRect.Center() - pixelPos) * scale; + formingVector.y = -formingVector.y; + formingVector.Rotate(azimuth); + return userPos + formingVector; +} + +m2::AnyRectD FollowAndRotateAnimation::GetRect(ScreenBase const & screen, double elapsedTime) const +{ + double const t = GetSafeT(elapsedTime, GetDuration()); + double const azimuth = m_angleInterpolator.Interpolate(t); + m2::RectD const currentRect = InterpolateRect(m_rect, m_target, t); + m2::PointD const pixelPos = InterpolatePoint(m_startPixelPos, m_endPixelPos, t); + m2::PointD const centerPos = CalculateCenter(currentRect, screen.PixelRect(), m_userPos, pixelPos, azimuth); + + return m2::AnyRectD(centerPos, azimuth, currentRect); +} + +} // namespace df diff --git a/drape_frontend/animation/model_view_animation.hpp b/drape_frontend/animation/model_view_animation.hpp new file mode 100644 index 0000000000..910a66bbd7 --- /dev/null +++ b/drape_frontend/animation/model_view_animation.hpp @@ -0,0 +1,107 @@ +#pragma once + +#include "drape_frontend/animation/base_interpolator.hpp" +#include "drape_frontend/animation/interpolations.hpp" + +#include "geometry/any_rect2d.hpp" +#include "geometry/screenbase.hpp" + +namespace df +{ + +enum class ModelViewAnimationType +{ + Default, + Scale, + FollowAndRotate, + KineticScroll +}; + +class BaseModelViewAnimation : public BaseInterpolator +{ +public: + BaseModelViewAnimation(double duration, double delay = 0) : BaseInterpolator(duration, delay) {} + + virtual ModelViewAnimationType GetType() const = 0; + virtual m2::AnyRectD GetCurrentRect(ScreenBase const & screen) const = 0; + virtual m2::AnyRectD GetTargetRect(ScreenBase const & screen) const = 0; +}; + +class ModelViewAnimation : public BaseModelViewAnimation +{ +public: + static double GetRotateDuration(double startAngle, double endAngle); + static double GetMoveDuration(m2::PointD const & startPt, m2::PointD const & endPt, ScreenBase const & convertor); + static double GetScaleDuration(double startSize, double endSize); + + /// aDuration - angleDuration + /// mDuration - moveDuration + /// sDuration - scaleDuration + ModelViewAnimation(m2::AnyRectD const & startRect, m2::AnyRectD const & endRect, + double aDuration, double mDuration, double sDuration); + + ModelViewAnimationType GetType() const override { return ModelViewAnimationType::Default; } + m2::AnyRectD GetCurrentRect(ScreenBase const & screen) const override; + m2::AnyRectD GetTargetRect(ScreenBase const & screen) const override; + +protected: + m2::AnyRectD GetRect(double elapsedTime) const; + +private: + InerpolateAngle m_angleInterpolator; + m2::PointD m_startZero, m_endZero; + m2::RectD m_startRect, m_endRect; + + double m_angleDuration; + double m_moveDuration; + double m_scaleDuration; +}; + +class ScaleAnimation : public ModelViewAnimation +{ +public: + ScaleAnimation(m2::AnyRectD const & startRect, m2::AnyRectD const & endRect, + double aDuration, double mDuration, double sDuration, + m2::PointD const & globalPoint, m2::PointD const & pixelOffset); + + ModelViewAnimationType GetType() const override { return ModelViewAnimationType::Scale; } + m2::AnyRectD GetCurrentRect(ScreenBase const & screen) const override; + m2::AnyRectD GetTargetRect(ScreenBase const & screen) const override; + +private: + void ApplyPixelOffset(ScreenBase const & screen, m2::AnyRectD & rect) const; + m2::PointD m_globalPoint; + m2::PointD m_pixelOffset; +}; + +class FollowAndRotateAnimation : public BaseModelViewAnimation +{ +public: + FollowAndRotateAnimation(m2::AnyRectD const & startRect, + m2::RectD const & targetLocalRect, + m2::PointD const & userPos, + m2::PointD const & startPixelPos, + m2::PointD const & endPixelPos, + double azimuth, double duration); + + ModelViewAnimationType GetType() const override { return ModelViewAnimationType::FollowAndRotate; } + m2::AnyRectD GetCurrentRect(ScreenBase const & screen) const override; + m2::AnyRectD GetTargetRect(ScreenBase const & screen) const override; + + static m2::PointD CalculateCenter(ScreenBase const & screen, m2::PointD const & userPos, + m2::PointD const & pixelPos, double azimuth); + static m2::PointD CalculateCenter(m2::RectD const & localRect, m2::RectD const & pixelRect, + m2::PointD const & userPos, m2::PointD const & pixelPos, + double azimuth); +private: + m2::AnyRectD GetRect(ScreenBase const & screen, double elapsedTime) const; + + InerpolateAngle m_angleInterpolator; + m2::RectD m_rect; + m2::RectD m_target; + m2::PointD m_userPos; + m2::PointD m_startPixelPos; + m2::PointD m_endPixelPos; +}; + +} // namespace df diff --git a/drape_frontend/animation/opacity_animation.cpp b/drape_frontend/animation/opacity_animation.cpp new file mode 100644 index 0000000000..aba039514f --- /dev/null +++ b/drape_frontend/animation/opacity_animation.cpp @@ -0,0 +1,26 @@ +#include "drape_frontend/animation/opacity_animation.hpp" +#include "drape_frontend/animation/interpolations.hpp" + +namespace df +{ + +OpacityAnimation::OpacityAnimation(double duration, double startOpacity, double endOpacity) + : OpacityAnimation(duration, 0.0, startOpacity, endOpacity) +{ +} + +OpacityAnimation::OpacityAnimation(double duration, double delay, double startOpacity, double endOpacity) + : BaseInterpolator(duration, delay) + , m_startOpacity(startOpacity) + , m_endOpacity(endOpacity) + , m_opacity(startOpacity) +{ +} + +void OpacityAnimation::Advance(double elapsedSeconds) +{ + TBase::Advance(elapsedSeconds); + m_opacity = InterpolateDouble(m_startOpacity, m_endOpacity, GetT()); +} + +} diff --git a/drape_frontend/animation/opacity_animation.hpp b/drape_frontend/animation/opacity_animation.hpp new file mode 100644 index 0000000000..c824ac972c --- /dev/null +++ b/drape_frontend/animation/opacity_animation.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "drape_frontend/animation/base_interpolator.hpp" + +#include "drape/uniform_values_storage.hpp" + +namespace df +{ + +class OpacityAnimation : public BaseInterpolator +{ + using TBase = BaseInterpolator; + +public: + OpacityAnimation(double duration, double startOpacity, double endOpacity); + OpacityAnimation(double duration, double delay, double startOpacity, double endOpacity); + + void Advance(double elapsedSeconds) override; + double GetOpacity() const { return m_opacity; } + +private: + double m_startOpacity; + double m_endOpacity; + double m_opacity; +}; + +} diff --git a/drape_frontend/animation/show_hide_animation.cpp b/drape_frontend/animation/show_hide_animation.cpp new file mode 100644 index 0000000000..caf034f83c --- /dev/null +++ b/drape_frontend/animation/show_hide_animation.cpp @@ -0,0 +1,114 @@ +#include "show_hide_animation.hpp" + +#include "base_interpolator.hpp" + +#include "base/math.hpp" + +namespace df +{ + +class ShowHideAnimation::ShowHideInterpolator : public BaseInterpolator +{ +public: + ShowHideInterpolator(ShowHideAnimation::EState & state, double startT, double endT, double duration) + : BaseInterpolator(duration) + , m_state(state) + , m_startT(startT) + , m_endT(endT) + { + m_state = m_endT > m_startT ? ShowHideAnimation::STATE_SHOW_DIRECTION : ShowHideAnimation::STATE_HIDE_DIRECTION; + } + + void Advance(double elapsedSeconds) override + { + BaseInterpolator::Advance(elapsedSeconds); + if (IsFinished()) + m_state = m_endT > m_startT ? ShowHideAnimation::STATE_VISIBLE : ShowHideAnimation::STATE_INVISIBLE; + } + + double GetCurrentT() const + { + return m_startT + (m_endT - m_startT) * GetT(); + } + +private: + ShowHideAnimation::EState & m_state; + double m_startT; + double m_endT; +}; + +ShowHideAnimation::ShowHideAnimation(bool isInitialiVisible, double fullDuraction) + : m_state(isInitialiVisible ? STATE_VISIBLE : STATE_INVISIBLE) + , m_fullDuration(fullDuraction) +{ +} + +ShowHideAnimation::~ShowHideAnimation() +{ + m_interpolator.reset(); +} + +void ShowHideAnimation::Show() +{ + EState state = GetState(); + if (state == STATE_INVISIBLE || state == STATE_HIDE_DIRECTION) + { + m_state = STATE_VISIBLE; + m_interpolator.reset(); + } +} + +void ShowHideAnimation::ShowAnimated() +{ + RefreshInterpolator({{ STATE_VISIBLE, STATE_SHOW_DIRECTION }}, 1.0); +} + +void ShowHideAnimation::Hide() +{ + EState state = GetState(); + if (state == STATE_VISIBLE || state == STATE_SHOW_DIRECTION) + { + m_state = STATE_INVISIBLE; + m_interpolator.reset(); + } +} + +void ShowHideAnimation::HideAnimated() +{ + RefreshInterpolator({{ STATE_INVISIBLE, STATE_HIDE_DIRECTION }}, 0.0); +} + +ShowHideAnimation::EState ShowHideAnimation::GetState() const +{ + return m_state; +} + +double ShowHideAnimation::GetT() const +{ + if (m_interpolator) + return m_interpolator->GetCurrentT(); + + ASSERT(m_state != STATE_SHOW_DIRECTION, ()); + ASSERT(m_state != STATE_HIDE_DIRECTION, ()); + + return m_state == STATE_VISIBLE ? 1.0 : 0.0; +} + +bool ShowHideAnimation::IsFinished() const +{ + return m_interpolator == nullptr || m_interpolator->IsFinished(); +} + +void ShowHideAnimation::RefreshInterpolator(array validStates, double endValue) +{ + EState state = GetState(); + if (state == validStates[0] || state == validStates[1]) + return; + + double start = GetT(); + double end = endValue; + double duration = fabs(end - start) * m_fullDuration; + m_interpolator.reset(new ShowHideInterpolator(m_state, start, end, duration)); +} + +} // namespace df diff --git a/drape_frontend/animation/show_hide_animation.hpp b/drape_frontend/animation/show_hide_animation.hpp new file mode 100644 index 0000000000..931c6a00a7 --- /dev/null +++ b/drape_frontend/animation/show_hide_animation.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include "drape/pointers.hpp" + +#include "std/array.hpp" + +namespace df +{ + +class ShowHideAnimation +{ +public: + enum EState + { + STATE_INVISIBLE, + STATE_VISIBLE, + STATE_SHOW_DIRECTION, + STATE_HIDE_DIRECTION + }; + + ShowHideAnimation(bool isInitialiVisible, double fullDuraction); + ~ShowHideAnimation(); + + void Show(); + void ShowAnimated(); + void Hide(); + void HideAnimated(); + EState GetState() const; + double GetT() const; + bool IsFinished() const; + +private: + void RefreshInterpolator(array validStates, double endValue); + class ShowHideInterpolator; + + drape_ptr m_interpolator; + ShowHideAnimation::EState m_state; + double m_fullDuration; +}; + +} // namespace df diff --git a/drape_frontend/animation/value_mapping.hpp b/drape_frontend/animation/value_mapping.hpp new file mode 100644 index 0000000000..5c8cbe2360 --- /dev/null +++ b/drape_frontend/animation/value_mapping.hpp @@ -0,0 +1,72 @@ +#pragma once + +#include "base/buffer_vector.hpp" +#include "base/logging.hpp" + +namespace df +{ + +template +class ValueMapping +{ + /// double = interpolation point [0.0, 1.0] + /// TValue = output value + using TRangePoint = pair; + using TRangeVector = buffer_vector; + using TRangeIter = typename TRangeVector::const_iterator; +public: + ValueMapping() = default; + + void AddRangePoint(double t, TValue const & v) + { +#ifdef DEBUG + if (!m_ranges.empty()) + ASSERT(m_ranges.back().first < t, ()); +#endif + m_ranges.emplace_back(t, v); + } + + TValue GetValue(double t) + { + TRangePoint startPoint, endPoint; + GetRangePoints(t, startPoint, endPoint); + + double normT = t - startPoint.first; + double rangeT = endPoint.first - startPoint.first; + double rangeV = endPoint.second - startPoint.second; + + return startPoint.second + rangeV * normT / rangeT; + } + +private: + void GetRangePoints(double t, TRangePoint & startPoint, TRangePoint & endPoint) + { + ASSERT(t >= 0.0 && t <= 1.0, ()); + ASSERT(m_ranges.size() > 1, ()); + + TRangeIter startIter = m_ranges.begin(); + if (t < startIter->first) + { + startPoint.first = 0.0; + startPoint.second = TValue(); + endPoint = *startIter; + return; + } + + TRangeIter endIter = startIter + 1; + while (t > endIter->first) + { + endIter++; + ASSERT(m_ranges.end() != endIter, ()); + } + + ASSERT(startIter->first <= t && t <= endIter->first, ()); + startPoint = *startIter; + endPoint = *endIter; + } + +private: + TRangeVector m_ranges; +}; + +} diff --git a/drape_frontend/apply_feature_functors.cpp b/drape_frontend/apply_feature_functors.cpp index 2a85a282be..d97fe15098 100644 --- a/drape_frontend/apply_feature_functors.cpp +++ b/drape_frontend/apply_feature_functors.cpp @@ -1,7 +1,6 @@ #include "drape_frontend/apply_feature_functors.hpp" #include "drape_frontend/shape_view_params.hpp" #include "drape_frontend/visual_params.hpp" -#include "drape_frontend/engine_context.hpp" #include "drape_frontend/area_shape.hpp" #include "drape_frontend/line_shape.hpp" @@ -16,11 +15,13 @@ #include "drape/color.hpp" #include "drape/stipple_pen_resource.hpp" +#include "drape/utils/projection.hpp" -#include "graphics/defines.hpp" +#include "base/logging.hpp" #include "std/algorithm.hpp" #include "std/utility.hpp" +#include "std/mutex.hpp" namespace df { @@ -28,11 +29,78 @@ namespace df namespace { +double const kMinVisibleFontSize = 8.0; + dp::Color ToDrapeColor(uint32_t src) { return dp::Extract(src, 255 - (src >> 24)); } +#ifdef CALC_FILTERED_POINTS +class LinesStat +{ +public: + ~LinesStat() + { + map zoomValues; + for (pair const & f : m_features) + { + TValue & v = zoomValues[f.first.second]; + v.m_neededPoints += f.second.m_neededPoints; + v.m_readedPoints += f.second.m_readedPoints; + } + + LOG(LINFO, ("========================")); + for (pair const & v : zoomValues) + LOG(LINFO, ("Zoom = ", v.first, " Percent = ", 1 - v.second.m_neededPoints / (double)v.second.m_readedPoints)); + } + + static LinesStat & Get() + { + static LinesStat s_stat; + return s_stat; + } + + void InsertLine(FeatureID const & id, double scale, int vertexCount, int renderVertexCount) + { + int s = 0; + double factor = 5.688; + while (factor < scale) + { + s++; + factor = factor * 2.0; + } + + InsertLine(id, s, vertexCount, renderVertexCount); + } + + void InsertLine(FeatureID const & id, int scale, int vertexCount, int renderVertexCount) + { + TKey key(id, scale); + lock_guard g(m_mutex); + if (m_features.find(key) != m_features.end()) + return; + + TValue & v = m_features[key]; + v.m_readedPoints = vertexCount; + v.m_neededPoints = renderVertexCount; + } + +private: + LinesStat() = default; + + using TKey = pair; + struct TValue + { + int m_readedPoints = 0; + int m_neededPoints = 0; + }; + + map m_features; + mutex m_mutex; +}; +#endif + void Extract(::LineDefProto const * lineRule, df::LineViewParams & params) { @@ -75,15 +143,24 @@ void Extract(::LineDefProto const * lineRule, } } -void CaptionDefProtoToFontDecl(CaptionDefProto const * capRule, df::FontDecl ¶ms) +void CaptionDefProtoToFontDecl(CaptionDefProto const * capRule, dp::FontDecl ¶ms) { params.m_color = ToDrapeColor(capRule->color()); - params.m_size = max(8.0, capRule->height() * df::VisualParams::Instance().GetVisualScale()); + params.m_size = max(kMinVisibleFontSize, capRule->height() * df::VisualParams::Instance().GetVisualScale()); if (capRule->has_stroke_color()) params.m_outlineColor = ToDrapeColor(capRule->stroke_color()); } +void ShieldRuleProtoToFontDecl(ShieldRuleProto const * shieldRule, dp::FontDecl ¶ms) +{ + params.m_color = ToDrapeColor(shieldRule->color()); + params.m_size = max(kMinVisibleFontSize, shieldRule->height() * df::VisualParams::Instance().GetVisualScale()); + + if (shieldRule->has_stroke_color()) + params.m_outlineColor = ToDrapeColor(shieldRule->stroke_color()); +} + dp::Anchor GetAnchor(CaptionDefProto const * capRule) { if (capRule->has_offset_y()) @@ -105,23 +182,36 @@ dp::Anchor GetAnchor(CaptionDefProto const * capRule) return dp::Center; } +m2::PointF GetOffset(CaptionDefProto const * capRule) +{ + float vs = VisualParams::Instance().GetVisualScale(); + m2::PointF result(0, 0); + if (capRule != nullptr && capRule->has_offset_x()) + result.x = capRule->offset_x() * vs; + if (capRule != nullptr && capRule->has_offset_y()) + result.y = capRule->offset_y() * vs; + + return result; +} + } // namespace -BaseApplyFeature::BaseApplyFeature(EngineContext & context, TileKey tileKey, - FeatureID const & id, CaptionDescription const & caption) - : m_context(context) - , m_tileKey(tileKey) +BaseApplyFeature::BaseApplyFeature(TInsertShapeFn const & insertShape, FeatureID const & id, + int minVisibleScale, uint8_t rank, CaptionDescription const & caption) + : m_insertShape(insertShape) , m_id(id) , m_captions(caption) + , m_minVisibleScale(minVisibleScale) + , m_rank(rank) { + ASSERT(m_insertShape != nullptr, ()); } void BaseApplyFeature::ExtractCaptionParams(CaptionDefProto const * primaryProto, CaptionDefProto const * secondaryProto, - double depth, - TextViewParams & params) const + double depth, TextViewParams & params) const { - FontDecl decl; + dp::FontDecl decl; CaptionDefProtoToFontDecl(primaryProto, decl); params.m_anchor = GetAnchor(primaryProto); @@ -129,25 +219,27 @@ void BaseApplyFeature::ExtractCaptionParams(CaptionDefProto const * primaryProto params.m_featureID = m_id; params.m_primaryText = m_captions.GetMainText(); params.m_primaryTextFont = decl; + params.m_primaryOffset = GetOffset(primaryProto); + params.m_primaryOptional = primaryProto->has_is_optional() ? primaryProto->is_optional() : true; + params.m_secondaryOptional = true; if (secondaryProto) { - FontDecl auxDecl; + dp::FontDecl auxDecl; CaptionDefProtoToFontDecl(secondaryProto, auxDecl); params.m_secondaryText = m_captions.GetAuxText(); params.m_secondaryTextFont = auxDecl; + params.m_secondaryOptional = secondaryProto->has_is_optional() ? secondaryProto->is_optional() : true; } } -// ============================================= // - -ApplyPointFeature::ApplyPointFeature(EngineContext & context, TileKey tileKey, - FeatureID const & id, CaptionDescription const & captions) - : TBase(context, tileKey, id, captions) +ApplyPointFeature::ApplyPointFeature(TInsertShapeFn const & insertShape, FeatureID const & id, + int minVisibleScale, uint8_t rank, CaptionDescription const & captions) + : TBase(insertShape, id, minVisibleScale, rank, captions) , m_hasPoint(false) - , m_symbolDepth(graphics::minDepth) - , m_circleDepth(graphics::minDepth) + , m_symbolDepth(dp::minDepth) + , m_circleDepth(dp::minDepth) , m_symbolRule(NULL) , m_circleRule(NULL) { @@ -159,35 +251,39 @@ void ApplyPointFeature::operator()(m2::PointD const & point) m_centerPoint = point; } -void ApplyPointFeature::ProcessRule(Stylist::rule_wrapper_t const & rule) +void ApplyPointFeature::ProcessRule(Stylist::TRuleWrapper const & rule) { if (m_hasPoint == false) return; - drule::BaseRule const * pRule = rule.first; - float depth = rule.second; - bool isNode = (pRule->GetType() & drule::node) != 0; + drule::BaseRule const * pRule = rule.first; + float const depth = rule.second; + + SymbolRuleProto const * symRule = pRule->GetSymbol(); + if (symRule != nullptr) + { + m_symbolDepth = depth; + m_symbolRule = symRule; + } + + CircleRuleProto const * circleRule = pRule->GetCircle(); + if (circleRule != nullptr) + { + m_circleDepth = depth; + m_circleRule = circleRule; + } + + bool const hasPOI = (m_symbolRule != nullptr || m_circleRule != nullptr); + bool const isNode = (pRule->GetType() & drule::node) != 0; CaptionDefProto const * capRule = pRule->GetCaption(0); if (capRule && isNode) { TextViewParams params; ExtractCaptionParams(capRule, pRule->GetCaption(1), depth, params); + params.m_minVisibleScale = m_minVisibleScale; + params.m_rank = m_rank; if(!params.m_primaryText.empty() || !params.m_secondaryText.empty()) - m_context.InsertShape(m_tileKey, dp::MovePointer(new TextShape(m_centerPoint, params))); - } - - SymbolRuleProto const * symRule = pRule->GetSymbol(); - if (symRule) - { - m_symbolDepth = depth; - m_symbolRule = symRule; - } - - CircleRuleProto const * circleRule = pRule->GetCircle(); - if (circleRule) - { - m_circleDepth = depth; - m_circleRule = circleRule; + m_insertShape(make_unique_dp(m_centerPoint, params, hasPOI)); } } @@ -201,39 +297,46 @@ void ApplyPointFeature::Finish() { CircleViewParams params(m_id); params.m_depth = m_circleDepth; + params.m_minVisibleScale = m_minVisibleScale; + params.m_rank = m_rank; params.m_color = ToDrapeColor(m_circleRule->color()); params.m_radius = m_circleRule->radius(); - - CircleShape * shape = new CircleShape(m_centerPoint, params); - m_context.InsertShape(m_tileKey, dp::MovePointer(shape)); + m_insertShape(make_unique_dp(m_centerPoint, params)); } else if (m_symbolRule) { PoiSymbolViewParams params(m_id); params.m_depth = m_symbolDepth; + params.m_minVisibleScale = m_minVisibleScale; + params.m_rank = m_rank; params.m_symbolName = m_symbolRule->name(); - - PoiSymbolShape * shape = new PoiSymbolShape(m_centerPoint, params); - m_context.InsertShape(m_tileKey, dp::MovePointer(shape)); + float const mainScale = df::VisualParams::Instance().GetVisualScale(); + params.m_extendingSize = m_symbolRule->has_min_distance() ? mainScale * m_symbolRule->min_distance() : 0; + m_insertShape(make_unique_dp(m_centerPoint, params)); } } -// ============================================= // - -ApplyAreaFeature::ApplyAreaFeature(EngineContext & context, TileKey tileKey, - FeatureID const & id, CaptionDescription const & captions) - : TBase(context, tileKey, id, captions) -{ -} +ApplyAreaFeature::ApplyAreaFeature(TInsertShapeFn const & insertShape, FeatureID const & id, + int minVisibleScale, uint8_t rank, CaptionDescription const & captions) + : TBase(insertShape, id, minVisibleScale, rank, captions) +{} void ApplyAreaFeature::operator()(m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3) { m_triangles.push_back(p1); - m_triangles.push_back(p2); - m_triangles.push_back(p3); + if (m2::CrossProduct(p2 - p1, p3 - p1) < 0) + { + m_triangles.push_back(p2); + m_triangles.push_back(p3); + } + else + { + m_triangles.push_back(p3); + m_triangles.push_back(p2); + } } -void ApplyAreaFeature::ProcessRule(Stylist::rule_wrapper_t const & rule) +void ApplyAreaFeature::ProcessRule(Stylist::TRuleWrapper const & rule) { drule::BaseRule const * pRule = rule.first; double const depth = rule.second; @@ -244,30 +347,59 @@ void ApplyAreaFeature::ProcessRule(Stylist::rule_wrapper_t const & rule) AreaViewParams params; params.m_depth = depth; params.m_color = ToDrapeColor(areaRule->color()); - - AreaShape * shape = new AreaShape(move(m_triangles), params); - m_context.InsertShape(m_tileKey, dp::MovePointer(shape)); + params.m_minVisibleScale = m_minVisibleScale; + params.m_rank = m_rank; + m_insertShape(make_unique_dp(move(m_triangles), params)); } else TBase::ProcessRule(rule); } -// ============================================= // - -ApplyLineFeature::ApplyLineFeature(EngineContext & context, TileKey tileKey, - FeatureID const & id, CaptionDescription const & captions, - double currentScaleGtoP) - : TBase(context, tileKey, id, captions) +ApplyLineFeature::ApplyLineFeature(TInsertShapeFn const & insertShape, FeatureID const & id, + int minVisibleScale, uint8_t rank, CaptionDescription const & captions, + double currentScaleGtoP, bool simplify, size_t pointsCount) + : TBase(insertShape, id, minVisibleScale, rank, captions) , m_currentScaleGtoP(currentScaleGtoP) + , m_sqrScale(math::sqr(m_currentScaleGtoP)) + , m_simplify(simplify) + , m_initialPointsCount(pointsCount) + , m_shieldDepth(0.0) + , m_shieldRule(nullptr) +#ifdef CALC_FILTERED_POINTS + , m_readedCount(0) +#endif { } void ApplyLineFeature::operator() (m2::PointD const & point) { - if (m_spline.IsNull()) - m_spline.Reset(new m2::Spline()); +#ifdef CALC_FILTERED_POINTS + ++m_readedCount; +#endif - m_spline->AddPoint(point); + if (m_spline.IsNull()) + m_spline.Reset(new m2::Spline(m_initialPointsCount)); + + if (m_spline->IsEmpty()) + { + m_spline->AddPoint(point); + m_lastAddedPoint = point; + } + else + { + static float minSegmentLength = math::sqr(4.0 * df::VisualParams::Instance().GetVisualScale()); + if (m_simplify && + ((m_spline->GetSize() > 1 && point.SquareLength(m_lastAddedPoint) * m_sqrScale < minSegmentLength) || + m_spline->IsPrelonging(point))) + { + m_spline->ReplacePoint(point); + } + else + { + m_spline->AddPoint(point); + m_lastAddedPoint = point; + } + } } bool ApplyLineFeature::HasGeometry() const @@ -275,7 +407,7 @@ bool ApplyLineFeature::HasGeometry() const return m_spline->IsValid(); } -void ApplyLineFeature::ProcessRule(Stylist::rule_wrapper_t const & rule) +void ApplyLineFeature::ProcessRule(Stylist::TRuleWrapper const & rule) { ASSERT(HasGeometry(), ()); drule::BaseRule const * pRule = rule.first; @@ -284,59 +416,80 @@ void ApplyLineFeature::ProcessRule(Stylist::rule_wrapper_t const & rule) bool isWay = (pRule->GetType() & drule::way) != 0; CaptionDefProto const * pCaptionRule = pRule->GetCaption(0); LineDefProto const * pLineRule = pRule->GetLine(); - if (pCaptionRule == NULL && pLineRule == NULL) - return; + ShieldRuleProto const * pShieldRule = pRule->GetShield(); - ASSERT(pCaptionRule == NULL || pLineRule == NULL, ()); - if (pCaptionRule != NULL && pCaptionRule->height() > 2 && + if (pCaptionRule != nullptr && pCaptionRule->height() > 2 && !m_captions.GetPathName().empty() && isWay) { - FontDecl fontDecl; + dp::FontDecl fontDecl; CaptionDefProtoToFontDecl(pCaptionRule, fontDecl); PathTextViewParams params; params.m_depth = depth; + params.m_minVisibleScale = m_minVisibleScale; + params.m_rank = m_rank; params.m_text = m_captions.GetPathName(); params.m_textFont = fontDecl; params.m_baseGtoPScale = m_currentScaleGtoP; - m_context.InsertShape(m_tileKey, dp::MovePointer(new PathTextShape(m_spline, params))); + m_insertShape(make_unique_dp(m_spline, params)); } - if (pLineRule != NULL) + if (pLineRule != nullptr) { if (pLineRule->has_pathsym()) { PathSymProto const & symRule = pLineRule->pathsym(); PathSymbolViewParams params; params.m_depth = depth; + params.m_minVisibleScale = m_minVisibleScale; + params.m_rank = m_rank; params.m_symbolName = symRule.name(); float const mainScale = df::VisualParams::Instance().GetVisualScale(); params.m_offset = symRule.offset() * mainScale; params.m_step = symRule.step() * mainScale; params.m_baseGtoPScale = m_currentScaleGtoP; - m_context.InsertShape(m_tileKey, dp::MovePointer(new PathSymbolShape(m_spline, params))); + m_insertShape(make_unique_dp(m_spline, params)); } else { LineViewParams params; Extract(pLineRule, params); params.m_depth = depth; + params.m_minVisibleScale = m_minVisibleScale; + params.m_rank = m_rank; params.m_baseGtoPScale = m_currentScaleGtoP; - m_context.InsertShape(m_tileKey, dp::MovePointer(new LineShape(m_spline, params))); + + m_insertShape(make_unique_dp(m_spline, params)); } } + + if (pShieldRule != nullptr) + { + m_shieldDepth = depth; + m_shieldRule = pShieldRule; + } } void ApplyLineFeature::Finish() { +#ifdef CALC_FILTERED_POINTS + LinesStat::Get().InsertLine(m_id, m_currentScaleGtoP, m_readedCount, m_spline->GetSize()); +#endif + + if (m_shieldRule == nullptr) + return; + string const & roadNumber = m_captions.GetRoadNumber(); if (roadNumber.empty()) return; - double pathPixelLength = m_spline->GetLength() * m_currentScaleGtoP; - int const textHeight = static_cast(11 * df::VisualParams::Instance().GetVisualScale()); + dp::FontDecl font; + ShieldRuleProtoToFontDecl(m_shieldRule, font); + + double const pathPixelLength = m_spline->GetLength() * m_currentScaleGtoP; + int const textHeight = static_cast(font.m_size); // I don't know why we draw by this, but it's work before and will work now if (pathPixelLength > (roadNumber.size() + 2) * textHeight) @@ -346,17 +499,25 @@ void ApplyLineFeature::Finish() int const count = static_cast((pathPixelLength / emptySpace) + 2); double const splineStep = pathPixelLength / count; + float const mainScale = df::VisualParams::Instance().GetVisualScale(); + TextViewParams viewParams; - viewParams.m_depth = 0; + viewParams.m_depth = m_shieldDepth; + viewParams.m_minVisibleScale = m_minVisibleScale; + viewParams.m_rank = m_rank; viewParams.m_anchor = dp::Center; viewParams.m_featureID = FeatureID(); viewParams.m_primaryText = roadNumber; - viewParams.m_primaryTextFont = FontDecl(dp::Color::RoadNumberOutline(), textHeight, dp::Color::White()); + viewParams.m_primaryTextFont = font; + viewParams.m_primaryOffset = m2::PointF(0, 0); + viewParams.m_primaryOptional = true; + viewParams.m_secondaryOptional = true; + viewParams.m_extendingSize = m_shieldRule->has_min_distance() ? mainScale * m_shieldRule->min_distance() : 0; m2::Spline::iterator it = m_spline.CreateIterator(); while (!it.BeginAgain()) { - m_context.InsertShape(m_tileKey, dp::MovePointer(new TextShape(it.m_pos, viewParams))); + m_insertShape(make_unique_dp(it.m_pos, viewParams, false /* hasPOI */)); it.Advance(splineStep); } } diff --git a/drape_frontend/apply_feature_functors.hpp b/drape_frontend/apply_feature_functors.hpp index a810cbeb3d..429acf4e6f 100644 --- a/drape_frontend/apply_feature_functors.hpp +++ b/drape_frontend/apply_feature_functors.hpp @@ -3,53 +3,58 @@ #include "drape_frontend/stylist.hpp" #include "drape_frontend/tile_key.hpp" +#include "drape/pointers.hpp" + #include "indexer/point_to_int64.hpp" #include "geometry/point2d.hpp" #include "geometry/spline.hpp" -class CircleRuleProto; -class SymbolRuleProto; class CaptionDefProto; +class CircleRuleProto; +class ShieldRuleProto; +class SymbolRuleProto; + +//#define CALC_FILTERED_POINTS namespace df { struct TextViewParams; -class EngineContext; +class MapShape; + +using TInsertShapeFn = function && shape)>; class BaseApplyFeature { public: - BaseApplyFeature(EngineContext & context, - TileKey tileKey, - FeatureID const & id, - CaptionDescription const & captions); + BaseApplyFeature(TInsertShapeFn const & insertShape, FeatureID const & id, + int minVisibleScale, uint8_t rank, CaptionDescription const & captions); + + virtual ~BaseApplyFeature() {} protected: void ExtractCaptionParams(CaptionDefProto const * primaryProto, CaptionDefProto const * secondaryProto, - double depth, - TextViewParams & params) const; + double depth, TextViewParams & params) const; -protected: - EngineContext & m_context; - TileKey m_tileKey; + TInsertShapeFn m_insertShape; FeatureID m_id; CaptionDescription const & m_captions; + int m_minVisibleScale; + uint8_t m_rank; }; class ApplyPointFeature : public BaseApplyFeature { - typedef BaseApplyFeature TBase; + using TBase = BaseApplyFeature; + public: - ApplyPointFeature(EngineContext & context, - TileKey tileKey, - FeatureID const & id, - CaptionDescription const & captions); + ApplyPointFeature(TInsertShapeFn const & insertShape, FeatureID const & id, + int minVisibleScale, uint8_t rank, CaptionDescription const & captions); void operator()(m2::PointD const & point); - void ProcessRule(Stylist::rule_wrapper_t const & rule); + void ProcessRule(Stylist::TRuleWrapper const & rule); void Finish(); private: @@ -63,17 +68,16 @@ private: class ApplyAreaFeature : public ApplyPointFeature { - typedef ApplyPointFeature TBase; + using TBase = ApplyPointFeature; + public: - ApplyAreaFeature(EngineContext & context, - TileKey tileKey, - FeatureID const & id, - CaptionDescription const & captions); + ApplyAreaFeature(TInsertShapeFn const & insertShape, FeatureID const & id, + int minVisibleScale, uint8_t rank, CaptionDescription const & captions); using TBase::operator (); void operator()(m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3); - void ProcessRule(Stylist::rule_wrapper_t const & rule); + void ProcessRule(Stylist::TRuleWrapper const & rule); private: vector m_triangles; @@ -81,22 +85,31 @@ private: class ApplyLineFeature : public BaseApplyFeature { - typedef BaseApplyFeature TBase; + using TBase = BaseApplyFeature; + public: - ApplyLineFeature(EngineContext & context, - TileKey tileKey, - FeatureID const & id, - CaptionDescription const & captions, - double currentScaleGtoP); + ApplyLineFeature(TInsertShapeFn const & insertShape, FeatureID const & id, + int minVisibleScale, uint8_t rank, CaptionDescription const & captions, + double currentScaleGtoP, bool simplify, size_t pointsCount); void operator() (m2::PointD const & point); bool HasGeometry() const; - void ProcessRule(Stylist::rule_wrapper_t const & rule); + void ProcessRule(Stylist::TRuleWrapper const & rule); void Finish(); private: m2::SharedSpline m_spline; double m_currentScaleGtoP; + double m_sqrScale; + m2::PointD m_lastAddedPoint; + bool m_simplify; + size_t m_initialPointsCount; + double m_shieldDepth; + ShieldRuleProto const * m_shieldRule; + +#ifdef CALC_FILTERED_POINTS + int m_readedCount; +#endif }; } // namespace df diff --git a/drape_frontend/area_shape.cpp b/drape_frontend/area_shape.cpp index 4f9568f7db..7ae49ce7fd 100644 --- a/drape_frontend/area_shape.cpp +++ b/drape_frontend/area_shape.cpp @@ -21,27 +21,26 @@ AreaShape::AreaShape(vector && triangleList, AreaViewParams const & { } -void AreaShape::Draw(dp::RefPointer batcher, dp::RefPointer textures) const +void AreaShape::Draw(ref_ptr batcher, ref_ptr textures) const { dp::TextureManager::ColorRegion region; textures->GetColorRegion(m_params.m_color, region); glsl::vec2 const colorPoint = glsl::ToVec2(region.GetTexRect().Center()); - buffer_vector vertexes; + buffer_vector vertexes; vertexes.resize(m_vertexes.size()); transform(m_vertexes.begin(), m_vertexes.end(), vertexes.begin(), [&colorPoint, this](m2::PointF const & vertex) { - return gpu::SolidTexturingVertex(glsl::vec3(glsl::ToVec2(vertex), m_params.m_depth), - glsl::vec2(0.0, 0.0), + return gpu::AreaVertex(glsl::vec3(glsl::ToVec2(vertex), m_params.m_depth), colorPoint); }); - dp::GLState state(gpu::TEXTURING_PROGRAM, dp::GLState::GeometryLayer); + dp::GLState state(gpu::AREA_PROGRAM, dp::GLState::GeometryLayer); state.SetColorTexture(region.GetTexture()); dp::AttributeProvider provider(1, m_vertexes.size()); - provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), dp::MakeStackRefPointer(vertexes.data())); - batcher->InsertTriangleList(state, dp::MakeStackRefPointer(&provider)); + provider.InitStream(0, gpu::AreaVertex::GetBindingInfo(), make_ref(vertexes.data())); + batcher->InsertTriangleList(state, make_ref(&provider)); } } // namespace df diff --git a/drape_frontend/area_shape.hpp b/drape_frontend/area_shape.hpp index 6001e8179f..fc497a7414 100644 --- a/drape_frontend/area_shape.hpp +++ b/drape_frontend/area_shape.hpp @@ -16,7 +16,9 @@ class AreaShape : public MapShape public: AreaShape(vector && triangleList, AreaViewParams const & params); - virtual void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; + void Draw(ref_ptr batcher, ref_ptr textures) const override; + + MapShapePriority GetPriority() const override { return MapShapePriority::AreaPriority; } private: vector m_vertexes; diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index d3bf5bdc7b..4db2d97631 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -1,110 +1,240 @@ +#include "drape_frontend/gui/drape_gui.hpp" + #include "drape_frontend/backend_renderer.hpp" -#include "drape_frontend/read_manager.hpp" #include "drape_frontend/batchers_pool.hpp" -#include "drape_frontend/visual_params.hpp" #include "drape_frontend/map_shape.hpp" - -#include "drape_frontend/threads_commutator.hpp" #include "drape_frontend/message_subclasses.hpp" +#include "drape_frontend/read_manager.hpp" +#include "drape_frontend/route_builder.hpp" +#include "drape_frontend/user_mark_shapes.hpp" +#include "drape_frontend/visual_params.hpp" + +#include "indexer/scales.hpp" -#include "drape/oglcontextfactory.hpp" #include "drape/texture_manager.hpp" #include "platform/platform.hpp" +#include "base/logging.hpp" + #include "std/bind.hpp" namespace df { -BackendRenderer::BackendRenderer(dp::RefPointer commutator, - dp::RefPointer oglcontextfactory, - MapDataProvider const & model) - : m_model(model) - , m_engineContext(commutator) - , m_commutator(commutator) - , m_contextFactory(oglcontextfactory) - , m_textures(new dp::TextureManager()) +BackendRenderer::BackendRenderer(Params const & params) + : BaseRenderer(ThreadsCommutator::ResourceUploadThread, params) + , m_model(params.m_model) + , m_readManager(make_unique_dp(params.m_commutator, m_model)) { - m_commutator->RegisterThread(ThreadsCommutator::ResourceUploadThread, this); - m_batchersPool.Reset(new BatchersPool(ReadManager::ReadCount(), bind(&BackendRenderer::FlushGeometry, this, _1))); - m_readManager.Reset(new ReadManager(m_engineContext, m_model)); + gui::DrapeGui::Instance().SetRecacheCountryStatusSlot([this]() + { + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(), + MessagePriority::High); + }); + + m_routeBuilder = make_unique_dp([this](drape_ptr && routeData) + { + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(move(routeData)), + MessagePriority::Normal); + }, [this](drape_ptr && routeSignData) + { + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(move(routeSignData)), + MessagePriority::Normal); + }); StartThread(); } BackendRenderer::~BackendRenderer() { + gui::DrapeGui::Instance().ClearRecacheCountryStatusSlot(); StopThread(); } -///////////////////////////////////////// -// MessageAcceptor // -///////////////////////////////////////// -void BackendRenderer::AcceptMessage(dp::RefPointer message) +unique_ptr BackendRenderer::CreateRoutine() +{ + return make_unique(*this); +} + +void BackendRenderer::RecacheGui(gui::TWidgetsInitInfo const & initInfo, gui::TWidgetsSizeInfo & sizeInfo) +{ + drape_ptr layerRenderer = m_guiCacher.RecacheWidgets(initInfo, sizeInfo, m_texMng); + drape_ptr outputMsg = make_unique_dp(move(layerRenderer)); + m_commutator->PostMessage(ThreadsCommutator::RenderThread, move(outputMsg), MessagePriority::High); +} + +void BackendRenderer::RecacheCountryStatus() +{ + drape_ptr layerRenderer = m_guiCacher.RecacheCountryStatus(m_texMng); + drape_ptr outputMsg = make_unique_dp(move(layerRenderer)); + m_commutator->PostMessage(ThreadsCommutator::RenderThread, move(outputMsg), MessagePriority::High); +} + +void BackendRenderer::AcceptMessage(ref_ptr message) { switch (message->GetType()) { case Message::UpdateReadManager: { - UpdateReadManagerMessage * msg = df::CastMessage(message); + ref_ptr msg = message; ScreenBase const & screen = msg->GetScreen(); - set const & tiles = msg->GetTiles(); - m_readManager->UpdateCoverage(screen, tiles); + TTilesCollection const & tiles = msg->GetTiles(); + m_readManager->UpdateCoverage(screen, tiles, m_texMng); + + gui::CountryStatusHelper & helper = gui::DrapeGui::Instance().GetCountryStatusHelper(); + if (!tiles.empty() && (*tiles.begin()).m_zoomLevel > scales::GetUpperWorldScale()) + m_model.UpdateCountryIndex(helper.GetCountryIndex(), screen.ClipRect().Center()); + else + helper.Clear(); + break; } case Message::InvalidateReadManagerRect: { - InvalidateReadManagerRectMessage * msg = df::CastMessage(message); + ref_ptr msg = message; m_readManager->Invalidate(msg->GetTilesForInvalidate()); break; } + case Message::CountryStatusRecache: + { + RecacheCountryStatus(); + break; + } + case Message::GuiRecache: + { + ref_ptr msg = message; + RecacheGui(msg->GetInitInfo(), msg->GetSizeInfoMap()); + break; + } + case Message::GuiLayerLayout: + { + ref_ptr msg = message; + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(msg->AcceptLayoutInfo()), + MessagePriority::Normal); + RecacheCountryStatus(); + break; + } case Message::TileReadStarted: - m_batchersPool->ReserveBatcher(df::CastMessage(message)->GetKey()); - break; + { + m_batchersPool->ReserveBatcher(static_cast>(message)->GetKey()); + break; + } case Message::TileReadEnded: - m_batchersPool->ReleaseBatcher(df::CastMessage(message)->GetKey()); - break; + { + ref_ptr msg = message; + m_batchersPool->ReleaseBatcher(msg->GetKey()); + break; + } + case Message::FinishReading: + { + ref_ptr msg = message; + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(move(msg->MoveTiles())), + MessagePriority::Normal); + break; + } case Message::MapShapeReaded: { - MapShapeReadedMessage * msg = df::CastMessage(message); - dp::RefPointer batcher = m_batchersPool->GetTileBatcher(msg->GetKey()); - dp::MasterPointer shape(msg->GetShape()); - shape->Draw(batcher, m_textures.GetRefPointer()); - - shape.Destroy(); + ref_ptr msg = message; + ref_ptr batcher = m_batchersPool->GetTileBatcher(msg->GetKey()); + for (drape_ptr const & shape : msg->GetShapes()) + shape->Draw(batcher, m_texMng); + break; + } + case Message::UpdateUserMarkLayer: + { + ref_ptr msg = message; + TileKey const & key = msg->GetKey(); + + UserMarksProvider const * marksProvider = msg->StartProcess(); + if (marksProvider->IsDirty()) + { + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(key), + MessagePriority::Normal); + + m_batchersPool->ReserveBatcher(key); + CacheUserMarks(marksProvider, m_batchersPool->GetTileBatcher(key), m_texMng); + m_batchersPool->ReleaseBatcher(key); + } + msg->EndProcess(); + break; + } + case Message::CountryInfoUpdate: + { + ref_ptr msg = message; + gui::CountryStatusHelper & helper = gui::DrapeGui::Instance().GetCountryStatusHelper(); + if (!msg->NeedShow()) + { + // Country is already loaded, so there is no need to show status GUI + // even if this country is updating. + helper.Clear(); + } + else + { + gui::CountryInfo const & info = msg->GetCountryInfo(); + if (msg->IsCurrentCountry() || helper.GetCountryIndex() == info.m_countryIndex) + { + helper.SetCountryInfo(info); + } + } + break; + } + case Message::AddRoute: + { + ref_ptr msg = message; + m_routeBuilder->Build(msg->GetRoutePolyline(), msg->GetTurns(), msg->GetColor(), m_texMng); + break; + } + case Message::CacheRouteSign: + { + ref_ptr msg = message; + m_routeBuilder->BuildSign(msg->GetPosition(), msg->IsStart(), msg->IsValid(), m_texMng); + break; + } + case Message::RemoveRoute: + { + ref_ptr msg = message; + + // we have to resend the message to FR, because it guaranties that + // RemoveRouteMessage will be precessed after FlushRouteMessage + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(msg->NeedDeactivateFollowing()), + MessagePriority::Normal); + break; + } + case Message::InvalidateTextures: + { + m_texMng->Invalidate(VisualParams::Instance().GetResourcePostfix()); + RecacheMyPosition(); + break; + } + case Message::StopRendering: + { + ProcessStopRenderingMessage(); + break; } - break; default: ASSERT(false, ()); break; } } -///////////////////////////////////////// -// ThreadPart // -///////////////////////////////////////// -void BackendRenderer::StartThread() -{ - m_selfThread.Create(make_unique(*this)); -} - -void BackendRenderer::StopThread() -{ - m_selfThread.GetRoutine()->Cancel(); - CloseQueue(); - m_selfThread.Join(); -} - void BackendRenderer::ReleaseResources() { m_readManager->Stop(); - m_readManager.Destroy(); - m_batchersPool.Destroy(); + m_readManager.reset(); + m_batchersPool.reset(); + m_routeBuilder.reset(); - m_textures->Release(); - m_textures.Destroy(); + m_texMng->Release(); + m_contextFactory->getResourcesUploadContext()->doneCurrent(); } BackendRenderer::Routine::Routine(BackendRenderer & renderer) : m_renderer(renderer) {} @@ -112,31 +242,51 @@ BackendRenderer::Routine::Routine(BackendRenderer & renderer) : m_renderer(rende void BackendRenderer::Routine::Do() { m_renderer.m_contextFactory->getResourcesUploadContext()->makeCurrent(); + GLFunctions::Init(); + m_renderer.InitGLDependentResource(); while (!IsCancelled()) + { m_renderer.ProcessSingleMessage(); + m_renderer.CheckRenderingEnabled(); + } m_renderer.ReleaseResources(); } void BackendRenderer::InitGLDependentResource() { + m_batchersPool = make_unique_dp(ReadManager::ReadCount(), bind(&BackendRenderer::FlushGeometry, this, _1)); + dp::TextureManager::Params params; - params.m_resPrefix = VisualParams::Instance().GetResourcePostfix(); + params.m_resPostfix = VisualParams::Instance().GetResourcePostfix(); + params.m_visualScale = df::VisualParams::Instance().GetVisualScale(); + params.m_colors = "colors.txt"; + params.m_patterns = "patterns.txt"; params.m_glyphMngParams.m_uniBlocks = "unicode_blocks.txt"; params.m_glyphMngParams.m_whitelist = "fonts_whitelist.txt"; params.m_glyphMngParams.m_blacklist = "fonts_blacklist.txt"; + params.m_glyphMngParams.m_sdfScale = VisualParams::Instance().GetGlyphSdfScale(); GetPlatform().GetFontNames(params.m_glyphMngParams.m_fonts); - m_textures->Init(params); + m_texMng->Init(params); + + RecacheMyPosition(); } -void BackendRenderer::FlushGeometry(dp::TransferPointer message) +void BackendRenderer::RecacheMyPosition() +{ + auto msg = make_unique_dp(make_unique_dp(m_texMng), + make_unique_dp(m_texMng)); + + m_commutator->PostMessage(ThreadsCommutator::RenderThread, move(msg), MessagePriority::High); +} + +void BackendRenderer::FlushGeometry(drape_ptr && message) { - m_textures->UpdateDynamicTextures(); GLFunctions::glFlush(); - m_commutator->PostMessage(ThreadsCommutator::RenderThread, message); + m_commutator->PostMessage(ThreadsCommutator::RenderThread, move(message), MessagePriority::Normal); } } // namespace df diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp index 2ec608a8c1..faa545b65a 100644 --- a/drape_frontend/backend_renderer.hpp +++ b/drape_frontend/backend_renderer.hpp @@ -1,14 +1,13 @@ #pragma once -#include "drape_frontend/message_acceptor.hpp" -#include "drape_frontend/engine_context.hpp" -#include "drape_frontend/viewport.hpp" +#include "drape_frontend/gui/layer_render.hpp" + +#include "drape_frontend/base_renderer.hpp" #include "drape_frontend/map_data_provider.hpp" +#include "drape_frontend/viewport.hpp" #include "drape/pointers.hpp" -#include "base/thread.hpp" - namespace dp { @@ -21,60 +20,59 @@ namespace df { class Message; -class ThreadsCommutator; class BatchersPool; class ReadManager; +class RouteBuilder; -class BackendRenderer : public MessageAcceptor +class BackendRenderer : public BaseRenderer { public: - BackendRenderer(dp::RefPointer commutator, - dp::RefPointer oglcontextfactory, - MapDataProvider const & model); + struct Params : BaseRenderer::Params + { + Params(ref_ptr commutator, ref_ptr factory, + ref_ptr texMng, MapDataProvider const & model) + : BaseRenderer::Params(commutator, factory, texMng) + , m_model(model) + {} + MapDataProvider const & m_model; + }; + + BackendRenderer(Params const & params); ~BackendRenderer() override; -private: - MapDataProvider m_model; - EngineContext m_engineContext; - dp::MasterPointer m_batchersPool; - dp::MasterPointer m_readManager; +protected: + unique_ptr CreateRoutine() override; - ///////////////////////////////////////// - // MessageAcceptor // - ///////////////////////////////////////// private: - void AcceptMessage(dp::RefPointer message); + void RecacheGui(gui::TWidgetsInitInfo const & initInfo, gui::TWidgetsSizeInfo & sizeInfo); + void RecacheCountryStatus(); + void RecacheMyPosition(); + + void AcceptMessage(ref_ptr message) override; - ///////////////////////////////////////// - // ThreadPart // - ///////////////////////////////////////// -private: class Routine : public threads::IRoutine { - public: + public: Routine(BackendRenderer & renderer); // threads::IRoutine overrides: void Do() override; - private: + private: BackendRenderer & m_renderer; }; - void StartThread(); - void StopThread(); void ReleaseResources(); void InitGLDependentResource(); - void FlushGeometry(dp::TransferPointer message); + void FlushGeometry(drape_ptr && message); -private: - threads::Thread m_selfThread; - dp::RefPointer m_commutator; - dp::RefPointer m_contextFactory; - - dp::MasterPointer m_textures; + MapDataProvider m_model; + drape_ptr m_batchersPool; + drape_ptr m_readManager; + drape_ptr m_routeBuilder; + gui::LayerCacher m_guiCacher; }; } // namespace df diff --git a/drape_frontend/base_renderer.cpp b/drape_frontend/base_renderer.cpp new file mode 100644 index 0000000000..498939e14f --- /dev/null +++ b/drape_frontend/base_renderer.cpp @@ -0,0 +1,143 @@ +#include "drape_frontend/base_renderer.hpp" +#include "drape_frontend/message_subclasses.hpp" + +#include "std/utility.hpp" + +namespace df +{ + +BaseRenderer::BaseRenderer(ThreadsCommutator::ThreadName name, Params const & params) + : m_commutator(params.m_commutator) + , m_contextFactory(params.m_oglContextFactory) + , m_texMng(params.m_texMng) + , m_threadName(name) + , m_isEnabled(true) + , m_renderingEnablingCompletionHandler(nullptr) + , m_wasNotified(false) +{ + m_commutator->RegisterThread(m_threadName, this); +} + +void BaseRenderer::StartThread() +{ + m_selfThread.Create(CreateRoutine()); +} + +void BaseRenderer::StopThread() +{ + // send message to stop rendering in render thread + m_commutator->PostMessage(m_threadName, + make_unique_dp(), + MessagePriority::High); + + // wake up render thread if necessary + if (!m_isEnabled) + { + WakeUp(); + } + + // wait for render thread completion + m_selfThread.Join(); +} + +void BaseRenderer::SetRenderingEnabled(bool const isEnabled) +{ + // here we have to wait for completion of internal SetRenderingEnabled + mutex completionMutex; + condition_variable completionCondition; + bool notified = false; + auto completionHandler = [&]() + { + lock_guard lock(completionMutex); + notified = true; + completionCondition.notify_one(); + }; + + SetRenderingEnabled(isEnabled, completionHandler); + + unique_lock lock(completionMutex); + completionCondition.wait(lock, [¬ified] { return notified; }); +} + +void BaseRenderer::SetRenderingEnabled(bool const isEnabled, TCompletionHandler completionHandler) +{ + if (isEnabled == m_isEnabled) + { + if (completionHandler != nullptr) + completionHandler(); + + return; + } + + m_renderingEnablingCompletionHandler = move(completionHandler); + if (isEnabled) + { + // wake up rendering thread + WakeUp(); + } + else + { + // here we set up value only if rendering disabled + m_isEnabled = false; + + // if renderer thread is waiting for message let it go + CancelMessageWaiting(); + } +} + +void BaseRenderer::CheckRenderingEnabled() +{ + if (!m_isEnabled) + { + bool const isDrawContext = m_threadName == ThreadsCommutator::RenderThread; + dp::OGLContext * context = isDrawContext ? m_contextFactory->getDrawContext() : + m_contextFactory->getResourcesUploadContext(); + + context->setRenderingEnabled(false); + + // nofity initiator-thread about rendering disabling + Notify(); + + // wait for signal + unique_lock lock(m_renderingEnablingMutex); + m_renderingEnablingCondition.wait(lock, [this] { return m_wasNotified; }); + + // here rendering is enabled again + m_wasNotified = false; + m_isEnabled = true; + + context->setRenderingEnabled(true); + + // nofity initiator-thread about rendering enabling + // m_renderingEnablingCompletionHandler will be setup before awakening of this thread + Notify(); + } +} + +void BaseRenderer::Notify() +{ + if (m_renderingEnablingCompletionHandler != nullptr) + m_renderingEnablingCompletionHandler(); + + m_renderingEnablingCompletionHandler = nullptr; +} + +void BaseRenderer::WakeUp() +{ + lock_guard lock(m_renderingEnablingMutex); + m_wasNotified = true; + m_renderingEnablingCondition.notify_one(); +} + +void BaseRenderer::ProcessStopRenderingMessage() +{ + m_selfThread.GetRoutine()->Cancel(); + CloseQueue(); +} + +bool BaseRenderer::CanReceiveMessage() +{ + return !m_selfThread.GetRoutine()->IsCancelled(); +} + +} // namespace df diff --git a/drape_frontend/base_renderer.hpp b/drape_frontend/base_renderer.hpp new file mode 100644 index 0000000000..4cde6295c4 --- /dev/null +++ b/drape_frontend/base_renderer.hpp @@ -0,0 +1,76 @@ +#pragma once + +#include "drape_frontend/message_acceptor.hpp" +#include "drape_frontend/threads_commutator.hpp" +#include "drape_frontend/tile_utils.hpp" + +#include "drape/oglcontextfactory.hpp" +#include "drape/texture_manager.hpp" + +#include "base/thread.hpp" + +#include "std/atomic.hpp" +#include "std/condition_variable.hpp" +#include "std/function.hpp" +#include "std/mutex.hpp" + +namespace df +{ + +class BaseRenderer : public MessageAcceptor +{ +public: + struct Params + { + Params(ref_ptr commutator, + ref_ptr factory, + ref_ptr texMng) + : m_commutator(commutator) + , m_oglContextFactory(factory) + , m_texMng(texMng) + { + } + + ref_ptr m_commutator; + ref_ptr m_oglContextFactory; + ref_ptr m_texMng; + }; + + BaseRenderer(ThreadsCommutator::ThreadName name, Params const & params); + + void SetRenderingEnabled(bool const isEnabled); + +protected: + ref_ptr m_commutator; + ref_ptr m_contextFactory; + ref_ptr m_texMng; + + void StartThread(); + void StopThread(); + + void CheckRenderingEnabled(); + void ProcessStopRenderingMessage(); + + virtual unique_ptr CreateRoutine() = 0; + +private: + bool CanReceiveMessage() override; + + using TCompletionHandler = function; + +private: + threads::Thread m_selfThread; + ThreadsCommutator::ThreadName m_threadName; + + mutex m_renderingEnablingMutex; + condition_variable m_renderingEnablingCondition; + atomic m_isEnabled; + TCompletionHandler m_renderingEnablingCompletionHandler; + bool m_wasNotified; + + void SetRenderingEnabled(bool const isEnabled, TCompletionHandler completionHandler); + void Notify(); + void WakeUp(); +}; + +} // namespace df diff --git a/drape_frontend/batchers_pool.cpp b/drape_frontend/batchers_pool.cpp index 14690cfacb..ce0423cdfe 100644 --- a/drape_frontend/batchers_pool.cpp +++ b/drape_frontend/batchers_pool.cpp @@ -18,9 +18,9 @@ namespace void FlushGeometry(BatchersPool::TSendMessageFn const & sendMessage, TileKey const & key, dp::GLState const & state, - dp::TransferPointer buffer) + drape_ptr && buffer) { - sendMessage(dp::MovePointer(new FlushRenderBucketMessage(key, state, buffer))); + sendMessage(make_unique_dp(key, state, move(buffer))); } } // namespace @@ -32,7 +32,12 @@ BatchersPool::BatchersPool(int initBatcherCount, TSendMessageFn const & sendMess BatchersPool::~BatchersPool() { - ASSERT(m_batchs.empty(), ()); + for_each(m_batchs.begin(), m_batchs.end(), [this](pair const & p) + { + m_pool.Return(p.second.first); + }); + + m_batchs.clear(); } void BatchersPool::ReserveBatcher(TileKey const & key) @@ -48,11 +53,11 @@ void BatchersPool::ReserveBatcher(TileKey const & key) batcher->StartSession(bind(&FlushGeometry, m_sendMessageFn, key, _1, _2)); } -dp::RefPointer BatchersPool::GetTileBatcher(TileKey const & key) +ref_ptr BatchersPool::GetTileBatcher(TileKey const & key) { TIterator it = m_batchs.find(key); ASSERT(it != m_batchs.end(), ()); - return dp::MakeStackRefPointer(it->second.first); + return make_ref(it->second.first); } void BatchersPool::ReleaseBatcher(TileKey const & key) diff --git a/drape_frontend/batchers_pool.hpp b/drape_frontend/batchers_pool.hpp index 00a9c98b08..cda9f4ec86 100644 --- a/drape_frontend/batchers_pool.hpp +++ b/drape_frontend/batchers_pool.hpp @@ -18,13 +18,13 @@ class Message; class BatchersPool { public: - typedef function)> TSendMessageFn; + typedef function &&)> TSendMessageFn; BatchersPool(int initBatcherCount, TSendMessageFn const & sendMessageFn); ~BatchersPool(); void ReserveBatcher(TileKey const & key); - dp::RefPointer GetTileBatcher(TileKey const & key); + ref_ptr GetTileBatcher(TileKey const & key); void ReleaseBatcher(TileKey const & key); private: diff --git a/drape_frontend/circle_shape.cpp b/drape_frontend/circle_shape.cpp index 6ae3436786..24ede7440a 100644 --- a/drape_frontend/circle_shape.cpp +++ b/drape_frontend/circle_shape.cpp @@ -6,6 +6,7 @@ #include "drape/glstate.hpp" #include "drape/shader_def.hpp" #include "drape/texture_manager.hpp" +#include "drape/overlay_handle.hpp" namespace df { @@ -16,7 +17,7 @@ CircleShape::CircleShape(m2::PointF const & mercatorPt, CircleViewParams const & { } -void CircleShape::Draw(dp::RefPointer batcher, dp::RefPointer textures) const +void CircleShape::Draw(ref_ptr batcher, ref_ptr textures) const { int const TriangleCount = 20; double const etalonSector = (2.0 * math::pi) / static_cast(TriangleCount); @@ -47,17 +48,23 @@ void CircleShape::Draw(dp::RefPointer batcher, dp::RefPointer overlay = make_unique_dp(m_params.m_id, + dp::Center, m_pt, + m2::PointD(handleSize, handleSize), + GetOverlayPriority()); dp::AttributeProvider provider(1, TriangleCount + 2); - provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), dp::MakeStackRefPointer(vertexes.data())); - batcher->InsertTriangleFan(state, dp::MakeStackRefPointer(&provider), dp::MovePointer(overlay)); + provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), make_ref(vertexes.data())); + batcher->InsertTriangleFan(state, make_ref(&provider), move(overlay)); +} + +uint64_t CircleShape::GetOverlayPriority() const +{ + return dp::CalculateOverlayPriority(m_params.m_minVisibleScale, m_params.m_rank, m_params.m_depth); } } // namespace df diff --git a/drape_frontend/circle_shape.hpp b/drape_frontend/circle_shape.hpp index 096ee5c430..e7f9d84f48 100644 --- a/drape_frontend/circle_shape.hpp +++ b/drape_frontend/circle_shape.hpp @@ -11,9 +11,11 @@ class CircleShape : public MapShape public: CircleShape(m2::PointF const & mercatorPt, CircleViewParams const & params); - virtual void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; + void Draw(ref_ptr batcher, ref_ptr textures) const override; private: + uint64_t GetOverlayPriority() const; + m2::PointF m_pt; CircleViewParams m_params; }; diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 9a18f2c906..7d77d1fac1 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -1,55 +1,425 @@ #include "drape_frontend/drape_engine.hpp" - #include "drape_frontend/message_subclasses.hpp" #include "drape_frontend/visual_params.hpp" +#include "drape_frontend/gui/country_status_helper.hpp" +#include "drape_frontend/gui/drape_gui.hpp" + #include "drape/texture_manager.hpp" +#include "platform/platform.hpp" +#include "platform/settings.hpp" + #include "std/bind.hpp" namespace df { -DrapeEngine::DrapeEngine(dp::RefPointer contextfactory, - Viewport const & viewport, - MapDataProvider const & model) - : m_viewport(viewport) +namespace { - GLFunctions::Init(); - VisualParams::Init(viewport.GetPixelRatio(), df::CalculateTileSize(m_viewport.GetWidth(), m_viewport.GetHeight())); - m_threadCommutator = dp::MasterPointer(new ThreadsCommutator()); - dp::RefPointer commutatorRef = m_threadCommutator.GetRefPointer(); +void ConnectDownloadFn(gui::CountryStatusHelper::EButtonType buttonType, MapDataProvider::TDownloadFn downloadFn) +{ + gui::DrapeGui & guiSubsystem = gui::DrapeGui::Instance(); + guiSubsystem.ConnectOnButtonPressedHandler(buttonType, [downloadFn, &guiSubsystem]() + { + storage::TIndex countryIndex = guiSubsystem.GetCountryStatusHelper().GetCountryIndex(); + ASSERT(countryIndex != storage::TIndex::INVALID, ()); + if (downloadFn != nullptr) + downloadFn(countryIndex); + }); +} - m_frontend = dp::MasterPointer(new FrontendRenderer(commutatorRef, - contextfactory, - m_viewport)); - m_backend = dp::MasterPointer(new BackendRenderer(commutatorRef, - contextfactory, - model)); +string const LocationStateMode = "LastLocationStateMode"; + +} + +DrapeEngine::DrapeEngine(Params && params) + : m_viewport(params.m_viewport) +{ + VisualParams::Init(params.m_vs, df::CalculateTileSize(m_viewport.GetWidth(), m_viewport.GetHeight())); + + gui::DrapeGui & guiSubsystem = gui::DrapeGui::Instance(); + guiSubsystem.SetLocalizator(bind(&StringsBundle::GetString, params.m_stringsBundle.get(), _1)); + guiSubsystem.SetSurfaceSize(m2::PointF(m_viewport.GetWidth(), m_viewport.GetHeight())); + + ConnectDownloadFn(gui::CountryStatusHelper::BUTTON_TYPE_MAP, params.m_model.GetDownloadMapHandler()); + ConnectDownloadFn(gui::CountryStatusHelper::BUTTON_TYPE_MAP_ROUTING, params.m_model.GetDownloadMapRoutingHandler()); + ConnectDownloadFn(gui::CountryStatusHelper::BUTTON_TRY_AGAIN, params.m_model.GetDownloadRetryHandler()); + + m_textureManager = make_unique_dp(); + m_threadCommutator = make_unique_dp(); + + location::EMyPositionMode mode = params.m_initialMyPositionMode.first; + if (!params.m_initialMyPositionMode.second && !Settings::Get(LocationStateMode, mode)) + mode = location::MODE_FOLLOW; + + FrontendRenderer::Params frParams(make_ref(m_threadCommutator), params.m_factory, + make_ref(m_textureManager), m_viewport, + bind(&DrapeEngine::ModelViewChanged, this, _1), + params.m_model.GetIsCountryLoadedFn(), + bind(&DrapeEngine::TapEvent, this, _1, _2, _3, _4), + bind(&DrapeEngine::UserPositionChanged, this, _1), + bind(&DrapeEngine::MyPositionModeChanged, this, _1), + mode); + + m_frontend = make_unique_dp(frParams); + + BackendRenderer::Params brParams(frParams.m_commutator, frParams.m_oglContextFactory, + frParams.m_texMng, params.m_model); + m_backend = make_unique_dp(brParams); + + m_widgetsInfo = move(params.m_info); + + GuiRecacheMessage::Blocker blocker; + drape_ptr message(new GuiRecacheMessage(blocker, m_widgetsInfo, m_widgetSizes)); + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, move(message), MessagePriority::High); + blocker.Wait(); + + ResizeImpl(m_viewport.GetWidth(), m_viewport.GetHeight()); } DrapeEngine::~DrapeEngine() { - m_frontend.Destroy(); - m_backend.Destroy(); - m_threadCommutator.Destroy(); + // reset pointers explicitly! We must wait for threads completion + m_frontend.reset(); + m_backend.reset(); + m_threadCommutator.reset(); + + gui::DrapeGui::Instance().Destroy(); + m_textureManager->Release(); } void DrapeEngine::Resize(int w, int h) { - if (m_viewport.GetLogicWidth() == w && m_viewport.GetLogicHeight() == h) - return; - - m_viewport.SetViewport(0, 0, w, h); - m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - dp::MovePointer(new ResizeMessage(m_viewport))); + if (m_viewport.GetHeight() != h || m_viewport.GetWidth() != w) + ResizeImpl(w, h); } -void DrapeEngine::UpdateCoverage(ScreenBase const & screen) +void DrapeEngine::Invalidate() { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - dp::MovePointer(new UpdateModelViewMessage(screen))); + make_unique_dp(), + MessagePriority::High); +} + +void DrapeEngine::AddTouchEvent(TouchEvent const & event) +{ + AddUserEvent(event); +} + +void DrapeEngine::Scale(double factor, m2::PointD const & pxPoint, bool isAnim) +{ + AddUserEvent(ScaleEvent(factor, pxPoint, isAnim)); +} + +void DrapeEngine::SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim) +{ + AddUserEvent(SetCenterEvent(centerPt, zoom, isAnim)); +} + +void DrapeEngine::SetModelViewRect(m2::RectD const & rect, bool applyRotation, int zoom, bool isAnim) +{ + AddUserEvent(SetRectEvent(rect, applyRotation, zoom, isAnim)); +} + +void DrapeEngine::SetModelViewAnyRect(m2::AnyRectD const & rect, bool isAnim) +{ + AddUserEvent(SetAnyRectEvent(rect, isAnim)); +} + +int DrapeEngine::AddModelViewListener(TModelViewListenerFn const & listener) +{ + static int currentSlotID = 0; + VERIFY(m_listeners.insert(make_pair(++currentSlotID, listener)).second, ()); + return currentSlotID; +} + +void DrapeEngine::RemoveModeViewListener(int slotID) +{ + m_listeners.erase(slotID); +} + +void DrapeEngine::ClearUserMarksLayer(df::TileKey const & tileKey) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(tileKey), + MessagePriority::Normal); +} + +void DrapeEngine::ChangeVisibilityUserMarksLayer(TileKey const & tileKey, bool isVisible) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(tileKey, isVisible), + MessagePriority::Normal); +} + +void DrapeEngine::UpdateUserMarksLayer(TileKey const & tileKey, UserMarksProvider * provider) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(tileKey, provider), + MessagePriority::Normal); +} + +void DrapeEngine::SetRenderingEnabled(bool const isEnabled) +{ + m_frontend->SetRenderingEnabled(isEnabled); + m_backend->SetRenderingEnabled(isEnabled); + + LOG(LDEBUG, (isEnabled ? "Rendering enabled" : "Rendering disabled")); +} + +void DrapeEngine::InvalidateRect(m2::RectD const & rect) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(rect), + MessagePriority::High); +} + +void DrapeEngine::UpdateMapStyle() +{ + // Update map style. + { + UpdateMapStyleMessage::Blocker blocker; + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(blocker), + MessagePriority::High); + blocker.Wait(); + } + + // Recache gui after updating of style. + { + GuiRecacheMessage::Blocker blocker; + drape_ptr message(new GuiRecacheMessage(blocker, m_widgetsInfo, m_widgetSizes)); + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, move(message), MessagePriority::High); + blocker.Wait(); + + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(m_widgetsLayout), + MessagePriority::High); + } +} + +void DrapeEngine::AddUserEvent(UserEvent const & e) +{ + m_frontend->AddUserEvent(e); +} + +void DrapeEngine::ModelViewChanged(ScreenBase const & screen) +{ + Platform & pl = GetPlatform(); + pl.RunOnGuiThread(bind(&DrapeEngine::ModelViewChangedGuiThread, this, screen)); +} + +void DrapeEngine::ModelViewChangedGuiThread(ScreenBase const & screen) +{ + for (pair const & p : m_listeners) + p.second(screen); +} + +void DrapeEngine::MyPositionModeChanged(location::EMyPositionMode mode) +{ + Settings::Set(LocationStateMode, mode); + GetPlatform().RunOnGuiThread([this, mode]() + { + if (m_myPositionModeChanged != nullptr) + m_myPositionModeChanged(mode); + }); +} + +void DrapeEngine::TapEvent(m2::PointD const & pxPoint, bool isLong, bool isMyPosition, FeatureID const & feature) +{ + GetPlatform().RunOnGuiThread([=]() + { + if (m_tapListener) + m_tapListener(pxPoint, isLong, isMyPosition, feature); + }); +} + +void DrapeEngine::UserPositionChanged(m2::PointD const & position) +{ + GetPlatform().RunOnGuiThread([this, position]() + { + if (m_userPositionChangedFn) + m_userPositionChangedFn(position); + }); +} + +void DrapeEngine::ResizeImpl(int w, int h) +{ + gui::DrapeGui::Instance().SetSurfaceSize(m2::PointF(w, h)); + m_viewport.SetViewport(0, 0, w, h); + AddUserEvent(ResizeEvent(w, h)); +} + +void DrapeEngine::SetCountryInfo(gui::CountryInfo const & info, bool isCurrentCountry) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(info, isCurrentCountry), + MessagePriority::Normal); +} + +void DrapeEngine::SetInvalidCountryInfo() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(), + MessagePriority::Normal); +} + +void DrapeEngine::SetCompassInfo(location::CompassInfo const & info) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(info), + MessagePriority::High); +} + +void DrapeEngine::SetGpsInfo(location::GpsInfo const & info, bool isNavigable, const location::RouteMatchingInfo & routeInfo) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(info, isNavigable, routeInfo), + MessagePriority::High); +} + +void DrapeEngine::MyPositionNextMode() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(ChangeMyPositionModeMessage::TYPE_NEXT), + MessagePriority::High); +} + +void DrapeEngine::FollowRoute(int preferredZoomLevel) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(ChangeMyPositionModeMessage::TYPE_NEXT, + preferredZoomLevel), + MessagePriority::High); +} + +void DrapeEngine::CancelMyPosition() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(ChangeMyPositionModeMessage::TYPE_CANCEL), + MessagePriority::High); +} + +void DrapeEngine::StopLocationFollow() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(ChangeMyPositionModeMessage::TYPE_STOP_FOLLOW), + MessagePriority::High); +} + +void DrapeEngine::InvalidateMyPosition() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(ChangeMyPositionModeMessage::TYPE_INVALIDATE), + MessagePriority::High); +} + +void DrapeEngine::SetMyPositionModeListener(location::TMyPositionModeChanged const & fn) +{ + m_myPositionModeChanged = fn; +} + +void DrapeEngine::SetTapEventInfoListener(TTapEventInfoFn const & fn) +{ + m_tapListener = fn; +} + +void DrapeEngine::SetUserPositionListener(DrapeEngine::TUserPositionChangedFn const & fn) +{ + m_userPositionChangedFn = fn; +} + +FeatureID DrapeEngine::GetVisiblePOI(m2::PointD const & glbPoint) +{ + FeatureID result; + BaseBlockingMessage::Blocker blocker; + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(blocker, glbPoint, result), + MessagePriority::High); + + blocker.Wait(); + return result; +} + +void DrapeEngine::SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, bool isAnim) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(obj, pt, isAnim), + MessagePriority::High); +} + +void DrapeEngine::DeselectObject() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(SelectObjectMessage::DismissTag()), + MessagePriority::High); +} + +SelectionShape::ESelectedObject DrapeEngine::GetSelectedObject() +{ + SelectionShape::ESelectedObject object; + BaseBlockingMessage::Blocker blocker; + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(blocker, object), + MessagePriority::High); + + blocker.Wait(); + return object; +} + +bool DrapeEngine::GetMyPosition(m2::PointD & myPosition) +{ + bool hasPosition = false; + BaseBlockingMessage::Blocker blocker; + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(blocker, hasPosition, myPosition), + MessagePriority::High); + + blocker.Wait(); + return hasPosition; +} + +void DrapeEngine::AddRoute(m2::PolylineD const & routePolyline, vector const & turns, dp::Color const & color) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(routePolyline, turns, color), + MessagePriority::Normal); +} + +void DrapeEngine::RemoveRoute(bool deactivateFollowing) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(deactivateFollowing), + MessagePriority::Normal); +} + +void DrapeEngine::DeactivateRouteFollowing() +{ + m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(), + MessagePriority::Normal); +} + +void DrapeEngine::SetRoutePoint(m2::PointD const & position, bool isStart, bool isValid) +{ + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(position, isStart, isValid), + MessagePriority::Normal); +} + +void DrapeEngine::SetWidgetLayout(gui::TWidgetsLayoutInfo && info) +{ + m_widgetsLayout = move(info); + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(m_widgetsLayout), + MessagePriority::Normal); +} + +gui::TWidgetsSizeInfo const & DrapeEngine::GetWidgetSizes() +{ + return m_widgetSizes; } } // namespace df diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index 3bf7e0976c..437341f822 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -1,38 +1,148 @@ #pragma once -#include "drape_frontend/frontend_renderer.hpp" #include "drape_frontend/backend_renderer.hpp" +#include "drape_frontend/frontend_renderer.hpp" #include "drape_frontend/threads_commutator.hpp" +#include "drape_frontend/selection_shape.hpp" #include "drape/pointers.hpp" #include "drape/texture_manager.hpp" +#include "platform/location.hpp" + +#include "geometry/polyline2d.hpp" #include "geometry/screenbase.hpp" +#include "base/strings_bundle.hpp" + +#include "std/map.hpp" +#include "std/mutex.hpp" + namespace dp { class OGLContextFactory; } +namespace gui { struct CountryInfo; } namespace df { +class UserMarksProvider; class MapDataProvider; class Viewport; + class DrapeEngine { public: - DrapeEngine(dp::RefPointer oglcontextfactory, - Viewport const & viewport, - MapDataProvider const & model); + struct Params + { + Params(ref_ptr factory, + ref_ptr stringBundle, + Viewport const & viewport, + MapDataProvider const & model, + double vs, + gui::TWidgetsInitInfo && info, + pair const & initialMyPositionMode) + : m_factory(factory) + , m_stringsBundle(stringBundle) + , m_viewport(viewport) + , m_model(model) + , m_vs(vs) + , m_info(move(info)) + , m_initialMyPositionMode(initialMyPositionMode) + {} + + ref_ptr m_factory; + ref_ptr m_stringsBundle; + Viewport m_viewport; + MapDataProvider m_model; + double m_vs; + gui::TWidgetsInitInfo m_info; + pair m_initialMyPositionMode; + }; + + DrapeEngine(Params && params); ~DrapeEngine(); void Resize(int w, int h); - void UpdateCoverage(ScreenBase const & screen); + void Invalidate(); + + void AddTouchEvent(TouchEvent const & event); + void Scale(double factor, m2::PointD const & pxPoint, bool isAnim); + + /// if zoom == -1, then current zoom will not change + void SetModelViewCenter(m2::PointD const & centerPt, int zoom, bool isAnim); + void SetModelViewRect(m2::RectD const & rect, bool applyRotation, int zoom, bool isAnim); + void SetModelViewAnyRect(m2::AnyRectD const & rect, bool isAnim); + + using TModelViewListenerFn = FrontendRenderer::TModelViewChanged; + int AddModelViewListener(TModelViewListenerFn const & listener); + void RemoveModeViewListener(int slotID); + + void ClearUserMarksLayer(TileKey const & tileKey); + void ChangeVisibilityUserMarksLayer(TileKey const & tileKey, bool isVisible); + void UpdateUserMarksLayer(TileKey const & tileKey, UserMarksProvider * provider); + + void SetRenderingEnabled(bool const isEnabled); + void InvalidateRect(m2::RectD const & rect); + void UpdateMapStyle(); + + void SetCountryInfo(gui::CountryInfo const & info, bool isCurrentCountry); + void SetInvalidCountryInfo(); + void SetCompassInfo(location::CompassInfo const & info); + void SetGpsInfo(location::GpsInfo const & info, bool isNavigable, location::RouteMatchingInfo const & routeInfo); + void MyPositionNextMode(); + void CancelMyPosition(); + void StopLocationFollow(); + void InvalidateMyPosition(); + void SetMyPositionModeListener(location::TMyPositionModeChanged const & fn); + + using TTapEventInfoFn = FrontendRenderer::TTapEventInfoFn; + void SetTapEventInfoListener(TTapEventInfoFn const & fn); + using TUserPositionChangedFn = FrontendRenderer::TUserPositionChangedFn; + void SetUserPositionListener(TUserPositionChangedFn const & fn); + + FeatureID GetVisiblePOI(m2::PointD const & glbPoint); + void SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, bool isAnim); + void DeselectObject(); + bool GetMyPosition(m2::PointD & myPosition); + SelectionShape::ESelectedObject GetSelectedObject(); + + void AddRoute(m2::PolylineD const & routePolyline, vector const & turns, dp::Color const & color); + void RemoveRoute(bool deactivateFollowing); + void FollowRoute(int preferredZoomLevel); + void DeactivateRouteFollowing(); + void SetRoutePoint(m2::PointD const & position, bool isStart, bool isValid); + + void SetWidgetLayout(gui::TWidgetsLayoutInfo && info); + gui::TWidgetsSizeInfo const & GetWidgetSizes(); private: - dp::MasterPointer m_frontend; - dp::MasterPointer m_backend; - dp::MasterPointer m_threadCommutator; + void AddUserEvent(UserEvent const & e); + void ModelViewChanged(ScreenBase const & screen); + void ModelViewChangedGuiThread(ScreenBase const & screen); + + void MyPositionModeChanged(location::EMyPositionMode mode); + void TapEvent(m2::PointD const & pxPoint, bool isLong, bool isMyPosition, FeatureID const & feature); + void UserPositionChanged(m2::PointD const & position); + + void ResizeImpl(int w, int h); + +private: + drape_ptr m_frontend; + drape_ptr m_backend; + drape_ptr m_threadCommutator; + drape_ptr m_textureManager; Viewport m_viewport; + + using TListenerMap = map; + TListenerMap m_listeners; + + location::TMyPositionModeChanged m_myPositionModeChanged; + TTapEventInfoFn m_tapListener; + TUserPositionChangedFn m_userPositionChangedFn; + + gui::TWidgetsInitInfo m_widgetsInfo; + gui::TWidgetsSizeInfo m_widgetSizes; + gui::TWidgetsLayoutInfo m_widgetsLayout; }; } // namespace df diff --git a/drape_frontend/drape_frontend.pro b/drape_frontend/drape_frontend.pro old mode 100644 new mode 100755 index 8a016c2a84..f0e0740776 --- a/drape_frontend/drape_frontend.pro +++ b/drape_frontend/drape_frontend.pro @@ -6,71 +6,174 @@ ROOT_DIR = .. include($$ROOT_DIR/common.pri) INCLUDEPATH *= $$ROOT_DIR/3party/protobuf/src -DEFINES += DRAW_INFO +INCLUDEPATH *= $$ROOT_DIR/3party/expat/lib +INCLUDEPATH *= $$ROOT_DIR/3party/freetype/include +#DEFINES += DRAW_INFO SOURCES += \ - engine_context.cpp \ - memory_feature_index.cpp \ - message_queue.cpp \ - message.cpp \ - threads_commutator.cpp \ - message_acceptor.cpp \ - backend_renderer.cpp \ - read_mwm_task.cpp \ - batchers_pool.cpp \ - frontend_renderer.cpp \ - drape_engine.cpp \ - area_shape.cpp \ - read_manager.cpp \ - tile_info.cpp \ - stylist.cpp \ - line_shape.cpp \ - rule_drawer.cpp \ - viewport.cpp \ - tile_key.cpp \ + $$ROOT_DIR/3party/agg/agg_curves.cpp \ + animation/base_interpolator.cpp \ + animation/interpolation_holder.cpp \ + animation/interpolations.cpp \ + animation/model_view_animation.cpp \ + animation/opacity_animation.cpp \ + animation/show_hide_animation.cpp \ + gui/button.cpp \ + gui/compass.cpp \ + gui/copyright_label.cpp \ + gui/country_status.cpp \ + gui/country_status_helper.cpp \ + gui/drape_gui.cpp \ + gui/gui_text.cpp \ + gui/layer_render.cpp \ + gui/ruler.cpp \ + gui/ruler_helper.cpp \ + gui/shape.cpp \ + gui/skin.cpp \ apply_feature_functors.cpp \ - visual_params.cpp \ - poi_symbol_shape.cpp \ + area_shape.cpp \ + backend_renderer.cpp \ + base_renderer.cpp \ + batchers_pool.cpp \ circle_shape.cpp \ - render_group.cpp \ - text_shape.cpp \ - path_text_shape.cpp \ - path_symbol_shape.cpp \ - text_layout.cpp \ + drape_engine.cpp \ + engine_context.cpp \ + frontend_renderer.cpp \ + line_shape.cpp \ + line_shape_helper.cpp \ map_data_provider.cpp \ + memory_feature_index.cpp \ + message_acceptor.cpp \ + message_queue.cpp \ + my_position.cpp \ + my_position_controller.cpp \ + navigator.cpp \ + path_symbol_shape.cpp \ + path_text_shape.cpp \ + poi_symbol_shape.cpp \ + read_manager.cpp \ + read_mwm_task.cpp \ + render_group.cpp \ + render_node.cpp \ + route_builder.cpp \ + route_renderer.cpp \ + route_shape.cpp \ + rule_drawer.cpp \ + selection_shape.cpp \ + stylist.cpp \ + text_handle.cpp \ + text_layout.cpp \ + text_shape.cpp \ + threads_commutator.cpp \ + tile_info.cpp \ + tile_key.cpp \ + tile_tree.cpp \ + tile_tree_builder.cpp \ + tile_utils.cpp \ + user_event_stream.cpp \ + user_mark_shapes.cpp \ + user_marks_provider.cpp \ + viewport.cpp \ + visual_params.cpp \ + kinetic_scroller.cpp \ + watch/cpu_drawer.cpp \ + watch/software_renderer.cpp \ + watch/proto_to_styles.cpp \ + watch/text_engine.cpp \ + watch/feature_styler.cpp \ + watch/glyph_cache.cpp \ + watch/glyph_cache_impl.cpp \ + watch/geometry_processors.cpp \ + watch/feature_processor.cpp \ + watch/default_font.cpp \ HEADERS += \ - engine_context.hpp \ - memory_feature_index.hpp \ - tile_info.hpp \ - message_queue.hpp \ - message.hpp \ - threads_commutator.hpp \ - message_acceptor.hpp \ - backend_renderer.hpp \ - read_mwm_task.hpp \ - message_subclasses.hpp \ - map_shape.hpp \ - batchers_pool.hpp \ - frontend_renderer.hpp \ - drape_engine.hpp \ - area_shape.hpp \ - read_manager.hpp \ - stylist.hpp \ - line_shape.hpp \ - shape_view_params.hpp \ - rule_drawer.hpp \ - viewport.hpp \ - tile_key.hpp \ + animation/base_interpolator.hpp \ + animation/interpolation_holder.hpp \ + animation/interpolations.hpp \ + animation/model_view_animation.hpp \ + animation/opacity_animation.hpp \ + animation/show_hide_animation.hpp \ + animation/value_mapping.hpp \ + gui/button.hpp \ + gui/compass.hpp \ + gui/copyright_label.hpp \ + gui/country_status.hpp \ + gui/country_status_helper.hpp \ + gui/drape_gui.hpp \ + gui/gui_text.hpp \ + gui/layer_render.hpp \ + gui/ruler.hpp \ + gui/ruler_helper.hpp \ + gui/shape.hpp \ + gui/skin.hpp \ apply_feature_functors.hpp \ - visual_params.hpp \ - poi_symbol_shape.hpp \ + area_shape.hpp \ + backend_renderer.hpp \ + base_renderer.hpp \ + batchers_pool.hpp \ circle_shape.hpp \ - render_group.hpp \ - text_shape.hpp \ - path_text_shape.hpp \ - path_symbol_shape.hpp \ - fribidi.hpp \ - text_layout.hpp \ + drape_engine.hpp \ + engine_context.hpp \ + frontend_renderer.hpp \ intrusive_vector.hpp \ + line_shape.hpp \ + line_shape_helper.hpp \ map_data_provider.hpp \ + map_shape.hpp \ + memory_feature_index.hpp \ + message.hpp \ + message_acceptor.hpp \ + message_queue.hpp \ + message_subclasses.hpp \ + my_position.hpp \ + my_position_controller.hpp \ + navigator.hpp \ + path_symbol_shape.hpp \ + path_text_shape.hpp \ + poi_symbol_shape.hpp \ + read_manager.hpp \ + read_mwm_task.hpp \ + render_group.hpp \ + render_node.hpp \ + route_builder.hpp \ + route_renderer.hpp \ + route_shape.hpp \ + rule_drawer.hpp \ + selection_shape.hpp \ + shape_view_params.hpp \ + stylist.hpp \ + text_handle.hpp \ + text_layout.hpp \ + text_shape.hpp \ + threads_commutator.hpp \ + tile_info.hpp \ + tile_key.hpp \ + tile_tree.hpp \ + tile_tree_builder.hpp \ + tile_utils.hpp \ + user_event_stream.hpp \ + user_mark_shapes.hpp \ + user_marks_provider.hpp \ + viewport.hpp \ + visual_params.hpp \ + kinetic_scroller.hpp \ + watch/cpu_drawer.hpp \ + watch/software_renderer.hpp \ + watch/proto_to_styles.hpp \ + watch/text_engine.h \ + watch/point.h \ + watch/rect.h \ + watch/path_info.hpp \ + watch/area_info.hpp \ + watch/frame_image.hpp \ + watch/feature_styler.hpp \ + watch/glyph_cache.hpp \ + watch/glyph_cache_impl.hpp \ + watch/freetype.hpp \ + watch/circle_info.hpp \ + watch/pen_info.hpp \ + watch/icon_info.hpp \ + watch/brush_info.hpp \ + watch/geometry_processors.hpp \ + watch/feature_processor.hpp \ diff --git a/drape_frontend/drape_frontend_tests/anyrect_interpolation_tests.cpp b/drape_frontend/drape_frontend_tests/anyrect_interpolation_tests.cpp new file mode 100644 index 0000000000..0c99a23049 --- /dev/null +++ b/drape_frontend/drape_frontend_tests/anyrect_interpolation_tests.cpp @@ -0,0 +1,86 @@ +#include "testing/testing.hpp" + +#include "drape_frontend/animation/interpolations.hpp" + +namespace +{ + +void IsEqual(m2::AnyRectD const & r1, m2::AnyRectD const & r2) +{ + TEST(r1.LocalZero().EqualDxDy(r2.LocalZero(), 0.00001), ()); + TEST_ALMOST_EQUAL_ULPS(ang::AngleIn2PI(r1.Angle().val()), ang::AngleIn2PI(r2.Angle().val()), ()); + m2::RectD lR1 = r1.GetLocalRect(); + m2::RectD lR2 = r2.GetLocalRect(); + TEST_ALMOST_EQUAL_ULPS(lR1.minX(), lR2.minX(), ()); + TEST_ALMOST_EQUAL_ULPS(lR1.minY(), lR2.minY(), ()); + TEST_ALMOST_EQUAL_ULPS(lR1.maxX(), lR2.maxX(), ()); + TEST_ALMOST_EQUAL_ULPS(lR1.maxY(), lR2.maxY(), ()); +} + +} + +UNIT_TEST(MoveRectTest) +{ + double const halfSizeX = 0.5; + double const halfSizeY = 0.5; + + double const angle = 0.0; + m2::RectD const sizeRect(-halfSizeX, -halfSizeY, halfSizeX, halfSizeY); + m2::AnyRectD src(m2::PointD(27.0, 30.0), angle, sizeRect); + m2::AnyRectD dst(m2::PointD(28.0, 31.0), angle, sizeRect); + df::InterpolateAnyRect inter(src, dst); + IsEqual(src, inter.Interpolate(0.0)); + IsEqual(m2::AnyRectD(m2::PointD(27.5, 30.5), angle, sizeRect), inter.Interpolate(0.5)); + IsEqual(dst, inter.Interpolate(1.0)); +} + +UNIT_TEST(RotateRectTest) +{ + double const halfSizeX = 0.5; + double const halfSizeY = 0.5; + + m2::PointD zero(27.0, 30.0); + m2::RectD const sizeRect(-halfSizeX, -halfSizeY, halfSizeX, halfSizeY); + { + m2::AnyRectD src(zero, 0.0, sizeRect); + m2::AnyRectD dst(zero, math::pi2, sizeRect); + df::InterpolateAnyRect inter(src, dst); + IsEqual(src, inter.Interpolate(0.0)); + IsEqual(m2::AnyRectD(zero, math::pi4, sizeRect), inter.Interpolate(0.5)); + IsEqual(dst, inter.Interpolate(1.0)); + } + { + m2::AnyRectD src(zero, math::pi + math::pi2, sizeRect); + m2::AnyRectD dst(zero, 0.0, sizeRect); + df::InterpolateAnyRect inter(src, dst); + IsEqual(src, inter.Interpolate(0.0)); + IsEqual(m2::AnyRectD(zero, math::pi + math::pi2 + math::pi4, sizeRect), inter.Interpolate(0.5)); + IsEqual(dst, inter.Interpolate(1.0)); + } +} + +UNIT_TEST(ScaleRectTest) +{ + m2::PointD zero(27.0, 30.0); + double const angle = 0.0; + + m2::AnyRectD src(zero, angle, m2::RectD(-0.5, -0.5, 0.5, 0.5)); + m2::AnyRectD dst(zero, angle, m2::RectD(-2.0, -2.0, 2.0, 2.0)); + + df::InterpolateAnyRect inter(src, dst); + IsEqual(src, inter.Interpolate(0.0)); + IsEqual(m2::AnyRectD(zero, angle, m2::RectD(-1.25, -1.25, 1.25, 1.25)), inter.Interpolate(0.5)); + IsEqual(dst, inter.Interpolate(1.0)); +} + +UNIT_TEST(RectInterpolateTest) +{ + m2::AnyRectD src(m2::PointD(27.0, 36.0), math::pi2, m2::RectD(-1.0, -1.0, 1.0, 1.0)); + m2::AnyRectD dst(m2::PointD(29.0, 30.0), math::pi, m2::RectD(-0.5, -0.5, 0.5, 0.5)); + df::InterpolateAnyRect inter(src, dst); + + IsEqual(src, inter.Interpolate(0.0)); + m2::AnyRectD res(m2::PointD(28.0, 33.0), math::pi2 + math::pi4, m2::RectD(-0.75, -0.75, 0.75, 0.75)); + IsEqual(res, inter.Interpolate(0.5)); + IsEqual(dst, inter.Interpolate(1.0)); +} diff --git a/drape_frontend/drape_frontend_tests/drape_frontend_tests.pro b/drape_frontend/drape_frontend_tests/drape_frontend_tests.pro index 980cee98bf..4b9b507616 100644 --- a/drape_frontend/drape_frontend_tests/drape_frontend_tests.pro +++ b/drape_frontend/drape_frontend_tests/drape_frontend_tests.pro @@ -4,12 +4,25 @@ CONFIG += console warn_on CONFIG -= app_bundle TEMPLATE = app -DEPENDENCIES = drape_frontend drape base fribidi +DEPENDENCIES = drape_frontend drape platform indexer geometry coding base expat + ROOT_DIR = ../.. include($$ROOT_DIR/common.pri) +QT *= opengl + +macx-* { + LIBS *= "-framework CoreLocation" "-framework Foundation" "-framework CoreWLAN" \ + "-framework QuartzCore" "-framework IOKit" +} + SOURCES += \ ../../testing/testingmain.cpp \ - memory_feature_index_tests.cpp \ - fribidi_tests.cpp \ - object_pool_tests.cpp \ + anyrect_interpolation_tests.cpp \ + memory_feature_index_tests.cpp \ + navigator_test.cpp \ + object_pool_tests.cpp \ + tile_tree_tests.cpp \ + tile_utils_tests.cpp \ + user_event_stream_tests.cpp \ + diff --git a/drape_frontend/drape_frontend_tests/memory_feature_index_tests.cpp b/drape_frontend/drape_frontend_tests/memory_feature_index_tests.cpp index b9f0d71040..71914dbf75 100644 --- a/drape_frontend/drape_frontend_tests/memory_feature_index_tests.cpp +++ b/drape_frontend/drape_frontend_tests/memory_feature_index_tests.cpp @@ -15,173 +15,59 @@ namespace { - void MarkNodesAsReaded(vector & features, const vector & indexes) + +void JoinFinishFinction(threads::IRoutine * routine, threads::Condition & condition, int & counter) +{ + condition.Lock(); + counter++; + condition.Unlock(); + delete routine; + + condition.Signal(); +} + +class TestRoutine : public threads::IRoutine +{ +public: + TestRoutine(df::TFeaturesInfo & features, df::MemoryFeatureIndex &index) + : m_features(features) + , m_index(index) + {} + + virtual void Do() { - for (size_t i = 0; i < indexes.size(); ++i) - features[indexes[i]].m_isOwner = true; + vector result; + df::MemoryFeatureIndex::Lock lock(m_index); + m_index.ReadFeaturesRequest(m_features, result); } -// void ResetReadedMark(vector & features) -// { -// for (size_t i = 0; i < features.size(); ++i) -// features[i].m_isOwner = false; -// } -} +private: + df::TFeaturesInfo & m_features; + df::MemoryFeatureIndex & m_index; +}; -UNIT_TEST(MemoryFeatureIndex_SimpleTest) +void GenerateFeatures(df::TFeaturesInfo & features, int taskIndex) { -// df::TileInfo info1(1, 1, 10); -// df::TileInfo info2(1, 2, 10); - -// set features; - -// for (size_t i = 0; i < 10; ++i) -// { -// info1.m_featureInfo.push_back(df::FeatureInfo(FeatureID(0, i))); -// info2.m_featureInfo.push_back(df::FeatureInfo(FeatureID(0, 2 * i))); - -// features.insert(info1.m_featureInfo.back().m_id); -// features.insert(info2.m_featureInfo.back().m_id); -// } - -// df::MemoryFeatureIndex index; - -// { -// vector result; -// index.ReadFeaturesRequest(info1.m_featureInfo, result); -// MarkNodesAsReaded(info1.m_featureInfo, result); -// } - -// { -// vector result; -// index.ReadFeaturesRequest(info2.m_featureInfo, result); -// MarkNodesAsReaded(info2.m_featureInfo, result); -// } - -// set readedFeatures; -// for (size_t i = 0; i < info1.m_featureInfo.size(); ++i) -// TEST_EQUAL(readedFeatures.insert(info1.m_featureInfo[i].m_id).second, true, ()); - -// for (size_t i = 0; i < info2.m_featureInfo.size(); ++i) -// { -// if (info2.m_featureInfo[i].m_isOwner) -// TEST_EQUAL(readedFeatures.insert(info2.m_featureInfo[i].m_id).second, true, ()); -// } - -// TEST_EQUAL(readedFeatures.size(), features.size(), ()); + int const kCount = 10000; + for (int i = 0; i < kCount; ++i) + features.push_back(df::FeatureInfo(FeatureID(MwmSet::MwmId(), taskIndex * kCount / 2 + i))); } -UNIT_TEST(MemoryFeatureIndex_Test) -{ -// df::TileInfo info1(1, 1, 10); -// df::TileInfo info2(1, 2, 10); - -// for (size_t i = 0; i < 10; ++i) -// { -// FeatureID id1(0, i); -// FeatureID id2(0, 2 * i); - -// info1.m_featureInfo.push_back(df::FeatureInfo(FeatureID(0, i))); -// info2.m_featureInfo.push_back(df::FeatureInfo(FeatureID(0, 2 * i))); -// } - -// df::MemoryFeatureIndex index; - -// { -// vector result; -// index.ReadFeaturesRequest(info1.m_featureInfo, result); -// TEST_EQUAL(result.size(), info1.m_featureInfo.size(), ()); -// MarkNodesAsReaded(info1.m_featureInfo, result); -// } - -// { -// vector result; -// index.ReadFeaturesRequest(info2.m_featureInfo, result); -// TEST_EQUAL(result.size(), 5, ()); -// MarkNodesAsReaded(info2.m_featureInfo, result); -// } - -// index.RemoveFeatures(info1.m_featureInfo); -// ResetReadedMark(info1.m_featureInfo); - -// { -// vector result; -// index.ReadFeaturesRequest(info2.m_featureInfo, result); -// TEST_EQUAL(result.size(), 5, ()); -// MarkNodesAsReaded(info2.m_featureInfo, result); -// } - -// for (size_t i = 0; i < info2.m_featureInfo.size(); ++i) -// TEST_EQUAL(info2.m_featureInfo[i].m_isOwner, true, ()); - -// index.RemoveFeatures(info2.m_featureInfo); -// ResetReadedMark(info2.m_featureInfo); - -// { -// vector result; -// index.ReadFeaturesRequest(info1.m_featureInfo, result); -// TEST_EQUAL(result.size(), info1.m_featureInfo.size(), ()); -// MarkNodesAsReaded(info1.m_featureInfo, result); -// } - -// for (size_t i = 0; i < info1.m_featureInfo.size(); ++i) -// TEST_EQUAL(info1.m_featureInfo[i].m_isOwner, true, ()); -} - -namespace -{ - void JoinFinishFinction(threads::IRoutine * routine, threads::Condition & condition, int & counter) - { - condition.Lock(); - counter++; - condition.Unlock(); - delete routine; - - condition.Signal(); - } - - class TestRoutine : public threads::IRoutine - { - public: - TestRoutine(vector & features, df::MemoryFeatureIndex &index) - : m_features(features) - , m_index(index) - { - } - - virtual void Do() - { - vector result; - m_index.ReadFeaturesRequest(m_features, result); - MarkNodesAsReaded(m_features, result); - } - - private: - vector & m_features; - df::MemoryFeatureIndex & m_index; - }; - - void GenerateFeatures(vector & features) - { - for (int i = 0; i < 10000; ++i) - features.push_back(df::FeatureInfo(FeatureID(MwmSet::MwmId(), rand()))); - } -} +} // namespace UNIT_TEST(MemoryFeatureIndex_MT_Test) { - std::srand(std::time(0)); const int TASK_COUNT = 10; threads::Condition cond; int counter = 0; threads::ThreadPool pool(4, bind(&JoinFinishFinction, _1, ref(cond), ref(counter))); df::MemoryFeatureIndex index; - vector features[TASK_COUNT]; + df::TFeaturesInfo features[TASK_COUNT]; for (int i = 0; i < TASK_COUNT; ++i) { - GenerateFeatures(features[i]); + GenerateFeatures(features[i], i); pool.PushBack(new TestRoutine(features[i], index)); } diff --git a/map/map_tests/navigator_test.cpp b/drape_frontend/drape_frontend_tests/navigator_test.cpp similarity index 76% rename from map/map_tests/navigator_test.cpp rename to drape_frontend/drape_frontend_tests/navigator_test.cpp index cadeccbcbf..2a97c75687 100644 --- a/map/map_tests/navigator_test.cpp +++ b/drape_frontend/drape_frontend_tests/navigator_test.cpp @@ -1,6 +1,7 @@ #include "testing/testing.hpp" -#include "map/navigator.hpp" +#include "drape_frontend/navigator.hpp" +#include "drape_frontend/visual_params.hpp" #include "geometry/screenbase.hpp" @@ -30,25 +31,25 @@ UNIT_TEST(Navigator_Scale2Points) { - ScalesProcessor scales; - Navigator navigator(scales); + df::VisualParams::Init(1.0, 1024); + df::Navigator navigator; - navigator.OnSize(0, 0, 200, 100); + navigator.OnSize(200, 100); navigator.SetFromRect(m2::AnyRectD(m2::RectD(0, 0, 8, 4))); ScreenBase const & screen = navigator.Screen(); TEST_EQUAL(screen.ClipRect(), m2::RectD(0, 0, 8, 4), ()); navigator.StartScale(screen.GtoP(m2::PointD(1, 1)), - screen.GtoP(m2::PointD(7, 1)), 0); + screen.GtoP(m2::PointD(7, 1))); navigator.StopScale(screen.GtoP(m2::PointD(1, 1)), - screen.GtoP(m2::PointD(4, 1)), 1); + screen.GtoP(m2::PointD(4, 1))); TEST_EQUAL(screen.ClipRect(), m2::RectD(-1, -1, 15, 7), ()); } namespace { - void CheckNavigator(Navigator const & nav) + void CheckNavigator(df::Navigator const & nav) { typedef m2::PointD P; m2::RectD clipR = nav.Screen().ClipRect(); @@ -62,29 +63,28 @@ namespace P const & pxP = arr[i]; P const gP = nav.PtoG(pxP); P const pxP2 = nav.GtoP(gP); - TEST(m2::AlmostEqualULPs(pxP, pxP2), (pxP, pxP2)); + TEST(my::AlmostEqualAbs(pxP.x, pxP2.x, 0.00001), (pxP.x, pxP2.x)); + TEST(my::AlmostEqualAbs(pxP.y, pxP2.y, 0.00001), (pxP.y, pxP2.y)); } } } UNIT_TEST(Navigator_G2P_P2G) { - ScalesProcessor scales; - Navigator navigator(scales); + df::VisualParams::Init(1.0, 1024); + df::Navigator navigator; // Initialize. - navigator.OnSize(0, 0, 200, 100); + navigator.OnSize(200, 100); + m2::PointD center = navigator.Screen().PixelRect().Center(); navigator.SetFromRect(m2::AnyRectD(m2::RectD(0, 0, 8, 4))); TEST_EQUAL(navigator.Screen().ClipRect(), m2::RectD(0, 0, 8, 4), ()); CheckNavigator(navigator); - navigator.Scale(3.0); + navigator.Scale(center, 3.0); CheckNavigator(navigator); - navigator.Move(math::pi / 4.0, 3.0); - CheckNavigator(navigator); - - navigator.Scale(1/3.0); + navigator.Scale(center, 1/3.0); CheckNavigator(navigator); } diff --git a/drape_frontend/drape_frontend_tests/tile_tree_tests.cpp b/drape_frontend/drape_frontend_tests/tile_tree_tests.cpp new file mode 100644 index 0000000000..bd8acbcb4f --- /dev/null +++ b/drape_frontend/drape_frontend_tests/tile_tree_tests.cpp @@ -0,0 +1,493 @@ +#include "testing/testing.hpp" + +#include "drape_frontend/tile_tree_builder.hpp" + +#include "drape/glstate.hpp" + +#include "indexer/mercator.hpp" + +#include "base/logging.hpp" + +namespace +{ + +class TileTreeTester +{ +public: + TileTreeTester() + { + m_tree = make_unique(); + } + + void RequestTiles(int const tileScale, m2::RectD const & clipRect) + { + double const range = MercatorBounds::maxX - MercatorBounds::minX; + double const rectSize = range / (1 << tileScale); + int const minTileX = static_cast(floor(clipRect.minX() / rectSize)); + int const maxTileX = static_cast(ceil(clipRect.maxX() / rectSize)); + int const minTileY = static_cast(floor(clipRect.minY() / rectSize)); + int const maxTileY = static_cast(ceil(clipRect.maxY() / rectSize)); + + m_tree->BeginRequesting(tileScale, clipRect); + for (int tileY = minTileY; tileY < maxTileY; ++tileY) + { + for (int tileX = minTileX; tileX < maxTileX; ++tileX) + { + df::TileKey key(tileX, tileY, tileScale); + if (clipRect.IsIntersect(key.GetGlobalRect())) + m_tree->RequestTile(key); + } + } + m_tree->EndRequesting(); + } + + void FlushTile(int const currentZoomLevel, df::TileKey const & tileKey) + { + m_tree->ProcessTile(tileKey, currentZoomLevel, dp::GLState(0, dp::GLState::DepthLayer::GeometryLayer), nullptr); + } + + void FinishTiles(int const currentZoomLevel, df::TTilesCollection const & tiles) + { + m_tree->FinishTiles(tiles, currentZoomLevel); + } + + unique_ptr const & GetTree() + { + return m_tree; + } + +private: + unique_ptr m_tree; +}; + +UNIT_TEST(TileTree_TilesRequesting) +{ + using namespace df; + + TileTreeBuilder builder; + TileTreeComparer comparer; + TileTreeTester treeTester; + + treeTester.RequestTiles(4, m2::RectD(-20, -20, 20, 20)); + + unique_ptr result = builder.Build(Node(TileKey(-1, -1, 4), TileStatus::Requested) + .Node(TileKey(0, -1, 4), TileStatus::Requested) + .Node(TileKey(-1, 0, 4), TileStatus::Requested) + .Node(TileKey(0, 0, 4), TileStatus::Requested)); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); +} + +UNIT_TEST(TileTree_TilesFlushing) +{ + using namespace df; + + TileTreeBuilder builder; + TileTreeComparer comparer; + TileTreeTester treeTester; + + treeTester.RequestTiles(4, m2::RectD(-20, -20, 20, 20)); + treeTester.FlushTile(4, TileKey(0, -1, 4)); + treeTester.FlushTile(4, TileKey(0, 0, 4)); + + unique_ptr result = builder.Build(Node(TileKey(-1, -1, 4), TileStatus::Requested) + .Node(TileKey(0, -1, 4), TileStatus::Rendered) + .Node(TileKey(-1, 0, 4), TileStatus::Requested) + .Node(TileKey(0, 0, 4), TileStatus::Rendered)); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); +} + +UNIT_TEST(TileTree_TilesFinishing) +{ + using namespace df; + + TileTreeBuilder builder; + TileTreeComparer comparer; + TileTreeTester treeTester; + + treeTester.RequestTiles(4, m2::RectD(-20, -20, 20, 20)); + treeTester.FlushTile(4, TileKey(0, -1, 4)); + treeTester.FlushTile(4, TileKey(0, 0, 4)); + TTilesCollection tiles = { TileKey(-1, -1, 4), TileKey(-1, 0, 4) }; + treeTester.FinishTiles(4, tiles); + + unique_ptr result = builder.Build(Node(TileKey(-1, -1, 4), TileStatus::Rendered) + .Node(TileKey(0, -1, 4), TileStatus::Rendered) + .Node(TileKey(-1, 0, 4), TileStatus::Rendered) + .Node(TileKey(0, 0, 4), TileStatus::Rendered)); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); +} + +UNIT_TEST(TileTree_MapShifting) +{ + using namespace df; + + TileTreeBuilder builder; + TileTreeComparer comparer; + TileTreeTester treeTester; + + treeTester.RequestTiles(4, m2::RectD(-20, -20, 20, 20)); + treeTester.FlushTile(4, TileKey(0, -1, 4)); + treeTester.FlushTile(4, TileKey(0, 0, 4)); + treeTester.RequestTiles(4, m2::RectD(-10, -20, 30, 20)); + + unique_ptr result = builder.Build(Node(TileKey(-1, -1, 4), TileStatus::Requested) + .Node(TileKey(0, -1, 4), TileStatus::Rendered) + .Node(TileKey(-1, 0, 4), TileStatus::Requested) + .Node(TileKey(0, 0, 4), TileStatus::Rendered) + .Node(TileKey(1, -1, 4), TileStatus::Requested) + .Node(TileKey(1, 0, 4), TileStatus::Requested)); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); +} + +UNIT_TEST(TileTree_MapMagnification) +{ + using namespace df; + + TileTreeBuilder builder; + TileTreeComparer comparer; + TileTreeTester treeTester; + + treeTester.RequestTiles(4, m2::RectD(-20, -20, 20, 20)); + treeTester.FlushTile(4, TileKey(0, -1, 4)); + treeTester.FlushTile(4, TileKey(0, 0, 4)); + treeTester.FlushTile(4, TileKey(-1, -1, 4)); + treeTester.FlushTile(4, TileKey(-1, 0, 4)); + treeTester.RequestTiles(5, m2::RectD(-20, -20, 20, 20)); + + unique_ptr result = builder.Build(Node(TileKey(-1, -1, 4), + TileStatus::Rendered).Children(Node(TileKey(-2, -2, 5), TileStatus::Requested) + .Node(TileKey(-1, -2, 5), TileStatus::Requested) + .Node(TileKey(-2, -1, 5), TileStatus::Requested) + .Node(TileKey(-1, -1, 5), TileStatus::Requested)) + .Node(TileKey(0, -1, 4), + TileStatus::Rendered).Children(Node(TileKey(0, -2, 5), TileStatus::Requested) + .Node(TileKey(1, -2, 5), TileStatus::Requested) + .Node(TileKey(0, -1, 5), TileStatus::Requested) + .Node(TileKey(1, -1, 5), TileStatus::Requested)) + .Node(TileKey(-1, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(-2, 0, 5), TileStatus::Requested) + .Node(TileKey(-1, 0, 5), TileStatus::Requested) + .Node(TileKey(-2, 1, 5), TileStatus::Requested) + .Node(TileKey(-1, 1, 5), TileStatus::Requested)) + .Node(TileKey(0, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(0, 0, 5), TileStatus::Requested) + .Node(TileKey(1, 0, 5), TileStatus::Requested) + .Node(TileKey(0, 1, 5), TileStatus::Requested) + .Node(TileKey(1, 1, 5), TileStatus::Requested))); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.FlushTile(5, TileKey(-1, -2, 5)); + treeTester.FlushTile(5, TileKey(-2, -1, 5)); + treeTester.FlushTile(5, TileKey(0, -1, 5)); + treeTester.FlushTile(5, TileKey(-2, 1, 5)); + treeTester.FlushTile(5, TileKey(1, 0, 5)); + treeTester.FlushTile(5, TileKey(0, 1, 5)); + + result = builder.Build(Node(TileKey(-1, -1, 4), + TileStatus::Rendered).Children(Node(TileKey(-2, -2, 5), TileStatus::Requested) + .Node(TileKey(-1, -2, 5), TileStatus::Deferred) + .Node(TileKey(-2, -1, 5), TileStatus::Deferred) + .Node(TileKey(-1, -1, 5), TileStatus::Requested)) + .Node(TileKey(0, -1, 4), + TileStatus::Rendered).Children(Node(TileKey(0, -2, 5), TileStatus::Requested) + .Node(TileKey(1, -2, 5), TileStatus::Requested) + .Node(TileKey(0, -1, 5), TileStatus::Deferred) + .Node(TileKey(1, -1, 5), TileStatus::Requested)) + .Node(TileKey(-1, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(-2, 0, 5), TileStatus::Requested) + .Node(TileKey(-1, 0, 5), TileStatus::Requested) + .Node(TileKey(-2, 1, 5), TileStatus::Deferred) + .Node(TileKey(-1, 1, 5), TileStatus::Requested)) + .Node(TileKey(0, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(0, 0, 5), TileStatus::Requested) + .Node(TileKey(1, 0, 5), TileStatus::Deferred) + .Node(TileKey(0, 1, 5), TileStatus::Deferred) + .Node(TileKey(1, 1, 5), TileStatus::Requested))); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.FlushTile(5, TileKey(-2, -2, 5)); + treeTester.FlushTile(5, TileKey(-1, -1, 5)); + + result = builder.Build(Node(TileKey(-1, -1, 4), + TileStatus::Unknown, + true /* isRemoved */).Children(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered)) + .Node(TileKey(0, -1, 4), + TileStatus::Rendered).Children(Node(TileKey(0, -2, 5), TileStatus::Requested) + .Node(TileKey(1, -2, 5), TileStatus::Requested) + .Node(TileKey(0, -1, 5), TileStatus::Deferred) + .Node(TileKey(1, -1, 5), TileStatus::Requested)) + .Node(TileKey(-1, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(-2, 0, 5), TileStatus::Requested) + .Node(TileKey(-1, 0, 5), TileStatus::Requested) + .Node(TileKey(-2, 1, 5), TileStatus::Deferred) + .Node(TileKey(-1, 1, 5), TileStatus::Requested)) + .Node(TileKey(0, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(0, 0, 5), TileStatus::Requested) + .Node(TileKey(1, 0, 5), TileStatus::Deferred) + .Node(TileKey(0, 1, 5), TileStatus::Deferred) + .Node(TileKey(1, 1, 5), TileStatus::Requested))); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.FlushTile(5, TileKey(0, -2, 5)); + + // a tile comes several times + treeTester.FlushTile(5, TileKey(1, -2, 5)); + treeTester.FlushTile(5, TileKey(1, -2, 5)); + treeTester.FlushTile(5, TileKey(1, -2, 5)); + treeTester.FlushTile(5, TileKey(1, -2, 5)); + + result = builder.Build(Node(TileKey(-1, -1, 4), + TileStatus::Unknown, + true /* isRemoved */).Children(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered)) + .Node(TileKey(0, -1, 4), + TileStatus::Rendered).Children(Node(TileKey(0, -2, 5), TileStatus::Deferred) + .Node(TileKey(1, -2, 5), TileStatus::Deferred) + .Node(TileKey(0, -1, 5), TileStatus::Deferred) + .Node(TileKey(1, -1, 5), TileStatus::Requested)) + .Node(TileKey(-1, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(-2, 0, 5), TileStatus::Requested) + .Node(TileKey(-1, 0, 5), TileStatus::Requested) + .Node(TileKey(-2, 1, 5), TileStatus::Deferred) + .Node(TileKey(-1, 1, 5), TileStatus::Requested)) + .Node(TileKey(0, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(0, 0, 5), TileStatus::Requested) + .Node(TileKey(1, 0, 5), TileStatus::Deferred) + .Node(TileKey(0, 1, 5), TileStatus::Deferred) + .Node(TileKey(1, 1, 5), TileStatus::Requested))); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.FlushTile(5, TileKey(1, -1, 5)); + treeTester.FlushTile(5, TileKey(-2, 0, 5)); + treeTester.FlushTile(5, TileKey(-1, 0, 5)); + treeTester.FlushTile(5, TileKey(-1, 1, 5)); + treeTester.FlushTile(5, TileKey(0, 0, 5)); + treeTester.FlushTile(5, TileKey(1, 1, 5)); + + result = builder.Build(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered) + .Node(TileKey(0, -2, 5), TileStatus::Rendered) + .Node(TileKey(1, -2, 5), TileStatus::Rendered) + .Node(TileKey(0, -1, 5), TileStatus::Rendered) + .Node(TileKey(1, -1, 5), TileStatus::Rendered) + .Node(TileKey(-2, 0, 5), TileStatus::Rendered) + .Node(TileKey(-1, 0, 5), TileStatus::Rendered) + .Node(TileKey(-2, 1, 5), TileStatus::Rendered) + .Node(TileKey(-1, 1, 5), TileStatus::Rendered) + .Node(TileKey(0, 0, 5), TileStatus::Rendered) + .Node(TileKey(1, 0, 5), TileStatus::Rendered) + .Node(TileKey(0, 1, 5), TileStatus::Rendered) + .Node(TileKey(1, 1, 5), TileStatus::Rendered)); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); +} + +UNIT_TEST(TileTree_MapMinification) +{ + using namespace df; + + TileTreeBuilder builder; + TileTreeComparer comparer; + TileTreeTester treeTester; + + treeTester.RequestTiles(5, m2::RectD(-20, -20, 20, 20)); + TTilesCollection tiles = { TileKey(-2, -2, 5), TileKey(-1, -2, 5), TileKey(-2, -1, 5), TileKey(-1, -1, 5), + TileKey(0, -2, 5), TileKey(1, -2, 5), TileKey(0, -1, 5), TileKey(1, -1, 5), + TileKey(-2, 0, 5), TileKey(-1, 0, 5), TileKey(-2, 1, 5), TileKey(-1, 1, 5), + TileKey(0, 0, 5), TileKey(1, 0, 5), TileKey(0, 1, 5), TileKey(1, 1, 5) }; + treeTester.FinishTiles(5, tiles); + + unique_ptr result = builder.Build(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered) + .Node(TileKey(0, -2, 5), TileStatus::Rendered) + .Node(TileKey(1, -2, 5), TileStatus::Rendered) + .Node(TileKey(0, -1, 5), TileStatus::Rendered) + .Node(TileKey(1, -1, 5), TileStatus::Rendered) + .Node(TileKey(-2, 0, 5), TileStatus::Rendered) + .Node(TileKey(-1, 0, 5), TileStatus::Rendered) + .Node(TileKey(-2, 1, 5), TileStatus::Rendered) + .Node(TileKey(-1, 1, 5), TileStatus::Rendered) + .Node(TileKey(0, 0, 5), TileStatus::Rendered) + .Node(TileKey(1, 0, 5), TileStatus::Rendered) + .Node(TileKey(0, 1, 5), TileStatus::Rendered) + .Node(TileKey(1, 1, 5), TileStatus::Rendered)); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.RequestTiles(4, m2::RectD(-20, -20, 20, 20)); + + result = builder.Build(Node(TileKey(-1, -1, 4), + TileStatus::Requested).Children(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered)) + .Node(TileKey(0, -1, 4), + TileStatus::Requested).Children(Node(TileKey(0, -2, 5), TileStatus::Rendered) + .Node(TileKey(1, -2, 5), TileStatus::Rendered) + .Node(TileKey(0, -1, 5), TileStatus::Rendered) + .Node(TileKey(1, -1, 5), TileStatus::Rendered)) + .Node(TileKey(-1, 0, 4), + TileStatus::Requested).Children(Node(TileKey(-2, 0, 5), TileStatus::Rendered) + .Node(TileKey(-1, 0, 5), TileStatus::Rendered) + .Node(TileKey(-2, 1, 5), TileStatus::Rendered) + .Node(TileKey(-1, 1, 5), TileStatus::Rendered)) + .Node(TileKey(0, 0, 4), + TileStatus::Requested).Children(Node(TileKey(0, 0, 5), TileStatus::Rendered) + .Node(TileKey(1, 0, 5), TileStatus::Rendered) + .Node(TileKey(0, 1, 5), TileStatus::Rendered) + .Node(TileKey(1, 1, 5), TileStatus::Rendered))); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.FlushTile(4, TileKey(0, -1, 4)); + treeTester.FlushTile(4, TileKey(-1, 0, 4)); + + result = builder.Build(Node(TileKey(-1, -1, 4), + TileStatus::Requested).Children(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered)) + .Node(TileKey(0, -1, 4), + TileStatus::Rendered) + .Node(TileKey(-1, 0, 4), + TileStatus::Rendered) + .Node(TileKey(0, 0, 4), + TileStatus::Requested).Children(Node(TileKey(0, 0, 5), TileStatus::Rendered) + .Node(TileKey(1, 0, 5), TileStatus::Rendered) + .Node(TileKey(0, 1, 5), TileStatus::Rendered) + .Node(TileKey(1, 1, 5), TileStatus::Rendered))); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.FlushTile(4, TileKey(-1, -1, 4)); + treeTester.FlushTile(4, TileKey(0, 0, 4)); + + result = builder.Build(Node(TileKey(-1, -1, 4), TileStatus::Rendered) + .Node(TileKey(0, -1, 4), TileStatus::Rendered) + .Node(TileKey(-1, 0, 4), TileStatus::Rendered) + .Node(TileKey(0, 0, 4), TileStatus::Rendered)); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); +} + +UNIT_TEST(TileTree_MapMagMin) +{ + using namespace df; + + TileTreeBuilder builder; + TileTreeComparer comparer; + TileTreeTester treeTester; + + treeTester.RequestTiles(5, m2::RectD(-20, -20, 20, 20)); + TTilesCollection tiles = { TileKey(-2, -2, 5), TileKey(-1, -2, 5), TileKey(-2, -1, 5), TileKey(-1, -1, 5), + TileKey(0, -2, 5), TileKey(1, -2, 5), TileKey(0, -1, 5), TileKey(1, -1, 5), + TileKey(-2, -0, 5), TileKey(-1, 0, 5), TileKey(-2, 1, 5), TileKey(-1, 1, 5), + TileKey(0, 0, 5), TileKey(1, 0, 5), TileKey(0, 1, 5), TileKey(1, 1, 5) }; + treeTester.FinishTiles(5, tiles); + treeTester.RequestTiles(4, m2::RectD(-20, -20, 20, 20)); + treeTester.FlushTile(4, TileKey(0, -1, 4)); + treeTester.FlushTile(4, TileKey(-1, 0, 4)); + // Zoom in 5th level again + treeTester.RequestTiles(5, m2::RectD(-20, -20, 20, 20)); + + unique_ptr result = builder.Build(Node(TileKey(-1, -1, 4), + TileStatus::Unknown).Children(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered)) + .Node(TileKey(0, -1, 4), + TileStatus::Rendered).Children(Node(TileKey(0, -2, 5), TileStatus::Requested) + .Node(TileKey(1, -2, 5), TileStatus::Requested) + .Node(TileKey(0, -1, 5), TileStatus::Requested) + .Node(TileKey(1, -1, 5), TileStatus::Requested)) + .Node(TileKey(-1, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(-2, 0, 5), TileStatus::Requested) + .Node(TileKey(-1, 0, 5), TileStatus::Requested) + .Node(TileKey(-2, 1, 5), TileStatus::Requested) + .Node(TileKey(-1, 1, 5), TileStatus::Requested)) + .Node(TileKey(0, 0, 4), + TileStatus::Unknown).Children(Node(TileKey(0, 0, 5), TileStatus::Rendered) + .Node(TileKey(1, 0, 5), TileStatus::Rendered) + .Node(TileKey(0, 1, 5), TileStatus::Rendered) + .Node(TileKey(1, 1, 5), TileStatus::Rendered))); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + // current zoom level = 5, but tile (-1, -1, 4) is requested to flush + treeTester.FlushTile(5, TileKey(-1, -1, 4)); + // the tree must be the same + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.FlushTile(5, TileKey(0, -2, 5)); + treeTester.FlushTile(5, TileKey(1, -2, 5)); + treeTester.FlushTile(5, TileKey(0, -1, 5)); + treeTester.FlushTile(5, TileKey(1, -1, 5)); + treeTester.FlushTile(5, TileKey(-1, 0, 5)); + + result = builder.Build(Node(TileKey(-1, -1, 4), + TileStatus::Unknown).Children(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered)) + .Node(TileKey(0, -1, 4), + TileStatus::Unknown, + true /* isRemoved */).Children(Node(TileKey(0, -2, 5), TileStatus::Rendered) + .Node(TileKey(1, -2, 5), TileStatus::Rendered) + .Node(TileKey(0, -1, 5), TileStatus::Rendered) + .Node(TileKey(1, -1, 5), TileStatus::Rendered)) + .Node(TileKey(-1, 0, 4), + TileStatus::Rendered).Children(Node(TileKey(-2, 0, 5), TileStatus::Requested) + .Node(TileKey(-1, 0, 5), TileStatus::Deferred) + .Node(TileKey(-2, 1, 5), TileStatus::Requested) + .Node(TileKey(-1, 1, 5), TileStatus::Requested)) + .Node(TileKey(0, 0, 4), + TileStatus::Unknown).Children(Node(TileKey(0, 0, 5), TileStatus::Rendered) + .Node(TileKey(1, 0, 5), TileStatus::Rendered) + .Node(TileKey(0, 1, 5), TileStatus::Rendered) + .Node(TileKey(1, 1, 5), TileStatus::Rendered))); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); + + treeTester.FlushTile(5, TileKey(-2, 0, 5)); + treeTester.FlushTile(5, TileKey(-2, 1, 5)); + treeTester.FlushTile(5, TileKey(-1, 1, 5)); + + result = builder.Build(Node(TileKey(-2, -2, 5), TileStatus::Rendered) + .Node(TileKey(-1, -2, 5), TileStatus::Rendered) + .Node(TileKey(-2, -1, 5), TileStatus::Rendered) + .Node(TileKey(-1, -1, 5), TileStatus::Rendered) + .Node(TileKey(0, -2, 5), TileStatus::Rendered) + .Node(TileKey(1, -2, 5), TileStatus::Rendered) + .Node(TileKey(0, -1, 5), TileStatus::Rendered) + .Node(TileKey(1, -1, 5), TileStatus::Rendered) + .Node(TileKey(-2, 0, 5), TileStatus::Rendered) + .Node(TileKey(-1, 0, 5), TileStatus::Rendered) + .Node(TileKey(-2, 1, 5), TileStatus::Rendered) + .Node(TileKey(-1, 1, 5), TileStatus::Rendered) + .Node(TileKey(0, 0, 5), TileStatus::Rendered) + .Node(TileKey(1, 0, 5), TileStatus::Rendered) + .Node(TileKey(0, 1, 5), TileStatus::Rendered) + .Node(TileKey(1, 1, 5), TileStatus::Rendered)); + + TEST(comparer.IsEqual(treeTester.GetTree(), result), ("Tree = ", treeTester.GetTree(), "Result = ", result)); +} + + +} diff --git a/drape_frontend/drape_frontend_tests/tile_utils_tests.cpp b/drape_frontend/drape_frontend_tests/tile_utils_tests.cpp new file mode 100644 index 0000000000..cbbf41113f --- /dev/null +++ b/drape_frontend/drape_frontend_tests/tile_utils_tests.cpp @@ -0,0 +1,79 @@ +#include "testing/testing.hpp" + +#include "drape_frontend/tile_utils.hpp" + +namespace +{ + +UNIT_TEST(TileUtils_EqualityTest) +{ + df::TileKey key(1 /* x */, 2 /* y */, 2 /* zoom level */); + set output; + df::CalcTilesCoverage(key, 2 /* targetZoom */, output); + + TEST_EQUAL(output.size(), 1, ()); + TEST_EQUAL(*output.begin(), key, ()); +} + +UNIT_TEST(TileUtils_MinificationTest) +{ + df::TileKey key(500 /* x */, 300 /* y */, 12 /* zoom level */); + set output; + df::CalcTilesCoverage(key, 11 /* targetZoom */, output); + TEST_EQUAL(output.size(), 1, ()); + TEST_EQUAL(*output.begin(), df::TileKey(250, 150, 11), ()); + + df::TileKey key2(-351 /* x */, 300 /* y */, 12 /* zoom level */); + set output2; + df::CalcTilesCoverage(key2, 10 /* targetZoom */, output2); + TEST_EQUAL(output2.size(), 1, ()); + TEST_EQUAL(*output2.begin(), df::TileKey(-88, 75, 10), ()); + + set tileKeys = + { + df::TileKey(-351 /* x */, 300 /* y */, 12 /* zoom level */), + df::TileKey(-350 /* x */, 300 /* y */, 12 /* zoom level */) + }; + set output3; + df::CalcTilesCoverage(tileKeys, 10 /* targetZoom */, output3); + TEST_EQUAL(output3.size(), 1, ()); + TEST_EQUAL(*output3.begin(), df::TileKey(-88, 75, 10), ()); + + TEST_EQUAL(df::IsTileAbove(key, df::TileKey(250, 150, 11)), true, ()); +} + +UNIT_TEST(TileUtils_MagnificationTest) +{ + df::TileKey key(1 /* x */, 2 /* y */, 2 /* zoom level */); + set output; + df::CalcTilesCoverage(key, 4 /* targetZoom */, output); + + set expectedResult = + { + df::TileKey(4, 8, 4), df::TileKey(5, 8, 4), df::TileKey(6, 8, 4), df::TileKey(7, 8, 4), + df::TileKey(4, 9, 4), df::TileKey(5, 9, 4), df::TileKey(6, 9, 4), df::TileKey(7, 9, 4), + df::TileKey(4, 10, 4), df::TileKey(5, 10, 4), df::TileKey(6, 10, 4), df::TileKey(7, 10, 4), + df::TileKey(4, 11, 4), df::TileKey(5, 11, 4), df::TileKey(6, 11, 4), df::TileKey(7, 11, 4) + }; + + TEST_EQUAL(output, expectedResult, ()); + + df::TileKey key2(-1 /* x */, -2 /* y */, 2 /* zoom level */); + set output2; + df::CalcTilesCoverage(key2, 4 /* targetZoom */, output2); + + set expectedResult2 = + { + df::TileKey(-4, -8, 4), df::TileKey(-3, -8, 4), df::TileKey(-2, -8, 4), df::TileKey(-1, -8, 4), + df::TileKey(-4, -7, 4), df::TileKey(-3, -7, 4), df::TileKey(-2, -7, 4), df::TileKey(-1, -7, 4), + df::TileKey(-4, -6, 4), df::TileKey(-3, -6, 4), df::TileKey(-2, -6, 4), df::TileKey(-1, -6, 4), + df::TileKey(-4, -5, 4), df::TileKey(-3, -5, 4), df::TileKey(-2, -5, 4), df::TileKey(-1, -5, 4) + }; + + TEST_EQUAL(output2, expectedResult2, ()); + + for (df::TileKey const & k : expectedResult) + TEST_EQUAL(df::IsTileBelow(key, k), true, ()); +} + +} diff --git a/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp b/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp new file mode 100644 index 0000000000..f02ed9377c --- /dev/null +++ b/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp @@ -0,0 +1,185 @@ +#include "testing/testing.hpp" + +#include "drape_frontend/user_event_stream.hpp" + +#include "base/thread.hpp" + +#include "std/bind.hpp" +#include "std/cstring.hpp" +#include "std/list.hpp" + +#ifdef DEBUG + +namespace +{ + +class UserEventStreamTest : df::UserEventStream::Listener +{ +public: + UserEventStreamTest(bool filtrateTouches) + : m_stream([](m2::PointD const &) { return true; }) + , m_filtrate(filtrateTouches) + { + m_stream.SetTestBridge(bind(&UserEventStreamTest::TestBridge, this, _1)); + } + + void OnTap(m2::PointD const & pt, bool isLong) override {} + void OnDoubleTap(m2::PointD const & pt) override {} + void OnTwoFingersTap() override {} + bool OnSingleTouchFiltrate(m2::PointD const & pt, df::TouchEvent::ETouchType type) override { return m_filtrate; } + void OnDragStarted() override {} + void OnDragEnded(m2::PointD const & /*distance*/) override {} + void OnRotated() override {} + + void OnScaleStarted() override {} + void CorrectScalePoint(m2::PointD & pt) const override {} + void CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const override {} + void CorrectGlobalScalePoint(m2::PointD & pt) const override {} + void OnScaleEnded() override {} + + void AddUserEvent(df::TouchEvent const & event) + { + m_stream.AddEvent(event); + } + + void SetRect(m2::RectD const & r) + { + m_stream.AddEvent(df::SetRectEvent(r, false, -1, false /* isAnim */)); + } + + void AddExpectation(char const * action) + { + m_expectation.push_back(action); + } + + void RunTest() + { + bool dummy1, dummy2; + m_stream.ProcessEvents(dummy1, dummy2); + TEST_EQUAL(m_expectation.empty(), true, ()); + } + +private: + void TestBridge(char const * action) + { + TEST(!m_expectation.empty(), ()); + char const * a = m_expectation.front(); + TEST_EQUAL(strcmp(action, a), 0, ()); + m_expectation.pop_front(); + } + +private: + df::UserEventStream m_stream; + list m_expectation; + bool m_filtrate; +}; + +int touchTimeStamp = 1; + +df::TouchEvent MakeTouchEvent(m2::PointD const & pt1, m2::PointD const & pt2, df::TouchEvent::ETouchType type) +{ + df::TouchEvent e; + e.m_touches[0].m_location = pt1; + e.m_touches[0].m_id = 1; + e.m_touches[1].m_location = pt2; + e.m_touches[1].m_id = 2; + e.m_type = type; + e.SetFirstMaskedPointer(0); + e.SetSecondMaskedPointer(1); + e.m_timeStamp = touchTimeStamp++; + + return e; +} + +df::TouchEvent MakeTouchEvent(m2::PointD const & pt, df::TouchEvent::ETouchType type) +{ + df::TouchEvent e; + e.m_touches[0].m_location = pt; + e.m_touches[0].m_id = 1; + e.m_type = type; + e.SetFirstMaskedPointer(0); + e.m_timeStamp = touchTimeStamp++; + + return e; +} + +} // namespace + +UNIT_TEST(SimpleTap) +{ + UserEventStreamTest test(false); + test.AddExpectation(df::UserEventStream::TRY_FILTER); + test.AddExpectation(df::UserEventStream::BEGIN_TAP_DETECTOR); + test.AddExpectation(df::UserEventStream::SHORT_TAP_DETECTED); + + test.AddUserEvent(MakeTouchEvent(m2::PointD::Zero(), df::TouchEvent::TOUCH_DOWN)); + test.AddUserEvent(MakeTouchEvent(m2::PointD::Zero(), df::TouchEvent::TOUCH_UP)); + + test.RunTest(); +} + +UNIT_TEST(SimpleLongTap) +{ + UserEventStreamTest test(false); + test.AddExpectation(df::UserEventStream::TRY_FILTER); + test.AddExpectation(df::UserEventStream::BEGIN_TAP_DETECTOR); + test.AddUserEvent(MakeTouchEvent(m2::PointD::Zero(), df::TouchEvent::TOUCH_DOWN)); + test.RunTest(); + + threads::Sleep(1100); + test.AddExpectation(df::UserEventStream::LONG_TAP_DETECTED); + test.RunTest(); + + test.AddUserEvent(MakeTouchEvent(m2::PointD::Zero(), df::TouchEvent::TOUCH_UP)); + test.RunTest(); +} + +UNIT_TEST(SimpleDrag) +{ + size_t const moveEventCount = 5; + UserEventStreamTest test(false); + test.AddExpectation(df::UserEventStream::TRY_FILTER); + test.AddExpectation(df::UserEventStream::BEGIN_TAP_DETECTOR); + test.AddExpectation(df::UserEventStream::CANCEL_TAP_DETECTOR); + test.AddExpectation(df::UserEventStream::BEGIN_DRAG); + for (size_t i = 0; i < moveEventCount - 2; ++i) + test.AddExpectation(df::UserEventStream::DRAG); + test.AddExpectation(df::UserEventStream::END_DRAG); + + m2::PointD pointer = m2::PointD::Zero(); + test.AddUserEvent(MakeTouchEvent(pointer, df::TouchEvent::TOUCH_DOWN)); + for (size_t i = 0; i < 5; ++i) + { + pointer += m2::PointD(100.0, 0.0); + test.AddUserEvent(MakeTouchEvent(pointer, df::TouchEvent::TOUCH_MOVE)); + } + test.AddUserEvent(MakeTouchEvent(pointer, df::TouchEvent::TOUCH_UP)); + test.RunTest(); +} + +UNIT_TEST(SimpleScale) +{ + size_t const moveEventCount = 5; + UserEventStreamTest test(false); + test.SetRect(m2::RectD(-250.0, -250.0, 250.0, 250.0)); + + test.AddExpectation(df::UserEventStream::TWO_FINGERS_TAP); + test.AddExpectation(df::UserEventStream::BEGIN_SCALE); + for (size_t i = 0; i < moveEventCount - 1; ++i) + test.AddExpectation(df::UserEventStream::SCALE); + test.AddExpectation(df::UserEventStream::END_SCALE); + + m2::PointD pointer1 = m2::PointD::Zero() + m2::PointD(10.0, 10.0); + m2::PointD pointer2 = m2::PointD::Zero() - m2::PointD(10.0, 10.0); + test.AddUserEvent(MakeTouchEvent(pointer1, pointer2, df::TouchEvent::TOUCH_DOWN)); + for (size_t i = 0; i < moveEventCount; ++i) + { + pointer1 += m2::PointD(20.0, 0.0); + pointer2 -= m2::PointD(20.0, 0.0); + test.AddUserEvent(MakeTouchEvent(pointer1, pointer2, df::TouchEvent::TOUCH_MOVE)); + } + test.AddUserEvent(MakeTouchEvent(pointer1, pointer2, df::TouchEvent::TOUCH_UP)); + test.RunTest(); +} + +#endif diff --git a/drape_frontend/engine_context.cpp b/drape_frontend/engine_context.cpp index 7c44cd90bd..7cefcd6959 100644 --- a/drape_frontend/engine_context.cpp +++ b/drape_frontend/engine_context.cpp @@ -1,74 +1,43 @@ #include "drape_frontend/engine_context.hpp" -//#define DRAW_TILE_NET - #include "drape_frontend/message_subclasses.hpp" -#include "drape_frontend/map_shape.hpp" -#ifdef DRAW_TILE_NET -#include "drape_frontend/line_shape.hpp" -#include "drape_frontend/text_shape.hpp" - -#include "base/string_utils.hpp" -#endif +#include "drape/texture_manager.hpp" namespace df { -EngineContext::EngineContext(dp::RefPointer commutator) - : m_commutator(commutator) +EngineContext::EngineContext(TileKey tileKey, ref_ptr commutator, + ref_ptr texMng) + : m_tileKey(tileKey) + , m_commutator(commutator) + , m_texMng(texMng) { } -void EngineContext::BeginReadTile(TileKey const & key) +ref_ptr EngineContext::GetTextureManager() const { - PostMessage(new TileReadStartMessage(key)); + return m_texMng; } -void EngineContext::InsertShape(TileKey const & key, dp::TransferPointer shape) +void EngineContext::BeginReadTile() { - PostMessage(new MapShapeReadedMessage(key, shape)); + PostMessage(make_unique_dp(m_tileKey)); } -void EngineContext::EndReadTile(TileKey const & key) +void EngineContext::Flush(TMapShapes && shapes) { -#ifdef DRAW_TILE_NET - m2::RectD r = key.GetGlobalRect(); - vector path; - path.push_back(r.LeftBottom()); - path.push_back(r.LeftTop()); - path.push_back(r.RightTop()); - path.push_back(r.RightBottom()); - path.push_back(r.LeftBottom()); - - m2::SharedSpline spline(path); - df::LineViewParams p; - p.m_baseGtoPScale = 1.0; - p.m_cap = dp::ButtCap; - p.m_color = dp::Color::Red(); - p.m_depth = 20000; - p.m_width = 5; - p.m_join = dp::RoundJoin; - - InsertShape(key, dp::MovePointer(new LineShape(spline, p))); - - df::TextViewParams tp; - tp.m_anchor = dp::Center; - tp.m_depth = 20000; - tp.m_primaryText = strings::to_string(key.m_x) + " " + - strings::to_string(key.m_y) + " " + - strings::to_string(key.m_zoomLevel); - - tp.m_primaryTextFont = df::FontDecl(dp::Color::Red(), 30); - - InsertShape(key, dp::MovePointer(new TextShape(r.Center(), tp))); -#endif - - PostMessage(new TileReadEndMessage(key)); + PostMessage(make_unique_dp(m_tileKey, move(shapes))); } -void EngineContext::PostMessage(Message * message) +void EngineContext::EndReadTile() { - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, dp::MovePointer(message)); + PostMessage(make_unique_dp(m_tileKey)); +} + +void EngineContext::PostMessage(drape_ptr && message) +{ + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, move(message), + MessagePriority::Normal); } } // namespace df diff --git a/drape_frontend/engine_context.hpp b/drape_frontend/engine_context.hpp index e1c338899d..e9330f1892 100644 --- a/drape_frontend/engine_context.hpp +++ b/drape_frontend/engine_context.hpp @@ -1,32 +1,41 @@ #pragma once +#include "drape_frontend/map_shape.hpp" +#include "drape_frontend/tile_utils.hpp" #include "drape_frontend/threads_commutator.hpp" #include "drape/pointers.hpp" +namespace dp +{ +class TextureManager; +} // namespace dp + namespace df { class Message; -class MapShape; -struct TileKey; class EngineContext { public: - EngineContext(dp::RefPointer commutator); + EngineContext(TileKey tileKey, ref_ptr commutator, + ref_ptr texMng); - void BeginReadTile(TileKey const & key); - /// If you call this method, you may forget about shape. - /// It will be proccessed and delete later - void InsertShape(TileKey const & key, dp::TransferPointer shape); - void EndReadTile(TileKey const & key); + TileKey const & GetTileKey() const { return m_tileKey; } + + ref_ptr GetTextureManager() const; + + void BeginReadTile(); + void Flush(TMapShapes && shapes); + void EndReadTile(); private: - void PostMessage(Message * message); + void PostMessage(drape_ptr && message); -private: - dp::RefPointer m_commutator; + TileKey m_tileKey; + ref_ptr m_commutator; + ref_ptr m_texMng; }; } // namespace df diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp old mode 100644 new mode 100755 index 13218f7249..ff2310ecfa --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1,13 +1,27 @@ +#include "drape_frontend/animation/interpolation_holder.hpp" +#include "drape_frontend/gui/drape_gui.hpp" #include "drape_frontend/frontend_renderer.hpp" #include "drape_frontend/message_subclasses.hpp" #include "drape_frontend/visual_params.hpp" +#include "drape_frontend/user_mark_shapes.hpp" -#include "base/timer.hpp" -#include "base/assert.hpp" -#include "base/stl_add.hpp" +#include "drape/debug_rect_renderer.hpp" + +#include "drape/utils/glyph_usage_tracker.hpp" +#include "drape/utils/gpu_mem_tracker.hpp" +#include "drape/utils/projection.hpp" + +#include "indexer/scales.hpp" +#include "indexer/drawing_rules.hpp" #include "geometry/any_rect2d.hpp" +#include "base/timer.hpp" +#include "base/assert.hpp" +#include "base/logging.hpp" +#include "base/stl_add.hpp" + +#include "std/algorithm.hpp" #include "std/bind.hpp" #include "std/cmath.hpp" @@ -17,45 +31,34 @@ namespace df namespace { -#ifdef DEBUG const double VSyncInterval = 0.030; -//const double InitAvarageTimePerMessage = 0.003; -#else -const double VSyncInterval = 0.014; -//const double InitAvarageTimePerMessage = 0.001; -#endif - -void OrthoMatrix(float * m, float left, float right, float bottom, float top, float nearClip, float farClip) -{ - memset(m, 0, 16 * sizeof(float)); - m[0] = 2.0f / (right - left); - m[3] = - (right + left) / (right - left); - m[5] = 2.0f / (top - bottom); - m[7] = - (top + bottom) / (top - bottom); - m[10] = -2.0f / (farClip - nearClip); - m[11] = - (farClip + nearClip) / (farClip - nearClip); - m[15] = 1.0; -} +//const double VSyncInterval = 0.014; } // namespace -FrontendRenderer::FrontendRenderer(dp::RefPointer commutator, - dp::RefPointer oglcontextfactory, - Viewport viewport) - : m_commutator(commutator) - , m_contextFactory(oglcontextfactory) +FrontendRenderer::FrontendRenderer(Params const & params) + : BaseRenderer(ThreadsCommutator::RenderThread, params) , m_gpuProgramManager(new dp::GpuProgramManager()) - , m_viewport(viewport) + , m_routeRenderer(new RouteRenderer()) + , m_overlayTree(new dp::OverlayTree()) + , m_viewport(params.m_viewport) + , m_userEventStream(params.m_isCountryLoadedFn) + , m_modelViewChangedFn(params.m_modelViewChangedFn) + , m_tapEventInfoFn(params.m_tapEventFn) + , m_userPositionChangedFn(params.m_positionChangedFn) + , m_tileTree(new TileTree()) { #ifdef DRAW_INFO m_tpf = 0,0; m_fps = 0.0; #endif - m_commutator->RegisterThread(ThreadsCommutator::RenderThread, this); + ASSERT(m_tapEventInfoFn, ()); + ASSERT(m_userPositionChangedFn, ()); + + m_myPositionController.reset(new MyPositionController(params.m_initMyPositionMode)); + m_myPositionController->SetModeListener(params.m_myPositionModeCallback); - RefreshProjection(); - RefreshModelView(); StartThread(); } @@ -87,65 +90,350 @@ void FrontendRenderer::AfterDrawFrame() LOG(LINFO, ("Average Fps : ", m_fps)); LOG(LINFO, ("Average Tpf : ", m_tpf)); + +#if defined(TRACK_GPU_MEM) + string report = dp::GPUMemTracker::Inst().Report(); + LOG(LINFO, (report)); +#endif +#if defined(TRACK_GLYPH_USAGE) + string glyphReport = dp::GlyphUsageTracker::Instance().Report(); + LOG(LINFO, (glyphReport)); +#endif } } + #endif -void FrontendRenderer::AcceptMessage(dp::RefPointer message) +void FrontendRenderer::AcceptMessage(ref_ptr message) { switch (message->GetType()) { case Message::FlushTile: { - FlushRenderBucketMessage * msg = df::CastMessage(message); + ref_ptr msg = message; dp::GLState const & state = msg->GetState(); TileKey const & key = msg->GetKey(); - dp::MasterPointer bucket(msg->AcceptBuffer()); - dp::RefPointer program = m_gpuProgramManager->GetProgram(state.GetProgramIndex()); + drape_ptr bucket = msg->AcceptBuffer(); + ref_ptr program = m_gpuProgramManager->GetProgram(state.GetProgramIndex()); program->Bind(); bucket->GetBuffer()->Build(program); - RenderGroup * group = new RenderGroup(state, key); - group->AddBucket(bucket.Move()); - m_renderGroups.push_back(group); + if (!IsUserMarkLayer(key)) + m_tileTree->ProcessTile(key, GetCurrentZoomLevel(), state, move(bucket)); + else + { + m_userMarkRenderGroups.emplace_back(make_unique_dp(state, key, move(bucket))); + m_userMarkRenderGroups.back()->SetRenderParams(program, make_ref(&m_generalUniforms)); + } break; } - case Message::Resize: + case Message::FinishReading: { - ResizeMessage * rszMsg = df::CastMessage(message); - m_viewport = rszMsg->GetViewport(); - m_view.OnSize(m_viewport.GetX0(), m_viewport.GetY0(), - m_viewport.GetWidth(), m_viewport.GetHeight()); - m_contextFactory->getDrawContext()->resize(m_viewport.GetWidth(), m_viewport.GetHeight()); - RefreshProjection(); - RefreshModelView(); - ResolveTileKeys(); - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - dp::MovePointer(new UpdateReadManagerMessage(m_view, m_tiles))); - break; - } - - case Message::UpdateModelView: - { - UpdateModelViewMessage * coverMessage = df::CastMessage(message); - m_view = coverMessage->GetScreen(); - RefreshModelView(); - ResolveTileKeys(); - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - dp::MovePointer(new UpdateReadManagerMessage(m_view, m_tiles))); + ref_ptr msg = message; + m_tileTree->FinishTiles(msg->GetTiles(), GetCurrentZoomLevel()); break; } case Message::InvalidateRect: { - InvalidateRectMessage * m = df::CastMessage(message); + ref_ptr m = message; + TTilesCollection tiles; + ScreenBase screen = m_userEventStream.GetCurrentScreen(); + m2::RectD rect = m->GetRect(); + if (rect.Intersect(screen.ClipRect())) + { + m_tileTree->Invalidate(); + ResolveTileKeys(rect, tiles); - set keyStorage; - ResolveTileKeys(keyStorage, m->GetRect()); - InvalidateRenderGroups(keyStorage); + auto eraseFunction = [&tiles](vector> & groups) + { + vector > newGroups; + for (drape_ptr & group : groups) + { + if (tiles.find(group->GetTileKey()) == tiles.end()) + newGroups.push_back(move(group)); + } - Message * msgToBackend = new InvalidateReadManagerRectMessage(keyStorage); - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, dp::MovePointer(msgToBackend)); + swap(groups, newGroups); + }; + + eraseFunction(m_renderGroups); + eraseFunction(m_deferredRenderGroups); + + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(tiles), + MessagePriority::Normal); + + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(screen, move(tiles)), + MessagePriority::Normal); + } + break; + } + + case Message::ClearUserMarkLayer: + { + TileKey const & tileKey = ref_ptr(message)->GetKey(); + auto const functor = [&tileKey](drape_ptr const & g) + { + return g->GetTileKey() == tileKey; + }; + + auto const iter = remove_if(m_userMarkRenderGroups.begin(), + m_userMarkRenderGroups.end(), + functor); + + m_userMarkRenderGroups.erase(iter, m_userMarkRenderGroups.end()); + break; + } + + case Message::ChangeUserMarkLayerVisibility: + { + ref_ptr m = message; + TileKey const & key = m->GetKey(); + if (m->IsVisible()) + m_userMarkVisibility.insert(key); + else + m_userMarkVisibility.erase(key); + break; + } + + case Message::GuiLayerRecached: + { + ref_ptr msg = message; + drape_ptr renderer = move(msg->AcceptRenderer()); + renderer->Build(make_ref(m_gpuProgramManager)); + if (m_guiRenderer == nullptr) + m_guiRenderer = move(renderer); + else + m_guiRenderer->Merge(make_ref(renderer)); + break; + } + + case Message::GuiLayerLayout: + { + ASSERT(m_guiRenderer != nullptr, ()); + m_guiRenderer->SetLayout(ref_ptr(message)->GetLayoutInfo()); + break; + } + + case Message::StopRendering: + { + ProcessStopRenderingMessage(); + break; + } + + case Message::MyPositionShape: + { + ref_ptr msg = message; + m_myPositionController->SetRenderShape(msg->AcceptShape()); + m_selectionShape = msg->AcceptSelection(); + } + break; + + case Message::ChangeMyPostitionMode: + { + ref_ptr msg = message; + switch (msg->GetChangeType()) + { + case ChangeMyPositionModeMessage::TYPE_NEXT: + m_myPositionController->NextMode(msg->GetPreferredZoomLevel()); + break; + case ChangeMyPositionModeMessage::TYPE_STOP_FOLLOW: + m_myPositionController->StopLocationFollow(); + break; + case ChangeMyPositionModeMessage::TYPE_INVALIDATE: + m_myPositionController->Invalidate(); + break; + case ChangeMyPositionModeMessage::TYPE_CANCEL: + m_myPositionController->TurnOff(); + break; + default: + ASSERT(false, ("Unknown change type:", static_cast(msg->GetChangeType()))); + break; + } + break; + } + + case Message::CompassInfo: + { + ref_ptr msg = message; + m_myPositionController->OnCompassUpdate(msg->GetInfo(), m_userEventStream.GetCurrentScreen()); + break; + } + + case Message::GpsInfo: + { + ref_ptr msg = message; + m_myPositionController->OnLocationUpdate(msg->GetInfo(), msg->IsNavigable(), + m_userEventStream.GetCurrentScreen()); + + location::RouteMatchingInfo const & info = msg->GetRouteInfo(); + if (info.HasDistanceFromBegin()) + m_routeRenderer->UpdateDistanceFromBegin(info.GetDistanceFromBegin()); + + break; + } + + case Message::FindVisiblePOI: + { + ref_ptr msg = message; + msg->SetFeatureID(GetVisiblePOI(m_userEventStream.GetCurrentScreen().GtoP(msg->GetPoint()))); + break; + } + + case Message::SelectObject: + { + ref_ptr msg = message; + + if (msg->IsDismiss()) + { + // m_selectionShape can be null in case of deselection + if (m_selectionShape != nullptr) + m_selectionShape->Hide(); + } + else + { + ASSERT(m_selectionShape != nullptr, ()); + m_selectionShape->Show(msg->GetSelectedObject(), msg->GetPosition(), msg->IsAnim()); + } + break; + } + + case Message::GetSelectedObject: + { + ref_ptr msg = message; + if (m_selectionShape != nullptr) + msg->SetSelectedObject(m_selectionShape->GetSelectedObject()); + else + msg->SetSelectedObject(SelectionShape::OBJECT_EMPTY); + break; + } + + case Message::GetMyPosition: + { + ref_ptr msg = message; + msg->SetMyPosition(m_myPositionController->IsModeHasPosition(), m_myPositionController->Position()); + break; + } + + case Message::FlushRoute: + { + ref_ptr msg = message; + drape_ptr routeData = msg->AcceptRouteData(); + m2::PointD const startPoint = routeData->m_sourcePolyline.Front(); + m2::PointD const finishPoint = routeData->m_sourcePolyline.Back(); + m_routeRenderer->SetRouteData(move(routeData), make_ref(m_gpuProgramManager)); + if (!m_routeRenderer->GetStartPoint()) + { + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(startPoint, true /* isStart */, + true /* isValid */), + MessagePriority::High); + } + if (!m_routeRenderer->GetFinishPoint()) + { + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(finishPoint, false /* isStart */, + true /* isValid */), + MessagePriority::High); + } + + m_myPositionController->ActivateRouting(); + break; + } + + case Message::FlushRouteSign: + { + ref_ptr msg = message; + drape_ptr routeSignData = msg->AcceptRouteSignData(); + m_routeRenderer->SetRouteSign(move(routeSignData), make_ref(m_gpuProgramManager)); + break; + } + + case Message::RemoveRoute: + { + ref_ptr msg = message; + m_routeRenderer->Clear(); + if (msg->NeedDeactivateFollowing()) + m_myPositionController->DeactivateRouting(); + break; + } + + case Message::DeactivateRouteFollowing: + { + m_myPositionController->DeactivateRouting(); + break; + } + + case Message::UpdateMapStyle: + { + // Clear tile tree. + m_tileTree->Invalidate(); + + // Get new tiles. + TTilesCollection tiles; + ScreenBase screen = m_userEventStream.GetCurrentScreen(); + ResolveTileKeys(screen.ClipRect(), tiles); + + // Clear all graphics. + m_renderGroups.clear(); + m_deferredRenderGroups.clear(); + + // Invalidate read manager. + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(tiles), + MessagePriority::Normal); + + // Invalidate textures and wait for completion. + BaseBlockingMessage::Blocker blocker; + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(blocker), + MessagePriority::Normal); + blocker.Wait(); + + // Invalidate route. + if (m_routeRenderer->GetStartPoint()) + { + m2::PointD const & position = m_routeRenderer->GetStartPoint()->m_position; + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(position, true /* isStart */, + true /* isValid */), + MessagePriority::High); + } + if (m_routeRenderer->GetFinishPoint()) + { + m2::PointD const & position = m_routeRenderer->GetFinishPoint()->m_position; + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(position, false /* isStart */, + true /* isValid */), + MessagePriority::High); + } + + auto const & routeData = m_routeRenderer->GetRouteData(); + if (routeData != nullptr) + { + auto recacheRouteMsg = make_unique_dp(routeData->m_sourcePolyline, + routeData->m_sourceTurns, + routeData->m_color); + m_routeRenderer->Clear(true /* keepDistanceFromBegin */); + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, move(recacheRouteMsg), + MessagePriority::Normal); + } + + // Request new tiles. + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(screen, move(tiles)), + MessagePriority::Normal); + + RefreshBgColor(); + + break; + } + + case Message::Invalidate: + { + // Do nothing here, new frame will be rendered because of this message processing. break; } @@ -154,26 +442,162 @@ void FrontendRenderer::AcceptMessage(dp::RefPointer message) } } -void FrontendRenderer::RenderScene() +unique_ptr FrontendRenderer::CreateRoutine() +{ + return make_unique(*this); +} + +void FrontendRenderer::OnResize(ScreenBase const & screen) +{ + m_viewport.SetViewport(0, 0, screen.GetWidth(), screen.GetHeight()); + m_myPositionController->SetPixelRect(screen.PixelRect()); + m_contextFactory->getDrawContext()->resize(m_viewport.GetWidth(), m_viewport.GetHeight()); + RefreshProjection(); +} + +void FrontendRenderer::AddToRenderGroup(vector> & groups, + dp::GLState const & state, + drape_ptr && renderBucket, + TileKey const & newTile) +{ + drape_ptr group = make_unique_dp(state, newTile); + ref_ptr program = m_gpuProgramManager->GetProgram(state.GetProgramIndex()); + group->SetRenderParams(program, make_ref(&m_generalUniforms)); + group->AddBucket(move(renderBucket)); + groups.push_back(move(group)); +} + +void FrontendRenderer::OnAddRenderGroup(TileKey const & tileKey, dp::GLState const & state, + drape_ptr && renderBucket) +{ + AddToRenderGroup(m_renderGroups, state, move(renderBucket), tileKey); + m_renderGroups.back()->Appear(); +} + +void FrontendRenderer::OnDeferRenderGroup(TileKey const & tileKey, dp::GLState const & state, + drape_ptr && renderBucket) +{ + AddToRenderGroup(m_deferredRenderGroups, state, move(renderBucket), tileKey); +} + +void FrontendRenderer::OnActivateTile(TileKey const & tileKey) +{ + for(auto it = m_deferredRenderGroups.begin(); it != m_deferredRenderGroups.end();) + { + if ((*it)->GetTileKey() == tileKey) + { + m_renderGroups.push_back(move(*it)); + it = m_deferredRenderGroups.erase(it); + m_renderGroups.back()->Appear(); + } + else + { + ++it; + } + } +} + +void FrontendRenderer::OnRemoveTile(TileKey const & tileKey) +{ + m_overlayTree->ForceUpdate(); + for(auto const & group : m_renderGroups) + { + if (group->GetTileKey() == tileKey) + { + group->DeleteLater(); + group->Disappear(); + } + } + + auto removePredicate = [&tileKey](drape_ptr const & group) + { + return group->GetTileKey() == tileKey; + }; + m_deferredRenderGroups.erase(remove_if(m_deferredRenderGroups.begin(), + m_deferredRenderGroups.end(), + removePredicate), + m_deferredRenderGroups.end()); +} + +void FrontendRenderer::OnCompassTapped() +{ + m_myPositionController->StopCompassFollow(); + m_userEventStream.AddEvent(RotateEvent(0.0)); +} + +FeatureID FrontendRenderer::GetVisiblePOI(m2::PointD const & pixelPoint) const +{ + double halfSize = VisualParams::Instance().GetTouchRectRadius(); + m2::PointD sizePoint(halfSize, halfSize); + m2::RectD selectRect(pixelPoint - sizePoint, pixelPoint + sizePoint); + return GetVisiblePOI(selectRect); +} + +FeatureID FrontendRenderer::GetVisiblePOI(m2::RectD const & pixelRect) const +{ + m2::PointD pt = pixelRect.Center(); + dp::OverlayTree::TSelectResult selectResult; + m_overlayTree->Select(pixelRect, selectResult); + + double dist = numeric_limits::max(); + FeatureID featureID; + + ScreenBase const & screen = m_userEventStream.GetCurrentScreen(); + for (ref_ptr handle : selectResult) + { + double const curDist = pt.SquareLength(handle->GetPivot(screen)); + if (curDist < dist) + { + dist = curDist; + featureID = handle->GetFeatureID(); + } + } + + return featureID; +} + +void FrontendRenderer::BeginUpdateOverlayTree(ScreenBase const & modelView) +{ + m_overlayTree->Frame(); + + if (m_overlayTree->IsNeedUpdate()) + m_overlayTree->StartOverlayPlacing(modelView); +} + +void FrontendRenderer::UpdateOverlayTree(ScreenBase const & modelView, drape_ptr & renderGroup) +{ + if (m_overlayTree->IsNeedUpdate()) + renderGroup->CollectOverlay(make_ref(m_overlayTree)); + else + renderGroup->Update(modelView); +} + +void FrontendRenderer::EndUpdateOverlayTree() +{ + if (m_overlayTree->IsNeedUpdate()) + m_overlayTree->EndOverlayPlacing(); +} + +void FrontendRenderer::RenderScene(ScreenBase const & modelView) { #ifdef DRAW_INFO BeforeDrawFrame(); #endif - RenderBucketComparator comparator(GetTileKeyStorage()); - sort(m_renderGroups.begin(), m_renderGroups.end(), bind(&RenderBucketComparator::operator (), &comparator, _1, _2)); + RenderGroupComparator comparator; + sort(m_renderGroups.begin(), m_renderGroups.end(), bind(&RenderGroupComparator::operator (), &comparator, _1, _2)); - m_overlayTree.StartOverlayPlacing(m_view); + BeginUpdateOverlayTree(modelView); size_t eraseCount = 0; for (size_t i = 0; i < m_renderGroups.size(); ++i) { - RenderGroup * group = m_renderGroups[i]; + drape_ptr & group = m_renderGroups[i]; if (group->IsEmpty()) continue; if (group->IsPendingOnDelete()) { - delete group; + group.reset(); ++eraseCount; continue; } @@ -181,64 +605,106 @@ void FrontendRenderer::RenderScene() switch (group->GetState().GetDepthLayer()) { case dp::GLState::OverlayLayer: - group->CollectOverlay(dp::MakeStackRefPointer(&m_overlayTree)); + UpdateOverlayTree(modelView, group); break; case dp::GLState::DynamicGeometry: - group->Update(m_view); + group->Update(modelView); break; default: break; } } - m_overlayTree.EndOverlayPlacing(); + EndUpdateOverlayTree(); m_renderGroups.resize(m_renderGroups.size() - eraseCount); m_viewport.Apply(); - GLFunctions::glEnable(gl_const::GLDepthTest); - - GLFunctions::glClearColor(0.93f, 0.93f, 0.86f, 1.f); - GLFunctions::glClearDepthValue(1.0); - GLFunctions::glDepthFunc(gl_const::GLLessOrEqual); - GLFunctions::glDepthMask(true); - GLFunctions::glClear(); dp::GLState::DepthLayer prevLayer = dp::GLState::GeometryLayer; - for (size_t i = 0; i < m_renderGroups.size(); ++i) + size_t currentRenderGroup = 0; + for (; currentRenderGroup < m_renderGroups.size(); ++currentRenderGroup) { - RenderGroup * group = m_renderGroups[i]; + drape_ptr const & group = m_renderGroups[currentRenderGroup]; + dp::GLState const & state = group->GetState(); dp::GLState::DepthLayer layer = state.GetDepthLayer(); if (prevLayer != layer && layer == dp::GLState::OverlayLayer) - GLFunctions::glClearDepth(); + break; prevLayer = layer; - ASSERT_LESS_OR_EQUAL(prevLayer, layer, ()); - - dp::RefPointer program = m_gpuProgramManager->GetProgram(state.GetProgramIndex()); - program->Bind(); - ApplyUniforms(m_generalUniforms, program); - ApplyState(state, program); - - group->Render(m_view); + RenderSingleGroup(modelView, make_ref(group)); } + GLFunctions::glClearDepth(); + if (m_selectionShape != nullptr) + { + SelectionShape::ESelectedObject selectedObject = m_selectionShape->GetSelectedObject(); + if (selectedObject == SelectionShape::OBJECT_MY_POSITION) + { + ASSERT(m_myPositionController->IsModeHasPosition(), ()); + m_selectionShape->SetPosition(m_myPositionController->Position()); + m_selectionShape->Render(modelView, make_ref(m_gpuProgramManager), m_generalUniforms); + } + else if (selectedObject == SelectionShape::OBJECT_POI) + m_selectionShape->Render(modelView, make_ref(m_gpuProgramManager), m_generalUniforms); + } + + m_myPositionController->Render(MyPositionController::RenderAccuracy, + modelView, make_ref(m_gpuProgramManager), m_generalUniforms); + + for (; currentRenderGroup < m_renderGroups.size(); ++currentRenderGroup) + { + drape_ptr const & group = m_renderGroups[currentRenderGroup]; + RenderSingleGroup(modelView, make_ref(group)); + } + + GLFunctions::glClearDepth(); + if (m_selectionShape != nullptr && m_selectionShape->GetSelectedObject() == SelectionShape::OBJECT_USER_MARK) + m_selectionShape->Render(modelView, make_ref(m_gpuProgramManager), m_generalUniforms); + + GLFunctions::glDisable(gl_const::GLDepthTest); + + m_routeRenderer->RenderRoute(modelView, make_ref(m_gpuProgramManager), m_generalUniforms); + + for (drape_ptr const & group : m_userMarkRenderGroups) + { + ASSERT(group.get() != nullptr, ()); + if (m_userMarkVisibility.find(group->GetTileKey()) != m_userMarkVisibility.end()) + RenderSingleGroup(modelView, make_ref(group)); + } + + m_routeRenderer->RenderRouteSigns(modelView, make_ref(m_gpuProgramManager), m_generalUniforms); + + m_myPositionController->Render(MyPositionController::RenderMyPosition, + modelView, make_ref(m_gpuProgramManager), m_generalUniforms); + + if (m_guiRenderer != nullptr) + m_guiRenderer->Render(make_ref(m_gpuProgramManager), modelView); + + GLFunctions::glEnable(gl_const::GLDepthTest); + #ifdef DRAW_INFO AfterDrawFrame(); #endif } -void FrontendRenderer::RefreshProjection() +void FrontendRenderer::RenderSingleGroup(ScreenBase const & modelView, ref_ptr group) { - float m[4*4]; - - OrthoMatrix(m, 0.0f, m_viewport.GetWidth(), m_viewport.GetHeight(), 0.0f, -20000.0f, 20000.0f); - m_generalUniforms.SetMatrix4x4Value("projection", m); + group->UpdateAnimation(); + group->Render(modelView); } -void FrontendRenderer::RefreshModelView() +void FrontendRenderer::RefreshProjection() { - ScreenBase::MatrixT const & m = m_view.GtoPMatrix(); + array m; + + dp::MakeProjection(m, 0.0f, m_viewport.GetWidth(), m_viewport.GetHeight(), 0.0f); + m_generalUniforms.SetMatrix4x4Value("projection", m.data()); +} + +void FrontendRenderer::RefreshModelView(ScreenBase const & screen) +{ + ScreenBase::MatrixT const & m = screen.GtoPMatrix(); math::Matrix mv; /// preparing ModelView matrix @@ -251,114 +717,332 @@ void FrontendRenderer::RefreshModelView() m_generalUniforms.SetMatrix4x4Value("modelView", mv.m_data); } -void FrontendRenderer::ResolveTileKeys() +void FrontendRenderer::RefreshBgColor() { - ResolveTileKeys(GetTileKeyStorage(), df::GetTileScaleBase(m_view)); + uint32_t color = drule::rules().GetBgColor(df::GetDrawTileScale(m_userEventStream.GetCurrentScreen())); + dp::Color c = dp::Extract(color, 255 - (color >> 24)); + GLFunctions::glClearColor(c.GetRedF(), c.GetGreenF(), c.GetBlueF(), 1.0f); } -void FrontendRenderer::ResolveTileKeys(set & keyStorage, m2::RectD const & rect) +int FrontendRenderer::GetCurrentZoomLevel() const { - ResolveTileKeys(keyStorage, df::GetTileScaleBase(rect)); + return m_currentZoomLevel; } -void FrontendRenderer::ResolveTileKeys(set & keyStorage, int tileScale) +void FrontendRenderer::ResolveZoomLevel(ScreenBase const & screen) +{ + m_currentZoomLevel = GetDrawTileScale(screen); +} + +void FrontendRenderer::OnTap(m2::PointD const & pt, bool isLongTap) +{ + double halfSize = VisualParams::Instance().GetTouchRectRadius(); + m2::PointD sizePoint(halfSize, halfSize); + m2::RectD selectRect(pt - sizePoint, pt + sizePoint); + + ScreenBase const & screen = m_userEventStream.GetCurrentScreen(); + bool isMyPosition = false; + if (m_myPositionController->IsModeHasPosition()) + isMyPosition = selectRect.IsPointInside(screen.GtoP(m_myPositionController->Position())); + + m_tapEventInfoFn(pt, isLongTap, isMyPosition, GetVisiblePOI(selectRect)); +} + +void FrontendRenderer::OnDoubleTap(m2::PointD const & pt) +{ + m_userEventStream.AddEvent(ScaleEvent(2.0 /* scale factor */, pt, true /* animated */)); +} + +void FrontendRenderer::OnTwoFingersTap() +{ + ScreenBase const & screen = m_userEventStream.GetCurrentScreen(); + m_userEventStream.AddEvent(ScaleEvent(0.5 /* scale factor */, screen.PixelRect().Center(), true /* animated */)); +} + +bool FrontendRenderer::OnSingleTouchFiltrate(m2::PointD const & pt, TouchEvent::ETouchType type) +{ + float const rectHalfSize = df::VisualParams::Instance().GetTouchRectRadius(); + m2::RectD r(-rectHalfSize, -rectHalfSize, rectHalfSize, rectHalfSize); + r.SetCenter(pt); + + switch(type) + { + case TouchEvent::ETouchType::TOUCH_DOWN: + return m_guiRenderer->OnTouchDown(r); + case TouchEvent::ETouchType::TOUCH_UP: + m_guiRenderer->OnTouchUp(r); + return false; + case TouchEvent::ETouchType::TOUCH_CANCEL: + m_guiRenderer->OnTouchCancel(r); + return false; + case TouchEvent::ETouchType::TOUCH_MOVE: + return false; + } + + return false; +} + +void FrontendRenderer::OnDragStarted() +{ + m_myPositionController->DragStarted(); +} + +void FrontendRenderer::OnDragEnded(m2::PointD const & distance) +{ + m_myPositionController->DragEnded(distance); +} + +void FrontendRenderer::OnScaleStarted() +{ + m_myPositionController->ScaleStarted(); +} + +void FrontendRenderer::OnRotated() +{ + m_myPositionController->Rotated(); +} + +void FrontendRenderer::CorrectScalePoint(m2::PointD & pt) const +{ + m_myPositionController->CorrectScalePoint(pt); +} + +void FrontendRenderer::CorrectGlobalScalePoint(m2::PointD & pt) const +{ + m_myPositionController->CorrectGlobalScalePoint(pt); +} + +void FrontendRenderer::CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const +{ + m_myPositionController->CorrectScalePoint(pt1, pt2); +} + +void FrontendRenderer::OnScaleEnded() +{ + m_myPositionController->ScaleEnded(); +} + +void FrontendRenderer::ResolveTileKeys(ScreenBase const & screen, TTilesCollection & tiles) +{ + m2::RectD const & clipRect = screen.ClipRect(); + ResolveTileKeys(clipRect, tiles); +} + +void FrontendRenderer::ResolveTileKeys(m2::RectD const & rect, TTilesCollection & tiles) { // equal for x and y + int const tileScale = GetCurrentZoomLevel(); double const range = MercatorBounds::maxX - MercatorBounds::minX; double const rectSize = range / (1 << tileScale); - m2::RectD const & clipRect = m_view.ClipRect(); + int const minTileX = static_cast(floor(rect.minX() / rectSize)); + int const maxTileX = static_cast(ceil(rect.maxX() / rectSize)); + int const minTileY = static_cast(floor(rect.minY() / rectSize)); + int const maxTileY = static_cast(ceil(rect.maxY() / rectSize)); - int const minTileX = static_cast(floor(clipRect.minX() / rectSize)); - int const maxTileX = static_cast(ceil(clipRect.maxX() / rectSize)); - int const minTileY = static_cast(floor(clipRect.minY() / rectSize)); - int const maxTileY = static_cast(ceil(clipRect.maxY() / rectSize)); - - keyStorage.clear(); + // request new tiles + m_tileTree->BeginRequesting(tileScale, rect); for (int tileY = minTileY; tileY < maxTileY; ++tileY) { for (int tileX = minTileX; tileX < maxTileX; ++tileX) { TileKey key(tileX, tileY, tileScale); - if (clipRect.IsIntersect(key.GetGlobalRect())) - keyStorage.insert(key); + if (rect.IsIntersect(key.GetGlobalRect())) + { + tiles.insert(key); + m_tileTree->RequestTile(key); + } } } -} - -void FrontendRenderer::InvalidateRenderGroups(set & keyStorage) -{ - for (size_t i = 0; i < m_renderGroups.size(); ++i) - { - RenderGroup * group = m_renderGroups[i]; - if (keyStorage.find(group->GetTileKey()) != keyStorage.end()) - group->DeleteLater(); - } -} - -set & FrontendRenderer::GetTileKeyStorage() -{ - return m_tiles; -} - -void FrontendRenderer::StartThread() -{ - m_selfThread.Create(make_unique(*this)); -} - -void FrontendRenderer::StopThread() -{ - m_selfThread.GetRoutine()->Cancel(); - CloseQueue(); - m_selfThread.Join(); + m_tileTree->EndRequesting(); } FrontendRenderer::Routine::Routine(FrontendRenderer & renderer) : m_renderer(renderer) {} void FrontendRenderer::Routine::Do() { + gui::DrapeGui::Instance().ConnectOnCompassTappedHandler(bind(&FrontendRenderer::OnCompassTapped, &m_renderer)); + m_renderer.m_myPositionController->SetListener(ref_ptr(&m_renderer)); + m_renderer.m_userEventStream.SetListener(ref_ptr(&m_renderer)); + + m_renderer.m_tileTree->SetHandlers(bind(&FrontendRenderer::OnAddRenderGroup, &m_renderer, _1, _2, _3), + bind(&FrontendRenderer::OnDeferRenderGroup, &m_renderer, _1, _2, _3), + bind(&FrontendRenderer::OnActivateTile, &m_renderer, _1), + bind(&FrontendRenderer::OnRemoveTile, &m_renderer, _1)); + dp::OGLContext * context = m_renderer.m_contextFactory->getDrawContext(); context->makeCurrent(); + GLFunctions::Init(); + GLFunctions::AttachCache(this_thread::get_id()); + + GLFunctions::glPixelStore(gl_const::GLUnpackAlignment, 1); + GLFunctions::glEnable(gl_const::GLDepthTest); + + m_renderer.RefreshBgColor(); + + GLFunctions::glClearDepthValue(1.0); + GLFunctions::glDepthFunc(gl_const::GLLessOrEqual); + GLFunctions::glDepthMask(true); + + GLFunctions::glFrontFace(gl_const::GLClockwise); + GLFunctions::glCullFace(gl_const::GLBack); + GLFunctions::glEnable(gl_const::GLCullFace); + + dp::BlendingParams blendingParams; + blendingParams.Apply(); + +#ifdef RENDER_DEBUG_RECTS + dp::DebugRectRenderer::Instance().Init(make_ref(m_renderer.m_gpuProgramManager)); +#endif + + double const kMaxInactiveSeconds = 2.0; my::Timer timer; - //double processingTime = InitAvarageTimePerMessage; // By init we think that one message processed by 1ms + my::Timer activityTimer; + + double frameTime = 0.0; + bool modelViewChanged = true; + bool viewportChanged = true; - timer.Reset(); while (!IsCancelled()) { + ScreenBase modelView = m_renderer.ProcessEvents(modelViewChanged, viewportChanged); + if (viewportChanged) + m_renderer.OnResize(modelView); + context->setDefaultFramebuffer(); - m_renderer.RenderScene(); - double availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/); + if (modelViewChanged || viewportChanged) + m_renderer.PrepareScene(modelView); - if (availableTime < 0.0) - availableTime = 0.01; + // Check for a frame is active. + bool isActiveFrame = modelViewChanged || viewportChanged; - while (availableTime > 0) + isActiveFrame |= m_renderer.m_texMng->UpdateDynamicTextures(); + m_renderer.RenderScene(modelView); + + isActiveFrame |= InterpolationHolder::Instance().Advance(frameTime); + + if (modelViewChanged) { - m_renderer.ProcessSingleMessage(availableTime * 1000.0); - availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/); - //messageCount++; + m_renderer.UpdateScene(modelView); + m_renderer.EmitModelViewChanged(modelView); } - //processingTime = (timer.ElapsedSeconds() - processingTime) / messageCount; + isActiveFrame |= m_renderer.m_userEventStream.IsWaitingForActionCompletion(); + + if (isActiveFrame) + activityTimer.Reset(); + + if (activityTimer.ElapsedSeconds() > kMaxInactiveSeconds) + { + // Process a message or wait for a message. + m_renderer.ProcessSingleMessage(); + activityTimer.Reset(); + } + else + { + double availableTime = VSyncInterval - timer.ElapsedSeconds(); + do + { + if (!m_renderer.ProcessSingleMessage(false /* waitForMessage */)) + break; + + activityTimer.Reset(); + availableTime = VSyncInterval - timer.ElapsedSeconds(); + } + while (availableTime > 0); + } context->present(); + frameTime = timer.ElapsedSeconds(); timer.Reset(); + + m_renderer.CheckRenderingEnabled(); } +#ifdef RENDER_DEBUG_RECTS + dp::DebugRectRenderer::Instance().Destroy(); +#endif + m_renderer.ReleaseResources(); } void FrontendRenderer::ReleaseResources() { - DeleteRenderData(); - m_gpuProgramManager.Destroy(); + m_tileTree.reset(); + m_renderGroups.clear(); + m_deferredRenderGroups.clear(); + m_userMarkRenderGroups.clear(); + m_guiRenderer.reset(); + m_myPositionController.reset(); + m_selectionShape.release(); + m_routeRenderer.reset(); + + m_gpuProgramManager.reset(); + m_contextFactory->getDrawContext()->doneCurrent(); } -void FrontendRenderer::DeleteRenderData() +void FrontendRenderer::AddUserEvent(UserEvent const & event) { - (void)GetRangeDeletor(m_renderGroups, DeleteFunctor())(); + m_userEventStream.AddEvent(event); + if (IsInInfinityWaiting()) + CancelMessageWaiting(); +} + +void FrontendRenderer::PositionChanged(m2::PointD const & position) +{ + m_userPositionChangedFn(position); +} + +void FrontendRenderer::ChangeModelView(m2::PointD const & center) +{ + AddUserEvent(SetCenterEvent(center, -1, true)); +} + +void FrontendRenderer::ChangeModelView(double azimuth) +{ + AddUserEvent(RotateEvent(azimuth)); +} + +void FrontendRenderer::ChangeModelView(m2::RectD const & rect) +{ + AddUserEvent(SetRectEvent(rect, true, scales::GetUpperComfortScale(), true)); +} + +void FrontendRenderer::ChangeModelView(m2::PointD const & userPos, double azimuth, + m2::PointD const & pxZero, int preferredZoomLevel) +{ + AddUserEvent(FollowAndRotateEvent(userPos, pxZero, azimuth, preferredZoomLevel, true)); +} + +ScreenBase const & FrontendRenderer::ProcessEvents(bool & modelViewChanged, bool & viewportChanged) +{ + ScreenBase const & modelView = m_userEventStream.ProcessEvents(modelViewChanged, viewportChanged); + gui::DrapeGui::Instance().SetInUserAction(m_userEventStream.IsInUserAction()); + return modelView; +} + +void FrontendRenderer::PrepareScene(ScreenBase const & modelView) +{ + RefreshModelView(modelView); + RefreshBgColor(); +} + +void FrontendRenderer::UpdateScene(ScreenBase const & modelView) +{ + ResolveZoomLevel(modelView); + TTilesCollection tiles; + ResolveTileKeys(modelView, tiles); + + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(modelView, move(tiles)), + MessagePriority::High); +} + +void FrontendRenderer::EmitModelViewChanged(ScreenBase const & modelView) const +{ + m_modelViewChangedFn(modelView); } } // namespace df diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp old mode 100644 new mode 100755 index 3ee45192a4..45f6cbb7eb --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -3,42 +3,100 @@ #include "base/thread.hpp" #ifdef DRAW_INFO - #include "../base/timer.hpp" - #include "../std/vector.hpp" - #include "../std/numeric.hpp" + #include "base/timer.hpp" + #include "std/vector.hpp" + #include "std/numeric.hpp" #endif -#include "drape_frontend/message_acceptor.hpp" +#include "drape_frontend/gui/layer_render.hpp" + +#include "drape_frontend/backend_renderer.hpp" +#include "drape_frontend/base_renderer.hpp" +#include "drape_frontend/my_position_controller.hpp" +#include "drape_frontend/navigator.hpp" +#include "drape_frontend/render_group.hpp" +#include "drape_frontend/route_renderer.hpp" #include "drape_frontend/threads_commutator.hpp" #include "drape_frontend/tile_info.hpp" -#include "drape_frontend/backend_renderer.hpp" -#include "drape_frontend/render_group.hpp" +#include "drape_frontend/tile_tree.hpp" +#include "drape_frontend/user_event_stream.hpp" #include "drape/pointers.hpp" #include "drape/glstate.hpp" #include "drape/vertex_array_buffer.hpp" #include "drape/gpu_program_manager.hpp" -#include "drape/oglcontextfactory.hpp" #include "drape/overlay_tree.hpp" - #include "drape/uniform_values_storage.hpp" +#include "platform/location.hpp" + #include "geometry/screenbase.hpp" +#include "std/function.hpp" #include "std/map.hpp" -namespace dp { class RenderBucket; } +namespace dp +{ + class RenderBucket; + class OverlayTree; +} namespace df { -class FrontendRenderer : public MessageAcceptor +class SelectionShape; + +struct TapInfo +{ + m2::PointD const m_pixelPoint; + bool m_isLong; + + bool m_isMyPositionTapped; + FeatureID m_featureTapped; +}; + +class FrontendRenderer : public BaseRenderer + , public MyPositionController::Listener + , public UserEventStream::Listener { public: - FrontendRenderer(dp::RefPointer commutator, - dp::RefPointer oglcontextfactory, - Viewport viewport); + using TModelViewChanged = function; + using TIsCountryLoaded = TIsCountryLoaded; + using TTapEventInfoFn = function; + using TUserPositionChangedFn = function; + struct Params : BaseRenderer::Params + { + Params(ref_ptr commutator, + ref_ptr factory, + ref_ptr texMng, + Viewport viewport, + TModelViewChanged const & modelViewChangedFn, + TIsCountryLoaded const & isCountryLoaded, + TTapEventInfoFn const & tapEventFn, + TUserPositionChangedFn const & positionChangedFn, + location::TMyPositionModeChanged myPositionModeCallback, + location::EMyPositionMode initMode) + : BaseRenderer::Params(commutator, factory, texMng) + , m_viewport(viewport) + , m_modelViewChangedFn(modelViewChangedFn) + , m_isCountryLoadedFn(isCountryLoaded) + , m_tapEventFn(tapEventFn) + , m_positionChangedFn(positionChangedFn) + , m_myPositionModeCallback(myPositionModeCallback) + , m_initMyPositionMode(initMode) + {} + + Viewport m_viewport; + TModelViewChanged m_modelViewChangedFn; + TIsCountryLoaded m_isCountryLoadedFn; + TTapEventInfoFn m_tapEventFn; + TUserPositionChangedFn m_positionChangedFn; + location::TMyPositionModeChanged m_myPositionModeCallback; + location::EMyPositionMode m_initMyPositionMode; + }; + + FrontendRenderer(Params const & params); ~FrontendRenderer() override; #ifdef DRAW_INFO @@ -54,22 +112,53 @@ public: void AfterDrawFrame(); #endif + void AddUserEvent(UserEvent const & event); + + /// MyPositionController::Listener + void PositionChanged(m2::PointD const & position) override; + void ChangeModelView(m2::PointD const & center) override; + void ChangeModelView(double azimuth) override; + void ChangeModelView(m2::RectD const & rect) override; + void ChangeModelView(m2::PointD const & userPos, double azimuth, + m2::PointD const & pxZero, int preferredZoomLevel) override; + protected: - virtual void AcceptMessage(dp::RefPointer message); + void AcceptMessage(ref_ptr message) override; + unique_ptr CreateRoutine() override; private: - void RenderScene(); + void OnResize(ScreenBase const & screen); + void RenderScene(ScreenBase const & modelView); + void RenderSingleGroup(ScreenBase const & modelView, ref_ptr group); void RefreshProjection(); - void RefreshModelView(); + void RefreshModelView(ScreenBase const & screen); + void RefreshBgColor(); - void ResolveTileKeys(); - void ResolveTileKeys(set & keyStorage, m2::RectD const & rect); - void ResolveTileKeys(set & keyStorage, int tileScale); - set & GetTileKeyStorage(); + ScreenBase const & ProcessEvents(bool & modelViewChanged, bool & viewportChanged); + void PrepareScene(ScreenBase const & modelView); + void UpdateScene(ScreenBase const & modelView); - void InvalidateRenderGroups(set & keyStorage); + void EmitModelViewChanged(ScreenBase const & modelView) const; + + void ResolveTileKeys(ScreenBase const & screen, TTilesCollection & tiles); + void ResolveTileKeys(m2::RectD const & rect, TTilesCollection & tiles); + int GetCurrentZoomLevel() const; + void ResolveZoomLevel(ScreenBase const & screen); + + void OnTap(m2::PointD const & pt, bool isLong) override; + void OnDoubleTap(m2::PointD const & pt) override; + void OnTwoFingersTap() override; + bool OnSingleTouchFiltrate(m2::PointD const & pt, TouchEvent::ETouchType type) override; + void OnDragStarted() override; + void OnDragEnded(m2::PointD const & distance) override; + + void OnScaleStarted() override; + void OnRotated() override; + void CorrectScalePoint(m2::PointD & pt) const override; + void CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const override; + void CorrectGlobalScalePoint(m2::PointD & pt) const override; + void OnScaleEnded() override; -private: class Routine : public threads::IRoutine { public: @@ -82,29 +171,54 @@ private: FrontendRenderer & m_renderer; }; - void StartThread(); - void StopThread(); void ReleaseResources(); -private: - void DeleteRenderData(); + void BeginUpdateOverlayTree(ScreenBase const & modelView); + void UpdateOverlayTree(ScreenBase const & modelView, drape_ptr & renderGroup); + void EndUpdateOverlayTree(); + + void AddToRenderGroup(vector> & groups, + dp::GLState const & state, + drape_ptr && renderBucket, + TileKey const & newTile); + void OnAddRenderGroup(TileKey const & tileKey, dp::GLState const & state, + drape_ptr && renderBucket); + void OnDeferRenderGroup(TileKey const & tileKey, dp::GLState const & state, + drape_ptr && renderBucket); + + void OnActivateTile(TileKey const & tileKey); + void OnRemoveTile(TileKey const & tileKey); + + void OnCompassTapped(); + + FeatureID GetVisiblePOI(m2::PointD const & pixelPoint) const; + FeatureID GetVisiblePOI(m2::RectD const & pixelRect) const; private: - dp::RefPointer m_commutator; - dp::RefPointer m_contextFactory; - dp::MasterPointer m_gpuProgramManager; - threads::Thread m_selfThread; + drape_ptr m_gpuProgramManager; -private: - vector m_renderGroups; + vector> m_renderGroups; + vector> m_deferredRenderGroups; + vector> m_userMarkRenderGroups; + set m_userMarkVisibility; + + drape_ptr m_guiRenderer; + drape_ptr m_myPositionController; + drape_ptr m_selectionShape; + drape_ptr m_routeRenderer; + + drape_ptr m_overlayTree; dp::UniformValuesStorage m_generalUniforms; Viewport m_viewport; - ScreenBase m_view; - set m_tiles; + UserEventStream m_userEventStream; + TModelViewChanged m_modelViewChangedFn; + TTapEventInfoFn m_tapEventInfoFn; + TUserPositionChangedFn m_userPositionChangedFn; - dp::OverlayTree m_overlayTree; + unique_ptr m_tileTree; + int m_currentZoomLevel = -1; }; } // namespace df diff --git a/drape_frontend/gui/button.cpp b/drape_frontend/gui/button.cpp new file mode 100644 index 0000000000..9c867ff090 --- /dev/null +++ b/drape_frontend/gui/button.cpp @@ -0,0 +1,212 @@ +#include "button.hpp" +#include "gui_text.hpp" + +#include "drape/batcher.hpp" +#include "drape/shader_def.hpp" +#include "drape/utils/vertex_decl.hpp" + +#include "std/bind.hpp" +#include "std/vector.hpp" + +namespace gui +{ + +namespace +{ + +void ApplyAnchor(dp::Anchor anchor, vector & vertices, float halfWidth, float halfHeight) +{ + glsl::vec2 normalOffset(0.0f, 0.0f); + if (anchor & dp::Left) + normalOffset.x = halfWidth; + else if (anchor & dp::Right) + normalOffset.x = -halfWidth; + + if (anchor & dp::Top) + normalOffset.y = halfHeight; + else if (anchor & dp::Bottom) + normalOffset.y = -halfHeight; + + for (Button::ButtonVertex & v : vertices) + v.m_normal = v.m_normal + normalOffset; +} + +uint32_t BuildRect(vector & vertices, + glsl::vec2 const & v1, glsl::vec2 const & v2, + glsl::vec2 const & v3, glsl::vec2 const & v4) + +{ + glsl::vec3 const position(0.0f, 0.0f, 0.0f); + + vertices.push_back(Button::ButtonVertex(position, v1)); + vertices.push_back(Button::ButtonVertex(position, v2)); + vertices.push_back(Button::ButtonVertex(position, v3)); + + vertices.push_back(Button::ButtonVertex(position, v3)); + vertices.push_back(Button::ButtonVertex(position, v2)); + vertices.push_back(Button::ButtonVertex(position, v4)); + + return dp::Batcher::IndexPerQuad; +} + +uint32_t BuildCorner(vector & vertices, + glsl::vec2 const & pt, double radius, + double angleStart, double angleFinish) +{ + glsl::vec3 const position(0.0f, 0.0f, 0.0f); + + int const trianglesCount = 8; + double const sector = (angleFinish - angleStart) / static_cast(trianglesCount); + m2::PointD startNormal(0.0f, radius); + + for (size_t i = 0; i < trianglesCount; ++i) + { + m2::PointD normal = m2::Rotate(startNormal, angleStart + i * sector); + m2::PointD nextNormal = m2::Rotate(startNormal, angleStart + (i + 1) * sector); + + vertices.push_back(Button::ButtonVertex(position, pt)); + vertices.push_back(Button::ButtonVertex(position, pt - glsl::ToVec2(normal))); + vertices.push_back(Button::ButtonVertex(position, pt - glsl::ToVec2(nextNormal))); + } + + return trianglesCount * dp::Batcher::IndexPerTriangle; +} + +} + +ButtonHandle::ButtonHandle(dp::Anchor anchor, m2::PointF const & size, + dp::Color const & color, dp::Color const & pressedColor) + : TBase(anchor, m2::PointF::Zero(), size) + , m_isInPressedState(false) + , m_color(color) + , m_pressedColor(pressedColor) +{} + +void ButtonHandle::OnTapBegin() +{ + m_isInPressedState = true; +} + +void ButtonHandle::OnTapEnd() +{ + m_isInPressedState = false; +} + +bool ButtonHandle::Update(ScreenBase const & screen) +{ + glsl::vec4 color = glsl::ToVec4(m_isInPressedState ? m_pressedColor : m_color); + m_uniforms.SetFloatValue("u_color", color.r, color.g, color.b, color.a); + return TBase::Update(screen); +} + +StaticLabel::LabelResult Button::PreprocessLabel(Params const & params, ref_ptr texMgr) +{ + StaticLabel::LabelResult result; + StaticLabel::CacheStaticText(params.m_label, StaticLabel::DefaultDelim, params.m_anchor, + params.m_labelFont, texMgr, result); + return result; +} + +void Button::Draw(Params const & params, ShapeControl & control, gui::StaticLabel::LabelResult & label) +{ + float const halfWidth = params.m_width * 0.5f; + float const halfHeight = label.m_boundRect.SizeY() * 0.5f; + float const halfWM = halfWidth + params.m_margin; + float const halfHM = halfHeight + params.m_margin; + + // Cache button + { + dp::GLState state(gpu::BUTTON_PROGRAM, dp::GLState::Gui); + + float w = halfWM - params.m_facet; + float h = halfHM - params.m_facet; + + vector vertexes; + vertexes.reserve(114); + + uint32_t indicesCount = 0; + + indicesCount += BuildRect(vertexes, glsl::vec2(-w, halfHM), glsl::vec2(-w, -halfHM), + glsl::vec2(w, halfHM), glsl::vec2(w, -halfHM)); + + indicesCount += BuildRect(vertexes, glsl::vec2(-halfWM, h), glsl::vec2(-halfWM, -h), + glsl::vec2(-w, h), glsl::vec2(-w, -h)); + + indicesCount += BuildRect(vertexes, glsl::vec2(w, h), glsl::vec2(w, -h), + glsl::vec2(halfWM, h), glsl::vec2(halfWM, -h)); + + indicesCount += BuildCorner(vertexes, glsl::vec2(-w, h), params.m_facet, + math::pi, 1.5 * math::pi); + + indicesCount += BuildCorner(vertexes, glsl::vec2(-w, -h), params.m_facet, + 1.5 * math::pi, 2 * math::pi); + + indicesCount += BuildCorner(vertexes, glsl::vec2(w, h), params.m_facet, + 0.5 * math::pi, math::pi); + + indicesCount += BuildCorner(vertexes, glsl::vec2(w, -h), params.m_facet, + 0.0, 0.5 * math::pi); + + ApplyAnchor(params.m_anchor, vertexes, halfWidth, halfHeight); + + uint32_t const verticesCount = (uint32_t)vertexes.size(); + dp::AttributeProvider provider(1 /* stream count */, verticesCount); + provider.InitStream(0 /*stream index*/, ButtonVertex::GetBindingInfo(), + make_ref(vertexes.data())); + + m2::PointF buttonSize(halfWM + halfWM, halfHM + halfHM); + ASSERT(params.m_bodyHandleCreator, ()); + dp::Batcher batcher(indicesCount, verticesCount); + dp::SessionGuard guard(batcher, bind(&ShapeControl::AddShape, &control, _1, _2)); + batcher.InsertTriangleList(state, make_ref(&provider), + params.m_bodyHandleCreator(params.m_anchor, buttonSize)); + } + + // Cache text + { + size_t vertexCount = label.m_buffer.size(); + ASSERT(vertexCount % dp::Batcher::VertexPerQuad == 0, ()); + size_t indexCount = dp::Batcher::IndexPerQuad * vertexCount / dp::Batcher::VertexPerQuad; + + dp::AttributeProvider provider(1 /*stream count*/, vertexCount); + provider.InitStream(0 /*stream index*/, StaticLabel::Vertex::GetBindingInfo(), + make_ref(label.m_buffer.data())); + + ASSERT(params.m_labelHandleCreator, ()); + m2::PointF textSize(label.m_boundRect.SizeX(), label.m_boundRect.SizeY()); + + dp::Batcher batcher(indexCount, vertexCount); + dp::SessionGuard guard(batcher, bind(&ShapeControl::AddShape, &control, _1, _2)); + batcher.InsertListOfStrip(label.m_state, make_ref(&provider), + params.m_labelHandleCreator(params.m_anchor, textSize, label.m_alphabet), + dp::Batcher::VertexPerQuad); + } +} + +dp::BindingInfo const & Button::ButtonVertex::GetBindingInfo() +{ + static unique_ptr info; + + if (info == nullptr) + { + info.reset(new dp::BindingInfo(2)); + + dp::BindingDecl & posDecl = info->GetBindingDecl(0); + posDecl.m_attributeName = "a_position"; + posDecl.m_componentCount = 3; + posDecl.m_componentType = gl_const::GLFloatType; + posDecl.m_offset = 0; + posDecl.m_stride = sizeof(ButtonVertex); + + dp::BindingDecl & normalDecl = info->GetBindingDecl(1); + normalDecl.m_attributeName = "a_normal"; + normalDecl.m_componentCount = 2; + normalDecl.m_componentType = gl_const::GLFloatType; + normalDecl.m_offset = sizeof(glsl::vec3); + normalDecl.m_stride = posDecl.m_stride; + } + + return *info.get(); +} + +} diff --git a/drape_frontend/gui/button.hpp b/drape_frontend/gui/button.hpp new file mode 100644 index 0000000000..193e6db78b --- /dev/null +++ b/drape_frontend/gui/button.hpp @@ -0,0 +1,69 @@ +#pragma once + +#include "shape.hpp" +#include "gui_text.hpp" + +#include "std/function.hpp" +#include "std/string.hpp" + +namespace gui +{ + +class ButtonHandle : public TappableHandle +{ + typedef TappableHandle TBase; + +public: + ButtonHandle(dp::Anchor anchor, m2::PointF const & size, + dp::Color const & color, dp::Color const & pressedColor); + + void OnTapBegin() override; + void OnTapEnd() override; + bool Update(ScreenBase const & screen) override; + +private: + bool m_isInPressedState; + dp::Color m_color; + dp::Color m_pressedColor; +}; + +class Button +{ +public: + struct ButtonVertex + { + ButtonVertex() = default; + ButtonVertex(glsl::vec3 const & position, glsl::vec2 const & normal) + : m_position(position) + , m_normal(normal) + { + } + + static dp::BindingInfo const & GetBindingInfo(); + + glsl::vec3 m_position; + glsl::vec2 m_normal; + }; + + using TCreatorResult = drape_ptr; + using THandleCreator = function; + using TLabelHandleCreator = function; + + struct Params + { + string m_label; + dp::FontDecl m_labelFont; + dp::Anchor m_anchor; + + float m_width = 0.0f; + float m_margin = 0.0f; + float m_facet = 0.0f; + + THandleCreator m_bodyHandleCreator; + TLabelHandleCreator m_labelHandleCreator; + }; + + static gui::StaticLabel::LabelResult PreprocessLabel(Params const & params, ref_ptr texMgr); + static void Draw(Params const & params, ShapeControl & control, gui::StaticLabel::LabelResult & label); +}; +} diff --git a/drape_frontend/gui/compass.cpp b/drape_frontend/gui/compass.cpp new file mode 100644 index 0000000000..4b29591119 --- /dev/null +++ b/drape_frontend/gui/compass.cpp @@ -0,0 +1,139 @@ +#include "compass.hpp" +#include "drape_gui.hpp" + +#include "drape_frontend/animation/show_hide_animation.hpp" + +#include "drape/glsl_types.hpp" +#include "drape/glsl_func.hpp" +#include "drape/shader_def.hpp" + +#include "drape/utils/vertex_decl.hpp" + +#include "std/bind.hpp" + +namespace gui +{ + +namespace +{ + struct CompassVertex + { + CompassVertex(glsl::vec2 const & position, glsl::vec2 const & texCoord) + : m_position(position) + , m_texCoord(texCoord) {} + + glsl::vec2 m_position; + glsl::vec2 m_texCoord; + }; + + class CompassHandle : public TappableHandle + { + using TBase = TappableHandle; + double const VisibleStartAngle = my::DegToRad(5.0); + double const VisibleEndAngle = my::DegToRad(355.0); + + public: + CompassHandle(m2::PointF const & pivot, m2::PointF const & size, Shape::TTapHandler const & tapHandler) + : TappableHandle(dp::Center, pivot, size) + , m_tapHandler(tapHandler) + , m_animation(false, 0.25) + { + } + + void OnTap() override + { + if (m_tapHandler != nullptr) + m_tapHandler(); + } + + bool Update(ScreenBase const & screen) override + { + float angle = ang::AngleIn2PI(screen.GetAngle()); + + bool isVisiblePrev = IsVisible(); + bool isVisibleAngle = angle > VisibleStartAngle && angle < VisibleEndAngle; + + bool isVisible = isVisibleAngle || (isVisiblePrev && DrapeGui::Instance().IsInUserAction()); + + if (isVisible) + { + m_animation.ShowAnimated(); + SetIsVisible(true); + } + else + m_animation.HideAnimated(); + + if (IsVisible()) + { + TBase::Update(screen); + + glsl::mat4 r = glsl::rotate(glsl::mat4(), angle, glsl::vec3(0.0, 0.0, 1.0)); + glsl::mat4 m = glsl::translate(glsl::mat4(), glsl::vec3(m_pivot, 0.0)); + m = glsl::transpose(m * r); + m_uniforms.SetMatrix4x4Value("modelView", glsl::value_ptr(m)); + m_uniforms.SetFloatValue("u_opacity", m_animation.GetT()); + } + + if (m_animation.IsFinished()) + SetIsVisible(isVisible); + + return true; + } + + private: + Shape::TTapHandler m_tapHandler; + df::ShowHideAnimation m_animation; + }; +} + +drape_ptr Compass::Draw(m2::PointF & compassSize, ref_ptr tex, + TTapHandler const & tapHandler) const +{ + dp::TextureManager::SymbolRegion region; + tex->GetSymbolRegion("compass-image", region); + glsl::vec2 halfSize = glsl::ToVec2(m2::PointD(region.GetPixelSize()) * 0.5); + m2::RectF texRect = region.GetTexRect(); + + ASSERT_EQUAL(m_position.m_anchor, dp::Center, ()); + CompassVertex vertexes[] = + { + CompassVertex(glsl::vec2(-halfSize.x, halfSize.y), glsl::ToVec2(texRect.LeftTop())), + CompassVertex(glsl::vec2(-halfSize.x, -halfSize.y), glsl::ToVec2(texRect.LeftBottom())), + CompassVertex(glsl::vec2(halfSize.x, halfSize.y), glsl::ToVec2(texRect.RightTop())), + CompassVertex(glsl::vec2(halfSize.x, -halfSize.y), glsl::ToVec2(texRect.RightBottom())) + }; + + dp::GLState state(gpu::COMPASS_PROGRAM, dp::GLState::Gui); + state.SetColorTexture(region.GetTexture()); + + dp::AttributeProvider provider(1, 4); + dp::BindingInfo info(2); + + dp::BindingDecl & posDecl = info.GetBindingDecl(0); + posDecl.m_attributeName = "a_position"; + posDecl.m_componentCount = 2; + posDecl.m_componentType = gl_const::GLFloatType; + posDecl.m_offset = 0; + posDecl.m_stride = sizeof(CompassVertex); + + dp::BindingDecl & texDecl = info.GetBindingDecl(1); + texDecl.m_attributeName = "a_colorTexCoords"; + texDecl.m_componentCount = 2; + texDecl.m_componentType = gl_const::GLFloatType; + texDecl.m_offset = sizeof(glsl::vec2); + texDecl.m_stride = posDecl.m_stride; + + provider.InitStream(0, info, make_ref(&vertexes)); + + compassSize = region.GetPixelSize(); + drape_ptr handle = make_unique_dp(m_position.m_pixelPivot, compassSize, tapHandler); + + drape_ptr renderer = make_unique_dp(); + dp::Batcher batcher(dp::Batcher::IndexPerQuad, dp::Batcher::VertexPerQuad); + dp::SessionGuard guard(batcher, bind(&ShapeRenderer::AddShape, renderer.get(), _1, _2)); + batcher.InsertTriangleStrip(state, make_ref(&provider), move(handle)); + + return renderer; +} + +} diff --git a/drape_frontend/gui/compass.hpp b/drape_frontend/gui/compass.hpp new file mode 100644 index 0000000000..1a93c74b2d --- /dev/null +++ b/drape_frontend/gui/compass.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "shape.hpp" + +namespace gui +{ + +class Compass : public Shape +{ +public: + Compass(gui::Position const & position) + : Shape(position) + {} + + drape_ptr Draw(m2::PointF & compassSize, ref_ptr tex, + TTapHandler const & tapHandler) const; +}; + +} diff --git a/drape_frontend/gui/copyright_label.cpp b/drape_frontend/gui/copyright_label.cpp new file mode 100644 index 0000000000..81d405c706 --- /dev/null +++ b/drape_frontend/gui/copyright_label.cpp @@ -0,0 +1,93 @@ +#include "copyright_label.hpp" +#include "drape_gui.hpp" +#include "gui_text.hpp" +#include "ruler_helper.hpp" + +#include "drape_frontend/animation/opacity_animation.hpp" +#include "drape_frontend/animation/value_mapping.hpp" + +#include "base/timer.hpp" + +#include "std/bind.hpp" + +namespace gui +{ + +namespace +{ + double const kCopyrightVisibleTime = 2.0f; + double const kCopyrightHideTime = 0.25f; + + class CopyrightHandle : public StaticLabelHandle + { + using TBase = StaticLabelHandle; + + public: + CopyrightHandle(ref_ptr textureManager, + dp::Anchor anchor, m2::PointF const & pivot, + m2::PointF const & size, TAlphabet const & alphabet) + : TBase(textureManager, anchor, pivot, size, alphabet) + { + SetIsVisible(true); + } + + bool Update(ScreenBase const & screen) override + { + if (!IsVisible()) + return false; + + if (!TBase::Update(screen)) + return false; + + if (m_animation == nullptr) + m_animation.reset(new df::OpacityAnimation(kCopyrightHideTime, kCopyrightVisibleTime, 1.0f, 0.0f)); + else if (m_animation->IsFinished()) + { + DrapeGui::Instance().DeactivateCopyright(); + SetIsVisible(false); + } + + m_uniforms.SetFloatValue("u_opacity", m_animation->GetOpacity()); + + return true; + } + + private: + drape_ptr m_animation; + }; +} + +CopyrightLabel::CopyrightLabel(Position const & position) + : TBase(position) +{ +} + +drape_ptr CopyrightLabel::Draw(m2::PointF & size, ref_ptr tex) const +{ + StaticLabel::LabelResult result; + StaticLabel::CacheStaticText("Map data © OpenStreetMap", "", m_position.m_anchor, + DrapeGui::GetGuiTextFont(), tex, result); + + dp::AttributeProvider provider(1 /*stream count*/, result.m_buffer.size()); + provider.InitStream(0 /*stream index*/, StaticLabel::Vertex::GetBindingInfo(), + make_ref(result.m_buffer.data())); + + size_t vertexCount = result.m_buffer.size(); + ASSERT(vertexCount % dp::Batcher::VertexPerQuad == 0, ()); + size_t indexCount = dp::Batcher::IndexPerQuad * vertexCount / dp::Batcher::VertexPerQuad; + + size = m2::PointF(result.m_boundRect.SizeX(), result.m_boundRect.SizeY()); + drape_ptr handle = make_unique_dp(tex, m_position.m_anchor, + m_position.m_pixelPivot, size, + result.m_alphabet); + + drape_ptr renderer = make_unique_dp(); + dp::Batcher batcher(indexCount, vertexCount); + dp::SessionGuard guard(batcher, bind(&ShapeRenderer::AddShape, renderer.get(), _1, _2)); + batcher.InsertListOfStrip(result.m_state, make_ref(&provider), + move(handle), dp::Batcher::VertexPerQuad); + + return renderer; +} + +} diff --git a/drape_frontend/gui/copyright_label.hpp b/drape_frontend/gui/copyright_label.hpp new file mode 100644 index 0000000000..9345b19849 --- /dev/null +++ b/drape_frontend/gui/copyright_label.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "shape.hpp" + +namespace gui +{ + +class CopyrightLabel : public Shape +{ + using TBase = Shape; +public: + CopyrightLabel(gui::Position const & position); + drape_ptr Draw(m2::PointF & size, ref_ptr tex) const; +}; + +} diff --git a/drape_frontend/gui/country_status.cpp b/drape_frontend/gui/country_status.cpp new file mode 100644 index 0000000000..d12eecc836 --- /dev/null +++ b/drape_frontend/gui/country_status.cpp @@ -0,0 +1,277 @@ +#include "button.hpp" +#include "country_status.hpp" +#include "drape_gui.hpp" +#include "gui_text.hpp" + +#include "drape_frontend/visual_params.hpp" + +#include "drape/batcher.hpp" +#include "drape/glsl_func.hpp" + +#include "std/algorithm.hpp" +#include "std/bind.hpp" + +namespace gui +{ +namespace +{ + +class CountryStatusButtonHandle : public ButtonHandle +{ + using TBase = ButtonHandle; + +public: + CountryStatusButtonHandle(CountryStatusHelper::ECountryState const state, + Shape::TTapHandler const & tapHandler, + dp::Anchor anchor, m2::PointF const & size, + dp::Color const & color, dp::Color const & pressedColor) + : TBase(anchor, size, color, pressedColor) + , m_state(state) + , m_tapHandler(tapHandler) + {} + + void OnTap() override + { + if (m_tapHandler != nullptr) + m_tapHandler(); + } + + bool Update(ScreenBase const & screen) override + { + SetIsVisible(DrapeGui::GetCountryStatusHelper().IsVisibleForState(m_state)); + return TBase::Update(screen); + } + +private: + CountryStatusHelper::ECountryState m_state; + Shape::TTapHandler m_tapHandler; +}; + +class CountryStatusLabelHandle : public StaticLabelHandle +{ + using TBase = StaticLabelHandle; + +public: + CountryStatusLabelHandle(CountryStatusHelper::ECountryState const state, + ref_ptr textureManager, + dp::Anchor anchor, m2::PointF const & size, + TAlphabet const & alphabet) + : TBase(textureManager, anchor, m2::PointF::Zero(), size, alphabet) + , m_state(state) + {} + + bool Update(ScreenBase const & screen) override + { + SetIsVisible(DrapeGui::GetCountryStatusHelper().IsVisibleForState(m_state)); + return TBase::Update(screen); + } + +private: + CountryStatusHelper::ECountryState m_state; +}; + +class CountryProgressHandle : public MutableLabelHandle +{ + using TBase = MutableLabelHandle; + +public: + CountryProgressHandle(dp::Anchor anchor, CountryStatusHelper::ECountryState const state, + ref_ptr textures) + : TBase(anchor, m2::PointF::Zero(), textures), m_state(state) + {} + + bool Update(ScreenBase const & screen) override + { + CountryStatusHelper & helper = DrapeGui::GetCountryStatusHelper(); + SetIsVisible(helper.IsVisibleForState(m_state)); + if (IsVisible()) + SetContent(helper.GetProgressValue()); + + return TBase::Update(screen); + } + +private: + CountryStatusHelper::ECountryState m_state; +}; + +drape_ptr CreateButtonHandle(CountryStatusHelper::ECountryState const state, + Shape::TTapHandler const & tapHandler, + dp::Color const & color, dp::Color const & pressedColor, + dp::Anchor anchor, m2::PointF const & size) +{ + return make_unique_dp(state, tapHandler, anchor, size, color, pressedColor); +} + +drape_ptr CreateLabelHandle(CountryStatusHelper::ECountryState const state, + ref_ptr textureManager, + dp::Anchor anchor, m2::PointF const & size, + TAlphabet const & alphabet) +{ + return make_unique_dp(state, textureManager, anchor, size, alphabet); +} + +void DrawLabelControl(string const & text, dp::Anchor anchor, dp::Batcher::TFlushFn const & flushFn, + ref_ptr mng, CountryStatusHelper::ECountryState state) +{ + StaticLabel::LabelResult result; + StaticLabel::CacheStaticText(text, "\n", anchor, dp::FontDecl(dp::Color::Black(), 18), mng, + result); + size_t vertexCount = result.m_buffer.size(); + ASSERT(vertexCount % dp::Batcher::VertexPerQuad == 0, ()); + size_t indexCount = dp::Batcher::IndexPerQuad * vertexCount / dp::Batcher::VertexPerQuad; + + dp::AttributeProvider provider(1 /*stream count*/, vertexCount); + provider.InitStream(0 /*stream index*/, StaticLabel::Vertex::GetBindingInfo(), + make_ref(result.m_buffer.data())); + + dp::Batcher batcher(indexCount, vertexCount); + dp::SessionGuard guard(batcher, flushFn); + m2::PointF size(result.m_boundRect.SizeX(), result.m_boundRect.SizeY()); + drape_ptr handle = make_unique_dp(state, mng, anchor, size, result.m_alphabet); + batcher.InsertListOfStrip(result.m_state, make_ref(&provider), move(handle), + dp::Batcher::VertexPerQuad); +} + +void DrawProgressControl(dp::Anchor anchor, dp::Batcher::TFlushFn const & flushFn, + ref_ptr mng, CountryStatusHelper::ECountryState state) +{ + MutableLabelDrawer::Params params; + CountryStatusHelper & helper = DrapeGui::GetCountryStatusHelper(); + helper.GetProgressInfo(params.m_alphabet, params.m_maxLength); + + params.m_anchor = anchor; + params.m_pivot = m2::PointF::Zero(); + params.m_font = dp::FontDecl(dp::Color::Black(), 18); + params.m_handleCreator = [state, mng](dp::Anchor anchor, m2::PointF const & /*pivot*/) + { + return make_unique_dp(anchor, state, mng); + }; + + MutableLabelDrawer::Draw(params, mng, flushFn); +} + +void ForEachComponent(CountryStatusHelper & helper, CountryStatusHelper::EControlType type, + function const & callback) +{ + for (size_t i = 0; i < helper.GetComponentCount(); ++i) + { + CountryStatusHelper::Control const & control = helper.GetControl(i); + if (callback != nullptr && control.m_type == type) + callback(control); + } +} + +} + +drape_ptr CountryStatus::Draw(ref_ptr tex, + TButtonHandlers const & buttonHandlers) const +{ + CountryStatusHelper & helper = DrapeGui::GetCountryStatusHelper(); + if (helper.GetComponentCount() == 0) + return nullptr; + + CountryStatusHelper::ECountryState const state = helper.GetState(); + ASSERT(state != CountryStatusHelper::COUNTRY_STATE_LOADED, ()); + + drape_ptr renderer = make_unique_dp(); + dp::Batcher::TFlushFn flushFn = bind(&ShapeRenderer::AddShape, renderer.get(), _1, _2); + + // Create labels. + ForEachComponent(helper, CountryStatusHelper::CONTROL_TYPE_LABEL, + [this, &tex, &flushFn, &state](CountryStatusHelper::Control const & control) + { + DrawLabelControl(control.m_label, m_position.m_anchor, flushFn, tex, state); + }); + + // Preprocess buttons. + vector> buttons; + float const kMinButtonWidth = 400; + float maxButtonWidth = kMinButtonWidth; + buttons.reserve(2); + ForEachComponent(helper, CountryStatusHelper::CONTROL_TYPE_BUTTON, + [this, &buttons, &state, &tex, &buttonHandlers, + &maxButtonWidth](CountryStatusHelper::Control const & control) + { + float const visualScale = df::VisualParams::Instance().GetVisualScale(); + + Button::Params params; + params.m_anchor = m_position.m_anchor; + params.m_label = control.m_label; + params.m_labelFont = dp::FontDecl(dp::Color::White(), 18); + params.m_margin = 5.0f * visualScale; + params.m_facet = 8.0f * visualScale; + + auto color = dp::Color(0, 0, 0, 0.44 * 255); + auto pressedColor = dp::Color(0, 0, 0, 0.72 * 255); + if (control.m_buttonType == CountryStatusHelper::BUTTON_TYPE_MAP_ROUTING) + { + color = dp::Color(32, 152, 82, 255); + pressedColor = dp::Color(24, 128, 68, 255); + } + + auto const buttonHandlerIt = buttonHandlers.find(control.m_buttonType); + Shape::TTapHandler buttonHandler = (buttonHandlerIt != buttonHandlers.end() ? buttonHandlerIt->second : nullptr); + params.m_bodyHandleCreator = bind(&CreateButtonHandle, state, buttonHandler, color, pressedColor, _1, _2); + params.m_labelHandleCreator = bind(&CreateLabelHandle, state, tex, _1, _2, _3); + + auto label = Button::PreprocessLabel(params, tex); + float const buttonWidth = label.m_boundRect.SizeX(); + if (buttonWidth > maxButtonWidth) + maxButtonWidth = buttonWidth; + + buttons.emplace_back(make_pair(move(params), move(label))); + }); + + // Create buttons. + for (size_t i = 0; i < buttons.size(); i++) + { + buttons[i].first.m_width = maxButtonWidth; + ShapeControl shapeControl; + Button::Draw(buttons[i].first, shapeControl, buttons[i].second); + renderer->AddShapeControl(move(shapeControl)); + } + + // Create progress bars. + ForEachComponent(helper, CountryStatusHelper::CONTROL_TYPE_PROGRESS, + [this, &tex, &flushFn, &state](CountryStatusHelper::Control const &) + { + DrawProgressControl(m_position.m_anchor, flushFn, tex, state); + }); + + buffer_vector heights; + float totalHeight = 0.0f; + + ArrangeShapes(make_ref(renderer), [&heights, &totalHeight](ShapeControl & shape) + { + float height = 0.0f; + for (ShapeControl::ShapeInfo & info : shape.m_shapesInfo) + height = max(height, info.m_handle->GetSize().y); + + heights.push_back(height); + totalHeight += height; + }); + + ASSERT(!heights.empty(), ()); + + float const controlMargin = helper.GetControlMargin(); + totalHeight += controlMargin * (heights.size() - 1); + float halfHeight = totalHeight * 0.5f; + glsl::vec2 pen(m_position.m_pixelPivot.x, m_position.m_pixelPivot.y - halfHeight); + size_t controlIndex = 0; + + ArrangeShapes(make_ref(renderer), [&](ShapeControl & shape) + { + float const h = heights[controlIndex]; + float const halfH = h * 0.5f; + ++controlIndex; + + for (ShapeControl::ShapeInfo & info : shape.m_shapesInfo) + info.m_handle->SetPivot(pen + glsl::vec2(0.0f, halfH)); + + pen.y += (h + controlMargin); + }); + + return renderer; +} + +} // namespace gui diff --git a/drape_frontend/gui/country_status.hpp b/drape_frontend/gui/country_status.hpp new file mode 100644 index 0000000000..75604540f1 --- /dev/null +++ b/drape_frontend/gui/country_status.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "shape.hpp" +#include "country_status_helper.hpp" + +namespace gui +{ +class CountryStatus : public Shape +{ +public: + CountryStatus(Position const & position) + : Shape(position) + {} + + using TButtonHandlers = map; + + drape_ptr Draw(ref_ptr tex, + TButtonHandlers const & buttonHandlers) const; +}; + +} // namespace gui diff --git a/drape_frontend/gui/country_status_helper.cpp b/drape_frontend/gui/country_status_helper.cpp new file mode 100644 index 0000000000..74c2b3bf40 --- /dev/null +++ b/drape_frontend/gui/country_status_helper.cpp @@ -0,0 +1,253 @@ +#include "country_status_helper.hpp" +#include "drape_gui.hpp" + +#include "drape_frontend/visual_params.hpp" + +#include "base/stl_add.hpp" +#include "base/string_utils.hpp" +#include "base/string_format.hpp" + +namespace gui +{ + +namespace +{ + +CountryStatusHelper::Control MakeLabel(string const & text) +{ + return { text, CountryStatusHelper::CONTROL_TYPE_LABEL, CountryStatusHelper::BUTTON_TYPE_NOT_BUTTON }; +} + +CountryStatusHelper::Control MakeButton(string const & text, CountryStatusHelper::EButtonType type) +{ + return { text, CountryStatusHelper::CONTROL_TYPE_BUTTON, type }; +} + +CountryStatusHelper::Control MakeProgress() +{ + return { "", CountryStatusHelper::CONTROL_TYPE_PROGRESS, CountryStatusHelper::BUTTON_TYPE_NOT_BUTTON }; +} + +string GetLocalizedString(string const & id) +{ + return DrapeGui::Instance().GetLocalizedString(id); +} + +void FormatMapSize(uint64_t sizeInBytes, string & units, size_t & sizeToDownload) +{ + int const mbInBytes = 1024 * 1024; + int const kbInBytes = 1024; + if (sizeInBytes > mbInBytes) + { + sizeToDownload = (sizeInBytes + mbInBytes - 1) / mbInBytes; + units = "MB"; + } + else if (sizeInBytes > kbInBytes) + { + sizeToDownload = (sizeInBytes + kbInBytes -1) / kbInBytes; + units = "KB"; + } + else + { + sizeToDownload = sizeInBytes; + units = "B"; + } +} + +char const * DownloadMapButtonID = "country_status_download_without_routing"; +char const * DownloadMapRoutingButtonID = "country_status_download"; +char const * TryAgainButtonID = "try_again"; +char const * DownloadingLabelID = "country_status_downloading"; +char const * DownloadingFailedID = "country_status_download_failed"; +char const * InQueueID = "country_status_added_to_queue"; + +} // namespace + +//////////////////////////////////////////////////////////// + +CountryStatusHelper::CountryStatusHelper() + : m_state(COUNTRY_STATE_LOADED) +{ +} + +void CountryStatusHelper::SetCountryInfo(CountryInfo const & countryInfo) +{ + m_countryInfo = countryInfo; + + CountryStatusHelper::ECountryState state = CountryStatusHelper::COUNTRY_STATE_LOADED; + switch(m_countryInfo.m_countryStatus) + { + case storage::TStatus::ENotDownloaded: + state = CountryStatusHelper::COUNTRY_STATE_EMPTY; + break; + case storage::TStatus::EDownloading: + state = CountryStatusHelper::COUNTRY_STATE_LOADING; + break; + case storage::TStatus::EInQueue: + state = CountryStatusHelper::COUNTRY_STATE_IN_QUEUE; + break; + case storage::TStatus::EDownloadFailed: + case storage::TStatus::EOutOfMemFailed: + state = CountryStatusHelper::COUNTRY_STATE_FAILED; + break; + default: + break; + } + + SetState(state); +} + +void CountryStatusHelper::Clear() +{ + m_countryInfo = CountryInfo(); + SetState(COUNTRY_STATE_LOADED); +} + +storage::TIndex CountryStatusHelper::GetCountryIndex() const +{ + return m_countryInfo.m_countryIndex; +} + +void CountryStatusHelper::SetState(ECountryState state) +{ + m_state = state; + FillControlsForState(); + DrapeGui::Instance().EmitRecacheCountryStatusSignal(); +} + +CountryStatusHelper::ECountryState CountryStatusHelper::GetState() const +{ + return m_state; +} + +bool CountryStatusHelper::IsVisibleForState(ECountryState state) const +{ + return m_state != COUNTRY_STATE_LOADED && m_state == state; +} + +size_t CountryStatusHelper::GetComponentCount() const { return m_controls.size(); } + +CountryStatusHelper::Control const & CountryStatusHelper::GetControl(size_t index) const +{ + return m_controls[index]; +} + +float CountryStatusHelper::GetControlMargin() +{ + return 20.0f * df::VisualParams::Instance().GetVisualScale(); +} + +void CountryStatusHelper::GetProgressInfo(string & alphabet, size_t & maxLength) +{ + alphabet = " 0123456789%"; + maxLength = 5; +} + +string CountryStatusHelper::GetProgressValue() const +{ + return strings::to_string(m_countryInfo.m_downloadProgress) + "%"; +} + +void CountryStatusHelper::FillControlsForState() +{ + m_controls.clear(); + ECountryState state = m_state; + switch (state) + { + case COUNTRY_STATE_EMPTY: + FillControlsForEmpty(); + break; + case COUNTRY_STATE_LOADING: + FillControlsForLoading(); + break; + case COUNTRY_STATE_IN_QUEUE: + FillControlsForInQueue(); + break; + case COUNTRY_STATE_FAILED: + FillControlsForFailed(); + break; + default: + break; + } +} + +void CountryStatusHelper::FillControlsForEmpty() +{ + ASSERT(m_controls.empty(), ()); + m_controls.push_back(MakeLabel(m_countryInfo.m_currentCountryName)); + m_controls.push_back(MakeButton(FormatDownloadMapRouting(), BUTTON_TYPE_MAP_ROUTING)); + m_controls.push_back(MakeButton(FormatDownloadMap(), BUTTON_TYPE_MAP)); +} + +void CountryStatusHelper::FillControlsForLoading() +{ + ASSERT(m_controls.empty(), ()); + string text = GetLocalizedString(DownloadingLabelID); + size_t firstPos = text.find('^'); + ASSERT(firstPos != string::npos, ()); + size_t secondPos = text.find('^', firstPos + 1); + ASSERT(secondPos != string::npos, ()); + + if (firstPos != 0) + { + string firstLabel = text.substr(0, firstPos); + strings::Trim(firstLabel, "\n "); + m_controls.push_back(MakeLabel(firstLabel)); + } + + m_controls.push_back(MakeLabel(m_countryInfo.m_currentCountryName)); + m_controls.push_back(MakeProgress()); + + if (secondPos + 1 < text.size()) + { + string secondLabel = text.substr(secondPos + 1); + strings::Trim(secondLabel , "\n "); + m_controls.push_back(MakeLabel(secondLabel)); + } +} + +void CountryStatusHelper::FillControlsForInQueue() +{ + ASSERT(m_controls.empty(), ()); + m_controls.push_back(MakeLabel(FormatInQueueMap())); +} + +void CountryStatusHelper::FillControlsForFailed() +{ + ASSERT(m_controls.empty(), ()); + m_controls.push_back(MakeLabel(FormatFailed())); + m_controls.push_back(MakeButton(FormatTryAgain(), BUTTON_TRY_AGAIN)); +} + +string CountryStatusHelper::FormatDownloadMap() +{ + size_t size; + string units; + FormatMapSize(m_countryInfo.m_mapSize, units, size); + return strings::Format(GetLocalizedString(DownloadMapButtonID), size, units); +} + +string CountryStatusHelper::FormatDownloadMapRouting() +{ + size_t size; + string units; + FormatMapSize(m_countryInfo.m_mapSize + m_countryInfo.m_routingSize, units, size); + return strings::Format(GetLocalizedString(DownloadMapRoutingButtonID), size, units); +} + +string CountryStatusHelper::FormatInQueueMap() +{ + return strings::Format(GetLocalizedString(InQueueID), m_countryInfo.m_currentCountryName); +} + +string CountryStatusHelper::FormatFailed() +{ + return strings::Format(GetLocalizedString(DownloadingFailedID), m_countryInfo.m_currentCountryName); +} + +string CountryStatusHelper::FormatTryAgain() +{ + return GetLocalizedString(TryAgainButtonID); +} + +} // namespace gui diff --git a/drape_frontend/gui/country_status_helper.hpp b/drape_frontend/gui/country_status_helper.hpp new file mode 100644 index 0000000000..ef56d961fa --- /dev/null +++ b/drape_frontend/gui/country_status_helper.hpp @@ -0,0 +1,100 @@ +#pragma once + +#include "drape/pointers.hpp" + +#include "storage/index.hpp" +#include "storage/storage_defines.hpp" + +#include "base/buffer_vector.hpp" + +#include "std/atomic.hpp" +#include "std/string.hpp" + +namespace gui +{ + +struct CountryInfo +{ + storage::TIndex m_countryIndex = storage::TIndex::INVALID; + storage::TStatus m_countryStatus = storage::TStatus::EUnknown; + string m_currentCountryName; + size_t m_mapSize = 0; + size_t m_routingSize = 0; + size_t m_downloadProgress = 0; +}; + +class CountryStatusHelper +{ +public: + enum ECountryState + { + COUNTRY_STATE_EMPTY, + COUNTRY_STATE_LOADED, + COUNTRY_STATE_LOADING, + COUNTRY_STATE_IN_QUEUE, + COUNTRY_STATE_FAILED + }; + + enum EControlType + { + CONTROL_TYPE_LABEL, + CONTROL_TYPE_BUTTON, + CONTROL_TYPE_PROGRESS + }; + + enum EButtonType + { + BUTTON_TYPE_NOT_BUTTON, + BUTTON_TYPE_MAP, + BUTTON_TYPE_MAP_ROUTING, + BUTTON_TRY_AGAIN + }; + + struct Control + { + string m_label; + EControlType m_type; + EButtonType m_buttonType; + }; + + CountryStatusHelper(); + + void SetCountryInfo(CountryInfo const & countryInfo); + void Clear(); + + storage::TIndex GetCountryIndex() const; + ECountryState GetState() const; + /// CountryStatusHandle work on FrontendRenderer and call this function to check "is visible" + /// or state has already changed. + /// State changes from BackendRenderer thread, when recache operation started. + /// In that moment no need to show old CountryStatus + bool IsVisibleForState(ECountryState state) const; + + size_t GetComponentCount() const; + Control const & GetControl(size_t index) const; + static float GetControlMargin(); + + static void GetProgressInfo(string & alphabet, size_t & maxLength); + string GetProgressValue() const; + +private: + void FillControlsForState(); + void FillControlsForEmpty(); + void FillControlsForLoading(); + void FillControlsForInQueue(); + void FillControlsForFailed(); + + string FormatDownloadMap(); + string FormatDownloadMapRouting(); + string FormatInQueueMap(); + string FormatFailed(); + string FormatTryAgain(); + + void SetState(ECountryState state); + + ECountryState m_state; + buffer_vector m_controls; + CountryInfo m_countryInfo; +}; + +} // namespace gui diff --git a/drape_frontend/gui/drape_gui.cpp b/drape_frontend/gui/drape_gui.cpp new file mode 100644 index 0000000000..e3a565edc0 --- /dev/null +++ b/drape_frontend/gui/drape_gui.cpp @@ -0,0 +1,136 @@ +#include "country_status_helper.hpp" +#include "drape_gui.hpp" +#include "ruler_helper.hpp" + +#include "drape_frontend/visual_params.hpp" + +#include "base/assert.hpp" + +namespace gui +{ + +struct DrapeGui::Impl +{ + DrapeGui::TLocalizeStringFn m_localizeFn; + DrapeGui::TRecacheCountryStatusSlot m_recacheSlot; + + RulerHelper m_rulerHelper; + CountryStatusHelper m_countryHelper; +}; + +DrapeGui::DrapeGui() + : m_impl(new Impl()) +{ +} + +DrapeGui & DrapeGui::Instance() +{ + static DrapeGui s_gui; + if (!s_gui.m_impl) + s_gui.m_impl.reset(new Impl()); + + return s_gui; +} + +RulerHelper & DrapeGui::GetRulerHelper() +{ + return Instance().GetRulerHelperImpl(); +} + +CountryStatusHelper & DrapeGui::GetCountryStatusHelper() +{ + return Instance().GetCountryStatusHelperImpl(); +} + +dp::FontDecl const & DrapeGui::GetGuiTextFont() +{ + static dp::FontDecl font(dp::Color(0x4D, 0x4D, 0x4D, 0xDD), 14); + return font; +} + +void DrapeGui::Destroy() +{ + ASSERT(m_impl != nullptr, ()); + m_impl.reset(); +} + +void DrapeGui::SetSurfaceSize(m2::PointF const & size) +{ + lock_guard lock(m_surfaceSizeMutex); + m_surfaceSize = size; +} + +m2::PointF DrapeGui::GetSurfaceSize() const +{ + lock_guard lock(m_surfaceSizeMutex); + return m_surfaceSize; +} + +void DrapeGui::SetLocalizator(const DrapeGui::TLocalizeStringFn & fn) +{ + ASSERT(m_impl != nullptr, ()); + m_impl->m_localizeFn = fn; +} + +void DrapeGui::SetRecacheCountryStatusSlot(TRecacheCountryStatusSlot const & fn) +{ + ASSERT(m_impl != nullptr, ()); + m_impl->m_recacheSlot = fn; +} + +void DrapeGui::EmitRecacheCountryStatusSignal() +{ + ASSERT(m_impl != nullptr, ()); + if (m_impl->m_recacheSlot) + m_impl->m_recacheSlot(); +} + +void DrapeGui::ClearRecacheCountryStatusSlot() +{ + SetRecacheCountryStatusSlot(TRecacheCountryStatusSlot()); +} + +string DrapeGui::GetLocalizedString(string const & stringID) const +{ + ASSERT(m_impl != nullptr, ()); + ASSERT(m_impl->m_localizeFn != nullptr, ()); + return m_impl->m_localizeFn(stringID); +} + +RulerHelper & DrapeGui::GetRulerHelperImpl() +{ + ASSERT(m_impl != nullptr, ()); + return m_impl->m_rulerHelper; +} + +CountryStatusHelper & DrapeGui::GetCountryStatusHelperImpl() +{ + ASSERT(m_impl != nullptr, ()); + return m_impl->m_countryHelper; +} + +void DrapeGui::ConnectOnCompassTappedHandler(Shape::TTapHandler const & handler) +{ + m_onCompassTappedHandler = handler; +} + +void DrapeGui::ConnectOnButtonPressedHandler(CountryStatusHelper::EButtonType buttonType, + Shape::TTapHandler const & handler) +{ + m_buttonHandlers[buttonType] = handler; +} + +void DrapeGui::CallOnCompassTappedHandler() +{ + if(m_onCompassTappedHandler != nullptr) + m_onCompassTappedHandler(); +} + +void DrapeGui::CallOnButtonPressedHandler(CountryStatusHelper::EButtonType buttonType) +{ + auto it = m_buttonHandlers.find(buttonType); + if (it != m_buttonHandlers.end() && it->second != nullptr) + it->second(); +} + +} diff --git a/drape_frontend/gui/drape_gui.hpp b/drape_frontend/gui/drape_gui.hpp new file mode 100644 index 0000000000..4e4b35ad35 --- /dev/null +++ b/drape_frontend/gui/drape_gui.hpp @@ -0,0 +1,77 @@ +#pragma once + +#include "skin.hpp" +#include "compass.hpp" +#include "country_status.hpp" + +#include "storage/index.hpp" +#include "storage/storage_defines.hpp" + +#include "drape/pointers.hpp" + +#include "std/function.hpp" +#include "std/unique_ptr.hpp" +#include "std/mutex.hpp" + +class ScreenBase; + +namespace gui +{ + +class RulerHelper; +class CountryStatusHelper; + +class DrapeGui +{ +public: + using TRecacheCountryStatusSlot = function; + using TLocalizeStringFn = function; + + static DrapeGui & Instance(); + static RulerHelper & GetRulerHelper(); + static CountryStatusHelper & GetCountryStatusHelper(); + + static dp::FontDecl const & GetGuiTextFont(); + + void SetLocalizator(TLocalizeStringFn const & fn); + void Destroy(); + void SetSurfaceSize(m2::PointF const & size); + m2::PointF GetSurfaceSize() const; + + string GetLocalizedString(string const & stringID) const; + + void SetRecacheCountryStatusSlot(TRecacheCountryStatusSlot const & fn); + void EmitRecacheCountryStatusSignal(); + void ClearRecacheCountryStatusSlot(); + + bool IsInUserAction() const { return m_inUserAction; } + void SetInUserAction(bool isInUserAction) { m_inUserAction = isInUserAction; } + + bool IsCopyrightActive() const { return m_isCopyrightActive; } + void DeactivateCopyright() { m_isCopyrightActive = false; } + + void ConnectOnCompassTappedHandler(Shape::TTapHandler const & handler); + void ConnectOnButtonPressedHandler(CountryStatusHelper::EButtonType buttonType, + Shape::TTapHandler const & handler); + void CallOnCompassTappedHandler(); + void CallOnButtonPressedHandler(CountryStatusHelper::EButtonType buttonType); + +private: + DrapeGui(); + + RulerHelper & GetRulerHelperImpl(); + CountryStatusHelper & GetCountryStatusHelperImpl(); + +private: + struct Impl; + unique_ptr m_impl; + bool m_isCopyrightActive = true; + + Shape::TTapHandler m_onCompassTappedHandler; + CountryStatus::TButtonHandlers m_buttonHandlers; + m2::PointF m_surfaceSize; + mutable mutex m_surfaceSizeMutex; + bool m_inUserAction = false; +}; + +} diff --git a/drape_frontend/gui/gui_text.cpp b/drape_frontend/gui/gui_text.cpp new file mode 100644 index 0000000000..8b80113ddb --- /dev/null +++ b/drape_frontend/gui/gui_text.cpp @@ -0,0 +1,594 @@ +#include "gui_text.hpp" + +#include "drape_frontend/visual_params.hpp" + +#include "base/string_utils.hpp" +#include "base/stl_add.hpp" + +#include "drape/fribidi.hpp" +#include "drape/glsl_func.hpp" +#include "drape/shader_def.hpp" + +#include "std/algorithm.hpp" +#include "std/type_traits.hpp" +#include "std/unique_ptr.hpp" + +namespace gui +{ + +namespace +{ + +static float const BASE_GLYPH_HEIGHT = 20.0f; + +glsl::vec2 GetNormalsAndMask(dp::TextureManager::GlyphRegion const & glyph, float textRatio, + array & normals, array & maskTexCoord) +{ + m2::PointF const pixelSize = m2::PointF(glyph.GetPixelSize()) * textRatio; + m2::RectF const & r = glyph.GetTexRect(); + + float const xOffset = glyph.GetOffsetX() * textRatio; + float const yOffset = glyph.GetOffsetY() * textRatio; + + float const upVector = -static_cast(pixelSize.y) - yOffset; + float const bottomVector = -yOffset; + + normals[0] = glsl::vec2(xOffset, bottomVector); + normals[1] = glsl::vec2(xOffset, upVector); + normals[2] = glsl::vec2(pixelSize.x + xOffset, bottomVector); + normals[3] = glsl::vec2(pixelSize.x + xOffset, upVector); + + maskTexCoord[0] = glsl::ToVec2(r.LeftTop()); + maskTexCoord[1] = glsl::ToVec2(r.LeftBottom()); + maskTexCoord[2] = glsl::ToVec2(r.RightTop()); + maskTexCoord[3] = glsl::ToVec2(r.RightBottom()); + + return glsl::vec2(xOffset, yOffset); +} + +void FillCommonDecl(dp::BindingDecl & decl, string const & name, uint8_t compCount, uint8_t stride, uint8_t offset) +{ + decl.m_attributeName = name; + decl.m_componentCount = compCount; + decl.m_componentType = gl_const::GLFloatType; + decl.m_stride = stride; + decl.m_offset = offset; +} + +void FillPositionDecl(dp::BindingDecl & decl, uint8_t stride, uint8_t offset) +{ + FillCommonDecl(decl, "a_position", 3, stride, offset); +} + +void FillNormalDecl(dp::BindingDecl & decl, uint8_t stride, uint8_t offset) +{ + FillCommonDecl(decl, "a_normal", 2, stride, offset); +} + +void FillColorDecl(dp::BindingDecl & decl, uint8_t stride, uint8_t offset) +{ + FillCommonDecl(decl, "a_colorTexCoord", 2, stride, offset); +} + +void FillOutlineDecl(dp::BindingDecl & decl, uint8_t stride, uint8_t offset) +{ + FillCommonDecl(decl, "a_outlineColorTexCoord", 2, stride, offset); +} + +void FillMaskDecl(dp::BindingDecl & decl, uint8_t stride, uint8_t offset) +{ + FillCommonDecl(decl, "a_maskTexCoord", 2, stride, offset); +} + +} + +dp::BindingInfo const & StaticLabel::Vertex::GetBindingInfo() +{ + static unique_ptr info; + + if (info == nullptr) + { + info.reset(new dp::BindingInfo(5)); + uint8_t stride = sizeof(Vertex); + uint8_t offset = 0; + + FillPositionDecl(info->GetBindingDecl(0), stride, offset); + offset += sizeof(glsl::vec3); + FillNormalDecl(info->GetBindingDecl(1), stride, offset); + offset += sizeof(glsl::vec2); + FillColorDecl(info->GetBindingDecl(2), stride, offset); + offset += sizeof(glsl::vec2); + FillOutlineDecl(info->GetBindingDecl(3), stride, offset); + offset += sizeof(glsl::vec2); + FillMaskDecl(info->GetBindingDecl(4), stride, offset); + ASSERT_EQUAL(offset + sizeof(glsl::vec2), stride, ()); + } + + return *info.get(); +} + +StaticLabel::LabelResult::LabelResult() : m_state(gpu::TEXT_PROGRAM, dp::GLState::Gui) {} + +char const * StaticLabel::DefaultDelim = "\n"; + +void StaticLabel::CacheStaticText(string const & text, char const * delim, + dp::Anchor anchor, dp::FontDecl const & font, + ref_ptr mng, LabelResult & result) +{ + ASSERT(!text.empty(), ()); + + dp::TextureManager::TMultilineText textParts; + strings::Tokenize(text, delim, [&textParts](string const & part) + { + textParts.push_back(fribidi::log2vis(strings::MakeUniString(part))); + }); + + ASSERT(!textParts.empty(), ()); + + for (auto const & str : textParts) + result.m_alphabet.insert(str.begin(), str.end()); + + dp::TextureManager::TMultilineGlyphsBuffer buffers; + mng->GetGlyphRegions(textParts, buffers); + +#ifdef DEBUG + ASSERT_EQUAL(textParts.size(), buffers.size(), ()); + for (size_t i = 0; i < textParts.size(); ++i) + { + ASSERT(!textParts[i].empty(), ()); + ASSERT_EQUAL(textParts[i].size(), buffers[i].size(), ()); + } + + ref_ptr texture = buffers[0][0].GetTexture(); + for (dp::TextureManager::TGlyphsBuffer const & b : buffers) + { + for (dp::TextureManager::GlyphRegion const & reg : b) + ASSERT(texture == reg.GetTexture(), ()); + } +#endif + + dp::TextureManager::ColorRegion color; + dp::TextureManager::ColorRegion outline; + mng->GetColorRegion(font.m_color, color); + mng->GetColorRegion(font.m_outlineColor, outline); + ASSERT(color.GetTexture() == outline.GetTexture(), ()); + + glsl::vec2 colorTex = glsl::ToVec2(color.GetTexRect().Center()); + glsl::vec2 outlineTex = glsl::ToVec2(outline.GetTexRect().Center()); + + float textRatio = font.m_size * df::VisualParams::Instance().GetVisualScale() / BASE_GLYPH_HEIGHT; + + buffer_vector lineLengths; + lineLengths.reserve(buffers.size()); + + buffer_vector ranges; + ranges.reserve(buffers.size()); + + float fullHeight = 0.0; + float prevLineHeight = 0.0; + + buffer_vector & rb = result.m_buffer; + for (int i = static_cast(buffers.size()) - 1; i >= 0; --i) + { + dp::TextureManager::TGlyphsBuffer & regions = buffers[i]; + lineLengths.push_back(0.0f); + float & currentLineLength = lineLengths.back(); + + float depth = 0.0; + glsl::vec2 pen(0.0, -fullHeight); + prevLineHeight = 0.0; + for (size_t j = 0; j < regions.size(); ++j) + { + array normals, maskTex; + + dp::TextureManager::GlyphRegion const & glyph = regions[j]; + glsl::vec2 offsets = GetNormalsAndMask(glyph, textRatio, normals, maskTex); + + glsl::vec3 position = glsl::vec3(0.0, 0.0, depth); + + for (size_t v = 0; v < normals.size(); ++v) + rb.push_back(Vertex(position, pen + normals[v], colorTex, outlineTex, maskTex[v])); + + float const advance = glyph.GetAdvanceX() * textRatio; + prevLineHeight = max(prevLineHeight, offsets.y + glyph.GetPixelHeight() * textRatio); + pen += glsl::vec2(advance, glyph.GetAdvanceY() * textRatio); + + depth += 10.0f; + if (j == 0) + currentLineLength += (glyph.GetPixelSize().x * textRatio + offsets.x); + else + currentLineLength += advance; + + if (j == regions.size() - 1) + currentLineLength += offsets.x; + } + + ranges.push_back(rb.size()); + + fullHeight += prevLineHeight; + } + + float const halfHeight = 0.5f * fullHeight; + + float yOffset = halfHeight; + if (anchor & dp::Top) + yOffset = fullHeight; + else if (anchor & dp::Bottom) + yOffset = 0.0f; + + float maxLineLength = 0.0; + size_t startIndex = 0; + for (size_t i = 0; i < ranges.size(); ++i) + { + maxLineLength = max(lineLengths[i], maxLineLength); + float xOffset = -lineLengths[i] / 2.0f; + if (anchor & dp::Left) + xOffset = 0; + else if (anchor & dp::Right) + xOffset += xOffset; + + size_t endIndex = ranges[i]; + for (size_t i = startIndex; i < endIndex; ++i) + { + rb[i].m_normal = rb[i].m_normal + glsl::vec2(xOffset, yOffset); + result.m_boundRect.Add(glsl::ToPoint(rb[i].m_normal)); + } + + startIndex = endIndex; + } + + result.m_state.SetColorTexture(color.GetTexture()); + result.m_state.SetMaskTexture(buffers[0][0].GetTexture()); +} + +dp::BindingInfo const & MutableLabel::StaticVertex::GetBindingInfo() +{ + static unique_ptr info; + + if (info == nullptr) + { + info.reset(new dp::BindingInfo(3)); + + uint8_t stride = sizeof(StaticVertex); + uint8_t offset = 0; + + FillPositionDecl(info->GetBindingDecl(0), stride, offset); + offset += sizeof(glsl::vec3); + FillColorDecl(info->GetBindingDecl(1), stride, offset); + offset += sizeof(glsl::vec2); + FillOutlineDecl(info->GetBindingDecl(2), stride, offset); + ASSERT_EQUAL(offset + sizeof(glsl::vec2), stride, ()); + } + + return *info.get(); +} + +dp::BindingInfo const & MutableLabel::DynamicVertex::GetBindingInfo() +{ + static unique_ptr info; + + if (info == nullptr) + { + info.reset(new dp::BindingInfo(2, 1)); + uint8_t stride = sizeof(DynamicVertex); + uint8_t offset = 0; + + FillNormalDecl(info->GetBindingDecl(0), stride, offset); + offset += sizeof(glsl::vec2); + FillMaskDecl(info->GetBindingDecl(1), stride, offset); + ASSERT_EQUAL(offset + sizeof(glsl::vec2), stride, ()); + } + + return *info.get(); +} + +MutableLabel::PrecacheResult::PrecacheResult() : m_state(gpu::TEXT_PROGRAM, dp::GLState::Gui) {} + +MutableLabel::MutableLabel(dp::Anchor anchor) + : m_anchor(anchor) +{ +} + +void MutableLabel::SetMaxLength(uint16_t maxLength) +{ + m_maxLength = maxLength; +} + +ref_ptr MutableLabel::SetAlphabet(string const & alphabet, ref_ptr mng) +{ + strings::UniString str = strings::MakeUniString(alphabet + "."); + strings::UniString::iterator it = unique(str.begin(), str.end()); + str.resize(distance(str.begin(), it)); + + dp::TextureManager::TGlyphsBuffer buffer; + mng->GetGlyphRegions(str, buffer); + m_alphabet.reserve(buffer.size()); + + ASSERT_EQUAL(str.size(), buffer.size(), ()); + m_alphabet.resize(str.size()); + transform(str.begin(), str.end(), buffer.begin(), m_alphabet.begin(), + [this](strings::UniChar const & c, dp::TextureManager::GlyphRegion const & r) + { + return make_pair(c, r); + }); + + sort(m_alphabet.begin(), m_alphabet.end(), [](TAlphabetNode const & n1, TAlphabetNode const & n2) + { + return n1.first < n2.first; + }); + + return m_alphabet[0].second.GetTexture(); +} + +void MutableLabel::Precache(PrecacheParams const & params, PrecacheResult & result, + ref_ptr mng) +{ + SetMaxLength(params.m_maxLength); + result.m_state.SetMaskTexture(SetAlphabet(params.m_alphabet, mng)); + m_textRatio = params.m_font.m_size * df::VisualParams::Instance().GetVisualScale() / BASE_GLYPH_HEIGHT; + + dp::TextureManager::ColorRegion color; + dp::TextureManager::ColorRegion outlineColor; + + mng->GetColorRegion(params.m_font.m_color, color); + mng->GetColorRegion(params.m_font.m_outlineColor, outlineColor); + result.m_state.SetColorTexture(color.GetTexture()); + + glsl::vec2 colorTex = glsl::ToVec2(color.GetTexRect().Center()); + glsl::vec2 outlineTex = glsl::ToVec2(outlineColor.GetTexRect().Center()); + + size_t vertexCount = 4 * m_maxLength; + result.m_buffer.resize(vertexCount, + StaticVertex(glsl::vec3(0.0, 0.0, 0.0), colorTex, outlineTex)); + + float depth = 0.0f; + for (size_t i = 0; i < vertexCount; i += 4) + { + result.m_buffer[i + 0].m_position.z = depth; + result.m_buffer[i + 1].m_position.z = depth; + result.m_buffer[i + 2].m_position.z = depth; + result.m_buffer[i + 3].m_position.z = depth; + depth += 10.0f; + } + + uint32_t maxGlyphWidth = 0.0; + uint32_t maxGlyphHeight = 0.0; + for (auto node : m_alphabet) + { + dp::TextureManager::GlyphRegion const & reg = node.second; + m2::PointU pixelSize = reg.GetPixelSize(); + maxGlyphWidth = max(maxGlyphWidth, pixelSize.x); + maxGlyphHeight = max(maxGlyphHeight, pixelSize.y); + } + + result.m_maxPixelSize = m2::PointF(m_maxLength * maxGlyphWidth, maxGlyphHeight); +} + +void MutableLabel::SetText(LabelResult & result, string text) const +{ + if (text.size() > m_maxLength) + text = text.erase(m_maxLength - 3) + "..."; + + strings::UniString uniText = fribidi::log2vis(strings::MakeUniString(text)); + + float maxHeight = 0.0f; + float length = 0.0f; + glsl::vec2 pen = glsl::vec2(0.0, 0.0); + + for (size_t i = 0; i < uniText.size(); ++i) + { + strings::UniChar c = uniText[i]; + TAlphabet::const_iterator it = find_if(m_alphabet.begin(), m_alphabet.end(), [&c](TAlphabetNode const & n) + { + return n.first == c; + }); + + ASSERT(it != m_alphabet.end(), ()); + if (it != m_alphabet.end()) + { + array normals, maskTex; + dp::TextureManager::GlyphRegion const & glyph = it->second; + glsl::vec2 offsets = GetNormalsAndMask(glyph, m_textRatio, normals, maskTex); + + ASSERT_EQUAL(normals.size(), maskTex.size(), ()); + + for (size_t i = 0; i < normals.size(); ++i) + result.m_buffer.push_back(DynamicVertex(pen + normals[i], maskTex[i])); + + float const advance = glyph.GetAdvanceX() * m_textRatio; + length += advance + offsets.x; + pen += glsl::vec2(advance, glyph.GetAdvanceY() * m_textRatio); + maxHeight = max(maxHeight, offsets.y + glyph.GetPixelHeight() * m_textRatio); + } + } + + glsl::vec2 anchorModifyer = glsl::vec2(-length / 2.0f, maxHeight / 2.0f); + if (m_anchor & dp::Right) + anchorModifyer.x = -length; + else if (m_anchor & dp::Left) + anchorModifyer.x = 0; + + if (m_anchor & dp::Top) + anchorModifyer.y = maxHeight; + else if (m_anchor & dp::Bottom) + anchorModifyer.y = 0; + + for (DynamicVertex & v : result.m_buffer) + { + v.m_normal += anchorModifyer; + result.m_boundRect.Add(glsl::ToPoint(v.m_normal)); + } + + for (size_t i = result.m_buffer.size(); i < 4 * m_maxLength; ++i) + result.m_buffer.push_back(DynamicVertex(glsl::vec2(0.0, 0.0), glsl::vec2(0.0, 0.0))); +} + +m2::PointF MutableLabel::GetAvarageSize() const +{ + float h = 0, w = 0; + for (TAlphabetNode const & node : m_alphabet) + { + dp::TextureManager::GlyphRegion const & reg = node.second; + m2::PointF size = m2::PointF(reg.GetPixelSize()) * m_textRatio; + w += size.x; + h = max(h, size.y); + } + + w /= m_alphabet.size(); + + return m2::PointF(w, h); +} + +MutableLabelHandle::MutableLabelHandle(dp::Anchor anchor, m2::PointF const & pivot) + : TBase(anchor, pivot, m2::PointF::Zero()) + , m_textView(make_unique_dp(anchor)) + , m_isContentDirty(true) + , m_glyphsReady(false) +{} + +MutableLabelHandle::MutableLabelHandle(dp::Anchor anchor, m2::PointF const & pivot, + ref_ptr textures) + : TBase(anchor, pivot, m2::PointF::Zero()) + , m_textView(make_unique_dp(anchor)) + , m_isContentDirty(true) + , m_textureManager(textures) + , m_glyphsReady(false) +{} + +void MutableLabelHandle::GetAttributeMutation(ref_ptr mutator, + ScreenBase const & screen) const +{ + UNUSED_VALUE(screen); + + if (!m_isContentDirty) + return; + + m_isContentDirty = false; + MutableLabel::LabelResult result; + m_textView->SetText(result, m_content); + m_size = m2::PointF(result.m_boundRect.SizeX(), result.m_boundRect.SizeY()); + + size_t byteCount = result.m_buffer.size() * sizeof(MutableLabel::DynamicVertex); + + MutableLabel::DynamicVertex * dataPointer = + reinterpret_cast(mutator->AllocateMutationBuffer(byteCount)); + copy(result.m_buffer.begin(), result.m_buffer.end(), dataPointer); + + dp::BindingInfo const & binding = MutableLabel::DynamicVertex::GetBindingInfo(); + dp::OverlayHandle::TOffsetNode offsetNode = GetOffsetNode(binding.GetID()); + + dp::MutateNode mutateNode; + mutateNode.m_data = make_ref(dataPointer); + mutateNode.m_region = offsetNode.second; + mutator->AddMutation(offsetNode.first, mutateNode); +} + +bool MutableLabelHandle::Update(ScreenBase const & screen) +{ + if (!m_glyphsReady) + { + strings::UniString alphabetStr; + for (auto const & node : m_textView->GetAlphabet()) + alphabetStr.push_back(node.first); + + m_glyphsReady = m_textureManager->AreGlyphsReady(alphabetStr); + } + + if (!m_glyphsReady) + return false; + + return TBase::Update(screen); +} + +void MutableLabelHandle::SetTextureManager(ref_ptr textures) +{ + m_textureManager = textures; +} + +ref_ptr MutableLabelHandle::GetTextView() +{ + return make_ref(m_textView); +} + +void MutableLabelHandle::UpdateSize(m2::PointF const & size) { m_size = size; } + +void MutableLabelHandle::SetContent(string && content) +{ + if (m_content != content) + { + m_isContentDirty = true; + m_content = move(content); + } +} + +void MutableLabelHandle::SetContent(string const & content) +{ + if (m_content != content) + { + m_isContentDirty = true; + m_content = content; + } +} + +m2::PointF MutableLabelDrawer::Draw(Params const & params, ref_ptr mng, + dp::Batcher::TFlushFn const & flushFn) +{ + uint32_t vertexCount = dp::Batcher::VertexPerQuad * params.m_maxLength; + uint32_t indexCount = dp::Batcher::IndexPerQuad * params.m_maxLength; + + ASSERT(params.m_handleCreator != nullptr, ()); + drape_ptr handle = params.m_handleCreator(params.m_anchor, params.m_pivot); + + MutableLabel::PrecacheParams preCacheP; + preCacheP.m_alphabet = params.m_alphabet; + preCacheP.m_font = params.m_font; + preCacheP.m_maxLength = params.m_maxLength; + + MutableLabel::PrecacheResult staticData; + + handle->GetTextView()->Precache(preCacheP, staticData, mng); + handle->UpdateSize(handle->GetTextView()->GetAvarageSize()); + + ASSERT_EQUAL(vertexCount, staticData.m_buffer.size(), ()); + buffer_vector dynData; + dynData.resize(staticData.m_buffer.size()); + + dp::BindingInfo const & sBinding = MutableLabel::StaticVertex::GetBindingInfo(); + dp::BindingInfo const & dBinding = MutableLabel::DynamicVertex::GetBindingInfo(); + dp::AttributeProvider provider(2 /*stream count*/, staticData.m_buffer.size()); + provider.InitStream(0 /*stream index*/, sBinding, + make_ref(staticData.m_buffer.data())); + provider.InitStream(1 /*stream index*/, dBinding, make_ref(dynData.data())); + + { + dp::Batcher batcher(indexCount, vertexCount); + dp::SessionGuard guard(batcher, flushFn); + batcher.InsertListOfStrip(staticData.m_state, make_ref(&provider), + move(handle), dp::Batcher::VertexPerQuad); + } + + return staticData.m_maxPixelSize; +} + +StaticLabelHandle::StaticLabelHandle(ref_ptr textureManager, + dp::Anchor anchor, m2::PointF const & pivot, + m2::PointF const & size, + TAlphabet const & alphabet) + : TBase(anchor, pivot, size) + , m_alphabet(alphabet.begin(), alphabet.end()) + , m_textureManager(textureManager) + , m_glyphsReady(false) +{} + +bool StaticLabelHandle::Update(ScreenBase const & screen) +{ + if (!m_glyphsReady) + m_glyphsReady = m_textureManager->AreGlyphsReady(m_alphabet); + + if (!m_glyphsReady) + return false; + + return TBase::Update(screen); +} + +} diff --git a/drape_frontend/gui/gui_text.hpp b/drape_frontend/gui/gui_text.hpp new file mode 100644 index 0000000000..55e1d94973 --- /dev/null +++ b/drape_frontend/gui/gui_text.hpp @@ -0,0 +1,213 @@ +#pragma once + +#include "shape.hpp" + +#include "drape/binding_info.hpp" +#include "drape/drape_global.hpp" +#include "drape/glsl_types.hpp" +#include "drape/glstate.hpp" +#include "drape/texture_manager.hpp" + +#include "std/cstdint.hpp" +#include "std/unordered_set.hpp" +#include "std/utility.hpp" + +namespace gui +{ + +using TAlphabet = unordered_set; + +class StaticLabel +{ +public: + static char const * DefaultDelim; + struct Vertex + { + Vertex() = default; + Vertex(glsl::vec3 const & pos, glsl::vec2 const & normal, glsl::vec2 const & color, + glsl::vec2 const & outline, glsl::vec2 const & mask) + : m_position(pos) + , m_normal(normal) + , m_colorTexCoord(color) + , m_outlineColorTexCoord(outline) + , m_maskTexCoord(mask) + { + } + + static dp::BindingInfo const & GetBindingInfo(); + + glsl::vec3 m_position; + glsl::vec2 m_normal; + glsl::vec2 m_colorTexCoord; + glsl::vec2 m_outlineColorTexCoord; + glsl::vec2 m_maskTexCoord; + }; + + struct LabelResult + { + LabelResult(); + + dp::GLState m_state; + buffer_vector m_buffer; + m2::RectF m_boundRect; + TAlphabet m_alphabet; + }; + + static void CacheStaticText(string const & text, char const * delim, + dp::Anchor anchor, dp::FontDecl const & font, + ref_ptr mng, LabelResult & result); +}; + +class MutableLabel +{ +public: + struct StaticVertex + { + StaticVertex() = default; + StaticVertex(glsl::vec3 const & position, glsl::vec2 const & color, glsl::vec2 const & outlineColor) + : m_position(position) + , m_color(color) + , m_outline(outlineColor) + { + } + + static dp::BindingInfo const & GetBindingInfo(); + + glsl::vec3 m_position; + glsl::vec2 m_color; + glsl::vec2 m_outline; + }; + + struct DynamicVertex + { + DynamicVertex() = default; + DynamicVertex(glsl::vec2 const & normal, glsl::vec2 const & mask) + : m_normal(normal) + , m_maskTexCoord(mask) + { + } + + static dp::BindingInfo const & GetBindingInfo(); + + glsl::vec2 m_normal; + glsl::vec2 m_maskTexCoord; + }; + + MutableLabel(dp::Anchor anchor); + + struct PrecacheParams + { + string m_alphabet; + size_t m_maxLength; + dp::FontDecl m_font; + }; + + struct PrecacheResult + { + PrecacheResult(); + + dp::GLState m_state; + buffer_vector m_buffer; + m2::PointF m_maxPixelSize; + }; + + struct LabelResult + { + buffer_vector m_buffer; + m2::RectD m_boundRect; + }; + + void Precache(PrecacheParams const & params, PrecacheResult & result, + ref_ptr mng); + + void SetText(LabelResult & result, string text) const; + m2::PointF GetAvarageSize() const; + + using TAlphabetNode = pair; + using TAlphabet = vector; + + TAlphabet const & GetAlphabet() const { return m_alphabet; } + +private: + void SetMaxLength(uint16_t maxLength); + ref_ptr SetAlphabet(string const & alphabet, ref_ptr mng); + +private: + dp::Anchor m_anchor; + uint16_t m_maxLength = 0; + float m_textRatio = 0.0f; + + TAlphabet m_alphabet; +}; + +class MutableLabelHandle : public Handle +{ + using TBase = Handle; + +public: + MutableLabelHandle(dp::Anchor anchor, m2::PointF const & pivot); + + MutableLabelHandle(dp::Anchor anchor, m2::PointF const & pivot, + ref_ptr textures); + + void GetAttributeMutation(ref_ptr mutator, + ScreenBase const & screen) const override; + + bool Update(ScreenBase const & screen) override; + + ref_ptr GetTextView(); + void UpdateSize(m2::PointF const & size); + +protected: + void SetContent(string && content); + void SetContent(string const & content); + void SetTextureManager(ref_ptr textures); + +private: + drape_ptr m_textView; + mutable bool m_isContentDirty; + string m_content; + ref_ptr m_textureManager; + bool m_glyphsReady; +}; + +class MutableLabelDrawer +{ +public: + using TCreatoreResult = drape_ptr; + using THandleCreator = function; + + struct Params + { + dp::Anchor m_anchor; + dp::FontDecl m_font; + m2::PointF m_pivot; + string m_alphabet; + size_t m_maxLength; + THandleCreator m_handleCreator; + }; + + /// return maximum pixel size + static m2::PointF Draw(Params const & params, ref_ptr mng, + dp::Batcher::TFlushFn const & flushFn); +}; + +class StaticLabelHandle : public Handle +{ + using TBase = Handle; + +public: + StaticLabelHandle(ref_ptr textureManager, + dp::Anchor anchor, m2::PointF const & pivot, + m2::PointF const & size, + TAlphabet const & alphabet); + + bool Update(ScreenBase const & screen) override; + +private: + strings::UniString m_alphabet; + ref_ptr m_textureManager; + bool m_glyphsReady; +}; + +} diff --git a/drape_frontend/gui/layer_render.cpp b/drape_frontend/gui/layer_render.cpp new file mode 100644 index 0000000000..c75f1675fa --- /dev/null +++ b/drape_frontend/gui/layer_render.cpp @@ -0,0 +1,249 @@ +#include "compass.hpp" +#include "copyright_label.hpp" +#include "country_status.hpp" +#include "drape_gui.hpp" +#include "gui_text.hpp" +#include "layer_render.hpp" +#include "ruler.hpp" +#include "ruler_helper.hpp" + +#include "drape_frontend/visual_params.hpp" + +#include "drape/batcher.hpp" +#include "drape/render_bucket.hpp" + +#include "base/stl_add.hpp" + +#include "std/bind.hpp" + +namespace gui +{ + +LayerRenderer::~LayerRenderer() +{ + DestroyRenderers(); +} + +void LayerRenderer::Build(ref_ptr mng) +{ + for (TRenderers::value_type & r : m_renderers) + r.second->Build(mng); +} + +void LayerRenderer::Render(ref_ptr mng, ScreenBase const & screen) +{ + DrapeGui::GetRulerHelper().ResetTextDirtyFlag(); + DrapeGui::GetRulerHelper().Update(screen); + for (TRenderers::value_type & r : m_renderers) + r.second->Render(screen, mng); +} + +void LayerRenderer::Merge(ref_ptr other) +{ + for (TRenderers::value_type & r : other->m_renderers) + { + TRenderers::iterator it = m_renderers.find(r.first); + if (it != m_renderers.end()) + it->second = move(r.second); + else + m_renderers.insert(make_pair(r.first, move(r.second))); + } + + other->m_renderers.clear(); +} + +void LayerRenderer::SetLayout(TWidgetsLayoutInfo const & info) +{ + for (auto node : info) + { + auto renderer = m_renderers.find(node.first); + if (renderer != m_renderers.end()) + renderer->second->SetPivot(node.second); + } +} + +void LayerRenderer::DestroyRenderers() +{ + m_renderers.clear(); +} + +void LayerRenderer::AddShapeRenderer(EWidget widget, drape_ptr && shape) +{ + if (shape == nullptr) + return; + + VERIFY(m_renderers.insert(make_pair(widget, move(shape))).second, ()); +} + +bool LayerRenderer::OnTouchDown(m2::RectD const & touchArea) +{ + for (TRenderers::value_type & r : m_renderers) + { + m_activeOverlay = r.second->ProcessTapEvent(touchArea); + if (m_activeOverlay != nullptr) + { + m_activeOverlay->OnTapBegin(); + return true; + } + } + + return false; +} + +void LayerRenderer::OnTouchUp(m2::RectD const & touchArea) +{ + if (m_activeOverlay != nullptr) + { + if (m_activeOverlay->IsTapped(touchArea)) + m_activeOverlay->OnTap(); + + m_activeOverlay->OnTapEnd(); + m_activeOverlay = nullptr; + } +} + +void LayerRenderer::OnTouchCancel(m2::RectD const & touchArea) +{ + UNUSED_VALUE(touchArea); + if (m_activeOverlay != nullptr) + { + m_activeOverlay->OnTapEnd(); + m_activeOverlay = nullptr; + } +} + +namespace +{ + +class ScaleLabelHandle : public MutableLabelHandle +{ + using TBase = MutableLabelHandle; +public: + ScaleLabelHandle(ref_ptr textures) + : TBase(dp::LeftBottom, m2::PointF::Zero(), textures) + , m_scale(0) + { + SetIsVisible(true); + } + + bool Update(ScreenBase const & screen) override + { + int newScale = df::GetDrawTileScale(screen); + if (m_scale != newScale) + { + m_scale = newScale; + SetContent("Scale : " + strings::to_string(m_scale)); + } + + float vs = df::VisualParams::Instance().GetVisualScale(); + m2::PointF offset(10.0f * vs, 30.0f * vs); + + SetPivot(glsl::ToVec2(m2::PointF(screen.PixelRect().LeftBottom()) + offset)); + return TBase::Update(screen); + } + +private: + int m_scale; +}; + +void RegisterButtonHandler(CountryStatus::TButtonHandlers & handlers, + CountryStatusHelper::EButtonType buttonType) +{ + handlers[buttonType] = bind(&DrapeGui::CallOnButtonPressedHandler, + &DrapeGui::Instance(), buttonType); +} + +} // namespace + +drape_ptr LayerCacher::RecacheWidgets(TWidgetsInitInfo const & initInfo, + TWidgetsSizeInfo & sizeInfo, + ref_ptr textures) +{ + using TCacheShape = function renderer, ref_ptr textures)>; + static map cacheFunctions + { + make_pair(WIDGET_COMPASS, bind(&LayerCacher::CacheCompass, this, _1, _2, _3)), + make_pair(WIDGET_RULER, bind(&LayerCacher::CacheRuler, this, _1, _2, _3)), + make_pair(WIDGET_COPYRIGHT, bind(&LayerCacher::CacheCopyright, this, _1, _2, _3)), + make_pair(WIDGET_SCALE_LABEL, bind(&LayerCacher::CacheScaleLabel, this, _1, _2, _3)) + }; + + drape_ptr renderer = make_unique_dp(); + for (auto node : initInfo) + { + auto cacheFunction = cacheFunctions.find(node.first); + if (cacheFunction != cacheFunctions.end()) + sizeInfo[node.first] = cacheFunction->second(node.second, make_ref(renderer), textures); + } + + return renderer; +} + +drape_ptr LayerCacher::RecacheCountryStatus(ref_ptr textures) +{ + m2::PointF surfSize = DrapeGui::Instance().GetSurfaceSize(); + drape_ptr renderer = make_unique_dp(); + CountryStatus countryStatus = CountryStatus(Position(surfSize * 0.5, dp::Center)); + + CountryStatus::TButtonHandlers handlers; + RegisterButtonHandler(handlers, CountryStatusHelper::BUTTON_TYPE_MAP); + RegisterButtonHandler(handlers, CountryStatusHelper::BUTTON_TYPE_MAP_ROUTING); + RegisterButtonHandler(handlers, CountryStatusHelper::BUTTON_TRY_AGAIN); + + renderer->AddShapeRenderer(WIDGET_COUNTRY_STATUS, countryStatus.Draw(textures, handlers)); + return renderer; +} + +m2::PointF LayerCacher::CacheCompass(Position const & position, ref_ptr renderer, + ref_ptr textures) +{ + m2::PointF compassSize; + Compass compass = Compass(position); + drape_ptr shape = compass.Draw(compassSize, textures, bind(&DrapeGui::CallOnCompassTappedHandler, + &DrapeGui::Instance())); + + renderer->AddShapeRenderer(WIDGET_COMPASS, move(shape)); + + return compassSize; +} + +m2::PointF LayerCacher::CacheRuler(Position const & position, ref_ptr renderer, + ref_ptr textures) +{ + m2::PointF rulerSize; + renderer->AddShapeRenderer(WIDGET_RULER, + Ruler(position).Draw(rulerSize, textures)); + return rulerSize; +} + +m2::PointF LayerCacher::CacheCopyright(Position const & position, ref_ptr renderer, + ref_ptr textures) +{ + m2::PointF size; + renderer->AddShapeRenderer(WIDGET_COPYRIGHT, + CopyrightLabel(position).Draw(size, textures)); + + return size; +} + +m2::PointF LayerCacher::CacheScaleLabel(Position const & position, ref_ptr renderer, ref_ptr textures) +{ + MutableLabelDrawer::Params params; + params.m_alphabet = "Scale: 1234567890"; + params.m_maxLength = 10; + params.m_anchor = position.m_anchor; + params.m_font = DrapeGui::GetGuiTextFont(); + params.m_pivot = position.m_pixelPivot; + params.m_handleCreator = [textures](dp::Anchor, m2::PointF const &) + { + return make_unique_dp(textures); + }; + + drape_ptr scaleRenderer = make_unique_dp(); + m2::PointF size = MutableLabelDrawer::Draw(params, textures, bind(&ShapeRenderer::AddShape, scaleRenderer.get(), _1, _2)); + + renderer->AddShapeRenderer(WIDGET_SCALE_LABEL, move(scaleRenderer)); + return size; +} + +} diff --git a/drape_frontend/gui/layer_render.hpp b/drape_frontend/gui/layer_render.hpp new file mode 100644 index 0000000000..9a48aa1aa8 --- /dev/null +++ b/drape_frontend/gui/layer_render.hpp @@ -0,0 +1,66 @@ +#pragma once + +#include "skin.hpp" +#include "shape.hpp" + +#include "drape/gpu_program_manager.hpp" +#include "drape/texture_manager.hpp" + +#include "geometry/screenbase.hpp" + +#include "std/map.hpp" +#include "std/unique_ptr.hpp" + +namespace gui +{ + +class LayerRenderer +{ +public: + LayerRenderer() = default; + LayerRenderer(LayerRenderer && other) = delete; + LayerRenderer(LayerRenderer const & other) = delete; + + LayerRenderer & operator=(LayerRenderer && other) = delete; + LayerRenderer & operator=(LayerRenderer const & other) = delete; + + ~LayerRenderer(); + + void Build(ref_ptr mng); + void Render(ref_ptr mng, ScreenBase const & screen); + void Merge(ref_ptr other); + void SetLayout(gui::TWidgetsLayoutInfo const & info); + + bool OnTouchDown(m2::RectD const & touchArea); + void OnTouchUp(m2::RectD const & touchArea); + void OnTouchCancel(m2::RectD const & touchArea); + +private: + void DestroyRenderers(); + + friend class LayerCacher; + void AddShapeRenderer(EWidget widget, drape_ptr && shape); + +private: + typedef map > TRenderers; + TRenderers m_renderers; + + ref_ptr m_activeOverlay; +}; + +class LayerCacher +{ +public: + drape_ptr RecacheWidgets(TWidgetsInitInfo const & initInfo, + TWidgetsSizeInfo & sizeInfo, + ref_ptr textures); + drape_ptr RecacheCountryStatus(ref_ptr texMng); + +private: + m2::PointF CacheCompass(Position const & position, ref_ptr renderer, ref_ptr textures); + m2::PointF CacheRuler(Position const & position, ref_ptr renderer, ref_ptr textures); + m2::PointF CacheCopyright(Position const & position, ref_ptr renderer, ref_ptr textures); + m2::PointF CacheScaleLabel(Position const & position, ref_ptr renderer, ref_ptr textures); +}; + +} diff --git a/drape_frontend/gui/ruler.cpp b/drape_frontend/gui/ruler.cpp new file mode 100644 index 0000000000..bd16d3fefd --- /dev/null +++ b/drape_frontend/gui/ruler.cpp @@ -0,0 +1,254 @@ +#include "drape_gui.hpp" +#include "gui_text.hpp" +#include "ruler.hpp" +#include "ruler_helper.hpp" + +#include "drape_frontend/animation/show_hide_animation.hpp" + +#include "drape/glsl_func.hpp" +#include "drape/glsl_types.hpp" +#include "drape/shader_def.hpp" + +#include "std/bind.hpp" + +namespace gui +{ + +namespace +{ + +struct RulerVertex +{ + RulerVertex() = default; + RulerVertex(glsl::vec2 const & pos, glsl::vec2 const & normal, glsl::vec2 const & texCoord) + : m_position(pos) + , m_normal(normal) + , m_texCoord(texCoord) + { + } + + glsl::vec2 m_position; + glsl::vec2 m_normal; + glsl::vec2 m_texCoord; +}; + +dp::BindingInfo GetBindingInfo() +{ + dp::BindingInfo info(3); + uint8_t offset = 0; + offset += dp::FillDecl(0, "a_position", info, offset); + offset += dp::FillDecl(1, "a_normal", info, offset); + offset += dp::FillDecl(2, "a_colorTexCoords", info, offset); + + return info; +} + +template +class BaseRulerHandle : public TBase +{ +public: + BaseRulerHandle(dp::Anchor anchor, m2::PointF const & pivot, bool isAppearing) + : TBase(anchor, pivot) + , m_isAppearing(isAppearing) + , m_isVisibleAtEnd(true) + , m_animation(false, 0.4) + { + } + + bool Update(ScreenBase const & screen) + { + RulerHelper & helper = DrapeGui::GetRulerHelper(); + + TBase::SetIsVisible(true); + bool isVisible = helper.IsVisible(screen); + if (!isVisible) + { + m_animation.HideAnimated(); + m_isVisibleAtEnd = false; + } + else + { + if (helper.IsTextDirty()) + { + m_isAppearing = !m_isAppearing; + if (m_isAppearing) + { + m_animation.ShowAnimated(); + m_isVisibleAtEnd = true; + } + else + { + m_animation.HideAnimated(); + m_isVisibleAtEnd = false; + } + } + } + + bool const result = TBase::Update(screen); + UpdateImpl(screen, helper); + + if (m_animation.IsFinished()) + TBase::SetIsVisible(m_isVisibleAtEnd); + + return result; + } + +protected: + virtual void UpdateImpl(ScreenBase const & /*screen*/, RulerHelper const & /*helper*/) {} + + bool IsAppearing() const { return m_isAppearing; } + float GetOpacity() const { return m_animation.GetT(); } + +private: + bool m_isAppearing; + bool m_isVisibleAtEnd; + df::ShowHideAnimation m_animation; +}; + +class RulerHandle : public BaseRulerHandle +{ + using TBase = BaseRulerHandle; + +public: + RulerHandle(dp::Anchor anchor, m2::PointF const & pivot, bool appearing) + : TBase(anchor, pivot, appearing) + {} + +private: + void UpdateImpl(ScreenBase const & screen, RulerHelper const & helper) override + { + if (IsVisible()) + { + m_size = m2::PointF(helper.GetRulerPixelLength(), 2 * helper.GetRulerHalfHeight()); + if (IsAppearing()) + m_uniforms.SetFloatValue("u_length", helper.GetRulerPixelLength()); + m_uniforms.SetFloatValue("u_position", m_pivot.x, m_pivot.y); + m_uniforms.SetFloatValue("u_opacity", GetOpacity()); + } + } +}; + +class RulerTextHandle : public BaseRulerHandle +{ + using TBase = BaseRulerHandle; + +public: + RulerTextHandle(dp::Anchor anchor, m2::PointF const & pivot, bool isAppearing, + ref_ptr textures) + : TBase(anchor, pivot, isAppearing) + , m_firstUpdate(true) + { + SetTextureManager(textures); + } + + bool Update(ScreenBase const & screen) override + { + SetIsVisible(DrapeGui::GetRulerHelper().IsVisible(screen)); + if (IsVisible() && (DrapeGui::GetRulerHelper().IsTextDirty() || m_firstUpdate)) + { + SetContent(DrapeGui::GetRulerHelper().GetRulerText()); + m_firstUpdate = false; + } + + return TBase::Update(screen); + } + + void SetPivot(glsl::vec2 const & pivot) override + { + RulerHelper & helper = DrapeGui::GetRulerHelper(); + TBase::SetPivot(pivot + glsl::vec2(0.0, helper.GetVerticalTextOffset() - helper.GetRulerHalfHeight())); + } + +protected: + void UpdateImpl(ScreenBase const & /*screen*/, RulerHelper const & /*helper*/) override + { + if (IsVisible()) + m_uniforms.SetFloatValue("u_opacity", GetOpacity()); + } + +private: + bool m_firstUpdate; +}; + +} + +drape_ptr Ruler::Draw(m2::PointF & size, ref_ptr tex) const +{ + ShapeControl control; + size = m2::PointF::Zero(); + DrawRuler(size, control, tex, true); + DrawRuler(size, control, tex, false); + DrawText(size, control, tex, true); + DrawText(size, control, tex, false); + + drape_ptr renderer = make_unique_dp(); + renderer->AddShapeControl(move(control)); + return renderer; +} + +void Ruler::DrawRuler(m2::PointF & size, ShapeControl & control, ref_ptr tex, bool isAppearing) const +{ + buffer_vector data; + + dp::TextureManager::ColorRegion reg; + tex->GetColorRegion(DrapeGui::GetGuiTextFont().m_color, reg); + + glsl::vec2 texCoord = glsl::ToVec2(reg.GetTexRect().Center()); + float h = DrapeGui::GetRulerHelper().GetRulerHalfHeight(); + size += m2::PointF(DrapeGui::GetRulerHelper().GetMaxRulerPixelLength(), 2.0 * h); + + glsl::vec2 normals[] = + { + glsl::vec2(-1.0, 0.0), + glsl::vec2(1.0, 0.0), + }; + + dp::Anchor anchor = m_position.m_anchor; + if (anchor & dp::Left) + normals[0] = glsl::vec2(0.0, 0.0); + else if (anchor & dp::Right) + normals[1] = glsl::vec2(0.0, 0.0); + + data.push_back(RulerVertex(glsl::vec2(0.0, h), normals[0], texCoord)); + data.push_back(RulerVertex(glsl::vec2(0.0, -h), normals[0], texCoord)); + data.push_back(RulerVertex(glsl::vec2(0.0, h), normals[1], texCoord)); + data.push_back(RulerVertex(glsl::vec2(0.0, -h), normals[1], texCoord)); + + dp::GLState state(gpu::RULER_PROGRAM, dp::GLState::Gui); + state.SetColorTexture(reg.GetTexture()); + + dp::AttributeProvider provider(1, 4); + provider.InitStream(0, GetBindingInfo(), make_ref(data.data())); + + { + dp::Batcher batcher(dp::Batcher::IndexPerQuad, dp::Batcher::VertexPerQuad); + dp::SessionGuard guard(batcher, bind(&ShapeControl::AddShape, &control, _1, _2)); + batcher.InsertTriangleStrip(state, make_ref(&provider), + make_unique_dp(m_position.m_anchor, m_position.m_pixelPivot, isAppearing)); + } +} + +void Ruler::DrawText(m2::PointF & size, ShapeControl & control, ref_ptr tex, bool isAppearing) const +{ + string alphabet; + size_t maxTextLength; + RulerHelper & helper = DrapeGui::GetRulerHelper(); + helper.GetTextInitInfo(alphabet, maxTextLength); + + MutableLabelDrawer::Params params; + params.m_anchor = + static_cast((m_position.m_anchor & (dp::Right | dp::Left)) | dp::Bottom); + params.m_alphabet = alphabet; + params.m_maxLength = maxTextLength; + params.m_font = DrapeGui::GetGuiTextFont(); + params.m_pivot = m_position.m_pixelPivot + m2::PointF(0.0, helper.GetVerticalTextOffset()); + params.m_handleCreator = [isAppearing, tex](dp::Anchor anchor, m2::PointF const & pivot) + { + return make_unique_dp(anchor, pivot, isAppearing, tex); + }; + + m2::PointF textSize = MutableLabelDrawer::Draw(params, tex, bind(&ShapeControl::AddShape, &control, _1, _2)); + size.y += (textSize.y + abs(helper.GetVerticalTextOffset())); +} + +} diff --git a/drape_frontend/gui/ruler.hpp b/drape_frontend/gui/ruler.hpp new file mode 100644 index 0000000000..d9cce025ae --- /dev/null +++ b/drape_frontend/gui/ruler.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "shape.hpp" + +namespace gui +{ + +class Ruler : public Shape +{ +public: + Ruler(gui::Position const & position) : Shape(position) {} + drape_ptr Draw(m2::PointF & size, ref_ptr tex) const; + +private: + void DrawRuler(m2::PointF & size, ShapeControl & control, ref_ptr tex, bool isAppearing) const; + void DrawText(m2::PointF & size, ShapeControl & control, ref_ptr tex, bool isAppearing) const; +}; + +} diff --git a/drape_frontend/gui/ruler_helper.cpp b/drape_frontend/gui/ruler_helper.cpp new file mode 100644 index 0000000000..c720e4eda2 --- /dev/null +++ b/drape_frontend/gui/ruler_helper.cpp @@ -0,0 +1,276 @@ +#include "drape_frontend/gui/ruler_helper.hpp" +#include "drape_frontend/gui/drape_gui.hpp" + +#include "drape_frontend/visual_params.hpp" + +#include "platform/settings.hpp" +#include "platform/measurement_utils.hpp" + +#include "indexer/mercator.hpp" +#include "geometry/screenbase.hpp" + +#include "base/macros.hpp" + +#include "std/algorithm.hpp" +#include "std/numeric.hpp" +#include "std/iterator.hpp" + +namespace gui +{ + +namespace +{ + +static int const MinPixelWidth = 60; +static int const MinMetersWidth = 10; +static int const MaxMetersWidth = 1000000; + +static int const MinUnitValue = -1; +static int const MaxUnitValue = numeric_limits::max() - 1; +static int const InvalidUnitValue = MaxUnitValue + 1; + +struct UnitValue +{ + char const * m_s; + int m_i; +}; + +UnitValue g_arrFeets[] = { + { "10 ft", 10 }, + { "20 ft", 20 }, + { "50 ft", 50 }, + { "100 ft", 100 }, + { "200 ft", 200 }, + { "0.1 mi", 528 }, + { "0.2 mi", 528 * 2 }, + { "0.5 mi", 528 * 5 }, + { "1 mi", 5280 }, + { "2 mi", 2 * 5280 }, + { "5 mi", 5 * 5280 }, + { "10 mi", 10 * 5280 }, + { "20 mi", 20 * 5280 }, + { "50 mi", 50 * 5280 }, + { "100 mi", 100 * 5280 }, + { "200 mi", 200 * 5280 }, + { "500 mi", 500 * 5280 } +}; + +UnitValue g_arrYards[] = { + { "50 yd", 50 }, + { "100 yd", 100 }, + { "200 yd", 200 }, + { "500 yd", 500 }, + { "0.5 mi", 1760 / 2 }, + { "1 mi", 1760 }, + { "2 mi", 2 * 1760 }, + { "5 mi", 5 * 1760 }, + { "10 mi", 10 * 1760 }, + { "20 mi", 20 * 1760 }, + { "50 mi", 50 * 1760 }, + { "100 mi", 100 * 1760 }, + { "200 mi", 200 * 1760 }, + { "500 mi", 500 * 1760 } +}; + +UnitValue g_arrMetres[] = { + { "1 m", 1 }, + { "2 m", 2 }, + { "5 m", 5 }, + { "10 m", 10 }, + { "20 m", 20 }, + { "50 m", 50 }, + { "100 m", 100 }, + { "200 m", 200 }, + { "500 m", 500 }, + { "1 km", 1000 }, + { "2 km", 2000 }, + { "5 km", 5000 }, + { "10 km", 10000 }, + { "20 km", 20000 }, + { "50 km", 50000 }, + { "100 km", 100000 }, + { "200 km", 200000 }, + { "500 km", 500000 }, + { "1000 km", 1000000 } +}; + +double identity(double val) +{ + return val; +} + +int const VISIBLE_RULER_BOTTOM_SCALE = 5; + +} + +RulerHelper::RulerHelper() + : m_pixelLength(0.0) + , m_rangeIndex(InvalidUnitValue) + , m_isTextDirty(false) + , m_dirtyTextRequested(false) +{ +} + +void RulerHelper::Update(ScreenBase const & screen) +{ + m2::PointD pivot = screen.PixelRect().Center(); + int const minPxWidth = my::rounds(MinPixelWidth * df::VisualParams::Instance().GetVisualScale()); + m2::PointD pt1 = screen.PtoG(pivot); + m2::PointD pt0 = screen.PtoG(pivot - m2::PointD(minPxWidth, 0)); + + double const distanceInMetres = MercatorBounds::DistanceOnEarth(pt0, pt1); + + // convert metres to units for calculating m_metresDiff + double metersDiff = CalcMetresDiff(distanceInMetres); + + bool const higherThanMax = metersDiff > MaxMetersWidth; + bool const lessThanMin = metersDiff < MinMetersWidth; + m_pixelLength = minPxWidth; + + if (higherThanMax) + m_pixelLength = minPxWidth * 3 / 2; + else if (!lessThanMin) + { + double const a = ang::AngleTo(pt1, pt0); + pt0 = MercatorBounds::GetSmPoint(pt1, cos(a) * metersDiff, sin(a) * metersDiff); + + m_pixelLength = my::rounds(pivot.Length(screen.GtoP(pt0))); + } + + int drawScale = df::GetDrawTileScale(screen); + if (m_currentDrawScale < VISIBLE_RULER_BOTTOM_SCALE && + drawScale >= VISIBLE_RULER_BOTTOM_SCALE) + { + SetTextDirty(); + } + + m_currentDrawScale = drawScale; +} + +bool RulerHelper::IsVisible(ScreenBase const & screen) const +{ + DrapeGui & gui = DrapeGui::Instance(); + return !gui.IsCopyrightActive() && df::GetDrawTileScale(screen) >= VISIBLE_RULER_BOTTOM_SCALE; +} + +float RulerHelper::GetRulerHalfHeight() const +{ + float const kRulerHalfHeight = 1.0f; + return kRulerHalfHeight * df::VisualParams::Instance().GetVisualScale(); +} + +float RulerHelper::GetRulerPixelLength() const +{ + return m_pixelLength; +} + +float RulerHelper::GetMaxRulerPixelLength() const +{ + return MinPixelWidth * 3.0 / 2.0; +} + +int RulerHelper::GetVerticalTextOffset() const +{ + return -5 * df::VisualParams::Instance().GetVisualScale(); +} + +bool RulerHelper::IsTextDirty() const +{ + return m_isTextDirty; +} + +string const & RulerHelper::GetRulerText() const +{ + m_dirtyTextRequested = true; + return m_rulerText; +} + +void RulerHelper::ResetTextDirtyFlag() +{ + if (m_dirtyTextRequested) + m_isTextDirty = false; +} + +void RulerHelper::GetTextInitInfo(string & alphabet, size_t & size) const +{ + set symbols; + size_t result = 0; + auto const functor = [&result, &symbols](UnitValue const & v) + { + size_t stringSize = strlen(v.m_s); + result = max(result, stringSize); + for (int i = 0; i < stringSize; ++i) + symbols.insert(v.m_s[i]); + }; + + for_each(begin(g_arrFeets), end(g_arrFeets), functor); + for_each(begin(g_arrMetres), end(g_arrMetres), functor); + for_each(begin(g_arrYards), end(g_arrYards), functor); + + for_each(begin(symbols), end(symbols), [&alphabet](char c) + { + alphabet.push_back(c); + }); + alphabet.append("<>"); + + size = result + 2; // add 2 char for symbols "< " and "> " +} + +double RulerHelper::CalcMetresDiff(double value) +{ + UnitValue * arrU = g_arrMetres; + int count = ARRAY_SIZE(g_arrMetres); + + typedef double (*ConversionFn)(double); + ConversionFn conversionFn = &identity; + + Settings::Units units = Settings::Metric; + Settings::Get("Units", units); + + if (units == Settings::Foot) + { + arrU = g_arrFeets; + count = ARRAY_SIZE(g_arrFeets); + conversionFn = &MeasurementUtils::MetersToFeet; + } + + int prevUnitRange = m_rangeIndex; + double result = 0.0; + double v = conversionFn(value); + if (arrU[0].m_i > v) + { + m_rangeIndex = MinUnitValue; + m_rulerText = string("< ") + arrU[0].m_s; + result = MinMetersWidth - 1.0; + } + else if (arrU[count-1].m_i <= v) + { + m_rangeIndex = MaxUnitValue; + m_rulerText = string("> ") + arrU[count-1].m_s; + result = MaxMetersWidth + 1.0; + } + else + for (int i = 0; i < count; ++i) + { + if (arrU[i].m_i > v) + { + m_rangeIndex = i; + result = arrU[i].m_i / conversionFn(1.0); + m_rulerText = arrU[i].m_s; + break; + } + } + + if (m_rangeIndex != prevUnitRange) + SetTextDirty(); + + return result; +} + +void RulerHelper::SetTextDirty() +{ + m_dirtyTextRequested = false; + m_isTextDirty = true; +} + +} diff --git a/drape_frontend/gui/ruler_helper.hpp b/drape_frontend/gui/ruler_helper.hpp new file mode 100644 index 0000000000..a1a484df63 --- /dev/null +++ b/drape_frontend/gui/ruler_helper.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include "drape_frontend/animation/show_hide_animation.hpp" + +#include "std/string.hpp" + +class ScreenBase; + +namespace gui +{ + +class RulerHelper +{ +public: + RulerHelper(); + + void Update(ScreenBase const & screen); + bool IsVisible(ScreenBase const & screen) const; + + float GetRulerHalfHeight() const; + float GetRulerPixelLength() const; + float GetMaxRulerPixelLength() const; + int GetVerticalTextOffset() const; + bool IsTextDirty() const; + string const & GetRulerText() const; + void ResetTextDirtyFlag(); + void GetTextInitInfo(string & alphabet, size_t & size) const; + +private: + double CalcMetresDiff(double value); + void SetTextDirty(); + +private: + float m_pixelLength; + int m_rangeIndex; + string m_rulerText; + bool m_isTextDirty; + mutable bool m_dirtyTextRequested; + int m_currentDrawScale = 0; +}; + +} diff --git a/drape_frontend/gui/shape.cpp b/drape_frontend/gui/shape.cpp new file mode 100644 index 0000000000..32dbb86665 --- /dev/null +++ b/drape_frontend/gui/shape.cpp @@ -0,0 +1,200 @@ +#include "shape.hpp" + +#include "drape_frontend/visual_params.hpp" + +#include "drape/glsl_func.hpp" +#include "drape/utils/projection.hpp" + +#include "base/logging.hpp" + +namespace gui +{ +Handle::Handle(dp::Anchor anchor, const m2::PointF & pivot, const m2::PointF & size) + : dp::OverlayHandle(FeatureID(), anchor, 0) + , m_pivot(glsl::ToVec2(pivot)), m_size(size) +{ +} + +bool Handle::Update(ScreenBase const & screen) +{ + using namespace glsl; + + if (IsVisible()) + { + m_uniforms.SetMatrix4x4Value("modelView", + value_ptr(transpose(translate(mat4(), vec3(m_pivot, 0.0))))); + m_uniforms.SetFloatValue("u_opacity", 1.0); + + auto const & params = df::VisualParams::Instance().GetGlyphVisualParams(); + m_uniforms.SetFloatValue("u_contrastGamma", params.m_contrast, params.m_gamma); + m_uniforms.SetFloatValue("u_isOutlinePass", 0.0f); + } + + return true; +} + +bool Handle::IndexesRequired() const +{ + return false; +} + +m2::RectD Handle::GetPixelRect(const ScreenBase & screen) const +{ + return m2::RectD(); +} + +void Handle::GetPixelShape(const ScreenBase & screen, dp::OverlayHandle::Rects & rects) const +{ + UNUSED_VALUE(screen); + UNUSED_VALUE(rects); +} + +bool TappableHandle::IsTapped(m2::RectD const & touchArea) const +{ + if (!IsVisible()) + return false; + + if (m_anchor == dp::Anchor::Center) + { + m2::RectD rect(m_pivot.x - m_size.x * 0.5, m_pivot.y - m_size.y * 0.5, + m_pivot.x + m_size.x * 0.5, m_pivot.y + m_size.y * 0.5); + return rect.Intersect(touchArea); + } + else + { + LOG(LWARNING, ("Tapping on an overlay is not supported. Anchor type = ", m_anchor)); + } + + return false; +} + +ShapeRenderer::~ShapeRenderer() +{ + ForEachShapeInfo([](ShapeControl::ShapeInfo & info) + { + info.Destroy(); + }); +} + +void ShapeRenderer::Build(ref_ptr mng) +{ + ForEachShapeInfo([mng](ShapeControl::ShapeInfo & info) mutable + { + info.m_buffer->Build(mng->GetProgram(info.m_state.GetProgramIndex())); + }); +} + +void ShapeRenderer::Render(ScreenBase const & screen, ref_ptr mng) +{ + array m; + m2::RectD const & pxRect = screen.PixelRect(); + dp::MakeProjection(m, 0.0f, pxRect.SizeX(), pxRect.SizeY(), 0.0f); + + dp::UniformValuesStorage uniformStorage; + uniformStorage.SetMatrix4x4Value("projection", m.data()); + + ForEachShapeInfo( + [&uniformStorage, &screen, mng](ShapeControl::ShapeInfo & info) mutable + { + if (!info.m_handle->Update(screen)) + return; + + if (!info.m_handle->IsVisible()) + return; + + ref_ptr prg = mng->GetProgram(info.m_state.GetProgramIndex()); + prg->Bind(); + dp::ApplyState(info.m_state, prg); + dp::ApplyUniforms(info.m_handle->GetUniforms(), prg); + dp::ApplyUniforms(uniformStorage, prg); + + if (info.m_handle->HasDynamicAttributes()) + { + dp::AttributeBufferMutator mutator; + ref_ptr mutatorRef = make_ref(&mutator); + info.m_handle->GetAttributeMutation(mutatorRef, screen); + info.m_buffer->ApplyMutation(nullptr, mutatorRef); + } + + info.m_buffer->Render(); + }); +} + +void ShapeRenderer::AddShape(dp::GLState const & state, drape_ptr && bucket) +{ + m_shapes.push_back(ShapeControl()); + m_shapes.back().AddShape(state, move(bucket)); +} + +void ShapeRenderer::AddShapeControl(ShapeControl && control) +{ + m_shapes.push_back(move(control)); +} + +void ShapeRenderer::SetPivot(m2::PointF const & pivot) +{ + for (ShapeControl & control : m_shapes) + { + for (ShapeControl::ShapeInfo & info : control.m_shapesInfo) + info.m_handle->SetPivot(glsl::ToVec2(pivot)); + } +} + +void ShapeRenderer::ForEachShapeControl(TShapeControlEditFn const & fn) +{ + for_each(m_shapes.begin(), m_shapes.end(), fn); +} + +void ShapeRenderer::ForEachShapeInfo(ShapeRenderer::TShapeInfoEditFn const & fn) +{ + ForEachShapeControl([&fn](ShapeControl & shape) + { + for_each(shape.m_shapesInfo.begin(), shape.m_shapesInfo.end(), fn); + }); +} + +ref_ptr ShapeRenderer::ProcessTapEvent(m2::RectD const & touchArea) +{ + ref_ptr resultHandle = nullptr; + ForEachShapeInfo([&resultHandle, &touchArea](ShapeControl::ShapeInfo & shapeInfo) + { + if (shapeInfo.m_handle->IsTapped(touchArea)) + resultHandle = make_ref(shapeInfo.m_handle); + }); + + return resultHandle; +} + +ShapeControl::ShapeInfo::ShapeInfo(dp::GLState const & state, + drape_ptr && buffer, + drape_ptr && handle) + : m_state(state), m_buffer(move(buffer)), m_handle(move(handle)) +{ +} + +void ShapeControl::ShapeInfo::Destroy() +{ + m_handle.reset(); + m_buffer.reset(); +} + +void ShapeControl::AddShape(dp::GLState const & state, drape_ptr && bucket) +{ + ASSERT(bucket->GetOverlayHandlesCount() == 1, ()); + + drape_ptr handle = bucket->PopOverlayHandle(); + ASSERT(dynamic_cast(handle.get()) != nullptr, ()); + + m_shapesInfo.push_back(ShapeInfo()); + ShapeInfo & info = m_shapesInfo.back(); + info.m_state = state; + info.m_buffer = bucket->MoveBuffer(); + info.m_handle = drape_ptr(static_cast(handle.release())); +} + +void ArrangeShapes(ref_ptr renderer, ShapeRenderer::TShapeControlEditFn const & fn) +{ + renderer->ForEachShapeControl(fn); +} + +} diff --git a/drape_frontend/gui/shape.hpp b/drape_frontend/gui/shape.hpp new file mode 100644 index 0000000000..55db04fc7e --- /dev/null +++ b/drape_frontend/gui/shape.hpp @@ -0,0 +1,121 @@ +#pragma once + +#include "skin.hpp" + +#include "drape/batcher.hpp" +#include "drape/glsl_types.hpp" +#include "drape/glstate.hpp" +#include "drape/gpu_program_manager.hpp" +#include "drape/overlay_handle.hpp" +#include "drape/texture_manager.hpp" +#include "drape/vertex_array_buffer.hpp" + +namespace gui +{ + +class Handle : public dp::OverlayHandle +{ +public: + Handle(dp::Anchor anchor, m2::PointF const & pivot, m2::PointF const & size = m2::PointF::Zero()); + + dp::UniformValuesStorage const & GetUniforms() const { return m_uniforms; } + + bool Update(ScreenBase const & screen) override; + + virtual bool IsTapped(m2::RectD const & touchArea) const { return false; } + virtual void OnTapBegin(){} + virtual void OnTap(){} + virtual void OnTapEnd(){} + + virtual bool IndexesRequired() const override; + virtual m2::RectD GetPixelRect(ScreenBase const & screen) const override; + virtual void GetPixelShape(ScreenBase const & screen, Rects & rects) const override; + + m2::PointF GetSize() const { return m_size; } + virtual void SetPivot(glsl::vec2 const & pivot) { m_pivot = pivot; } + +protected: + dp::UniformValuesStorage m_uniforms; + glsl::vec2 m_pivot; + mutable m2::PointF m_size; +}; + +class TappableHandle : public Handle +{ +public: + TappableHandle(dp::Anchor anchor, m2::PointF const & pivot, m2::PointF const & size) + : Handle(anchor, pivot, size) + {} + + bool IsTapped(m2::RectD const & touchArea) const override; +}; + +struct ShapeControl +{ + ShapeControl() = default; + ShapeControl(ShapeControl const & other) = delete; + ShapeControl(ShapeControl && other) = default; + + ShapeControl & operator=(ShapeControl const & other) = delete; + ShapeControl & operator=(ShapeControl && other) = default; + + struct ShapeInfo + { + ShapeInfo() : m_state(0, dp::GLState::Gui) {} + ShapeInfo(dp::GLState const & state, drape_ptr && buffer, + drape_ptr && handle); + + void Destroy(); + + dp::GLState m_state; + drape_ptr m_buffer; + drape_ptr m_handle; + }; + + void AddShape(dp::GLState const & state, drape_ptr && bucket); + + vector m_shapesInfo; +}; + +class ShapeRenderer final +{ +public: + using TShapeControlEditFn = function; + + ~ShapeRenderer(); + + void Build(ref_ptr mng); + void Render(ScreenBase const & screen, ref_ptr mng); + void AddShape(dp::GLState const & state, drape_ptr && bucket); + void AddShapeControl(ShapeControl && control); + + void SetPivot(m2::PointF const & pivot); + + ref_ptr ProcessTapEvent(m2::RectD const & touchArea); + +private: + friend void ArrangeShapes(ref_ptr, + ShapeRenderer::TShapeControlEditFn const &); + void ForEachShapeControl(TShapeControlEditFn const & fn); + + using TShapeInfoEditFn = function; + void ForEachShapeInfo(TShapeInfoEditFn const & fn); + +private: + vector m_shapes; +}; + +void ArrangeShapes(ref_ptr renderer, + ShapeRenderer::TShapeControlEditFn const & fn); + +class Shape +{ +public: + Shape(gui::Position const & position) : m_position(position) {} + using TTapHandler = function; + +protected: + gui::Position m_position; +}; + +} diff --git a/drape_frontend/gui/skin.cpp b/drape_frontend/gui/skin.cpp new file mode 100644 index 0000000000..5d44f296a7 --- /dev/null +++ b/drape_frontend/gui/skin.cpp @@ -0,0 +1,300 @@ +#include "skin.hpp" + +#include "platform/platform.hpp" +#include "coding/parse_xml.hpp" +#include "base/string_utils.hpp" +#include "std/function.hpp" + +namespace gui +{ + +namespace +{ + +bool IsSimple(dp::Anchor anchor) +{ + return anchor >= 0 && anchor <= 8; +} + +bool IsAnchor(dp::Anchor anchor) +{ + return anchor >= 0 && anchor <= 10; +} + +dp::Anchor ParseValueAnchor(string const & value) +{ + if (value == "center") + return dp::Center; + else if (value == "left") + return dp::Left; + else if (value == "right") + return dp::Right; + else if (value == "top") + return dp::Top; + else if (value == "bottom") + return dp::Bottom; + else + ASSERT(false, ()); + + return dp::Center; +} + +dp::Anchor MergeAnchors(dp::Anchor src, dp::Anchor dst) +{ + ASSERT(IsSimple(dst), ()); + ASSERT(IsSimple(src), ()); + dp::Anchor result = static_cast(src | dst); + ASSERT(IsAnchor(result), ()); + return result; +} + +float ParseFloat(string const & v) +{ + double d = 0.0f; + VERIFY(strings::to_double(v, d), ()); + return d; +} + +class ResolverParser +{ +public: + enum class Element + { + Empty, + Anchor, + Relative, + Offset + }; + + ResolverParser() + : m_element(Element::Empty) {} + + void Parse(string const & attr, string const & value) + { + ASSERT(m_element != Element::Empty, ()); + + if (attr == "x") + { + ASSERT(m_element == Element::Offset, ()); + m_resolver.SetOffsetX(ParseFloat(value)); + } + else if (attr == "y") + { + ASSERT(m_element == Element::Offset, ()); + m_resolver.SetOffsetY(ParseFloat(value)); + } + else if (attr == "vertical" || attr == "horizontal") + { + if (m_element == Element::Anchor) + m_resolver.AddAnchor(ParseValueAnchor(value)); + else if (m_element == Element::Relative) + m_resolver.AddRelative(ParseValueAnchor(value)); + else + ASSERT(false, ()); + } + } + + void Reset() + { + m_resolver = PositionResolver(); + } + + PositionResolver const & GetResolver() const + { + return m_resolver; + } + + void SetElement(Element e) + { + m_element = e; + } + +private: + Element m_element; + PositionResolver m_resolver; +}; + +class SkinLoader +{ +public: + explicit SkinLoader(map > & skin) + : m_skin(skin) {} + + bool Push(string const & element) + { + if (m_inElement == false) + { + if (element == "root") + return true; + + m_inElement = true; + if (element == "ruler") + m_currentElement = WIDGET_RULER; + else if (element == "compass") + m_currentElement = WIDGET_COMPASS; + else if (element == "copyright") + m_currentElement = WIDGET_COPYRIGHT; + else + ASSERT(false, ()); + } + else if (m_inConfiguration == false) + { + if (element == "portrait" || element == "landscape") + m_inConfiguration = true; + else + ASSERT(false, ()); + } + else + { + if (element == "anchor") + m_parser.SetElement(ResolverParser::Element::Anchor); + else if (element == "relative") + m_parser.SetElement(ResolverParser::Element::Relative); + else if (element == "offset") + m_parser.SetElement(ResolverParser::Element::Offset); + else + ASSERT(false, ()); + } + + return true; + } + + void Pop(string const & element) + { + if (element == "anchor" || element == "relative" || element == "offset") + m_parser.SetElement(ResolverParser::Element::Empty); + else if (element == "portrait") + { + m_skin[m_currentElement].first = m_parser.GetResolver(); + m_parser.Reset(); + m_inConfiguration = false; + } + else if (element == "landscape") + { + m_skin[m_currentElement].second = m_parser.GetResolver(); + m_parser.Reset(); + m_inConfiguration = false; + } + else if (element == "ruler" || element == "compass" || + element == "copyright" || element == "country_status") + { + m_inElement = false; + } + } + + void AddAttr(string const & attribute, string const & value) + { + m_parser.Parse(attribute, value); + } + + void CharData(string const &) {} + +private: + bool m_inConfiguration = false; + bool m_inElement = false; + + EWidget m_currentElement = WIDGET_RULER; + ResolverParser m_parser; + + map > & m_skin; +}; + +} + +Position PositionResolver::Resolve(int w, int h, double vs) const +{ + float resultX = w / 2.0f; + float resultY = h / 2.0f; + m2::PointF offset = m_offset * vs; + + if (m_resolveAnchor & dp::Left) + resultX = offset.x; + else if (m_resolveAnchor & dp::Right) + resultX = w - offset.x; + else + resultX += offset.x; + + if (m_resolveAnchor & dp::Top) + resultY = offset.y; + else if (m_resolveAnchor & dp::Bottom) + resultY = h - offset.y; + else + resultY += offset.y; + + return Position(m2::PointF(resultX, resultY), m_elementAnchor); +} + +void PositionResolver::AddAnchor(dp::Anchor anchor) +{ + m_elementAnchor = MergeAnchors(m_elementAnchor, anchor); +} + +void PositionResolver::AddRelative(dp::Anchor anchor) +{ + m_resolveAnchor = MergeAnchors(m_resolveAnchor, anchor); +} + +void PositionResolver::SetOffsetX(float x) +{ + m_offset.x = x; +} + +void PositionResolver::SetOffsetY(float y) +{ + m_offset.y = y; +} + +Skin::Skin(ReaderPtr const & reader, float visualScale) + : m_visualScale(visualScale) +{ + SkinLoader loader(m_resolvers); + ReaderSource > source(reader); + if (!ParseXML(source, loader)) + LOG(LERROR, ("Error parsing gui skin")); +} + +Position Skin::ResolvePosition(EWidget name) +{ + // check that name have only one bit + ASSERT((static_cast(name) & (static_cast(name) - 1)) == 0, ()); + TResolversPair const & resolvers = m_resolvers[name]; + PositionResolver const & resolver = (m_displayWidth < m_displayHeight) ? resolvers.first : resolvers.second; + return resolver.Resolve(m_displayWidth, m_displayHeight, m_visualScale); +} + +void Skin::Resize(int w, int h) +{ + m_displayWidth = w; + m_displayHeight = h; +} + +ReaderPtr ResolveGuiSkinFile(string const & deviceType) +{ + Platform & pl = GetPlatform(); + ReaderPtr reader; + try + { + reader = pl.GetReader("resources-default/" + deviceType + ".ui"); + } + catch(FileAbsentException & e) + { + LOG(LINFO, ("Gui skin for : ", deviceType ,"not found")); + } + + if (reader.GetPtr() == 0) + { + try + { + reader = pl.GetReader("resources-default/default.ui"); + } + catch(FileAbsentException & e) + { + LOG(LINFO, ("Default gui skin not found")); + throw e; + } + } + + return reader; +} + +} diff --git a/drape_frontend/gui/skin.hpp b/drape_frontend/gui/skin.hpp new file mode 100644 index 0000000000..d49a369858 --- /dev/null +++ b/drape_frontend/gui/skin.hpp @@ -0,0 +1,90 @@ +#pragma once + +#include "drape/drape_global.hpp" +#include "geometry/point2d.hpp" +#include "coding/reader.hpp" + +#include "std/map.hpp" + +namespace gui +{ + +enum EWidget +{ + WIDGET_RULER = 0x1, + WIDGET_COMPASS = 0x2, + WIDGET_COPYRIGHT = 0x4, + WIDGET_SCALE_LABEL = 0x8, + /// WIDGET_COUNTRY_STATUS - controlled by rendering kernel. Don't use it in platform code + WIDGET_COUNTRY_STATUS = 0x8000 +}; + +struct Position +{ + Position() : m_pixelPivot(m2::PointF::Zero()), m_anchor(dp::Center) {} + explicit Position(dp::Anchor anchor) + : m_pixelPivot(m2::PointF::Zero()) + , m_anchor(anchor) {} + + Position(m2::PointF const & pt, dp::Anchor anchor) + : m_pixelPivot(pt) + , m_anchor(anchor) {} + + m2::PointF m_pixelPivot; + dp::Anchor m_anchor; +}; + +/// TWidgetsInitInfo - static information about gui widgets (geometry align) +using TWidgetsInitInfo = map; +/// TWidgetsLayoutInfo - dynamic info. Pivot point of each widget in pixel coordinates +using TWidgetsLayoutInfo = map; +/// TWidgetsSizeInfo - info about widget pixel sizes +using TWidgetsSizeInfo = TWidgetsLayoutInfo; + +class PositionResolver +{ +public: + Position Resolve(int w, int h, double vs) const; + void AddAnchor(dp::Anchor anchor); + void AddRelative(dp::Anchor anchor); + void SetOffsetX(float x); + void SetOffsetY(float y); + +private: + dp::Anchor m_elementAnchor = dp::Center; + dp::Anchor m_resolveAnchor = dp::Center; + m2::PointF m_offset = m2::PointF::Zero(); +}; + +class Skin +{ +public: + Skin(ReaderPtr const & reader, float visualScale); + + /// @param name - must be single flag, not combination + Position ResolvePosition(EWidget name); + void Resize(int w, int h); + int GetWidth() const { return m_displayWidth; } + int GetHeight() const { return m_displayHeight; } + + template + void ForEach(ToDo todo) + { + for (auto node : m_resolvers) + todo(node.first, ResolvePosition(node.first)); + } + +private: + /// TResolversPair.first - Portrait (when weight < height) + /// TResolversPair.second - Landscape (when weight >= height) + typedef pair TResolversPair; + map m_resolvers; + + int m_displayWidth; + int m_displayHeight; + float m_visualScale; +}; + +ReaderPtr ResolveGuiSkinFile(string const & deviceType); + +} diff --git a/drape_frontend/kinetic_scroller.cpp b/drape_frontend/kinetic_scroller.cpp new file mode 100644 index 0000000000..571ec46602 --- /dev/null +++ b/drape_frontend/kinetic_scroller.cpp @@ -0,0 +1,137 @@ +#include "kinetic_scroller.hpp" +#include "visual_params.hpp" + +#include "indexer/scales.hpp" + +#include "base/logging.hpp" + +namespace df +{ + +double const kKineticDuration = 0.6; +double const kKineticFadeoff = 1.5; +double const kKineticThreshold = 50.0; +double const kKineticAcceleration = 0.4; +double const kKineticMaxSpeedStart = 1000.0; // pixels per second +double const kKineticMaxSpeedEnd = 10000.0; // pixels per second + +double CalculateKineticMaxSpeed(ScreenBase const & modelView) +{ + double const kMinZoom = 1.0; + double const kMaxZoom = scales::UPPER_STYLE_SCALE + 1.0; + double const zoomLevel = my::clamp(fabs(log(modelView.GetScale()) / log(2.0)), kMinZoom, kMaxZoom); + double const lerpCoef = 1.0 - ((zoomLevel - kMinZoom) / (kMaxZoom - kMinZoom)); + + return (kKineticMaxSpeedStart * lerpCoef + kKineticMaxSpeedEnd * (1.0 - lerpCoef)) * VisualParams::Instance().GetVisualScale(); +} + +class KineticScrollAnimation : public BaseModelViewAnimation +{ +public: + // startRect - mercator visible on screen rect in moment when user release fingers. + // direction - mercator space direction of moving. length(direction) - mercator distance on wich map will be offset. + KineticScrollAnimation(m2::AnyRectD const & startRect, m2::PointD const & direction, double duration) + : BaseModelViewAnimation(duration) + , m_targetCenter(startRect.GlobalCenter() + direction) + , m_angle(startRect.Angle()) + , m_localRect(startRect.GetLocalRect()) + , m_direction(direction) + { + } + + ModelViewAnimationType GetType() const override { return ModelViewAnimationType::KineticScroll; } + + m2::AnyRectD GetCurrentRect(ScreenBase const & screen) const override + { + // Current position = target position - amplutide * e ^ (elapsed / duration). + // We calculate current position not based on start position, but based on target position. + return m2::AnyRectD(m_targetCenter - m_direction * exp(-kKineticFadeoff * GetT()), m_angle, m_localRect); + } + + m2::AnyRectD GetTargetRect(ScreenBase const & screen) const override + { + return GetCurrentRect(screen); + } + +private: + m2::PointD m_targetCenter; + ang::AngleD m_angle; + m2::RectD m_localRect; + m2::PointD m_direction; +}; + +KineticScroller::KineticScroller() + : m_lastTimestamp(-1.0) + , m_direction(m2::PointD::Zero()) +{ +} + +void KineticScroller::InitGrab(ScreenBase const & modelView, double timeStamp) +{ + ASSERT_LESS(m_lastTimestamp, 0.0, ()); + m_lastTimestamp = timeStamp; + m_lastRect = modelView.GlobalRect(); +} + +bool KineticScroller::IsActive() const +{ + return m_lastTimestamp > 0.0; +} + +void KineticScroller::GrabViewRect(ScreenBase const & modelView, double timeStamp) +{ + // In KineitcScroller we store m_direction in mixed state. + // Direction in mercator space, and length(m_direction) in pixel space. + // We need same reaction on different zoom levels, and should calculate velocity on pixel space. + ASSERT_GREATER(m_lastTimestamp, 0.0, ()); + ASSERT_GREATER(timeStamp, m_lastTimestamp, ()); + double elapsed = timeStamp - m_lastTimestamp; + + m2::PointD lastCenter = m_lastRect.GlobalCenter(); + m2::PointD currentCenter = modelView.GlobalRect().GlobalCenter(); + double pxDeltaLength = (modelView.GtoP(currentCenter) - modelView.GtoP(lastCenter)).Length(); + m2::PointD delta = (currentCenter - lastCenter); + if (!delta.IsAlmostZero()) + { + delta = delta.Normalize(); + + // Velocity on pixels. + double const v = min(pxDeltaLength / elapsed, CalculateKineticMaxSpeed(modelView)); + + // At this point length(m_direction) already in pixel space, and delta normalized. + m_direction = delta * v; + } + else + { + m_direction = m2::PointD::Zero(); + } + + m_lastTimestamp = timeStamp; + m_lastRect = modelView.GlobalRect(); +} + +void KineticScroller::CancelGrab() +{ + m_lastTimestamp = -1; + m_direction = m2::PointD::Zero(); +} + +unique_ptr KineticScroller::CreateKineticAnimation(ScreenBase const & modelView) +{ + static double kVelocityThreshold = kKineticThreshold * VisualParams::Instance().GetVisualScale(); + if (m_direction.Length() < kVelocityThreshold) + return unique_ptr(); + + // Before we start animation we have to convert length(m_direction) from pixel space to mercator space. + m2::PointD center = m_lastRect.GlobalCenter(); + double const offset = (modelView.PtoG(modelView.GtoP(center) + m_direction) - center).Length(); + double const glbLength = kKineticAcceleration * offset; + m2::PointD const glbDirection = m_direction.Normalize() * glbLength; + m2::PointD const targetCenter = center + glbDirection; + if (!df::GetWorldRect().IsPointInside(targetCenter)) + return unique_ptr(); + + return unique_ptr(new KineticScrollAnimation(m_lastRect, glbDirection, kKineticDuration)); +} + +} // namespace df diff --git a/drape_frontend/kinetic_scroller.hpp b/drape_frontend/kinetic_scroller.hpp new file mode 100644 index 0000000000..832dcb8d05 --- /dev/null +++ b/drape_frontend/kinetic_scroller.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "animation/model_view_animation.hpp" + +#include "geometry/any_rect2d.hpp" + +namespace df +{ + +class KineticScroller +{ +public: + KineticScroller(); + + void InitGrab(ScreenBase const & modelView, double timeStamp); + bool IsActive() const; + void GrabViewRect(ScreenBase const & modelView, double timeStamp); + void CancelGrab(); + unique_ptr CreateKineticAnimation(ScreenBase const & modelView); + +private: + double m_lastTimestamp; + m2::AnyRectD m_lastRect; + m2::PointD m_direction; +}; + +} // namespace df diff --git a/drape_frontend/line_shape.cpp b/drape_frontend/line_shape.cpp index a233dd9216..b5f8073841 100644 --- a/drape_frontend/line_shape.cpp +++ b/drape_frontend/line_shape.cpp @@ -1,304 +1,533 @@ #include "drape_frontend/line_shape.hpp" +#include "drape_frontend/line_shape_helper.hpp" + #include "drape/utils/vertex_decl.hpp" #include "drape/glsl_types.hpp" #include "drape/glsl_func.hpp" #include "drape/shader_def.hpp" #include "drape/attribute_provider.hpp" -#include "drape/glstate.hpp" #include "drape/batcher.hpp" #include "drape/texture_manager.hpp" +#include "base/logging.hpp" + namespace df { namespace { - float const SEGMENT = 0.0f; - float const CAP = 1.0f; - float const LEFT_WIDTH = 1.0f; - float const RIGHT_WIDTH = -1.0f; - size_t const TEX_BEG_IDX = 0; - size_t const TEX_END_IDX = 1; - struct TexDescription +class TextureCoordGenerator +{ +public: + TextureCoordGenerator(dp::TextureManager::StippleRegion const & region) + : m_region(region) + , m_maskLength(static_cast(m_region.GetMaskPixelLength())) + {} + + glsl::vec4 GetTexCoordsByDistance(float distance) const { - float m_globalLength; - glsl::vec2 m_texCoord; + return GetTexCoords(distance / m_maskLength); + } + + glsl::vec4 GetTexCoords(float offset) const + { + m2::RectF const & texRect = m_region.GetTexRect(); + return glsl::vec4(offset, texRect.minX(), texRect.SizeX(), texRect.Center().y); + } + + float GetMaskLength() const + { + return m_maskLength; + } + + dp::TextureManager::StippleRegion const & GetRegion() const + { + return m_region; + } + +private: + dp::TextureManager::StippleRegion const m_region; + float const m_maskLength; +}; + +struct BaseBuilderParams +{ + dp::TextureManager::ColorRegion m_color; + float m_pxHalfWidth; + float m_depth; + dp::LineCap m_cap; + dp::LineJoin m_join; +}; + +template +class BaseLineBuilder : public ILineShapeInfo +{ +public: + BaseLineBuilder(BaseBuilderParams const & params, size_t geomsSize, size_t joinsSize) + : m_params(params) + , m_colorCoord(glsl::ToVec2(params.m_color.GetTexRect().Center())) + { + m_geometry.reserve(geomsSize); + m_joinGeom.reserve(joinsSize); + } + + void GetTexturingInfo(float const globalLength, int & steps, float & maskSize) + { + UNUSED_VALUE(globalLength); + UNUSED_VALUE(steps); + UNUSED_VALUE(maskSize); + } + + dp::BindingInfo const & GetBindingInfo() override + { + return TVertex::GetBindingInfo(); + } + + ref_ptr GetLineData() override + { + return make_ref(m_geometry.data()); + } + + size_t GetLineSize() override + { + return m_geometry.size(); + } + + ref_ptr GetJoinData() override + { + return make_ref(m_joinGeom.data()); + } + + size_t GetJoinSize() override + { + return m_joinGeom.size(); + } + + float GetHalfWidth() + { + return m_params.m_pxHalfWidth; + } + + dp::BindingInfo const & GetCapBindingInfo() override + { + return GetBindingInfo(); + } + + dp::GLState GetCapState() override + { + return GetState(); + } + + ref_ptr GetCapData() override + { + return ref_ptr(); + } + + size_t GetCapSize() override + { + return 0; + } + + float GetSide(bool isLeft) const + { + return isLeft ? 1.0 : -1.0; + } + +protected: + vector const & GenerateCap(LineSegment const & segment, EPointType type, + float sign, bool isStart) + { + m_normalBuffer.clear(); + m_normalBuffer.reserve(24); + + GenerateCapNormals(m_params.m_cap, + segment.m_leftNormals[type], + segment.m_rightNormals[type], + sign * segment.m_tangent, + GetHalfWidth(), isStart, m_normalBuffer); + + return m_normalBuffer; + } + + vector const & GenerateJoin(LineSegment const & seg1, LineSegment const & seg2) + { + m_normalBuffer.clear(); + m_normalBuffer.reserve(24); + + glsl::vec2 n1 = seg1.m_hasLeftJoin[EndPoint] ? seg1.m_leftNormals[EndPoint] : + seg1.m_rightNormals[EndPoint]; + + glsl::vec2 n2 = seg2.m_hasLeftJoin[StartPoint] ? seg2.m_leftNormals[StartPoint] : + seg2.m_rightNormals[StartPoint]; + + float widthScalar = seg1.m_hasLeftJoin[EndPoint] ? seg1.m_rightWidthScalar[EndPoint].x : + seg1.m_leftWidthScalar[EndPoint].x; + + GenerateJoinNormals(m_params.m_join, n1, n2, GetHalfWidth(), + seg1.m_hasLeftJoin[EndPoint], widthScalar, m_normalBuffer); + + return m_normalBuffer; + } + +protected: + using V = TVertex; + using TGeometryBuffer = vector; + + TGeometryBuffer m_geometry; + TGeometryBuffer m_joinGeom; + + vector m_normalBuffer; + + BaseBuilderParams m_params; + glsl::vec2 const m_colorCoord; +}; + +class SolidLineBuilder : public BaseLineBuilder +{ + using TBase = BaseLineBuilder; + using TNormal = gpu::LineVertex::TNormal; + + struct CapVertex + { + using TPosition = gpu::LineVertex::TPosition; + using TNormal = gpu::LineVertex::TNormal; + using TTexCoord = gpu::LineVertex::TTexCoord; + + CapVertex() {} + CapVertex(TPosition const & pos, TNormal const & normal, TTexCoord const & color) + : m_position(pos) + , m_normal(normal) + , m_color(color) + { + } + + TPosition m_position; + TNormal m_normal; + TTexCoord m_color; }; - class TextureCoordGenerator + using TCapBuffer = vector; + +public: + using BuilderParams = BaseBuilderParams; + + SolidLineBuilder(BuilderParams const & params, size_t pointsInSpline) + : TBase(params, pointsInSpline * 2, (pointsInSpline - 2) * 8) + {} + + dp::GLState GetState() override { - public: - TextureCoordGenerator(float const baseGtoPScale) - : m_baseGtoPScale(baseGtoPScale) - , m_basePtoGScale(1.0f / baseGtoPScale) + dp::GLState state(gpu::LINE_PROGRAM, dp::GLState::GeometryLayer); + state.SetColorTexture(m_params.m_color.GetTexture()); + return state; + } + + dp::BindingInfo const & GetCapBindingInfo() override + { + if (m_params.m_cap == dp::ButtCap) + return TBase::GetCapBindingInfo(); + + static unique_ptr s_capInfo; + if (s_capInfo == nullptr) { + dp::BindingFiller filler(3); + filler.FillDecl("a_position"); + filler.FillDecl("a_normal"); + filler.FillDecl("a_colorTexCoords"); + + s_capInfo.reset(new dp::BindingInfo(filler.m_info)); } - void SetRegion(dp::TextureManager::StippleRegion const & region, bool isSolid) - { - m_isSolid = isSolid; - m_region = region; - if (!m_isSolid) - { - m_maskLength = static_cast(m_region.GetMaskPixelLength()); - m_patternLength = static_cast(m_region.GetPatternPixelLength()); - } - } + return *s_capInfo; + } - bool GetTexCoords(TexDescription & desc) - { - if (m_isSolid) - { - desc.m_texCoord = glsl::ToVec2(m_region.GetTexRect().Center()); - return true; - } + dp::GLState GetCapState() override + { + if (m_params.m_cap == dp::ButtCap) + return TBase::GetCapState(); - float const pxLength = desc.m_globalLength * m_baseGtoPScale; - float const maskRest = m_maskLength - m_pxCursor; + dp::GLState state(gpu::CAP_JOIN_PROGRAM, dp::GLState::GeometryLayer); + state.SetColorTexture(m_params.m_color.GetTexture()); + state.SetDepthFunction(gl_const::GLLess); + return state; + } - m2::RectF const & texRect = m_region.GetTexRect(); - if (maskRest < pxLength) - { - desc.m_globalLength = maskRest * m_basePtoGScale; - desc.m_texCoord = glsl::vec2(texRect.maxX(), texRect.Center().y); - return false; - } + ref_ptr GetCapData() override + { + return make_ref(m_capGeometry.data()); + } - float texX = texRect.minX() + ((m_pxCursor + pxLength) / m_maskLength) * texRect.SizeX(); - m_pxCursor = fmodf(m_pxCursor + pxLength, m_patternLength); + size_t GetCapSize() override + { + return m_capGeometry.size(); + } - desc.m_texCoord = glsl::vec2(texX, texRect.Center().y); - return true; - } + void SubmitVertex(glsl::vec3 const & pivot, glsl::vec2 const & normal, bool isLeft) + { + float const halfWidth = GetHalfWidth(); + m_geometry.emplace_back(V(pivot, TNormal(halfWidth * normal, halfWidth * GetSide(isLeft)), m_colorCoord)); + } - private: - float const m_baseGtoPScale; - float const m_basePtoGScale; - dp::TextureManager::StippleRegion m_region; - float m_maskLength = 0.0f; - float m_patternLength = 0.0f; - bool m_isSolid = true; - float m_pxCursor = 0.0f; + void SubmitJoin(glsl::vec2 const & pos) + { + if (m_params.m_join == dp::RoundJoin) + CreateRoundCap(pos); + } + + void SubmitCap(glsl::vec2 const & pos) + { + if (m_params.m_cap != dp::ButtCap) + CreateRoundCap(pos); + } + +private: + void CreateRoundCap(glsl::vec2 const & pos) + { + m_capGeometry.reserve(8); + + float const radius = GetHalfWidth(); + + m_capGeometry.push_back(CapVertex(CapVertex::TPosition(pos, m_params.m_depth), + CapVertex::TNormal(-radius, radius, radius), + CapVertex::TTexCoord(m_colorCoord))); + m_capGeometry.push_back(CapVertex(CapVertex::TPosition(pos, m_params.m_depth), + CapVertex::TNormal(-radius, -radius, radius), + CapVertex::TTexCoord(m_colorCoord))); + m_capGeometry.push_back(CapVertex(CapVertex::TPosition(pos, m_params.m_depth), + CapVertex::TNormal(radius, radius, radius), + CapVertex::TTexCoord(m_colorCoord))); + m_capGeometry.push_back(CapVertex(CapVertex::TPosition(pos, m_params.m_depth), + CapVertex::TNormal(radius, -radius, radius), + CapVertex::TTexCoord(m_colorCoord))); + } + +private: + TCapBuffer m_capGeometry; +}; + +class DashedLineBuilder : public BaseLineBuilder +{ + using TBase = BaseLineBuilder; + using TNormal = gpu::LineVertex::TNormal; + +public: + struct BuilderParams : BaseBuilderParams + { + dp::TextureManager::StippleRegion m_stipple; + float m_glbHalfWidth; + float m_baseGtoP; }; -} -LineShape::LineShape(m2::SharedSpline const & spline, - LineViewParams const & params) + DashedLineBuilder(BuilderParams const & params, size_t pointsInSpline) + : TBase(params, pointsInSpline * 8, (pointsInSpline - 2) * 8) + , m_texCoordGen(params.m_stipple) + , m_baseGtoPScale(params.m_baseGtoP) + {} + + void GetTexturingInfo(float const globalLength, int & steps, float & maskSize) + { + float const pixelLen = globalLength * m_baseGtoPScale; + steps = static_cast((pixelLen + m_texCoordGen.GetMaskLength() - 1) / m_texCoordGen.GetMaskLength()); + maskSize = globalLength / steps; + } + + dp::GLState GetState() override + { + dp::GLState state(gpu::DASHED_LINE_PROGRAM, dp::GLState::GeometryLayer); + state.SetColorTexture(m_params.m_color.GetTexture()); + state.SetMaskTexture(m_texCoordGen.GetRegion().GetTexture()); + return state; + } + + void SubmitVertex(glsl::vec3 const & pivot, glsl::vec2 const & normal, bool isLeft, float offsetFromStart) + { + float const halfWidth = GetHalfWidth(); + m_geometry.emplace_back(V(pivot, TNormal(halfWidth * normal, halfWidth * GetSide(isLeft)), + m_colorCoord, m_texCoordGen.GetTexCoordsByDistance(offsetFromStart))); + } + +private: + TextureCoordGenerator m_texCoordGen; + float const m_baseGtoPScale; +}; + +} // namespace + +LineShape::LineShape(m2::SharedSpline const & spline, LineViewParams const & params) : m_params(params) , m_spline(spline) { ASSERT_GREATER(m_spline->GetPath().size(), 1, ()); } -void LineShape::Draw(dp::RefPointer batcher, dp::RefPointer textures) const +template +void LineShape::Construct(TBuilder & builder) const +{ + ASSERT(false, ("No implementation")); +} + +// Specialization optimized for dashed lines. +template <> +void LineShape::Construct(DashedLineBuilder & builder) const { - typedef gpu::LineVertex LV; - buffer_vector geometry; vector const & path = m_spline->GetPath(); + ASSERT_GREATER(path.size(), 1, ()); - dp::TextureManager::ColorRegion colorRegion; - textures->GetColorRegion(m_params.m_color, colorRegion); - glsl::vec2 colorCoord(glsl::ToVec2(colorRegion.GetTexRect().Center())); - - TextureCoordGenerator texCoordGen(m_params.m_baseGtoPScale); - dp::TextureManager::StippleRegion maskRegion; - if (m_params.m_pattern.empty()) - textures->GetStippleRegion(dp::TextureManager::TStipplePattern{1}, maskRegion); - else - textures->GetStippleRegion(m_params.m_pattern, maskRegion); - - texCoordGen.SetRegion(maskRegion, m_params.m_pattern.empty()); - float const halfWidth = m_params.m_width / 2.0f; - float const glbHalfWidth = halfWidth / m_params.m_baseGtoPScale; - bool generateCap = m_params.m_cap != dp::ButtCap; - - auto const calcTangentAndNormals = [&halfWidth](glsl::vec2 const & pt0, glsl::vec2 const & pt1, - glsl::vec2 & tangent, glsl::vec2 & leftNormal, - glsl::vec2 & rightNormal) - { - tangent = glsl::normalize(pt1 - pt0); - leftNormal = halfWidth * glsl::vec2(tangent.y, -tangent.x); - rightNormal = -leftNormal; - }; - - float capType = m_params.m_cap == dp::RoundCap ? CAP : SEGMENT; - - glsl::vec2 leftSegment(SEGMENT, LEFT_WIDTH); - glsl::vec2 rightSegment(SEGMENT, RIGHT_WIDTH); - - TexDescription texCoords[2]; - - if (generateCap) - { - glsl::vec2 startPoint = glsl::ToVec2(path[0]); - glsl::vec2 endPoint = glsl::ToVec2(path[1]); - glsl::vec2 tangent, leftNormal, rightNormal; - calcTangentAndNormals(startPoint, endPoint, tangent, leftNormal, rightNormal); - tangent = -halfWidth * tangent; - - glsl::vec3 pivot = glsl::vec3(startPoint, m_params.m_depth); - glsl::vec2 leftCap(capType, LEFT_WIDTH); - glsl::vec2 rightCap(capType, RIGHT_WIDTH); - - texCoords[TEX_BEG_IDX].m_globalLength = 0.0; - texCoords[TEX_END_IDX].m_globalLength = glbHalfWidth; - - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_BEG_IDX]), ()); - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_END_IDX]), ()); - - geometry.push_back(LV(pivot, leftNormal + tangent, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, leftCap)); - geometry.push_back(LV(pivot, rightNormal + tangent, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, rightCap)); - geometry.push_back(LV(pivot, leftNormal, colorCoord, texCoords[TEX_END_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(pivot, rightNormal, colorCoord, texCoords[TEX_END_IDX].m_texCoord, rightSegment)); - } - - glsl::vec2 prevPoint; - glsl::vec2 prevLeftNormal; - glsl::vec2 prevRightNormal; - + // build geometry for (size_t i = 1; i < path.size(); ++i) { - glsl::vec2 startPoint = glsl::ToVec2(path[i - 1]); - glsl::vec2 endPoint = glsl::ToVec2(path[i]); + if (path[i].EqualDxDy(path[i - 1], 1.0E-5)) + continue; + + glsl::vec2 const p1 = glsl::vec2(path[i - 1].x, path[i - 1].y); + glsl::vec2 const p2 = glsl::vec2(path[i].x, path[i].y); glsl::vec2 tangent, leftNormal, rightNormal; - calcTangentAndNormals(startPoint, endPoint, tangent, leftNormal, rightNormal); + CalculateTangentAndNormals(p1, p2, tangent, leftNormal, rightNormal); - glsl::vec3 startPivot = glsl::vec3(startPoint, m_params.m_depth); - glsl::vec3 endPivot = glsl::vec3(endPoint, m_params.m_depth); + // calculate number of steps to cover line segment + float const initialGlobalLength = glsl::length(p2 - p1); + int steps = 1; + float maskSize = initialGlobalLength; + builder.GetTexturingInfo(initialGlobalLength, steps, maskSize); - // Create join beetween current segment and previous - if (i > 1) + // generate vertices + float currentSize = 0; + glsl::vec3 currentStartPivot = glsl::vec3(p1, m_params.m_depth); + for (int step = 0; step < steps; step++) { - glsl::vec2 zeroNormal(0.0, 0.0); - glsl::vec2 prevForming, nextForming; - if (glsl::dot(prevLeftNormal, tangent) < 0) - { - prevForming = prevLeftNormal; - nextForming = leftNormal; - } - else - { - prevForming = prevRightNormal; - nextForming = rightNormal; - } + currentSize += maskSize; + glsl::vec3 const newPivot = glsl::vec3(p1 + tangent * currentSize, m_params.m_depth); - if (m_params.m_join == dp::BevelJoin) - { - texCoords[TEX_BEG_IDX].m_globalLength = 0.0f; - texCoords[TEX_END_IDX].m_globalLength = glsl::length(nextForming - prevForming) / m_params.m_baseGtoPScale; - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_BEG_IDX]), ()); - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_END_IDX]), ()); + builder.SubmitVertex(currentStartPivot, rightNormal, false /* isLeft */, 0.0); + builder.SubmitVertex(currentStartPivot, leftNormal, true /* isLeft */, 0.0); + builder.SubmitVertex(newPivot, rightNormal, false /* isLeft */, maskSize); + builder.SubmitVertex(newPivot, leftNormal, true /* isLeft */, maskSize); - geometry.push_back(LV(startPivot, prevForming, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(startPivot, zeroNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(startPivot, nextForming, colorCoord, texCoords[TEX_END_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(startPivot, nextForming, colorCoord, texCoords[TEX_END_IDX].m_texCoord, leftSegment)); - } - else - { - glsl::vec2 middleForming = glsl::normalize(prevForming + nextForming); - glsl::vec2 zeroDxDy(0.0, 0.0); - - texCoords[TEX_BEG_IDX].m_globalLength = 0.0f; - texCoords[TEX_END_IDX].m_globalLength = glsl::length(nextForming - prevForming) / m_params.m_baseGtoPScale; - TexDescription middle; - middle.m_globalLength = texCoords[TEX_END_IDX].m_globalLength / 2.0f; - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_BEG_IDX]), ()); - VERIFY(texCoordGen.GetTexCoords(middle), ()); - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_END_IDX]), ()); - - if (m_params.m_join == dp::MiterJoin) - { - float const b = glsl::length(prevForming - nextForming) / 2.0; - float const a = glsl::length(prevForming); - middleForming *= static_cast(sqrt(a * a + b * b)); - - geometry.push_back(LV(startPivot, prevForming, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, zeroDxDy)); - geometry.push_back(LV(startPivot, zeroNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, zeroDxDy)); - geometry.push_back(LV(startPivot, middleForming, colorCoord, middle.m_texCoord, zeroDxDy)); - geometry.push_back(LV(startPivot, nextForming, colorCoord, texCoords[TEX_END_IDX].m_texCoord, zeroDxDy)); - } - else - { - middleForming *= glsl::length(prevForming); - - glsl::vec2 dxdyLeft(0.0, -1.0); - glsl::vec2 dxdyRight(0.0, -1.0); - glsl::vec2 dxdyMiddle(1.0, 1.0); - geometry.push_back(LV(startPivot, zeroNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, zeroDxDy)); - geometry.push_back(LV(startPivot, prevForming, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, dxdyLeft)); - geometry.push_back(LV(startPivot, nextForming, colorCoord, texCoords[TEX_END_IDX].m_texCoord, dxdyRight)); - geometry.push_back(LV(startPivot, middleForming, colorCoord, middle.m_texCoord, dxdyMiddle)); - } - } + currentStartPivot = newPivot; } - - texCoords[TEX_BEG_IDX].m_globalLength = 0.0; - texCoords[TEX_END_IDX].m_globalLength = glsl::length(endPoint - startPoint); - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_BEG_IDX]), ()); - while (!texCoordGen.GetTexCoords(texCoords[TEX_END_IDX])) - { - glsl::vec2 newEndPoint = startPoint + tangent * texCoords[TEX_END_IDX].m_globalLength; - glsl::vec3 newEndPivot = glsl::vec3(newEndPoint, m_params.m_depth); - - geometry.push_back(LV(startPivot, leftNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(startPivot, rightNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, rightSegment)); - geometry.push_back(LV(newEndPivot, leftNormal, colorCoord, texCoords[TEX_END_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(newEndPivot, rightNormal, colorCoord, texCoords[TEX_END_IDX].m_texCoord, rightSegment)); - - startPoint = newEndPoint; - startPivot = newEndPivot; - - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_BEG_IDX]), ()); - texCoords[TEX_END_IDX].m_globalLength = glsl::length(endPoint - startPoint); - } - - geometry.push_back(LV(startPivot, leftNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(startPivot, rightNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, rightSegment)); - geometry.push_back(LV(endPivot, leftNormal, colorCoord, texCoords[TEX_END_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(endPivot, rightNormal, colorCoord, texCoords[TEX_END_IDX].m_texCoord, rightSegment)); - - prevPoint = startPoint; - prevLeftNormal = leftNormal; - prevRightNormal = rightNormal; } +} - if (generateCap) +// Specialization optimized for solid lines. +template <> +void LineShape::Construct(SolidLineBuilder & builder) const +{ + vector const & path = m_spline->GetPath(); + ASSERT_GREATER(path.size(), 1, ()); + + // skip joins generation + float const kJoinsGenerationThreshold = 2.5f; + bool generateJoins = true; + if (builder.GetHalfWidth() <= kJoinsGenerationThreshold) + generateJoins = false; + + // build geometry + glsl::vec2 firstPoint = glsl::vec2(path.front().x, path.front().y); + glsl::vec2 lastPoint; + bool hasConstructedSegments = false; + for (size_t i = 1; i < path.size(); ++i) { - size_t lastPointIndex = path.size() - 1; - glsl::vec2 startPoint = glsl::ToVec2(path[lastPointIndex - 1]); - glsl::vec2 endPoint = glsl::ToVec2(path[lastPointIndex]); + if (path[i].EqualDxDy(path[i - 1], 1.0E-5)) + continue; + + glsl::vec2 const p1 = glsl::vec2(path[i - 1].x, path[i - 1].y); + glsl::vec2 const p2 = glsl::vec2(path[i].x, path[i].y); glsl::vec2 tangent, leftNormal, rightNormal; - calcTangentAndNormals(startPoint, endPoint, tangent, leftNormal, rightNormal); - tangent = halfWidth * tangent; + CalculateTangentAndNormals(p1, p2, tangent, leftNormal, rightNormal); - glsl::vec3 pivot = glsl::vec3(endPoint, m_params.m_depth); - glsl::vec2 leftCap(capType, LEFT_WIDTH); - glsl::vec2 rightCap(capType, RIGHT_WIDTH); + glsl::vec3 const startPoint = glsl::vec3(p1, m_params.m_depth); + glsl::vec3 const endPoint = glsl::vec3(p2, m_params.m_depth); - texCoords[TEX_BEG_IDX].m_globalLength = 0.0; - texCoords[TEX_END_IDX].m_globalLength = glbHalfWidth; + builder.SubmitVertex(startPoint, rightNormal, false /* isLeft */); + builder.SubmitVertex(startPoint, leftNormal, true /* isLeft */); + builder.SubmitVertex(endPoint, rightNormal, false /* isLeft */); + builder.SubmitVertex(endPoint, leftNormal, true /* isLeft */); - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_BEG_IDX]), ()); - VERIFY(texCoordGen.GetTexCoords(texCoords[TEX_END_IDX]), ()); + // generate joins + if (generateJoins && i < path.size() - 1) + builder.SubmitJoin(p2); - geometry.push_back(LV(pivot, leftNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, leftSegment)); - geometry.push_back(LV(pivot, rightNormal, colorCoord, texCoords[TEX_BEG_IDX].m_texCoord, rightSegment)); - geometry.push_back(LV(pivot, leftNormal + tangent, colorCoord, texCoords[TEX_END_IDX].m_texCoord, leftCap)); - geometry.push_back(LV(pivot, rightNormal + tangent, colorCoord, texCoords[TEX_END_IDX].m_texCoord, rightCap)); + lastPoint = p2; + hasConstructedSegments = true; } - dp::GLState state(gpu::LINE_PROGRAM, dp::GLState::GeometryLayer); - state.SetBlending(true); - state.SetColorTexture(colorRegion.GetTexture()); - state.SetMaskTexture(maskRegion.GetTexture()); + if (hasConstructedSegments) + { + builder.SubmitCap(firstPoint); + builder.SubmitCap(lastPoint); + } +} - dp::AttributeProvider provider(1, geometry.size()); - provider.InitStream(0, gpu::LineVertex::GetBindingInfo(), dp::MakeStackRefPointer(geometry.data())); +void LineShape::Prepare(ref_ptr textures) const +{ + dp::TextureManager::ColorRegion colorRegion; + textures->GetColorRegion(m_params.m_color, colorRegion); + float const pxHalfWidth = m_params.m_width / 2.0f; - batcher->InsertListOfStrip(state, dp::MakeStackRefPointer(&provider), 4); + auto commonParamsBuilder = [&](BaseBuilderParams & p) + { + p.m_cap = m_params.m_cap; + p.m_color = colorRegion; + p.m_depth = m_params.m_depth; + p.m_join = m_params.m_join; + p.m_pxHalfWidth = pxHalfWidth; + }; + + if (m_params.m_pattern.empty()) + { + SolidLineBuilder::BuilderParams p; + commonParamsBuilder(p); + + auto builder = make_unique(p, m_spline->GetPath().size()); + Construct(*builder); + m_lineShapeInfo = move(builder); + } + else + { + dp::TextureManager::StippleRegion maskRegion; + textures->GetStippleRegion(m_params.m_pattern, maskRegion); + + DashedLineBuilder::BuilderParams p; + commonParamsBuilder(p); + p.m_stipple = maskRegion; + p.m_baseGtoP = m_params.m_baseGtoPScale; + p.m_glbHalfWidth = pxHalfWidth / m_params.m_baseGtoPScale; + + auto builder = make_unique(p, m_spline->GetPath().size()); + Construct(*builder); + m_lineShapeInfo = move(builder); + } +} + +void LineShape::Draw(ref_ptr batcher, ref_ptr textures) const +{ + if (!m_lineShapeInfo) + Prepare(textures); + + ASSERT(m_lineShapeInfo != nullptr, ()); + dp::GLState state = m_lineShapeInfo->GetState(); + + dp::AttributeProvider provider(1, m_lineShapeInfo->GetLineSize()); + provider.InitStream(0, m_lineShapeInfo->GetBindingInfo(), m_lineShapeInfo->GetLineData()); + batcher->InsertListOfStrip(state, make_ref(&provider), dp::Batcher::VertexPerQuad); + + size_t joinSize = m_lineShapeInfo->GetJoinSize(); + if (joinSize > 0) + { + dp::AttributeProvider joinsProvider(1, joinSize); + joinsProvider.InitStream(0, m_lineShapeInfo->GetBindingInfo(), m_lineShapeInfo->GetJoinData()); + batcher->InsertTriangleList(state, make_ref(&joinsProvider)); + } + + size_t capSize = m_lineShapeInfo->GetCapSize(); + if (capSize > 0) + { + dp::AttributeProvider capProvider(1, capSize); + capProvider.InitStream(0, m_lineShapeInfo->GetCapBindingInfo(), m_lineShapeInfo->GetCapData()); + batcher->InsertListOfStrip(m_lineShapeInfo->GetCapState(), make_ref(&capProvider), dp::Batcher::VertexPerQuad); + } } } // namespace df diff --git a/drape_frontend/line_shape.hpp b/drape_frontend/line_shape.hpp index 79a6f2ad64..0c4dca2a32 100644 --- a/drape_frontend/line_shape.hpp +++ b/drape_frontend/line_shape.hpp @@ -3,22 +3,52 @@ #include "drape_frontend/map_shape.hpp" #include "drape_frontend/shape_view_params.hpp" +#include "drape/binding_info.hpp" +#include "drape/glstate.hpp" + #include "geometry/spline.hpp" +#include "std/unique_ptr.hpp" + namespace df { +class ILineShapeInfo +{ +public: + virtual ~ILineShapeInfo() {} + + virtual dp::BindingInfo const & GetBindingInfo() = 0; + virtual dp::GLState GetState() = 0; + + virtual ref_ptr GetLineData() = 0; + virtual size_t GetLineSize() = 0; + + virtual ref_ptr GetJoinData() = 0; + virtual size_t GetJoinSize() = 0; + + virtual dp::BindingInfo const & GetCapBindingInfo() = 0; + virtual dp::GLState GetCapState() = 0; + virtual ref_ptr GetCapData() = 0; + virtual size_t GetCapSize() = 0; +}; + class LineShape : public MapShape { public: - LineShape(m2::SharedSpline const & spline, - LineViewParams const & params); + LineShape(m2::SharedSpline const & spline, LineViewParams const & params); - virtual void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; + void Prepare(ref_ptr textures) const override; + void Draw(ref_ptr batcher, ref_ptr textures) const override; + MapShapePriority GetPriority() const override { return MapShapePriority::LinePriority; } private: + template + void Construct(TBuilder & builder) const; + LineViewParams m_params; m2::SharedSpline m_spline; + mutable unique_ptr m_lineShapeInfo; }; } // namespace df diff --git a/drape_frontend/line_shape_helper.cpp b/drape_frontend/line_shape_helper.cpp new file mode 100644 index 0000000000..37fad390b3 --- /dev/null +++ b/drape_frontend/line_shape_helper.cpp @@ -0,0 +1,244 @@ +#include "drape_frontend/line_shape_helper.hpp" + +#include "drape/glsl_func.hpp" + +#include "base/assert.hpp" + +namespace df +{ + +namespace +{ + +void UpdateNormalBetweenSegments(LineSegment * segment1, LineSegment * segment2) +{ + ASSERT(segment1 != nullptr && segment2 != nullptr, ()); + + float const dotProduct = glsl::dot(segment1->m_leftNormals[EndPoint], + segment2->m_leftNormals[StartPoint]); + float const absDotProduct = fabs(dotProduct); + float const kEps = 1e-5; + + if (fabs(absDotProduct - 1.0f) < kEps) + { + // change nothing + return; + } + + float const kMaxScalar = 5; + float const crossProduct = glsl::cross(glsl::vec3(segment1->m_tangent, 0), + glsl::vec3(segment2->m_tangent, 0)).z; + if (crossProduct < 0) + { + segment1->m_hasLeftJoin[EndPoint] = true; + segment2->m_hasLeftJoin[StartPoint] = true; + + // change right-side normals + glsl::vec2 averageNormal = glsl::normalize(segment1->m_rightNormals[EndPoint] + + segment2->m_rightNormals[StartPoint]); + float const cosAngle = glsl::dot(segment1->m_tangent, averageNormal); + float const widthScalar = 1.0f / sqrt(1.0f - cosAngle * cosAngle); + if (widthScalar < kMaxScalar) + { + segment1->m_rightNormals[EndPoint] = averageNormal; + segment2->m_rightNormals[StartPoint] = averageNormal; + segment1->m_rightWidthScalar[EndPoint].x = widthScalar; + segment1->m_rightWidthScalar[EndPoint].y = widthScalar * cosAngle; + segment2->m_rightWidthScalar[StartPoint] = segment1->m_rightWidthScalar[EndPoint]; + } + else + { + segment1->m_generateJoin = false; + } + } + else + { + segment1->m_hasLeftJoin[EndPoint] = false; + segment2->m_hasLeftJoin[StartPoint] = false; + + // change left-side normals + glsl::vec2 averageNormal = glsl::normalize(segment1->m_leftNormals[EndPoint] + + segment2->m_leftNormals[StartPoint]); + float const cosAngle = glsl::dot(segment1->m_tangent, averageNormal); + float const widthScalar = 1.0f / sqrt(1.0f - cosAngle * cosAngle); + if (widthScalar < kMaxScalar) + { + segment1->m_leftNormals[EndPoint] = averageNormal; + segment2->m_leftNormals[StartPoint] = averageNormal; + segment1->m_leftWidthScalar[EndPoint].x = widthScalar; + segment1->m_leftWidthScalar[EndPoint].y = widthScalar * cosAngle; + segment2->m_leftWidthScalar[StartPoint] = segment1->m_leftWidthScalar[EndPoint]; + } + else + { + segment1->m_generateJoin = false; + } + } +} + +} // namespace + +void CalculateTangentAndNormals(glsl::vec2 const & pt0, glsl::vec2 const & pt1, + glsl::vec2 & tangent, glsl::vec2 & leftNormal, + glsl::vec2 & rightNormal) +{ + tangent = glsl::normalize(pt1 - pt0); + leftNormal = glsl::vec2(-tangent.y, tangent.x); + rightNormal = -leftNormal; +} + +void ConstructLineSegments(vector const & path, vector & segments) +{ + ASSERT_LESS(1, path.size(), ()); + + m2::PointD prevPoint = path[0]; + for (size_t i = 1; i < path.size(); ++i) + { + m2::PointF const p1 = m2::PointF(prevPoint.x, prevPoint.y); + m2::PointF const p2 = m2::PointF(path[i].x, path[i].y); + if (p1.EqualDxDy(p2, 1.0E-5)) + continue; + + // Important! Do emplace_back first and fill parameters later. + // Fill parameters first and push_back later will cause ugly bug in clang 3.6 -O3 optimization. + segments.emplace_back(glsl::ToVec2(p1), glsl::ToVec2(p2)); + LineSegment & segment = segments.back(); + + CalculateTangentAndNormals(glsl::ToVec2(p1), glsl::ToVec2(p2), segment.m_tangent, + segment.m_leftBaseNormal, segment.m_rightBaseNormal); + + segment.m_leftNormals[StartPoint] = segment.m_leftNormals[EndPoint] = segment.m_leftBaseNormal; + segment.m_rightNormals[StartPoint] = segment.m_rightNormals[EndPoint] = segment.m_rightBaseNormal; + + prevPoint = path[i]; + } +} + +void UpdateNormals(LineSegment * segment, LineSegment * prevSegment, LineSegment * nextSegment) +{ + ASSERT(segment != nullptr, ()); + + if (prevSegment != nullptr) + UpdateNormalBetweenSegments(prevSegment, segment); + + if (nextSegment != nullptr) + UpdateNormalBetweenSegments(segment, nextSegment); +} + +void GenerateJoinNormals(dp::LineJoin joinType, glsl::vec2 const & normal1, glsl::vec2 const & normal2, + float halfWidth, bool isLeft, float widthScalar, vector & normals) +{ + float const eps = 1e-5; + if (fabs(glsl::dot(normal1, normal2) - 1.0f) < eps) + return; + + if (joinType == dp::LineJoin::BevelJoin) + { + glsl::vec2 const n1 = halfWidth * normal1; + glsl::vec2 const n2 = halfWidth * normal2; + + normals.push_back(glsl::vec2(0.0f, 0.0f)); + normals.push_back(isLeft ? n1 : n2); + normals.push_back(isLeft ? n2 : n1); + } + else if (joinType == dp::LineJoin::MiterJoin) + { + glsl::vec2 averageNormal = halfWidth * widthScalar * glsl::normalize(normal1 + normal2); + + glsl::vec2 const n1 = halfWidth * normal1; + glsl::vec2 const n2 = halfWidth * normal2; + + normals.push_back(glsl::vec2(0.0f, 0.0f)); + normals.push_back(isLeft ? n1 : averageNormal); + normals.push_back(isLeft ? averageNormal : n1); + + normals.push_back(glsl::vec2(0.0f, 0.0f)); + normals.push_back(isLeft ? averageNormal : n2); + normals.push_back(isLeft ? n2 : averageNormal); + } + else + { + double const segmentAngle = math::pi / 8.0; + double const fullAngle = acos(glsl::dot(normal1, normal2)); + int segmentsCount = static_cast(fullAngle / segmentAngle); + if (segmentsCount == 0) + segmentsCount = 1; + + double const angle = fullAngle / segmentsCount * (isLeft ? -1.0 : 1.0); + glsl::vec2 const normalizedNormal = glsl::normalize(normal1); + m2::PointD const startNormal(normalizedNormal.x, normalizedNormal.y); + + for (int i = 0; i < segmentsCount; i++) + { + m2::PointD n1 = m2::Rotate(startNormal, i * angle) * halfWidth; + m2::PointD n2 = m2::Rotate(startNormal, (i + 1) * angle) * halfWidth; + + normals.push_back(glsl::vec2(0.0f, 0.0f)); + normals.push_back(isLeft ? glsl::vec2(n1.x, n1.y) : glsl::vec2(n2.x, n2.y)); + normals.push_back(isLeft ? glsl::vec2(n2.x, n2.y) : glsl::vec2(n1.x, n1.y)); + } + } +} + +void GenerateCapNormals(dp::LineCap capType, glsl::vec2 const & normal1, glsl::vec2 const & normal2, + glsl::vec2 const & direction, float halfWidth, bool isStart, vector & normals) +{ + if (capType == dp::ButtCap) + return; + + if (capType == dp::SquareCap) + { + glsl::vec2 const n1 = halfWidth * normal1; + glsl::vec2 const n2 = halfWidth * normal2; + glsl::vec2 const n3 = halfWidth * (normal1 + direction); + glsl::vec2 const n4 = halfWidth * (normal2 + direction); + + normals.push_back(n2); + normals.push_back(isStart ? n4 : n1); + normals.push_back(isStart ? n1 : n4); + + normals.push_back(n1); + normals.push_back(isStart ? n4 : n3); + normals.push_back(isStart ? n3 : n4); + } + else + { + int const segmentsCount = 8; + double const segmentSize = math::pi / segmentsCount * (isStart ? -1.0 : 1.0); + glsl::vec2 const normalizedNormal = glsl::normalize(normal2); + m2::PointD const startNormal(normalizedNormal.x, normalizedNormal.y); + + for (int i = 0; i < segmentsCount; i++) + { + m2::PointD n1 = m2::Rotate(startNormal, i * segmentSize) * halfWidth; + m2::PointD n2 = m2::Rotate(startNormal, (i + 1) * segmentSize) * halfWidth; + + normals.push_back(glsl::vec2(0.0f, 0.0f)); + normals.push_back(isStart ? glsl::vec2(n1.x, n1.y) : glsl::vec2(n2.x, n2.y)); + normals.push_back(isStart ? glsl::vec2(n2.x, n2.y) : glsl::vec2(n1.x, n1.y)); + } + } +} + +glsl::vec2 GetNormal(LineSegment const & segment, bool isLeft, ENormalType normalType) +{ + if (normalType == BaseNormal) + return isLeft ? segment.m_leftBaseNormal : segment.m_rightBaseNormal; + + int const index = (normalType == StartNormal) ? StartPoint : EndPoint; + return isLeft ? segment.m_leftWidthScalar[index].x * segment.m_leftNormals[index]: + segment.m_rightWidthScalar[index].x * segment.m_rightNormals[index]; +} + +float GetProjectionLength(glsl::vec2 const & newPoint, glsl::vec2 const & startPoint, + glsl::vec2 const & endPoint) +{ + glsl::vec2 const v1 = endPoint - startPoint; + glsl::vec2 const v2 = newPoint - startPoint; + float const squareLen = glsl::dot(v1, v1); + float const proj = glsl::dot(v1, v2) / squareLen; + return sqrt(squareLen) * my::clamp(proj, 0.0f, 1.0f); +} + +} // namespace df + diff --git a/drape_frontend/line_shape_helper.hpp b/drape_frontend/line_shape_helper.hpp new file mode 100644 index 0000000000..5014367cc4 --- /dev/null +++ b/drape_frontend/line_shape_helper.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include "drape/drape_global.hpp" +#include "drape/glsl_types.hpp" + +#include "std/vector.hpp" + +namespace df +{ + +enum EPointType +{ + StartPoint = 0, + EndPoint = 1, + PointsCount = 2 +}; + +enum ENormalType +{ + StartNormal = 0, + EndNormal = 1, + BaseNormal = 2 +}; + +struct LineSegment +{ + glsl::vec2 m_points[PointsCount]; + glsl::vec2 m_tangent; + glsl::vec2 m_leftBaseNormal; + glsl::vec2 m_leftNormals[PointsCount]; + glsl::vec2 m_rightBaseNormal; + glsl::vec2 m_rightNormals[PointsCount]; + glsl::vec2 m_leftWidthScalar[PointsCount]; + glsl::vec2 m_rightWidthScalar[PointsCount]; + bool m_hasLeftJoin[PointsCount]; + bool m_generateJoin; + + LineSegment(glsl::vec2 const & p1, glsl::vec2 const & p2) + { + m_points[StartPoint] = p1; + m_points[EndPoint] = p2; + m_leftWidthScalar[StartPoint] = m_leftWidthScalar[EndPoint] = glsl::vec2(1.0f, 0.0f); + m_rightWidthScalar[StartPoint] = m_rightWidthScalar[EndPoint] = glsl::vec2(1.0f, 0.0f); + m_hasLeftJoin[StartPoint] = m_hasLeftJoin[EndPoint] = true; + m_generateJoin = true; + } +}; + +void CalculateTangentAndNormals(glsl::vec2 const & pt0, glsl::vec2 const & pt1, + glsl::vec2 & tangent, glsl::vec2 & leftNormal, + glsl::vec2 & rightNormal); + +void ConstructLineSegments(vector const & path, vector & segments); + +void UpdateNormals(LineSegment * segment, LineSegment * prevSegment, LineSegment * nextSegment); + +void GenerateJoinNormals(dp::LineJoin joinType, glsl::vec2 const & normal1, glsl::vec2 const & normal2, + float halfWidth, bool isLeft, float widthScalar, vector & normals); + +void GenerateCapNormals(dp::LineCap capType, glsl::vec2 const & normal1, glsl::vec2 const & normal2, + glsl::vec2 const & direction, float halfWidth, bool isStart, vector & normals); + +glsl::vec2 GetNormal(LineSegment const & segment, bool isLeft, ENormalType normalType); + +float GetProjectionLength(glsl::vec2 const & newPoint, glsl::vec2 const & startPoint, glsl::vec2 const & endPoint); + +} // namespace df + diff --git a/drape_frontend/map_data_provider.cpp b/drape_frontend/map_data_provider.cpp index b0fad6ba0e..ce195f7f4d 100644 --- a/drape_frontend/map_data_provider.cpp +++ b/drape_frontend/map_data_provider.cpp @@ -3,20 +3,56 @@ namespace df { -MapDataProvider::MapDataProvider(TReadIDsFn const & idsReader, TReadFeaturesFn const & featureReader) +MapDataProvider::MapDataProvider(TReadIDsFn const & idsReader, + TReadFeaturesFn const & featureReader, + TUpdateCountryIndexFn const & countryIndexUpdater, + TIsCountryLoadedFn const & isCountryLoadedFn, + TDownloadFn const & downloadMapHandler, + TDownloadFn const & downloadMapRoutingHandler, + TDownloadFn const & downloadRetryHandler) : m_featureReader(featureReader) , m_idsReader(idsReader) + , m_countryIndexUpdater(countryIndexUpdater) + , m_isCountryLoadedFn(isCountryLoadedFn) + , m_downloadMapHandler(downloadMapHandler) + , m_downloadMapRoutingHandler(downloadMapRoutingHandler) + , m_downloadRetryHandler(downloadRetryHandler) { } -void MapDataProvider::ReadFeaturesID(TReadIdCallback const & fn, m2::RectD const & r, int scale) const +void MapDataProvider::ReadFeaturesID(TReadCallback const & fn, m2::RectD const & r, int scale) const { m_idsReader(fn, r, scale); } -void MapDataProvider::ReadFeatures(TReadFeatureCallback const & fn, vector const & ids) const +void MapDataProvider::ReadFeatures(TReadCallback const & fn, vector const & ids) const { m_featureReader(fn, ids); } +void MapDataProvider::UpdateCountryIndex(storage::TIndex const & currentIndex, m2::PointF const & pt) +{ + m_countryIndexUpdater(currentIndex, pt); +} + +MapDataProvider::TIsCountryLoadedFn const & MapDataProvider::GetIsCountryLoadedFn() const +{ + return m_isCountryLoadedFn; +} + +MapDataProvider::TDownloadFn const & MapDataProvider::GetDownloadMapHandler() const +{ + return m_downloadMapHandler; +} + +MapDataProvider::TDownloadFn const & MapDataProvider::GetDownloadMapRoutingHandler() const +{ + return m_downloadMapRoutingHandler; +} + +MapDataProvider::TDownloadFn const & MapDataProvider::GetDownloadRetryHandler() const +{ + return m_downloadRetryHandler; +} + } diff --git a/drape_frontend/map_data_provider.hpp b/drape_frontend/map_data_provider.hpp index d4969bc8e4..7a3bad2ddc 100644 --- a/drape_frontend/map_data_provider.hpp +++ b/drape_frontend/map_data_provider.hpp @@ -1,7 +1,9 @@ #pragma once -#include "indexer/feature.hpp" +#include "storage/index.hpp" +#include "storage/storage_defines.hpp" +#include "indexer/feature.hpp" #include "geometry/rect2d.hpp" #include "std/function.hpp" @@ -12,19 +14,39 @@ namespace df class MapDataProvider { public: - typedef function TReadIdCallback; - typedef function TReadFeatureCallback; - typedef function const &)> TReadFeaturesFn; - typedef function TReadIDsFn; + template using TReadCallback = function; + using TReadFeaturesFn = function const & , vector const &)>; + using TReadIDsFn = function const & , m2::RectD const &, int)>; + using TUpdateCountryIndexFn = function; + using TIsCountryLoadedFn = function; + using TDownloadFn = function; - MapDataProvider(TReadIDsFn const & idsReader, TReadFeaturesFn const & featureReader); + MapDataProvider(TReadIDsFn const & idsReader, + TReadFeaturesFn const & featureReader, + TUpdateCountryIndexFn const & countryIndexUpdater, + TIsCountryLoadedFn const & isCountryLoadedFn, + TDownloadFn const & downloadMapHandler, + TDownloadFn const & downloadMapRoutingHandler, + TDownloadFn const & downloadRetryHandler); - void ReadFeaturesID(TReadIdCallback const & fn, m2::RectD const & r, int scale) const; - void ReadFeatures(TReadFeatureCallback const & fn, vector const & ids) const; + void ReadFeaturesID(TReadCallback const & fn, m2::RectD const & r, int scale) const; + void ReadFeatures(TReadCallback const & fn, vector const & ids) const; + + void UpdateCountryIndex(storage::TIndex const & currentIndex, m2::PointF const & pt); + TIsCountryLoadedFn const & GetIsCountryLoadedFn() const; + + TDownloadFn const & GetDownloadMapHandler() const; + TDownloadFn const & GetDownloadMapRoutingHandler() const; + TDownloadFn const & GetDownloadRetryHandler() const; private: TReadFeaturesFn m_featureReader; TReadIDsFn m_idsReader; + TUpdateCountryIndexFn m_countryIndexUpdater; + TIsCountryLoadedFn m_isCountryLoadedFn; + TDownloadFn m_downloadMapHandler; + TDownloadFn m_downloadMapRoutingHandler; + TDownloadFn m_downloadRetryHandler; }; } diff --git a/drape_frontend/map_shape.hpp b/drape_frontend/map_shape.hpp index 224f6e20d3..813f3ad8b0 100644 --- a/drape_frontend/map_shape.hpp +++ b/drape_frontend/map_shape.hpp @@ -1,7 +1,7 @@ #pragma once #include "drape_frontend/message.hpp" -#include "drape_frontend/tile_info.hpp" +#include "drape_frontend/tile_key.hpp" #include "drape/pointers.hpp" @@ -14,34 +14,43 @@ namespace dp namespace df { +// Priority of shapes' processing (descending order). +enum MapShapePriority +{ + AreaPriority = 0, + TextAndPoiPriority, + LinePriority, + + PrioritiesCount +}; + class MapShape { public: virtual ~MapShape(){} - virtual void Draw(dp::RefPointer batcher, dp::RefPointer textures) const = 0; + virtual void Prepare(ref_ptr textures) const {} + virtual void Draw(ref_ptr batcher, ref_ptr textures) const = 0; + virtual MapShapePriority GetPriority() const { return MapShapePriority::AreaPriority; } }; +using TMapShapes = vector>; + class MapShapeReadedMessage : public Message { public: - MapShapeReadedMessage(TileKey const & key, dp::TransferPointer shape) - : m_key(key), m_shape(shape) - { - SetType(MapShapeReaded); - } + MapShapeReadedMessage(TileKey const & key, TMapShapes && shapes) + : m_key(key), m_shapes(move(shapes)) + {} - ~MapShapeReadedMessage() - { - m_shape.Destroy(); - } + Type GetType() const override { return Message::MapShapeReaded; } TileKey const & GetKey() const { return m_key; } - /// return non const reference for correct construct MasterPointer - dp::TransferPointer & GetShape() { return m_shape; } + + TMapShapes const & GetShapes() { return m_shapes; } private: TileKey m_key; - dp::TransferPointer m_shape; + TMapShapes m_shapes; }; } // namespace df diff --git a/drape_frontend/memory_feature_index.cpp b/drape_frontend/memory_feature_index.cpp index 0ab4328848..65adb4750a 100644 --- a/drape_frontend/memory_feature_index.cpp +++ b/drape_frontend/memory_feature_index.cpp @@ -3,29 +3,27 @@ namespace df { -void MemoryFeatureIndex::ReadFeaturesRequest(vector & features, vector & indexes) +void MemoryFeatureIndex::ReadFeaturesRequest(TFeaturesInfo & features, vector & featuresToRead) { - threads::MutexGuard lock(m_mutex); + ASSERT(m_isLocked, ()); - for (size_t i = 0; i < features.size(); ++i) + for (FeatureInfo & info : features) { - FeatureInfo & info = features[i]; ASSERT(m_features.find(info.m_id) != m_features.end() || !info.m_isOwner,()); if (!info.m_isOwner && m_features.insert(info.m_id).second) { - indexes.push_back(i); + featuresToRead.push_back(info.m_id); info.m_isOwner = true; } } } -void MemoryFeatureIndex::RemoveFeatures(vector & features) +void MemoryFeatureIndex::RemoveFeatures(TFeaturesInfo & features) { - threads::MutexGuard lock(m_mutex); + ASSERT(m_isLocked, ()); - for (size_t i = 0; i < features.size(); ++i) + for (FeatureInfo & info : features) { - FeatureInfo & info = features[i]; if (info.m_isOwner) { VERIFY(m_features.erase(info.m_id) == 1, ()); diff --git a/drape_frontend/memory_feature_index.hpp b/drape_frontend/memory_feature_index.hpp index 4382098ad8..ef91257c7f 100644 --- a/drape_frontend/memory_feature_index.hpp +++ b/drape_frontend/memory_feature_index.hpp @@ -1,6 +1,8 @@ #pragma once #include "indexer/feature_decl.hpp" + +#include "base/buffer_vector.hpp" #include "base/mutex.hpp" #include "std/set.hpp" @@ -13,6 +15,9 @@ namespace df struct FeatureInfo { + FeatureInfo() + : m_isOwner(false) {} + FeatureInfo(FeatureID const & id) : m_id(id), m_isOwner(false) {} @@ -28,13 +33,35 @@ struct FeatureInfo bool m_isOwner; }; +size_t const AverageFeaturesCount = 2048; +using TFeaturesInfo = buffer_vector; + class MemoryFeatureIndex : private noncopyable { public: - void ReadFeaturesRequest(vector & features, vector & indexes); - void RemoveFeatures(vector & features); + class Lock + { + threads::MutexGuard lock; + MemoryFeatureIndex & m_index; + public: + Lock(MemoryFeatureIndex & index) + : lock(index.m_mutex) + , m_index(index) + { + m_index.m_isLocked = true; + } + + ~Lock() + { + m_index.m_isLocked = false; + } + }; + + void ReadFeaturesRequest(TFeaturesInfo & features, vector & featuresToRead); + void RemoveFeatures(TFeaturesInfo & features); private: + bool m_isLocked = false; threads::Mutex m_mutex; set m_features; }; diff --git a/drape_frontend/message.cpp b/drape_frontend/message.cpp deleted file mode 100644 index aac081687d..0000000000 --- a/drape_frontend/message.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "drape_frontend/message.hpp" - -#include "base/assert.hpp" - -namespace df -{ - -Message::Message() - : m_type(Unknown) {} - -Message::Type Message::GetType() const -{ - ASSERT(m_type != Unknown, ()); - return m_type; -} - -void Message::SetType(Type t) -{ - m_type = t; -} - -} // namespace df diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index 73092796f1..bc5b7a4492 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -8,30 +8,51 @@ class Message public: enum Type { - // in perfect world GetType never return this type - // for this you need call SetType on subclass constructor Unknown, TileReadStarted, TileReadEnded, + FinishReading, FlushTile, MapShapeReaded, - UpdateModelView, UpdateReadManager, InvalidateRect, InvalidateReadManagerRect, - Resize, - Rotate + ClearUserMarkLayer, + ChangeUserMarkLayerVisibility, + UpdateUserMarkLayer, + GuiLayerRecached, + GuiRecache, + GuiLayerLayout, + MyPositionShape, + CountryInfoUpdate, + CountryStatusRecache, + StopRendering, + ChangeMyPostitionMode, + CompassInfo, + GpsInfo, + FindVisiblePOI, + SelectObject, + GetSelectedObject, + GetMyPosition, + AddRoute, + CacheRouteSign, + RemoveRoute, + FlushRoute, + FlushRouteSign, + DeactivateRouteFollowing, + UpdateMapStyle, + InvalidateTextures, + Invalidate }; - Message(); virtual ~Message() {} - Type GetType() const; + virtual Type GetType() const { return Unknown; } +}; -protected: - void SetType(Type t); - -private: - Type m_type; +enum class MessagePriority +{ + Normal, + High }; } // namespace df diff --git a/drape_frontend/message_acceptor.cpp b/drape_frontend/message_acceptor.cpp index e11e38e7c2..e09e47e148 100644 --- a/drape_frontend/message_acceptor.cpp +++ b/drape_frontend/message_acceptor.cpp @@ -5,20 +5,28 @@ namespace df { -void MessageAcceptor::ProcessSingleMessage(unsigned maxTimeWait) +MessageAcceptor::MessageAcceptor() + : m_infinityWaiting(false) { - dp::TransferPointer transferMessage = m_messageQueue.PopMessage(maxTimeWait); - dp::MasterPointer message(transferMessage); - if (message.IsNull()) - return; - - AcceptMessage(message.GetRefPointer()); - message.Destroy(); } -void MessageAcceptor::PostMessage(dp::TransferPointer message) +bool MessageAcceptor::ProcessSingleMessage(bool waitForMessage) { - m_messageQueue.PushMessage(message); + m_infinityWaiting = waitForMessage; + drape_ptr message = m_messageQueue.PopMessage(waitForMessage); + m_infinityWaiting = false; + + if (message == nullptr) + return false; + + AcceptMessage(make_ref(message)); + return true; +} + +void MessageAcceptor::PostMessage(drape_ptr && message, MessagePriority priority) +{ + if (CanReceiveMessage()) + m_messageQueue.PushMessage(move(message), priority); } void MessageAcceptor::CloseQueue() @@ -27,4 +35,19 @@ void MessageAcceptor::CloseQueue() m_messageQueue.ClearQuery(); } +void MessageAcceptor::CancelMessageWaiting() +{ + m_messageQueue.CancelWait(); +} + +bool MessageAcceptor::IsInInfinityWaiting() const +{ + return m_infinityWaiting; +} + +bool MessageAcceptor::IsQueueEmpty() +{ + return m_messageQueue.IsEmpty(); +} + } // namespace df diff --git a/drape_frontend/message_acceptor.hpp b/drape_frontend/message_acceptor.hpp index 262818035b..c3bdfe2f66 100644 --- a/drape_frontend/message_acceptor.hpp +++ b/drape_frontend/message_acceptor.hpp @@ -4,6 +4,8 @@ #include "drape/pointers.hpp" +#include "std/atomic.hpp" + namespace df { @@ -11,23 +13,30 @@ class Message; class MessageAcceptor { -public: - virtual ~MessageAcceptor() {} - protected: - virtual void AcceptMessage(dp::RefPointer message) = 0; + MessageAcceptor(); + virtual ~MessageAcceptor(){} + + virtual void AcceptMessage(ref_ptr message) = 0; + virtual bool CanReceiveMessage() = 0; /// Must be called by subclass on message target thread - void ProcessSingleMessage(unsigned maxTimeWait = -1); + bool ProcessSingleMessage(bool waitForMessage = true); + + void CancelMessageWaiting(); + void CloseQueue(); + bool IsInInfinityWaiting() const; + bool IsQueueEmpty(); + private: friend class ThreadsCommutator; - void PostMessage(dp::TransferPointer message); + void PostMessage(drape_ptr && message, MessagePriority priority); -private: MessageQueue m_messageQueue; + atomic m_infinityWaiting; }; } // namespace df diff --git a/drape_frontend/message_queue.cpp b/drape_frontend/message_queue.cpp index 65e6bfa3b0..6b22769287 100644 --- a/drape_frontend/message_queue.cpp +++ b/drape_frontend/message_queue.cpp @@ -3,56 +3,87 @@ #include "base/assert.hpp" #include "base/stl_add.hpp" +#include "std/chrono.hpp" + namespace df { +MessageQueue::MessageQueue() + : m_isWaiting(false) +{ +} + MessageQueue::~MessageQueue() { - CancelWait(); + CancelWaitImpl(); ClearQuery(); } -dp::TransferPointer MessageQueue::PopMessage(unsigned maxTimeWait) +drape_ptr MessageQueue::PopMessage(bool waitForMessage) { - threads::ConditionGuard guard(m_condition); + unique_lock lock(m_mutex); + if (waitForMessage && m_messages.empty()) + { + m_isWaiting = true; + m_condition.wait(lock, [this]() { return !m_isWaiting; }); + m_isWaiting = false; + } - WaitMessage(maxTimeWait); - - /// even waitNonEmpty == true m_messages can be empty after WaitMessage call - /// if application preparing to close and CancelWait been called if (m_messages.empty()) - return dp::MovePointer(NULL); + return nullptr; - dp::MasterPointer msg = m_messages.front(); + drape_ptr msg = move(m_messages.front()); m_messages.pop_front(); - return msg.Move(); + return msg; } -void MessageQueue::PushMessage(dp::TransferPointer message) +void MessageQueue::PushMessage(drape_ptr && message, MessagePriority priority) { - threads::ConditionGuard guard(m_condition); + lock_guard lock(m_mutex); - bool wasEmpty = m_messages.empty(); - m_messages.push_back(dp::MasterPointer(message)); + switch (priority) + { + case MessagePriority::Normal: + { + m_messages.emplace_back(move(message)); + break; + } + case MessagePriority::High: + { + m_messages.emplace_front(move(message)); + break; + } + default: + ASSERT(false, ("Unknown message priority type")); + } - if (wasEmpty) - guard.Signal(); + CancelWaitImpl(); } -void MessageQueue::WaitMessage(unsigned maxTimeWait) +bool MessageQueue::IsEmpty() { - if (m_messages.empty()) - m_condition.Wait(maxTimeWait); + lock_guard lock(m_mutex); + return m_messages.empty(); } void MessageQueue::CancelWait() { - m_condition.Signal(); + lock_guard lock(m_mutex); + CancelWaitImpl(); +} + +void MessageQueue::CancelWaitImpl() +{ + if (m_isWaiting) + { + m_isWaiting = false; + m_condition.notify_all(); + } } void MessageQueue::ClearQuery() { - DeleteRange(m_messages, dp::MasterPointerDeleter()); + m_messages.clear(); } } // namespace df diff --git a/drape_frontend/message_queue.hpp b/drape_frontend/message_queue.hpp index d1044a0a55..5eef064ad6 100644 --- a/drape_frontend/message_queue.hpp +++ b/drape_frontend/message_queue.hpp @@ -6,7 +6,9 @@ #include "base/condition.hpp" -#include "std/list.hpp" +#include "std/condition_variable.hpp" +#include "std/deque.hpp" +#include "std/mutex.hpp" namespace df { @@ -14,20 +16,23 @@ namespace df class MessageQueue { public: + MessageQueue(); ~MessageQueue(); - /// if queue is empty than return NULL - dp::TransferPointer PopMessage(unsigned maxTimeWait); - void PushMessage(dp::TransferPointer message); + /// if queue is empty then return NULL + drape_ptr PopMessage(bool waitForMessage); + void PushMessage(drape_ptr && message, MessagePriority priority); void CancelWait(); void ClearQuery(); + bool IsEmpty(); private: - void WaitMessage(unsigned maxTimeWait); + void CancelWaitImpl(); -private: - threads::Condition m_condition; - list > m_messages; + mutex m_mutex; + condition_variable m_condition; + bool m_isWaiting; + deque > m_messages; }; } // namespace df diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 2d90b90cec..586ccec0aa 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -1,9 +1,18 @@ #pragma once +#include "drape_frontend/gui/country_status_helper.hpp" +#include "drape_frontend/gui/layer_render.hpp" +#include "drape_frontend/gui/skin.hpp" + +#include "drape_frontend/route_builder.hpp" +#include "drape_frontend/my_position.hpp" +#include "drape_frontend/selection_shape.hpp" #include "drape_frontend/message.hpp" #include "drape_frontend/viewport.hpp" -#include "drape_frontend/tile_key.hpp" +#include "drape_frontend/tile_utils.hpp" +#include "drape_frontend/user_marks_provider.hpp" +#include "geometry/polyline2d.hpp" #include "geometry/rect2d.hpp" #include "geometry/screenbase.hpp" @@ -11,20 +20,63 @@ #include "drape/pointers.hpp" #include "drape/render_bucket.hpp" +#include "platform/location.hpp" + +#include "std/condition_variable.hpp" #include "std/shared_ptr.hpp" #include "std/set.hpp" +#include "std/function.hpp" +#include "std/utility.hpp" namespace df { +class BaseBlockingMessage : public Message +{ +public: + struct Blocker + { + void Wait() + { + unique_lock lock(m_lock); + m_signal.wait(lock, [this]{return !m_blocked;} ); + } + + private: + friend class BaseBlockingMessage; + + void Signal() + { + lock_guard lock(m_lock); + m_blocked = false; + m_signal.notify_one(); + } + + private: + mutex m_lock; + condition_variable m_signal; + bool m_blocked = true; + }; + + BaseBlockingMessage(Blocker & blocker) + : m_blocker(blocker) + { + } + + ~BaseBlockingMessage() + { + m_blocker.Signal(); + } + +private: + Blocker & m_blocker; +}; + class BaseTileMessage : public Message { public: - BaseTileMessage(TileKey const & key, Message::Type type) - : m_tileKey(key) - { - SetType(type); - } + BaseTileMessage(TileKey const & key) + : m_tileKey(key) {} TileKey const & GetKey() const { return m_tileKey; } @@ -36,76 +88,62 @@ class TileReadStartMessage : public BaseTileMessage { public: TileReadStartMessage(TileKey const & key) - : BaseTileMessage(key, Message::TileReadStarted) {} + : BaseTileMessage(key) {} + + Type GetType() const override { return Message::TileReadStarted; } }; class TileReadEndMessage : public BaseTileMessage { public: TileReadEndMessage(TileKey const & key) - : BaseTileMessage(key, Message::TileReadEnded) {} + : BaseTileMessage(key) {} + + Type GetType() const override { return Message::TileReadEnded; } +}; + +class FinishReadingMessage : public Message +{ +public: + template FinishReadingMessage(T && tiles) + : m_tiles(forward(tiles)) + {} + + Type GetType() const override { return Message::FinishReading; } + + TTilesCollection const & GetTiles() { return m_tiles; } + TTilesCollection && MoveTiles() { return move(m_tiles); } + +private: + TTilesCollection m_tiles; }; class FlushRenderBucketMessage : public BaseTileMessage { public: - FlushRenderBucketMessage(TileKey const & key, dp::GLState const & state, dp::TransferPointer buffer) - : BaseTileMessage(key, Message::FlushTile) + FlushRenderBucketMessage(TileKey const & key, dp::GLState const & state, drape_ptr && buffer) + : BaseTileMessage(key) , m_state(state) - , m_buffer(buffer) - { - } + , m_buffer(move(buffer)) + {} - ~FlushRenderBucketMessage() - { - m_buffer.Destroy(); - } + Type GetType() const override { return Message::FlushTile; } dp::GLState const & GetState() const { return m_state; } - dp::MasterPointer AcceptBuffer() { return dp::MasterPointer(m_buffer); } + drape_ptr && AcceptBuffer() { return move(m_buffer); } private: dp::GLState m_state; - dp::TransferPointer m_buffer; -}; - -class ResizeMessage : public Message -{ -public: - ResizeMessage(Viewport const & viewport) : m_viewport(viewport) - { - SetType(Resize); - } - - Viewport const & GetViewport() const { return m_viewport; } - -private: - Viewport m_viewport; -}; - -class UpdateModelViewMessage : public Message -{ -public: - UpdateModelViewMessage(ScreenBase const & screen) - : m_screen(screen) - { - SetType(UpdateModelView); - } - - ScreenBase const & GetScreen() const { return m_screen; } - -private: - ScreenBase m_screen; + drape_ptr m_buffer; }; class InvalidateRectMessage : public Message { public: InvalidateRectMessage(m2::RectD const & rect) - : m_rect(rect) - { - SetType(InvalidateRect); - } + : m_rect(rect) {} + + Type GetType() const override { return Message::InvalidateRect; } m2::RectD const & GetRect() const { return m_rect; } @@ -113,41 +151,492 @@ private: m2::RectD m_rect; }; -class UpdateReadManagerMessage : public UpdateModelViewMessage +class UpdateReadManagerMessage : public Message { public: - UpdateReadManagerMessage(ScreenBase const & screen, set const & tiles) - : UpdateModelViewMessage(screen) - , m_tiles(tiles) - { - SetType(UpdateReadManager); - } + UpdateReadManagerMessage(ScreenBase const & screen, TTilesCollection && tiles) + : m_tiles(move(tiles)) + , m_screen(screen) + {} - set const & GetTiles() const { return m_tiles; } + Type GetType() const override { return Message::UpdateReadManager; } + + TTilesCollection const & GetTiles() const { return m_tiles; } + ScreenBase const & GetScreen() const { return m_screen; } private: - set m_tiles; + TTilesCollection m_tiles; + ScreenBase m_screen; }; class InvalidateReadManagerRectMessage : public Message { public: - InvalidateReadManagerRectMessage(set const & tiles) - : m_tiles(tiles) - { - SetType(InvalidateReadManagerRect); - } + InvalidateReadManagerRectMessage(TTilesCollection const & tiles) + : m_tiles(tiles) {} - set const & GetTilesForInvalidate() const { return m_tiles; } + Type GetType() const override { return Message::InvalidateReadManagerRect; } + + TTilesCollection const & GetTilesForInvalidate() const { return m_tiles; } private: - set m_tiles; + TTilesCollection m_tiles; }; -template -T * CastMessage(dp::RefPointer msg) +class ClearUserMarkLayerMessage : public BaseTileMessage { - return static_cast(msg.GetRaw()); -} +public: + ClearUserMarkLayerMessage(TileKey const & tileKey) + : BaseTileMessage(tileKey) {} + + Type GetType() const override { return Message::ClearUserMarkLayer; } +}; + +class ChangeUserMarkLayerVisibilityMessage : public BaseTileMessage +{ +public: + ChangeUserMarkLayerVisibilityMessage(TileKey const & tileKey, bool isVisible) + : BaseTileMessage(tileKey) + , m_isVisible(isVisible) {} + + Type GetType() const override { return Message::ChangeUserMarkLayerVisibility; } + + bool IsVisible() const { return m_isVisible; } + +private: + bool m_isVisible; +}; + +class UpdateUserMarkLayerMessage : public BaseTileMessage +{ +public: + UpdateUserMarkLayerMessage(TileKey const & tileKey, UserMarksProvider * provider) + : BaseTileMessage(tileKey) + , m_provider(provider) + { + m_provider->IncrementCounter(); + } + + ~UpdateUserMarkLayerMessage() + { + ASSERT(m_inProcess == false, ()); + m_provider->DecrementCounter(); + if (m_provider->IsPendingOnDelete() && m_provider->CanBeDeleted()) + delete m_provider; + } + + Type GetType() const override { return Message::UpdateUserMarkLayer; } + + UserMarksProvider const * StartProcess() + { + m_provider->BeginRead(); +#ifdef DEBUG + m_inProcess = true; +#endif + return m_provider; + } + + void EndProcess() + { +#ifdef DEBUG + m_inProcess = false; +#endif + m_provider->EndRead(); + } + +private: + UserMarksProvider * m_provider; +#ifdef DEBUG + bool m_inProcess; +#endif +}; + +class GuiLayerRecachedMessage : public Message +{ +public: + GuiLayerRecachedMessage(drape_ptr && renderer) + : m_renderer(move(renderer)) {} + + Type GetType() const override { return Message::GuiLayerRecached; } + + drape_ptr && AcceptRenderer() { return move(m_renderer); } + +private: + drape_ptr m_renderer; +}; + +class GuiRecacheMessage : public BaseBlockingMessage +{ +public: + GuiRecacheMessage(Blocker & blocker, gui::TWidgetsInitInfo const & initInfo, gui::TWidgetsSizeInfo & resultInfo) + : BaseBlockingMessage(blocker) + , m_initInfo(initInfo) + , m_sizeInfo(resultInfo) + { + } + + Type GetType() const override { return Message::GuiRecache;} + gui::TWidgetsInitInfo const & GetInitInfo() const { return m_initInfo; } + gui::TWidgetsSizeInfo & GetSizeInfoMap() const { return m_sizeInfo; } + +private: + gui::TWidgetsInitInfo m_initInfo; + gui::TWidgetsSizeInfo & m_sizeInfo; +}; + +class GuiLayerLayoutMessage : public Message +{ +public: + GuiLayerLayoutMessage(gui::TWidgetsLayoutInfo const & info) + : m_layoutInfo(info) + {} + + Type GetType() const override { return GuiLayerLayout; } + + gui::TWidgetsLayoutInfo const & GetLayoutInfo() const { return m_layoutInfo; } + gui::TWidgetsLayoutInfo AcceptLayoutInfo() { return move(m_layoutInfo); } + +private: + gui::TWidgetsLayoutInfo m_layoutInfo; +}; + +class CountryInfoUpdateMessage : public Message +{ +public: + CountryInfoUpdateMessage() + : m_needShow(false) + {} + + CountryInfoUpdateMessage(gui::CountryInfo const & info, bool isCurrentCountry) + : m_countryInfo(info) + , m_isCurrentCountry(isCurrentCountry) + , m_needShow(true) + {} + + Type GetType() const override { return Message::CountryInfoUpdate;} + gui::CountryInfo const & GetCountryInfo() const { return m_countryInfo; } + bool IsCurrentCountry() const { return m_isCurrentCountry; } + bool NeedShow() const { return m_needShow; } + +private: + gui::CountryInfo m_countryInfo; + bool m_isCurrentCountry; + bool m_needShow; +}; + +class CountryStatusRecacheMessage : public Message +{ +public: + CountryStatusRecacheMessage() {} + Type GetType() const override { return Message::CountryStatusRecache ;} +}; + +class MyPositionShapeMessage : public Message +{ +public: + MyPositionShapeMessage(drape_ptr && shape, drape_ptr && selection) + : m_shape(move(shape)) + , m_selection(move(selection)) + {} + + Type GetType() const override { return Message::MyPositionShape; } + + drape_ptr && AcceptShape() { return move(m_shape); } + drape_ptr AcceptSelection() { return move(m_selection); } + +private: + drape_ptr m_shape; + drape_ptr m_selection; +}; + +class StopRenderingMessage : public Message +{ +public: + StopRenderingMessage(){} + Type GetType() const override { return Message::StopRendering; } +}; + +class ChangeMyPositionModeMessage : public Message +{ +public: + enum EChangeType + { + TYPE_NEXT, + TYPE_CANCEL, + TYPE_STOP_FOLLOW, + TYPE_INVALIDATE + }; + + explicit ChangeMyPositionModeMessage(EChangeType changeType) + : m_changeType(changeType) + , m_preferredZoomLevel(-1) + {} + + explicit ChangeMyPositionModeMessage(EChangeType changeType, int zoomLevel) + : m_changeType(changeType) + , m_preferredZoomLevel(zoomLevel) + {} + + EChangeType GetChangeType() const { return m_changeType; } + Type GetType() const override { return Message::ChangeMyPostitionMode; } + + int GetPreferredZoomLevel() const { return m_preferredZoomLevel; } + +private: + EChangeType const m_changeType; + int m_preferredZoomLevel; +}; + +class CompassInfoMessage : public Message +{ +public: + CompassInfoMessage(location::CompassInfo const & info) + : m_info(info) + {} + + Type GetType() const override { return Message::CompassInfo; } + location::CompassInfo const & GetInfo() const { return m_info; } + +private: + location::CompassInfo const m_info; +}; + +class GpsInfoMessage : public Message +{ +public: + GpsInfoMessage(location::GpsInfo const & info, bool isNavigable, + location::RouteMatchingInfo const & routeInfo) + : m_info(info) + , m_isNavigable(isNavigable) + , m_routeInfo(routeInfo) + {} + + Type GetType() const override { return Message::GpsInfo; } + location::GpsInfo const & GetInfo() const { return m_info; } + bool IsNavigable() const { return m_isNavigable; } + location::RouteMatchingInfo const & GetRouteInfo() const { return m_routeInfo; } + +private: + location::GpsInfo const m_info; + bool const m_isNavigable; + location::RouteMatchingInfo const m_routeInfo; +}; + +class FindVisiblePOIMessage : public BaseBlockingMessage +{ +public: + FindVisiblePOIMessage(Blocker & blocker, m2::PointD const & glbPt, FeatureID & featureID) + : BaseBlockingMessage(blocker) + , m_pt(glbPt) + , m_featureID(featureID) + {} + + Type GetType() const override { return FindVisiblePOI; } + + m2::PointD const & GetPoint() const { return m_pt; } + void SetFeatureID(FeatureID const & id) + { + m_featureID = id; + } + +private: + m2::PointD m_pt; + FeatureID & m_featureID; +}; + +class SelectObjectMessage : public Message +{ +public: + struct DismissTag {}; + SelectObjectMessage(DismissTag) + : SelectObjectMessage(SelectionShape::OBJECT_EMPTY, m2::PointD::Zero(), false, true) + {} + + SelectObjectMessage(SelectionShape::ESelectedObject selectedObject, m2::PointD const & glbPoint, bool isAnim) + : SelectObjectMessage(selectedObject, glbPoint, isAnim, false) + {} + + Type GetType() const override { return SelectObject; } + m2::PointD const & GetPosition() const { return m_glbPoint; } + SelectionShape::ESelectedObject GetSelectedObject() const { return m_selected; } + bool IsAnim() const { return m_isAnim; } + bool IsDismiss() const { return m_isDismiss; } + +private: + SelectObjectMessage(SelectionShape::ESelectedObject obj, m2::PointD const & pt, bool isAnim, bool isDismiss) + : m_selected(obj) + , m_glbPoint(pt) + , m_isAnim(isAnim) + , m_isDismiss(isDismiss) + {} + +private: + SelectionShape::ESelectedObject m_selected; + m2::PointD m_glbPoint; + bool m_isAnim; + bool m_isDismiss; +}; + +class GetSelectedObjectMessage : public BaseBlockingMessage +{ +public: + GetSelectedObjectMessage(Blocker & blocker, SelectionShape::ESelectedObject & object) + : BaseBlockingMessage(blocker) + , m_object(object) + {} + + Type GetType() const override { return GetSelectedObject; } + + void SetSelectedObject(SelectionShape::ESelectedObject const & object) + { + m_object = object; + } + +private: + SelectionShape::ESelectedObject & m_object; +}; + +class GetMyPositionMessage : public BaseBlockingMessage +{ +public: + GetMyPositionMessage(Blocker & blocker, bool & hasPosition, m2::PointD & myPosition) + : BaseBlockingMessage(blocker) + , m_myPosition(myPosition) + , m_hasPosition(hasPosition) + {} + + Type GetType() const override { return GetMyPosition; } + + void SetMyPosition(bool hasPosition, m2::PointD const & myPosition) + { + m_hasPosition = hasPosition; + m_myPosition = myPosition; + } + +private: + m2::PointD & m_myPosition; + bool & m_hasPosition; +}; + +class AddRouteMessage : public Message +{ +public: + AddRouteMessage(m2::PolylineD const & routePolyline, vector const & turns, dp::Color const & color) + : m_routePolyline(routePolyline) + , m_color(color) + , m_turns(turns) + {} + + Type GetType() const override { return Message::AddRoute; } + + m2::PolylineD const & GetRoutePolyline() { return m_routePolyline; } + dp::Color const & GetColor() const { return m_color; } + vector const & GetTurns() const { return m_turns; } + +private: + m2::PolylineD m_routePolyline; + dp::Color m_color; + vector m_turns; +}; + +class CacheRouteSignMessage : public Message +{ +public: + CacheRouteSignMessage(m2::PointD const & pos, bool isStart, bool isValid) + : m_position(pos) + , m_isStart(isStart) + , m_isValid(isValid) + {} + + Type GetType() const override { return Message::CacheRouteSign; } + + m2::PointD const & GetPosition() const { return m_position; } + bool IsStart() const { return m_isStart; } + bool IsValid() const { return m_isValid; } + +private: + m2::PointD const m_position; + bool const m_isStart; + bool const m_isValid; +}; + +class RemoveRouteMessage : public Message +{ +public: + RemoveRouteMessage(bool deactivateFollowing) + : m_deactivateFollowing(deactivateFollowing) + {} + + Type GetType() const override { return Message::RemoveRoute; } + + bool NeedDeactivateFollowing() const { return m_deactivateFollowing; } + +private: + bool m_deactivateFollowing; +}; + +class FlushRouteMessage : public Message +{ +public: + FlushRouteMessage(drape_ptr && routeData) + : m_routeData(move(routeData)) + {} + + Type GetType() const override { return Message::FlushRoute; } + drape_ptr && AcceptRouteData() { return move(m_routeData); } + +private: + drape_ptr m_routeData; +}; + +class FlushRouteSignMessage : public Message +{ +public: + FlushRouteSignMessage(drape_ptr && routeSignData) + : m_routeSignData(move(routeSignData)) + {} + + Type GetType() const override { return Message::FlushRouteSign; } + drape_ptr && AcceptRouteSignData() { return move(m_routeSignData); } + +private: + drape_ptr m_routeSignData; +}; + +class UpdateMapStyleMessage : public BaseBlockingMessage +{ +public: + UpdateMapStyleMessage(Blocker & blocker) + : BaseBlockingMessage(blocker) + {} + + Type GetType() const override { return Message::UpdateMapStyle; } +}; + +class InvalidateTexturesMessage : public BaseBlockingMessage +{ +public: + InvalidateTexturesMessage(Blocker & blocker) + : BaseBlockingMessage(blocker) + {} + + Type GetType() const override { return Message::InvalidateTextures; } +}; + +class InvalidateMessage : public Message +{ +public: + InvalidateMessage(){} + + Type GetType() const override { return Message::Invalidate; } +}; + +class DeactivateRouteFollowingMessage : public Message +{ +public: + DeactivateRouteFollowingMessage(){} + + Type GetType() const override { return Message::DeactivateRouteFollowing; } +}; } // namespace df diff --git a/drape_frontend/my_position.cpp b/drape_frontend/my_position.cpp new file mode 100644 index 0000000000..996edbd21a --- /dev/null +++ b/drape_frontend/my_position.cpp @@ -0,0 +1,247 @@ +#include "my_position.hpp" + +#include "drape/depth_constants.hpp" +#include "drape/glsl_func.hpp" +#include "drape/glsl_types.hpp" +#include "drape/overlay_handle.hpp" +#include "drape/render_bucket.hpp" +#include "drape/shader_def.hpp" + +namespace df +{ + +namespace +{ + +struct Vertex +{ + Vertex() = default; + Vertex(glsl::vec2 const & normal, glsl::vec2 const & texCoord) + : m_normal(normal) + , m_texCoord(texCoord) + { + } + + glsl::vec2 m_normal; + glsl::vec2 m_texCoord; +}; + +dp::BindingInfo GetBindingInfo() +{ + dp::BindingInfo info(2); + dp::BindingDecl & normal = info.GetBindingDecl(0); + normal.m_attributeName = "a_normal"; + normal.m_componentCount = 2; + normal.m_componentType = gl_const::GLFloatType; + normal.m_offset = 0; + normal.m_stride = sizeof(Vertex); + + dp::BindingDecl & texCoord = info.GetBindingDecl(1); + texCoord.m_attributeName = "a_colorTexCoords"; + texCoord.m_componentCount = 2; + texCoord.m_componentType = gl_const::GLFloatType; + texCoord.m_offset = sizeof(glsl::vec2); + texCoord.m_stride = sizeof(Vertex); + + return info; +} + +} // namespace + +MyPosition::MyPosition(ref_ptr mng) + : m_position(m2::PointF::Zero()) + , m_azimuth(0.0f) + , m_accuracy(0.0f) + , m_showAzimuth(false) + , m_isRoutingMode(false) +{ + m_parts.resize(4); + CacheAccuracySector(mng); + CachePointPosition(mng); +} + +void MyPosition::SetPosition(m2::PointF const & pt) +{ + m_position = pt; +} + +void MyPosition::SetAzimuth(float azimut) +{ + m_azimuth = azimut; +} + +void MyPosition::SetIsValidAzimuth(bool isValid) +{ + m_showAzimuth = isValid; +} + +void MyPosition::SetAccuracy(float accuracy) +{ + m_accuracy = accuracy; +} + +void MyPosition::SetRoutingMode(bool routingMode) +{ + m_isRoutingMode = routingMode; +} + +void MyPosition::RenderAccuracy(ScreenBase const & screen, + ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms) +{ + dp::UniformValuesStorage uniforms = commonUniforms; + m2::PointD accuracyPoint(m_position.x + m_accuracy, m_position.y); + float pixelAccuracy = (screen.GtoP(accuracyPoint) - screen.GtoP(m_position)).Length(); + + uniforms.SetFloatValue("u_position", m_position.x, m_position.y, dp::depth::POSITION_ACCURACY); + uniforms.SetFloatValue("u_accuracy", pixelAccuracy); + uniforms.SetFloatValue("u_opacity", 1.0); + RenderPart(mng, uniforms, MY_POSITION_ACCURACY); +} + +void MyPosition::RenderMyPosition(ScreenBase const & screen, + ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms) +{ + dp::UniformValuesStorage uniforms = commonUniforms; + uniforms.SetFloatValue("u_position", m_position.x, m_position.y, dp::depth::MY_POSITION_MARK); + uniforms.SetFloatValue("u_azimut", -(m_azimuth + screen.GetAngle())); + uniforms.SetFloatValue("u_opacity", 1.0); + RenderPart(mng, uniforms, (m_showAzimuth == true) ? + (m_isRoutingMode ? MY_POSITION_ROUTING_ARROW : MY_POSITION_ARROW) : MY_POSITION_POINT); +} + +void MyPosition::CacheAccuracySector(ref_ptr mng) +{ + int const TriangleCount = 40; + int const VertexCount = 3 * TriangleCount; + float const etalonSector = math::twicePi / static_cast(TriangleCount); + + dp::TextureManager::ColorRegion color; + mng->GetColorRegion(dp::Color(30, 150, 240, 20), color); + glsl::vec2 colorCoord = glsl::ToVec2(color.GetTexRect().Center()); + + buffer_vector buffer; + glsl::vec2 startNormal(0.0f, 1.0f); + + for (size_t i = 0; i < TriangleCount + 1; ++i) + { + glsl::vec2 normal = glsl::rotate(startNormal, i * etalonSector); + glsl::vec2 nextNormal = glsl::rotate(startNormal, (i + 1) * etalonSector); + + buffer.emplace_back(startNormal, colorCoord); + buffer.emplace_back(normal, colorCoord); + buffer.emplace_back(nextNormal, colorCoord); + } + + dp::GLState state(gpu::ACCURACY_PROGRAM, dp::GLState::OverlayLayer); + state.SetColorTexture(color.GetTexture()); + + { + dp::Batcher batcher(TriangleCount * dp::Batcher::IndexPerTriangle, VertexCount); + dp::SessionGuard guard(batcher, [this](dp::GLState const & state, drape_ptr && b) + { + drape_ptr bucket = move(b); + ASSERT(bucket->GetOverlayHandlesCount() == 0, ()); + + m_nodes.emplace_back(state, bucket->MoveBuffer()); + m_parts[MY_POSITION_ACCURACY].second = m_nodes.size() - 1; + }); + + dp::AttributeProvider provider(1 /*stream count*/, VertexCount); + provider.InitStream(0 /*stream index*/, GetBindingInfo(), make_ref(buffer.data())); + + m_parts[MY_POSITION_ACCURACY].first = batcher.InsertTriangleList(state, make_ref(&provider), nullptr); + ASSERT(m_parts[MY_POSITION_ACCURACY].first.IsValid(), ()); + } +} + +void MyPosition::CachePointPosition(ref_ptr mng) +{ + dp::TextureManager::SymbolRegion pointSymbol, arrowSymbol, routingArrowSymbol; + mng->GetSymbolRegion("current-position", pointSymbol); + mng->GetSymbolRegion("current-position-compas", arrowSymbol); + mng->GetSymbolRegion("current-routing-compas", routingArrowSymbol); + + m2::RectF const & pointTexRect = pointSymbol.GetTexRect(); + m2::PointF pointHalfSize = m2::PointF(pointSymbol.GetPixelSize()) * 0.5f; + + Vertex pointData[4]= + { + { glsl::vec2(-pointHalfSize.x, pointHalfSize.y), glsl::ToVec2(pointTexRect.LeftTop()) }, + { glsl::vec2(-pointHalfSize.x, -pointHalfSize.y), glsl::ToVec2(pointTexRect.LeftBottom()) }, + { glsl::vec2( pointHalfSize.x, pointHalfSize.y), glsl::ToVec2(pointTexRect.RightTop()) }, + { glsl::vec2( pointHalfSize.x, -pointHalfSize.y), glsl::ToVec2(pointTexRect.RightBottom())} + }; + + m2::RectF const & arrowTexRect = arrowSymbol.GetTexRect(); + m2::PointF arrowHalfSize = m2::PointF(arrowSymbol.GetPixelSize()) * 0.5f; + + Vertex arrowData[4]= + { + { glsl::vec2(-arrowHalfSize.x, arrowHalfSize.y), glsl::ToVec2(arrowTexRect.LeftTop()) }, + { glsl::vec2(-arrowHalfSize.x, -arrowHalfSize.y), glsl::ToVec2(arrowTexRect.LeftBottom()) }, + { glsl::vec2( arrowHalfSize.x, arrowHalfSize.y), glsl::ToVec2(arrowTexRect.RightTop()) }, + { glsl::vec2( arrowHalfSize.x, -arrowHalfSize.y), glsl::ToVec2(arrowTexRect.RightBottom())} + }; + + m2::RectF const & routingArrowTexRect = routingArrowSymbol.GetTexRect(); + m2::PointF routingArrowHalfSize = m2::PointF(routingArrowSymbol.GetPixelSize()) * 0.5f; + + Vertex routingArrowData[4]= + { + { glsl::vec2(-routingArrowHalfSize.x, routingArrowHalfSize.y), glsl::ToVec2(routingArrowTexRect.LeftTop()) }, + { glsl::vec2(-routingArrowHalfSize.x, -routingArrowHalfSize.y), glsl::ToVec2(routingArrowTexRect.LeftBottom()) }, + { glsl::vec2( routingArrowHalfSize.x, routingArrowHalfSize.y), glsl::ToVec2(routingArrowTexRect.RightTop()) }, + { glsl::vec2( routingArrowHalfSize.x, -routingArrowHalfSize.y), glsl::ToVec2(routingArrowTexRect.RightBottom())} + }; + + ASSERT(pointSymbol.GetTexture() == arrowSymbol.GetTexture(), ()); + ASSERT(pointSymbol.GetTexture() == routingArrowSymbol.GetTexture(), ()); + dp::GLState state(gpu::MY_POSITION_PROGRAM, dp::GLState::OverlayLayer); + state.SetColorTexture(pointSymbol.GetTexture()); + + { + dp::Batcher batcher(3 * dp::Batcher::IndexPerQuad, 3 * dp::Batcher::VertexPerQuad); + dp::SessionGuard guard(batcher, [this](dp::GLState const & state, drape_ptr && b) + { + drape_ptr bucket = move(b); + ASSERT(bucket->GetOverlayHandlesCount() == 0, ()); + + m_nodes.emplace_back(state, bucket->MoveBuffer()); + }); + + dp::AttributeProvider pointProvider(1 /*stream count*/, dp::Batcher::VertexPerQuad); + pointProvider.InitStream(0 /*stream index*/, GetBindingInfo(), make_ref(pointData)); + + dp::AttributeProvider arrowProvider(1 /*stream count*/, dp::Batcher::VertexPerQuad); + arrowProvider.InitStream(0 /*stream index*/, GetBindingInfo(), make_ref(arrowData)); + + dp::AttributeProvider routingArrowProvider(1 /*stream count*/, dp::Batcher::VertexPerQuad); + routingArrowProvider.InitStream(0 /*stream index*/, GetBindingInfo(), make_ref(routingArrowData)); + + m_parts[MY_POSITION_POINT].second = m_nodes.size(); + m_parts[MY_POSITION_ARROW].second = m_nodes.size(); + m_parts[MY_POSITION_ROUTING_ARROW].second = m_nodes.size(); + + m_parts[MY_POSITION_POINT].first = batcher.InsertTriangleStrip(state, make_ref(&pointProvider), nullptr); + ASSERT(m_parts[MY_POSITION_POINT].first.IsValid(), ()); + + m_parts[MY_POSITION_ARROW].first = batcher.InsertTriangleStrip(state, make_ref(&arrowProvider), nullptr); + ASSERT(m_parts[MY_POSITION_ARROW].first.IsValid(), ()); + + m_parts[MY_POSITION_ROUTING_ARROW].first = batcher.InsertTriangleStrip(state, make_ref(&routingArrowProvider), nullptr); + ASSERT(m_parts[MY_POSITION_ROUTING_ARROW].first.IsValid(), ()); + } +} + +void MyPosition::RenderPart(ref_ptr mng, + dp::UniformValuesStorage const & uniforms, + MyPosition::EMyPositionPart part) +{ + TPart const & accuracy = m_parts[part]; + RenderNode & node = m_nodes[accuracy.second]; + node.Render(mng, uniforms, accuracy.first); +} + +} diff --git a/drape_frontend/my_position.hpp b/drape_frontend/my_position.hpp new file mode 100644 index 0000000000..7bd79231ee --- /dev/null +++ b/drape_frontend/my_position.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include "render_node.hpp" + +#include "drape/vertex_array_buffer.hpp" +#include "drape/glstate.hpp" +#include "drape/gpu_program_manager.hpp" +#include "drape/texture_manager.hpp" +#include "drape/uniform_values_storage.hpp" +#include "drape/batcher.hpp" + +#include "geometry/screenbase.hpp" + +namespace df +{ + +class MyPosition +{ +public: + MyPosition(ref_ptr mng); + + ///@param pt = mercator point + void SetPosition(m2::PointF const & pt); + void SetAzimuth(float azimut); + void SetIsValidAzimuth(bool isValid); + void SetAccuracy(float accuracy); + void SetRoutingMode(bool routingMode); + + void RenderAccuracy(ScreenBase const & screen, + ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms); + + void RenderMyPosition(ScreenBase const & screen, + ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms); + +private: + void CacheAccuracySector(ref_ptr mng); + void CachePointPosition(ref_ptr mng); + +private: + enum EMyPositionPart + { + // don't change order and values + MY_POSITION_ACCURACY = 0, + MY_POSITION_ARROW = 1, + MY_POSITION_POINT = 2, + MY_POSITION_ROUTING_ARROW = 3 + }; + + void RenderPart(ref_ptr mng, + dp::UniformValuesStorage const & uniforms, + EMyPositionPart part); + +private: + m2::PointF m_position; + float m_azimuth; + float m_accuracy; + bool m_showAzimuth; + bool m_isRoutingMode; + + using TPart = pair; + + vector m_parts; + vector m_nodes; +}; + +} diff --git a/drape_frontend/my_position_controller.cpp b/drape_frontend/my_position_controller.cpp new file mode 100644 index 0000000000..db621180b0 --- /dev/null +++ b/drape_frontend/my_position_controller.cpp @@ -0,0 +1,581 @@ +#include "my_position_controller.hpp" +#include "visual_params.hpp" +#include "animation/base_interpolator.hpp" +#include "animation/interpolations.hpp" +#include "animation/model_view_animation.hpp" + +#include "indexer/mercator.hpp" + +#include "base/math.hpp" + +#include "3party/Alohalytics/src/alohalytics.h" + +namespace df +{ + +namespace +{ + +int const POSITION_Y_OFFSET = 75; +double const GPS_BEARING_LIFETIME_S = 5.0; +double const MIN_SPEED_THRESHOLD_MPS = 1.0; + +uint16_t SetModeBit(uint32_t mode, uint32_t bit) +{ + return mode | bit; +} + +uint16_t ResetModeBit(uint32_t mode, uint32_t bit) +{ + return mode & (~bit); +} + +location::EMyPositionMode ResetAllModeBits(uint32_t mode) +{ + return (location::EMyPositionMode)(mode & 0xF); +} + +uint16_t ChangeMode(uint32_t mode, location::EMyPositionMode newMode) +{ + return (mode & 0xF0) | newMode; +} + +bool TestModeBit(uint32_t mode, uint32_t bit) +{ + return (mode & bit) != 0; +} + +} // namespace + +class MyPositionController::MyPositionAnim : public BaseInterpolator +{ + using TBase = BaseInterpolator; +public: + MyPositionAnim(m2::PointD const & startPt, m2::PointD const & endPt, double moveDuration, + double startAzimut, double endAzimut, double rotationDuration) + : TBase(max(moveDuration, rotationDuration)) + , m_startPt(startPt) + , m_endPt(endPt) + , m_moveDuration(moveDuration) + , m_angleInterpolator(startAzimut, endAzimut) + , m_rotateDuration(rotationDuration) + { + } + + m2::PointD GetCurrentPosition() const + { + return InterpolatePoint(m_startPt, m_endPt, + my::clamp(GetElapsedTime() / m_moveDuration, 0.0, 1.0)); + } + + bool IsMovingActive() const { return m_moveDuration > 0.0; } + + double GetCurrentAzimut() const + { + return m_angleInterpolator.Interpolate(my::clamp(GetElapsedTime() / m_rotateDuration, 0.0, 1.0)); + } + + bool IsRotatingActive() const { return m_rotateDuration > 0.0; } + +private: + m2::PointD m_startPt; + m2::PointD m_endPt; + double m_moveDuration; + + InerpolateAngle m_angleInterpolator; + double m_rotateDuration; +}; + +MyPositionController::MyPositionController(location::EMyPositionMode initMode) + : m_modeInfo(location::MODE_PENDING_POSITION) + , m_afterPendingMode(location::MODE_FOLLOW) + , m_errorRadius(0.0) + , m_position(m2::PointD::Zero()) + , m_drawDirection(0.0) + , m_lastGPSBearing(false) + , m_isVisible(false) + , m_isDirtyViewport(false) +{ + if (initMode > location::MODE_UNKNOWN_POSITION) + m_afterPendingMode = initMode; + else + m_modeInfo = location::MODE_UNKNOWN_POSITION; +} + +MyPositionController::~MyPositionController() +{ + m_anim.reset(); +} + +void MyPositionController::SetPixelRect(m2::RectD const & pixelRect) +{ + m_pixelRect = pixelRect; + Follow(); +} + +void MyPositionController::SetListener(ref_ptr listener) +{ + m_listener = listener; +} + +m2::PointD const & MyPositionController::Position() const +{ + return m_position; +} + +double MyPositionController::GetErrorRadius() const +{ + return m_errorRadius; +} + +bool MyPositionController::IsModeChangeViewport() const +{ + return GetMode() >= location::MODE_FOLLOW; +} + +bool MyPositionController::IsModeHasPosition() const +{ + return GetMode() >= location::MODE_NOT_FOLLOW; +} + +void MyPositionController::DragStarted() +{ + SetModeInfo(SetModeBit(m_modeInfo, BlockAnimation)); +} + +void MyPositionController::DragEnded(m2::PointD const & distance) +{ + SetModeInfo(ResetModeBit(m_modeInfo, BlockAnimation)); + if (distance.Length() > 0.2 * min(m_pixelRect.SizeX(), m_pixelRect.SizeY())) + StopLocationFollow(); + + Follow(); +} + +void MyPositionController::ScaleStarted() +{ + SetModeInfo(SetModeBit(m_modeInfo, BlockAnimation)); +} + +void MyPositionController::Rotated() +{ + location::EMyPositionMode mode = GetMode(); + if (mode == location::MODE_ROTATE_AND_FOLLOW) + SetModeInfo(SetModeBit(m_modeInfo, StopFollowOnActionEnd)); +} + +void MyPositionController::CorrectScalePoint(m2::PointD & pt) const +{ + if (IsModeChangeViewport()) + pt = GetCurrentPixelBinding(); +} + +void MyPositionController::CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const +{ + if (IsModeChangeViewport()) + { + m2::PointD const oldPt1(pt1); + pt1 = GetCurrentPixelBinding(); + pt2 = pt2 - oldPt1 + pt1; + } +} + +void MyPositionController::CorrectGlobalScalePoint(m2::PointD & pt) const +{ + if (IsModeChangeViewport()) + pt = m_position; +} + +void MyPositionController::ScaleEnded() +{ + SetModeInfo(ResetModeBit(m_modeInfo, BlockAnimation)); + if (TestModeBit(m_modeInfo, StopFollowOnActionEnd)) + { + SetModeInfo(ResetModeBit(m_modeInfo, StopFollowOnActionEnd)); + StopLocationFollow(); + } + Follow(); +} + +void MyPositionController::SetRenderShape(drape_ptr && shape) +{ + m_shape = move(shape); +} + +void MyPositionController::SetFixedZoom() +{ + SetModeInfo(SetModeBit(m_modeInfo, FixedZoomBit)); +} + +void MyPositionController::NextMode(int preferredZoomLevel) +{ + string const kAlohalyticsClickEvent = "$onClick"; + location::EMyPositionMode currentMode = GetMode(); + location::EMyPositionMode newMode = currentMode; + + if (!IsInRouting()) + { + switch (currentMode) + { + case location::MODE_UNKNOWN_POSITION: + alohalytics::LogEvent(kAlohalyticsClickEvent, "@UnknownPosition"); + newMode = location::MODE_PENDING_POSITION; + break; + case location::MODE_PENDING_POSITION: + alohalytics::LogEvent(kAlohalyticsClickEvent, "@PendingPosition"); + newMode = location::MODE_UNKNOWN_POSITION; + m_afterPendingMode = location::MODE_FOLLOW; + break; + case location::MODE_NOT_FOLLOW: + alohalytics::LogEvent(kAlohalyticsClickEvent, "@NotFollow"); + newMode = location::MODE_FOLLOW; + break; + case location::MODE_FOLLOW: + alohalytics::LogEvent(kAlohalyticsClickEvent, "@Follow"); + if (IsRotationActive()) + newMode = location::MODE_ROTATE_AND_FOLLOW; + else + { + newMode = location::MODE_UNKNOWN_POSITION; + m_afterPendingMode = location::MODE_FOLLOW; + } + break; + case location::MODE_ROTATE_AND_FOLLOW: + alohalytics::LogEvent(kAlohalyticsClickEvent, "@RotateAndFollow"); + newMode = location::MODE_UNKNOWN_POSITION; + m_afterPendingMode = location::MODE_FOLLOW; + break; + } + } + else + { + newMode = IsRotationActive() ? location::MODE_ROTATE_AND_FOLLOW : location::MODE_FOLLOW; + } + + SetModeInfo(ChangeMode(m_modeInfo, newMode), IsInRouting()); + Follow(preferredZoomLevel); +} + +void MyPositionController::TurnOff() +{ + StopLocationFollow(); + SetModeInfo(location::MODE_UNKNOWN_POSITION); + SetIsVisible(false); +} + +void MyPositionController::Invalidate() +{ + location::EMyPositionMode currentMode = GetMode(); + if (currentMode > location::MODE_PENDING_POSITION) + { + SetModeInfo(ChangeMode(m_modeInfo, location::MODE_UNKNOWN_POSITION)); + SetModeInfo(ChangeMode(m_modeInfo, location::MODE_PENDING_POSITION)); + m_afterPendingMode = currentMode; + SetIsVisible(true); + } + else if (currentMode == location::MODE_UNKNOWN_POSITION) + { + m_afterPendingMode = location::MODE_FOLLOW; + SetIsVisible(false); + } +} + +void MyPositionController::OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, + ScreenBase const & screen) +{ + Assign(info, isNavigable, screen); + + SetIsVisible(true); + + if (GetMode() == location::MODE_PENDING_POSITION) + { + SetModeInfo(ChangeMode(m_modeInfo, m_afterPendingMode)); + m_afterPendingMode = location::MODE_FOLLOW; + } +} + +void MyPositionController::OnCompassUpdate(location::CompassInfo const & info, + ScreenBase const & screen) +{ + Assign(info, screen); +} + +void MyPositionController::SetModeListener(location::TMyPositionModeChanged const & fn) +{ + m_modeChangeCallback = fn; + CallModeListener(m_modeInfo); +} + +void MyPositionController::Render(uint32_t renderMode, ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms) +{ + location::EMyPositionMode currentMode = GetMode(); + if (m_shape != nullptr && IsVisible() && currentMode > location::MODE_PENDING_POSITION) + { + if (m_isDirtyViewport && !TestModeBit(m_modeInfo, BlockAnimation)) + { + Follow(); + m_isDirtyViewport = false; + } + + m_shape->SetPosition(GetDrawablePosition()); + m_shape->SetAzimuth(GetDrawableAzimut()); + m_shape->SetIsValidAzimuth(IsRotationActive()); + m_shape->SetAccuracy(m_errorRadius); + m_shape->SetRoutingMode(IsInRouting()); + + if ((renderMode & RenderAccuracy) != 0) + m_shape->RenderAccuracy(screen, mng, commonUniforms); + + if ((renderMode & RenderMyPosition) != 0) + m_shape->RenderMyPosition(screen, mng, commonUniforms); + } + + CheckAnimFinished(); +} + +void MyPositionController::AnimateStateTransition(location::EMyPositionMode oldMode, location::EMyPositionMode newMode) +{ + if (oldMode == location::MODE_PENDING_POSITION && newMode == location::MODE_FOLLOW) + { + if (!TestModeBit(m_modeInfo, FixedZoomBit)) + { + m2::PointD const size(m_errorRadius, m_errorRadius); + ChangeModelView(m2::RectD(m_position - size, m_position + size)); + } + } + else if (oldMode == location::MODE_ROTATE_AND_FOLLOW && + (newMode == location::MODE_FOLLOW || newMode == location::MODE_UNKNOWN_POSITION)) + { + ChangeModelView(0.0); + ChangeModelView(m_position); + } +} + +bool MyPositionController::AlmostEqualToTheCurrent(const m2::PointD &pos, double azimut) const +{ + double const kPositionEqualityDelta = 1e-5; + double const kDirectionEqualityDelta = 1e-5; + + return pos.EqualDxDy(m_position, kPositionEqualityDelta) && + my::AlmostEqualAbs(azimut, m_drawDirection, kDirectionEqualityDelta); +} + +void MyPositionController::Assign(location::GpsInfo const & info, bool isNavigable, ScreenBase const & screen) +{ + m2::PointD oldPos = GetDrawablePosition(); + double oldAzimut = GetDrawableAzimut(); + + m2::RectD rect = MercatorBounds::MetresToXY(info.m_longitude, + info.m_latitude, + info.m_horizontalAccuracy); + m_position = rect.Center(); + m_errorRadius = rect.SizeX() / 2; + + bool const hasBearing = info.HasBearing(); + if ((isNavigable && hasBearing) || + (!isNavigable && hasBearing && info.HasSpeed() && info.m_speed > MIN_SPEED_THRESHOLD_MPS)) + { + SetDirection(my::DegToRad(info.m_bearing)); + m_lastGPSBearing.Reset(); + } + + if (m_listener) + m_listener->PositionChanged(Position()); + + if (!AlmostEqualToTheCurrent(oldPos, oldAzimut)) + { + CreateAnim(oldPos, oldAzimut, screen); + m_isDirtyViewport = true; + } +} + +void MyPositionController::Assign(location::CompassInfo const & info, ScreenBase const & screen) +{ + m2::PointD oldPos = GetDrawablePosition(); + double oldAzimut = GetDrawableAzimut(); + + if ((IsInRouting() && GetMode() >= location::MODE_FOLLOW) || + (m_lastGPSBearing.ElapsedSeconds() < GPS_BEARING_LIFETIME_S)) + { + return; + } + + SetDirection(info.m_bearing); + + if (!AlmostEqualToTheCurrent(oldPos, oldAzimut)) + { + CreateAnim(oldPos, oldAzimut, screen); + m_isDirtyViewport = true; + } +} + +void MyPositionController::SetDirection(double bearing) +{ + m_drawDirection = bearing; + SetModeInfo(SetModeBit(m_modeInfo, KnownDirectionBit)); +} + +void MyPositionController::SetModeInfo(uint32_t modeInfo, bool force) +{ + location::EMyPositionMode const newMode = ResetAllModeBits(modeInfo); + location::EMyPositionMode const oldMode = GetMode(); + m_modeInfo = modeInfo; + if (newMode != oldMode || force) + { + AnimateStateTransition(oldMode, newMode); + CallModeListener(newMode); + } +} + +location::EMyPositionMode MyPositionController::GetMode() const +{ + return ResetAllModeBits(m_modeInfo); +} + +void MyPositionController::CallModeListener(uint32_t mode) +{ + if (m_modeChangeCallback != nullptr) + m_modeChangeCallback(ResetAllModeBits(mode)); +} + +bool MyPositionController::IsInRouting() const +{ + return TestModeBit(m_modeInfo, RoutingSessionBit); +} + +bool MyPositionController::IsRotationActive() const +{ + return TestModeBit(m_modeInfo, KnownDirectionBit); +} + +void MyPositionController::StopLocationFollow() +{ + location::EMyPositionMode currentMode = GetMode(); + if (currentMode > location::MODE_NOT_FOLLOW) + SetModeInfo(ChangeMode(m_modeInfo, location::MODE_NOT_FOLLOW)); + else if (currentMode == location::MODE_PENDING_POSITION) + m_afterPendingMode = location::MODE_NOT_FOLLOW; +} + +void MyPositionController::StopCompassFollow() +{ + if (GetMode() != location::MODE_ROTATE_AND_FOLLOW) + return; + + SetModeInfo(ChangeMode(m_modeInfo, location::MODE_FOLLOW)); + Follow(); +} + +void MyPositionController::ChangeModelView(m2::PointD const & center) +{ + if (m_listener) + m_listener->ChangeModelView(center); +} + +void MyPositionController::ChangeModelView(double azimuth) +{ + if (m_listener) + m_listener->ChangeModelView(azimuth); +} + +void MyPositionController::ChangeModelView(m2::RectD const & rect) +{ + if (m_listener) + m_listener->ChangeModelView(rect); +} + +void MyPositionController::ChangeModelView(m2::PointD const & userPos, double azimuth, + m2::PointD const & pxZero, int preferredZoomLevel) +{ + if (m_listener) + m_listener->ChangeModelView(userPos, azimuth, pxZero, preferredZoomLevel); +} + +void MyPositionController::Follow(int preferredZoomLevel) +{ + location::EMyPositionMode currentMode = GetMode(); + if (currentMode == location::MODE_FOLLOW) + ChangeModelView(m_position); + else if (currentMode == location::MODE_ROTATE_AND_FOLLOW) + ChangeModelView(m_position, m_drawDirection, GetRaFPixelBinding(), preferredZoomLevel); +} + +m2::PointD MyPositionController::GetRaFPixelBinding() const +{ + return m2::PointD (m_pixelRect.Center().x, + m_pixelRect.maxY() - POSITION_Y_OFFSET * VisualParams::Instance().GetVisualScale()); +} + +m2::PointD MyPositionController::GetCurrentPixelBinding() const +{ + location::EMyPositionMode mode = GetMode(); + if (mode == location::MODE_FOLLOW) + return m_pixelRect.Center(); + else if (mode == location::MODE_ROTATE_AND_FOLLOW) + return GetRaFPixelBinding(); + else + ASSERT(false, ()); + + return m2::PointD::Zero(); +} + +m2::PointD MyPositionController::GetDrawablePosition() const +{ + if (m_anim && m_anim->IsMovingActive()) + return m_anim->GetCurrentPosition(); + + return Position(); +} + +double MyPositionController::GetDrawableAzimut() const +{ + if (m_anim && m_anim->IsRotatingActive()) + return m_anim->GetCurrentAzimut(); + + return m_drawDirection; +} + +void MyPositionController::CheckAnimFinished() const +{ + if (m_anim && m_anim->IsFinished()) + m_anim.reset(); +} + +void MyPositionController::CreateAnim(m2::PointD const & oldPos, double oldAzimut, ScreenBase const & screen) +{ + double moveDuration = ModelViewAnimation::GetMoveDuration(oldPos, m_position, screen); + double rotateDuration = ModelViewAnimation::GetRotateDuration(oldAzimut, m_drawDirection); + double maxDuration = max(moveDuration, rotateDuration); + double kMaxMyPositionDuration = 2.0; // in seconds + if (maxDuration > 0.0 && maxDuration < kMaxMyPositionDuration) + m_anim.reset(new MyPositionAnim(oldPos, m_position, moveDuration, oldAzimut, m_drawDirection, rotateDuration)); +} + +void MyPositionController::ActivateRouting() +{ + if (!IsInRouting()) + { + location::EMyPositionMode newMode = GetMode(); + if (IsModeHasPosition()) + newMode = location::MODE_NOT_FOLLOW; + + SetModeInfo(ChangeMode(SetModeBit(m_modeInfo, RoutingSessionBit), newMode)); + } +} + +void MyPositionController::DeactivateRouting() +{ + if (IsInRouting()) + { + SetModeInfo(ResetModeBit(m_modeInfo, RoutingSessionBit)); + + location::EMyPositionMode currentMode = GetMode(); + if (currentMode == location::MODE_ROTATE_AND_FOLLOW) + SetModeInfo(ChangeMode(m_modeInfo, location::MODE_FOLLOW)); + else + ChangeModelView(0.0); + } +} + +} diff --git a/drape_frontend/my_position_controller.hpp b/drape_frontend/my_position_controller.hpp new file mode 100644 index 0000000000..91d4333913 --- /dev/null +++ b/drape_frontend/my_position_controller.hpp @@ -0,0 +1,151 @@ +#pragma once + +#include "drape_frontend/my_position.hpp" + +#include "drape/gpu_program_manager.hpp" +#include "drape/uniform_values_storage.hpp" + +#include "platform/location.hpp" + +#include "geometry/screenbase.hpp" + +#include "base/timer.hpp" + +namespace df +{ + +class MyPositionController +{ +public: + class Listener + { + public: + virtual ~Listener() {} + virtual void PositionChanged(m2::PointD const & position) = 0; + /// Show map with center in "center" point and current zoom + virtual void ChangeModelView(m2::PointD const & center) = 0; + /// Change azimuth of current ModelView + virtual void ChangeModelView(double azimuth) = 0; + /// Somehow show map that "rect" will see + virtual void ChangeModelView(m2::RectD const & rect) = 0; + /// Show map where "usePos" (mercator) placed in "pxZero" on screen and map rotated around "userPos" + virtual void ChangeModelView(m2::PointD const & userPos, double azimuth, m2::PointD const & pxZero, + int preferredZoomLevel) = 0; + }; + + // Render bits + enum RenderMode + { + RenderAccuracy = 0x1, + RenderMyPosition = 0x2 + }; + + MyPositionController(location::EMyPositionMode initMode); + ~MyPositionController(); + + void SetPixelRect(m2::RectD const & pixelRect); + void SetListener(ref_ptr listener); + + m2::PointD const & Position() const; + double GetErrorRadius() const; + + bool IsModeChangeViewport() const; + bool IsModeHasPosition() const; + + void DragStarted(); + void DragEnded(m2::PointD const & distance); + + void ScaleStarted(); + void Rotated(); + void CorrectScalePoint(m2::PointD & pt) const; + void CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const; + void CorrectGlobalScalePoint(m2::PointD & pt) const; + void ScaleEnded(); + + void SetRenderShape(drape_ptr && shape); + + void SetFixedZoom(); + + void ActivateRouting(); + void DeactivateRouting(); + + void StopLocationFollow(); + void StopCompassFollow(); + void NextMode(int preferredZoomLevel = -1); + void TurnOff(); + void Invalidate(); + + void OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, ScreenBase const & screen); + void OnCompassUpdate(location::CompassInfo const & info, ScreenBase const & screen); + + void SetModeListener(location::TMyPositionModeChanged const & fn); + + void Render(uint32_t renderMode, ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms); + +private: + void AnimateStateTransition(location::EMyPositionMode oldMode, location::EMyPositionMode newMode); + + void Assign(location::GpsInfo const & info, bool isNavigable, ScreenBase const & screen); + void Assign(location::CompassInfo const & info, ScreenBase const & screen); + void SetDirection(double bearing); + + void SetModeInfo(uint32_t modeInfo, bool force = false); + location::EMyPositionMode GetMode() const; + void CallModeListener(uint32_t mode); + + bool IsInRouting() const; + bool IsRotationActive() const; + + bool IsVisible() const { return m_isVisible; } + void SetIsVisible(bool isVisible) { m_isVisible = isVisible; } + + void ChangeModelView(m2::PointD const & center); + void ChangeModelView(double azimuth); + void ChangeModelView(m2::RectD const & rect); + void ChangeModelView(m2::PointD const & userPos, double azimuth, m2::PointD const & pxZero, + int preferredZoomLevel); + + void Follow(int preferredZoomLevel = -1); + m2::PointD GetRaFPixelBinding() const; + m2::PointD GetCurrentPixelBinding() const; + + m2::PointD GetDrawablePosition() const; + double GetDrawableAzimut() const; + void CheckAnimFinished() const; + void CreateAnim(m2::PointD const & oldPos, double oldAzimut, ScreenBase const & screen); + + bool AlmostEqualToTheCurrent(m2::PointD const & pos, double azimut) const; + +private: + // Mode bits + // { + static uint32_t const FixedZoomBit = 0x20; + static uint32_t const RoutingSessionBit = 0x40; + static uint32_t const KnownDirectionBit = 0x80; + static uint32_t const BlockAnimation = 0x100; + static uint32_t const StopFollowOnActionEnd = 0x200; + // } + + uint32_t m_modeInfo; // combination of Mode enum and "Mode bits" + location::EMyPositionMode m_afterPendingMode; + + location::TMyPositionModeChanged m_modeChangeCallback; + drape_ptr m_shape; + ref_ptr m_listener; + + double m_errorRadius; //< error radius in mercator + m2::PointD m_position; //< position in mercator + double m_drawDirection; + my::HighResTimer m_lastGPSBearing; + + m2::RectD m_pixelRect; + + bool m_isVisible; + bool m_isDirtyViewport; + + class MyPositionAnim; + mutable drape_ptr m_anim; +}; + +} diff --git a/map/navigator.cpp b/drape_frontend/navigator.cpp similarity index 57% rename from map/navigator.cpp rename to drape_frontend/navigator.cpp index b32a723df6..29927161a9 100644 --- a/map/navigator.cpp +++ b/drape_frontend/navigator.cpp @@ -1,4 +1,5 @@ -#include "map/navigator.hpp" +#include "drape_frontend/navigator.hpp" +#include "drape_frontend/visual_params.hpp" #include "indexer/scales.hpp" @@ -14,26 +15,29 @@ #include "std/function.hpp" #include "std/bind.hpp" - namespace { - /// @todo Review this logic in future. - /// Fix bug with floating point calculations (before Android release). - void ReduceRectHack(m2::RectD & r) - { - r.Inflate(-1.0E-9, -1.0E-9); - } + +/// @todo Review this logic in future. +/// Fix bug with floating point calculations (before Android release). +void ReduceRectHack(m2::RectD & r) +{ + r.Inflate(-1.0E-9, -1.0E-9); } -Navigator::Navigator(ScalesProcessor const & scales) - : m_scales(scales), - m_InAction(false) +} // namespace + +namespace df +{ + +Navigator::Navigator() + : m_InAction(false) { } void Navigator::SetFromRects(m2::AnyRectD const & glbRect, m2::RectD const & pxRect) { - m2::RectD const & worldR = m_scales.GetWorldRect(); + m2::RectD const & worldR = df::GetWorldRect(); m_Screen.SetFromRects(glbRect, pxRect); m_Screen = ScaleInto(m_Screen, worldR); @@ -47,16 +51,23 @@ void Navigator::SetFromRects(m2::AnyRectD const & glbRect, m2::RectD const & pxR void Navigator::SetFromRect(m2::AnyRectD const & r) { - m2::RectD const & worldR = m_scales.GetWorldRect(); + VisualParams const & p = VisualParams::Instance(); + SetFromRect(r, p.GetTileSize(), p.GetVisualScale()); +} - m_Screen.SetFromRect(r); - m_Screen = ScaleInto(m_Screen, worldR); +void Navigator::SetFromRect(m2::AnyRectD const & r, uint32_t tileSize, double visualScale) +{ + m2::RectD const & worldR = df::GetWorldRect(); + + ScreenBase tmp = m_Screen; + + tmp.SetFromRect(r); + tmp = ScaleInto(tmp, worldR); + if (CheckMaxScale(tmp, tileSize, visualScale)) + m_Screen = tmp; if (!m_InAction) - { - m_StartScreen.SetFromRect(r); - m_StartScreen = ScaleInto(m_StartScreen, worldR); - } + m_StartScreen = tmp; } void Navigator::CenterViewport(m2::PointD const & p) @@ -73,43 +84,44 @@ void Navigator::CenterViewport(m2::PointD const & p) m_StartScreen.SetOrg(pt); } -double Navigator::ComputeMoveSpeed(m2::PointD const & /*p0*/, m2::PointD const & /*p1*/) const +void Navigator::SaveState() { - // we think that with fixed time interval will be better - return 0.2;//max(0.5, min(0.5, 0.5 * GtoP(p0).Length(GtoP(p1)) / 50.0)); + Settings::Set("ScreenClipRect", m_Screen.GlobalRect()); } -void Navigator::OnSize(int x0, int y0, int w, int h) +bool Navigator::LoadState() { - m2::RectD const & worldR = m_scales.GetWorldRect(); + m2::AnyRectD rect; + if (!Settings::Get("ScreenClipRect", rect)) + return false; - m_Screen.OnSize(x0, y0, w, h); + // additional check for valid rect + if (!df::GetWorldRect().IsRectInside(rect.GetGlobalRect())) + return false; + + SetFromRect(rect); + return true; +} + +void Navigator::OnSize(int w, int h) +{ + m2::RectD const & worldR = df::GetWorldRect(); + + m_Screen.OnSize(0, 0, w, h); m_Screen = ShrinkAndScaleInto(m_Screen, worldR); - m_StartScreen.OnSize(x0, y0, w, h); + m_StartScreen.OnSize(0, 0, w, h); m_StartScreen = ShrinkAndScaleInto(m_StartScreen, worldR); } m2::PointD Navigator::GtoP(m2::PointD const & pt) const { - return m_Screen.GtoP(pt) - ShiftPoint(m2::PointD(0.0, 0.0)); + return m_Screen.GtoP(pt); } m2::PointD Navigator::PtoG(m2::PointD const & pt) const { - return m_Screen.PtoG(ShiftPoint(pt)); -} - -void Navigator::GetTouchRect(m2::PointD const & pixPoint, double pixRadius, m2::AnyRectD & glbRect) const -{ - m_Screen.GetTouchRect(ShiftPoint(pixPoint), pixRadius, glbRect); -} - -void Navigator::GetTouchRect(m2::PointD const & pixPoint, - double pxWidth, double pxHeight, - m2::AnyRectD & glbRect) const -{ - m_Screen.GetTouchRect(ShiftPoint(pixPoint), pxWidth, pxHeight, glbRect); + return m_Screen.PtoG(pt); } bool Navigator::CanShrinkInto(ScreenBase const & screen, m2::RectD const & boundRect) @@ -123,8 +135,6 @@ ScreenBase const Navigator::ShrinkInto(ScreenBase const & screen, m2::RectD boun { ReduceRectHack(boundRect); -// ASSERT ( CanShrinkInto(screen, boundRect), () ); - ScreenBase res = screen; m2::RectD clipRect = res.ClipRect(); @@ -144,18 +154,6 @@ ScreenBase const Navigator::ShrinkInto(ScreenBase const & screen, m2::RectD boun return res; } -bool Navigator::CanRotateInto(ScreenBase const & screen, m2::RectD const & boundRect) -{ - /// @todo - return false; -} - -ScreenBase const Navigator::RotateInto(ScreenBase const & screen, m2::RectD const & boundRect) -{ - /// @todo - return screen; -} - ScreenBase const Navigator::ScaleInto(ScreenBase const & screen, m2::RectD boundRect) { ReduceRectHack(boundRect); @@ -279,47 +277,19 @@ ScreenBase const Navigator::ShrinkAndScaleInto(ScreenBase const & screen, m2::Re return res; } -void Navigator::StartRotate(double a, double /*timeInSec*/) -{ - m_StartAngle = a; - m_StartScreen = m_Screen; - m_InAction = true; -} - -void Navigator::DoRotate(double a, double /*timeInSec*/) -{ - ScreenBase tmp = m_StartScreen; - tmp.Rotate(a - m_StartAngle); - m_StartAngle = a; - m_Screen = tmp; - m_StartScreen = tmp; -} - -void Navigator::StopRotate(double a, double timeInSec) -{ - DoRotate(a, timeInSec); - m_InAction = false; -} - -m2::PointD Navigator::ShiftPoint(m2::PointD const & pt) const -{ - m2::RectD const & pxRect = m_Screen.PixelRect(); - return pt + m2::PointD(pxRect.minX(), pxRect.minY()); -} - -void Navigator::StartDrag(m2::PointD const & pt, double /*timeInSec*/) +void Navigator::StartDrag(m2::PointD const & pt) { m_StartPt1 = m_LastPt1 = pt; m_StartScreen = m_Screen; m_InAction = true; } -void Navigator::DoDrag(m2::PointD const & pt, double /*timeInSec*/) +void Navigator::DoDrag(m2::PointD const & pt) { if (m_LastPt1 == pt) return; - ScreenBase const s = ShrinkInto(m_StartScreen, m_scales.GetWorldRect()); + ScreenBase const s = ShrinkInto(m_StartScreen, df::GetWorldRect()); double dx = pt.x - m_StartPt1.x; double dy = pt.y - m_StartPt1.y; @@ -346,9 +316,9 @@ void Navigator::DoDrag(m2::PointD const & pt, double /*timeInSec*/) } } -void Navigator::StopDrag(m2::PointD const & pt, double timeInSec, bool /*animate*/) +void Navigator::StopDrag(m2::PointD const & pt) { - DoDrag(pt, timeInSec); + DoDrag(pt); m_InAction = false; } @@ -357,7 +327,7 @@ bool Navigator::InAction() const return m_InAction; } -void Navigator::StartScale(m2::PointD const & pt1, m2::PointD const & pt2, double /*timeInSec*/) +void Navigator::StartScale(m2::PointD const & pt1, m2::PointD const & pt2) { m_StartScreen = m_Screen; m_StartPt1 = m_LastPt1 = pt1; @@ -401,127 +371,60 @@ namespace } } -void Navigator::ScaleToPoint(m2::PointD const & pt, double factor, double /*timeInSec*/) +void Navigator::Scale(m2::PointD const & pt, double factor) { - m2::PointD startPt, endPt; - CalcScalePoints(pt, factor, m_Screen.PixelRect(), startPt, endPt); - ScaleImpl(pt, endPt, pt, startPt, factor > 1, false); + CalculateScale(pt, factor, m_Screen); } -namespace -{ - class ZoomAnim : public anim::Task - { - public: - typedef function TScaleImplFn; - ZoomAnim(m2::PointD const & startPt, m2::PointD const & endPt, - m2::PointD const & target, TScaleImplFn const & fn, double deltaTime) - : m_fn(fn) - , m_startTime(0.0) - , m_deltaTime(deltaTime) - { - m_finger1Start = target + (startPt - target); - m_prevPt1 = m_finger1Start; - m_deltaFinger1 = (endPt - startPt); - - m_finger2Start = target - (startPt - target); - m_prevPt2 = m_finger2Start; - m_deltaFinger2 = -(endPt - startPt); - } - - virtual bool IsVisual() const { return true; } - - void OnStart(double ts) - { - m_startTime = ts; - } - - void OnStep(double ts) - { - double elapsed = ts - m_startTime; - if (my::AlmostEqualULPs(elapsed, 0.0)) - return; - - double t = elapsed / m_deltaTime; - if (t > 1.0 || my::AlmostEqualULPs(t, 1.0)) - { - m_fn(m_finger1Start + m_deltaFinger1, m_finger2Start + m_deltaFinger2, m_prevPt1, m_prevPt2); - End(); - return; - } - - m2::PointD const current1 = m_finger1Start + m_deltaFinger1 * t; - m2::PointD const current2 = m_finger2Start + m_deltaFinger2 * t; - m_fn(current1, current2, m_prevPt1, m_prevPt2); - m_prevPt1 = current1; - m_prevPt2 = current2; - } - - private: - m2::PointD m_prevPt1; - m2::PointD m_prevPt2; - - m2::PointD m_finger1Start; - m2::PointD m_deltaFinger1; - m2::PointD m_finger2Start; - m2::PointD m_deltaFinger2; - - TScaleImplFn m_fn; - double m_startTime; - double m_deltaTime; - }; -} - -shared_ptr Navigator::ScaleToPointAnim(m2::PointD const & pt, double factor, double timeInSec) +void Navigator::CalculateScale(m2::PointD const & pt, double factor, ScreenBase & screen) { m2::PointD startPt, endPt; - CalcScalePoints(pt, factor, m_Screen.PixelRect(), startPt, endPt); - ZoomAnim * anim = new ZoomAnim(startPt, endPt, pt, - bind(&Navigator::ScaleImpl, this, _1, _2, _3, _4, factor > 1, false), - timeInSec); - - return shared_ptr(anim); + CalcScalePoints(pt, factor, screen.PixelRect(), startPt, endPt); + ScaleImpl(pt, endPt, pt, startPt, factor > 1, false, screen); } bool Navigator::CheckMinScale(ScreenBase const & screen) const { m2::RectD const & r = screen.ClipRect(); - m2::RectD const & worldR = m_scales.GetWorldRect(); + m2::RectD const & worldR = df::GetWorldRect(); return (r.SizeX() <= worldR.SizeX() || r.SizeY() <= worldR.SizeY()); } bool Navigator::CheckMaxScale(ScreenBase const & screen) const { - return (m_scales.GetDrawTileScale(screen) <= scales::GetUpperStyleScale()); + VisualParams const & p = VisualParams::Instance(); + return CheckMaxScale(screen, p.GetTileSize(), p.GetVisualScale()); +} + +bool Navigator::CheckMaxScale(ScreenBase const & screen, uint32_t tileSize, double visualScale) const +{ + return (df::GetDrawTileScale(screen, tileSize, visualScale) <= scales::GetUpperStyleScale()); } bool Navigator::CheckBorders(ScreenBase const & screen) const { m2::RectD const & r = screen.ClipRect(); - m2::RectD const & worldR = m_scales.GetWorldRect(); + m2::RectD const & worldR = df::GetWorldRect(); return (r.IsRectInside(worldR) || worldR.IsRectInside(r)); } bool Navigator::ScaleImpl(m2::PointD const & newPt1, m2::PointD const & newPt2, m2::PointD const & oldPt1, m2::PointD const & oldPt2, - bool skipMinScaleAndBordersCheck, - bool doRotateScreen) + bool skipMinScaleAndBordersCheck, bool doRotateScreen, + ScreenBase & screen) { - math::Matrix newM = m_Screen.GtoPMatrix() * ScreenBase::CalcTransform(oldPt1, oldPt2, newPt1, newPt2); - - double oldAngle = m_Screen.GetAngle(); - ScreenBase tmp = m_Screen; + math::Matrix const newM = + screen.GtoPMatrix() * ScreenBase::CalcTransform(oldPt1, oldPt2, + newPt1, newPt2, doRotateScreen); + ScreenBase tmp = screen; tmp.SetGtoPMatrix(newM); - if (!doRotateScreen) - tmp.Rotate(-(tmp.GetAngle() - oldAngle)); if (!skipMinScaleAndBordersCheck && !CheckMinScale(tmp)) return false; - m2::RectD const & worldR = m_scales.GetWorldRect(); + m2::RectD const & worldR = df::GetWorldRect(); if (!skipMinScaleAndBordersCheck && !CheckBorders(tmp)) { @@ -538,13 +441,17 @@ bool Navigator::ScaleImpl(m2::PointD const & newPt1, m2::PointD const & newPt2, if (!CheckBorders(tmp)) tmp = ScaleInto(tmp, worldR); - m_Screen = tmp; + screen = tmp; return true; } -void Navigator::DoScale(m2::PointD const & pt1, m2::PointD const & pt2, double /*timeInSec*/) +void Navigator::DoScale(m2::PointD const & pt1, m2::PointD const & pt2) { - if (m_LastPt1 == pt1 && m_LastPt2 == pt2) + double const threshold = df::VisualParams::Instance().GetScaleThreshold(); + double const deltaPt1 = (pt1 - m_LastPt1).Length(); + double const deltaPt2 = (pt2 - m_LastPt2).Length(); + + if (deltaPt1 < threshold && deltaPt2 < threshold) return; if (pt1 == pt2) return; @@ -581,10 +488,9 @@ void Navigator::DoScale(m2::PointD const & pt1, m2::PointD const & pt2, double / m_Screen = PrevScreen; - if (!ScaleImpl(pt1, pt2, - m_LastPt1, m_LastPt2, + if (!ScaleImpl(pt1, pt2, m_LastPt1, m_LastPt2, pt1.Length(pt2) > m_LastPt1.Length(m_LastPt2), - m_IsRotatingDuringScale)) + m_IsRotatingDuringScale, m_Screen)) { m_Screen = PrevScreen; } @@ -593,13 +499,9 @@ void Navigator::DoScale(m2::PointD const & pt1, m2::PointD const & pt2, double / m_LastPt2 = pt2; } -void Navigator::StopScale(m2::PointD const & pt1, m2::PointD const & pt2, double timeInSec) +void Navigator::StopScale(m2::PointD const & pt1, m2::PointD const & pt2) { - DoScale(pt1, pt2, timeInSec); - - ASSERT_EQUAL(m_LastPt1, pt1, ()); - ASSERT_EQUAL(m_LastPt2, pt2, ()); - + DoScale(pt1, pt2); m_InAction = false; } @@ -608,47 +510,56 @@ bool Navigator::IsRotatingDuringScale() const return m_IsRotatingDuringScale; } -void Navigator::Scale(double scale) +m2::AnyRectD ToRotated(Navigator const & navigator, m2::RectD const & rect) { - ScaleToPoint(m_Screen.PixelRect().Center(), scale, 0); + double const dx = rect.SizeX(); + double const dy = rect.SizeY(); + + return m2::AnyRectD(rect.Center(), + navigator.Screen().GetAngle(), + m2::RectD(-dx/2, -dy/2, dx/2, dy/2)); } -shared_ptr Navigator::ScaleAnim(double scale) +void CheckMinGlobalRect(m2::RectD & rect, uint32_t tileSize, double visualScale) { - return ScaleToPointAnim(m_Screen.PixelRect().Center() + m2::PointD(0.0, 300.0), scale, 0.3); + m2::RectD const minRect = df::GetRectForDrawScale(scales::GetUpperStyleScale(), rect.Center(), tileSize, visualScale); + if (minRect.IsRectInside(rect)) + rect = minRect; } -void Navigator::Rotate(double angle) +void CheckMinGlobalRect(m2::RectD & rect) { - m_Screen.Rotate(angle); + VisualParams const & p = VisualParams::Instance(); + CheckMinGlobalRect(rect, p.GetTileSize(), p.GetVisualScale()); } -void Navigator::SetAngle(double angle) +void CheckMinMaxVisibleScale(TIsCountryLoaded const & fn, m2::RectD & rect, int maxScale, + uint32_t tileSize, double visualScale) { - m_Screen.SetAngle(angle); + CheckMinGlobalRect(rect, tileSize, visualScale); + + m2::PointD const c = rect.Center(); + int const worldS = scales::GetUpperWorldScale(); + + int scale = df::GetDrawTileScale(rect, tileSize, visualScale); + if (scale > worldS && !fn(c)) + { + // country is not loaded - limit on world scale + rect = df::GetRectForDrawScale(worldS, c, tileSize, visualScale); + scale = worldS; + } + + if (maxScale != -1 && scale > maxScale) + { + // limit on passed maximal scale + rect = df::GetRectForDrawScale(maxScale, c, tileSize, visualScale); + } } -void Navigator::SetOrg(m2::PointD const & org) +void CheckMinMaxVisibleScale(TIsCountryLoaded const & fn, m2::RectD & rect, int maxScale) { - ScreenBase tmp = m_Screen; - tmp.SetOrg(org); - if (CheckBorders(tmp)) - m_Screen = tmp; + VisualParams const & p = VisualParams::Instance(); + CheckMinMaxVisibleScale(fn, rect, maxScale, p.GetTileSize(), p.GetVisualScale()); } -void Navigator::Move(double azDir, double factor) -{ - m2::RectD const r = m_Screen.ClipRect(); - m_Screen.MoveG(m2::PointD(r.SizeX() * factor * cos(azDir), r.SizeY() * factor * sin(azDir))); -} - -bool Navigator::Update(double timeInSec) -{ - m_LastUpdateTimeInSec = timeInSec; - return false; -} - -int Navigator::GetDrawScale() const -{ - return m_scales.GetDrawTileScale(m_Screen); -} +} // namespace df diff --git a/drape_frontend/navigator.hpp b/drape_frontend/navigator.hpp new file mode 100644 index 0000000000..12aa815016 --- /dev/null +++ b/drape_frontend/navigator.hpp @@ -0,0 +1,96 @@ +#pragma once + +#include "geometry/screenbase.hpp" + +#include "base/matrix.hpp" + +#include "std/shared_ptr.hpp" +#include "std/function.hpp" + +namespace df +{ + +/// Calculates screen parameters in navigation (dragging, scaling, etc.). +class Navigator +{ +public: + Navigator(); + + void SetFromRect(m2::AnyRectD const & r); + void CenterViewport(m2::PointD const & p); + void SetFromRects(m2::AnyRectD const & glbRect, m2::RectD const & pxRect); + void SetFromRect(m2::AnyRectD const & r, uint32_t tileSize, double visualScale); + + void SaveState(); + /// @return false if can't load previously saved values + bool LoadState(); + + void OnSize(int w, int h); + + ScreenBase const & Screen() const { return m_Screen; } + ScreenBase const & StartScreen() const { return m_StartScreen; } + + m2::PointD GtoP(m2::PointD const & pt) const; + m2::PointD PtoG(m2::PointD const & pt) const; + + void StartDrag(m2::PointD const & pt); + void DoDrag(m2::PointD const & pt); + void StopDrag(m2::PointD const & pt); + + void StartScale(m2::PointD const & pt1, m2::PointD const & pt2); + void DoScale(m2::PointD const & org, m2::PointD const & p1, m2::PointD const & p2); + void DoScale(m2::PointD const & pt1, m2::PointD const & pt2); + void StopScale(m2::PointD const & pt1, m2::PointD const & pt2); + bool IsRotatingDuringScale() const; + + void Scale(m2::PointD const & pt, double factor); + void CalculateScale(m2::PointD const & pt, double factor, ScreenBase & screen); + bool InAction() const; + +private: + bool CheckMinScale(ScreenBase const & screen) const; + bool CheckMaxScale(ScreenBase const & screen) const; + bool CheckMaxScale(ScreenBase const & screen, uint32_t tileSize, double visualScale) const; + bool CheckBorders(ScreenBase const & screen) const; + + static bool CanShrinkInto(ScreenBase const & screen, m2::RectD const & boundRect); + static ScreenBase const ShrinkInto(ScreenBase const & screen, m2::RectD boundRect); + + static ScreenBase const ScaleInto(ScreenBase const & screen, m2::RectD boundRect); + static ScreenBase const ShrinkAndScaleInto(ScreenBase const & screen, m2::RectD boundRect); + + // Internal screen corresponding to the state when navigation began with StartDrag or StartScale. + ScreenBase m_StartScreen; + // Internal screen to do GtoP() and PtoG() calculations. It is always up to date with navigation. + ScreenBase m_Screen; + // Intial point for dragging and scaling. + m2::PointD m_StartPt1; + // Last point for dragging and scaling. + m2::PointD m_LastPt1; + // Second initial point for scaling. + m2::PointD m_StartPt2; + // Second Last point for scaling. + m2::PointD m_LastPt2; + // Flag, which indicates, whether we are in the middle of some action. + bool m_InAction; + // Should we check for threshold while scaling by two fingers. + bool m_DoCheckRotationThreshold; + // Do screen rotates during the two fingers scaling. + bool m_IsRotatingDuringScale; + // Used in DoScale and ScaleByPoint + bool ScaleImpl(m2::PointD const & newPt1, m2::PointD const & newPt2, + m2::PointD const & oldPt1, m2::PointD const & oldPt2, + bool skipMinScaleAndBordersCheck, bool doRotateScreen, + ScreenBase & screen); +}; + +m2::AnyRectD ToRotated(Navigator const & navigator, m2::RectD const & rect); +void CheckMinGlobalRect(m2::RectD & rect, uint32_t tileSize, double visualScale); +void CheckMinGlobalRect(m2::RectD & rect); + +using TIsCountryLoaded = function; +void CheckMinMaxVisibleScale(TIsCountryLoaded const & fn, m2::RectD & rect, int maxScale/* = -1*/, + uint32_t tileSize, double visualScale); +void CheckMinMaxVisibleScale(TIsCountryLoaded const & fn, m2::RectD & rect, int maxScale/* = -1*/); + +} diff --git a/drape_frontend/path_symbol_shape.cpp b/drape_frontend/path_symbol_shape.cpp index a4e189917d..d65ec00590 100644 --- a/drape_frontend/path_symbol_shape.cpp +++ b/drape_frontend/path_symbol_shape.cpp @@ -21,7 +21,7 @@ PathSymbolShape::PathSymbolShape(m2::SharedSpline const & spline, { } -void PathSymbolShape::Draw(dp::RefPointer batcher, dp::RefPointer textures) const +void PathSymbolShape::Draw(ref_ptr batcher, ref_ptr textures) const { dp::TextureManager::SymbolRegion region; textures->GetSymbolRegion(m_params.m_symbolName, region); @@ -48,23 +48,22 @@ void PathSymbolShape::Draw(dp::RefPointer batcher, dp::RefPointer(buffer.data())); - batcher->InsertListOfStrip(state, dp::MakeStackRefPointer(&provider), 4); + dp::AttributeProvider provider(1, buffer.size()); + provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), make_ref(buffer.data())); + batcher->InsertListOfStrip(state, make_ref(&provider), 4); } } diff --git a/drape_frontend/path_symbol_shape.hpp b/drape_frontend/path_symbol_shape.hpp index c78afb9a3d..2366de3544 100644 --- a/drape_frontend/path_symbol_shape.hpp +++ b/drape_frontend/path_symbol_shape.hpp @@ -12,7 +12,8 @@ class PathSymbolShape : public MapShape { public: PathSymbolShape(m2::SharedSpline const & spline, PathSymbolViewParams const & params); - virtual void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; + void Draw(ref_ptr batcher, ref_ptr textures) const override; + MapShapePriority GetPriority() const override { return MapShapePriority::LinePriority; } private: PathSymbolViewParams m_params; diff --git a/drape_frontend/path_text_shape.cpp b/drape_frontend/path_text_shape.cpp index f328ceea54..03f42e75e4 100644 --- a/drape_frontend/path_text_shape.cpp +++ b/drape_frontend/path_text_shape.cpp @@ -1,12 +1,14 @@ #include "drape_frontend/path_text_shape.hpp" +#include "drape_frontend/text_handle.hpp" #include "drape_frontend/text_layout.hpp" #include "drape_frontend/visual_params.hpp" #include "drape_frontend/intrusive_vector.hpp" -#include "drape/shader_def.hpp" #include "drape/attribute_provider.hpp" -#include "drape/glstate.hpp" #include "drape/batcher.hpp" +#include "drape/glstate.hpp" +#include "drape/shader_def.hpp" +#include "drape/overlay_handle.hpp" #include "base/math.hpp" #include "base/logging.hpp" @@ -24,85 +26,76 @@ using m2::Spline; namespace { - class PathTextHandle : public dp::OverlayHandle + +class PathTextHandle : public df::TextHandle +{ +public: + PathTextHandle(m2::SharedSpline const & spl, + df::SharedTextLayout const & layout, + float const mercatorOffset, uint64_t priority, + ref_ptr textureManager) + : TextHandle(FeatureID(), layout->GetText(), dp::Center, priority, textureManager) + , m_spline(spl) + , m_layout(layout) { - public: - PathTextHandle(m2::SharedSpline const & spl, - df::SharedTextLayout const & layout, - float const mercatorOffset, - float const depth) - : OverlayHandle(FeatureID(), dp::Center, depth) - , m_spline(spl) - , m_layout(layout) + m_centerPointIter = m_spline.CreateIterator(); + m_centerPointIter.Advance(mercatorOffset); + m_normals.resize(4 * m_layout->GetGlyphCount()); + } + + bool Update(ScreenBase const & screen) override + { + if (!df::TextHandle::Update(screen)) + return false; + + return m_layout->CacheDynamicGeometry(m_centerPointIter, screen, m_normals); + } + + m2::RectD GetPixelRect(ScreenBase const & screen) const override + { + m2::PointD const pixelPivot(screen.GtoP(m_centerPointIter.m_pos)); + m2::RectD result; + for (gpu::TextDynamicVertex const & v : m_normals) + result.Add(pixelPivot + glsl::ToPoint(v.m_normal)); + + return result; + } + + void GetPixelShape(ScreenBase const & screen, Rects & rects) const override + { + m2::PointD const pixelPivot(screen.GtoP(m_centerPointIter.m_pos)); + for (size_t quadIndex = 0; quadIndex < m_normals.size(); quadIndex += 4) { - m_centerPointIter = m_spline.CreateIterator(); - m_centerPointIter.Advance(mercatorOffset); - m_normals.resize(4 * m_layout->GetGlyphCount()); - } - - void Update(ScreenBase const & screen) - { - if (m_layout->CacheDynamicGeometry(m_centerPointIter, screen, m_normals)) - { - SetIsValid(true); - return; - } - - SetIsValid(false); - } - - m2::RectD GetPixelRect(ScreenBase const & screen) const - { - ASSERT(IsValid(), ()); - - m2::PointD pixelPivot(screen.GtoP(m_centerPointIter.m_pos)); - m2::RectD result; - for (gpu::TextDynamicVertex const & v : m_normals) - result.Add(pixelPivot + glsl::ToPoint(v.m_normal)); - - return result; - } - - void GetPixelShape(ScreenBase const & screen, Rects & rects) const - { - ASSERT(IsValid(), ()); - - m2::PointD pixelPivot(screen.GtoP(m_centerPointIter.m_pos)); - for (size_t quadIndex = 0; quadIndex < m_normals.size(); quadIndex += 4) - { - m2::RectF r; - r.Add(pixelPivot + glsl::ToPoint(m_normals[quadIndex].m_normal)); - r.Add(pixelPivot + glsl::ToPoint(m_normals[quadIndex + 1].m_normal)); - r.Add(pixelPivot + glsl::ToPoint(m_normals[quadIndex + 2].m_normal)); - r.Add(pixelPivot + glsl::ToPoint(m_normals[quadIndex + 3].m_normal)); + m2::RectF r; + r.Add(pixelPivot + glsl::ToPoint(m_normals[quadIndex].m_normal)); + r.Add(pixelPivot + glsl::ToPoint(m_normals[quadIndex + 1].m_normal)); + r.Add(pixelPivot + glsl::ToPoint(m_normals[quadIndex + 2].m_normal)); + r.Add(pixelPivot + glsl::ToPoint(m_normals[quadIndex + 3].m_normal)); + if (screen.PixelRect().IsIntersect(m2::RectD(r))) rects.push_back(r); - } } + } - void GetAttributeMutation(dp::RefPointer mutator, ScreenBase const & screen) const - { - ASSERT(IsValid(), ()); + void GetAttributeMutation(ref_ptr mutator, + ScreenBase const & screen) const override + { + // for visible text paths we always update normals + SetForceUpdateNormals(IsVisible()); + TextHandle::GetAttributeMutation(mutator, screen); + } - TOffsetNode const & node = GetOffsetNode(gpu::TextDynamicVertex::GetDynamicStreamID()); - ASSERT(node.first.GetElementSize() == sizeof(gpu::TextDynamicVertex), ()); - ASSERT(node.second.m_count == m_normals.size(), ()); + uint64_t GetPriorityMask() const override + { + return dp::kPriorityMaskManual | dp::kPriorityMaskRank; + } - uint32_t byteCount = m_normals.size() * sizeof(gpu::TextDynamicVertex); - void * buffer = mutator->AllocateMutationBuffer(byteCount); - memcpy(buffer, m_normals.data(), byteCount); - dp::MutateNode mutateNode; - mutateNode.m_region = node.second; - mutateNode.m_data = dp::MakeStackRefPointer(buffer); - mutator->AddMutation(node.first, mutateNode); - } +private: + m2::SharedSpline m_spline; + m2::Spline::iterator m_centerPointIter; - private: - m2::SharedSpline m_spline; - m2::Spline::iterator m_centerPointIter; - gpu::TTextDynamicVertexBuffer m_normals; + df::SharedTextLayout m_layout; +}; - df::SharedTextLayout m_layout; - }; } namespace df @@ -112,14 +105,17 @@ PathTextShape::PathTextShape(m2::SharedSpline const & spline, PathTextViewParams const & params) : m_spline(spline) , m_params(params) +{} + +uint64_t PathTextShape::GetOverlayPriority() const { + return dp::CalculateOverlayPriority(m_params.m_minVisibleScale, m_params.m_rank, m_params.m_depth); } -void PathTextShape::Draw(dp::RefPointer batcher, dp::RefPointer textures) const +void PathTextShape::Draw(ref_ptr batcher, ref_ptr textures) const { - PathTextLayout * layout = new PathTextLayout(strings::MakeUniString(m_params.m_text), - m_params.m_textFont.m_size, - textures); + unique_ptr layout = make_unique(strings::MakeUniString(m_params.m_text), + m_params.m_textFont.m_size, textures); uint32_t glyphCount = layout->GetGlyphCount(); if (glyphCount == 0) @@ -185,14 +181,13 @@ void PathTextShape::Draw(dp::RefPointer batcher, dp::RefPointerGetColorRegion(m_params.m_textFont.m_outlineColor, outline); dp::GLState state(gpu::TEXT_PROGRAM, dp::GLState::OverlayLayer); - state.SetBlending(dp::Blending(true)); state.SetColorTexture(color.GetTexture()); state.SetMaskTexture(layout->GetMaskTexture()); ASSERT(!offsets.empty(), ()); gpu::TTextStaticVertexBuffer staticBuffer; gpu::TTextDynamicVertexBuffer dynBuffer; - SharedTextLayout layoutPtr(layout); + SharedTextLayout layoutPtr(layout.release()); for (float offset : offsets) { staticBuffer.clear(); @@ -200,17 +195,19 @@ void PathTextShape::Draw(dp::RefPointer batcher, dp::RefPointerCacheStaticGeometry(glsl::vec3(glsl::ToVec2(iter.m_pos), m_params.m_depth), - color, outline, staticBuffer); + layoutPtr->CacheStaticGeometry(glsl::vec3(glsl::ToVec2(iter.m_pos), m_params.m_depth), + color, outline, staticBuffer); dynBuffer.resize(staticBuffer.size(), gpu::TextDynamicVertex(glsl::vec2(0.0, 0.0))); dp::AttributeProvider provider(2, staticBuffer.size()); - provider.InitStream(0, gpu::TextStaticVertex::GetBindingInfo(), dp::MakeStackRefPointer(staticBuffer.data())); - provider.InitStream(1, gpu::TextDynamicVertex::GetBindingInfo(), dp::MakeStackRefPointer(dynBuffer.data())); + provider.InitStream(0, gpu::TextStaticVertex::GetBindingInfo(), make_ref(staticBuffer.data())); + provider.InitStream(1, gpu::TextDynamicVertex::GetBindingInfo(), make_ref(dynBuffer.data())); - dp::OverlayHandle * handle = new PathTextHandle(m_spline, layoutPtr, offset, m_params.m_depth); - batcher->InsertListOfStrip(state, dp::MakeStackRefPointer(&provider), dp::MovePointer(handle), 4); + drape_ptr handle = make_unique_dp(m_spline, layoutPtr, offset, + GetOverlayPriority(), + textures); + batcher->InsertListOfStrip(state, make_ref(&provider), move(handle), 4); } } diff --git a/drape_frontend/path_text_shape.hpp b/drape_frontend/path_text_shape.hpp index cebf68deef..cf1806568d 100644 --- a/drape_frontend/path_text_shape.hpp +++ b/drape_frontend/path_text_shape.hpp @@ -11,11 +11,13 @@ namespace df class PathTextShape : public MapShape { public: - PathTextShape(m2::SharedSpline const & spline, - PathTextViewParams const & params); - virtual void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; + PathTextShape(m2::SharedSpline const & spline, PathTextViewParams const & params); + void Draw(ref_ptr batcher, ref_ptr textures) const override; + MapShapePriority GetPriority() const override { return MapShapePriority::LinePriority; } private: + uint64_t GetOverlayPriority() const; + m2::SharedSpline m_spline; PathTextViewParams m_params; }; diff --git a/drape_frontend/poi_symbol_shape.cpp b/drape_frontend/poi_symbol_shape.cpp index 3e61c1747a..acd167ac48 100644 --- a/drape_frontend/poi_symbol_shape.cpp +++ b/drape_frontend/poi_symbol_shape.cpp @@ -2,9 +2,9 @@ #include "drape/utils/vertex_decl.hpp" #include "drape/attribute_provider.hpp" -#include "drape/texture_manager.hpp" -#include "drape/glstate.hpp" #include "drape/batcher.hpp" +#include "drape/glstate.hpp" +#include "drape/texture_manager.hpp" #include "drape/shader_def.hpp" @@ -14,15 +14,14 @@ namespace df PoiSymbolShape::PoiSymbolShape(m2::PointF const & mercatorPt, PoiSymbolViewParams const & params) : m_pt(mercatorPt) , m_params(params) -{ -} +{} -void PoiSymbolShape::Draw(dp::RefPointer batcher, dp::RefPointer textures) const +void PoiSymbolShape::Draw(ref_ptr batcher, ref_ptr textures) const { dp::TextureManager::SymbolRegion region; textures->GetSymbolRegion(m_params.m_symbolName, region); - m2::PointU pixelSize = region.GetPixelSize(); + m2::PointU const pixelSize = region.GetPixelSize(); m2::PointF const halfSize(pixelSize.x / 2.0, pixelSize.y / 2.0); m2::RectF const & texRect = region.GetTexRect(); @@ -31,33 +30,39 @@ void PoiSymbolShape::Draw(dp::RefPointer batcher, dp::RefPointer(vertexes)); + provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), make_ref(vertexes)); - dp::OverlayHandle * handle = new dp::SquareHandle(m_params.m_id, - dp::Center, - m_pt, - pixelSize, - m_params.m_depth); + m2::PointU const size = pixelSize + m2::PointU(m_params.m_extendingSize, + m_params.m_extendingSize) * 2; + drape_ptr handle = make_unique_dp(m_params.m_id, + dp::Center, + m_pt, size, + GetOverlayPriority()); - batcher->InsertTriangleStrip(state, dp::MakeStackRefPointer(&provider), dp::MovePointer(handle)); + batcher->InsertTriangleStrip(state, make_ref(&provider), move(handle)); +} + +uint64_t PoiSymbolShape::GetOverlayPriority() const +{ + return dp::CalculateOverlayPriority(m_params.m_minVisibleScale, m_params.m_rank, m_params.m_depth); } } // namespace df diff --git a/drape_frontend/poi_symbol_shape.hpp b/drape_frontend/poi_symbol_shape.hpp index 6038ab8d5f..a198d22452 100644 --- a/drape_frontend/poi_symbol_shape.hpp +++ b/drape_frontend/poi_symbol_shape.hpp @@ -11,9 +11,12 @@ class PoiSymbolShape : public MapShape public: PoiSymbolShape(m2::PointF const & mercatorPt, PoiSymbolViewParams const & params); - virtual void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; + void Draw(ref_ptr batcher, ref_ptr textures) const override; + MapShapePriority GetPriority() const override { return MapShapePriority::TextAndPoiPriority; } private: + uint64_t GetOverlayPriority() const; + m2::PointF const m_pt; PoiSymbolViewParams const m_params; }; diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp old mode 100644 new mode 100755 index 666e224b7d..29ca1bae37 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -1,4 +1,5 @@ #include "drape_frontend/read_manager.hpp" +#include "drape_frontend/message_subclasses.hpp" #include "drape_frontend/visual_params.hpp" #include "platform/platform.hpp" @@ -30,38 +31,62 @@ struct LessCoverageCell } // namespace -ReadManager::ReadManager(EngineContext & context, MapDataProvider & model) - : m_context(context) +ReadManager::ReadManager(ref_ptr commutator, MapDataProvider & model) + : m_commutator(commutator) , m_model(model) - , myPool(64, ReadMWMTaskFactory(m_memIndex, m_model, m_context)) + , m_pool(make_unique_dp(ReadCount(), bind(&ReadManager::OnTaskFinished, this, _1))) + , m_forceUpdate(true) + , myPool(64, ReadMWMTaskFactory(m_memIndex, m_model)) + , m_counter(0) { - m_pool.Reset(new threads::ThreadPool(ReadCount(), bind(&ReadManager::OnTaskFinished, this, _1))); } void ReadManager::OnTaskFinished(threads::IRoutine * task) { ASSERT(dynamic_cast(task) != NULL, ()); ReadMWMTask * t = static_cast(task); + + // finish tiles + { + lock_guard lock(m_finishedTilesMutex); + + // add finished tile to collection + m_finishedTiles.emplace(t->GetTileKey()); + + // decrement counter + ASSERT(m_counter > 0, ()); + --m_counter; + if (m_counter == 0) + { + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(m_finishedTiles), + MessagePriority::Normal); + m_finishedTiles.clear(); + } + } + t->Reset(); myPool.Return(t); } -void ReadManager::UpdateCoverage(ScreenBase const & screen, set const & tiles) +void ReadManager::UpdateCoverage(ScreenBase const & screen, TTilesCollection const & tiles, ref_ptr texMng) { - if (screen == m_currentViewport) + if (screen == m_currentViewport && !m_forceUpdate) return; + m_forceUpdate = false; if (MustDropAllTiles(screen)) { + IncreaseCounter(static_cast(tiles.size())); + for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::CancelTileInfo, this, _1)); m_tileInfos.clear(); - - for_each(tiles.begin(), tiles.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1)); + for_each(tiles.begin(), tiles.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1, texMng)); } else { // Find rects that go out from viewport - buffer_vector outdatedTiles; + buffer_vector, 8> outdatedTiles; #ifdef _MSC_VER vs_bug:: #endif @@ -78,24 +103,31 @@ void ReadManager::UpdateCoverage(ScreenBase const & screen, set const & m_tileInfos.begin(), m_tileInfos.end(), back_inserter(inputRects), LessCoverageCell()); + IncreaseCounter(static_cast(inputRects.size() + (m_tileInfos.size() - outdatedTiles.size()))); + for_each(outdatedTiles.begin(), outdatedTiles.end(), bind(&ReadManager::ClearTileInfo, this, _1)); for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::PushTaskFront, this, _1)); - for_each(inputRects.begin(), inputRects.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1)); + for_each(inputRects.begin(), inputRects.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1, texMng)); } m_currentViewport = screen; } -void ReadManager::Invalidate(set const & keyStorage) +void ReadManager::Invalidate(TTilesCollection const & keyStorage) { - tile_set_t::iterator it = m_tileInfos.begin(); - for (; it != m_tileInfos.end(); ++it) + TTileSet tilesToErase; + for (auto const & info : m_tileInfos) { - if (keyStorage.find((*it)->GetTileKey()) != keyStorage.end()) - { - CancelTileInfo(*it); - PushTaskFront(*it); - } + if (keyStorage.find(info->GetTileKey()) != keyStorage.end()) + tilesToErase.insert(info); } + + for (auto const & info : tilesToErase) + { + CancelTileInfo(info); + m_tileInfos.erase(info); + } + + m_forceUpdate = true; } void ReadManager::Stop() @@ -104,12 +136,12 @@ void ReadManager::Stop() m_tileInfos.clear(); m_pool->Stop(); - m_pool.Destroy(); + m_pool.reset(); } size_t ReadManager::ReadCount() { - return max(GetPlatform().CpuCores() - 2, 1); + return max(static_cast(GetPlatform().CpuCores()) - 2, 1); } bool ReadManager::MustDropAllTiles(ScreenBase const & screen) const @@ -119,31 +151,37 @@ bool ReadManager::MustDropAllTiles(ScreenBase const & screen) const return (oldScale != newScale) || !m_currentViewport.GlobalRect().IsIntersect(screen.GlobalRect()); } -void ReadManager::PushTaskBackForTileKey(TileKey const & tileKey) +void ReadManager::PushTaskBackForTileKey(TileKey const & tileKey, ref_ptr texMng) { - tileinfo_ptr tileInfo(new TileInfo(tileKey)); + shared_ptr tileInfo(new TileInfo(make_unique_dp(tileKey, m_commutator, texMng))); m_tileInfos.insert(tileInfo); ReadMWMTask * task = myPool.Get(); task->Init(tileInfo); m_pool->PushBack(task); } -void ReadManager::PushTaskFront(tileinfo_ptr const & tileToReread) +void ReadManager::PushTaskFront(shared_ptr const & tileToReread) { ReadMWMTask * task = myPool.Get(); task->Init(tileToReread); m_pool->PushFront(task); } -void ReadManager::CancelTileInfo(tileinfo_ptr const & tileToCancel) +void ReadManager::CancelTileInfo(shared_ptr const & tileToCancel) { tileToCancel->Cancel(m_memIndex); } -void ReadManager::ClearTileInfo(tileinfo_ptr const & tileToClear) +void ReadManager::ClearTileInfo(shared_ptr const & tileToClear) { CancelTileInfo(tileToClear); m_tileInfos.erase(tileToClear); } +void ReadManager::IncreaseCounter(int value) +{ + lock_guard lock(m_finishedTilesMutex); + m_counter += value; +} + } // namespace df diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp old mode 100644 new mode 100755 index 6ca2813fc6..600986c4d3 --- a/drape_frontend/read_manager.hpp +++ b/drape_frontend/read_manager.hpp @@ -1,17 +1,21 @@ #pragma once -#include "drape_frontend/memory_feature_index.hpp" #include "drape_frontend/engine_context.hpp" -#include "drape_frontend/tile_info.hpp" +#include "drape_frontend/memory_feature_index.hpp" #include "drape_frontend/read_mwm_task.hpp" +#include "drape_frontend/tile_info.hpp" +#include "drape_frontend/tile_utils.hpp" #include "geometry/screenbase.hpp" -#include "drape/pointers.hpp" #include "drape/object_pool.hpp" +#include "drape/pointers.hpp" +#include "drape/texture_manager.hpp" #include "base/thread_pool.hpp" +#include "std/atomic.hpp" +#include "std/mutex.hpp" #include "std/set.hpp" #include "std/shared_ptr.hpp" @@ -21,15 +25,13 @@ namespace df class MapDataProvider; class CoverageUpdateDescriptor; -typedef shared_ptr tileinfo_ptr; - class ReadManager { public: - ReadManager(EngineContext & context, MapDataProvider & model); + ReadManager(ref_ptr commutator, MapDataProvider & model); - void UpdateCoverage(ScreenBase const & screen, set const & tiles); - void Invalidate(set const & keyStorage); + void UpdateCoverage(ScreenBase const & screen, TTilesCollection const & tiles, ref_ptr texMng); + void Invalidate(TTilesCollection const & keyStorage); void Stop(); static size_t ReadCount(); @@ -38,34 +40,40 @@ private: void OnTaskFinished(threads::IRoutine * task); bool MustDropAllTiles(ScreenBase const & screen) const; - void PushTaskBackForTileKey(TileKey const & tileKey); - void PushTaskFront(tileinfo_ptr const & tileToReread); + void PushTaskBackForTileKey(TileKey const & tileKey, ref_ptr texMng); + void PushTaskFront(shared_ptr const & tileToReread); private: MemoryFeatureIndex m_memIndex; - EngineContext & m_context; + ref_ptr m_commutator; MapDataProvider & m_model; - dp::MasterPointer m_pool; + drape_ptr m_pool; ScreenBase m_currentViewport; + bool m_forceUpdate; - struct LessByTileKey + struct LessByTileInfo { - bool operator ()(tileinfo_ptr const & l, tileinfo_ptr const & r) const + bool operator ()(shared_ptr const & l, shared_ptr const & r) const { return *l < *r; } }; - typedef set tile_set_t; - tile_set_t m_tileInfos; + using TTileSet = set, LessByTileInfo>; + TTileSet m_tileInfos; ObjectPool myPool; - void CancelTileInfo(tileinfo_ptr const & tileToCancel); - void ClearTileInfo(tileinfo_ptr const & tileToClear); + int m_counter; + set m_finishedTiles; + mutex m_finishedTilesMutex; + + void CancelTileInfo(shared_ptr const & tileToCancel); + void ClearTileInfo(shared_ptr const & tileToClear); + void IncreaseCounter(int value); }; } // namespace df diff --git a/drape_frontend/read_mwm_task.cpp b/drape_frontend/read_mwm_task.cpp index 726d708d55..dab66847c7 100644 --- a/drape_frontend/read_mwm_task.cpp +++ b/drape_frontend/read_mwm_task.cpp @@ -1,23 +1,20 @@ #include "drape_frontend/read_mwm_task.hpp" -#include "std/shared_ptr.hpp" - namespace df { -ReadMWMTask::ReadMWMTask(MemoryFeatureIndex & memIndex, MapDataProvider & model, - EngineContext & context) +ReadMWMTask::ReadMWMTask(MemoryFeatureIndex & memIndex, MapDataProvider & model) : m_memIndex(memIndex) , m_model(model) - , m_context(context) { #ifdef DEBUG m_checker = false; #endif } -void ReadMWMTask::Init(weak_ptr const & tileInfo) +void ReadMWMTask::Init(shared_ptr const & tileInfo) { m_tileInfo = tileInfo; + m_tileKey = tileInfo->GetTileKey(); #ifdef DEBUG m_checker = true; #endif @@ -28,6 +25,16 @@ void ReadMWMTask::Reset() #ifdef DEBUG m_checker = false; #endif + m_tileInfo.reset(); +} + +bool ReadMWMTask::IsCancelled() const +{ + shared_ptr tile = m_tileInfo.lock(); + if (tile == nullptr) + return true; + + return tile->IsCancelled() || IRoutine::IsCancelled(); } void ReadMWMTask::Do() @@ -35,16 +42,15 @@ void ReadMWMTask::Do() #ifdef DEBUG ASSERT(m_checker, ()); #endif - shared_ptr tileInfo = m_tileInfo.lock(); - if (tileInfo == NULL) - return; + shared_ptr tile = m_tileInfo.lock(); + if (tile == nullptr) + return; try { - tileInfo->ReadFeatureIndex(m_model); - tileInfo->ReadFeatures(m_model, m_memIndex, m_context); + tile->ReadFeatures(m_model, m_memIndex); } - catch (TileInfo::ReadCanceledException & ex) + catch (TileInfo::ReadCanceledException &) { return; } diff --git a/drape_frontend/read_mwm_task.hpp b/drape_frontend/read_mwm_task.hpp index 37c6f5a2de..c9b1051a6c 100644 --- a/drape_frontend/read_mwm_task.hpp +++ b/drape_frontend/read_mwm_task.hpp @@ -8,30 +8,30 @@ #include "base/object_tracker.hpp" #endif +#include "std/shared_ptr.hpp" #include "std/weak_ptr.hpp" namespace df { -class EngineContext; - class ReadMWMTask : public threads::IRoutine { public: ReadMWMTask(MemoryFeatureIndex & memIndex, - MapDataProvider & model, - EngineContext & context); + MapDataProvider & model); - virtual void Do(); + void Do() override; - void Init(weak_ptr const & tileInfo); - void Reset(); + void Init(shared_ptr const & tileInfo); + void Reset() override; + bool IsCancelled() const override; + TileKey const & GetTileKey() const { return m_tileKey; } private: weak_ptr m_tileInfo; + TileKey m_tileKey; MemoryFeatureIndex & m_memIndex; MapDataProvider & m_model; - EngineContext & m_context; #ifdef DEBUG dbg::ObjectTracker m_objTracker; @@ -43,21 +43,19 @@ class ReadMWMTaskFactory { public: ReadMWMTaskFactory(MemoryFeatureIndex & memIndex, - MapDataProvider & model, - EngineContext & context) + MapDataProvider & model) : m_memIndex(memIndex) - , m_model(model) - , m_context(context) {} + , m_model(model) {} + /// Caller must handle object life cycle ReadMWMTask * GetNew() const { - return new ReadMWMTask(m_memIndex, m_model, m_context); + return new ReadMWMTask(m_memIndex, m_model); } private: MemoryFeatureIndex & m_memIndex; MapDataProvider & m_model; - EngineContext & m_context; }; } // namespace df diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp old mode 100644 new mode 100755 index 9cd57441d8..f1e3cb6b29 --- a/drape_frontend/render_group.cpp +++ b/drape_frontend/render_group.cpp @@ -1,54 +1,107 @@ #include "drape_frontend/render_group.hpp" +#include "drape_frontend/visual_params.hpp" + +#include "drape/debug_rect_renderer.hpp" +#include "drape/shader_def.hpp" + +#include "geometry/screenbase.hpp" #include "base/stl_add.hpp" -#include "geometry/screenbase.hpp" #include "std/bind.hpp" namespace df { +void BaseRenderGroup::SetRenderParams(ref_ptr shader, ref_ptr generalUniforms) +{ + m_shader = shader; + m_generalUniforms = generalUniforms; +} + +void BaseRenderGroup::UpdateAnimation() +{ + m_uniforms.SetFloatValue("u_opacity", 1.0); +} + +void BaseRenderGroup::Render(const ScreenBase &) +{ + ASSERT(m_shader != nullptr, ()); + ASSERT(m_generalUniforms != nullptr, ()); + + m_shader->Bind(); + dp::ApplyState(m_state, m_shader); + dp::ApplyUniforms(*(m_generalUniforms.get()), m_shader); +} + RenderGroup::RenderGroup(dp::GLState const & state, df::TileKey const & tileKey) - : m_state(state) - , m_tileKey(tileKey) + : TBase(state, tileKey) , m_pendingOnDelete(false) { } RenderGroup::~RenderGroup() { - DeleteRange(m_renderBuckets, dp::MasterPointerDeleter()); + m_renderBuckets.clear(); } void RenderGroup::Update(ScreenBase const & modelView) { - for_each(m_renderBuckets.begin(), m_renderBuckets.end(), bind(&dp::RenderBucket::Update, - bind(&dp::NonConstGetter, _1), - modelView)); + ASSERT(m_shader != nullptr, ()); + ASSERT(m_generalUniforms != nullptr, ()); + for(drape_ptr & renderBucket : m_renderBuckets) + renderBucket->Update(modelView); } -void RenderGroup::CollectOverlay(dp::RefPointer tree) +void RenderGroup::CollectOverlay(ref_ptr tree) { - for_each(m_renderBuckets.begin(), m_renderBuckets.end(), bind(&dp::RenderBucket::CollectOverlayHandles, - bind(&dp::NonConstGetter, _1), - tree)); + if (m_pendingOnDelete) + return; + + ASSERT(m_shader != nullptr, ()); + ASSERT(m_generalUniforms != nullptr, ()); + for(drape_ptr & renderBucket : m_renderBuckets) + renderBucket->CollectOverlayHandles(tree, GetOpacity() < 1.0); } void RenderGroup::Render(ScreenBase const & screen) { - ASSERT(m_pendingOnDelete == false, ()); - for_each(m_renderBuckets.begin(), m_renderBuckets.end(), bind(&dp::RenderBucket::Render, - bind(&dp::NonConstGetter, _1), screen)); + BaseRenderGroup::Render(screen); + + if (m_state.GetProgramIndex() == gpu::TEXT_PROGRAM) + { + auto const & params = df::VisualParams::Instance().GetGlyphVisualParams(); + + m_uniforms.SetFloatValue("u_contrastGamma", params.m_outlineContrast, params.m_outlineGamma); + m_uniforms.SetFloatValue("u_isOutlinePass", 1.0f); + dp::ApplyUniforms(m_uniforms, m_shader); + + for(auto & renderBucket : m_renderBuckets) + renderBucket->Render(screen); + + m_uniforms.SetFloatValue("u_contrastGamma", params.m_contrast, params.m_gamma); + m_uniforms.SetFloatValue("u_isOutlinePass", 0.0f); + dp::ApplyUniforms(m_uniforms, m_shader); + for(auto & renderBucket : m_renderBuckets) + renderBucket->Render(screen); + } + else + { + dp::ApplyUniforms(m_uniforms, m_shader); + + for(drape_ptr & renderBucket : m_renderBuckets) + renderBucket->Render(screen); + } + +#ifdef RENDER_DEBUG_RECTS + for(auto const & renderBucket : m_renderBuckets) + renderBucket->RenderDebug(screen); +#endif } -void RenderGroup::PrepareForAdd(size_t countForAdd) +void RenderGroup::AddBucket(drape_ptr && bucket) { - m_renderBuckets.reserve(m_renderBuckets.size() + countForAdd); -} - -void RenderGroup::AddBucket(dp::TransferPointer bucket) -{ - m_renderBuckets.push_back(dp::MasterPointer(bucket)); + m_renderBuckets.push_back(move(bucket)); } bool RenderGroup::IsLess(RenderGroup const & other) const @@ -56,41 +109,85 @@ bool RenderGroup::IsLess(RenderGroup const & other) const return m_state < other.m_state; } -RenderBucketComparator::RenderBucketComparator(set const & activeTiles) - : m_activeTiles(activeTiles) - , m_needGroupMergeOperation(false) - , m_needBucketsMergeOperation(false) +void RenderGroup::UpdateAnimation() { + double const opactity = GetOpacity(); + m_uniforms.SetFloatValue("u_opacity", opactity); } -void RenderBucketComparator::ResetInternalState() +double RenderGroup::GetOpacity() const { - m_needBucketsMergeOperation = false; - m_needGroupMergeOperation = false; + if (m_appearAnimation != nullptr) + return m_appearAnimation->GetOpacity(); + + if (m_disappearAnimation != nullptr) + return m_disappearAnimation->GetOpacity(); + + return 1.0; } -bool RenderBucketComparator::operator()(RenderGroup const * l, RenderGroup const * r) +bool RenderGroup::IsAnimating() const +{ + if (m_appearAnimation && !m_appearAnimation->IsFinished()) + return true; + + if (m_disappearAnimation && !m_disappearAnimation->IsFinished()) + return true; + + return false; +} + +void RenderGroup::Appear() +{ + if (m_state.GetDepthLayer() == dp::GLState::OverlayLayer) + { + m_appearAnimation = make_unique(0.25 /* duration */, 0.0 /* delay */, + 0.0 /* startOpacity */, 1.0 /* endOpacity */); + } +} + +void RenderGroup::Disappear() +{ + if (m_state.GetDepthLayer() == dp::GLState::OverlayLayer) + { + m_disappearAnimation = make_unique(0.1 /* duration */, 0.1 /* delay */, + 1.0 /* startOpacity */, 0.0 /* endOpacity */); + } + else + { + // Create separate disappearing animation for area objects to eliminate flickering. + if (m_state.GetProgramIndex() == gpu::AREA_PROGRAM) + m_disappearAnimation = make_unique(0.01 /* duration */, 0.25 /* delay */, + 1.0 /* startOpacity */, 1.0 /* endOpacity */); + } +} + +bool RenderGroupComparator::operator()(drape_ptr const & l, drape_ptr const & r) { dp::GLState const & lState = l->GetState(); dp::GLState const & rState = r->GetState(); - TileKey const & lKey = l->GetTileKey(); - TileKey const & rKey = r->GetTileKey(); - - if (!l->IsPendingOnDelete() && (l->IsEmpty() || m_activeTiles.find(lKey) == m_activeTiles.end())) + if (!l->IsPendingOnDelete() && l->IsEmpty()) l->DeleteLater(); - if (!r->IsPendingOnDelete() && (r->IsEmpty() || m_activeTiles.find(rKey) == m_activeTiles.end())) + if (!r->IsPendingOnDelete() && r->IsEmpty()) r->DeleteLater(); bool lPendingOnDelete = l->IsPendingOnDelete(); bool rPendingOnDelete = r->IsPendingOnDelete(); - if (lState == rState && lKey == rKey && !lPendingOnDelete) - m_needGroupMergeOperation = true; - if (rPendingOnDelete == lPendingOnDelete) - return lState < rState; + { + dp::GLState::DepthLayer lDepth = lState.GetDepthLayer(); + dp::GLState::DepthLayer rDepth = rState.GetDepthLayer(); + if (lDepth != rDepth) + return lDepth < rDepth; + + if (my::AlmostEqualULPs(l->GetOpacity(), r->GetOpacity())) + return lState < rState; + else + return l->GetOpacity() > r->GetOpacity(); + } if (rPendingOnDelete) return true; @@ -98,4 +195,45 @@ bool RenderBucketComparator::operator()(RenderGroup const * l, RenderGroup const return false; } +UserMarkRenderGroup::UserMarkRenderGroup(dp::GLState const & state, + TileKey const & tileKey, + drape_ptr && bucket) + : TBase(state, tileKey) + , m_renderBucket(move(bucket)) + , m_animation(new OpacityAnimation(0.25 /*duration*/, 0.0 /* minValue */, 1.0 /* maxValue*/)) +{ + m_mapping.AddRangePoint(0.6, 1.3); + m_mapping.AddRangePoint(0.85, 0.8); + m_mapping.AddRangePoint(1.0, 1.0); +} + +UserMarkRenderGroup::~UserMarkRenderGroup() +{ +} + +void UserMarkRenderGroup::UpdateAnimation() +{ + BaseRenderGroup::UpdateAnimation(); + float t = 1.0; + if (m_animation) + t = m_animation->GetOpacity(); + + m_uniforms.SetFloatValue("u_interpolationT", m_mapping.GetValue(t)); +} + +void UserMarkRenderGroup::Render(ScreenBase const & screen) +{ + BaseRenderGroup::Render(screen); + dp::ApplyUniforms(m_uniforms, m_shader); + if (m_renderBucket != nullptr) + m_renderBucket->Render(screen); +} + +string DebugPrint(RenderGroup const & group) +{ + ostringstream out; + out << DebugPrint(group.GetTileKey()); + return out.str(); +} + } // namespace df diff --git a/drape_frontend/render_group.hpp b/drape_frontend/render_group.hpp old mode 100644 new mode 100755 index 571a627a49..815a0d8e75 --- a/drape_frontend/render_group.hpp +++ b/drape_frontend/render_group.hpp @@ -1,6 +1,8 @@ #pragma once -#include "drape_frontend/tile_key.hpp" +#include "drape_frontend/animation/opacity_animation.hpp" +#include "drape_frontend/animation/value_mapping.hpp" +#include "drape_frontend/tile_utils.hpp" #include "drape/pointers.hpp" #include "drape/glstate.hpp" @@ -8,6 +10,7 @@ #include "std/vector.hpp" #include "std/set.hpp" +#include "std/unique_ptr.hpp" class ScreenBase; namespace dp { class OverlayTree; } @@ -15,49 +18,91 @@ namespace dp { class OverlayTree; } namespace df { -class RenderGroup +class BaseRenderGroup { +public: + BaseRenderGroup(dp::GLState const & state, TileKey const & tileKey) + : m_state(state) + , m_tileKey(tileKey) {} + + void SetRenderParams(ref_ptr shader, ref_ptr generalUniforms); + + dp::GLState const & GetState() const { return m_state; } + TileKey const & GetTileKey() const { return m_tileKey; } + dp::UniformValuesStorage const & GetUniforms() const { return m_uniforms; } + + virtual void UpdateAnimation(); + virtual void Render(ScreenBase const & /*screen*/); + +protected: + dp::GLState m_state; + ref_ptr m_shader; + dp::UniformValuesStorage m_uniforms; + ref_ptr m_generalUniforms; + +private: + TileKey m_tileKey; +}; + +class RenderGroup : public BaseRenderGroup +{ + typedef BaseRenderGroup TBase; public: RenderGroup(dp::GLState const & state, TileKey const & tileKey); ~RenderGroup(); void Update(ScreenBase const & modelView); - void CollectOverlay(dp::RefPointer tree); - void Render(ScreenBase const & screen); + void CollectOverlay(ref_ptr tree); + void Render(ScreenBase const & screen) override; - void PrepareForAdd(size_t countForAdd); - void AddBucket(dp::TransferPointer bucket); - - dp::GLState const & GetState() const { return m_state; } - TileKey const & GetTileKey() const { return m_tileKey; } + void AddBucket(drape_ptr && bucket); bool IsEmpty() const { return m_renderBuckets.empty(); } void DeleteLater() const { m_pendingOnDelete = true; } - bool IsPendingOnDelete() const { return m_pendingOnDelete; } + bool IsPendingOnDelete() const { return m_pendingOnDelete && !IsAnimating(); } bool IsLess(RenderGroup const & other) const; + void UpdateAnimation() override; + double GetOpacity() const; + bool IsAnimating() const; + + void Appear(); + void Disappear(); + private: - dp::GLState m_state; - TileKey m_tileKey; - vector > m_renderBuckets; + vector > m_renderBuckets; + unique_ptr m_disappearAnimation; + unique_ptr m_appearAnimation; mutable bool m_pendingOnDelete; -}; - -class RenderBucketComparator -{ -public: - RenderBucketComparator(set const & activeTiles); - - void ResetInternalState(); - - bool operator()(RenderGroup const * l, RenderGroup const * r); private: - set const & m_activeTiles; - bool m_needGroupMergeOperation; - bool m_needBucketsMergeOperation; + friend string DebugPrint(RenderGroup const & group); +}; + +class RenderGroupComparator +{ +public: + bool operator()(drape_ptr const & l, drape_ptr const & r); +}; + +class UserMarkRenderGroup : public BaseRenderGroup +{ + typedef BaseRenderGroup TBase; + +public: + UserMarkRenderGroup(dp::GLState const & state, TileKey const & tileKey, + drape_ptr && bucket); + ~UserMarkRenderGroup(); + + void UpdateAnimation() override; + void Render(ScreenBase const & screen) override; + +private: + drape_ptr m_renderBucket; + unique_ptr m_animation; + ValueMapping m_mapping; }; } // namespace df diff --git a/drape_frontend/render_node.cpp b/drape_frontend/render_node.cpp new file mode 100644 index 0000000000..ffc907d963 --- /dev/null +++ b/drape_frontend/render_node.cpp @@ -0,0 +1,43 @@ +#include "render_node.hpp" + +#include "drape/vertex_array_buffer.hpp" +#include "drape/gpu_program_manager.hpp" + +namespace df +{ + +RenderNode::RenderNode(dp::GLState const & state, drape_ptr && buffer) + : m_state(state) + , m_buffer(move(buffer)) + , m_isBuilded(false) +{ +} + +void RenderNode::Render(ref_ptr mng, dp::UniformValuesStorage const & uniforms, + dp::IndicesRange const & range) +{ + Apply(mng, uniforms); + m_buffer->RenderRange(range); +} + +void RenderNode::Render(ref_ptr mng, dp::UniformValuesStorage const & uniforms) +{ + Apply(mng, uniforms); + m_buffer->Render(); +} + +void RenderNode::Apply(ref_ptr mng, dp::UniformValuesStorage const & uniforms) +{ + ref_ptr prg = mng->GetProgram(m_state.GetProgramIndex()); + prg->Bind(); + if (!m_isBuilded) + { + m_buffer->Build(prg); + m_isBuilded = true; + } + + dp::ApplyState(m_state, prg); + dp::ApplyUniforms(uniforms, prg); +} + +} diff --git a/drape_frontend/render_node.hpp b/drape_frontend/render_node.hpp new file mode 100644 index 0000000000..02e03a9ace --- /dev/null +++ b/drape_frontend/render_node.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include "drape/glstate.hpp" +#include "drape/pointers.hpp" + +namespace dp +{ + class VertexArrayBuffer; + class GpuProgramManager; + struct IndicesRange; +} + +namespace df +{ + +class RenderNode +{ +public: + RenderNode(dp::GLState const & state, drape_ptr && buffer); + + void Render(ref_ptr mng, dp::UniformValuesStorage const & uniforms); + void Render(ref_ptr mng, dp::UniformValuesStorage const & uniforms, dp::IndicesRange const & range); + +private: + void Apply(ref_ptr mng, dp::UniformValuesStorage const & uniforms); + +private: + dp::GLState m_state; + drape_ptr m_buffer; + bool m_isBuilded; +}; + +} diff --git a/drape_frontend/route_builder.cpp b/drape_frontend/route_builder.cpp new file mode 100644 index 0000000000..f98e5f5e41 --- /dev/null +++ b/drape_frontend/route_builder.cpp @@ -0,0 +1,52 @@ +#include "drape_frontend/route_builder.hpp" + +#include "drape_frontend/route_shape.hpp" + +namespace df +{ + +RouteBuilder::RouteBuilder(TFlushRouteFn const & flushRouteFn, + TFlushRouteSignFn const & flushRouteSignFn) + : m_flushRouteFn(flushRouteFn) + , m_flushRouteSignFn(flushRouteSignFn) +{} + +void RouteBuilder::Build(m2::PolylineD const & routePolyline, vector const & turns, + dp::Color const & color, ref_ptr textures) +{ + CommonViewParams params; + params.m_minVisibleScale = 1; + params.m_rank = 0; + params.m_depth = 0.0f; + + drape_ptr routeData = make_unique_dp(); + routeData->m_color = color; + routeData->m_sourcePolyline = routePolyline; + routeData->m_sourceTurns = turns; + RouteShape(params).Draw(textures, *routeData.get()); + + if (m_flushRouteFn != nullptr) + m_flushRouteFn(move(routeData)); +} + +void RouteBuilder::BuildSign(m2::PointD const & pos, bool isStart, bool isValid, + ref_ptr textures) +{ + drape_ptr routeSignData = make_unique_dp(); + routeSignData->m_isStart = isStart; + routeSignData->m_position = pos; + routeSignData->m_isValid = isValid; + if (isValid) + { + CommonViewParams params; + params.m_minVisibleScale = 1; + params.m_rank = 0; + params.m_depth = 0.0f; + RouteShape(params).CacheRouteSign(textures, *routeSignData.get()); + } + + if (m_flushRouteSignFn != nullptr) + m_flushRouteSignFn(move(routeSignData)); +} + +} // namespace df diff --git a/drape_frontend/route_builder.hpp b/drape_frontend/route_builder.hpp new file mode 100644 index 0000000000..0a6bedd78f --- /dev/null +++ b/drape_frontend/route_builder.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include "drape_frontend/route_shape.hpp" + +#include "drape/pointers.hpp" +#include "drape/texture_manager.hpp" + +#include "geometry/polyline2d.hpp" + +#include "std/function.hpp" + +namespace df +{ + +class RouteBuilder +{ +public: + using TFlushRouteFn = function &&)>; + using TFlushRouteSignFn = function &&)>; + + RouteBuilder(TFlushRouteFn const & flushRouteFn, + TFlushRouteSignFn const & flushRouteSignFn); + + void Build(m2::PolylineD const & routePolyline, vector const & turns, + dp::Color const & color, ref_ptr textures); + + void BuildSign(m2::PointD const & pos, bool isStart, bool isValid, + ref_ptr textures); + +private: + TFlushRouteFn m_flushRouteFn; + TFlushRouteSignFn m_flushRouteSignFn; +}; + +} // namespace df diff --git a/drape_frontend/route_renderer.cpp b/drape_frontend/route_renderer.cpp new file mode 100644 index 0000000000..754387644f --- /dev/null +++ b/drape_frontend/route_renderer.cpp @@ -0,0 +1,483 @@ +#include "drape_frontend/route_renderer.hpp" + +#include "drape/glsl_func.hpp" +#include "drape/shader_def.hpp" +#include "drape/utils/projection.hpp" +#include "drape/vertex_array_buffer.hpp" + +#include "indexer/scales.hpp" + +#include "base/logging.hpp" + +namespace df +{ + +namespace +{ + +double const kArrowHeightFactor = 96.0 / 36.0; +double const kArrowAspect = 400.0 / 192.0; +double const kArrowTailSize = 20.0 / 400.0; +double const kArrowHeadSize = 124.0 / 400.0; + +float const kHalfWidthInPixel[] = +{ + // 1 2 3 4 5 6 7 8 9 10 + 2.0f, 2.0f, 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f, 5.0f, 5.0f, + //11 12 13 14 15 16 17 18 19 20 + 6.0f, 6.0f, 7.0f, 7.0f, 7.0f, 7.0f, 8.0f, 10.0f, 24.0f, 36.0f +}; + +uint8_t const kAlphaValue[] = +{ + //1 2 3 4 5 6 7 8 9 10 + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + //11 12 13 14 15 16 17 18 19 20 + 204, 204, 204, 204, 190, 180, 170, 160, 140, 120 +}; + +int const kArrowAppearingZoomLevel = 14; + +enum SegmentStatus +{ + OK = -1, + NoSegment = -2 +}; + +int const kInvalidGroup = -1; + +// Checks for route segments for intersection with the distance [start; end]. +int CheckForIntersection(double start, double end, vector const & segments) +{ + for (size_t i = 0; i < segments.size(); i++) + { + if (segments[i].m_isAvailable) + continue; + + if (start <= segments[i].m_end && end >= segments[i].m_start) + return i; + } + return SegmentStatus::OK; +} + +// Finds the nearest appropriate route segment to the distance [start; end]. +int FindNearestAvailableSegment(double start, double end, vector const & segments) +{ + double const kThreshold = 0.8; + + // check if distance intersects unavailable segment + int index = CheckForIntersection(start, end, segments); + if (index == SegmentStatus::OK) + return SegmentStatus::OK; + + // find nearest available segment if necessary + double const len = end - start; + for (size_t i = index; i < segments.size(); i++) + { + double const factor = (segments[i].m_end - segments[i].m_start) / len; + if (segments[i].m_isAvailable && factor > kThreshold) + return static_cast(i); + } + return SegmentStatus::NoSegment; +} + +void ClipBorders(vector & borders) +{ + auto invalidBorders = [](ArrowBorders const & borders) + { + return borders.m_groupIndex == kInvalidGroup; + }; + borders.erase(remove_if(borders.begin(), borders.end(), invalidBorders), borders.end()); +} + +void MergeAndClipBorders(vector & borders) +{ + // initial clipping + ClipBorders(borders); + + if (borders.empty()) + return; + + // mark groups + for (size_t i = 0; i + 1 < borders.size(); i++) + { + if (borders[i].m_endDistance >= borders[i + 1].m_startDistance) + borders[i + 1].m_groupIndex = borders[i].m_groupIndex; + } + + // merge groups + int lastGroup = borders.front().m_groupIndex; + size_t lastGroupIndex = 0; + for (size_t i = 1; i < borders.size(); i++) + { + if (borders[i].m_groupIndex != lastGroup) + { + borders[lastGroupIndex].m_endDistance = borders[i - 1].m_endDistance; + lastGroupIndex = i; + lastGroup = borders[i].m_groupIndex; + } + else + { + borders[i].m_groupIndex = kInvalidGroup; + } + } + borders[lastGroupIndex].m_endDistance = borders.back().m_endDistance; + + // clip groups + ClipBorders(borders); +} + +void BuildBuckets(RouteRenderProperty const & renderProperty, ref_ptr mng) +{ + for (drape_ptr const & bucket : renderProperty.m_buckets) + bucket->GetBuffer()->Build(mng->GetProgram(renderProperty.m_state.GetProgramIndex())); +} + +} + +RouteRenderer::RouteRenderer() + : m_distanceFromBegin(0.0) +{} + +void RouteRenderer::InterpolateByZoom(ScreenBase const & screen, float & halfWidth, float & alpha, double & zoom) const +{ + double const zoomLevel = my::clamp(fabs(log(screen.GetScale()) / log(2.0)), 1.0, scales::UPPER_STYLE_SCALE + 1.0); + zoom = trunc(zoomLevel); + int const index = zoom - 1.0; + float const lerpCoef = zoomLevel - zoom; + + if (index < scales::UPPER_STYLE_SCALE) + { + halfWidth = kHalfWidthInPixel[index] + lerpCoef * (kHalfWidthInPixel[index + 1] - kHalfWidthInPixel[index]); + + float const alpha1 = static_cast(kAlphaValue[index]) / numeric_limits::max(); + float const alpha2 = static_cast(kAlphaValue[index + 1]) / numeric_limits::max(); + alpha = alpha1 + lerpCoef * (alpha2 - alpha1); + } + else + { + halfWidth = kHalfWidthInPixel[scales::UPPER_STYLE_SCALE]; + alpha = static_cast(kAlphaValue[scales::UPPER_STYLE_SCALE]) / numeric_limits::max(); + } +} + +void RouteRenderer::RenderRoute(ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms) +{ + if (!m_routeData) + return; + + // interpolate values by zoom level + double zoom = 0.0; + float halfWidth = 0.0; + float alpha = 0.0; + InterpolateByZoom(screen, halfWidth, alpha, zoom); + + // render route + { + dp::GLState const & state = m_routeData->m_route.m_state; + + // set up uniforms + dp::UniformValuesStorage uniforms = commonUniforms; + glsl::vec4 color = glsl::ToVec4(m_routeData->m_color); + uniforms.SetFloatValue("u_color", color.r, color.g, color.b, alpha); + uniforms.SetFloatValue("u_routeParams", halfWidth, halfWidth * screen.GetScale(), m_distanceFromBegin); + + // set up shaders and apply uniforms + ref_ptr prg = mng->GetProgram(gpu::ROUTE_PROGRAM); + prg->Bind(); + dp::ApplyBlending(state, prg); + dp::ApplyUniforms(uniforms, prg); + + // render routes + for (drape_ptr const & bucket : m_routeData->m_route.m_buckets) + bucket->Render(screen); + } + + // render arrows + if (zoom >= kArrowAppearingZoomLevel && !m_routeData->m_arrows.empty()) + { + dp::GLState const & state = m_routeData->m_arrows.front()->m_arrow.m_state; + + // set up shaders and apply common uniforms + dp::UniformValuesStorage uniforms = commonUniforms; + uniforms.SetFloatValue("u_textureRect", m_routeData->m_arrowTextureRect.minX(), + m_routeData->m_arrowTextureRect.minY(), + m_routeData->m_arrowTextureRect.maxX(), + m_routeData->m_arrowTextureRect.maxY()); + + ref_ptr prg = mng->GetProgram(gpu::ROUTE_ARROW_PROGRAM); + prg->Bind(); + dp::ApplyState(state, prg); + dp::ApplyUniforms(uniforms, prg); + + for (drape_ptr & property : m_routeData->m_arrows) + RenderArrow(prg, property, halfWidth, screen); + } +} + +void RouteRenderer::RenderRouteSigns(ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms) +{ + if (m_startRouteSign) + { + ASSERT(m_startRouteSign->m_isValid, ()); + RenderRouteSign(m_startRouteSign, screen, mng, commonUniforms); + } + + if (m_finishRouteSign) + { + ASSERT(m_finishRouteSign->m_isValid, ()); + RenderRouteSign(m_finishRouteSign, screen, mng, commonUniforms); + } +} + +void RouteRenderer::RenderRouteSign(drape_ptr const & sign, ScreenBase const & screen, + ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms) +{ + dp::GLState const & state = sign->m_sign.m_state; + + dp::UniformValuesStorage uniforms = commonUniforms; + uniforms.SetFloatValue("u_opacity", 1.0f); + + ref_ptr program = mng->GetProgram(state.GetProgramIndex()); + program->Bind(); + dp::ApplyState(sign->m_sign.m_state, program); + dp::ApplyUniforms(uniforms, program); + + for (auto const & bucket : sign->m_sign.m_buckets) + bucket->Render(screen); +} + +void RouteRenderer::RenderArrow(ref_ptr prg, drape_ptr const & property, + float halfWidth, ScreenBase const & screen) +{ + double const arrowHalfWidth = halfWidth * kArrowHeightFactor; + double const glbArrowHalfWidth = arrowHalfWidth * screen.GetScale(); + double const textureWidth = 2.0 * arrowHalfWidth * kArrowAspect; + + dp::UniformValuesStorage uniformStorage; + uniformStorage.SetFloatValue("u_routeParams", arrowHalfWidth, glbArrowHalfWidth, m_distanceFromBegin); + + // calculate arrows + CalculateArrowBorders(property, kArrowSize, screen.GetScale(), textureWidth, glbArrowHalfWidth); + + // split arrow's data by 16-elements buckets + array borders; + borders.fill(0.0f); + size_t const elementsCount = borders.size(); + + size_t index = 0; + for (size_t i = 0; i < m_arrowBorders.size(); i++) + { + borders[index++] = m_arrowBorders[i].m_startDistance; + borders[index++] = m_arrowBorders[i].m_startTexCoord; + borders[index++] = m_arrowBorders[i].m_endDistance; + borders[index++] = m_arrowBorders[i].m_endTexCoord; + + // render arrow's parts + if (index == elementsCount || i == m_arrowBorders.size() - 1) + { + index = 0; + uniformStorage.SetMatrix4x4Value("u_arrowBorders", borders.data()); + borders.fill(0.0f); + + dp::ApplyUniforms(uniformStorage, prg); + for (drape_ptr const & bucket : property->m_arrow.m_buckets) + bucket->Render(screen); + } + } +} + +void RouteRenderer::SetRouteData(drape_ptr && routeData, ref_ptr mng) +{ + m_routeData = move(routeData); + + BuildBuckets(m_routeData->m_route, mng); + for (drape_ptr const & arrow : m_routeData->m_arrows) + BuildBuckets(arrow->m_arrow, mng); + + m_distanceFromBegin = 0.0; +} + +void RouteRenderer::SetRouteSign(drape_ptr && routeSignData, ref_ptr mng) +{ + if (routeSignData->m_isStart) + { + if (!routeSignData->m_isValid) + { + m_startRouteSign.reset(); + return; + } + + m_startRouteSign = move(routeSignData); + BuildBuckets(m_startRouteSign->m_sign, mng); + } + else + { + if (!routeSignData->m_isValid) + { + m_finishRouteSign.reset(); + return; + } + + m_finishRouteSign = move(routeSignData); + BuildBuckets(m_finishRouteSign->m_sign, mng); + } +} + +drape_ptr const & RouteRenderer::GetStartPoint() const +{ + return m_startRouteSign; +} + +drape_ptr const & RouteRenderer::GetFinishPoint() const +{ + return m_finishRouteSign; +} + +drape_ptr const & RouteRenderer::GetRouteData() const +{ + return m_routeData; +} + +void RouteRenderer::Clear(bool keepDistanceFromBegin) +{ + m_routeData.reset(); + m_startRouteSign.reset(); + m_finishRouteSign.reset(); + m_arrowBorders.clear(); + m_routeSegments.clear(); + + if (!keepDistanceFromBegin) + m_distanceFromBegin = 0.0; +} + +void RouteRenderer::UpdateDistanceFromBegin(double distanceFromBegin) +{ + m_distanceFromBegin = distanceFromBegin; +} + +void RouteRenderer::ApplyJoinsBounds(drape_ptr const & property, double joinsBoundsScalar, + double glbHeadLength, vector & arrowBorders) +{ + m_routeSegments.clear(); + m_routeSegments.reserve(2 * property->m_joinsBounds.size() + 1); + + double const length = property->m_end - property->m_start; + + // construct route's segments + m_routeSegments.emplace_back(0.0, 0.0, true /* m_isAvailable */); + for (size_t i = 0; i < property->m_joinsBounds.size(); i++) + { + double const start = property->m_joinsBounds[i].m_offset + + property->m_joinsBounds[i].m_start * joinsBoundsScalar; + + double const end = property->m_joinsBounds[i].m_offset + + property->m_joinsBounds[i].m_end * joinsBoundsScalar; + + m_routeSegments.back().m_end = start; + m_routeSegments.emplace_back(start, end, false /* m_isAvailable */); + + m_routeSegments.emplace_back(end, 0.0, true /* m_isAvailable */); + } + m_routeSegments.back().m_end = length; + + // shift head of arrow if necessary + bool needMerge = false; + for (size_t i = 0; i < arrowBorders.size(); i++) + { + int headIndex = FindNearestAvailableSegment(arrowBorders[i].m_endDistance - glbHeadLength, + arrowBorders[i].m_endDistance, m_routeSegments); + if (headIndex != SegmentStatus::OK) + { + if (headIndex != SegmentStatus::NoSegment) + { + ASSERT_GREATER_OR_EQUAL(headIndex, 0, ()); + double const restDist = length - m_routeSegments[headIndex].m_start; + if (restDist >= glbHeadLength) + arrowBorders[i].m_endDistance = min(length, m_routeSegments[headIndex].m_start + glbHeadLength); + else + arrowBorders[i].m_groupIndex = kInvalidGroup; + } + else + { + arrowBorders[i].m_groupIndex = kInvalidGroup; + } + needMerge = true; + } + } + + // merge intersected borders + if (needMerge) + MergeAndClipBorders(arrowBorders); +} + +void RouteRenderer::CalculateArrowBorders(drape_ptr const & property, double arrowLength, + double scale, double arrowTextureWidth, double joinsBoundsScalar) +{ + ASSERT(!property->m_turns.empty(), ()); + + double halfLen = 0.5 * arrowLength; + double const glbTextureWidth = arrowTextureWidth * scale; + double const glbTailLength = kArrowTailSize * glbTextureWidth; + double const glbHeadLength = kArrowHeadSize * glbTextureWidth; + + int const kArrowPartsCount = 3; + m_arrowBorders.clear(); + m_arrowBorders.reserve(property->m_turns.size() * kArrowPartsCount); + + double const halfTextureWidth = 0.5 * glbTextureWidth; + if (halfLen < halfTextureWidth) + halfLen = halfTextureWidth; + + // initial filling + for (size_t i = 0; i < property->m_turns.size(); i++) + { + ArrowBorders arrowBorders; + arrowBorders.m_groupIndex = (int)i; + arrowBorders.m_startDistance = max(0.0, property->m_turns[i] - halfLen * 0.8); + arrowBorders.m_endDistance = min(property->m_end - property->m_start, property->m_turns[i] + halfLen * 1.2); + + if (arrowBorders.m_startDistance + property->m_start < m_distanceFromBegin) + continue; + + m_arrowBorders.push_back(arrowBorders); + } + + // merge intersected borders and clip them + MergeAndClipBorders(m_arrowBorders); + + // apply joins bounds to prevent draw arrow's head on a join + ApplyJoinsBounds(property, joinsBoundsScalar, glbHeadLength, m_arrowBorders); + + // divide to parts of arrow + size_t const bordersSize = m_arrowBorders.size(); + for (size_t i = 0; i < bordersSize; i++) + { + float const startDistance = m_arrowBorders[i].m_startDistance; + float const endDistance = m_arrowBorders[i].m_endDistance; + + m_arrowBorders[i].m_endDistance = startDistance + glbTailLength; + m_arrowBorders[i].m_startTexCoord = 0.0; + m_arrowBorders[i].m_endTexCoord = kArrowTailSize; + + ArrowBorders arrowHead; + arrowHead.m_startDistance = endDistance - glbHeadLength; + arrowHead.m_endDistance = endDistance; + arrowHead.m_startTexCoord = 1.0 - kArrowHeadSize; + arrowHead.m_endTexCoord = 1.0; + m_arrowBorders.push_back(arrowHead); + + ArrowBorders arrowBody; + arrowBody.m_startDistance = m_arrowBorders[i].m_endDistance; + arrowBody.m_endDistance = arrowHead.m_startDistance; + arrowBody.m_startTexCoord = m_arrowBorders[i].m_endTexCoord; + arrowBody.m_endTexCoord = arrowHead.m_startTexCoord; + m_arrowBorders.push_back(arrowBody); + } +} + +} // namespace df + diff --git a/drape_frontend/route_renderer.hpp b/drape_frontend/route_renderer.hpp new file mode 100644 index 0000000000..5f3f32603c --- /dev/null +++ b/drape_frontend/route_renderer.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include "drape_frontend/route_builder.hpp" + +#include "drape/gpu_program_manager.hpp" +#include "drape/pointers.hpp" + +#include "geometry/screenbase.hpp" + +namespace df +{ + +struct ArrowBorders +{ + double m_startDistance = 0; + double m_endDistance = 0; + float m_startTexCoord = 0; + float m_endTexCoord = 1; + int m_groupIndex = 0; +}; + +struct RouteSegment +{ + double m_start = 0; + double m_end = 0; + bool m_isAvailable = false; + + RouteSegment(double start, double end, bool isAvailable) + : m_start(start) + , m_end(end) + , m_isAvailable(isAvailable) + {} +}; + +class RouteRenderer final +{ +public: + RouteRenderer(); + + void RenderRoute(ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms); + + void RenderRouteSigns(ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms); + + void SetRouteData(drape_ptr && routeData, ref_ptr mng); + drape_ptr const & GetRouteData() const; + + void SetRouteSign(drape_ptr && routeSignData, ref_ptr mng); + drape_ptr const & GetStartPoint() const; + drape_ptr const & GetFinishPoint() const; + + void Clear(bool keepDistanceFromBegin = false); + + void UpdateDistanceFromBegin(double distanceFromBegin); + +private: + void CalculateArrowBorders(drape_ptr const & property, double arrowLength, + double scale, double arrowTextureWidth, double joinsBoundsScalar); + void ApplyJoinsBounds(drape_ptr const & property, double joinsBoundsScalar, + double glbHeadLength, vector & arrowBorders); + void RenderArrow(ref_ptr prg, drape_ptr const & property, + float halfWidth, ScreenBase const & screen); + void InterpolateByZoom(ScreenBase const & screen, float & halfWidth, float & alpha, double & zoom) const; + void RenderRouteSign(drape_ptr const & sign, ScreenBase const & screen, + ref_ptr mng, dp::UniformValuesStorage const & commonUniforms); + + double m_distanceFromBegin; + drape_ptr m_routeData; + + vector m_arrowBorders; + vector m_routeSegments; + + drape_ptr m_startRouteSign; + drape_ptr m_finishRouteSign; +}; + +} // namespace df diff --git a/drape_frontend/route_shape.cpp b/drape_frontend/route_shape.cpp new file mode 100644 index 0000000000..9a35d67117 --- /dev/null +++ b/drape_frontend/route_shape.cpp @@ -0,0 +1,384 @@ +#include "drape_frontend/route_shape.hpp" + +#include "drape_frontend/line_shape_helper.hpp" + +#include "drape/attribute_provider.hpp" +#include "drape/batcher.hpp" +#include "drape/glsl_func.hpp" +#include "drape/glsl_types.hpp" +#include "drape/shader_def.hpp" +#include "drape/texture_manager.hpp" + +#include "base/logging.hpp" + +namespace df +{ + +namespace +{ + +float const kLeftSide = 1.0; +float const kCenter = 0.0; +float const kRightSide = -1.0; + +float const kArrowsGeometrySegmentLength = 0.5; + +void GetArrowTextureRegion(ref_ptr textures, dp::TextureManager::SymbolRegion & region) +{ + textures->GetSymbolRegion("route-arrow", region); +} + +void ClipArrowToSegments(vector const & turns, RouteData & routeData) +{ + int const cnt = static_cast(routeData.m_length / kArrowsGeometrySegmentLength) + 1; + routeData.m_arrows.reserve(cnt); + for (int i = 0; i < cnt; ++i) + { + double const start = i * kArrowsGeometrySegmentLength; + double const end = (i + 1) * kArrowsGeometrySegmentLength; + + drape_ptr arrowRenderProperty = make_unique_dp(); + + // looking for corresponding turns + int startTurnIndex = -1; + int endTurnIndex = -1; + for (size_t j = 0; j < turns.size(); ++j) + { + if (turns[j] >= start && turns[j] < end) + { + if (startTurnIndex < 0) + startTurnIndex = j; + + if (startTurnIndex >= 0) + endTurnIndex = j; + + arrowRenderProperty->m_turns.push_back(turns[j]); + } + } + + if (startTurnIndex < 0 || endTurnIndex < 0) + continue; + + // start of arrow segment + if (startTurnIndex != 0) + { + double d = max(0.5 * (turns[startTurnIndex] + turns[startTurnIndex - 1]), + turns[startTurnIndex] - kArrowSize); + arrowRenderProperty->m_start = max(0.0, d); + } + else + { + arrowRenderProperty->m_start = max(0.0, turns[startTurnIndex] - kArrowSize); + } + + // end of arrow segment + if (endTurnIndex + 1 != turns.size()) + { + double d = min(0.5 * (turns[endTurnIndex] + turns[endTurnIndex + 1]), + turns[endTurnIndex] + kArrowSize); + arrowRenderProperty->m_end = min(routeData.m_length, d); + } + else + { + arrowRenderProperty->m_end = min(routeData.m_length, turns[endTurnIndex] + kArrowSize); + } + + // rescale turns + for (size_t j = 0; j < arrowRenderProperty->m_turns.size(); ++j) + arrowRenderProperty->m_turns[j] -= arrowRenderProperty->m_start; + + routeData.m_arrows.push_back(move(arrowRenderProperty)); + } +} + +vector CalculatePoints(m2::PolylineD const & polyline, double start, double end) +{ + vector result; + result.reserve(polyline.GetSize() / 4); + + auto addIfNotExist = [&result](m2::PointD const & pnt) + { + if (result.empty() || result.back() != pnt) + result.push_back(pnt); + }; + + vector const & path = polyline.GetPoints(); + double len = 0; + bool started = false; + for (size_t i = 0; i + 1 < path.size(); i++) + { + double dist = (path[i + 1] - path[i]).Length(); + if (fabs(dist) < 1e-5) + continue; + + double l = len + dist; + if (!started && start >= len && start <= l) + { + double k = (start - len) / dist; + addIfNotExist(path[i] + (path[i + 1] - path[i]) * k); + started = true; + } + if (!started) + { + len = l; + continue; + } + + if (end >= len && end <= l) + { + double k = (end - len) / dist; + addIfNotExist(path[i] + (path[i + 1] - path[i]) * k); + break; + } + else + { + addIfNotExist(path[i + 1]); + } + len = l; + } + return result; +} + +} + +RouteShape::RouteShape(CommonViewParams const & params) + : m_params(params) +{} + +void RouteShape::PrepareGeometry(bool isRoute, vector const & path, + TGeometryBuffer & geometry, TGeometryBuffer & joinsGeometry, + vector & joinsBounds, double & outputLength) +{ + ASSERT(path.size() > 1, ()); + + auto const generateTriangles = [&joinsGeometry](glsl::vec3 const & pivot, vector const & normals, + glsl::vec2 const & length, bool isLeft) + { + float const eps = 1e-5; + size_t const trianglesCount = normals.size() / 3; + float const side = isLeft ? kLeftSide : kRightSide; + for (int j = 0; j < trianglesCount; j++) + { + glsl::vec3 const len1 = glsl::vec3(length.x, length.y, glsl::length(normals[3 * j]) < eps ? kCenter : side); + glsl::vec3 const len2 = glsl::vec3(length.x, length.y, glsl::length(normals[3 * j + 1]) < eps ? kCenter : side); + glsl::vec3 const len3 = glsl::vec3(length.x, length.y, glsl::length(normals[3 * j + 2]) < eps ? kCenter : side); + + joinsGeometry.push_back(RV(pivot, normals[3 * j], len1)); + joinsGeometry.push_back(RV(pivot, normals[3 * j + 1], len2)); + joinsGeometry.push_back(RV(pivot, normals[3 * j + 2], len3)); + } + }; + + // constuct segments + vector segments; + segments.reserve(path.size() - 1); + ConstructLineSegments(path, segments); + + // build geometry + float length = 0; + for (size_t i = 0; i < segments.size(); i++) + { + UpdateNormals(&segments[i], (i > 0) ? &segments[i - 1] : nullptr, + (i < segments.size() - 1) ? &segments[i + 1] : nullptr); + + // generate main geometry + glsl::vec3 const startPivot = glsl::vec3(segments[i].m_points[StartPoint], m_params.m_depth); + glsl::vec3 const endPivot = glsl::vec3(segments[i].m_points[EndPoint], m_params.m_depth); + + float const endLength = length + glsl::length(segments[i].m_points[EndPoint] - segments[i].m_points[StartPoint]); + + glsl::vec2 const leftNormalStart = GetNormal(segments[i], true /* isLeft */, StartNormal); + glsl::vec2 const rightNormalStart = GetNormal(segments[i], false /* isLeft */, StartNormal); + glsl::vec2 const leftNormalEnd = GetNormal(segments[i], true /* isLeft */, EndNormal); + glsl::vec2 const rightNormalEnd = GetNormal(segments[i], false /* isLeft */, EndNormal); + + float const projLeftStart = -segments[i].m_leftWidthScalar[StartPoint].y; + float const projLeftEnd = segments[i].m_leftWidthScalar[EndPoint].y; + float const projRightStart = -segments[i].m_rightWidthScalar[StartPoint].y; + float const projRightEnd = segments[i].m_rightWidthScalar[EndPoint].y; + + geometry.push_back(RV(startPivot, glsl::vec2(0, 0), glsl::vec3(length, 0, kCenter))); + geometry.push_back(RV(startPivot, leftNormalStart, glsl::vec3(length, projLeftStart, kLeftSide))); + geometry.push_back(RV(endPivot, glsl::vec2(0, 0), glsl::vec3(endLength, 0, kCenter))); + geometry.push_back(RV(endPivot, leftNormalEnd, glsl::vec3(endLength, projLeftEnd, kLeftSide))); + + geometry.push_back(RV(startPivot, rightNormalStart, glsl::vec3(length, projRightStart, kRightSide))); + geometry.push_back(RV(startPivot, glsl::vec2(0, 0), glsl::vec3(length, 0, kCenter))); + geometry.push_back(RV(endPivot, rightNormalEnd, glsl::vec3(endLength, projRightEnd, kRightSide))); + geometry.push_back(RV(endPivot, glsl::vec2(0, 0), glsl::vec3(endLength, 0, kCenter))); + + // generate joins + if (segments[i].m_generateJoin && i < segments.size() - 1) + { + glsl::vec2 n1 = segments[i].m_hasLeftJoin[EndPoint] ? segments[i].m_leftNormals[EndPoint] : + segments[i].m_rightNormals[EndPoint]; + glsl::vec2 n2 = segments[i + 1].m_hasLeftJoin[StartPoint] ? segments[i + 1].m_leftNormals[StartPoint] : + segments[i + 1].m_rightNormals[StartPoint]; + + float widthScalar = segments[i].m_hasLeftJoin[EndPoint] ? segments[i].m_rightWidthScalar[EndPoint].x : + segments[i].m_leftWidthScalar[EndPoint].x; + + vector normals; + normals.reserve(24); + GenerateJoinNormals(dp::RoundJoin, n1, n2, 1.0f, segments[i].m_hasLeftJoin[EndPoint], widthScalar, normals); + + generateTriangles(glsl::vec3(segments[i].m_points[EndPoint], m_params.m_depth), normals, + glsl::vec2(endLength, 0), segments[i].m_hasLeftJoin[EndPoint]); + } + + // generate caps + if (isRoute && i == 0) + { + vector normals; + normals.reserve(24); + GenerateCapNormals(dp::RoundCap, segments[i].m_leftNormals[StartPoint], + segments[i].m_rightNormals[StartPoint], -segments[i].m_tangent, + 1.0f, true /* isStart */, normals); + + generateTriangles(glsl::vec3(segments[i].m_points[StartPoint], m_params.m_depth), normals, + glsl::vec2(length, 0), true); + } + + if (isRoute && i == segments.size() - 1) + { + vector normals; + normals.reserve(24); + GenerateCapNormals(dp::RoundCap, segments[i].m_leftNormals[EndPoint], + segments[i].m_rightNormals[EndPoint], segments[i].m_tangent, + 1.0f, false /* isStart */, normals); + + generateTriangles(glsl::vec3(segments[i].m_points[EndPoint], m_params.m_depth), normals, + glsl::vec2(endLength, 0), true); + } + + length = endLength; + } + + outputLength = length; + + // calculate joins bounds + if (!isRoute) + { + float const eps = 1e-5; + double len = 0; + for (size_t i = 0; i < segments.size() - 1; i++) + { + len += glsl::length(segments[i].m_points[EndPoint] - segments[i].m_points[StartPoint]); + + RouteJoinBounds bounds; + bounds.m_start = min(segments[i].m_leftWidthScalar[EndPoint].y, + segments[i].m_rightWidthScalar[EndPoint].y); + bounds.m_end = max(-segments[i + 1].m_leftWidthScalar[StartPoint].y, + -segments[i + 1].m_rightWidthScalar[StartPoint].y); + + if (fabs(bounds.m_end - bounds.m_start) < eps) + continue; + + bounds.m_offset = len; + joinsBounds.push_back(bounds); + } + } +} + +void RouteShape::CacheRouteSign(ref_ptr mng, RouteSignData & routeSignData) +{ + dp::TextureManager::SymbolRegion symbol; + mng->GetSymbolRegion(routeSignData.m_isStart ? "route_from" : "route_to", symbol); + + m2::RectF const & texRect = symbol.GetTexRect(); + m2::PointF halfSize = m2::PointF(symbol.GetPixelSize()) * 0.5f; + + glsl::vec2 const pos = glsl::ToVec2(routeSignData.m_position); + glsl::vec3 const pivot = glsl::vec3(pos.x, pos.y, m_params.m_depth); + gpu::SolidTexturingVertex data[4]= + { + { pivot, glsl::vec2(-halfSize.x, halfSize.y), glsl::ToVec2(texRect.LeftTop()) }, + { pivot, glsl::vec2(-halfSize.x, -halfSize.y), glsl::ToVec2(texRect.LeftBottom()) }, + { pivot, glsl::vec2( halfSize.x, halfSize.y), glsl::ToVec2(texRect.RightTop()) }, + { pivot, glsl::vec2( halfSize.x, -halfSize.y), glsl::ToVec2(texRect.RightBottom()) } + }; + + dp::GLState state(gpu::TEXTURING_PROGRAM, dp::GLState::OverlayLayer); + state.SetColorTexture(symbol.GetTexture()); + + { + dp::Batcher batcher(dp::Batcher::IndexPerQuad, dp::Batcher::VertexPerQuad); + dp::SessionGuard guard(batcher, [&routeSignData](dp::GLState const & state, drape_ptr && b) + { + routeSignData.m_sign.m_buckets.push_back(move(b)); + routeSignData.m_sign.m_state = state; + }); + + dp::AttributeProvider provider(1 /* stream count */, dp::Batcher::VertexPerQuad); + provider.InitStream(0 /* stream index */, gpu::SolidTexturingVertex::GetBindingInfo(), make_ref(data)); + + dp::IndicesRange indices = batcher.InsertTriangleStrip(state, make_ref(&provider), nullptr); + ASSERT(indices.IsValid(), ()); + } +} + +void RouteShape::Draw(ref_ptr textures, RouteData & routeData) +{ + // route geometry + { + TGeometryBuffer geometry; + TGeometryBuffer joinsGeometry; + vector bounds; + PrepareGeometry(true /* isRoute */, routeData.m_sourcePolyline.GetPoints(), + geometry, joinsGeometry, bounds, routeData.m_length); + + dp::GLState state = dp::GLState(gpu::ROUTE_PROGRAM, dp::GLState::GeometryLayer); + BatchGeometry(state, geometry, joinsGeometry, routeData.m_route); + } + + // arrows geometry + if (!routeData.m_sourceTurns.empty()) + { + dp::TextureManager::SymbolRegion region; + GetArrowTextureRegion(textures, region); + routeData.m_arrowTextureRect = region.GetTexRect(); + + dp::GLState state = dp::GLState(gpu::ROUTE_ARROW_PROGRAM, dp::GLState::GeometryLayer); + state.SetColorTexture(region.GetTexture()); + + ClipArrowToSegments(routeData.m_sourceTurns, routeData); + for (auto & renderProperty : routeData.m_arrows) + { + TGeometryBuffer geometry; + TGeometryBuffer joinsGeometry; + vector const points = CalculatePoints(routeData.m_sourcePolyline, renderProperty->m_start, renderProperty->m_end); + ASSERT_LESS_OR_EQUAL(points.size(), routeData.m_sourcePolyline.GetSize(), ()); + PrepareGeometry(false /* isRoute */, points, geometry, joinsGeometry, renderProperty->m_joinsBounds, routeData.m_length); + BatchGeometry(state, geometry, joinsGeometry, renderProperty->m_arrow); + } + } +} + +void RouteShape::BatchGeometry(dp::GLState const & state, TGeometryBuffer & geometry, + TGeometryBuffer & joinsGeometry, RouteRenderProperty & property) +{ + size_t const verticesCount = geometry.size() + joinsGeometry.size(); + if (verticesCount != 0) + { + uint32_t const kBatchSize = 5000; + dp::Batcher batcher(kBatchSize, kBatchSize); + dp::SessionGuard guard(batcher, [&property](dp::GLState const & state, drape_ptr && b) + { + property.m_buckets.push_back(move(b)); + property.m_state = state; + }); + + dp::AttributeProvider provider(1 /* stream count */, geometry.size()); + provider.InitStream(0 /* stream index */, gpu::RouteVertex::GetBindingInfo(), make_ref(geometry.data())); + batcher.InsertListOfStrip(state, make_ref(&provider), 4); + + if (!joinsGeometry.empty()) + { + dp::AttributeProvider joinsProvider(1 /* stream count */, joinsGeometry.size()); + joinsProvider.InitStream(0 /* stream index */, gpu::RouteVertex::GetBindingInfo(), make_ref(joinsGeometry.data())); + batcher.InsertTriangleList(state, make_ref(&joinsProvider)); + } + } +} + +} // namespace df diff --git a/drape_frontend/route_shape.hpp b/drape_frontend/route_shape.hpp new file mode 100644 index 0000000000..ad806642f6 --- /dev/null +++ b/drape_frontend/route_shape.hpp @@ -0,0 +1,82 @@ +#pragma once + +#include "drape_frontend/map_shape.hpp" +#include "drape_frontend/shape_view_params.hpp" + +#include "drape/glstate.hpp" +#include "drape/render_bucket.hpp" +#include "drape/utils/vertex_decl.hpp" +#include "drape/pointers.hpp" + +#include "geometry/polyline2d.hpp" + +#include "std/vector.hpp" + +namespace df +{ + +double const kArrowSize = 0.001; + +struct RouteJoinBounds +{ + double m_start = 0; + double m_end = 0; + double m_offset = 0; +}; + +struct RouteRenderProperty +{ + dp::GLState m_state; + vector> m_buckets; + RouteRenderProperty() : m_state(0, dp::GLState::GeometryLayer) {} +}; + +struct ArrowRenderProperty +{ + vector m_joinsBounds; + vector m_turns; + double m_start; + double m_end; + RouteRenderProperty m_arrow; +}; + +struct RouteData +{ + m2::PolylineD m_sourcePolyline; + vector m_sourceTurns; + dp::Color m_color; + m2::RectF m_arrowTextureRect; + double m_length; + RouteRenderProperty m_route; + vector> m_arrows; +}; + +struct RouteSignData +{ + RouteRenderProperty m_sign; + bool m_isStart; + bool m_isValid; + m2::PointD m_position; +}; + +class RouteShape +{ +public: + RouteShape(CommonViewParams const & params); + void CacheRouteSign(ref_ptr mng, RouteSignData & routeSignData); + void Draw(ref_ptr textures, RouteData & routeData); + +private: + using RV = gpu::RouteVertex; + using TGeometryBuffer = buffer_vector; + + void PrepareGeometry(bool isRoute, vector const & path, + TGeometryBuffer & geometry, TGeometryBuffer & joinsGeometry, + vector & joinsBounds, double & outputLength); + void BatchGeometry(dp::GLState const & state, TGeometryBuffer & geometry, + TGeometryBuffer & joinsGeometry, RouteRenderProperty & property); + + CommonViewParams m_params; +}; + +} // namespace df diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp index d07737679f..d1d287c865 100644 --- a/drape_frontend/rule_drawer.cpp +++ b/drape_frontend/rule_drawer.cpp @@ -6,24 +6,60 @@ #include "indexer/feature.hpp" #include "indexer/feature_algo.hpp" +#include "indexer/feature_visibility.hpp" #include "base/assert.hpp" #include "std/bind.hpp" +//#define DRAW_TILE_NET + +#ifdef DRAW_TILE_NET +#include "drape_frontend/line_shape.hpp" +#include "drape_frontend/text_shape.hpp" + +#include "base/string_utils.hpp" +#endif + namespace df { -RuleDrawer::RuleDrawer(drawer_callback_fn const & fn, TileKey const & tileKey, EngineContext & context) +int const kLineSimplifyLevelStart = 10; +int const kLineSimplifyLevelEnd = 12; + +size_t kMinFlushSizes[df::PrioritiesCount] = +{ + 1, // AreaPriority + 5, // TextAndPoiPriority + 10, // LinePriority +}; + +RuleDrawer::RuleDrawer(TDrawerCallback const & fn, ref_ptr context) : m_callback(fn) - , m_tileKey(tileKey) , m_context(context) { - m_globalRect = m_tileKey.GetGlobalRect(); + m_globalRect = m_context->GetTileKey().GetGlobalRect(); int32_t tileSize = df::VisualParams::Instance().GetTileSize(); m_geometryConvertor.OnSize(0, 0, tileSize, tileSize); m_geometryConvertor.SetFromRect(m2::AnyRectD(m_globalRect)); m_currentScaleGtoP = 1.0f / m_geometryConvertor.GetScale(); + + for (size_t i = 0; i < m_mapShapes.size(); i++) + m_mapShapes[i].reserve(kMinFlushSizes[i] + 1); +} + +RuleDrawer::~RuleDrawer() +{ + for (auto & shapes : m_mapShapes) + { + if (shapes.empty()) + continue; + + for (auto const & shape : shapes) + shape->Prepare(m_context->GetTextureManager()); + + m_context->Flush(move(shapes)); + } } void RuleDrawer::operator()(FeatureType const & f) @@ -47,23 +83,34 @@ void RuleDrawer::operator()(FeatureType const & f) } #endif + int const zoomLevel = m_context->GetTileKey().m_zoomLevel; + int const minVisibleScale = feature::GetMinDrawableScale(f); + + auto insertShape = [this](drape_ptr && shape) + { + int const index = static_cast(shape->GetPriority()); + ASSERT_LESS(index, m_mapShapes.size(), ()); + m_mapShapes[index].push_back(move(shape)); + }; + if (s.AreaStyleExists()) { - ApplyAreaFeature apply(m_context, m_tileKey, f.GetID(), s.GetCaptionDescription()); - f.ForEachTriangleRef(apply, m_tileKey.m_zoomLevel); + ApplyAreaFeature apply(insertShape, f.GetID(), minVisibleScale, f.GetRank(), s.GetCaptionDescription()); + f.ForEachTriangleRef(apply, zoomLevel); if (s.PointStyleExists()) - apply(feature::GetCenter(f, m_tileKey.m_zoomLevel)); + apply(feature::GetCenter(f, zoomLevel)); s.ForEachRule(bind(&ApplyAreaFeature::ProcessRule, &apply, _1)); apply.Finish(); } else if (s.LineStyleExists()) { - ApplyLineFeature apply(m_context, m_tileKey, f.GetID(), - s.GetCaptionDescription(), - m_currentScaleGtoP); - f.ForEachPointRef(apply, m_tileKey.m_zoomLevel); + ApplyLineFeature apply(insertShape, f.GetID(), minVisibleScale, f.GetRank(), + s.GetCaptionDescription(), m_currentScaleGtoP, + zoomLevel >= kLineSimplifyLevelStart && zoomLevel <= kLineSimplifyLevelEnd, + f.GetPointsCount()); + f.ForEachPointRef(apply, zoomLevel); if (apply.HasGeometry()) s.ForEachRule(bind(&ApplyLineFeature::ProcessRule, &apply, _1)); @@ -72,12 +119,58 @@ void RuleDrawer::operator()(FeatureType const & f) else { ASSERT(s.PointStyleExists(), ()); - ApplyPointFeature apply(m_context, m_tileKey, f.GetID(), s.GetCaptionDescription()); - f.ForEachPointRef(apply, m_tileKey.m_zoomLevel); + ApplyPointFeature apply(insertShape, f.GetID(), minVisibleScale, f.GetRank(), s.GetCaptionDescription()); + f.ForEachPointRef(apply, zoomLevel); s.ForEachRule(bind(&ApplyPointFeature::ProcessRule, &apply, _1)); apply.Finish(); } + +#ifdef DRAW_TILE_NET + TileKey key = m_context->GetTileKey(); + m2::RectD r = key.GetGlobalRect(); + vector path; + path.push_back(r.LeftBottom()); + path.push_back(r.LeftTop()); + path.push_back(r.RightTop()); + path.push_back(r.RightBottom()); + path.push_back(r.LeftBottom()); + + m2::SharedSpline spline(path); + df::LineViewParams p; + p.m_baseGtoPScale = 1.0; + p.m_cap = dp::ButtCap; + p.m_color = dp::Color::Red(); + p.m_depth = 20000; + p.m_width = 5; + p.m_join = dp::RoundJoin; + + insertShape(make_unique_dp(spline, p)); + + df::TextViewParams tp; + tp.m_anchor = dp::Center; + tp.m_depth = 0; + tp.m_primaryText = strings::to_string(key.m_x) + " " + + strings::to_string(key.m_y) + " " + + strings::to_string(key.m_zoomLevel); + + tp.m_primaryTextFont = dp::FontDecl(dp::Color::Red(), 30); + + insertShape(make_unique_dp(r.Center(), tp)); +#endif + + for (size_t i = 0; i < m_mapShapes.size(); i++) + { + if (m_mapShapes[i].size() < kMinFlushSizes[i]) + continue; + + for (auto const & shape : m_mapShapes[i]) + shape->Prepare(m_context->GetTextureManager()); + + TMapShapes mapShapes; + mapShapes.swap(m_mapShapes[i]); + m_context->Flush(move(mapShapes)); + } } } // namespace df diff --git a/drape_frontend/rule_drawer.hpp b/drape_frontend/rule_drawer.hpp index b1c0312a9e..730d56bf61 100644 --- a/drape_frontend/rule_drawer.hpp +++ b/drape_frontend/rule_drawer.hpp @@ -1,10 +1,14 @@ #pragma once +#include "drape_frontend/map_shape.hpp" #include "drape_frontend/tile_key.hpp" +#include "drape/pointers.hpp" + #include "geometry/rect2d.hpp" #include "geometry/screenbase.hpp" +#include "std/array.hpp" #include "std/function.hpp" #include "std/set.hpp" #include "std/string.hpp" @@ -16,25 +20,25 @@ namespace df class EngineContext; class Stylist; -typedef function drawer_callback_fn; class RuleDrawer { public: - RuleDrawer(drawer_callback_fn const & fn, - TileKey const & tileKey, - EngineContext & context); + using TDrawerCallback = function; + RuleDrawer(TDrawerCallback const & fn, ref_ptr context); + ~RuleDrawer(); void operator() (FeatureType const & f); private: - drawer_callback_fn m_callback; - TileKey m_tileKey; - EngineContext & m_context; + TDrawerCallback m_callback; + ref_ptr m_context; m2::RectD m_globalRect; ScreenBase m_geometryConvertor; double m_currentScaleGtoP; set m_coastlines; + + array m_mapShapes; }; } // namespace dfo diff --git a/drape_frontend/selection_shape.cpp b/drape_frontend/selection_shape.cpp new file mode 100644 index 0000000000..b87aa5e7a3 --- /dev/null +++ b/drape_frontend/selection_shape.cpp @@ -0,0 +1,144 @@ +#include "selection_shape.hpp" +#include "visual_params.hpp" + +#include "drape/attribute_provider.hpp" +#include "drape/batcher.hpp" +#include "drape/binding_info.hpp" +#include "drape/glsl_func.hpp" +#include "drape/glsl_types.hpp" +#include "drape/gpu_program_manager.hpp" +#include "drape/shader_def.hpp" +#include "drape/texture_manager.hpp" +#include "drape/uniform_values_storage.hpp" + +namespace df +{ + +namespace +{ + +struct Vertex +{ + Vertex() = default; + Vertex(glsl::vec2 const & normal, glsl::vec2 const & texCoord) + : m_normal(normal) + , m_texCoord(texCoord) + { + } + + glsl::vec2 m_normal; + glsl::vec2 m_texCoord; +}; + +dp::BindingInfo GetBindingInfo() +{ + dp::BindingInfo info(2); + dp::BindingDecl & normal = info.GetBindingDecl(0); + normal.m_attributeName = "a_normal"; + normal.m_componentCount = 2; + normal.m_componentType = gl_const::GLFloatType; + normal.m_offset = 0; + normal.m_stride = sizeof(Vertex); + + dp::BindingDecl & texCoord = info.GetBindingDecl(1); + texCoord.m_attributeName = "a_colorTexCoords"; + texCoord.m_componentCount = 2; + texCoord.m_componentType = gl_const::GLFloatType; + texCoord.m_offset = sizeof(glsl::vec2); + texCoord.m_stride = sizeof(Vertex); + + return info; +} + +} // namespace + +SelectionShape::SelectionShape(ref_ptr mng) + : m_position(m2::PointD::Zero()) + , m_animation(false, 0.25) + , m_selectedObject(OBJECT_EMPTY) +{ + int const TriangleCount = 40; + int const VertexCount = 3 * TriangleCount; + float const etalonSector = math::twicePi / static_cast(TriangleCount); + + dp::TextureManager::ColorRegion color; + mng->GetColorRegion(dp::Color(0x17, 0xBF, 0x8E, 0x6F), color); + glsl::vec2 colorCoord = glsl::ToVec2(color.GetTexRect().Center()); + + buffer_vector buffer; + + glsl::vec2 startNormal(0.0f, 1.0f); + + for (size_t i = 0; i < TriangleCount + 1; ++i) + { + glsl::vec2 normal = glsl::rotate(startNormal, i * etalonSector); + glsl::vec2 nextNormal = glsl::rotate(startNormal, (i + 1) * etalonSector); + + buffer.emplace_back(startNormal, colorCoord); + buffer.emplace_back(normal, colorCoord); + buffer.emplace_back(nextNormal, colorCoord); + } + + dp::GLState state(gpu::ACCURACY_PROGRAM, dp::GLState::OverlayLayer); + state.SetColorTexture(color.GetTexture()); + + { + dp::Batcher batcher(TriangleCount * dp::Batcher::IndexPerTriangle, VertexCount); + dp::SessionGuard guard(batcher, [this](dp::GLState const & state, drape_ptr && b) + { + drape_ptr bucket = move(b); + ASSERT(bucket->GetOverlayHandlesCount() == 0, ()); + m_renderNode = make_unique_dp(state, bucket->MoveBuffer()); + }); + + dp::AttributeProvider provider(1 /*stream count*/, VertexCount); + provider.InitStream(0 /*stream index*/, GetBindingInfo(), make_ref(buffer.data())); + + batcher.InsertTriangleList(state, make_ref(&provider), nullptr); + } + + double r = 15.0f * VisualParams::Instance().GetVisualScale(); + m_mapping.AddRangePoint(0.6, 1.3 * r); + m_mapping.AddRangePoint(0.85, 0.8 * r); + m_mapping.AddRangePoint(1.0, r); +} + +void SelectionShape::Show(ESelectedObject obj, m2::PointD const & position, bool isAnimate) +{ + m_animation.Hide(); + m_position = position; + m_selectedObject = obj; + if (isAnimate) + m_animation.ShowAnimated(); + else + m_animation.Show(); +} + +void SelectionShape::Hide() +{ + m_animation.Hide(); + m_selectedObject = OBJECT_EMPTY; +} + +void SelectionShape::Render(ScreenBase const & screen, ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms) +{ + UNUSED_VALUE(screen); + ShowHideAnimation::EState state = m_animation.GetState(); + if (state == ShowHideAnimation::STATE_VISIBLE || + state == ShowHideAnimation::STATE_SHOW_DIRECTION) + { + dp::UniformValuesStorage uniforms = commonUniforms; + uniforms.SetFloatValue("u_position", m_position.x, m_position.y, 0.0); + uniforms.SetFloatValue("u_accuracy", m_mapping.GetValue(m_animation.GetT())); + uniforms.SetFloatValue("u_opacity", 1.0f); + m_renderNode->Render(mng, uniforms); + } +} + +SelectionShape::ESelectedObject SelectionShape::GetSelectedObject() const +{ + return m_selectedObject; +} + +} // namespace df diff --git a/drape_frontend/selection_shape.hpp b/drape_frontend/selection_shape.hpp new file mode 100644 index 0000000000..64177cf998 --- /dev/null +++ b/drape_frontend/selection_shape.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include "animation/show_hide_animation.hpp" +#include "animation/value_mapping.hpp" +#include "render_node.hpp" + +#include "geometry/point2d.hpp" +#include "geometry/screenbase.hpp" + +namespace dp +{ + +class GpuProgramManager; +class UniformValuesStorage; +class TextureManager; + +} + +namespace df +{ + +class SelectionShape +{ +public: + enum ESelectedObject + { + OBJECT_EMPTY, + OBJECT_POI, + OBJECT_USER_MARK, + OBJECT_MY_POSITION + }; + + SelectionShape(ref_ptr mng); + + void SetPosition(m2::PointD const & position) { m_position = position; } + void Show(ESelectedObject obj, m2::PointD const & position, bool isAnimate); + void Hide(); + void Render(ScreenBase const & screen, + ref_ptr mng, + dp::UniformValuesStorage const & commonUniforms); + + ESelectedObject GetSelectedObject() const; + +private: + double GetCurrentRadius() const; + +private: + m2::PointD m_position; + ShowHideAnimation m_animation; + ESelectedObject m_selectedObject; + + drape_ptr m_renderNode; + ValueMapping m_mapping; +}; + +} // namespace df diff --git a/drape_frontend/shape_view_params.hpp b/drape_frontend/shape_view_params.hpp index 182e2ef676..0022cc6e3d 100644 --- a/drape_frontend/shape_view_params.hpp +++ b/drape_frontend/shape_view_params.hpp @@ -15,6 +15,8 @@ namespace df struct CommonViewParams { float m_depth; + int m_minVisibleScale; + uint8_t m_rank; }; struct PoiSymbolViewParams : CommonViewParams @@ -23,6 +25,7 @@ struct PoiSymbolViewParams : CommonViewParams FeatureID m_id; string m_symbolName; + uint32_t m_extendingSize; }; struct CircleViewParams : CommonViewParams @@ -49,34 +52,25 @@ struct LineViewParams : CommonViewParams float m_baseGtoPScale; }; -struct FontDecl -{ - FontDecl() = default; - FontDecl(dp::Color const & color, float size, dp::Color const & outlineColor = dp::Color::Transparent()) - : m_color(color) - , m_outlineColor(outlineColor) - , m_size(size) - { - } - - dp::Color m_color = dp::Color::Transparent(); - dp::Color m_outlineColor = dp::Color::Transparent(); - float m_size = 0; -}; - struct TextViewParams : CommonViewParams { + TextViewParams() : m_extendingSize(0) {} + FeatureID m_featureID; - FontDecl m_primaryTextFont; + dp::FontDecl m_primaryTextFont; string m_primaryText; - FontDecl m_secondaryTextFont; + dp::FontDecl m_secondaryTextFont; string m_secondaryText; dp::Anchor m_anchor; + m2::PointF m_primaryOffset; + bool m_primaryOptional; + bool m_secondaryOptional; + uint32_t m_extendingSize; }; struct PathTextViewParams : CommonViewParams { - FontDecl m_textFont; + dp::FontDecl m_textFont; string m_text; float m_baseGtoPScale; }; diff --git a/drape_frontend/stylist.cpp b/drape_frontend/stylist.cpp index c939fcbebb..c89c3ff7c1 100644 --- a/drape_frontend/stylist.cpp +++ b/drape_frontend/stylist.cpp @@ -2,6 +2,7 @@ #include "indexer/feature.hpp" #include "indexer/feature_visibility.hpp" +#include "indexer/ftypes_matcher.hpp" #include "indexer/drawing_rules.hpp" #include "indexer/drules_include.hpp" #include "indexer/scales.hpp" @@ -66,16 +67,14 @@ bool IsMiddleTunnel(int const layer, double const depth) return layer != feature::LAYER_EMPTY && depth < 19000; } -double CalcPopulationRank(FeatureType const & f) +void FilterRulesByRuntimeSelector(FeatureType const & f, int zoomLevel, drule::KeysT & keys) { - uint32_t population = f.GetPopulation(); - if (population != 1) + keys.erase_if([&f, zoomLevel](drule::Key const & key)->bool { - double const maxPopulation = 3.0E6; - return min(maxPopulation, (double)population) / (maxPopulation * 4); - } - - return 0.0; + drule::BaseRule const * const rule = drule::rules().Find(key); + ASSERT(rule != nullptr, ()); + return !rule->TestFeature(f, zoomLevel); + }); } class KeyFunctor @@ -86,11 +85,12 @@ public: int const zoomLevel, int const keyCount, bool isNameExists) - : m_pointStyleFinded(false) - , m_lineStyleFinded(false) - , m_iconFinded(false) - , m_captionWithoutOffsetFinded(false) - , m_auxCaptionFinded(false) + : m_pointStyleFound(false) + , m_lineStyleFound(false) + , m_iconFound(false) + , m_captionWithoutOffsetFound(false) + , m_auxCaptionFound(false) + , m_mainTextType(drule::text_type_name) , m_f(f) , m_geomType(type) , m_zoomLevel(zoomLevel) @@ -123,17 +123,21 @@ public: m_rules.push_back(make_pair(dRule, depth)); bool isNonEmptyCaption = IsTypeOf(key, Caption) && m_isNameExists; - m_pointStyleFinded |= (IsTypeOf(key, Symbol | Circle) || isNonEmptyCaption); - m_lineStyleFinded |= IsTypeOf(key, Line); - m_auxCaptionFinded |= (dRule->GetCaption(1) != 0); + m_pointStyleFound |= (IsTypeOf(key, Symbol | Circle) || isNonEmptyCaption); + m_lineStyleFound |= IsTypeOf(key, Line); + m_auxCaptionFound |= (dRule->GetCaption(1) != nullptr); + + if (dRule->GetCaption(0) != nullptr) + m_mainTextType = dRule->GetCaptionTextType(0); } - bool m_pointStyleFinded; - bool m_lineStyleFinded; - bool m_iconFinded; - bool m_captionWithoutOffsetFinded; - bool m_auxCaptionFinded; - buffer_vector m_rules; + bool m_pointStyleFound; + bool m_lineStyleFound; + bool m_iconFound; + bool m_captionWithoutOffsetFound; + bool m_auxCaptionFound; + buffer_vector m_rules; + drule::text_type_t m_mainTextType; private: void Init() @@ -169,9 +173,6 @@ const uint8_t PointStyleFlag = 1 << 3; // ==================================== // -CaptionDescription::CaptionDescription() - : m_populationRank(0.0) {} - void CaptionDescription::Init(FeatureType const & f, int const zoomLevel) { @@ -179,7 +180,13 @@ void CaptionDescription::Init(FeatureType const & f, m_roadNumber = f.GetRoadNumber(); m_houseNumber = f.GetHouseNumber(); - m_populationRank = CalcPopulationRank(f); + + if (ftypes::IsBuildingChecker::Instance()(f)) + { + // Mark houses without names/numbers so user can select them by single tap. + if (m_houseNumber.empty() && m_mainText.empty()) + m_houseNumber = "·"; + } SwapCaptions(zoomLevel); DiscardLongCaption(zoomLevel); @@ -187,6 +194,7 @@ void CaptionDescription::Init(FeatureType const & f, void CaptionDescription::FormatCaptions(FeatureType const & f, feature::EGeomType type, + drule::text_type_t mainTextType, bool auxCaptionExists) { if (!auxCaptionExists && !m_auxText.empty() && type != feature::GEOM_LINE) @@ -196,12 +204,19 @@ void CaptionDescription::FormatCaptions(FeatureType const & f, m_auxText.clear(); } - if (!m_houseNumber.empty()) + if (mainTextType == drule::text_type_housenumber) { - if (m_mainText.empty() || m_houseNumber.find(m_mainText) != string::npos) - m_houseNumber.swap(m_mainText); - else - m_mainText += ("(" + m_houseNumber + ")"); + m_mainText = move(m_houseNumber); + } + else if (mainTextType == drule::text_type_name) + { + if (!m_houseNumber.empty()) + { + if (m_mainText.empty() || m_houseNumber.find(m_mainText) != string::npos) + m_houseNumber.swap(m_mainText); + else + m_mainText += (" (" + m_houseNumber + ")"); + } } } @@ -229,11 +244,6 @@ string CaptionDescription::GetPathName() const return m_mainText + " " + m_auxText; } -double CaptionDescription::GetPopulationRank() const -{ - return m_populationRank; -} - bool CaptionDescription::IsNameExists() const { return !m_mainText.empty() || !m_houseNumber.empty(); @@ -286,7 +296,7 @@ CaptionDescription const & Stylist::GetCaptionDescription() const return m_captionDescriptor; } -void Stylist::ForEachRule(Stylist::rule_callback_t const & fn) +void Stylist::ForEachRule(Stylist::TRuleCallback const & fn) const { typedef rules_t::const_iterator const_iter; for (const_iter it = m_rules.begin(); it != m_rules.end(); ++it) @@ -323,15 +333,13 @@ CaptionDescription & Stylist::GetCaptionDescriptionImpl() return m_captionDescriptor; } -// ==================================== // - -bool InitStylist(FeatureType const & f, - int const zoomLevel, - Stylist & s) +bool InitStylist(FeatureType const & f, int const zoomLevel, Stylist & s) { drule::KeysT keys; pair geomType = feature::GetDrawRule(f, zoomLevel, keys); + FilterRulesByRuntimeSelector(f, zoomLevel, keys); + if (keys.empty()) return false; @@ -341,7 +349,8 @@ bool InitStylist(FeatureType const & f, feature::EGeomType mainGeomType = feature::EGeomType(geomType.first); - switch (mainGeomType) { + switch (mainGeomType) + { case feature::GEOM_POINT: s.RaisePointStyleFlag(); break; @@ -362,13 +371,13 @@ bool InitStylist(FeatureType const & f, KeyFunctor keyFunctor(f, mainGeomType, zoomLevel, keys.size(), descr.IsNameExists()); for_each(keys.begin(), keys.end(), bind(&KeyFunctor::ProcessKey, &keyFunctor, _1)); - if (keyFunctor.m_pointStyleFinded) + if (keyFunctor.m_pointStyleFound) s.RaisePointStyleFlag(); - if (keyFunctor.m_lineStyleFinded) + if (keyFunctor.m_lineStyleFound) s.RaiseLineStyleFlag(); s.m_rules.swap(keyFunctor.m_rules); - descr.FormatCaptions(f, mainGeomType, keyFunctor.m_auxCaptionFinded); + descr.FormatCaptions(f, mainGeomType, keyFunctor.m_mainTextType, keyFunctor.m_auxCaptionFound); return true; } diff --git a/drape_frontend/stylist.hpp b/drape_frontend/stylist.hpp index 2c2ea3d693..3cbb4fc047 100644 --- a/drape_frontend/stylist.hpp +++ b/drape_frontend/stylist.hpp @@ -1,6 +1,7 @@ #pragma once #include "indexer/feature_data.hpp" +#include "indexer/drawing_rule_def.hpp" #include "base/buffer_vector.hpp" @@ -16,20 +17,18 @@ namespace df struct CaptionDescription { - CaptionDescription(); - void Init(FeatureType const & f, int const zoomLevel); void FormatCaptions(FeatureType const & f, feature::EGeomType type, + drule::text_type_t mainTextType, bool auxCaptionExists); string const & GetMainText() const; string const & GetAuxText() const; string const & GetRoadNumber() const; string GetPathName() const; - double GetPopulationRank() const; bool IsNameExists() const; private: @@ -41,7 +40,6 @@ private: string m_auxText; string m_roadNumber; string m_houseNumber; - double m_populationRank; }; class Stylist @@ -56,9 +54,9 @@ public: CaptionDescription const & GetCaptionDescription() const; - typedef pair rule_wrapper_t; - typedef function rule_callback_t; - void ForEachRule(rule_callback_t const & fn); + using TRuleWrapper = pair; + using TRuleCallback = function; + void ForEachRule(TRuleCallback const & fn) const; bool IsEmpty() const; @@ -75,7 +73,7 @@ private: CaptionDescription & GetCaptionDescriptionImpl(); private: - typedef buffer_vector rules_t; + typedef buffer_vector rules_t; rules_t m_rules; uint8_t m_state; diff --git a/drape_frontend/text_handle.cpp b/drape_frontend/text_handle.cpp new file mode 100644 index 0000000000..a095ceb879 --- /dev/null +++ b/drape_frontend/text_handle.cpp @@ -0,0 +1,78 @@ +#include "drape_frontend/text_handle.hpp" + +#include "drape/texture_manager.hpp" + +namespace df +{ + +TextHandle::TextHandle(FeatureID const & id, strings::UniString const & text, + dp::Anchor anchor, uint64_t priority, + ref_ptr textureManager) + : OverlayHandle(id, anchor, priority) + , m_forceUpdateNormals(false) + , m_isLastVisible(false) + , m_text(text) + , m_textureManager(textureManager) + , m_glyphsReady(false) +{} + +TextHandle::TextHandle(FeatureID const & id, strings::UniString const & text, + dp::Anchor anchor, uint64_t priority, + ref_ptr textureManager, + gpu::TTextDynamicVertexBuffer && normals) + : OverlayHandle(id, anchor, priority) + , m_normals(move(normals)) + , m_forceUpdateNormals(false) + , m_isLastVisible(false) + , m_text(text) + , m_textureManager(textureManager) + , m_glyphsReady(false) +{} + +void TextHandle::GetAttributeMutation(ref_ptr mutator, + ScreenBase const & screen) const +{ + UNUSED_VALUE(screen); + + bool const isVisible = IsVisible(); + if (!m_forceUpdateNormals && m_isLastVisible == isVisible) + return; + + TOffsetNode const & node = GetOffsetNode(gpu::TextDynamicVertex::GetDynamicStreamID()); + ASSERT(node.first.GetElementSize() == sizeof(gpu::TextDynamicVertex), ()); + ASSERT(node.second.m_count == m_normals.size(), ()); + + uint32_t byteCount = m_normals.size() * sizeof(gpu::TextDynamicVertex); + void * buffer = mutator->AllocateMutationBuffer(byteCount); + if (isVisible) + memcpy(buffer, m_normals.data(), byteCount); + else + memset(buffer, 0, byteCount); + + dp::MutateNode mutateNode; + mutateNode.m_region = node.second; + mutateNode.m_data = make_ref(buffer); + mutator->AddMutation(node.first, mutateNode); + + m_isLastVisible = isVisible; +} + +bool TextHandle::Update(ScreenBase const & screen) +{ + if (!m_glyphsReady) + m_glyphsReady = m_textureManager->AreGlyphsReady(m_text); + + return m_glyphsReady; +} + +bool TextHandle::IndexesRequired() const +{ + return false; +} + +void TextHandle::SetForceUpdateNormals(bool forceUpdate) const +{ + m_forceUpdateNormals = forceUpdate; +} + +} // namespace df diff --git a/drape_frontend/text_handle.hpp b/drape_frontend/text_handle.hpp new file mode 100644 index 0000000000..94e303f4ef --- /dev/null +++ b/drape_frontend/text_handle.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include "drape/overlay_handle.hpp" +#include "drape/pointers.hpp" +#include "drape/utils/vertex_decl.hpp" + +#include "base/string_utils.hpp" + +namespace dp +{ + class TextureManager; +} + +namespace df +{ + +class TextHandle : public dp::OverlayHandle +{ +public: + TextHandle(FeatureID const & id, strings::UniString const & text, + dp::Anchor anchor, uint64_t priority, + ref_ptr textureManager); + + TextHandle(FeatureID const & id, strings::UniString const & text, + dp::Anchor anchor, uint64_t priority, + ref_ptr textureManager, + gpu::TTextDynamicVertexBuffer && normals); + + bool Update(ScreenBase const & screen) override; + + void GetAttributeMutation(ref_ptr mutator, + ScreenBase const & screen) const override; + + bool IndexesRequired() const override; + + void SetForceUpdateNormals(bool forceUpdate) const; + +protected: + gpu::TTextDynamicVertexBuffer m_normals; + mutable bool m_forceUpdateNormals; + +private: + mutable bool m_isLastVisible; + + strings::UniString m_text; + ref_ptr m_textureManager; + bool m_glyphsReady; +}; + + +} // namespace df diff --git a/drape_frontend/text_layout.cpp b/drape_frontend/text_layout.cpp index 2dd0b13cf4..ec5f6da827 100644 --- a/drape_frontend/text_layout.cpp +++ b/drape_frontend/text_layout.cpp @@ -1,8 +1,7 @@ #include "drape_frontend/text_layout.hpp" -#include "drape_frontend/fribidi.hpp" +#include "drape/fribidi.hpp" #include "drape/glsl_func.hpp" - #include "drape/overlay_handle.hpp" #include "std/numeric.hpp" @@ -25,8 +24,7 @@ public: dp::TextureManager::ColorRegion const & color, dp::TextureManager::ColorRegion const & outline, gpu::TTextStaticVertexBuffer & buffer) - : m_depthShift(0.0f, 0.0f, 0.0f) - , m_pivot(pivot) + : m_pivot(pivot) , m_colorCoord(glsl::ToVec2(color.GetTexRect().Center())) , m_outlineCoord(glsl::ToVec2(outline.GetTexRect().Center())) , m_buffer(buffer) @@ -36,16 +34,13 @@ public: void operator() (dp::TextureManager::GlyphRegion const & glyph) { m2::RectF const & mask = glyph.GetTexRect(); - glsl::vec3 pivot = m_pivot + m_depthShift; - m_buffer.push_back(gpu::TextStaticVertex(pivot, m_colorCoord, m_outlineCoord, glsl::ToVec2(mask.LeftBottom()))); - m_buffer.push_back(gpu::TextStaticVertex(pivot, m_colorCoord, m_outlineCoord, glsl::ToVec2(mask.LeftTop()))); - m_buffer.push_back(gpu::TextStaticVertex(pivot, m_colorCoord, m_outlineCoord, glsl::ToVec2(mask.RightBottom()))); - m_buffer.push_back(gpu::TextStaticVertex(pivot, m_colorCoord, m_outlineCoord, glsl::ToVec2(mask.RightTop()))); - m_depthShift += glsl::vec3(0.0f, 0.0f, 1.0f); + m_buffer.push_back(gpu::TextStaticVertex(m_pivot, m_colorCoord, m_outlineCoord, glsl::ToVec2(mask.LeftTop()))); + m_buffer.push_back(gpu::TextStaticVertex(m_pivot, m_colorCoord, m_outlineCoord, glsl::ToVec2(mask.LeftBottom()))); + m_buffer.push_back(gpu::TextStaticVertex(m_pivot, m_colorCoord, m_outlineCoord, glsl::ToVec2(mask.RightTop()))); + m_buffer.push_back(gpu::TextStaticVertex(m_pivot, m_colorCoord, m_outlineCoord, glsl::ToVec2(mask.RightBottom()))); } protected: - glsl::vec3 m_depthShift; glsl::vec3 const & m_pivot; glsl::vec2 m_colorCoord; glsl::vec2 m_outlineCoord; @@ -71,6 +66,8 @@ public: void operator()(dp::TextureManager::GlyphRegion const & glyph) { + if (!glyph.IsValid()) + return; m2::PointF pixelSize = m2::PointF(glyph.GetPixelSize()) * m_textRatio; float const xOffset = glyph.GetOffsetX() * m_textRatio; @@ -79,11 +76,16 @@ public: float const upVector = -static_cast(pixelSize.y) - yOffset; float const bottomVector = -yOffset; - m_buffer.push_back(gpu::TextDynamicVertex(m_penPosition + glsl::vec2(xOffset, upVector))); - m_buffer.push_back(gpu::TextDynamicVertex(m_penPosition + glsl::vec2(xOffset, bottomVector))); - m_buffer.push_back(gpu::TextDynamicVertex(m_penPosition + glsl::vec2(pixelSize.x + xOffset, upVector))); - m_buffer.push_back(gpu::TextDynamicVertex(m_penPosition + glsl::vec2(pixelSize.x + xOffset, bottomVector))); + if (m_isFirstGlyph) + { + m_isFirstGlyph = false; + m_penPosition += glsl::vec2(-xOffset, 0.0f); + } + m_buffer.push_back(gpu::TextDynamicVertex(m_penPosition + glsl::vec2(xOffset, bottomVector))); + m_buffer.push_back(gpu::TextDynamicVertex(m_penPosition + glsl::vec2(xOffset, upVector))); + m_buffer.push_back(gpu::TextDynamicVertex(m_penPosition + glsl::vec2(pixelSize.x + xOffset, bottomVector))); + m_buffer.push_back(gpu::TextDynamicVertex(m_penPosition + glsl::vec2(pixelSize.x + xOffset, upVector))); m_penPosition += glsl::vec2(glyph.GetAdvanceX() * m_textRatio, glyph.GetAdvanceY() * m_textRatio); TBase::operator()(glyph); @@ -92,7 +94,8 @@ public: private: glsl::vec2 m_penPosition; gpu::TTextDynamicVertexBuffer & m_buffer; - float m_textRatio = 0.0; + float m_textRatio = 0.0f; + bool m_isFirstGlyph = true; }; ///Old code @@ -223,11 +226,17 @@ void CalculateOffsets(dp::Anchor anchor, ASSERT_NOT_EQUAL(start, end, ()); lengthAndHeight.push_back(TLengthAndHeight(0, 0)); TLengthAndHeight & node = lengthAndHeight.back(); - for (size_t glyphIndex = start; glyphIndex < end; ++glyphIndex) + for (size_t glyphIndex = start; glyphIndex < end && glyphIndex < glyphs.size(); ++glyphIndex) { dp::TextureManager::GlyphRegion const & glyph = glyphs[glyphIndex]; - node.first += (glyph.GetAdvanceX() * textRatio); - node.second = max(node.second, (glyph.GetPixelHeight() + glyph.GetAdvanceY()) * textRatio); + if (!glyph.IsValid()) + continue; + + if (glyphIndex == start) + node.first += glyph.GetOffsetX(); + + node.first += glyph.GetAdvanceX(); + node.second = max(node.second, glyph.GetPixelHeight() + glyph.GetAdvanceY()); } maxLength = max(maxLength, node.first); summaryHeight += node.second; @@ -236,34 +245,40 @@ void CalculateOffsets(dp::Anchor anchor, ASSERT_EQUAL(delimIndexes.size(), lengthAndHeight.size(), ()); + maxLength *= textRatio; + summaryHeight *= textRatio; + XLayouter xL(anchor); YLayouter yL(anchor, summaryHeight); for (size_t index = 0; index < delimIndexes.size(); ++index) { TLengthAndHeight const & node = lengthAndHeight[index]; - result.push_back(make_pair(delimIndexes[index], glsl::vec2(xL(node.first, maxLength), - yL(node.second)))); + result.push_back(make_pair(delimIndexes[index], glsl::vec2(xL(node.first * textRatio, maxLength), + yL(node.second * textRatio)))); } - pixelSize = m2::PointU(maxLength, summaryHeight); + pixelSize = m2::PointU(my::rounds(maxLength), my::rounds(summaryHeight)); } } // namespace void TextLayout::Init(strings::UniString const & text, float fontSize, - dp::RefPointer textures) + ref_ptr textures) { + m_text = text; m_textSizeRatio = fontSize / BASE_HEIGHT; textures->GetGlyphRegions(text, m_metrics); } -dp::RefPointer TextLayout::GetMaskTexture() const +ref_ptr TextLayout::GetMaskTexture() const { ASSERT(!m_metrics.empty(), ()); #ifdef DEBUG - dp::RefPointer tex = m_metrics[0].GetTexture(); + ref_ptr tex = m_metrics[0].GetTexture(); for (GlyphRegion const & g : m_metrics) + { ASSERT(g.GetTexture() == tex, ()); + } #endif return m_metrics[0].GetTexture(); @@ -287,8 +302,13 @@ float TextLayout::GetPixelHeight() const return m_textSizeRatio * BASE_HEIGHT; } +strings::UniString const & TextLayout::GetText() const +{ + return m_text; +} + StraightTextLayout::StraightTextLayout(strings::UniString const & text, float fontSize, - dp::RefPointer textures, dp::Anchor anchor) + ref_ptr textures, dp::Anchor anchor) { strings::UniString visibleText = fribidi::log2vis(text); buffer_vector delimIndexes; @@ -313,7 +333,7 @@ void StraightTextLayout::Cache(glm::vec3 const & pivot, glm::vec2 const & pixelO size_t endOffset = node.first; StraigthTextGeometryGenerator generator(pivot, pixelOffset + node.second, m_textSizeRatio, colorRegion, outlineRegion, staticBuffer, dynamicBuffer); - for (size_t index = beginOffset; index < endOffset; ++index) + for (size_t index = beginOffset; index < endOffset && index < m_metrics.size(); ++index) generator(m_metrics[index]); beginOffset = endOffset; @@ -321,7 +341,7 @@ void StraightTextLayout::Cache(glm::vec3 const & pivot, glm::vec2 const & pixelO } PathTextLayout::PathTextLayout(strings::UniString const & text, float fontSize, - dp::RefPointer textures) + ref_ptr textures) { Init(fribidi::log2vis(text), fontSize, textures); } @@ -379,10 +399,10 @@ bool PathTextLayout::CacheDynamicGeometry(m2::Spline::iterator const & iter, Scr size_t baseIndex = 4 * i; - buffer[baseIndex + 0] = gpu::TextDynamicVertex(formingVector + normal * upVector + tangent * xOffset); - buffer[baseIndex + 1] = gpu::TextDynamicVertex(formingVector + normal * bottomVector + tangent * xOffset); - buffer[baseIndex + 2] = gpu::TextDynamicVertex(formingVector + normal * upVector + tangent * (pxSize.x + xOffset)); - buffer[baseIndex + 3] = gpu::TextDynamicVertex(formingVector + normal * bottomVector + tangent * (pxSize.x + xOffset)); + buffer[baseIndex + 0] = gpu::TextDynamicVertex(formingVector + normal * bottomVector + tangent * xOffset); + buffer[baseIndex + 1] = gpu::TextDynamicVertex(formingVector + normal * upVector + tangent * xOffset); + buffer[baseIndex + 2] = gpu::TextDynamicVertex(formingVector + normal * bottomVector + tangent * (pxSize.x + xOffset)); + buffer[baseIndex + 3] = gpu::TextDynamicVertex(formingVector + normal * upVector + tangent * (pxSize.x + xOffset)); float const xAdvance = g.GetAdvanceX() * m_textSizeRatio; diff --git a/drape_frontend/text_layout.hpp b/drape_frontend/text_layout.hpp index 271100ae0c..2d596695e7 100644 --- a/drape_frontend/text_layout.hpp +++ b/drape_frontend/text_layout.hpp @@ -31,23 +31,26 @@ class TextLayout public: virtual ~TextLayout() {} - dp::RefPointer GetMaskTexture() const; + ref_ptr GetMaskTexture() const; uint32_t GetGlyphCount() const; float GetPixelLength() const; float GetPixelHeight() const; + strings::UniString const & GetText() const; + protected: void Init(strings::UniString const & text, float fontSize, - dp::RefPointer textures); + ref_ptr textures); protected: typedef dp::TextureManager::GlyphRegion GlyphRegion; dp::TextureManager::TGlyphsBuffer m_metrics; - float m_textSizeRatio = 0.0; + strings::UniString m_text; + float m_textSizeRatio = 0.0f; }; class StraightTextLayout : public TextLayout @@ -56,7 +59,7 @@ class StraightTextLayout : public TextLayout public: StraightTextLayout(strings::UniString const & text, float fontSize, - dp::RefPointer textures, + ref_ptr textures, dp::Anchor anchor); void Cache(glsl::vec3 const & pivot, glsl::vec2 const & pixelOffset, @@ -77,7 +80,7 @@ class PathTextLayout : public TextLayout typedef TextLayout TBase; public: PathTextLayout(strings::UniString const & text, - float fontSize, dp::RefPointer textures); + float fontSize, ref_ptr textures); void CacheStaticGeometry(glsl::vec3 const & pivot, dp::TextureManager::ColorRegion const & colorRegion, diff --git a/drape_frontend/text_shape.cpp b/drape_frontend/text_shape.cpp index 1ee4643f5b..117001cddc 100644 --- a/drape_frontend/text_shape.cpp +++ b/drape_frontend/text_shape.cpp @@ -1,11 +1,13 @@ #include "drape_frontend/text_shape.hpp" +#include "drape_frontend/text_handle.hpp" #include "drape_frontend/text_layout.hpp" #include "drape/utils/vertex_decl.hpp" #include "drape/shader_def.hpp" #include "drape/attribute_provider.hpp" -#include "drape/glstate.hpp" #include "drape/batcher.hpp" +#include "drape/glstate.hpp" +#include "drape/overlay_handle.hpp" #include "drape/texture_manager.hpp" #include "base/string_utils.hpp" @@ -18,20 +20,22 @@ namespace df namespace { -class StraightTextHandle : public dp::OverlayHandle +class StraightTextHandle : public TextHandle { public: - StraightTextHandle(FeatureID const & id, dp::Anchor anchor, glsl::vec2 const & pivot, + StraightTextHandle(FeatureID const & id, strings::UniString const & text, + dp::Anchor anchor, glsl::vec2 const & pivot, glsl::vec2 const & pxSize, glsl::vec2 const & offset, - double priority) - : OverlayHandle(id, anchor, priority) + uint64_t priority, ref_ptr textureManager, + bool isOptional, gpu::TTextDynamicVertexBuffer && normals) + : TextHandle(id, text, anchor, priority, textureManager, move(normals)) , m_pivot(glsl::ToPoint(pivot)) , m_offset(glsl::ToPoint(offset)) , m_size(glsl::ToPoint(pxSize)) - { - } + , m_isOptional(isOptional) + {} - m2::RectD GetPixelRect(ScreenBase const & screen) const + m2::RectD GetPixelRect(ScreenBase const & screen) const override { m2::PointD pivot = screen.GtoP(m_pivot) + m_offset; double x = pivot.x; @@ -62,31 +66,37 @@ public: max(x, pivot.x), max(y, pivot.y)); } - void GetPixelShape(ScreenBase const & screen, Rects & rects) const + void GetPixelShape(ScreenBase const & screen, Rects & rects) const override { rects.push_back(m2::RectF(GetPixelRect(screen))); } + bool IsBound() const override + { + return !m_isOptional; + } + private: m2::PointF m_pivot; m2::PointF m_offset; m2::PointF m_size; + bool m_isOptional; }; } // namespace -TextShape::TextShape(m2::PointF const & basePoint, TextViewParams const & params) +TextShape::TextShape(m2::PointF const & basePoint, TextViewParams const & params, bool hasPOI) : m_basePoint(basePoint), - m_params(params) -{ -} + m_params(params), + m_hasPOI(hasPOI) +{} -void TextShape::Draw(dp::RefPointer batcher, dp::RefPointer textures) const +void TextShape::Draw(ref_ptr batcher, ref_ptr textures) const { ASSERT(!m_params.m_primaryText.empty(), ()); StraightTextLayout primaryLayout(strings::MakeUniString(m_params.m_primaryText), m_params.m_primaryTextFont.m_size, textures, m_params.m_anchor); - glsl::vec2 primaryOffset(0.0, 0.0); + glsl::vec2 primaryOffset = glsl::ToVec2(m_params.m_primaryOffset); if (!m_params.m_secondaryText.empty()) { @@ -105,17 +115,19 @@ void TextShape::Draw(dp::RefPointer batcher, dp::RefPointer 0) + DrawSubString(secondaryLayout, m_params.m_secondaryTextFont, secondaryOffset, batcher, + textures, false /* isPrimary */, m_params.m_secondaryOptional); } - DrawSubString(primaryLayout, m_params.m_primaryTextFont, primaryOffset, batcher, textures); + if (primaryLayout.GetGlyphCount() > 0) + DrawSubString(primaryLayout, m_params.m_primaryTextFont, primaryOffset, batcher, + textures, true /* isPrimary */, m_params.m_primaryOptional); } -void TextShape::DrawSubString(StraightTextLayout const & layout, - df::FontDecl const & font, - glsl::vec2 const & baseOffset, - dp::RefPointer batcher, - dp::RefPointer textures) const +void TextShape::DrawSubString(StraightTextLayout const & layout, dp::FontDecl const & font, + glsl::vec2 const & baseOffset, ref_ptr batcher, + ref_ptr textures, bool isPrimary, bool isOptional) const { gpu::TTextStaticVertexBuffer staticBuffer; gpu::TTextDynamicVertexBuffer dynamicBuffer; @@ -131,23 +143,49 @@ void TextShape::DrawSubString(StraightTextLayout const & layout, dynamicBuffer); dp::GLState state(gpu::TEXT_PROGRAM, dp::GLState::OverlayLayer); - state.SetBlending(dp::Blending(true)); ASSERT(color.GetTexture() == outline.GetTexture(), ()); state.SetColorTexture(color.GetTexture()); state.SetMaskTexture(layout.GetMaskTexture()); + gpu::TTextDynamicVertexBuffer initialDynBuffer(dynamicBuffer.size()); + m2::PointU const & pixelSize = layout.GetPixelSize(); - dp::OverlayHandle * handle = new StraightTextHandle(m_params.m_featureID, - m_params.m_anchor, - glsl::ToVec2(m_basePoint), - glsl::vec2(pixelSize.x, pixelSize.y), - baseOffset, - m_params.m_depth); + + m2::PointU const size = pixelSize + m2::PointU(m_params.m_extendingSize, + m_params.m_extendingSize) * 2; + + drape_ptr handle = make_unique_dp(m_params.m_featureID, + layout.GetText(), + m_params.m_anchor, + glsl::ToVec2(m_basePoint), + glsl::vec2(size.x, size.y), + baseOffset, + GetOverlayPriority(), + textures, + isOptional, + move(dynamicBuffer)); + handle->SetOverlayRank(m_hasPOI ? (isPrimary ? dp::OverlayRank1 : dp::OverlayRank2) : dp::OverlayRank0); dp::AttributeProvider provider(2, staticBuffer.size()); - provider.InitStream(0, gpu::TextStaticVertex::GetBindingInfo(), dp::MakeStackRefPointer(staticBuffer.data())); - provider.InitStream(1, gpu::TextDynamicVertex::GetBindingInfo(), dp::MakeStackRefPointer(dynamicBuffer.data())); - batcher->InsertListOfStrip(state, dp::MakeStackRefPointer(&provider), dp::MovePointer(handle), 4); + provider.InitStream(0, gpu::TextStaticVertex::GetBindingInfo(), make_ref(staticBuffer.data())); + provider.InitStream(1, gpu::TextDynamicVertex::GetBindingInfo(), make_ref(initialDynBuffer.data())); + batcher->InsertListOfStrip(state, make_ref(&provider), move(handle), 4); +} + +uint64_t TextShape::GetOverlayPriority() const +{ + // Overlay priority for text shapes considers the existance of secondary string and length of primary text. + // - If the text has secondary string then it has more priority; + // - The more text length, the more priority. + // [6 bytes - standard overlay priority][1 byte - secondary text][1 byte - length]. + static uint64_t constexpr kMask = ~static_cast(0xFFFF); + uint64_t priority = dp::CalculateOverlayPriority(m_params.m_minVisibleScale, m_params.m_rank, m_params.m_depth); + priority &= kMask; + if (!m_params.m_secondaryText.empty()) + priority |= 0xFF00; + priority |= (0xFF - static_cast(m_params.m_primaryText.size())); + + return priority; } } //end of df namespace diff --git a/drape_frontend/text_shape.hpp b/drape_frontend/text_shape.hpp index 2978abd716..06d4cf9043 100644 --- a/drape_frontend/text_shape.hpp +++ b/drape_frontend/text_shape.hpp @@ -14,17 +14,21 @@ class StraightTextLayout; class TextShape : public MapShape { public: - TextShape(m2::PointF const & basePoint, TextViewParams const & params); + TextShape(m2::PointF const & basePoint, TextViewParams const & params, bool hasPOI); - void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; -private: - void DrawSubString(StraightTextLayout const & layout, df::FontDecl const & font, - glsl::vec2 const & baseOffset, dp::RefPointer batcher, - dp::RefPointer textures) const; + void Draw(ref_ptr batcher, ref_ptr textures) const override; + MapShapePriority GetPriority() const override { return MapShapePriority::TextAndPoiPriority; } private: + void DrawSubString(StraightTextLayout const & layout, dp::FontDecl const & font, + glsl::vec2 const & baseOffset, ref_ptr batcher, + ref_ptr textures, bool isPrimary, bool isOptional) const; + + uint64_t GetOverlayPriority() const; + m2::PointF m_basePoint; TextViewParams m_params; + bool m_hasPOI; }; } // namespace df diff --git a/drape_frontend/threads_commutator.cpp b/drape_frontend/threads_commutator.cpp index 640b5f46f1..91264a9307 100644 --- a/drape_frontend/threads_commutator.cpp +++ b/drape_frontend/threads_commutator.cpp @@ -12,12 +12,12 @@ void ThreadsCommutator::RegisterThread(ThreadName name, MessageAcceptor * accept VERIFY(m_acceptors.insert(make_pair(name, acceptor)).second, ()); } -void ThreadsCommutator::PostMessage(ThreadName name, dp::TransferPointer message) +void ThreadsCommutator::PostMessage(ThreadName name, drape_ptr && message, MessagePriority priority) { - acceptors_map_t::iterator it = m_acceptors.find(name); + TAcceptorsMap::iterator it = m_acceptors.find(name); ASSERT(it != m_acceptors.end(), ()); if (it != m_acceptors.end()) - it->second->PostMessage(message); + it->second->PostMessage(move(message), priority); } } // namespace df diff --git a/drape_frontend/threads_commutator.hpp b/drape_frontend/threads_commutator.hpp index 61658aa926..a74e38af63 100644 --- a/drape_frontend/threads_commutator.hpp +++ b/drape_frontend/threads_commutator.hpp @@ -7,6 +7,7 @@ namespace df { class Message; +enum class MessagePriority; class MessageAcceptor; class ThreadsCommutator @@ -19,11 +20,11 @@ public: }; void RegisterThread(ThreadName name, MessageAcceptor *acceptor); - void PostMessage(ThreadName name, dp::TransferPointer message); + void PostMessage(ThreadName name, drape_ptr && message, MessagePriority priority); private: - typedef map acceptors_map_t; - acceptors_map_t m_acceptors; + typedef map TAcceptorsMap; + TAcceptorsMap m_acceptors; }; } // namespace df diff --git a/drape_frontend/tile_info.cpp b/drape_frontend/tile_info.cpp index 6b666528de..549b30634c 100644 --- a/drape_frontend/tile_info.cpp +++ b/drape_frontend/tile_info.cpp @@ -1,106 +1,102 @@ -#include "drape_frontend/tile_info.hpp" #include "drape_frontend/engine_context.hpp" -#include "drape_frontend/stylist.hpp" -#include "drape_frontend/rule_drawer.hpp" #include "drape_frontend/map_data_provider.hpp" +#include "drape_frontend/rule_drawer.hpp" +#include "drape_frontend/stylist.hpp" +#include "drape_frontend/tile_info.hpp" #include "indexer/scales.hpp" #include "base/scope_guard.hpp" +#include "base/logging.hpp" #include "std/bind.hpp" - -namespace -{ - -struct IDsAccumulator -{ - IDsAccumulator(vector & ids, vector const & src) - : m_ids(ids) - , m_src(src) - { - } - - void operator()(size_t index) - { - ASSERT_LESS(index, m_src.size(), ()); - m_ids.push_back(m_src[index].m_id); - } - - vector & m_ids; - vector const & m_src; -}; - -} // namespace - namespace df { -TileInfo::TileInfo(TileKey const & key) - : m_key(key) +TileInfo::TileInfo(drape_ptr && context) + : m_context(move(context)) , m_isCanceled(false) -{} +{ +} m2::RectD TileInfo::GetGlobalRect() const { - return m_key.GetGlobalRect(); + return GetTileKey().GetGlobalRect(); } void TileInfo::ReadFeatureIndex(MapDataProvider const & model) { - threads::MutexGuard guard(m_mutex); - UNUSED_VALUE(guard); - if (DoNeedReadIndex()) { CheckCanceled(); model.ReadFeaturesID(bind(&TileInfo::ProcessID, this, _1), GetGlobalRect(), GetZoomLevel()); - sort(m_featureInfo.begin(), m_featureInfo.end()); + + //sort(m_featureInfo.begin(), m_featureInfo.end()); + // Do debug check instead of useless sorting. +#ifdef DEBUG + set existing; + auto i = m_featureInfo.begin(); + while (i != m_featureInfo.end()) + { + auto const & id = i->m_id.m_mwmId; + ASSERT(existing.insert(id).second, ()); + i = find_if(i+1, m_featureInfo.end(), [&id](FeatureInfo const & info) + { + return (id != info.m_id.m_mwmId); + }); + } +#endif } } -void TileInfo::ReadFeatures(MapDataProvider const & model, - MemoryFeatureIndex & memIndex, - EngineContext & context) +void TileInfo::ReadFeatures(MapDataProvider const & model, MemoryFeatureIndex & memIndex) { - CheckCanceled(); - vector indexes; - RequestFeatures(memIndex, indexes); + m_context->BeginReadTile(); - if (!indexes.empty()) + // Reading can be interrupted by exception throwing + MY_SCOPE_GUARD(ReleaseReadTile, bind(&EngineContext::EndReadTile, m_context.get())); + + vector featuresToRead; { - context.BeginReadTile(m_key); + MemoryFeatureIndex::Lock lock(memIndex); + UNUSED_VALUE(lock); - // Reading can be interrupted by exception throwing - MY_SCOPE_GUARD(ReleaseReadTile, bind(&EngineContext::EndReadTile, &context, m_key)); + ReadFeatureIndex(model); + CheckCanceled(); + featuresToRead.reserve(AverageFeaturesCount); + memIndex.ReadFeaturesRequest(m_featureInfo, featuresToRead); + } - vector featuresToRead; - for_each(indexes.begin(), indexes.end(), IDsAccumulator(featuresToRead, m_featureInfo)); - - RuleDrawer drawer(bind(&TileInfo::InitStylist, this, _1 ,_2), m_key, context); - model.ReadFeatures(ref(drawer), featuresToRead); + if (!featuresToRead.empty()) + { + RuleDrawer drawer(bind(&TileInfo::InitStylist, this, _1 ,_2), make_ref(m_context)); + model.ReadFeatures(bind(ref(drawer), _1), featuresToRead); } } void TileInfo::Cancel(MemoryFeatureIndex & memIndex) { m_isCanceled = true; - threads::MutexGuard guard(m_mutex); - UNUSED_VALUE(guard); + MemoryFeatureIndex::Lock lock(memIndex); + UNUSED_VALUE(lock); memIndex.RemoveFeatures(m_featureInfo); } +bool TileInfo::IsCancelled() const +{ + return m_isCanceled; +} + void TileInfo::ProcessID(FeatureID const & id) { m_featureInfo.push_back(id); - CheckCanceled(); } void TileInfo::InitStylist(FeatureType const & f, Stylist & s) { CheckCanceled(); - df::InitStylist(f, GetZoomLevel(), s); + df::InitStylist(f, m_context->GetTileKey().m_zoomLevel, s); } //====================================================// @@ -110,12 +106,6 @@ bool TileInfo::DoNeedReadIndex() const return m_featureInfo.empty(); } -void TileInfo::RequestFeatures(MemoryFeatureIndex & memIndex, vector & featureIndexes) -{ - threads::MutexGuard guard(m_mutex); - memIndex.ReadFeaturesRequest(m_featureInfo, featureIndexes); -} - void TileInfo::CheckCanceled() const { if (m_isCanceled) @@ -125,7 +115,8 @@ void TileInfo::CheckCanceled() const int TileInfo::GetZoomLevel() const { int const upperScale = scales::GetUpperScale(); - return (m_key.m_zoomLevel <= upperScale ? m_key.m_zoomLevel : upperScale); + int const zoomLevel = m_context->GetTileKey().m_zoomLevel; + return (zoomLevel <= upperScale ? zoomLevel : upperScale); } } // namespace df diff --git a/drape_frontend/tile_info.hpp b/drape_frontend/tile_info.hpp index 7957282060..3c5478973c 100644 --- a/drape_frontend/tile_info.hpp +++ b/drape_frontend/tile_info.hpp @@ -1,15 +1,16 @@ #pragma once -#include "drape_frontend/tile_key.hpp" +#include "drape_frontend/engine_context.hpp" #include "drape_frontend/memory_feature_index.hpp" +#include "drape_frontend/tile_key.hpp" #include "indexer/feature_decl.hpp" -#include "base/mutex.hpp" #include "base/exception.hpp" +#include "std/atomic.hpp" +#include "std/mutex.hpp" #include "std/vector.hpp" -#include "std/noncopyable.hpp" class FeatureType; @@ -17,7 +18,6 @@ namespace df { class MapDataProvider; -class EngineContext; class Stylist; class TileInfo : private noncopyable @@ -25,34 +25,30 @@ class TileInfo : private noncopyable public: DECLARE_EXCEPTION(ReadCanceledException, RootException); - TileInfo(TileKey const & key); + TileInfo(drape_ptr && context); - void ReadFeatureIndex(MapDataProvider const & model); - void ReadFeatures(MapDataProvider const & model, - MemoryFeatureIndex & memIndex, - EngineContext & context); + void ReadFeatures(MapDataProvider const & model, MemoryFeatureIndex & memIndex); void Cancel(MemoryFeatureIndex & memIndex); + bool IsCancelled() const; m2::RectD GetGlobalRect() const; - TileKey const & GetTileKey() const { return m_key; } - - bool operator <(TileInfo const & other) const { return m_key < other.m_key; } + TileKey const & GetTileKey() const { return m_context->GetTileKey(); } + bool operator <(TileInfo const & other) const { return GetTileKey() < other.GetTileKey(); } private: + void ReadFeatureIndex(MapDataProvider const & model); void ProcessID(FeatureID const & id); void InitStylist(FeatureType const & f, Stylist & s); - void RequestFeatures(MemoryFeatureIndex & memIndex, vector & featureIndexes); void CheckCanceled() const; bool DoNeedReadIndex() const; int GetZoomLevel() const; private: - TileKey m_key; - vector m_featureInfo; + drape_ptr m_context; + TFeaturesInfo m_featureInfo; - bool m_isCanceled; - threads::Mutex m_mutex; + atomic m_isCanceled; }; } // namespace df diff --git a/drape_frontend/tile_key.cpp b/drape_frontend/tile_key.cpp old mode 100644 new mode 100755 index 7069bcd66f..56289c0b93 --- a/drape_frontend/tile_key.cpp +++ b/drape_frontend/tile_key.cpp @@ -5,8 +5,8 @@ namespace df { -TileKey::TileKey() : - m_x(-1), m_y(-1), m_zoomLevel(-1) +TileKey::TileKey() + : m_x(-1), m_y(-1), m_zoomLevel(-1) { } @@ -28,8 +28,8 @@ bool TileKey::operator <(TileKey const & other) const bool TileKey::operator ==(TileKey const & other) const { return m_x == other.m_x && - m_y == other.m_y && - m_zoomLevel == other.m_zoomLevel; + m_y == other.m_y && + m_zoomLevel == other.m_zoomLevel; } m2::RectD TileKey::GetGlobalRect() const @@ -44,4 +44,29 @@ m2::RectD TileKey::GetGlobalRect() const return m2::RectD (startX, startY, startX + rectSize, startY + rectSize); } +string DebugPrint(TileKey const & key) +{ + ostringstream out; + out << "[x = " << key.m_x << ", y = " << key.m_y << ", zoomLevel = " << key.m_zoomLevel << "]"; + return out.str(); +} + +string DebugPrint(TileStatus status) +{ + switch (status) + { + case TileStatus::Unknown: + return "Unknown"; + case TileStatus::Rendered: + return "Rendered"; + case TileStatus::Requested: + return "Requested"; + case TileStatus::Deferred: + return "Deferred"; + default: + ASSERT(false, ()); + } + return ""; +} + } //namespace df diff --git a/drape_frontend/tile_key.hpp b/drape_frontend/tile_key.hpp old mode 100644 new mode 100755 index cb682227ec..24a9e73d47 --- a/drape_frontend/tile_key.hpp +++ b/drape_frontend/tile_key.hpp @@ -5,6 +5,18 @@ namespace df { +enum class TileStatus +{ + // tile does not participate in rendering or fake + Unknown = 0, + // tile is rendered + Rendered, + // tile has been requested to be rendered + Requested, + // tile is ready but it was deferred for rendering + Deferred +}; + struct TileKey { TileKey(); @@ -20,4 +32,7 @@ struct TileKey int m_zoomLevel; }; +string DebugPrint(TileKey const & key); +string DebugPrint(TileStatus status); + } // namespace df diff --git a/drape_frontend/tile_tree.cpp b/drape_frontend/tile_tree.cpp new file mode 100755 index 0000000000..7ff45bd4f3 --- /dev/null +++ b/drape_frontend/tile_tree.cpp @@ -0,0 +1,452 @@ +#include "tile_tree.hpp" + +#include "std/algorithm.hpp" +#include "std/utility.hpp" + +namespace df +{ + +TileTree::TileTree() + : m_root(new Node()) +{ +} + +TileTree::~TileTree() +{ + ResetHandlers(); +} + +void TileTree::SetHandlers(TRenderGroupHandler const & addRenderGroup, + TRenderGroupHandler const & deferRenderGroup, + TTileHandler const & activateTile, + TTileHandler const & removeTile) +{ + m_addRenderGroupHandler = addRenderGroup; + m_deferRenderGroupHandler = deferRenderGroup; + m_activateTileHandler = activateTile; + m_removeTileHandler = removeTile; +} + +void TileTree::Invalidate() +{ + m_root.reset(new Node()); +} + +void TileTree::ResetHandlers() +{ + m_addRenderGroupHandler = nullptr; + m_deferRenderGroupHandler = nullptr; + m_activateTileHandler = nullptr; + m_removeTileHandler = nullptr; +} + +void TileTree::BeginRequesting(int const zoomLevel, m2::RectD const & clipRect) +{ + ClipByRect(clipRect); + AbortTiles(m_root, zoomLevel); +} + +void TileTree::RequestTile(TileKey const & tileKey) +{ + InsertToNode(m_root, tileKey); +} + +void TileTree::EndRequesting() +{ + SimplifyTree(); +} + +void TileTree::ClipByRect(m2::RectD const & rect) +{ + ClipNode(m_root, rect); + CheckDeferredTiles(m_root); + SimplifyTree(); +} + +void TileTree::ProcessTile(TileKey const & tileKey, int const zoomLevel, + dp::GLState const & state, drape_ptr && bucket) +{ + bool const result = ProcessNode(m_root, tileKey, zoomLevel, state, move(bucket)); + if (result) + SimplifyTree(); +} + +void TileTree::FinishTiles(TTilesCollection const & tiles, int const zoomLevel) +{ + bool changed = false; + for (TileKey const & tileKey : tiles) + changed |= FinishNode(m_root, tileKey, zoomLevel); + + if (changed) + { + CheckDeferredTiles(m_root); + SimplifyTree(); + } +} + +void TileTree::InsertToNode(TNodePtr const & node, TileKey const & tileKey) +{ + // here we try to insert new tile to the node. The tree is built in such way that + // child nodes always have got the same zoom level + + // insert to empty node + if (node->m_children.empty()) + { + node->m_children.emplace_back(TNodePtr(new Node(tileKey, TileStatus::Requested))); + return; + } + + int const childrenZoomLevel = node->m_children.front()->m_tileKey.m_zoomLevel; + if (tileKey.m_zoomLevel > childrenZoomLevel) + { + // here zoom level of node's children less than new tile's zoom level + // so we are looking for node to insert new tile recursively + InsertToNodeBelow(node, tileKey, childrenZoomLevel); + } + else if (tileKey.m_zoomLevel < childrenZoomLevel) + { + // here zoom level of node's children more than new tile's zoom level + // so we paste new tile and redistribute children of current node + // between new tile and his siblings + InsertToNodeAbove(node, tileKey); + } + else + { + // here zoom level of node's children equals to new tile's zoom level + // so we insert new tile if we haven't got one + InsertToCurrentNode(node, tileKey); + } +} + +void TileTree::InsertToCurrentNode(TNodePtr const & node, TileKey const & tileKey) +{ + auto it = find_if(node->m_children.begin(), node->m_children.end(), [&tileKey](TNodePtr const & n) + { + return n->m_tileKey == tileKey; + }); + if (it != node->m_children.end()) + { + if ((*it)->m_tileStatus == TileStatus::Unknown) + { + (*it)->m_tileStatus = TileStatus::Requested; + (*it)->m_isRemoved = false; + } + } + else + { + node->m_children.emplace_back(TNodePtr(new Node(tileKey, TileStatus::Requested))); + } +} + +void TileTree::InsertToNodeAbove(TNodePtr const & node, TileKey const & tileKey) +{ + list newChildren; + newChildren.emplace_back(TNodePtr(new Node(tileKey, TileStatus::Requested))); + for (auto it = node->m_children.begin(); it != node->m_children.end(); ++it) + { + // looking for parent node + TileKey const parentTileKey = GetParentTile((*it)->m_tileKey, tileKey.m_zoomLevel); + auto parentNodeIt = find_if(newChildren.begin(), newChildren.end(), [&parentTileKey](TNodePtr const & n) + { + return n->m_tileKey == parentTileKey; + }); + + // insert to parent node + if (parentNodeIt == newChildren.end()) + { + newChildren.emplace_back(TNodePtr(new Node(parentTileKey, TileStatus::Unknown))); + newChildren.back()->m_children.emplace_back(move(*it)); + } + else + { + (*parentNodeIt)->m_children.emplace_back(move(*it)); + } + } + node->m_children.swap(newChildren); +} + +void TileTree::InsertToNodeBelow(TNodePtr const & node, TileKey const & tileKey, int const childrenZoomLevel) +{ + // looking for parent node + auto parentNodeIt = find_if(node->m_children.begin(), node->m_children.end(), [&tileKey](TNodePtr const & n) + { + return IsTileBelow(n->m_tileKey, tileKey); + }); + + // insert to parent node + if (parentNodeIt == node->m_children.end()) + { + TileKey parentTileKey = GetParentTile(tileKey, childrenZoomLevel); + node->m_children.emplace_back(TNodePtr(new Node(parentTileKey, TileStatus::Unknown))); + InsertToNode(node->m_children.back(), tileKey); + } + else + { + InsertToNode(*parentNodeIt, tileKey); + } +} + +void TileTree::AbortTiles(TNodePtr const & node, int const zoomLevel) +{ + for (TNodePtr const & childNode : node->m_children) + { + if (childNode->m_tileKey.m_zoomLevel != zoomLevel) + { + if (childNode->m_tileStatus == TileStatus::Requested) + childNode->m_tileStatus = TileStatus::Unknown; + else if (childNode->m_tileStatus == TileStatus::Deferred) + RemoveTile(childNode); + } + + AbortTiles(childNode, zoomLevel); + } +} + +void TileTree::ClipNode(TNodePtr const & node, m2::RectD const & rect) +{ + for (auto it = node->m_children.begin(); it != node->m_children.end();) + { + m2::RectD const tileRect = (*it)->m_tileKey.GetGlobalRect(); + if(rect.IsIntersect(tileRect)) + { + ClipNode(*it, rect); + ++it; + } + else + { + RemoveTile(*it); + ClipNode(*it, rect); + it = node->m_children.erase(it); + } + } +} + +void TileTree::RemoveTile(TNodePtr const & node) +{ + if (m_removeTileHandler != nullptr && !node->m_isRemoved) + m_removeTileHandler(node->m_tileKey); + + node->m_isRemoved = true; + node->m_tileStatus = TileStatus::Unknown; +} + +bool TileTree::ProcessNode(TNodePtr const & node, TileKey const & tileKey, int const zoomLevel, + dp::GLState const & state, drape_ptr && bucket) +{ + for (TNodePtr const & childNode : node->m_children) + { + if (tileKey == childNode->m_tileKey) + { + // skip unknown tiles and tiles from different zoom level + // A tile can get Unknown status if it becomes invalid before BR finished its processing + if (childNode->m_tileStatus == TileStatus::Unknown || + childNode->m_tileKey.m_zoomLevel != zoomLevel) + return false; + + // remove all tiles below current + DeleteTilesBelow(childNode); + + // add or defer render group + if (node->m_tileStatus == TileStatus::Rendered) + { + childNode->m_tileStatus = TileStatus::Deferred; + if (m_deferRenderGroupHandler != nullptr) + m_deferRenderGroupHandler(childNode->m_tileKey, state, move(bucket)); + childNode->m_isRemoved = false; + } + else + { + childNode->m_tileStatus = TileStatus::Rendered; + if (m_addRenderGroupHandler != nullptr) + m_addRenderGroupHandler(childNode->m_tileKey, state, move(bucket)); + childNode->m_isRemoved = false; + } + + // try to remove tile above + TryDeleteTileAbove(node); + + return true; + } + else if (IsTileBelow(childNode->m_tileKey, tileKey)) + return ProcessNode(childNode, tileKey, zoomLevel, state, move(bucket)); + } + return false; +} + +bool TileTree::FinishNode(TNodePtr const & node, TileKey const & tileKey, int const zoomLevel) +{ + bool changed = false; + for (TNodePtr const & childNode : node->m_children) + { + if (childNode->m_tileKey == tileKey && childNode->m_tileStatus == TileStatus::Requested) + { + // here a tile has finished, but we hadn't got any data from BR. It means that + // this tile is empty, so we mark this tile as rendered + childNode->m_tileStatus = TileStatus::Rendered; + childNode->m_isRemoved = false; + + if (childNode->m_tileKey.m_zoomLevel >= zoomLevel) + DeleteTilesBelow(childNode); + + return true; + } + + changed |= FinishNode(childNode, tileKey, zoomLevel); + } + return changed; +} + +void TileTree::DeleteTilesBelow(TNodePtr const & node) +{ + for (TNodePtr const & childNode : node->m_children) + { + RemoveTile(childNode); + DeleteTilesBelow(childNode); + } + node->m_children.clear(); +} + +void TileTree::TryDeleteTileAbove(TNodePtr const & node) +{ + if (node->m_tileStatus == TileStatus::Requested || node->m_children.empty()) + return; + + // check if all child tiles are ready + for (TNodePtr const & childNode : node->m_children) + if (childNode->m_tileStatus == TileStatus::Requested) + return; + + // add deferred tiles + for (TNodePtr const & childNode : node->m_children) + { + if (childNode->m_tileStatus == TileStatus::Deferred) + { + if (m_activateTileHandler != nullptr) + m_activateTileHandler(childNode->m_tileKey); + + childNode->m_tileStatus = TileStatus::Rendered; + childNode->m_isRemoved = false; + } + } + + // remove current tile + if (node != m_root) + RemoveTile(node); +} + +void TileTree::SimplifyTree() +{ + ClearEmptyLevels(m_root); + ClearObsoleteTiles(m_root); +} + +void TileTree::ClearEmptyLevels(TNodePtr const & node) +{ + if (HaveChildrenSameStatus(node, TileStatus::Unknown)) + { + // all grandchildren have the same zoom level? + if (!HaveGrandchildrenSameZoomLevel(node)) + return; + + // move grandchildren to grandfather + list newChildren; + for (TNodePtr const & childNode : node->m_children) + { + RemoveTile(childNode); + newChildren.splice(newChildren.begin(), childNode->m_children); + } + node->m_children.swap(newChildren); + } + + // remove unknown nodes without children + for (auto it = node->m_children.begin(); it != node->m_children.end();) + { + if((*it)->m_tileStatus == TileStatus::Unknown && (*it)->m_children.empty()) + { + RemoveTile(*it); + it = node->m_children.erase(it); + } + else + ++it; + } + + for (TNodePtr const & childNode : node->m_children) + ClearEmptyLevels(childNode); +} + +bool TileTree::ClearObsoleteTiles(TNodePtr const & node) +{ + bool canClear = true; + for (TNodePtr const & childNode : node->m_children) + canClear &= ClearObsoleteTiles(childNode); + + if (canClear) + { + for (TNodePtr const & childNode : node->m_children) + RemoveTile(childNode); + + node->m_children.clear(); + } + + return canClear && node->m_tileStatus == TileStatus::Unknown; +} + +bool TileTree::HaveChildrenSameStatus(TNodePtr const & node, TileStatus tileStatus) const +{ + for (TNodePtr const & childNode : node->m_children) + if (childNode->m_tileStatus != tileStatus) + return false; + + return true; +} + +bool TileTree::HaveGrandchildrenSameZoomLevel(TNodePtr const & node) const +{ + if (node->m_children.empty()) + return true; + + int zoomLevel = -1; + for (TNodePtr const & childNode : node->m_children) + { + if (childNode->m_children.empty()) + continue; + + int z = childNode->m_children.front()->m_tileKey.m_zoomLevel; + + if (zoomLevel != -1 && zoomLevel != z) + return false; + + zoomLevel = z; + } + return true; +} + +void TileTree::CheckDeferredTiles(TNodePtr const & node) +{ + for (TNodePtr const & childNode : node->m_children) + { + TryDeleteTileAbove(childNode); + CheckDeferredTiles(childNode); + } +} + +void DebugPrintNode(TileTree::TNodePtr const & node, ostringstream & out, string const & offset) +{ + for (TileTree::TNodePtr const & childNode : node->m_children) + { + out << offset << "{ " << DebugPrint(childNode->m_tileKey) << ", " + << DebugPrint(childNode->m_tileStatus) << (childNode->m_isRemoved ? ", removed" : "") << "}\n"; + DebugPrintNode(childNode, out, offset + " "); + } +} + +string DebugPrint(TileTree const & tileTree) +{ + ostringstream out; + out << "\n{\n"; + DebugPrintNode(tileTree.m_root, out, " "); + out << "}\n"; + return out.str(); +} + +} // namespace df diff --git a/drape_frontend/tile_tree.hpp b/drape_frontend/tile_tree.hpp new file mode 100755 index 0000000000..3991daab93 --- /dev/null +++ b/drape_frontend/tile_tree.hpp @@ -0,0 +1,117 @@ +#pragma once + +#include "tile_utils.hpp" +#include "render_group.hpp" + +#include "drape/glstate.hpp" +#include "drape/pointers.hpp" +#include "geometry/rect2d.hpp" + +#include "std/function.hpp" +#include "std/list.hpp" +#include "std/sstream.hpp" +#include "std/unique_ptr.hpp" + +namespace df +{ + +/// This class implements K-d tree of visible tiles. +class TileTree +{ +public: + TileTree(); + ~TileTree(); + + using TTileHandler = function; + using TRenderGroupHandler = function &&)>; + + /// This method sets following handlers: + /// addRenderGroup is called when render group can be created by a tile and rendered at once, + /// deferRenderGroup is called when render group can be created by a tile but has to be deferred, + /// activateTile is called when previously deferred tile can be rendered, + /// removeTile is called when a tile must be removed from rendering. + void SetHandlers(TRenderGroupHandler const & addRenderGroup, + TRenderGroupHandler const & deferRenderGroup, + TTileHandler const & activateTile, + TTileHandler const & removeTile); + + void Invalidate(); + + /// This method must be called before requesting bunch of tiles. + void BeginRequesting(int const zoomLevel, m2::RectD const & clipRect); + /// This method requests a new tile. + void RequestTile(TileKey const & tileKey); + /// This method must be called after requesting bunch of tiles. + void EndRequesting(); + + /// This method processes received from BR (backend renderer) tile. + void ProcessTile(TileKey const & tileKey, int const zoomLevel, + dp::GLState const & state, drape_ptr && bucket); + /// This method processes a message about finishing reading tiles on BR. + void FinishTiles(TTilesCollection const & tiles, int const zoomLevel); + +private: + struct Node; + using TNodePtr = unique_ptr; + + void ResetHandlers(); + + void InsertToNode(TNodePtr const & node, TileKey const & tileKey); + void InsertToCurrentNode(TNodePtr const & node, TileKey const & tileKey); + void InsertToNodeAbove(TNodePtr const & node, TileKey const & tileKey); + void InsertToNodeBelow(TNodePtr const & node, TileKey const & tileKey, int const childrenZoomLevel); + void AbortTiles(TNodePtr const & node, int const zoomLevel); + + void ClipByRect(m2::RectD const & rect); + + void ClipNode(TNodePtr const & node, m2::RectD const & rect); + void CheckDeferredTiles(TNodePtr const & node); + + void RemoveTile(TNodePtr const & node); + + bool ProcessNode(TNodePtr const & node, TileKey const & tileKey, int const zoomLevel, + dp::GLState const & state, drape_ptr && bucket); + bool FinishNode(TNodePtr const & node, TileKey const & tileKey, int const zoomLevel); + + void DeleteTilesBelow(TNodePtr const & node); + void TryDeleteTileAbove(TNodePtr const & node); + + void SimplifyTree(); + void ClearEmptyLevels(TNodePtr const & node); + bool ClearObsoleteTiles(TNodePtr const & node); + + bool HaveChildrenSameStatus(TNodePtr const & node, TileStatus tileStatus) const; + bool HaveGrandchildrenSameZoomLevel(TNodePtr const & node) const; + + struct Node + { + TileKey m_tileKey; + list m_children; + TileStatus m_tileStatus = TileStatus::Unknown; + bool m_isRemoved = false; + + Node() = default; + Node(TileKey const & key, TileStatus status) + : m_tileKey(key), m_tileStatus(status) + {} + + Node(TileKey const & key, TileStatus status, bool isRemoved) + : m_tileKey(key), m_tileStatus(status), m_isRemoved(isRemoved) + {} + }; + + TNodePtr m_root; + TRenderGroupHandler m_addRenderGroupHandler; + TRenderGroupHandler m_deferRenderGroupHandler; + TTileHandler m_activateTileHandler; + TTileHandler m_removeTileHandler; + + friend void DebugPrintNode(TileTree::TNodePtr const & node, ostringstream & out, string const & offset); + friend string DebugPrint(TileTree const & tileTree); + + friend class TileTreeBuilder; + friend class TileTreeComparer; +}; + +} // namespace df diff --git a/drape_frontend/tile_tree_builder.cpp b/drape_frontend/tile_tree_builder.cpp new file mode 100755 index 0000000000..7f2dcbe74a --- /dev/null +++ b/drape_frontend/tile_tree_builder.cpp @@ -0,0 +1,120 @@ +#include "drape_frontend/tile_tree_builder.hpp" + +#include "std/algorithm.hpp" + +namespace df +{ + +TileTreeBuilderNode::TileTreeBuilderNode() + : m_prevBrother(nullptr) + , m_tileStatus(TileStatus::Unknown) + , m_isRemoved(false) +{ +} + +TileTreeBuilderNode::TileTreeBuilderNode(TileKey const & tileKey, TileStatus tileStatus, bool isRemoved) + : m_prevBrother(nullptr) + , m_tileKey(tileKey) + , m_tileStatus(tileStatus) + , m_isRemoved(isRemoved) +{ +} + +TileTreeBuilderNode::TileTreeBuilderNode(TileTreeBuilderNode & node) + : m_prevBrother(node.m_prevBrother) + , m_nextBrother(move(node.m_nextBrother)) + , m_child(move(node.m_child)) + , m_tileKey(node.m_tileKey) + , m_tileStatus(node.m_tileStatus) + , m_isRemoved(node.m_isRemoved) +{ +} + +TileTreeBuilderNode & TileTreeBuilderNode::Node(TileKey const & tileKey, TileStatus tileStatus, bool isRemoved) +{ + m_nextBrother.reset(new TileTreeBuilderNode(tileKey, tileStatus, isRemoved)); + m_nextBrother->m_prevBrother = this; + return *m_nextBrother.get(); +} + +TileTreeBuilderNode & TileTreeBuilderNode::Children(TileTreeBuilderNode & node) +{ + m_child.reset(new TileTreeBuilderNode(node)); + return *this; +} + +TileTreeBuilderNode Node(TileKey const & tileKey, TileStatus tileStatus, bool isRemoved) +{ + TileTreeBuilderNode node(tileKey, tileStatus, isRemoved); + return node; +} + +unique_ptr TileTreeBuilder::Build(TileTreeBuilderNode const & root) +{ + unique_ptr tree = make_unique(); + InsertIntoNode(tree->m_root, root); + return tree; +} + +void TileTreeBuilder::InsertIntoNode(TileTree::TNodePtr & node, TileTreeBuilderNode const & builderNode) +{ + node->m_children.push_back(CreateNode(& builderNode)); + if (builderNode.m_child != nullptr) + InsertIntoNode(node->m_children.back(), *builderNode.m_child.get()); + + TileTreeBuilderNode * n = builderNode.m_prevBrother; + while (n != nullptr) + { + node->m_children.push_back(CreateNode(n)); + if (n->m_child != nullptr) + InsertIntoNode(node->m_children.back(), *n->m_child.get()); + n = n->m_prevBrother; + } +} + +unique_ptr TileTreeBuilder::CreateNode(TileTreeBuilderNode const * node) +{ + return make_unique(node->m_tileKey, node->m_tileStatus, node->m_isRemoved); +} + +bool TileTreeComparer::IsEqual(unique_ptr const & tree1, unique_ptr const & tree2) const +{ + return CompareSubtree(tree1->m_root, tree2->m_root); +} + +bool TileTreeComparer::CompareSubtree(TileTree::TNodePtr const & node1, TileTree::TNodePtr const & node2) const +{ + if (!CompareNodes(node1, node2)) + return false; + + for (TileTree::TNodePtr const & n1 : node1->m_children) + { + auto found = find_if(node2->m_children.begin(), node2->m_children.end(), [this, &n1](TileTree::TNodePtr const & n2) + { + return CompareNodes(n1, n2); + }); + + if (found != node2->m_children.end()) + { + if (!CompareSubtree(n1, *found)) + return false; + } + else + { + return false; + } + } + + return true; +} + +bool TileTreeComparer::CompareNodes(TileTree::TNodePtr const & node1, TileTree::TNodePtr const & node2) const +{ + if (!(node1->m_tileKey == node2->m_tileKey) || node1->m_tileStatus != node2->m_tileStatus || + node1->m_isRemoved != node2->m_isRemoved || node1->m_children.size() != node2->m_children.size()) + return false; + + return true; +} + +} //namespace df diff --git a/drape_frontend/tile_tree_builder.hpp b/drape_frontend/tile_tree_builder.hpp new file mode 100755 index 0000000000..da80cfad68 --- /dev/null +++ b/drape_frontend/tile_tree_builder.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include "drape_frontend/tile_tree.hpp" + +#include "std/list.hpp" +#include "std/unique_ptr.hpp" + +namespace df +{ + +// These classes can be used only for tests! + +class TileTreeBuilderNode +{ + friend class TileTreeBuilder; +public: + TileTreeBuilderNode & Node(TileKey const & tileKey, TileStatus tileStatus, bool isRemoved = false); + TileTreeBuilderNode & Children(TileTreeBuilderNode & node); + +private: + TileTreeBuilderNode(); + TileTreeBuilderNode(TileKey const & tileKey, TileStatus tileStatus, bool isRemoved); + TileTreeBuilderNode(TileTreeBuilderNode & node); + + TileTreeBuilderNode * m_prevBrother; + unique_ptr m_nextBrother; + unique_ptr m_child; + + TileKey m_tileKey; + TileStatus m_tileStatus; + bool m_isRemoved; + + friend TileTreeBuilderNode Node(TileKey const &, TileStatus, bool); +}; + +TileTreeBuilderNode Node(TileKey const & tileKey, TileStatus tileStatus, bool isRemoved = false); + +class TileTreeBuilder +{ +public: + unique_ptr Build(TileTreeBuilderNode const & root); + +private: + void InsertIntoNode(TileTree::TNodePtr & node, TileTreeBuilderNode const & builderNode); + unique_ptr CreateNode(TileTreeBuilderNode const * node); +}; + +class TileTreeComparer +{ +public: + bool IsEqual(unique_ptr const & tree1, unique_ptr const & tree2) const; + +private: + bool CompareSubtree(TileTree::TNodePtr const & node1, TileTree::TNodePtr const & node2) const; + bool CompareNodes(TileTree::TNodePtr const & node1, TileTree::TNodePtr const & node2) const; +}; + +} // namespace df diff --git a/drape_frontend/tile_utils.cpp b/drape_frontend/tile_utils.cpp new file mode 100755 index 0000000000..bc6f3ca67e --- /dev/null +++ b/drape_frontend/tile_utils.cpp @@ -0,0 +1,107 @@ +#include "tile_utils.hpp" + +#include "base/assert.hpp" +#include "base/stl_add.hpp" + +namespace df +{ + +namespace +{ + +int Minificate(int coord, int zoom, int targetZoom) +{ + ASSERT(targetZoom < zoom, ()); + + int z = zoom - targetZoom; + if (coord >= 0) + return coord >> z; + + // here we iteratively minificate zoom + int c = -coord; + ASSERT(c > 0, ()); + while (z > 0) + { + // c = c / 2 + 1, if c is odd + // c = c / 2, if c is even + c = (c + 1) >> 1; + z--; + } + return -c; +} + +} // namespace + +void CalcTilesCoverage(TileKey const & tileKey, int targetZoom, TTilesCollection & tiles) +{ + CalcTilesCoverage(tileKey, targetZoom, MakeInsertFunctor(tiles)); +} + +void CalcTilesCoverage(set const & tileKeys, int targetZoom, TTilesCollection & tiles) +{ + for(TileKey const & tileKey : tileKeys) + CalcTilesCoverage(tileKey, targetZoom, tiles); +} + +void CalcTilesCoverage(TileKey const & tileKey, int targetZoom, function const & processTile) +{ + ASSERT(processTile != nullptr, ()); + + if (tileKey.m_zoomLevel == targetZoom) + processTile(tileKey); + else if (tileKey.m_zoomLevel > targetZoom) + { + // minification + processTile(GetParentTile(tileKey, targetZoom)); + } + else + { + // magnification + int const z = targetZoom - tileKey.m_zoomLevel; + int const tilesInRow = 1 << z; + int const startX = tileKey.m_x << z; + int const startY = tileKey.m_y << z; + for (int x = 0; x < tilesInRow; x++) + for (int y = 0; y < tilesInRow; y++) + processTile(TileKey(startX + x, startY + y, targetZoom)); + } +} + +bool IsTileAbove(TileKey const & tileKey, TileKey const & targetTileKey) +{ + if (tileKey.m_zoomLevel <= targetTileKey.m_zoomLevel) + return false; + + int const x = Minificate(tileKey.m_x, tileKey.m_zoomLevel, targetTileKey.m_zoomLevel); + if (x != targetTileKey.m_x) + return false; + + int const y = Minificate(tileKey.m_y, tileKey.m_zoomLevel, targetTileKey.m_zoomLevel); + return y == targetTileKey.m_y; +} + +bool IsTileBelow(TileKey const & tileKey, TileKey const & targetTileKey) +{ + if (tileKey.m_zoomLevel >= targetTileKey.m_zoomLevel) + return false; + + int const z = targetTileKey.m_zoomLevel - tileKey.m_zoomLevel; + int const tilesInRow = 1 << z; + int const startX = tileKey.m_x << z; + if (targetTileKey.m_x < startX || targetTileKey.m_x >= startX + tilesInRow) + return false; + + int const startY = tileKey.m_y << z; + return targetTileKey.m_y >= startY && targetTileKey.m_y < startY + tilesInRow; +} + +TileKey GetParentTile(TileKey const & tileKey, int targetZoom) +{ + ASSERT(tileKey.m_zoomLevel > targetZoom, ()); + + return TileKey(Minificate(tileKey.m_x, tileKey.m_zoomLevel, targetZoom), + Minificate(tileKey.m_y, tileKey.m_zoomLevel, targetZoom), + targetZoom); +} + +} // namespace df diff --git a/drape_frontend/tile_utils.hpp b/drape_frontend/tile_utils.hpp new file mode 100755 index 0000000000..c7bb1669ac --- /dev/null +++ b/drape_frontend/tile_utils.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include "tile_key.hpp" +#include "std/function.hpp" +#include "std/set.hpp" + +namespace df +{ + +using TTilesCollection = set; + +/// This function determines the coverage of a tile in specified zoom level. +void CalcTilesCoverage(TileKey const & tileKey, int targetZoom, TTilesCollection & tiles); + +/// This function determines the coverage of tiles in specified zoom level. +void CalcTilesCoverage(set const & tileKeys, int targetZoom, TTilesCollection & tiles); + +/// This function determines the coverage of a tile in specified zoom level. Each new tile can be processed. +/// in processTile callback. +void CalcTilesCoverage(TileKey const & tileKey, int targetZoom, function const & processTile); + +/// This function checks if targetTileKey is above tileKey. +bool IsTileAbove(TileKey const & tileKey, TileKey const & targetTileKey); + +/// This function checks if targetTileKey is below tileKey. +bool IsTileBelow(TileKey const & tileKey, TileKey const & targetTileKey); + +/// This function returns parent tile on specified zoom level. +TileKey GetParentTile(TileKey const & tileKey, int targetZoom); + +} // namespace df diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp new file mode 100644 index 0000000000..e9af4a4682 --- /dev/null +++ b/drape_frontend/user_event_stream.cpp @@ -0,0 +1,835 @@ +#include "drape_frontend/user_event_stream.hpp" +#include "drape_frontend/visual_params.hpp" + +#include "base/logging.hpp" +#include "base/macros.hpp" + +#ifdef DEBUG +#define TEST_CALL(action) if (m_testFn) m_testFn(action) +#else +#define TEST_CALL(action) +#endif + +namespace df +{ + +namespace +{ + +uint64_t const kDoubleTapPauseMs = 250; +uint64_t const kLongTouchMs = 1000; +uint64_t const kKineticDelayMs = 500; + +double const kMaxAnimationTimeSec = 1.5; // in seconds + +size_t GetValidTouchesCount(array const & touches) +{ + size_t result = 0; + if (touches[0].m_id != -1) + ++result; + if (touches[1].m_id != -1) + ++result; + + return result; +} + +} // namespace + +#ifdef DEBUG +char const * UserEventStream::BEGIN_DRAG = "BeginDrag"; +char const * UserEventStream::DRAG = "Drag"; +char const * UserEventStream::END_DRAG = "EndDrag"; +char const * UserEventStream::BEGIN_SCALE = "BeginScale"; +char const * UserEventStream::SCALE = "Scale"; +char const * UserEventStream::END_SCALE = "EndScale"; +char const * UserEventStream::BEGIN_TAP_DETECTOR = "BeginTap"; +char const * UserEventStream::LONG_TAP_DETECTED = "LongTap"; +char const * UserEventStream::SHORT_TAP_DETECTED = "ShortTap"; +char const * UserEventStream::CANCEL_TAP_DETECTOR = "CancelTap"; +char const * UserEventStream::TRY_FILTER = "TryFilter"; +char const * UserEventStream::END_FILTER = "EndFilter"; +char const * UserEventStream::CANCEL_FILTER = "CancelFilter"; +char const * UserEventStream::TWO_FINGERS_TAP = "TwoFingersTap"; +#endif + +uint8_t const TouchEvent::INVALID_MASKED_POINTER = 0xFF; + +void TouchEvent::PrepareTouches(array const & previousTouches) +{ + if (GetValidTouchesCount(m_touches) == 2 && GetValidTouchesCount(previousTouches) > 0) + { + if (previousTouches[0].m_id == m_touches[1].m_id) + Swap(); + } +} + +void TouchEvent::SetFirstMaskedPointer(uint8_t firstMask) +{ + m_pointersMask = (m_pointersMask & 0xFF00) | static_cast(firstMask); +} + +uint8_t TouchEvent::GetFirstMaskedPointer() const +{ + return static_cast(m_pointersMask & 0xFF); +} + +void TouchEvent::SetSecondMaskedPointer(uint8_t secondMask) +{ + ASSERT(secondMask == INVALID_MASKED_POINTER || GetFirstMaskedPointer() != INVALID_MASKED_POINTER, ()); + m_pointersMask = (static_cast(secondMask) << 8) | (m_pointersMask & 0xFF); +} + +uint8_t TouchEvent::GetSecondMaskedPointer() const +{ + return static_cast((m_pointersMask & 0xFF00) >> 8); +} + +size_t TouchEvent::GetMaskedCount() +{ + return static_cast(GetFirstMaskedPointer() != INVALID_MASKED_POINTER) + + static_cast(GetSecondMaskedPointer() != INVALID_MASKED_POINTER); +} + +void TouchEvent::Swap() +{ + auto swapIndex = [](uint8_t index) -> uint8_t + { + if (index == INVALID_MASKED_POINTER) + return index; + + return index ^ 0x1; + }; + + swap(m_touches[0], m_touches[1]); + SetFirstMaskedPointer(swapIndex(GetFirstMaskedPointer())); + SetSecondMaskedPointer(swapIndex(GetSecondMaskedPointer())); +} + +UserEventStream::UserEventStream(TIsCountryLoaded const & fn) + : m_isCountryLoaded(fn) + , m_state(STATE_EMPTY) + , m_startDragOrg(m2::PointD::Zero()) +{ +} + +void UserEventStream::AddEvent(UserEvent const & event) +{ + lock_guard guard(m_lock); + UNUSED_VALUE(guard); + m_events.push_back(event); +} + +ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChange, bool & viewportChanged) +{ + modelViewChange = false; + viewportChanged = false; + + list events; + + { + lock_guard guard(m_lock); + UNUSED_VALUE(guard); + swap(m_events, events); + } + + modelViewChange = !events.empty() || m_state != STATE_EMPTY; + bool breakAnim = false; + for (UserEvent const & e : events) + { + switch (e.m_type) + { + case UserEvent::EVENT_SCALE: + breakAnim = SetScale(e.m_scaleEvent.m_pxPoint, e.m_scaleEvent.m_factor, e.m_scaleEvent.m_isAnim); + TouchCancel(m_touches); + break; + case UserEvent::EVENT_RESIZE: + m_navigator.OnSize(e.m_resize.m_width, e.m_resize.m_height); + viewportChanged = true; + breakAnim = true; + TouchCancel(m_touches); + break; + case UserEvent::EVENT_SET_ANY_RECT: + breakAnim = SetRect(e.m_anyRect.m_rect, e.m_anyRect.m_isAnim); + TouchCancel(m_touches); + break; + case UserEvent::EVENT_SET_RECT: + breakAnim = SetRect(e.m_rectEvent.m_rect, e.m_rectEvent.m_zoom, e.m_rectEvent.m_applyRotation, e.m_rectEvent.m_isAnim); + TouchCancel(m_touches); + break; + case UserEvent::EVENT_SET_CENTER: + breakAnim = SetCenter(e.m_centerEvent.m_center, e.m_centerEvent.m_zoom, e.m_centerEvent.m_isAnim); + TouchCancel(m_touches); + break; + case UserEvent::EVENT_TOUCH: + breakAnim = ProcessTouch(e.m_touchEvent); + break; + case UserEvent::EVENT_ROTATE: + { + m2::AnyRectD dstRect = GetTargetRect(); + dstRect.SetAngle(e.m_rotate.m_targetAzimut); + breakAnim = SetRect(dstRect, true); + } + break; + case UserEvent::EVENT_FOLLOW_AND_ROTATE: + breakAnim = SetFollowAndRotate(e.m_followAndRotate.m_userPos, e.m_followAndRotate.m_pixelZero, + e.m_followAndRotate.m_azimuth, e.m_followAndRotate.m_preferredZoomLevel, + e.m_followAndRotate.m_isAnim); + TouchCancel(m_touches); + break; + default: + ASSERT(false, ()); + break; + } + } + + if (breakAnim) + { + m_animation.reset(); + modelViewChange = true; + } + + if (m_animation != nullptr) + { + m2::AnyRectD rect = m_animation->GetCurrentRect(GetCurrentScreen()); + m_navigator.SetFromRect(rect); + modelViewChange = true; + if (m_animation->IsFinished()) + m_animation.reset(); + } + + if (GetValidTouchesCount(m_touches) == 1) + { + if (m_state == STATE_WAIT_DOUBLE_TAP) + DetectShortTap(m_touches[0]); + else if (m_state == STATE_TAP_DETECTION) + DetectLongTap(m_touches[0]); + } + + return m_navigator.Screen(); +} + +ScreenBase const & UserEventStream::GetCurrentScreen() const +{ + return m_navigator.Screen(); +} + +bool UserEventStream::SetScale(m2::PointD const & pxScaleCenter, double factor, bool isAnim) +{ + m2::PointD scaleCenter = pxScaleCenter; + if (m_listener) + m_listener->CorrectScalePoint(scaleCenter); + + if (isAnim) + { + // Reset current animation if there is any. + ResetCurrentAnimation(); + + m2::PointD glbScaleCenter = m_navigator.PtoG(scaleCenter); + if (m_listener) + m_listener->CorrectGlobalScalePoint(glbScaleCenter); + + ScreenBase screen = GetCurrentScreen(); + m_navigator.CalculateScale(scaleCenter, factor, screen); + m2::PointD offset = GetCurrentScreen().PixelRect().Center() - scaleCenter; + + auto const creator = [this, &glbScaleCenter, &offset](m2::AnyRectD const & startRect, m2::AnyRectD const & endRect, + double aDuration, double mDuration, double sDuration) + { + m_animation.reset(new ScaleAnimation(startRect, endRect, aDuration, mDuration, + sDuration, glbScaleCenter, offset)); + }; + + return SetRect(screen.GlobalRect(), true, creator); + } + + m_navigator.Scale(scaleCenter, factor); + return true; +} + +bool UserEventStream::SetCenter(m2::PointD const & center, int zoom, bool isAnim) +{ + if (zoom == -1) + { + m2::AnyRectD r = GetTargetRect(); + return SetRect(m2::AnyRectD(center, r.Angle(), r.GetLocalRect()), isAnim); + } + + return SetRect(df::GetRectForDrawScale(zoom, center), zoom, true, isAnim); +} + +bool UserEventStream::SetRect(m2::RectD rect, int zoom, bool applyRotation, bool isAnim) +{ + CheckMinGlobalRect(rect); + CheckMinMaxVisibleScale(m_isCountryLoaded, rect, zoom); + m2::AnyRectD targetRect = applyRotation ? ToRotated(m_navigator, rect) : m2::AnyRectD(rect); + return SetRect(targetRect, isAnim); +} + +bool UserEventStream::SetRect(m2::AnyRectD const & rect, bool isAnim) +{ + // Reset current animation if there is any. + ResetCurrentAnimation(); + + return SetRect(rect, isAnim, [this](m2::AnyRectD const & startRect, m2::AnyRectD const & endRect, + double aDuration, double mDuration, double sDuration) + { + m_animation.reset(new ModelViewAnimation(startRect, endRect, aDuration, mDuration, sDuration)); + }); +} + +bool UserEventStream::SetRect(m2::AnyRectD const & rect, bool isAnim, TAnimationCreator const & animCreator) +{ + if (isAnim) + { + ScreenBase const & screen = m_navigator.Screen(); + m2::AnyRectD const startRect = GetCurrentRect(); + double const angleDuration = ModelViewAnimation::GetRotateDuration(startRect.Angle().val(), rect.Angle().val()); + double const moveDuration = ModelViewAnimation::GetMoveDuration(startRect.GlobalZero(), rect.GlobalZero(), screen); + double const scaleDuration = ModelViewAnimation::GetScaleDuration(startRect.GetLocalRect().SizeX(), + rect.GetLocalRect().SizeX()); + if (max(max(angleDuration, moveDuration), scaleDuration) < kMaxAnimationTimeSec) + { + ASSERT(animCreator != nullptr, ()); + animCreator(startRect, rect, angleDuration, moveDuration, scaleDuration); + return false; + } + } + + m_animation.reset(); + m_navigator.SetFromRect(rect); + return true; +} + +bool UserEventStream::SetFollowAndRotate(m2::PointD const & userPos, m2::PointD const & pixelPos, + double azimuth, int preferredZoomLevel, bool isAnim) +{ + // Extract target local rect from current animation or calculate it from preferredZoomLevel + // to preserve final scale. + m2::RectD targetLocalRect; + if (preferredZoomLevel != -1) + { + ScreenBase newScreen = GetCurrentScreen(); + m2::RectD r = df::GetRectForDrawScale(preferredZoomLevel, m2::PointD::Zero()); + CheckMinGlobalRect(r); + CheckMinMaxVisibleScale(m_isCountryLoaded, r, preferredZoomLevel); + newScreen.SetFromRect(m2::AnyRectD(r)); + targetLocalRect = newScreen.GlobalRect().GetLocalRect(); + } + else + { + if (m_animation != nullptr) + targetLocalRect = m_animation->GetTargetRect(GetCurrentScreen()).GetLocalRect(); + else + targetLocalRect = GetCurrentRect().GetLocalRect(); + } + + if (isAnim) + { + // Reset current animation if there is any. + ResetCurrentAnimation(); + + ScreenBase const & screen = m_navigator.Screen(); + m2::PointD const newCenter = FollowAndRotateAnimation::CalculateCenter(screen, userPos, pixelPos, -azimuth); + + m2::AnyRectD const startRect = GetCurrentRect(); + double const angleDuration = ModelViewAnimation::GetRotateDuration(startRect.Angle().val(), -azimuth); + double const moveDuration = ModelViewAnimation::GetMoveDuration(startRect.GlobalZero(), newCenter, screen); + double const duration = max(angleDuration, moveDuration); + if (duration > 0.0 && duration < kMaxAnimationTimeSec) + { + m_animation.reset(new FollowAndRotateAnimation(startRect, targetLocalRect, userPos, + screen.GtoP(userPos), pixelPos, azimuth, duration)); + return false; + } + } + + m_animation.reset(); + m2::PointD const center = FollowAndRotateAnimation::CalculateCenter(m_navigator.Screen(), userPos, pixelPos, -azimuth); + m_navigator.SetFromRect(m2::AnyRectD(center, -azimuth, targetLocalRect)); + return true; +} + +void UserEventStream::ResetCurrentAnimation(bool finishAnimation) +{ + if (m_animation) + { + m2::AnyRectD const rect = finishAnimation ? m_animation->GetTargetRect(GetCurrentScreen()) : + m_animation->GetCurrentRect(GetCurrentScreen()); + m_navigator.SetFromRect(rect); + m_animation.reset(); + } +} + +m2::AnyRectD UserEventStream::GetCurrentRect() const +{ + return m_navigator.Screen().GlobalRect(); +} + +m2::AnyRectD UserEventStream::GetTargetRect() const +{ + if (m_animation) + return m_animation->GetTargetRect(GetCurrentScreen()); + else + return GetCurrentRect(); +} + +bool UserEventStream::ProcessTouch(TouchEvent const & touch) +{ + ASSERT(touch.m_touches[0].m_id != -1, ()); + + TouchEvent touchEvent = touch; + touchEvent.PrepareTouches(m_touches); + bool isMapTouch = false; + + switch (touchEvent.m_type) + { + case TouchEvent::TOUCH_DOWN: + isMapTouch = TouchDown(touchEvent.m_touches); + break; + case TouchEvent::TOUCH_MOVE: + isMapTouch = TouchMove(touchEvent.m_touches, touch.m_timeStamp); + break; + case TouchEvent::TOUCH_CANCEL: + isMapTouch = TouchCancel(touchEvent.m_touches); + break; + case TouchEvent::TOUCH_UP: + isMapTouch = TouchUp(touchEvent.m_touches); + break; + default: + ASSERT(false, ()); + break; + } + + return isMapTouch; +} + +bool UserEventStream::TouchDown(array const & touches) +{ + size_t touchCount = GetValidTouchesCount(touches); + bool isMapTouch = true; + + if (touchCount == 1) + { + if (!DetectDoubleTap(touches[0])) + { + if (m_state == STATE_EMPTY) + { + if (!TryBeginFilter(touches[0])) + { + BeginTapDetector(); + m_startDragOrg = touches[0].m_location; + } + else + { + isMapTouch = false; + } + } + } + } + else if (touchCount == 2) + { + switch (m_state) + { + case STATE_EMPTY: + BeginTwoFingersTap(touches[0], touches[1]); + break; + case STATE_FILTER: + CancelFilter(touches[0]); + BeginScale(touches[0], touches[1]); + break; + case STATE_TAP_DETECTION: + case STATE_WAIT_DOUBLE_TAP: + CancelTapDetector(); + BeginTwoFingersTap(touches[0], touches[1]); + break; + case STATE_DRAG: + isMapTouch = EndDrag(touches[0], true /* cancelled */); + BeginScale(touches[0], touches[1]); + break; + default: + break; + } + } + + UpdateTouches(touches); + return isMapTouch; +} + +bool UserEventStream::TouchMove(array const & touches, double timestamp) +{ + double const dragThreshold = my::sq(VisualParams::Instance().GetDragThreshold()); + size_t touchCount = GetValidTouchesCount(touches); + bool isMapTouch = true; + + switch (m_state) + { + case STATE_EMPTY: + if (touchCount == 1) + { + if (m_startDragOrg.SquareLength(touches[0].m_location) > dragThreshold) + BeginDrag(touches[0], timestamp); + else + isMapTouch = false; + } + else + { + BeginScale(touches[0], touches[1]); + } + break; + case STATE_TAP_TWO_FINGERS: + if (touchCount == 2) + { + float const threshold = static_cast(dragThreshold); + if (m_twoFingersTouches[0].SquareLength(touches[0].m_location) > threshold || + m_twoFingersTouches[1].SquareLength(touches[1].m_location) > threshold) + BeginScale(touches[0], touches[1]); + else + isMapTouch = false; + } + break; + case STATE_FILTER: + ASSERT_EQUAL(touchCount, 1, ()); + isMapTouch = false; + break; + case STATE_TAP_DETECTION: + case STATE_WAIT_DOUBLE_TAP: + ASSERT_EQUAL(touchCount, 1, ()); + if (m_startDragOrg.SquareLength(touches[0].m_location) > dragThreshold) + CancelTapDetector(); + else + isMapTouch = false; + break; + case STATE_DRAG: + ASSERT_EQUAL(touchCount, 1, ()); + Drag(touches[0], timestamp); + break; + case STATE_SCALE: + ASSERT_EQUAL(touchCount, 2, ()); + Scale(touches[0], touches[1]); + break; + default: + ASSERT(false, ()); + break; + } + + UpdateTouches(touches); + return isMapTouch; +} + +bool UserEventStream::TouchCancel(array const & touches) +{ + size_t touchCount = GetValidTouchesCount(touches); + bool isMapTouch = true; + switch (m_state) + { + case STATE_EMPTY: + case STATE_WAIT_DOUBLE_TAP: + case STATE_TAP_TWO_FINGERS: + isMapTouch = false; + break; + case STATE_FILTER: + ASSERT_EQUAL(touchCount, 1, ()); + CancelFilter(touches[0]); + break; + case STATE_TAP_DETECTION: + ASSERT_EQUAL(touchCount, 1, ()); + CancelTapDetector(); + isMapTouch = false; + break; + case STATE_DRAG: + ASSERT_EQUAL(touchCount, 1, ()); + isMapTouch = EndDrag(touches[0], true /* cancelled */); + break; + case STATE_SCALE: + ASSERT_EQUAL(touchCount, 2, ()); + EndScale(touches[0], touches[1]); + break; + default: + ASSERT(false, ()); + break; + } + UpdateTouches(touches); + return isMapTouch; +} + +bool UserEventStream::TouchUp(array const & touches) +{ + size_t touchCount = GetValidTouchesCount(touches); + bool isMapTouch = true; + switch (m_state) + { + case STATE_EMPTY: + isMapTouch = false; + // Can be if long tap or double tap detected + break; + case STATE_FILTER: + ASSERT_EQUAL(touchCount, 1, ()); + EndFilter(touches[0]); + isMapTouch = false; + break; + case STATE_TAP_DETECTION: + ASSERT_EQUAL(touchCount, 1, ()); + EndTapDetector(touches[0]); + break; + case STATE_TAP_TWO_FINGERS: + if (touchCount == 2) + { + EndTwoFingersTap(); + isMapTouch = true; + } + break; + case STATE_DRAG: + ASSERT_EQUAL(touchCount, 1, ()); + isMapTouch = EndDrag(touches[0], false /* cancelled */); + break; + case STATE_SCALE: + ASSERT_EQUAL(touchCount, 2, ()); + EndScale(touches[0], touches[1]); + break; + default: + ASSERT(false, ()); + break; + } + + UpdateTouches(touches); + return isMapTouch; +} + +void UserEventStream::UpdateTouches(array const & touches) +{ + m_touches = touches; +} + +void UserEventStream::BeginTwoFingersTap(Touch const & t1, Touch const & t2) +{ + TEST_CALL(TWO_FINGERS_TAP); + ASSERT_EQUAL(m_state, STATE_EMPTY, ()); + m_state = STATE_TAP_TWO_FINGERS; + m_twoFingersTouches[0] = t1.m_location; + m_twoFingersTouches[1] = t2.m_location; +} + +void UserEventStream::EndTwoFingersTap() +{ + ASSERT_EQUAL(m_state, STATE_TAP_TWO_FINGERS, ()); + m_state = STATE_EMPTY; + + if (m_listener) + m_listener->OnTwoFingersTap(); +} + +void UserEventStream::BeginDrag(Touch const & t, double timestamp) +{ + TEST_CALL(BEGIN_DRAG); + ASSERT_EQUAL(m_state, STATE_EMPTY, ()); + m_state = STATE_DRAG; + m_startDragOrg = m_navigator.Screen().GetOrg(); + if (m_listener) + m_listener->OnDragStarted(); + m_navigator.StartDrag(t.m_location); + + if (!m_scroller.IsActive()) + m_scroller.InitGrab(m_navigator.Screen(), timestamp); +} + +void UserEventStream::Drag(Touch const & t, double timestamp) +{ + TEST_CALL(DRAG); + ASSERT_EQUAL(m_state, STATE_DRAG, ()); + m_navigator.DoDrag(t.m_location); + + if (m_scroller.IsActive()) + m_scroller.GrabViewRect(m_navigator.Screen(), timestamp); +} + +bool UserEventStream::EndDrag(Touch const & t, bool cancelled) +{ + TEST_CALL(END_DRAG); + ASSERT_EQUAL(m_state, STATE_DRAG, ()); + m_state = STATE_EMPTY; + if (m_listener) + m_listener->OnDragEnded(m_navigator.GtoP(m_navigator.Screen().GetOrg()) - m_navigator.GtoP(m_startDragOrg)); + + m_startDragOrg = m2::PointD::Zero(); + m_navigator.StopDrag(t.m_location); + + if (cancelled) + { + m_scroller.CancelGrab(); + return true; + } + + if (m_kineticTimer.TimeElapsedAs().count() >= kKineticDelayMs) + { + m_animation = m_scroller.CreateKineticAnimation(m_navigator.Screen()); + m_scroller.CancelGrab(); + return false; + } + + return true; +} + +void UserEventStream::BeginScale(Touch const & t1, Touch const & t2) +{ + TEST_CALL(BEGIN_SCALE); + + if (m_state == STATE_SCALE) + { + Scale(t1, t2); + return; + } + + ASSERT(m_state == STATE_EMPTY || m_state == STATE_TAP_TWO_FINGERS, ()); + m_state = STATE_SCALE; + m2::PointD touch1 = t1.m_location; + m2::PointD touch2 = t2.m_location; + + if (m_listener) + { + m_listener->OnScaleStarted(); + m_listener->CorrectScalePoint(touch1, touch2); + } + + m_navigator.StartScale(touch1, touch2); +} + +void UserEventStream::Scale(Touch const & t1, Touch const & t2) +{ + TEST_CALL(SCALE); + ASSERT_EQUAL(m_state, STATE_SCALE, ()); + + m2::PointD touch1 = t1.m_location; + m2::PointD touch2 = t2.m_location; + + if (m_listener) + { + if (m_navigator.IsRotatingDuringScale()) + m_listener->OnRotated(); + + m_listener->CorrectScalePoint(touch1, touch2); + } + + m_navigator.DoScale(touch1, touch2); +} + +void UserEventStream::EndScale(const Touch & t1, const Touch & t2) +{ + TEST_CALL(END_SCALE); + ASSERT_EQUAL(m_state, STATE_SCALE, ()); + m_state = STATE_EMPTY; + + m2::PointD touch1 = t1.m_location; + m2::PointD touch2 = t2.m_location; + + if (m_listener) + { + m_listener->CorrectScalePoint(touch1, touch2); + m_listener->OnScaleEnded(); + } + + m_navigator.StopScale(touch1, touch2); + + m_kineticTimer.Reset(); +} + +void UserEventStream::BeginTapDetector() +{ + TEST_CALL(BEGIN_TAP_DETECTOR); + ASSERT_EQUAL(m_state, STATE_EMPTY, ()); + m_state = STATE_TAP_DETECTION; + m_touchTimer.Reset(); +} + +void UserEventStream::DetectShortTap(Touch const & touch) +{ + uint64_t const ms = m_touchTimer.TimeElapsedAs().count(); + if (ms > kDoubleTapPauseMs) + { + m_state = STATE_EMPTY; + if (m_listener) + m_listener->OnTap(touch.m_location, false); + } +} + +void UserEventStream::DetectLongTap(Touch const & touch) +{ + ASSERT_EQUAL(m_state, STATE_TAP_DETECTION, ()); + uint64_t const ms = m_touchTimer.TimeElapsedAs().count(); + if (ms > kLongTouchMs) + { + TEST_CALL(LONG_TAP_DETECTED); + m_state = STATE_EMPTY; + if (m_listener) + m_listener->OnTap(touch.m_location, true); + } +} + +bool UserEventStream::DetectDoubleTap(Touch const & touch) +{ + uint64_t const ms = m_touchTimer.TimeElapsedAs().count(); + if (m_state != STATE_WAIT_DOUBLE_TAP || ms > kDoubleTapPauseMs) + return false; + + m_state = STATE_EMPTY; + if (m_listener) + m_listener->OnDoubleTap(touch.m_location); + + return true; +} + +void UserEventStream::EndTapDetector(Touch const & touch) +{ + TEST_CALL(SHORT_TAP_DETECTED); + ASSERT_EQUAL(m_state, STATE_TAP_DETECTION, ()); + m_state = STATE_WAIT_DOUBLE_TAP; +} + +void UserEventStream::CancelTapDetector() +{ + TEST_CALL(CANCEL_TAP_DETECTOR); + ASSERT(m_state == STATE_TAP_DETECTION || m_state == STATE_WAIT_DOUBLE_TAP, ()); + m_state = STATE_EMPTY; +} + +bool UserEventStream::TryBeginFilter(Touch const & t) +{ + TEST_CALL(TRY_FILTER); + ASSERT_EQUAL(m_state, STATE_EMPTY, ()); + if (m_listener && m_listener->OnSingleTouchFiltrate(t.m_location, TouchEvent::TOUCH_DOWN)) + { + m_state = STATE_FILTER; + return true; + } + + return false; +} + +void UserEventStream::EndFilter(const Touch & t) +{ + TEST_CALL(END_FILTER); + ASSERT_EQUAL(m_state, STATE_FILTER, ()); + m_state = STATE_EMPTY; + if (m_listener) + m_listener->OnSingleTouchFiltrate(t.m_location, TouchEvent::TOUCH_UP); +} + +void UserEventStream::CancelFilter(Touch const & t) +{ + TEST_CALL(CANCEL_FILTER); + ASSERT_EQUAL(m_state, STATE_FILTER, ()); + m_state = STATE_EMPTY; + if (m_listener) + m_listener->OnSingleTouchFiltrate(t.m_location, TouchEvent::TOUCH_CANCEL); +} + +bool UserEventStream::IsInUserAction() const +{ + return m_state == STATE_DRAG || m_state == STATE_SCALE; +} + +bool UserEventStream::IsWaitingForActionCompletion() const +{ + return m_state != STATE_EMPTY; +} + +} diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp new file mode 100644 index 0000000000..541d84f2b1 --- /dev/null +++ b/drape_frontend/user_event_stream.hpp @@ -0,0 +1,332 @@ +#pragma once + +#include "drape_frontend/kinetic_scroller.hpp" +#include "drape_frontend/navigator.hpp" +#include "drape_frontend/animation/model_view_animation.hpp" + +#include "drape/pointers.hpp" + +#include "geometry/point2d.hpp" +#include "geometry/rect2d.hpp" +#include "geometry/any_rect2d.hpp" + +#include "base/timer.hpp" + +#include "std/array.hpp" +#include "std/bitset.hpp" +#include "std/function.hpp" +#include "std/mutex.hpp" +#include "std/list.hpp" + +namespace df +{ + +struct Touch +{ + m2::PointF m_location = m2::PointF::Zero(); + int64_t m_id = -1; // if id == -1 then touch is invalid +}; + +struct TouchEvent +{ + static uint8_t const INVALID_MASKED_POINTER; + + TouchEvent() + : m_type(TOUCH_CANCEL) + , m_timeStamp(my::Timer::LocalTime()) + , m_pointersMask(0xFFFF) + { + } + + enum ETouchType + { + TOUCH_DOWN, + TOUCH_MOVE, + TOUCH_UP, + TOUCH_CANCEL + }; + + ETouchType m_type; + array m_touches; // array of all touches + double m_timeStamp; // seconds + + void PrepareTouches(array const & previousToches); + + /// Methods for work with current touches + /// For example : user put down one finger. We will have one touch in m_touches + /// and GetFirstMaskedPointer return index of this pointer in m_touches (0 in this case) + /// Then user puts down the second finger. m_touches will have 2 valid elements, but new finger only one. + /// In this case GetFirstMaskedPointer returns index of new pointer. + /// If user put down both fingers simultaneously, then GetFirst and GetSecond + /// will return valid not equal INVALID_MASKED_POINTER + void SetFirstMaskedPointer(uint8_t firstMask); + uint8_t GetFirstMaskedPointer() const; + void SetSecondMaskedPointer(uint8_t secondMask); + uint8_t GetSecondMaskedPointer() const; + size_t GetMaskedCount(); + +private: + void Swap(); + uint16_t m_pointersMask; +}; + +struct ScaleEvent +{ + ScaleEvent(double factor, m2::PointD const & pxPoint, bool isAnim) + : m_factor(factor) + , m_pxPoint(pxPoint) + , m_isAnim(isAnim) + { + } + + double m_factor; + m2::PointD m_pxPoint; + bool m_isAnim; +}; + +struct SetCenterEvent +{ + SetCenterEvent(m2::PointD const & center, int zoom, bool isAnim) + : m_center(center) + , m_zoom(zoom) + , m_isAnim(isAnim) + { + } + + m2::PointD m_center; // center point in mercator + int m_zoom; // if zoom == -1, then zoom level will'n change + bool m_isAnim; +}; + +struct SetRectEvent +{ + SetRectEvent(m2::RectD const & rect, bool rotate, int zoom, bool isAnim) + : m_rect(rect) + , m_applyRotation(rotate) + , m_zoom(zoom) + , m_isAnim(isAnim) + { + } + + m2::RectD m_rect; // destination mercator rect + bool m_applyRotation; // if true, current rotation will be apply to m_rect + int m_zoom; // if zoom == -1, then zoom level will'n change + bool m_isAnim; +}; + +struct SetAnyRectEvent +{ + SetAnyRectEvent(m2::AnyRectD const & rect, bool isAnim) + : m_rect(rect) + , m_isAnim(isAnim) + {} + + m2::AnyRectD m_rect; // destination mercator rect + bool m_isAnim; +}; + +struct FollowAndRotateEvent +{ + FollowAndRotateEvent(m2::PointD const & userPos, m2::PointD const & pixelZero, + double azimuth, int preferredZoomLevel, bool isAnim) + : m_userPos(userPos) + , m_pixelZero(pixelZero) + , m_azimuth(azimuth) + , m_preferredZoomLevel(preferredZoomLevel) + , m_isAnim(isAnim) + {} + + m2::PointD m_userPos; + m2::PointD m_pixelZero; + double m_azimuth; + int m_preferredZoomLevel; + bool m_isAnim; +}; + +struct RotateEvent +{ + RotateEvent(double targetAzimut) : m_targetAzimut(targetAzimut) {} + + double m_targetAzimut; +}; + +struct ResizeEvent +{ + ResizeEvent(uint32_t w, uint32_t h) : m_width(w), m_height(h) {} + + uint32_t m_width; + uint32_t m_height; +}; + +struct UserEvent +{ + enum EEventType + { + EVENT_TOUCH, + EVENT_SCALE, + EVENT_SET_CENTER, + EVENT_SET_RECT, + EVENT_SET_ANY_RECT, + EVENT_RESIZE, + EVENT_ROTATE, + EVENT_FOLLOW_AND_ROTATE + }; + + UserEvent(TouchEvent const & e) : m_type(EVENT_TOUCH) { m_touchEvent = e; } + UserEvent(ScaleEvent const & e) : m_type(EVENT_SCALE) { m_scaleEvent = e; } + UserEvent(SetCenterEvent const & e) : m_type(EVENT_SET_CENTER) { m_centerEvent = e; } + UserEvent(SetRectEvent const & e) : m_type(EVENT_SET_RECT) { m_rectEvent = e; } + UserEvent(SetAnyRectEvent const & e) : m_type(EVENT_SET_ANY_RECT) { m_anyRect = e; } + UserEvent(ResizeEvent const & e) : m_type(EVENT_RESIZE) { m_resize = e; } + UserEvent(RotateEvent const & e) : m_type(EVENT_ROTATE) { m_rotate = e; } + UserEvent(FollowAndRotateEvent const & e) : m_type(EVENT_FOLLOW_AND_ROTATE) { m_followAndRotate = e; } + + EEventType m_type; + union + { + TouchEvent m_touchEvent; + ScaleEvent m_scaleEvent; + SetCenterEvent m_centerEvent; + SetRectEvent m_rectEvent; + SetAnyRectEvent m_anyRect; + ResizeEvent m_resize; + RotateEvent m_rotate; + FollowAndRotateEvent m_followAndRotate; + }; +}; + +class UserEventStream +{ +public: + class Listener + { + public: + virtual ~Listener() {} + + virtual void OnTap(m2::PointD const & pt, bool isLong) = 0; + virtual void OnDoubleTap(m2::PointD const & pt) = 0; + virtual void OnTwoFingersTap() = 0; + virtual bool OnSingleTouchFiltrate(m2::PointD const & pt, TouchEvent::ETouchType type) = 0; + virtual void OnDragStarted() = 0; + virtual void OnDragEnded(m2::PointD const & distance) = 0; + + virtual void OnScaleStarted() = 0; + virtual void OnRotated() = 0; + virtual void CorrectScalePoint(m2::PointD & pt) const = 0; + virtual void CorrectGlobalScalePoint(m2::PointD & pt) const = 0; + virtual void CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const = 0; + virtual void OnScaleEnded() = 0; + }; + + UserEventStream(TIsCountryLoaded const & fn); + void AddEvent(UserEvent const & event); + ScreenBase const & ProcessEvents(bool & modelViewChange, bool & viewportChanged); + ScreenBase const & GetCurrentScreen() const; + + m2::AnyRectD GetTargetRect() const; + bool IsInUserAction() const; + + bool IsWaitingForActionCompletion() const; + + void SetListener(ref_ptr listener) { m_listener = listener; } + +#ifdef DEBUG + static char const * BEGIN_DRAG; + static char const * DRAG; + static char const * END_DRAG; + static char const * BEGIN_SCALE; + static char const * SCALE; + static char const * END_SCALE; + static char const * BEGIN_TAP_DETECTOR; + static char const * LONG_TAP_DETECTED; + static char const * SHORT_TAP_DETECTED; + static char const * CANCEL_TAP_DETECTOR; + static char const * TRY_FILTER; + static char const * END_FILTER; + static char const * CANCEL_FILTER; + static char const * TWO_FINGERS_TAP; + + using TTestBridge = function; + void SetTestBridge(TTestBridge const & fn) { m_testFn = fn; } +#endif + +private: + using TAnimationCreator = function; + bool SetScale(m2::PointD const & pxScaleCenter, double factor, bool isAnim); + bool SetCenter(m2::PointD const & center, int zoom, bool isAnim); + bool SetRect(m2::RectD rect, int zoom, bool applyRotation, bool isAnim); + bool SetRect(m2::AnyRectD const & rect, bool isAnim); + bool SetRect(m2::AnyRectD const & rect, bool isAnim, TAnimationCreator const & animCreator); + bool SetFollowAndRotate(m2::PointD const & userPos, m2::PointD const & pixelPos, + double azimuth, int preferredZoomLevel, bool isAnim); + + m2::AnyRectD GetCurrentRect() const; + + bool ProcessTouch(TouchEvent const & touch); + + bool TouchDown(array const & touches); + bool TouchMove(array const & touches, double timestamp); + bool TouchCancel(array const & touches); + bool TouchUp(array const & touches); + void UpdateTouches(array const & touches); + + void BeginDrag(Touch const & t, double timestamp); + void Drag(Touch const & t, double timestamp); + // EndDrag returns false in case of kinetic moving after dragging has begun. + bool EndDrag(Touch const & t, bool cancelled); + + void BeginScale(Touch const & t1, Touch const & t2); + void Scale(Touch const & t1, Touch const & t2); + void EndScale(Touch const & t1, Touch const & t2); + + void BeginTapDetector(); + void DetectShortTap(Touch const & touch); + void DetectLongTap(Touch const & touch); + bool DetectDoubleTap(Touch const & touch); + void EndTapDetector(Touch const & touch); + void CancelTapDetector(); + + void BeginTwoFingersTap(Touch const & t1, Touch const & t2); + void EndTwoFingersTap(); + + bool TryBeginFilter(Touch const & t); + void EndFilter(Touch const & t); + void CancelFilter(Touch const & t); + + void ResetCurrentAnimation(bool finishAnimation = false); + +private: + TIsCountryLoaded m_isCountryLoaded; + + list m_events; + mutable mutex m_lock; + + Navigator m_navigator; + my::Timer m_touchTimer; + enum ERecognitionState + { + STATE_EMPTY, + STATE_FILTER, + STATE_TAP_DETECTION, + STATE_WAIT_DOUBLE_TAP, + STATE_TAP_TWO_FINGERS, + STATE_DRAG, + STATE_SCALE + } m_state; + + array m_touches; + + unique_ptr m_animation; + ref_ptr m_listener; + +#ifdef DEBUG + TTestBridge m_testFn; +#endif + m2::PointD m_startDragOrg; + array m_twoFingersTouches; + + KineticScroller m_scroller; + my::Timer m_kineticTimer; +}; + +} diff --git a/drape_frontend/user_mark_shapes.cpp b/drape_frontend/user_mark_shapes.cpp new file mode 100644 index 0000000000..a523f07a5b --- /dev/null +++ b/drape_frontend/user_mark_shapes.cpp @@ -0,0 +1,212 @@ +#include "user_mark_shapes.hpp" + +#include "line_shape.hpp" + +#include "drape/utils/vertex_decl.hpp" +#include "drape/shader_def.hpp" +#include "drape/attribute_provider.hpp" + +#include "geometry/spline.hpp" + +namespace df +{ + +namespace +{ + int const ZUserMarksLayer = -1; + int const YSearchMarksLayer = 1; + int const YApiMarksLayer = 2; + int const YBookmarksLayer = 3; + int const YDebugLayer = 4; +} + +TileKey GetSearchTileKey() +{ + return TileKey(0, YSearchMarksLayer, ZUserMarksLayer); +} + +TileKey GetApiTileKey() +{ + return TileKey(0, YApiMarksLayer, ZUserMarksLayer); +} + +TileKey GetDebugTileKey() +{ + return TileKey(0, YDebugLayer, ZUserMarksLayer); +} + +TileKey GetBookmarkTileKey(size_t categoryIndex) +{ + return TileKey(categoryIndex, YBookmarksLayer, ZUserMarksLayer); +} + +bool IsUserMarkLayer(TileKey const & tileKey) +{ + return tileKey.m_zoomLevel == ZUserMarksLayer; +} + +namespace +{ + +template +void AlignFormingNormals(TCreateVector const & fn, dp::Anchor anchor, + dp::Anchor first, dp::Anchor second, + glsl::vec2 & firstNormal, glsl::vec2 & secondNormal) +{ + firstNormal = fn(); + secondNormal = -firstNormal; + if ((anchor & second) != 0) + { + firstNormal *= 2; + secondNormal = glsl::vec2(0.0, 0.0); + } + else if ((anchor & first) != 0) + { + firstNormal = glsl::vec2(0.0, 0.0); + secondNormal *= 2; + } +} + +void AlignHorizontal(float halfWidth, dp::Anchor anchor, + glsl::vec2 & left, glsl::vec2 & right) +{ + AlignFormingNormals([&halfWidth]{ return glsl::vec2(-halfWidth, 0.0f); }, anchor, dp::Left, dp::Right, left, right); +} + +void AlignVertical(float halfHeight, dp::Anchor anchor, + glsl::vec2 & up, glsl::vec2 & down) +{ + AlignFormingNormals([&halfHeight]{ return glsl::vec2(0.0f, -halfHeight); }, anchor, dp::Top, dp::Bottom, up, down); +} + +struct UserPointVertex : gpu::BaseVertex +{ + UserPointVertex() = default; + UserPointVertex(TPosition const & pos, TNormal const & normal, TTexCoord const & texCoord, bool isAnim) + : m_position(pos) + , m_normal(normal) + , m_texCoord(texCoord) + , m_isAnim(isAnim ? 1.0 : -1.0) + { + } + + static dp::BindingInfo GetBinding() + { + dp::BindingInfo info(4); + uint8_t offset = 0; + offset += dp::FillDecl(0, "a_position", info, offset); + offset += dp::FillDecl(1, "a_normal", info, offset); + offset += dp::FillDecl(2, "a_colorTexCoords", info, offset); + offset += dp::FillDecl(3, "a_animate", info, offset); + + return info; + } + + TPosition m_position; + TNormal m_normal; + TTexCoord m_texCoord; + float m_isAnim; +}; + +using UPV = UserPointVertex; + +void CacheUserPoints(UserMarksProvider const * provider, + ref_ptr batcher, + ref_ptr textures) +{ + size_t markCount = provider->GetUserPointCount(); + if (markCount == 0) + return; + + uint32_t vertexCount = dp::Batcher::VertexPerQuad * markCount; // 4 vertex per quad + + buffer_vector buffer; + buffer.reserve(vertexCount); + + vector marks; + marks.reserve(markCount); + for (size_t i = 0; i < markCount; ++i) + marks.push_back(provider->GetUserPointMark(i)); + + sort(marks.begin(), marks.end(), [](UserPointMark const * v1, UserPointMark const * v2) + { + return v1->GetPivot().y < v2->GetPivot().y; + }); + + dp::TextureManager::SymbolRegion region; + for (size_t i = 0; i < marks.size(); ++i) + { + UserPointMark const * pointMark = marks[i]; + textures->GetSymbolRegion(pointMark->GetSymbolName(), region); + m2::RectF const & texRect = region.GetTexRect(); + m2::PointF pxSize = region.GetPixelSize(); + dp::Anchor anchor = pointMark->GetAnchor(); + glsl::vec3 pos = glsl::vec3(glsl::ToVec2(pointMark->GetPivot()), pointMark->GetDepth() + 10 * (markCount - i)); + bool runAnim = pointMark->RunCreationAnim(); + + glsl::vec2 left, right, up, down; + AlignHorizontal(pxSize.x * 0.5f, anchor, left, right); + AlignVertical(pxSize.y * 0.5f, anchor, up, down); + + m2::PointD const & pixelOffset = pointMark->GetPixelOffset(); + glsl::vec2 const offset(pixelOffset.x, pixelOffset.y); + + buffer.emplace_back(pos, left + down + offset, glsl::ToVec2(texRect.LeftTop()), runAnim); + buffer.emplace_back(pos, left + up + offset, glsl::ToVec2(texRect.LeftBottom()), runAnim); + buffer.emplace_back(pos, right + down + offset, glsl::ToVec2(texRect.RightTop()), runAnim); + buffer.emplace_back(pos, right + up + offset, glsl::ToVec2(texRect.RightBottom()), runAnim); + } + + dp::GLState state(gpu::BOOKMARK_PROGRAM, dp::GLState::UserMarkLayer); + state.SetColorTexture(region.GetTexture()); + + dp::AttributeProvider attribProvider(1, buffer.size()); + attribProvider.InitStream(0, UPV::GetBinding(), make_ref(buffer.data())); + + batcher->InsertListOfStrip(state, make_ref(&attribProvider), dp::Batcher::VertexPerQuad); +} + +void CacheUserLines(UserMarksProvider const * provider, + ref_ptr batcher, + ref_ptr textures) +{ + for (size_t i = 0; i < provider->GetUserLineCount(); ++i) + { + UserLineMark const * line = provider->GetUserLineMark(i); + size_t pointCount = line->GetPointCount(); + + vector points; + points.reserve(pointCount); + for (size_t i = 0; i < pointCount; ++i) + points.push_back(line->GetPoint(i)); + + m2::SharedSpline spline(points); + + for (size_t layerIndex = 0; layerIndex < line->GetLayerCount(); ++layerIndex) + { + LineViewParams params; + params.m_baseGtoPScale = 1.0f; + params.m_cap = dp::RoundCap; + params.m_join = dp::RoundJoin; + params.m_color = line->GetColor(layerIndex); + params.m_depth = line->GetLayerDepth(layerIndex); + params.m_width = line->GetWidth(layerIndex); + params.m_minVisibleScale = 1; + params.m_rank = 0; + + LineShape(spline, params).Draw(batcher, textures); + } + } +} + +} // namespace + +void CacheUserMarks(UserMarksProvider const * provider, + ref_ptr batcher, + ref_ptr textures) +{ + CacheUserPoints(provider, batcher, textures); + CacheUserLines(provider, batcher, textures); +} + +} // namespace df diff --git a/drape_frontend/user_mark_shapes.hpp b/drape_frontend/user_mark_shapes.hpp new file mode 100644 index 0000000000..361d6c86b3 --- /dev/null +++ b/drape_frontend/user_mark_shapes.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "tile_key.hpp" +#include "user_marks_provider.hpp" + +#include "drape/batcher.hpp" +#include "drape/texture_manager.hpp" + +#include "geometry/point2d.hpp" + +#include "std/function.hpp" + +namespace df +{ + TileKey GetSearchTileKey(); + TileKey GetApiTileKey(); + TileKey GetDebugTileKey(); + TileKey GetBookmarkTileKey(size_t categoryIndex); + bool IsUserMarkLayer(TileKey const & tileKey); + + void CacheUserMarks(UserMarksProvider const * provider, ref_ptr batcher, + ref_ptr textures); +} // namespace df diff --git a/drape_frontend/user_marks_provider.cpp b/drape_frontend/user_marks_provider.cpp new file mode 100644 index 0000000000..5cb7ab74ab --- /dev/null +++ b/drape_frontend/user_marks_provider.cpp @@ -0,0 +1,76 @@ +#include "user_marks_provider.hpp" + +df::UserMarksProvider::UserMarksProvider() + : m_pendingOnDelete(false) + , m_counter(0) +{ +} + +void df::UserMarksProvider::BeginRead() +{ + Lock(); +} + +bool df::UserMarksProvider::IsDirty() const +{ + return m_isDirty; +} + +void df::UserMarksProvider::EndRead() +{ + m_isDirty = false; + Unlock(); +} + +void df::UserMarksProvider::IncrementCounter() +{ + ASSERT(m_pendingOnDelete == false, ()); + ++m_counter; +} + +void df::UserMarksProvider::DecrementCounter() +{ + ASSERT(m_counter > 0, ()); + --m_counter; +} + +bool df::UserMarksProvider::IsPendingOnDelete() +{ + return m_pendingOnDelete; +} + +void df::UserMarksProvider::DeleteLater() +{ + ASSERT(m_pendingOnDelete == false, ()); + m_pendingOnDelete = true; +} + +bool df::UserMarksProvider::CanBeDeleted() +{ + return m_counter == 0; +} + +void df::UserMarksProvider::BeginWrite() +{ + Lock(); +} + +void df::UserMarksProvider::SetDirty() +{ + m_isDirty = true; +} + +void df::UserMarksProvider::EndWrite() +{ + Unlock(); +} + +void df::UserMarksProvider::Lock() +{ + m_mutex.Lock(); +} + +void df::UserMarksProvider::Unlock() +{ + m_mutex.Unlock(); +} diff --git a/drape_frontend/user_marks_provider.hpp b/drape_frontend/user_marks_provider.hpp new file mode 100644 index 0000000000..a775051bb8 --- /dev/null +++ b/drape_frontend/user_marks_provider.hpp @@ -0,0 +1,83 @@ +#pragma once + +#include "drape/drape_global.hpp" + +#include "geometry/point2d.hpp" + +#include "base/mutex.hpp" + +#include "std/atomic.hpp" + +namespace df +{ + +class UserPointMark +{ +public: + virtual ~UserPointMark() {} + virtual m2::PointD const & GetPivot() const = 0; + virtual m2::PointD const & GetPixelOffset() const = 0; + virtual string GetSymbolName() const = 0; + virtual dp::Anchor GetAnchor() const = 0; + virtual float GetDepth() const = 0; + virtual bool RunCreationAnim() const = 0; +}; + +class UserLineMark +{ +public: + virtual ~UserLineMark() {} + + virtual size_t GetLayerCount() const = 0; + virtual dp::Color const & GetColor(size_t layerIndex) const = 0; + virtual float GetWidth(size_t layerIndex) const = 0; + virtual float GetLayerDepth(size_t layerIndex) const = 0; + + /// Line geometry enumeration + virtual size_t GetPointCount() const = 0; + virtual m2::PointD const & GetPoint(size_t pointIndex) const = 0; +}; + +class UserMarksProvider +{ +public: + UserMarksProvider(); + virtual ~UserMarksProvider() {} + + void BeginRead(); + + bool IsDirty() const; + virtual bool IsDrawable() const = 0; + + virtual size_t GetUserPointCount() const = 0; + /// never store UserPointMark reference + virtual UserPointMark const * GetUserPointMark(size_t index) const = 0; + + virtual size_t GetUserLineCount() const = 0; + /// never store UserLineMark reference + virtual UserLineMark const * GetUserLineMark(size_t index) const = 0; + + void EndRead(); + + void IncrementCounter(); + void DecrementCounter(); + bool CanBeDeleted(); + bool IsPendingOnDelete(); + void DeleteLater(); + +protected: + void BeginWrite(); + void SetDirty(); + void EndWrite(); + +private: + void Lock(); + void Unlock(); + + threads::Mutex m_mutex; + bool m_isDirty = false; + atomic m_pendingOnDelete; + atomic m_counter; +}; + +} // namespace df diff --git a/drape_frontend/viewport.cpp b/drape_frontend/viewport.cpp index c369dd71e7..b8a3a9593c 100644 --- a/drape_frontend/viewport.cpp +++ b/drape_frontend/viewport.cpp @@ -4,11 +4,9 @@ namespace df { -Viewport::Viewport(float pixelRatio, - uint32_t x0, uint32_t y0, +Viewport::Viewport(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h) - : m_pixelRatio(pixelRatio) - , m_zero(x0, y0) + : m_zero(x0, y0) , m_size(w, h) { } @@ -19,49 +17,24 @@ void Viewport::SetViewport(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h) m_size = m2::PointU(w, h); } -uint32_t Viewport::GetLogicX0() const +uint32_t Viewport::GetX0() const { return m_zero.x; } -uint32_t Viewport::GetLogicY0() const +uint32_t Viewport::GetY0() const { return m_zero.y; } -uint32_t Viewport::GetLogicWidth() const +uint32_t Viewport::GetWidth() const { return m_size.x; } -uint32_t Viewport::GetLogicHeight() const -{ - return m_size.y; -} - -uint32_t Viewport::GetX0() const -{ - return GetLogicX0() * m_pixelRatio; -} - -uint32_t Viewport::GetY0() const -{ - return GetLogicY0() * m_pixelRatio; -} - -uint32_t Viewport::GetWidth() const -{ - return GetLogicWidth() * m_pixelRatio; -} - uint32_t Viewport::GetHeight() const { - return GetLogicHeight() * m_pixelRatio; -} - -float Viewport::GetPixelRatio() const -{ - return m_pixelRatio; + return m_size.y; } void Viewport::Apply() const diff --git a/drape_frontend/viewport.hpp b/drape_frontend/viewport.hpp index e2d5ae0366..d867b8157c 100644 --- a/drape_frontend/viewport.hpp +++ b/drape_frontend/viewport.hpp @@ -12,29 +12,24 @@ class Viewport { public: // x0, y0, w, h is device-independent pixels - Viewport(float pixelRatio, - uint32_t x0, uint32_t y0, + Viewport(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h); - ///@{ Device-independent pixels + ///@{ in surface pixels + /// on iOS we must mul this on scaleFactor + /// on android we get true size from surface void SetViewport(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h); - uint32_t GetLogicX0() const; - uint32_t GetLogicY0() const; - uint32_t GetLogicWidth() const; - uint32_t GetLogicHeight() const; - ///@} uint32_t GetX0() const; uint32_t GetY0() const; uint32_t GetWidth() const; uint32_t GetHeight() const; - float GetPixelRatio() const; + ///@} // Apply viewport to graphics pipeline // with convert start poin and size to physical pixels void Apply() const; private: - float m_pixelRatio; m2::PointU m_zero; m2::PointU m_size; }; diff --git a/drape_frontend/visual_params.cpp b/drape_frontend/visual_params.cpp index 9e4b19cb1d..f043ed0a15 100644 --- a/drape_frontend/visual_params.cpp +++ b/drape_frontend/visual_params.cpp @@ -21,21 +21,6 @@ static VisualParams g_VizParams; typedef pair visual_scale_t; -struct VisualScaleFinder -{ - VisualScaleFinder(double vs) - : m_vs(vs) - { - } - - bool operator()(visual_scale_t const & node) - { - return my::AlmostEqualULPs(node.second, m_vs); - } - - double m_vs; -}; - } // namespace #ifdef DEBUG @@ -54,16 +39,28 @@ void VisualParams::Init(double vs, uint32_t tileSize, vector const & a g_VizParams.m_visualScale = vs; if (find(additionalOptions.begin(), additionalOptions.end(), YotaDevice) != additionalOptions.end()) g_VizParams.m_isYotaDevice = true; + + // Here we set up glyphs rendering parameters separately for high-res and low-res screens. + if (vs <= 1.0) + g_VizParams.m_glyphVisualParams = { 0.48f, 0.08f, 0.05f, 0.01f }; + else + g_VizParams.m_glyphVisualParams = { 0.5f, 0.05f, 0.05f, 0.01f }; + RISE_INITED; } +uint32_t VisualParams::GetGlyphSdfScale() const +{ + return (m_visualScale <= 1.0) ? 3 : 4; +} + VisualParams & VisualParams::Instance() { ASSERT_INITED; return g_VizParams; } -string const & VisualParams::GetResourcePostfix() const +string const & VisualParams::GetResourcePostfix(double visualScale, bool isYotaDevice) { static visual_scale_t postfixes[] = { @@ -80,12 +77,29 @@ string const & VisualParams::GetResourcePostfix() const "yota" }; - if (m_isYotaDevice) + if (isYotaDevice) return specifixPostfixes[0]; - visual_scale_t * finded = find_if(postfixes, postfixes + ARRAY_SIZE(postfixes), VisualScaleFinder(m_visualScale)); - ASSERT(finded < postfixes + ARRAY_SIZE(postfixes), ()); - return finded->first; + // Looking for the nearest available scale. + int postfixIndex = -1; + double minValue = numeric_limits::max(); + for (int i = 0; i < ARRAY_SIZE(postfixes); i++) + { + double val = fabs(postfixes[i].second - visualScale); + if (val < minValue) + { + minValue = val; + postfixIndex = i; + } + } + + ASSERT_GREATER_OR_EQUAL(postfixIndex, 0, ()); + return postfixes[postfixIndex].first; +} + +string const & VisualParams::GetResourcePostfix() const +{ + return VisualParams::GetResourcePostfix(m_visualScale, m_isYotaDevice); } double VisualParams::GetVisualScale() const @@ -98,6 +112,29 @@ uint32_t VisualParams::GetTileSize() const return m_tileSize; } +uint32_t VisualParams::GetTouchRectRadius() const +{ + float const kRadiusInPixels = 20.0f; + return kRadiusInPixels * GetVisualScale(); +} + +double VisualParams::GetDragThreshold() const +{ + double const kDragThresholdInPixels = 10.0; + return kDragThresholdInPixels * GetVisualScale(); +} + +double VisualParams::GetScaleThreshold() const +{ + double const kScaleThresholdInPixels = 2.0; + return kScaleThresholdInPixels * GetVisualScale(); +} + +VisualParams::GlyphVisualParams const & VisualParams::GetGlyphVisualParams() const +{ + return m_glyphVisualParams; +} + VisualParams::VisualParams() : m_tileSize(0) , m_visualScale(0.0) @@ -110,13 +147,13 @@ m2::RectD const & GetWorldRect() return worldRect; } -int GetTileScaleBase(ScreenBase const & s) +int GetTileScaleBase(ScreenBase const & s, uint32_t tileSize) { ScreenBase tmpS = s; tmpS.Rotate(-tmpS.GetAngle()); // slightly smaller than original to produce "antialiasing" effect using bilinear filtration. - int const halfSize = static_cast(VisualParams::Instance().GetTileSize() / 1.05 / 2.0); + int const halfSize = static_cast(tileSize / 1.05 / 2.0); m2::RectD glbRect; m2::PointD const pxCenter = tmpS.PixelRect().Center(); @@ -127,22 +164,32 @@ int GetTileScaleBase(ScreenBase const & s) return GetTileScaleBase(glbRect); } +int GetTileScaleBase(ScreenBase const & s) +{ + return GetTileScaleBase(s, VisualParams::Instance().GetTileSize()); +} + int GetTileScaleBase(m2::RectD const & r) { double const sz = max(r.SizeX(), r.SizeY()); return max(1, my::rounds(log((MercatorBounds::maxX - MercatorBounds::minX) / sz) / log(2.0))); } +int GetTileScaleIncrement(uint32_t tileSize, double visualScale) +{ + return log(tileSize / 256.0 / visualScale) / log(2.0); +} + int GetTileScaleIncrement() { VisualParams const & p = VisualParams::Instance(); - return log(p.GetTileSize() / 256.0 / p.GetVisualScale()) / log(2.0); + return GetTileScaleIncrement(p.GetTileSize(), p.GetVisualScale()); } -m2::RectD GetRectForDrawScale(int drawScale, m2::PointD const & center) +m2::RectD GetRectForDrawScale(int drawScale, m2::PointD const & center, uint32_t tileSize, double visualScale) { // +1 - we will calculate half length for each side - double const factor = 1 << (max(1, drawScale - GetTileScaleIncrement()) + 1); + double const factor = 1 << (max(1, drawScale - GetTileScaleIncrement(tileSize, visualScale)) + 1); double const len = (MercatorBounds::maxX - MercatorBounds::minX) / factor; @@ -152,6 +199,17 @@ m2::RectD GetRectForDrawScale(int drawScale, m2::PointD const & center) MercatorBounds::ClampY(center.y + len)); } +m2::RectD GetRectForDrawScale(int drawScale, m2::PointD const & center) +{ + VisualParams const & p = VisualParams::Instance(); + return GetRectForDrawScale(drawScale, center, p.GetTileSize(), p.GetVisualScale()); +} + +m2::RectD GetRectForDrawScale(double drawScale, m2::PointD const & center, uint32_t tileSize, double visualScale) +{ + return GetRectForDrawScale(my::rounds(drawScale), center, tileSize, visualScale); +} + m2::RectD GetRectForDrawScale(double drawScale, m2::PointD const & center) { return GetRectForDrawScale(my::rounds(drawScale), center); @@ -186,19 +244,37 @@ int CalculateTileSize(int screenWidth, int screenHeight) #endif } +int GetDrawTileScale(int baseScale, uint32_t tileSize, double visualScale) +{ + return max(1, baseScale + GetTileScaleIncrement(tileSize, visualScale)); +} + +int GetDrawTileScale(ScreenBase const & s, uint32_t tileSize, double visualScale) +{ + return GetDrawTileScale(GetTileScaleBase(s, tileSize), tileSize, visualScale); +} + +int GetDrawTileScale(m2::RectD const & r, uint32_t tileSize, double visualScale) +{ + return GetDrawTileScale(GetTileScaleBase(r), tileSize, visualScale); +} + int GetDrawTileScale(int baseScale) { - return max(1, baseScale + GetTileScaleIncrement()); + VisualParams const & p = VisualParams::Instance(); + return GetDrawTileScale(baseScale, p.GetTileSize(), p.GetVisualScale()); } int GetDrawTileScale(ScreenBase const & s) { - return GetDrawTileScale(GetTileScaleBase(s)); + VisualParams const & p = VisualParams::Instance(); + return GetDrawTileScale(s, p.GetTileSize(), p.GetVisualScale()); } int GetDrawTileScale(m2::RectD const & r) { - return GetDrawTileScale(GetTileScaleBase(r)); + VisualParams const & p = VisualParams::Instance(); + return GetDrawTileScale(r, p.GetTileSize(), p.GetVisualScale()); } } // namespace df diff --git a/drape_frontend/visual_params.hpp b/drape_frontend/visual_params.hpp index eb8343c59a..4a1366775d 100644 --- a/drape_frontend/visual_params.hpp +++ b/drape_frontend/visual_params.hpp @@ -20,29 +20,56 @@ public: VisualParams(); + static string const & GetResourcePostfix(double visualScale, bool isYotaDevice = false); string const & GetResourcePostfix() const; + double GetVisualScale() const; uint32_t GetTileSize() const; + /// How many pixels around touch point are used to get bookmark or POI in consideration of visual scale. + uint32_t GetTouchRectRadius() const; + + double GetDragThreshold() const; + double GetScaleThreshold() const; + + struct GlyphVisualParams + { + float m_contrast; + float m_gamma; + float m_outlineContrast; + float m_outlineGamma; + }; + + GlyphVisualParams const & GetGlyphVisualParams() const; + uint32_t GetGlyphSdfScale() const; + private: int m_tileSize; double m_visualScale; bool m_isYotaDevice; + GlyphVisualParams m_glyphVisualParams; }; m2::RectD const & GetWorldRect(); +int GetTileScaleBase(ScreenBase const & s, uint32_t tileSize); int GetTileScaleBase(ScreenBase const & s); int GetTileScaleBase(m2::RectD const & r); /// @return Adjusting base tile scale to look the same across devices with different /// tile size and visual scale values. +int GetTileScaleIncrement(uint32_t tileSize, double visualScale); int GetTileScaleIncrement(); +int GetDrawTileScale(int baseScale, uint32_t tileSize, double visualScale); +int GetDrawTileScale(ScreenBase const & s, uint32_t tileSize, double visualScale); +int GetDrawTileScale(m2::RectD const & r, uint32_t tileSize, double visualScale); int GetDrawTileScale(int baseScale); int GetDrawTileScale(ScreenBase const & s); int GetDrawTileScale(m2::RectD const & r); +m2::RectD GetRectForDrawScale(int drawScale, m2::PointD const & center, uint32_t tileSize, double visualScale); +m2::RectD GetRectForDrawScale(double drawScale, m2::PointD const & center, uint32_t tileSize, double visualScale); m2::RectD GetRectForDrawScale(int drawScale, m2::PointD const & center); m2::RectD GetRectForDrawScale(double drawScale, m2::PointD const & center); diff --git a/drape_frontend/watch/agg_curves.cpp b/drape_frontend/watch/agg_curves.cpp new file mode 100644 index 0000000000..26c83ae853 --- /dev/null +++ b/drape_frontend/watch/agg_curves.cpp @@ -0,0 +1,610 @@ +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.4 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- + +#include +#include <3party/agg/agg_curves.h> +#include <3party/agg/agg_math.h> + +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 }; + + + + //------------------------------------------------------------------------ + void curve3_inc::approximation_scale(double s) + { + m_scale = s; + } + + //------------------------------------------------------------------------ + 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) + { + 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_num_steps = 4; + } + + 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) + { + 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)) + { + // 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; + } + } + } + else + { + // Collinear case + //------------------ + da = dx*dx + dy*dy; + if(da == 0) + { + 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; + } + } + + // 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; + } + + //------------------------------------------------------------------------ +// static double MSC60_fix_ICE(double v) { return v; } + + //------------------------------------------------------------------------ + 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) + { + 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; + } + + 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 + //---------------------- + 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); + + 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; + + 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; + } + + // 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/drape_frontend/watch/area_info.hpp b/drape_frontend/watch/area_info.hpp new file mode 100644 index 0000000000..1d54564bb4 --- /dev/null +++ b/drape_frontend/watch/area_info.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include "geometry/point2d.hpp" + +#include "std/vector.hpp" +#include "std/algorithm.hpp" + +namespace df +{ +namespace watch +{ + +class AreaInfo +{ + m2::PointD m_center; + +public: + vector m_path; + + void reserve(size_t ptsCount) + { + m_path.reserve(ptsCount); + } + + void swap(AreaInfo & r) + { + m_path.swap(r.m_path); + std::swap(m_center, r.m_center); + } + + void push_back(m2::PointD const & pt) + { + m_path.push_back(pt); + } + + size_t size() const { return m_path.size(); } + + void SetCenter(m2::PointD const & p) { m_center = p; } + m2::PointD GetCenter() const { return m_center; } +}; + +} +} + +inline void swap(df::watch::AreaInfo & p1, df::watch::AreaInfo & p2) +{ + p1.swap(p2); +} diff --git a/drape_frontend/watch/brush_info.hpp b/drape_frontend/watch/brush_info.hpp new file mode 100644 index 0000000000..a87e7dcd14 --- /dev/null +++ b/drape_frontend/watch/brush_info.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "drape/drape_global.hpp" + +namespace df +{ +namespace watch +{ + +struct BrushInfo +{ + dp::Color m_color; + + BrushInfo() = default; + explicit BrushInfo(dp::Color const & color) : m_color(color) {} +}; + +} +} diff --git a/drape_frontend/watch/circle_info.hpp b/drape_frontend/watch/circle_info.hpp new file mode 100644 index 0000000000..11a5c861a7 --- /dev/null +++ b/drape_frontend/watch/circle_info.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include "drape/drape_global.hpp" + +namespace df +{ +namespace watch +{ + +struct CircleInfo +{ + unsigned m_radius; + dp::Color m_color; + bool m_isOutlined; + unsigned m_outlineWidth; + dp::Color m_outlineColor; + + CircleInfo() = default; + CircleInfo(double radius, + dp::Color const & color = dp::Color(0, 0, 0, 255), + bool isOutlined = false, + double outlineWidth = 1, + dp::Color const & outlineColor = dp::Color(255, 255, 255, 255)) + : m_radius(my::rounds(radius)) + , m_color(color) + , m_isOutlined(isOutlined) + , m_outlineWidth(my::rounds(outlineWidth)) + , m_outlineColor(outlineColor) + { + if (!m_isOutlined) + { + m_outlineWidth = 0; + m_outlineColor = dp::Color(0, 0, 0, 0); + } + } +}; + +} +} diff --git a/render/cpu_drawer.cpp b/drape_frontend/watch/cpu_drawer.cpp similarity index 58% rename from render/cpu_drawer.cpp rename to drape_frontend/watch/cpu_drawer.cpp index 54fd15f6f9..6c01180838 100644 --- a/render/cpu_drawer.cpp +++ b/drape_frontend/watch/cpu_drawer.cpp @@ -1,10 +1,15 @@ -#include "cpu_drawer.hpp" -#include "proto_to_styles.hpp" +#include "drape_frontend/watch/cpu_drawer.hpp" +#include "drape_frontend/watch/proto_to_styles.hpp" +#include "drape_frontend/watch/software_renderer.hpp" +#include "drape_frontend/navigator.hpp" +#include "drape_frontend/visual_params.hpp" +#include "geometry/angles.hpp" #include "geometry/tree4d.hpp" #include "geometry/transformations.hpp" -#include "graphics/text_path.hpp" +#include "indexer/scales.hpp" +#include "indexer/drules_include.hpp" #include "base/macros.hpp" #include "base/logging.hpp" @@ -15,7 +20,7 @@ namespace { -void CorrectFont(graphics::FontDesc & font) +void CorrectFont(dp::FontDecl & font) { font.m_size = font.m_size * 0.75; } @@ -23,7 +28,7 @@ void CorrectFont(graphics::FontDesc & font) strings::UniString PreProcessText(string const & text) { strings::UniString logText = strings::MakeUniString(text); - strings::UniString visText = graphics::GlyphCache::log2vis(logText); + strings::UniString visText = df::watch::GlyphCache::log2vis(logText); char const * delims = " \n\t"; if (logText != visText) @@ -90,6 +95,11 @@ TInfo const & GetInfo(FeatureID const & id, map & m) } +namespace df +{ +namespace watch +{ + class CPUDrawer::CPUOverlayTree { struct OverlayWrapperTraits @@ -166,13 +176,21 @@ private: }; CPUDrawer::CPUDrawer(Params const & params) - : TBase(params) - , m_renderer(new SoftwareRenderer(params.m_glyphCacheParams, params.m_density)) - , m_generationCounter(0) + : m_generationCounter(0) + , m_visualScale(params.m_visualScale) +{ + auto glyphParams = GlyphCache::Params("unicode_blocks.txt", + "fonts_whitelist.txt", + "fonts_blacklist.txt", + 2 * 1024 * 1024, m_visualScale, false); + m_renderer = make_unique(glyphParams, params.m_resourcesPrefix); +} + +CPUDrawer::~CPUDrawer() { } -void CPUDrawer::BeginFrame(uint32_t width, uint32_t height, graphics::Color const & bgColor) +void CPUDrawer::BeginFrame(uint32_t width, uint32_t height, dp::Color const & bgColor) { m_renderer->BeginFrame(width, height, bgColor); } @@ -184,14 +202,12 @@ void CPUDrawer::Flush() void CPUDrawer::DrawMyPosition(m2::PointD const & myPxPotision) { - m_renderer->DrawSymbol(myPxPotision, graphics::EPosCenter, - graphics::Icon::Info("watch-my-position")); + m_renderer->DrawSymbol(myPxPotision, dp::Center, IconInfo("watch-my-position")); } void CPUDrawer::DrawSearchResult(m2::PointD const & pxPosition) { - m_renderer->DrawSymbol(pxPosition, graphics::EPosAbove, - graphics::Icon::Info("watch-search-result")); + m_renderer->DrawSymbol(pxPosition, dp::Top, IconInfo("watch-search-result")); } void CPUDrawer::DrawSearchArrow(double azimut) @@ -306,12 +322,12 @@ void CPUDrawer::EndFrame(FrameImage & image) m_overlayList.clear(); } -void CPUDrawer::DrawSymbol(m2::PointD const & pt, graphics::EPosition pos, di::DrawRule const & rule) +void CPUDrawer::DrawSymbol(m2::PointD const & pt, dp::Anchor pos, DrawRule const & rule) { m_pointShapes.emplace_back(pt, pos, TYPE_SYMBOL, rule, GetGeneration()); OverlayWrapper & overlay = AddOverlay(&m_pointShapes.back()); - graphics::Icon::Info icon; + IconInfo icon; ConvertStyle(overlay.m_rules[0]->m_drawRule.m_rule->GetSymbol(), icon); m2::RectD rect; @@ -319,21 +335,21 @@ void CPUDrawer::DrawSymbol(m2::PointD const & pt, graphics::EPosition pos, di::D overlay.m_rects.push_back(rect); } -void CPUDrawer::DrawCircle(m2::PointD const & pt, graphics::EPosition pos, di::DrawRule const & rule) +void CPUDrawer::DrawCircle(m2::PointD const & pt, dp::Anchor pos, DrawRule const & rule) { m_pointShapes.emplace_back(pt, pos, TYPE_CIRCLE, rule, GetGeneration()); OverlayWrapper & overlay = AddOverlay(&m_pointShapes.back()); - graphics::Circle::Info info; - ConvertStyle(overlay.m_rules[0]->m_drawRule.m_rule->GetCircle(), VisualScale(), info); + CircleInfo info; + ConvertStyle(overlay.m_rules[0]->m_drawRule.m_rule->GetCircle(), m_visualScale, info); m2::RectD rect; m_renderer->CalculateCircleMetric(pt, pos, info, rect); overlay.m_rects.push_back(rect); } -void CPUDrawer::DrawCircledSymbol(m2::PointD const & pt, graphics::EPosition pos, - di::DrawRule const & symbolRule, di::DrawRule const & circleRule) +void CPUDrawer::DrawCircledSymbol(m2::PointD const & pt, dp::Anchor pos, + DrawRule const & symbolRule, DrawRule const & circleRule) { m_pointShapes.emplace_back(pt, pos, TYPE_CIRCLE, circleRule, GetGeneration()); BaseShape const * circleShape = &m_pointShapes.back(); @@ -344,39 +360,39 @@ void CPUDrawer::DrawCircledSymbol(m2::PointD const & pt, graphics::EPosition pos m2::RectD rect; - graphics::Circle::Info circleInfo; - ConvertStyle(overlay.m_rules[0]->m_drawRule.m_rule->GetCircle(), VisualScale(), circleInfo); + CircleInfo circleInfo; + ConvertStyle(overlay.m_rules[0]->m_drawRule.m_rule->GetCircle(), m_visualScale, circleInfo); m_renderer->CalculateCircleMetric(pt, pos, circleInfo, rect); overlay.m_rects.push_back(rect); - graphics::Icon::Info symbolInfo; + IconInfo symbolInfo; ConvertStyle(overlay.m_rules[1]->m_drawRule.m_rule->GetSymbol(), symbolInfo); m_renderer->CalculateSymbolMetric(pt, pos, symbolInfo, rect); overlay.m_rects.back().Add(rect); } -void CPUDrawer::DrawPath(di::PathInfo const & path, di::DrawRule const * rules, size_t count) +void CPUDrawer::DrawPath(PathInfo const & path, DrawRule const * rules, size_t count) { FeatureID const & id = Insert(path); for (size_t i = 0; i < count; ++i) m_areaPathShapes.emplace_back(id, rules[i], GetGeneration(), TYPE_PATH); } -void CPUDrawer::DrawArea(di::AreaInfo const & area, di::DrawRule const & rule) +void CPUDrawer::DrawArea(AreaInfo const & area, DrawRule const & rule) { m_areaPathShapes.emplace_back(Insert(area), rule, GetGeneration(), TYPE_AREA); } -void CPUDrawer::DrawText(m2::PointD const & pt, graphics::EPosition pos, - di::FeatureStyler const & fs, di::DrawRule const & rule) +void CPUDrawer::DrawText(m2::PointD const & pt, dp::Anchor pos, + FeatureStyler const & fs, DrawRule const & rule) { m_textShapes.emplace_back(pt, pos, Insert(fs), rule, GetGeneration(), TYPE_TEXT); TextShape const * shape = &m_textShapes.back(); OverlayWrapper & overlay = AddOverlay(shape); - TTextRendererCall callback = [this, &overlay](m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & primFont, - graphics::FontDesc const & secFont, + TTextRendererCall callback = [this, &overlay](m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & primFont, + dp::FontDecl const & secFont, strings::UniString const & primText, strings::UniString const & secText) { @@ -391,7 +407,7 @@ void CPUDrawer::DrawText(m2::PointD const & pt, graphics::EPosition pos, CallTextRendererFn(shape, callback); } -void CPUDrawer::DrawPathText(di::PathInfo const & info, di::FeatureStyler const & fs, di::DrawRule const & rule) +void CPUDrawer::DrawPathText(PathInfo const & info, FeatureStyler const & fs, DrawRule const & rule) { FeatureID const & geomID = Insert(info); FeatureID const & styleID = Insert(fs); @@ -401,8 +417,8 @@ void CPUDrawer::DrawPathText(di::PathInfo const & info, di::FeatureStyler const ComplexShape const * shape = &m_pathTextShapes.back(); OverlayWrapper & overlay = AddOverlay(shape); - TPathTextRendererCall callback = [this, &overlay](di::PathInfo const & geometry, - graphics::FontDesc const & font, + TPathTextRendererCall callback = [this, &overlay](PathInfo const & geometry, + dp::FontDecl const & font, strings::UniString const & text) { m_renderer->CalculateTextMetric(geometry, font, text, overlay.m_rects); @@ -411,21 +427,21 @@ void CPUDrawer::DrawPathText(di::PathInfo const & info, di::FeatureStyler const CallTextRendererFn(shape, callback); } -void CPUDrawer::DrawPathNumber(di::PathInfo const & path, di::FeatureStyler const & fs, di::DrawRule const & rule) +void CPUDrawer::DrawPathNumber(PathInfo const & path, FeatureStyler const & fs, DrawRule const & rule) { - graphics::FontDesc font; - ConvertStyle(rule.m_rule->GetShield(), VisualScale(), font); + dp::FontDecl font; + ConvertStyle(rule.m_rule->GetShield(), m_visualScale, font); FeatureID const & id = Insert(fs.m_refText); - GenerateRoadNumbers(path, font, fs, [this, &id](m2::PointD const & pt, graphics::FontDesc const & font, string const & /*text*/) + GenerateRoadNumbers(path, font, fs, [this, &id](m2::PointD const & pt, dp::FontDecl const & font, string const & /*text*/) { m_roadNumberFont = font; - m_textShapes.emplace_back(pt, graphics::EPosCenter, id, di::DrawRule(), GetGeneration(), TYPE_ROAD_NUMBER); + m_textShapes.emplace_back(pt, dp::Center, id, DrawRule(), GetGeneration(), TYPE_ROAD_NUMBER); TextShape const * shape = &m_textShapes.back(); OverlayWrapper & overlay = AddOverlay(shape); - TRoadNumberRendererCall callback = [this, &overlay](m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & font, strings::UniString const & text) + TRoadNumberRendererCall callback = [this, &overlay](m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & font, strings::UniString const & text) { m2::RectD rect; m_renderer->CalculateTextMetric(pt, anchor, font, text, rect); @@ -436,17 +452,52 @@ void CPUDrawer::DrawPathNumber(di::PathInfo const & path, di::FeatureStyler cons }); } -FeatureID const & CPUDrawer::Insert(di::PathInfo const & info) +void CPUDrawer::GenerateRoadNumbers(PathInfo const & path, dp::FontDecl const & font, FeatureStyler const & fs, + TRoadNumberCallbackFn const & fn) +{ + double const length = path.GetFullLength(); + if (length >= (fs.m_refText.size() + 2) * font.m_size) + { + size_t const count = size_t(length / 1000.0) + 2; + + m2::PointD pt; + for (size_t j = 1; j < count; ++j) + { + if (path.GetSmPoint(double(j) / double(count), pt)) + fn(pt, font, fs.m_refText); + } + } +} + +void CPUDrawer::DrawFeatureStart(FeatureID const & id) +{ + m_currentFeatureID = id; +} + +void CPUDrawer::DrawFeatureEnd(FeatureID const & id) +{ + ASSERT_EQUAL(m_currentFeatureID, id, ()); + UNUSED_VALUE(id); + m_currentFeatureID = FeatureID(); +} + +FeatureID const & CPUDrawer::GetCurrentFeatureID() const +{ + ASSERT(m_currentFeatureID.IsValid(), ()); + return m_currentFeatureID; +} + +FeatureID const & CPUDrawer::Insert(PathInfo const & info) { return InsertImpl(GetCurrentFeatureID(), m_pathGeometry, info); } -FeatureID const & CPUDrawer::Insert(di::AreaInfo const & info) +FeatureID const & CPUDrawer::Insert(AreaInfo const & info) { return InsertImpl(GetCurrentFeatureID(), m_areasGeometry, info); } -FeatureID const & CPUDrawer::Insert(di::FeatureStyler const & styler) +FeatureID const & CPUDrawer::Insert(FeatureStyler const & styler) { return InsertImpl(GetCurrentFeatureID(), m_stylers, styler); } @@ -523,7 +574,7 @@ void CPUDrawer::DrawSymbol(PointShape const * shape) ASSERT(shape->m_drawRule.m_rule != nullptr, ()); ASSERT(shape->m_drawRule.m_rule->GetSymbol() != nullptr, ()); - graphics::Icon::Info info; + IconInfo info; ConvertStyle(shape->m_drawRule.m_rule->GetSymbol(), info); m_renderer->DrawSymbol(shape->m_position, shape->m_anchor, info); } @@ -534,8 +585,8 @@ void CPUDrawer::DrawCircle(PointShape const * shape) ASSERT(shape->m_drawRule.m_rule != nullptr, ()); ASSERT(shape->m_drawRule.m_rule->GetCircle() != nullptr, ()); - graphics::Circle::Info info; - ConvertStyle(shape->m_drawRule.m_rule->GetCircle(), VisualScale(), info); + CircleInfo info; + ConvertStyle(shape->m_drawRule.m_rule->GetCircle(), m_visualScale, info); m_renderer->DrawCircle(shape->m_position, shape->m_anchor, info); } @@ -545,8 +596,8 @@ void CPUDrawer::DrawPath(ComplexShape const * shape) ASSERT(shape->m_drawRule.m_rule != nullptr, ()); ASSERT(shape->m_drawRule.m_rule->GetLine() != nullptr, ()); - graphics::Pen::Info info; - ConvertStyle(shape->m_drawRule.m_rule->GetLine(), VisualScale(), info); + PenInfo info; + ConvertStyle(shape->m_drawRule.m_rule->GetLine(), m_visualScale, info); m_renderer->DrawPath(GetInfo(shape->m_geomID, m_pathGeometry), info); } @@ -557,7 +608,7 @@ void CPUDrawer::DrawArea(ComplexShape const * shape) ASSERT(shape->m_drawRule.m_rule != nullptr, ()); ASSERT(shape->m_drawRule.m_rule->GetArea() != nullptr, ()); - graphics::Brush::Info info; + BrushInfo info; ConvertStyle(shape->m_drawRule.m_rule->GetArea(), info); m_renderer->DrawArea(GetInfo(shape->m_geomID, m_areasGeometry), info); @@ -565,8 +616,8 @@ void CPUDrawer::DrawArea(ComplexShape const * shape) void CPUDrawer::DrawPathText(ComplexShape const * shape) { - TPathTextRendererCall callback = [this](di::PathInfo const & geometry, - graphics::FontDesc const & font, + TPathTextRendererCall callback = [this](PathInfo const & geometry, + dp::FontDecl const & font, strings::UniString const & text) { m_renderer->DrawPathText(geometry, font, text); @@ -577,8 +628,8 @@ void CPUDrawer::DrawPathText(ComplexShape const * shape) void CPUDrawer::DrawRoadNumber(TextShape const * shape) { - TRoadNumberRendererCall callback = [this](m2::PointD const & pt, graphics::EPosition pos, - graphics::FontDesc const & font, strings::UniString const & text) + TRoadNumberRendererCall callback = [this](m2::PointD const & pt, dp::Anchor pos, + dp::FontDecl const & font, strings::UniString const & text) { m_renderer->DrawText(pt, pos, font, text); }; @@ -589,8 +640,8 @@ void CPUDrawer::DrawRoadNumber(TextShape const * shape) void CPUDrawer::DrawText(TextShape const * shape) { - TTextRendererCall callback = [this](m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & primFont, graphics::FontDesc const & secFont, + TTextRendererCall callback = [this](m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & primFont, dp::FontDecl const & secFont, strings::UniString const & primText, strings::UniString const & secText) { if (secText.empty()) @@ -613,18 +664,18 @@ void CPUDrawer::CallTextRendererFn(TextShape const * shape, TTextRendererCall co ASSERT(shape->m_type == TYPE_TEXT, ()); ASSERT(shape->m_drawRule.m_rule != nullptr, ()); ASSERT(shape->m_drawRule.m_rule->GetCaption(0) != nullptr, ()); - di::FeatureStyler const & fs = GetInfo(shape->m_geomID, m_stylers); + FeatureStyler const & fs = GetInfo(shape->m_geomID, m_stylers); CaptionDefProto const * primCaption = shape->m_drawRule.m_rule->GetCaption(0); CaptionDefProto const * secCaption = shape->m_drawRule.m_rule->GetCaption(1); - graphics::FontDesc primFont, secFont; + dp::FontDecl primFont, secFont; m2::PointD primOffset, secOffset; - ConvertStyle(primCaption, VisualScale(), primFont, primOffset); + ConvertStyle(primCaption, m_visualScale, primFont, primOffset); CorrectFont(primFont); if (secCaption != nullptr) { - ConvertStyle(secCaption, VisualScale(), secFont, secOffset); + ConvertStyle(secCaption, m_visualScale, secFont, secOffset); CorrectFont(secFont); } @@ -636,23 +687,230 @@ void CPUDrawer::CallTextRendererFn(TextShape const * shape, TRoadNumberRendererC { string const & text = GetInfo(shape->m_geomID, m_roadNames); - fn(shape->m_position, shape->m_anchor, m_roadNumberFont, graphics::GlyphCache::log2vis(strings::MakeUniString(text))); + fn(shape->m_position, shape->m_anchor, m_roadNumberFont, GlyphCache::log2vis(strings::MakeUniString(text))); } void CPUDrawer::CallTextRendererFn(ComplexShape const * shape, TPathTextRendererCall const & fn) { ASSERT(shape->m_type == TYPE_PATH_TEXT, ()); - di::PathInfo const & path = GetInfo(shape->m_geomID, m_pathGeometry); - di::FeatureStyler const & styler = GetInfo(shape->m_geomID, m_stylers); + PathInfo const & path = GetInfo(shape->m_geomID, m_pathGeometry); + FeatureStyler const & styler = GetInfo(shape->m_geomID, m_stylers); if (styler.m_offsets.empty()) return; - graphics::FontDesc font; + dp::FontDecl font; m2::PointD offset; - ConvertStyle(shape->m_drawRule.m_rule->GetCaption(0), VisualScale(), font, offset); + ConvertStyle(shape->m_drawRule.m_rule->GetCaption(0), m_visualScale, font, offset); CorrectFont(font); fn(path, font, strings::MakeUniString(styler.GetPathName())); } + +GlyphCache * CPUDrawer::GetGlyphCache() const +{ + return m_renderer->GetGlyphCache(); +} + +ScreenBase CPUDrawer::CalculateScreen(m2::PointD const & center, int zoomModifier, + uint32_t pxWidth, uint32_t pxHeight, + FrameSymbols const & symbols, int & resultZoom) +{ + df::Navigator frameNavigator; + frameNavigator.OnSize(pxWidth, pxHeight); + + uint32_t const tileSize = static_cast(df::CalculateTileSize(pxWidth, pxHeight)); + + m2::RectD rect = df::GetRectForDrawScale(scales::GetUpperComfortScale() - 1, center, tileSize, m_visualScale); + if (symbols.m_showSearchResult && !rect.IsPointInside(symbols.m_searchResult)) + { + double const kScaleFactor = 1.3; + m2::PointD oldCenter = rect.Center(); + rect.Add(symbols.m_searchResult); + double const centersDiff = 2 * (rect.Center() - oldCenter).Length(); + + m2::RectD resultRect; + resultRect.SetSizes(rect.SizeX() + centersDiff, rect.SizeY() + centersDiff); + resultRect.SetCenter(center); + resultRect.Scale(kScaleFactor); + rect = resultRect; + ASSERT(rect.IsPointInside(symbols.m_searchResult), ()); + } + + int baseZoom = df::GetDrawTileScale(rect, tileSize, m_visualScale); + resultZoom = baseZoom + zoomModifier; + int const minZoom = symbols.m_bottomZoom == -1 ? resultZoom : symbols.m_bottomZoom; + resultZoom = my::clamp(resultZoom, minZoom, scales::GetUpperScale()); + rect = df::GetRectForDrawScale(resultZoom, rect.Center(), tileSize, m_visualScale); + + df::CheckMinGlobalRect(rect, tileSize, m_visualScale); + df::CheckMinMaxVisibleScale([](m2::PointD const &){ return true; }, rect, -1, tileSize, m_visualScale); + frameNavigator.SetFromRect(m2::AnyRectD(rect), tileSize, m_visualScale); + + return frameNavigator.Screen(); +} + +void CPUDrawer::Draw(FeatureData const & data) +{ + DrawFeatureStart(data.m_id); + + buffer_vector const & rules = data.m_styler.m_rules; + buffer_vector pathRules; + + bool const isPath = !data.m_pathes.empty(); + bool const isArea = !data.m_areas.empty(); + bool isCircleAndSymbol = false; + + drule::BaseRule const * pCircleRule = nullptr; + double circleDepth = df::watch::minDepth; + + drule::BaseRule const * pSymbolRule = nullptr; + double symbolDepth = df::watch::minDepth; + + drule::BaseRule const * pShieldRule = nullptr; + double shieldDepth = df::watch::minDepth; + + // separating path rules from other + for (size_t i = 0; i < rules.size(); ++i) + { + drule::BaseRule const * pRule = rules[i].m_rule; + + bool const isSymbol = pRule->GetSymbol() != 0; + bool const isCaption = pRule->GetCaption(0) != 0; + bool const isCircle = pRule->GetCircle() != 0; + + if (pSymbolRule == nullptr && isSymbol) + { + pSymbolRule = pRule; + symbolDepth = rules[i].m_depth; + } + + if (pCircleRule == nullptr && isCircle) + { + pCircleRule = pRule; + circleDepth = rules[i].m_depth; + } + + if (pShieldRule == nullptr && pRule->GetShield() != nullptr) + { + pShieldRule = pRule; + shieldDepth = rules[i].m_depth; + } + + if (!isCaption && isPath && !isSymbol && (pRule->GetLine() != 0)) + pathRules.push_back(rules[i]); + } + + isCircleAndSymbol = (pSymbolRule != nullptr) && (pCircleRule != nullptr); + + if (!pathRules.empty()) + { + for (auto i = data.m_pathes.cbegin(); i != data.m_pathes.cend(); ++i) + DrawPath(*i, pathRules.data(), pathRules.size()); + } + + for (size_t i = 0; i < rules.size(); ++i) + { + drule::BaseRule const * pRule = rules[i].m_rule; + double const depth = rules[i].m_depth; + + bool const isCaption = pRule->GetCaption(0) != 0; + bool const isSymbol = pRule->GetSymbol() != 0; + bool const isCircle = pRule->GetCircle() != 0; + + if (!isCaption) + { + // draw area + if (isArea) + { + bool const isFill = pRule->GetArea() != 0; + + for (auto i = data.m_areas.cbegin(); i != data.m_areas.cend(); ++i) + { + if (isFill) + DrawArea(*i, DrawRule(pRule, depth)); + else if (isCircleAndSymbol && isCircle) + { + DrawCircledSymbol(i->GetCenter(), + dp::Center, + DrawRule(pSymbolRule, symbolDepth), + DrawRule(pCircleRule, circleDepth)); + } + else if (isSymbol) + DrawSymbol(i->GetCenter(), dp::Center, DrawRule(pRule, depth)); + else if (isCircle) + DrawCircle(i->GetCenter(), dp::Center, DrawRule(pRule, depth)); + } + } + + // draw point symbol + if (!isPath && !isArea && ((pRule->GetType() & drule::node) != 0)) + { + if (isCircleAndSymbol) + { + DrawCircledSymbol(data.m_point, + dp::Center, + DrawRule(pSymbolRule, symbolDepth), + DrawRule(pCircleRule, circleDepth)); + } + else if (isSymbol) + DrawSymbol(data.m_point, dp::Center, DrawRule(pRule, depth)); + else if (isCircle) + DrawCircle(data.m_point, dp::Center, DrawRule(pRule, depth)); + } + } + else + { + if (!data.m_styler.m_primaryText.empty() && (pRule->GetCaption(0) != 0)) + { + bool isN = ((pRule->GetType() & drule::way) != 0); + + dp::Anchor textPosition = dp::Center; + if (pRule->GetCaption(0)->has_offset_y()) + { + if (pRule->GetCaption(0)->offset_y() > 0) + textPosition = dp::Bottom; + else + textPosition = dp::Top; + } + if (pRule->GetCaption(0)->has_offset_x()) + { + if (pRule->GetCaption(0)->offset_x() > 0) + textPosition = dp::Right; + else + textPosition = dp::Left; + } + + // draw area text + if (isArea) + { + for (auto i = data.m_areas.cbegin(); i != data.m_areas.cend(); ++i) + DrawText(i->GetCenter(), textPosition, data.m_styler, DrawRule(pRule, depth)); + } + + // draw way name + if (isPath && !isArea && isN && !data.m_styler.FilterTextSize(pRule)) + { + for (auto i = data.m_pathes.cbegin(); i != data.m_pathes.cend(); ++i) + DrawPathText(*i, data.m_styler, DrawRule(pRule, depth)); + } + + // draw point text + isN = ((pRule->GetType() & drule::node) != 0); + if (!isPath && !isArea && isN) + DrawText(data.m_point, textPosition, data.m_styler, DrawRule(pRule, depth)); + } + } + } + + // draw road numbers + if (isPath && !data.m_styler.m_refText.empty() && pShieldRule != nullptr) + for (auto n : data.m_pathes) + DrawPathNumber(n, data.m_styler, DrawRule(pShieldRule, shieldDepth)); + + DrawFeatureEnd(data.m_id); +} + +} +} diff --git a/drape_frontend/watch/cpu_drawer.hpp b/drape_frontend/watch/cpu_drawer.hpp new file mode 100644 index 0000000000..6cb6318ef0 --- /dev/null +++ b/drape_frontend/watch/cpu_drawer.hpp @@ -0,0 +1,225 @@ +#pragma once + +#include "drape_frontend/watch/frame_image.hpp" +#include "drape_frontend/watch/feature_processor.hpp" + +#include "drape/drape_global.hpp" + +#include "indexer/feature_decl.hpp" + +#include "geometry/screenbase.hpp" + +#include "std/function.hpp" +#include "std/list.hpp" +#include "std/unique_ptr.hpp" + +namespace df +{ +namespace watch +{ + +class SoftwareRenderer; + +class CPUDrawer +{ + +public: + struct Params + { + Params(string const & resourcesPrefix, double visualScale) + : m_resourcesPrefix(resourcesPrefix) + , m_visualScale(visualScale) + {} + + string m_resourcesPrefix; + double m_visualScale; + }; + + CPUDrawer(Params const & params); + ~CPUDrawer(); + + void BeginFrame(uint32_t width, uint32_t height, dp::Color const & bgColor); + void Flush(); + void DrawMyPosition(m2::PointD const & myPxPotision); + void DrawSearchResult(m2::PointD const & pxPosition); + void DrawSearchArrow(double azimut); + void EndFrame(FrameImage & image); + + GlyphCache * GetGlyphCache() const; + + double GetVisualScale() const { return m_visualScale; } + + ScreenBase CalculateScreen(m2::PointD const & center, int zoomModifier, + uint32_t pxWidth, uint32_t pxHeight, + FrameSymbols const & symbols, int & resultZoom); + + void Draw(FeatureData const & data); + +protected: + void DrawSymbol(m2::PointD const & pt, dp::Anchor pos, DrawRule const & rule); + void DrawCircle(m2::PointD const & pt, dp::Anchor pos, DrawRule const & rule); + void DrawCircledSymbol(m2::PointD const & pt, dp::Anchor pos, + DrawRule const & symbolRule, DrawRule const & circleRule); + void DrawPath(PathInfo const & path, DrawRule const * rules, size_t count); + void DrawArea(AreaInfo const & area, DrawRule const & rule); + void DrawText(m2::PointD const & pt, dp::Anchor pos, + FeatureStyler const & fs, DrawRule const & rule); + void DrawPathText(PathInfo const & info, FeatureStyler const & fs, DrawRule const & rule); + void DrawPathNumber(PathInfo const & path, FeatureStyler const & fs, DrawRule const & rule); + + using TRoadNumberCallbackFn = function; + void GenerateRoadNumbers(PathInfo const & path, dp::FontDecl const & font, FeatureStyler const & fs, + TRoadNumberCallbackFn const & fn); + + void DrawFeatureStart(FeatureID const & id); + void DrawFeatureEnd(FeatureID const & id); + FeatureID const & GetCurrentFeatureID() const; + + int GetGeneration() { return m_generationCounter++; } + + FeatureID const & Insert(PathInfo const & info); + FeatureID const & Insert(AreaInfo const & info); + FeatureID const & Insert(FeatureStyler const & styler); + FeatureID const & Insert(string const & text); + +private: + void Render(); + +private: + unique_ptr m_renderer; + int m_generationCounter; + + enum EShapeType + { + TYPE_INVALID, + TYPE_SYMBOL, + TYPE_CIRCLE, + TYPE_AREA, + TYPE_PATH, + TYPE_PATH_TEXT, + TYPE_TEXT, + TYPE_ROAD_NUMBER + }; + + struct BaseShape + { + BaseShape(DrawRule const & rule, int generation, EShapeType type) + : m_drawRule(rule) + , m_generation(generation) + , m_type(type) + {} + + DrawRule m_drawRule; + int m_generation = 0; + EShapeType m_type = TYPE_INVALID; + }; + + struct PointShape : BaseShape + { + PointShape(m2::PointD const & pt, dp::Anchor anchor, EShapeType type, + DrawRule const & rule, int generation) + : BaseShape(rule, generation, type) + , m_position(pt) + , m_anchor(anchor) + { + ASSERT(type == TYPE_SYMBOL || type == TYPE_CIRCLE, ()); + } + + m2::PointD m_position = m2::PointD::Zero(); + dp::Anchor m_anchor = dp::Center; + }; + + struct ComplexShape : BaseShape + { + ComplexShape(FeatureID geomID, DrawRule const & rule, int generation, EShapeType type) + : BaseShape(rule, generation, type) + , m_geomID(geomID) + { + ASSERT(type == TYPE_AREA || + type == TYPE_PATH || + type == TYPE_PATH_TEXT || + type == TYPE_TEXT || + type == TYPE_ROAD_NUMBER, ()); + + ASSERT(type == TYPE_ROAD_NUMBER || m_drawRule.m_rule != nullptr, ()); + } + + FeatureID m_geomID; + }; + + struct TextShape : ComplexShape + { + TextShape(m2::PointD const & pt, dp::Anchor anchor, FeatureID const & id, + DrawRule const & rule, int generation, EShapeType type) + : ComplexShape(id, rule, generation, type) + , m_position(pt) + , m_anchor(anchor) + {} + + m2::PointD m_position = m2::PointD::Zero(); + dp::Anchor m_anchor = dp::Center; + }; + + void DrawSymbol(PointShape const * shape); + void DrawCircle(PointShape const * shape); + void DrawPath(ComplexShape const * shape); + void DrawArea(ComplexShape const * shape); + void DrawPathText(ComplexShape const * shape); + void DrawRoadNumber(TextShape const * shape); + void DrawText(TextShape const * shape); + + class CPUOverlayTree; + struct OverlayWrapper + { + OverlayWrapper(BaseShape const ** rules, size_t count) + : m_ruleCount(count) + { + ASSERT(count > 0 && count < 3, ()); + m_rules[0] = rules[0]; + if (m_ruleCount == 2) + m_rules[1] = rules[1]; + } + + BaseShape const * m_rules[2]; + size_t m_ruleCount; + vector m_rects; + m2::RectD m_boundRect; + }; + + OverlayWrapper & AddOverlay(BaseShape const * shape1, BaseShape const * shape2 = nullptr); + + using TTextRendererCall = function; + void CallTextRendererFn(TextShape const * shape, TTextRendererCall const & fn); + + using TRoadNumberRendererCall = function; + void CallTextRendererFn(TextShape const * shape, TRoadNumberRendererCall const & fn); + + using TPathTextRendererCall = function; + void CallTextRendererFn(ComplexShape const * shape, TPathTextRendererCall const & fn); + + list m_areaPathShapes; + + // overlay part + list m_pointShapes; + list m_pathTextShapes; + list m_textShapes; + list m_overlayList; + + map m_stylers; + map m_areasGeometry; + map m_pathGeometry; + map m_roadNames; + dp::FontDecl m_roadNumberFont; + + double m_visualScale; + + FeatureID m_currentFeatureID; +}; + +} +} diff --git a/render/default_font.cpp b/drape_frontend/watch/default_font.cpp similarity index 100% rename from render/default_font.cpp rename to drape_frontend/watch/default_font.cpp diff --git a/drape_frontend/watch/feature_processor.cpp b/drape_frontend/watch/feature_processor.cpp new file mode 100644 index 0000000000..36bd4a33e5 --- /dev/null +++ b/drape_frontend/watch/feature_processor.cpp @@ -0,0 +1,174 @@ +#include "drape_frontend/watch/feature_processor.hpp" +#include "drape_frontend/watch/geometry_processors.hpp" +#include "drape_frontend/watch/feature_styler.hpp" +#include "drape_frontend/watch/cpu_drawer.hpp" + +#include "indexer/feature_impl.hpp" +#include "indexer/feature_algo.hpp" + +namespace df +{ +namespace watch +{ + +namespace +{ + template void assign_point(FeatureData & data, TSrc & src) + { + data.m_point = src.m_point; + } + + template void assign_path(FeatureData & data, TSrc & src) + { + data.m_pathes.swap(src.m_points); + } + + template void assign_area(FeatureData & data, TSrc & src) + { + data.m_areas.swap(src.m_points); + + ASSERT(!data.m_areas.empty(), ()); + data.m_areas.back().SetCenter(src.GetCenter()); + } +} + +FeatureProcessor::FeatureProcessor(ref_ptr drawer, + m2::RectD const & r, + ScreenBase const & convertor, + int zoomLevel) + : m_drawer(drawer) + , m_rect(r) + , m_convertor(convertor) + , m_zoom(zoomLevel) + , m_hasNonCoast(false) +{ +} + +bool FeatureProcessor::operator()(FeatureType const & f) +{ + FeatureData data; + data.m_id = f.GetID(); + data.m_styler = FeatureStyler(f, m_zoom, m_drawer->GetVisualScale(), + m_drawer->GetGlyphCache(), &m_convertor, &m_rect); + + if (data.m_styler.IsEmpty()) + return true; + + // Draw coastlines features only once. + if (data.m_styler.m_isCoastline) + { + if (!m_coasts.insert(data.m_styler.m_primaryText).second) + return true; + } + else + m_hasNonCoast = true; + + bool isExist = false; + + switch (data.m_styler.m_geometryType) + { + case feature::GEOM_POINT: + { + typedef one_point functor_t; + + functor_t::params p; + p.m_convertor = &m_convertor; + p.m_rect = &m_rect; + + functor_t fun(p); + f.ForEachPointRef(fun, m_zoom); + if (fun.IsExist()) + { + isExist = true; + assign_point(data, fun); + } + + break; + } + + case feature::GEOM_AREA: + { + typedef filter_screenpts_adapter functor_t; + + functor_t::params p; + p.m_convertor = &m_convertor; + p.m_rect = &m_rect; + + functor_t fun(p); + f.ForEachTriangleExRef(fun, m_zoom); + + if (data.m_styler.m_hasPointStyles) + fun.SetCenter(feature::GetCenter(f, m_zoom)); + + if (fun.IsExist()) + { + isExist = true; + assign_area(data, fun); + } + + // continue rendering as line if feature has linear styles too + if (!data.m_styler.m_hasLineStyles) + break; + } + + case feature::GEOM_LINE: + { + if (data.m_styler.m_hasPathText) + { + typedef filter_screenpts_adapter functor_t; + + functor_t::params p; + + p.m_convertor = &m_convertor; + p.m_rect = &m_rect; + p.m_intervals = &data.m_styler.m_intervals; + + functor_t fun(p); + + f.ForEachPointRef(fun, m_zoom); + if (fun.IsExist()) + { + isExist = true; + assign_path(data, fun); + + #ifdef DEBUG + if (data.m_pathes.size() == 1) + { + double const offset = data.m_pathes.front().GetOffset(); + for (size_t i = 0; i < data.m_styler.m_offsets.size(); ++i) + ASSERT_LESS_OR_EQUAL(offset, data.m_styler.m_offsets[i], ()); + } + #endif + } + } + else + { + typedef filter_screenpts_adapter functor_t; + + functor_t::params p; + + p.m_convertor = &m_convertor; + p.m_rect = &m_rect; + + functor_t fun(p); + + f.ForEachPointRef(fun, m_zoom); + + if (fun.IsExist()) + { + isExist = true; + assign_path(data, fun); + } + } + break; + } + } + + if (isExist) + m_drawer->Draw(data); + + return true; +} + +} +} diff --git a/drape_frontend/watch/feature_processor.hpp b/drape_frontend/watch/feature_processor.hpp new file mode 100644 index 0000000000..563b3de219 --- /dev/null +++ b/drape_frontend/watch/feature_processor.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include "drape_frontend/watch/feature_styler.hpp" +#include "drape_frontend/watch/area_info.hpp" +#include "drape_frontend/watch/path_info.hpp" + +#include "drape/pointers.hpp" + +#include "indexer/drawing_rule_def.hpp" +#include "indexer/feature.hpp" +#include "indexer/data_header.hpp" +#include "indexer/feature_data.hpp" + +#include "geometry/rect2d.hpp" + +class ScreenBase; + +namespace df +{ +namespace watch +{ + +struct FeatureData +{ + FeatureStyler m_styler; + FeatureID m_id; + + list m_pathes; + list m_areas; + m2::PointD m_point; +}; + +class CPUDrawer; + +class FeatureProcessor +{ +public: + + FeatureProcessor(ref_ptr drawer, + m2::RectD const & r, + ScreenBase const & convertor, + int zoomLevel); + + bool operator()(FeatureType const & f); + +private: + ref_ptr m_drawer; + m2::RectD m_rect; + set m_coasts; + ScreenBase const & m_convertor; + int m_zoom; + bool m_hasNonCoast; + bool m_hasAnyFeature; + + void PreProcessKeys(vector & keys) const; +}; + +} +} diff --git a/drape_frontend/watch/feature_styler.cpp b/drape_frontend/watch/feature_styler.cpp new file mode 100644 index 0000000000..d7b4d64e57 --- /dev/null +++ b/drape_frontend/watch/feature_styler.cpp @@ -0,0 +1,411 @@ +#include "drape_frontend/watch/feature_styler.hpp" +#include "drape_frontend/watch/proto_to_styles.hpp" +#include "drape_frontend/watch/glyph_cache.hpp" +#include "drape_frontend/watch/geometry_processors.hpp" + +#include "indexer/drawing_rules.hpp" +#include "indexer/feature.hpp" +#include "indexer/feature_visibility.hpp" +#include "indexer/ftypes_matcher.hpp" +#include "indexer/scales.hpp" +#include "indexer/drules_include.hpp" + +#include "geometry/screenbase.hpp" + +#include "base/stl_add.hpp" +#include "base/logging.hpp" + +#include "std/iterator_facade.hpp" + +namespace +{ + +struct less_depth +{ + bool operator() (df::watch::DrawRule const & r1, df::watch::DrawRule const & r2) const + { + return (r1.m_depth < r2.m_depth); + } +}; + +} + +namespace df +{ +namespace watch +{ + +DrawRule::DrawRule(drule::BaseRule const * p, double depth) + : m_rule(p), m_depth(my::clamp(depth, minDepth, maxDepth)) +{ +} + +uint32_t DrawRule::GetID(size_t threadSlot) const +{ + return m_rule->GetID(threadSlot); +} + +void DrawRule::SetID(size_t threadSlot, uint32_t id) const +{ + m_rule->SetID(threadSlot, id); +} + +FeatureStyler::FeatureStyler(FeatureType const & f, + int const zoom, + double const visualScale, + GlyphCache * glyphCache, + ScreenBase const * convertor, + m2::RectD const * rect) + : m_hasPathText(false), + m_visualScale(visualScale), + m_glyphCache(glyphCache), + m_convertor(convertor), + m_rect(rect) +{ + drule::KeysT keys; + pair type = feature::GetDrawRule(f, zoom, keys); + + // don't try to do anything to invisible feature + if (keys.empty()) + return; + + m_hasLineStyles = false; + m_hasPointStyles = false; + + m_geometryType = type.first; + m_isCoastline = type.second; + + f.GetPreferredNames(m_primaryText, m_secondaryText); + + // Draw only one text for features on the World zoom level in user's native language. + if (zoom <= scales::GetUpperWorldScale() && !m_secondaryText.empty()) + { + m_primaryText.swap(m_secondaryText); + m_secondaryText.clear(); + } + + // Low zoom heuristics - don't show superlong names on World map. + //if (zoom <= 5) + //{ + // if (strings::MakeUniString(m_primaryText).size() > 50) + // m_primaryText.clear(); + //} + + string houseNumber; + if (ftypes::IsBuildingChecker::Instance()(f)) + { + houseNumber = f.GetHouseNumber(); + // Mark houses without names/numbers so user can select them by single tap. + if (houseNumber.empty() && m_primaryText.empty()) + houseNumber = "·"; + } + bool const hasName = !m_primaryText.empty() || !houseNumber.empty(); + + m_refText = f.GetRoadNumber(); + + double const population = static_cast(f.GetPopulation()); + if (population == 1) + m_popRank = 0.0; + else + { + double const upperBound = 3.0E6; + m_popRank = min(upperBound, population) / upperBound / 4; + } + + double area = 0.0; + if (m_geometryType != feature::GEOM_POINT) + { + m2::RectD const bbox = f.GetLimitRect(zoom); + area = bbox.SizeX() * bbox.SizeY(); + } + + double priorityModifier; + if (area != 0) + { + // making area larger so it's not lost on double conversions + priorityModifier = min(1.0, area * 10000.0); + } + else + { + // dividing by planet population to get priorityModifier < 1 + priorityModifier = static_cast(population) / 7E9; + } + + drule::MakeUnique(keys); + + int layer = f.GetLayer(); + if (layer == feature::LAYER_TRANSPARENT_TUNNEL) + layer = 0; + + bool hasIcon = false; + bool hasCaptionWithoutOffset = false; + + m_fontSize = 0; + + size_t const count = keys.size(); + m_rules.resize(count); + + bool hasSecondaryText = false; + + for (size_t i = 0; i < count; ++i) + { + double depth = keys[i].m_priority; + + if (layer != 0 && depth < 19000) + { + if (keys[i].m_type == drule::line || keys[i].m_type == drule::waymarker) + depth = (layer * drule::layer_base_priority) + fmod(depth, drule::layer_base_priority); + else if (keys[i].m_type == drule::area) + { + // Use raw depth adding in area feature layers + // (avoid overlap linear objects in case of "fmod"). + depth += layer * drule::layer_base_priority; + } + } + + if (keys[i].m_type == drule::symbol || keys[i].m_type == drule::circle) + hasIcon = true; + + if ((keys[i].m_type == drule::caption && hasName) + || (keys[i].m_type == drule::symbol) + || (keys[i].m_type == drule::circle)) + m_hasPointStyles = true; + + if (keys[i].m_type == drule::caption + || keys[i].m_type == drule::symbol + || keys[i].m_type == drule::circle + || keys[i].m_type == drule::pathtext) + { + // show labels of larger objects first + depth += priorityModifier; + // show labels of nodes first + if (m_geometryType == feature::GEOM_POINT) + ++depth; + } + else if (keys[i].m_type == drule::area) + { + // show smaller polygons on top + depth -= priorityModifier; + } + + if (!m_hasLineStyles && (keys[i].m_type == drule::line)) + m_hasLineStyles = true; + + m_rules[i] = DrawRule(drule::rules().Find(keys[i]), depth); + + if (m_rules[i].m_rule->GetCaption(1) != 0) + hasSecondaryText = true; + + CaptionDefProto const * pCap0 = m_rules[i].m_rule->GetCaption(0); + if (pCap0) + { + if (!m_hasPathText && hasName && (m_geometryType == feature::GEOM_LINE)) + { + m_hasPathText = true; + + if (!FilterTextSize(m_rules[i].m_rule)) + m_fontSize = max(m_fontSize, GetTextFontSize(m_rules[i].m_rule)); + } + + if (keys[i].m_type == drule::caption) + hasCaptionWithoutOffset = !(pCap0->has_offset_y() || pCap0->has_offset_x()); + } + } + + // User's language name is better if we don't have secondary text draw rule. + if (!hasSecondaryText && !m_secondaryText.empty() && (m_geometryType != feature::GEOM_LINE)) + { + f.GetReadableName(m_primaryText); + if (m_primaryText == m_secondaryText) + m_secondaryText.clear(); + } + + // Get or concat house number if feature has one. + if (!houseNumber.empty()) + { + if (m_primaryText.empty() || houseNumber.find(m_primaryText) != string::npos) + houseNumber.swap(m_primaryText); + else + m_primaryText = m_primaryText + " (" + houseNumber + ")"; + } + + // placing a text on the path + if (m_hasPathText && (m_fontSize != 0)) + { + typedef filter_screenpts_adapter functor_t; + + functor_t::params p; + + p.m_convertor = m_convertor; + p.m_rect = m_rect; + p.m_intervals = &m_intervals; + + functor_t fun(p); + f.ForEachPointRef(fun, zoom); + + LayoutTexts(fun.m_length); + } + + if (hasIcon && hasCaptionWithoutOffset) + { + // we need to delete symbol style and circle style + for (size_t i = 0; i < m_rules.size();) + { + if (keys[i].m_type == drule::symbol || keys[i].m_type == drule::circle) + { + m_rules[i] = m_rules[m_rules.size() - 1]; + m_rules.pop_back(); + keys[i] = keys[keys.size() - 1]; + keys.pop_back(); + } + else + ++i; + } + } + + sort(m_rules.begin(), m_rules.end(), less_depth()); +} + +typedef pair RangeT; +template class RangeIterT : + public iterator_facade, RangeT, forward_traversal_tag, RangeT> +{ + IterT m_iter; +public: + RangeIterT(IterT iter) : m_iter(iter) {} + + RangeT dereference() const + { + IterT next = m_iter; + ++next; + return RangeT(*m_iter, *next); + } + bool equal(RangeIterT const & r) const { return (m_iter == r.m_iter); } + void increment() + { + ++m_iter; ++m_iter; + } +}; + +template class RangeInserter +{ + ContT & m_cont; +public: + RangeInserter(ContT & cont) : m_cont(cont) {} + + RangeInserter & operator*() { return *this; } + RangeInserter & operator++(int) { return *this; } + RangeInserter & operator=(RangeT const & r) + { + m_cont.push_back(r.first); + m_cont.push_back(r.second); + return *this; + } +}; + +void FeatureStyler::LayoutTexts(double pathLength) +{ + double const textLength = m_glyphCache->getTextLength(m_fontSize, GetPathName()); + /// @todo Choose best constant for minimal space. + double const emptySize = max(200 * m_visualScale, textLength); + // multiply on factor because tiles will be rendered in smaller scales + double const minPeriodSize = 1.5 * (emptySize + textLength); + + size_t textCnt = 0; + double firstTextOffset = 0; + + if (pathLength > textLength) + { + textCnt = ceil((pathLength - textLength) / minPeriodSize); + firstTextOffset = 0.5 * (pathLength - (textCnt * textLength + (textCnt - 1) * emptySize)); + } + + if (textCnt != 0 && !m_intervals.empty()) + { + buffer_vector deadZones; + + for (size_t i = 0; i < textCnt; ++i) + { + double const deadZoneStart = firstTextOffset + minPeriodSize * i; + double const deadZoneEnd = deadZoneStart + textLength; + + if (deadZoneStart > m_intervals.back()) + break; + + deadZones.push_back(make_pair(deadZoneStart, deadZoneEnd)); + } + + if (!deadZones.empty()) + { + buffer_vector res; + + // accumulate text layout intervals with cliping intervals + typedef RangeIterT IterT; + AccumulateIntervals1With2(IterT(m_intervals.begin()), IterT(m_intervals.end()), + deadZones.begin(), deadZones.end(), + RangeInserter(res)); + + m_intervals = res; + ASSERT_EQUAL(m_intervals.size() % 2, 0, ()); + + // get final text offsets (belongs to final clipping intervals) + size_t i = 0; + size_t j = 0; + while (i != deadZones.size() && j != m_intervals.size()) + { + ASSERT_LESS(deadZones[i].first, deadZones[i].second, ()); + ASSERT_LESS(m_intervals[j], m_intervals[j+1], ()); + + if (deadZones[i].first < m_intervals[j]) + { + ++i; + continue; + } + if (m_intervals[j+1] <= deadZones[i].first) + { + j += 2; + continue; + } + + ASSERT_LESS_OR_EQUAL(m_intervals[j], deadZones[i].first, ()); + ASSERT_LESS_OR_EQUAL(deadZones[i].second, m_intervals[j+1], ()); + + m_offsets.push_back(deadZones[i].first); + ++i; + } + } + } +} + +string const FeatureStyler::GetPathName() const +{ + // Always concat names for linear features because we process only one draw rule now. + if (m_secondaryText.empty()) + return m_primaryText; + else + return m_primaryText + " " + m_secondaryText; +} + +bool FeatureStyler::IsEmpty() const +{ + return m_rules.empty(); +} + +uint8_t FeatureStyler::GetTextFontSize(drule::BaseRule const * pRule) const +{ + return pRule->GetCaption(0)->height() * m_visualScale; +} + +bool FeatureStyler::FilterTextSize(drule::BaseRule const * pRule) const +{ + if (pRule->GetCaption(0)) + return (GetFontSize(pRule->GetCaption(0)) < 3); + else + { + // this rule is not a caption at all + return true; + } +} + +} +} diff --git a/drape_frontend/watch/feature_styler.hpp b/drape_frontend/watch/feature_styler.hpp new file mode 100644 index 0000000000..3510559eb1 --- /dev/null +++ b/drape_frontend/watch/feature_styler.hpp @@ -0,0 +1,85 @@ +#pragma once + +#include "indexer/drawing_rules.hpp" + +#include "geometry/rect2d.hpp" + +#include "std/vector.hpp" + +class FeatureType; +class ScreenBase; + +namespace df +{ +namespace watch +{ + +const int maxDepth = 20000; +const int minDepth = -20000; + +class GlyphCache; + +struct DrawRule +{ + drule::BaseRule const * m_rule; + double m_depth; + + DrawRule() : m_rule(0), m_depth(0.0) {} + DrawRule(drule::BaseRule const * p, double depth); + + uint32_t GetID(size_t threadSlot) const; + void SetID(size_t threadSlot, uint32_t id) const; +}; + +struct FeatureStyler +{ + FeatureStyler() = default; + FeatureStyler(FeatureType const & f, + int const zoom, + double const visualScale, + GlyphCache * glyphCache, + ScreenBase const * convertor, + m2::RectD const * rect); + + typedef buffer_vector StylesContainerT; + StylesContainerT m_rules; + + bool m_isCoastline; + bool m_hasLineStyles; + bool m_hasPointStyles; + bool m_hasPathText; + int m_geometryType; + + double m_visualScale; + + string m_primaryText; + string m_secondaryText; + string m_refText; + + typedef buffer_vector ClipIntervalsT; + ClipIntervalsT m_intervals; + + typedef buffer_vector TextOffsetsT; + TextOffsetsT m_offsets; + + uint8_t m_fontSize; + + GlyphCache * m_glyphCache; + ScreenBase const * m_convertor; + m2::RectD const * m_rect; + + double m_popRank; + + bool IsEmpty() const; + + string const GetPathName() const; + + bool FilterTextSize(drule::BaseRule const * pRule) const; + +private: + uint8_t GetTextFontSize(drule::BaseRule const * pRule) const; + void LayoutTexts(double pathLength); +}; + +} +} diff --git a/render/frame_image.hpp b/drape_frontend/watch/frame_image.hpp similarity index 65% rename from render/frame_image.hpp rename to drape_frontend/watch/frame_image.hpp index bd2532fbca..373b7aff55 100644 --- a/render/frame_image.hpp +++ b/drape_frontend/watch/frame_image.hpp @@ -1,8 +1,22 @@ #pragma once +#include "geometry/point2d.hpp" + #include "std/cstdint.hpp" #include "std/vector.hpp" +namespace df +{ +namespace watch +{ + +struct FrameSymbols +{ + m2::PointD m_searchResult; + bool m_showSearchResult = false; + int m_bottomZoom = -1; +}; + struct FrameImage { // image data. @@ -13,3 +27,6 @@ struct FrameImage uint32_t m_height = 0; // pixel height of image uint32_t m_stride = 0; // row stride in bytes }; + +} +} diff --git a/drape_frontend/watch/geometry_processors.cpp b/drape_frontend/watch/geometry_processors.cpp new file mode 100644 index 0000000000..af5ac7d7fe --- /dev/null +++ b/drape_frontend/watch/geometry_processors.cpp @@ -0,0 +1,279 @@ +#include "geometry_processors.hpp" + +#include "std/bind.hpp" + +namespace df +{ +namespace watch +{ + +base_screen::base_screen(params const & p) + : base(p) +{ + m_convertor->GtoP(*p.m_rect, m_rect); +} + +void one_point::operator() (m2::PointD const & pt) +{ + ASSERT ( !m_exist, ("point feature should have only one point") ); + + if (m_rect->IsPointInside(pt)) + { + m_exist = true; + m_point = convert_point(pt); + } + else + m_exist = false; +} + +interval_params::interval_params(params const & p) + : base_t(p), + m_intervals(p.m_intervals), + m_length(0.0), + m_hasPrevPt(false) +{ +} + +void get_path_intervals::operator()(m2::PointD const & pt) +{ + if (m_hasPrevPt) + { + m2::PointD prev = m_prev; + m2::PointD cur = pt; + + double const segLen = cur.Length(prev); + + if (m2::Intersect(base_t::m_rect, prev, cur)) + { + double clipStart = prev.Length(m_prev) + m_length; + double clipEnd = cur.Length(m_prev) + m_length; + + if (m_intervals->empty()) + { + m_intervals->push_back(clipStart); + m_intervals->push_back(clipEnd); + } + else + { + if (my::AlmostEqualULPs(m_intervals->back(), clipStart)) + m_intervals->back() = clipEnd; + else + { + m_intervals->push_back(clipStart); + m_intervals->push_back(clipEnd); + } + } + } + + m_prev = pt; + m_length += segLen; + } + else + { + m_prev = pt; + m_hasPrevPt = true; + } +} + +bool get_path_intervals::IsExist() const +{ + return !m_intervals->empty(); +} + +void cut_path_intervals::operator()(m2::PointD const & pt) +{ + if (m_hasPrevPt) + { + double const segLen = pt.Length(m_prev); + + for (; m_pos != m_intervals->size(); m_pos += 2) + { + double const start = (*m_intervals)[m_pos]; + if (start >= m_length + segLen) + break; + + m2::PointD const dir = (pt - m_prev) / segLen; + + if (start >= m_length) + { + m_points.push_back(PathInfo(start)); + push_point(m_prev + dir * (start - m_length)); + } + + double const end = (*m_intervals)[m_pos+1]; + if (end >= m_length + segLen) + { + push_point(pt); + break; + } + + if (end < m_length + segLen) + { + push_point(m_prev + dir * (end - m_length)); +#ifdef DEBUG + double const len = m_points.back().GetLength(); + ASSERT_LESS_OR_EQUAL ( fabs(len - (end - start)), 1.0E-4, (len, end - start) ); +#endif + } + } + + m_prev = pt; + m_length += segLen; + } + else + { + m_hasPrevPt = true; + m_prev = pt; + } +} + +bool cut_path_intervals::IsExist() +{ + // finally, assign whole length to every cutted path + for_each(m_points.begin(), m_points.end(), + bind(&PathInfo::SetFullLength, _1, m_length)); + + return !m_points.empty(); +} + +void path_points::StartPL(m2::PointD const & pt) +{ + EndPL(); + + m_points.push_back(PathInfo(m_length + m_prev.Length(pt))); + push_point(pt); + + m_newPL = false; +} + +void path_points::EndPL() +{ + if (!m_points.empty() && m_points.back().size() < 2) + m_points.pop_back(); +} + +void path_points::simple_filtration(m2::PointD const & pt) +{ + if (m_hasPrevPt) + { + if (!m2::RectD(m_prev, pt).IsIntersect(m_rect)) + m_newPL = true; + else + { + if (m_newPL) + StartPL(m_prev); + + push_point(pt); + } + + m_length += m_prev.Length(pt); + } + else + { + m_hasPrevPt = true; + m_length = 0.0; + } + + m_prev = pt; +} + +void path_points::best_filtration(m2::PointD const & pt) +{ + if (m_hasPrevPt) + { + m2::PointD prev = m_prev; + m2::PointD curr = pt; + + double const segLen = curr.Length(prev); + + if ((m_startLength != 0) && (m_endLength != 0)) + { + if ((m_startLength >= m_length) && (m_startLength < m_length + segLen)) + m_startLength = m_length; + + if ((m_endLength > m_length) && (m_endLength <= m_length + segLen)) + m_endLength = m_length + segLen; + } + + if ((m_length >= m_startLength) && (m_endLength >= m_length + segLen)) + { + /// we're in the dead zone. add without clipping + if (m_newPL) + StartPL(prev); + + push_point(curr); + } + else + { + if (!m2::Intersect(m_rect, prev, curr)) + m_newPL = true; + else + { + if (!equal_glb_pts(prev, m_prev)) + m_newPL = true; + + if (m_newPL) + StartPL(prev); + + push_point(curr); + + if (!equal_glb_pts(curr, pt)) + m_newPL = true; + } + } + + m_length += segLen; + } + else + { + m_hasPrevPt = true; + m_length = 0.0; + } + + m_prev = pt; +} + +void path_points::operator() (m2::PointD const & p) +{ + // Choose simple (fast) or best (slow) filtration + + //simple_filtration(p); + best_filtration(p); +} + +bool path_points::IsExist() +{ + // finally, assign whole length to every cutted path + for_each(m_points.begin(), m_points.end(), + bind(&PathInfo::SetFullLength, _1, m_length)); + + EndPL(); + return base_type::IsExist(); +} + +void area_tess_points::StartPrimitive(size_t ptsCount) +{ + m_points.push_back(AreaInfo()); + m_points.back().reserve(ptsCount); +} + +void area_tess_points::operator() (m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3) +{ + push_point(p1); + push_point(p2); + push_point(p3); +} + +void area_tess_points::EndPrimitive() +{ + if (m_points.back().size() < 3) + m_points.pop_back(); +} + +bool area_tess_points::IsExist() const +{ + return !m_points.empty(); +} + +} +} diff --git a/drape_frontend/watch/geometry_processors.hpp b/drape_frontend/watch/geometry_processors.hpp new file mode 100644 index 0000000000..d3cc24b6ea --- /dev/null +++ b/drape_frontend/watch/geometry_processors.hpp @@ -0,0 +1,346 @@ +#pragma once + +#include "area_info.hpp" +#include "path_info.hpp" + +#include "indexer/cell_id.hpp" // CoordPointT + +#include "geometry/point2d.hpp" +#include "geometry/rect2d.hpp" +#include "geometry/rect_intersect.hpp" +#include "geometry/screenbase.hpp" + +#include "std/list.hpp" +#include "std/limits.hpp" + +#include "base/buffer_vector.hpp" + +class ScreenBase; + +namespace df +{ +namespace watch +{ + +/// @name Base class policies (use by inheritance) for points processing. +/// Containt next functions:\n +/// - make_point - convert from Feature point to Screen point +/// - convert_point - convert point to screen coordinates;\n +/// - m_rect - clip rect;\n + +//@{ +struct base +{ + struct params + { + ScreenBase const * m_convertor; + params() : m_convertor() + {} + }; + + base(params const & p) + : m_convertor(p.m_convertor) + { + } + + ScreenBase const * m_convertor; + + m2::PointD g2p(m2::PointD const & pt) const + { + return m_convertor->GtoP(pt); + } +}; + +/// in global coordinates +struct base_global : public base +{ + m2::RectD const * m_rect; + + m2::PointD convert_point(m2::PointD const & pt) const + { + return g2p(pt); + } + + struct params : base::params + { + m2::RectD const * m_rect; + params() : m_rect(0){} + }; + + base_global(params const & p) + : base(p), m_rect(p.m_rect) + { + } +}; + +/// in screen coordinates +struct base_screen : public base +{ + m2::RectD m_rect; + + struct params : base::params + { + m2::RectD const * m_rect; + params() : m_rect(0) + {} + }; + + base_screen(params const & p); + + m2::PointD convert_point(m2::PointD const & pt) const + { + return pt; + } +}; + +//@} + +template +struct calc_length : public TBase +{ + bool m_exist; + m2::PointD m_prevPt; + double m_length; + + typedef typename TBase::params params; + + calc_length(params const & p) : + TBase(p), m_exist(false), m_length(0) + {} + + void operator() (m2::PointD const & p) + { + m2::PointD const pt(this->convert_point(p)); + + if (m_exist) + m_length += pt.Length(m_prevPt); + + m_exist = true; + m_prevPt = pt; + } + + bool IsExist() const + { + return m_exist; + } +}; + +struct one_point : public base_global +{ + bool m_exist; + m2::PointD m_point; + + typedef base_global::params params; + + one_point(params const & p) + : base_global(p), m_exist(false) + { + } + + void operator() (m2::PointD const & pt); + + bool IsExist() const + { + return m_exist; + } +}; + +template +struct geometry_base : public TBase +{ +public: + list m_points; + + typedef typename TBase::params params; + + geometry_base(params const & p) + : TBase(p) + { + } + + bool IsExist() const + { + return !m_points.empty(); + } + + void push_point(m2::PointD const & pt) + { + /// @todo Filter for equal points. + m_points.back().push_back(this->convert_point(pt)); + } +}; + +struct interval_params : public geometry_base +{ + typedef geometry_base base_t; + + buffer_vector * m_intervals; + + m2::PointD m_prev; + double m_length; + bool m_hasPrevPt; + + struct params : base_t::params + { + buffer_vector * m_intervals; + params() : m_intervals(0) {} + }; + + interval_params(params const & p); +}; + +struct get_path_intervals : public interval_params +{ + get_path_intervals(params const & p) : interval_params(p) {} + + void operator() (m2::PointD const & pt); + + bool IsExist() const; +}; + +struct cut_path_intervals : public interval_params +{ + size_t m_pos; + + cut_path_intervals(params const & p) : interval_params(p), m_pos(0) {} + + void operator() (m2::PointD const & p); + + bool IsExist(); +}; + +class path_points : public geometry_base +{ + typedef geometry_base base_type; + + bool m_newPL, m_hasPrevPt; + m2::PointD m_prev; + + double m_length; + double m_startLength; + double m_endLength; + + void StartPL(m2::PointD const & pt); + void EndPL(); + + static bool equal_glb_pts(m2::PointD const & p1, m2::PointD const & p2) + { + return p1.EqualDxDy(p2, 1.0E-12); + } + + void simple_filtration(m2::PointD const & p); + void best_filtration(m2::PointD const & p); + +public: + + struct params : base_type::params + { + double m_startLength; + double m_endLength; + params() : m_startLength(0), m_endLength(0) + {} + }; + + path_points(params const & p) + : base_type(p), + m_newPL(true), + m_hasPrevPt(false), + m_length(0.0), + m_startLength(p.m_startLength), + m_endLength(p.m_endLength) + { + } + + void operator() (m2::PointD const & p); + + bool IsExist(); +}; + +/// @name Policies for filling area. +//@{ +class area_base : public geometry_base +{ + typedef geometry_base base_type; + +public: + + typedef base_type::params params; + + area_base(params const & p) + : base_type(p) + { + } +}; + +/// Used for triangle draw policy. +class area_tess_points : public area_base +{ +public: + typedef area_base::params params; + + area_tess_points(params const & p) + : area_base(p) + { + } + + void StartPrimitive(size_t ptsCount); + void operator() (m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3); + void EndPrimitive(); + + bool IsExist() const; +}; +//@} + +/// Adapter for points filtering, before they will go for processing +template class filter_screenpts_adapter : public TBase +{ + m2::PointD m_prev, m_center; + + static bool equal_scr_pts(m2::PointD const & p1, m2::PointD const & p2) + { + return p1.EqualDxDy(p2, 0.5); + } + static bool empty_scr_rect(m2::RectD const & r) + { + double const eps = 1.0; + return (r.SizeX() < eps && r.SizeY() < eps); + } + +public: + + typedef typename TBase::params params; + + filter_screenpts_adapter(params const & p) + : TBase(p), + m_prev(numeric_limits::min(), numeric_limits::min()), m_center(0, 0) + { + } + + void operator() (m2::PointD const & p) + { + m2::PointD const pt = this->g2p(p); + if (!equal_scr_pts(m_prev, pt)) + { + TBase::operator()(pt); + m_prev = pt; + } + } + + void operator() (m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3) + { + m2::PointD arr[] = { this->g2p(p1), this->g2p(p2), this->g2p(p3) }; + + m2::RectD r; + for (int i = 0; i < 3; ++i) + r.Add(arr[i]); + + if (!empty_scr_rect(r) && r.IsIntersect(this->m_rect)) + TBase::operator()(arr[0], arr[1], arr[2]); + } + + m2::PointD GetCenter() const { return m_center; } + void SetCenter(m2::PointD const & p) { m_center = this->g2p(p); } +}; + +} +} diff --git a/drape_frontend/watch/glyph_cache.cpp b/drape_frontend/watch/glyph_cache.cpp new file mode 100644 index 0000000000..4168615a1b --- /dev/null +++ b/drape_frontend/watch/glyph_cache.cpp @@ -0,0 +1,119 @@ +#include "drape_frontend/watch/glyph_cache.hpp" +#include "drape_frontend/watch/glyph_cache_impl.hpp" + +#include "3party/fribidi/lib/fribidi.h" + +namespace df +{ +namespace watch +{ + +GlyphKey::GlyphKey(strings::UniChar symbolCode, + int fontSize, + bool isMask, + dp::Color const & color) + : m_symbolCode(symbolCode), + m_fontSize(fontSize), + m_isMask(isMask), + m_color(color) +{} + +GlyphKey::GlyphKey() + : m_symbolCode(0), + m_fontSize(), + m_isMask(), + m_color() +{} + +bool operator<(GlyphKey const & l, GlyphKey const & r) +{ + if (l.m_symbolCode != r.m_symbolCode) + return l.m_symbolCode < r.m_symbolCode; + if (l.m_fontSize != r.m_fontSize) + return l.m_fontSize < r.m_fontSize; + if (l.m_isMask != r.m_isMask) + return l.m_isMask < r.m_isMask; + return l.m_color < r.m_color; +} + +bool operator!=(GlyphKey const & l, GlyphKey const & r) +{ + return (l.m_symbolCode != r.m_symbolCode) + || (l.m_fontSize != r.m_fontSize) + || (l.m_isMask != r.m_isMask) + || !(l.m_color == r.m_color); +} + +GlyphCache::Params::Params(string const & blocksFile, + string const & whiteListFile, + string const & blackListFile, + size_t maxSize, + double visualScale, + bool isDebugging) + : m_blocksFile(blocksFile), + m_whiteListFile(whiteListFile), + m_blackListFile(blackListFile), + m_maxSize(maxSize), + m_visualScale(visualScale), + m_isDebugging(isDebugging) +{} + +GlyphCache::GlyphCache() +{} + +GlyphCache::GlyphCache(Params const & params) : m_impl(new GlyphCacheImpl(params)) +{ +} + +void GlyphCache::addFonts(vector const & fontNames) +{ + m_impl->addFonts(fontNames); +} + +pair GlyphCache::getCharIDX(GlyphKey const & key) +{ + return m_impl->getCharIDX(key); +} + +GlyphMetrics const GlyphCache::getGlyphMetrics(GlyphKey const & key) +{ + return m_impl->getGlyphMetrics(key); +} + +shared_ptr const GlyphCache::getGlyphBitmap(GlyphKey const & key) +{ + return m_impl->getGlyphBitmap(key); +} + +double GlyphCache::getTextLength(double fontSize, string const & text) +{ + strings::UniString const s = strings::MakeUniString(text); + double len = 0; + for (unsigned i = 0; i < s.size(); ++i) + { + GlyphKey k(s[i], static_cast(fontSize), false, dp::Color(0, 0, 0, 255)); + len += getGlyphMetrics(k).m_xAdvance; + } + + return len; +} + +threads::Mutex GlyphCache::s_fribidiMutex; + +strings::UniString GlyphCache::log2vis(strings::UniString const & str) +{ + size_t const count = str.size(); + if (count == 0) + return str; + + strings::UniString res(count); + + //FriBidiEnv env; + threads::MutexGuard g(s_fribidiMutex); + FriBidiParType dir = FRIBIDI_PAR_LTR; // requested base direction + fribidi_log2vis(&str[0], count, &dir, &res[0], 0, 0, 0); + return res; +} + +} +} diff --git a/drape_frontend/watch/glyph_cache.hpp b/drape_frontend/watch/glyph_cache.hpp new file mode 100644 index 0000000000..9864c6bae0 --- /dev/null +++ b/drape_frontend/watch/glyph_cache.hpp @@ -0,0 +1,102 @@ +#pragma once + +#include "drape/drape_global.hpp" + +#include "base/string_utils.hpp" +#include "base/mutex.hpp" + +#include "std/shared_ptr.hpp" +#include "std/vector.hpp" +#include "std/string.hpp" +#include "std/utility.hpp" + +namespace df +{ +namespace watch +{ + +/// metrics of the single glyph +struct GlyphMetrics +{ + int m_xAdvance; + int m_yAdvance; + int m_xOffset; + int m_yOffset; + int m_width; + int m_height; +}; + +struct GlyphBitmap +{ + unsigned m_width; + unsigned m_height; + unsigned m_pitch; + vector m_data; +}; + +struct GlyphKey +{ + strings::UniChar m_symbolCode; + int m_fontSize; + bool m_isMask; + dp::Color m_color; + + GlyphKey(strings::UniChar symbolCode, + int fontSize, + bool isMask, + dp::Color const & color); + GlyphKey(); +}; + +struct Font; + +bool operator<(GlyphKey const & l, GlyphKey const & r); +bool operator!=(GlyphKey const & l, GlyphKey const & r); + +struct GlyphCacheImpl; + +class GlyphCache +{ +private: + + shared_ptr m_impl; + + static threads::Mutex s_fribidiMutex; + +public: + + struct Params + { + string m_blocksFile; + string m_whiteListFile; + string m_blackListFile; + size_t m_maxSize; + double m_visualScale; + bool m_isDebugging; + Params(string const & blocksFile, + string const & whiteListFile, + string const & blackListFile, + size_t maxSize, + double visualScale, + bool isDebugging); + }; + + GlyphCache(); + GlyphCache(Params const & params); + + void reset(); + void addFonts(vector const & fontNames); + + pair getCharIDX(GlyphKey const & key); + + shared_ptr const getGlyphBitmap(GlyphKey const & key); + /// return control box(could be slightly larger than the precise bound box). + GlyphMetrics const getGlyphMetrics(GlyphKey const & key); + + double getTextLength(double fontSize, string const & text); + + static strings::UniString log2vis(strings::UniString const & str); +}; + +} +} diff --git a/drape_frontend/watch/glyph_cache_impl.cpp b/drape_frontend/watch/glyph_cache_impl.cpp new file mode 100644 index 0000000000..714da08f4d --- /dev/null +++ b/drape_frontend/watch/glyph_cache_impl.cpp @@ -0,0 +1,588 @@ +#include "drape_frontend/watch/glyph_cache_impl.hpp" + +#include "platform/platform.hpp" + +#include "coding/reader.hpp" + +#include "base/assert.hpp" +#include "base/logging.hpp" + +#include "std/bind.hpp" +#include "std/cstring.hpp" + +#include + +#define FREETYPE_CHECK(x) x +#define FREETYPE_CHECK_RETURN(x, msg) FREETYPE_CHECK(x) + +namespace df +{ +namespace watch +{ + +UnicodeBlock::UnicodeBlock(string const & name, strings::UniChar start, strings::UniChar end) + : m_name(name), m_start(start), m_end(end) +{} + +bool UnicodeBlock::hasSymbol(strings::UniChar sym) const +{ + return (m_start <= sym) && (m_end >= sym); +} + +/// Called by FreeType to read data +static unsigned long FTStreamIOFunc(FT_Stream stream, + unsigned long offset, + unsigned char * buffer, + unsigned long count) +{ + // FreeType can call us with 0 to "Skip" bytes + if (count != 0) + reinterpret_cast *>(stream->descriptor.pointer)->Read(offset, buffer, count); + return count; +} + +static void FTStreamCloseFunc(FT_Stream) +{ +} + +Font::Font(ReaderPtr const & fontReader) : m_fontReader(fontReader) +{ + m_fontStream = new FT_StreamRec; + m_fontStream->base = 0; + m_fontStream->size = m_fontReader.Size(); + m_fontStream->pos = 0; + m_fontStream->descriptor.pointer = &m_fontReader; + m_fontStream->pathname.pointer = 0; + m_fontStream->read = &FTStreamIOFunc; + m_fontStream->close = &FTStreamCloseFunc; + m_fontStream->memory = 0; + m_fontStream->cursor = 0; + m_fontStream->limit = 0; +} + +Font::~Font() +{ + delete m_fontStream; +} + +FT_Error Font::CreateFaceID(FT_Library library, FT_Face * face) +{ + FT_Open_Args args; + args.flags = FT_OPEN_STREAM; + args.memory_base = 0; + args.memory_size = 0; + args.pathname = 0; + args.stream = m_fontStream; + args.driver = 0; + args.num_params = 0; + args.params = 0; + return FT_Open_Face(library, &args, 0, face); + //return FT_New_Memory_Face(library, (unsigned char*)m_fontData.data(), m_fontData.size(), 0, face); +} + +void GlyphCacheImpl::initBlocks(string const & fileName) +{ + string buffer; + try + { + ReaderPtr(GetPlatform().GetReader(fileName)).ReadAsString(buffer); + } + catch (RootException const & e) + { + LOG(LERROR, ("Error reading unicode blocks: ", e.what())); + return; + } + + istringstream fin(buffer); + while (true) + { + string name; + strings::UniChar start; + strings::UniChar end; + fin >> name >> std::hex >> start >> std::hex >> end; + if (!fin) + break; + + m_unicodeBlocks.push_back(UnicodeBlock(name, start, end)); + } + + m_lastUsedBlock = m_unicodeBlocks.end(); +} + +bool find_ub_by_name(string const & ubName, UnicodeBlock const & ub) +{ + return ubName == ub.m_name; +} + +void GlyphCacheImpl::initFonts(string const & whiteListFile, string const & blackListFile) +{ + { + string buffer; + try + { + ReaderPtr(GetPlatform().GetReader(whiteListFile)).ReadAsString(buffer); + } + catch (RootException const & e) + { + LOG(LERROR, ("Error reading white list fonts: ", e.what())); + return; + } + + istringstream fin(buffer); + while (true) + { + string ubName; + string fontName; + fin >> ubName >> fontName; + if (!fin) + break; + + LOG(LDEBUG, ("whitelisting ", fontName, " for ", ubName)); + + if (ubName == "*") + for (unicode_blocks_t::iterator it = m_unicodeBlocks.begin(); it != m_unicodeBlocks.end(); ++it) + it->m_whitelist.push_back(fontName); + else + { + unicode_blocks_t::iterator it = find_if(m_unicodeBlocks.begin(), m_unicodeBlocks.end(), bind(&find_ub_by_name, ubName, _1)); + if (it != m_unicodeBlocks.end()) + it->m_whitelist.push_back(fontName); + } + } + } + + { + string buffer; + try + { + ReaderPtr(GetPlatform().GetReader(blackListFile)).ReadAsString(buffer); + } + catch (RootException const & e) + { + LOG(LERROR, ("Error reading black list fonts: ", e.what())); + return; + } + + istringstream fin(buffer); + while (true) + { + string ubName; + string fontName; + fin >> ubName >> fontName; + if (!fin) + break; + + LOG(LDEBUG, ("blacklisting ", fontName, " for ", ubName)); + + if (ubName == "*") + for (unicode_blocks_t::iterator it = m_unicodeBlocks.begin(); it != m_unicodeBlocks.end(); ++it) + it->m_blacklist.push_back(fontName); + else + { + unicode_blocks_t::iterator it = find_if(m_unicodeBlocks.begin(), m_unicodeBlocks.end(), bind(&find_ub_by_name, ubName, _1)); + if (it != m_unicodeBlocks.end()) + it->m_blacklist.push_back(fontName); + } + } + } +} + +bool greater_coverage(pair > const & l, pair > const & r) +{ + return l.first > r.first; +} + +void GlyphCacheImpl::addFonts(vector const & fontNames) +{ + if (m_isDebugging) + return; + + for (size_t i = 0; i < fontNames.size(); ++i) + { + try + { + addFont(fontNames[i].c_str()); + } + catch (RootException const & ex) + { + LOG(LERROR, ("Can't load font", fontNames[i], ex.Msg())); + } + } +} + +void GlyphCacheImpl::addFont(char const * fileName) +{ + if (m_isDebugging) + return; + + shared_ptr pFont(new Font(GetPlatform().GetReader(fileName))); + + // Obtaining all glyphs, supported by this font. Call to FTCHECKRETURN functions may return + // from routine, so add font to fonts array only in the end. + + FT_Face face; + FREETYPE_CHECK_RETURN(pFont->CreateFaceID(m_lib, &face), fileName); + + vector charcodes; + + FT_UInt gindex; + charcodes.push_back(FT_Get_First_Char(face, &gindex)); + while (gindex) + charcodes.push_back(FT_Get_Next_Char(face, charcodes.back(), &gindex)); + + sort(charcodes.begin(), charcodes.end()); + charcodes.erase(unique(charcodes.begin(), charcodes.end()), charcodes.end()); + + FREETYPE_CHECK_RETURN(FT_Done_Face(face), fileName); + + m_fonts.push_back(pFont); + + // modifying the m_unicodeBlocks + unicode_blocks_t::iterator ubIt = m_unicodeBlocks.begin(); + vector::iterator ccIt = charcodes.begin(); + + while (ccIt != charcodes.end()) + { + while (ubIt != m_unicodeBlocks.end()) + { + ASSERT ( ccIt != charcodes.end(), () ); + if (ubIt->hasSymbol(*ccIt)) + break; + ++ubIt; + } + + if (ubIt == m_unicodeBlocks.end()) + break; + + // here we have unicode block, which contains the specified symbol. + if (ubIt->m_fonts.empty() || (ubIt->m_fonts.back() != m_fonts.back())) + { + ubIt->m_fonts.push_back(m_fonts.back()); + ubIt->m_coverage.push_back(0); + + // checking blacklist and whitelist + + for (size_t i = 0; i < ubIt->m_blacklist.size(); ++i) + if (ubIt->m_blacklist[i] == fileName) + { + // if font is blacklisted for this unicode block + ubIt->m_coverage.back() = -1; + } + + for (size_t i = 0; i < ubIt->m_whitelist.size(); ++i) + if (ubIt->m_whitelist[i] == fileName) + { + if (ubIt->m_coverage.back() == -1) + { + LOG(LWARNING, ("font ", fileName, "is present both at blacklist and whitelist. whitelist prevails.")); + } + // weight used for sorting are boosted to the top. + // the order of elements are saved by adding 'i' value as a shift. + ubIt->m_coverage.back() = ubIt->m_end + 1 - ubIt->m_start + i + 1; + } + } + + if ((ubIt->m_coverage.back() >= 0) && (ubIt->m_coverage.back() < ubIt->m_end + 1 - ubIt->m_start)) + ++ubIt->m_coverage.back(); + ++ccIt; + } + + // rearrange fonts in all unicode blocks according to it's coverage + for (ubIt = m_unicodeBlocks.begin(); ubIt != m_unicodeBlocks.end(); ++ubIt) + { + /// @todo Make sorting of 2 vectors ubIt->m_coverage, ubIt->m_fonts + /// with one criteria without temporary vector sortData. + + size_t const count = ubIt->m_fonts.size(); + + vector > > sortData; + sortData.reserve(count); + + for (size_t i = 0; i < count; ++i) + sortData.push_back(make_pair(ubIt->m_coverage[i], ubIt->m_fonts[i])); + + sort(sortData.begin(), sortData.end(), &greater_coverage); + + for (size_t i = 0; i < count; ++i) + { + ubIt->m_coverage[i] = sortData[i].first; + ubIt->m_fonts[i] = sortData[i].second; + } + } +} + +struct sym_in_block +{ + bool operator() (UnicodeBlock const & b, strings::UniChar sym) const + { + return (b.m_start < sym); + } + bool operator() (strings::UniChar sym, UnicodeBlock const & b) const + { + return (sym < b.m_start); + } + bool operator() (UnicodeBlock const & b1, UnicodeBlock const & b2) const + { + return (b1.m_start < b2.m_start); + } +}; + +vector > & GlyphCacheImpl::getFonts(strings::UniChar sym) +{ + if ((m_lastUsedBlock != m_unicodeBlocks.end()) && m_lastUsedBlock->hasSymbol(sym)) + return m_lastUsedBlock->m_fonts; + + unicode_blocks_t::iterator it = lower_bound(m_unicodeBlocks.begin(), + m_unicodeBlocks.end(), + sym, + sym_in_block()); + + if (it == m_unicodeBlocks.end()) + it = m_unicodeBlocks.end()-1; + else + if (it != m_unicodeBlocks.begin()) + it = it-1; + + m_lastUsedBlock = it; + + if ((it != m_unicodeBlocks.end()) && it->hasSymbol(sym)) + { + if (it->m_fonts.empty()) + { + LOG(LDEBUG, ("querying symbol for empty ", it->m_name, " unicode block")); + ASSERT(!m_fonts.empty(), ("Empty fonts container")); + + it->m_fonts.push_back(m_fonts.front()); + } + + return it->m_fonts; + } + else + return m_fonts; +} + + +GlyphCacheImpl::GlyphCacheImpl(GlyphCache::Params const & params) +{ + m_isDebugging = params.m_isDebugging; + + initBlocks(params.m_blocksFile); + initFonts(params.m_whiteListFile, params.m_blackListFile); + + if (!m_isDebugging) + { + FREETYPE_CHECK(FT_Init_FreeType(&m_lib)); + + /// Initializing caches + FREETYPE_CHECK(FTC_Manager_New(m_lib, 3, 10, params.m_maxSize, &RequestFace, 0, &m_manager)); + + FREETYPE_CHECK(FTC_ImageCache_New(m_manager, &m_normalGlyphCache)); + FREETYPE_CHECK(FTC_StrokedImageCache_New(m_manager, &m_strokedGlyphCache)); + + FREETYPE_CHECK(FTC_ImageCache_New(m_manager, &m_normalMetricsCache)); + FREETYPE_CHECK(FTC_StrokedImageCache_New(m_manager, &m_strokedMetricsCache)); + + /// Initializing stroker + FREETYPE_CHECK(FT_Stroker_New(m_lib, &m_stroker)); + FT_Stroker_Set(m_stroker, FT_Fixed(params.m_visualScale * 2 * 64), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); + + FREETYPE_CHECK(FTC_CMapCache_New(m_manager, &m_charMapCache)); + } + else + { + /// initialize fake bitmap + } +} + +GlyphCacheImpl::~GlyphCacheImpl() +{ + if (!m_isDebugging) + { + FTC_Manager_Done(m_manager); + FT_Stroker_Done(m_stroker); + FT_Done_FreeType(m_lib); + } +} + +int GlyphCacheImpl::getCharIDX(shared_ptr const & font, strings::UniChar symbolCode) +{ + if (m_isDebugging) + return 0; + + FTC_FaceID faceID = reinterpret_cast(font.get()); + + return FTC_CMapCache_Lookup( + m_charMapCache, + faceID, + -1, + symbolCode + ); +} + +pair const GlyphCacheImpl::getCharIDX(GlyphKey const & key) +{ + if (m_isDebugging) + return make_pair((Font*)0, 0); + + vector > & fonts = getFonts(key.m_symbolCode); + + Font * font = 0; + + int charIDX; + + for (size_t i = 0; i < fonts.size(); ++i) + { + charIDX = getCharIDX(fonts[i], key.m_symbolCode); + + if (charIDX != 0) + return make_pair(fonts[i].get(), charIDX); + } + +#ifdef DEBUG + + for (size_t i = 0; i < m_unicodeBlocks.size(); ++i) + { + if (m_unicodeBlocks[i].hasSymbol(key.m_symbolCode)) + { + LOG(LDEBUG, ("Symbol", key.m_symbolCode, "not found, unicodeBlock=", m_unicodeBlocks[i].m_name)); + break; + } + } + +#endif + + font = fonts.front().get(); + + /// taking substitution character from the first font in the list + charIDX = getCharIDX(fonts.front(), 65533); + if (charIDX == 0) + charIDX = getCharIDX(fonts.front(), 32); + + return make_pair(font, charIDX); +} + +GlyphMetrics const GlyphCacheImpl::getGlyphMetrics(GlyphKey const & key) +{ + pair charIDX = getCharIDX(key); + + FTC_ScalerRec fontScaler = + { + static_cast(charIDX.first), + static_cast(key.m_fontSize), + static_cast(key.m_fontSize), + 1, + 0, + 0 + }; + + FT_Glyph glyph = 0; + + if (key.m_isMask) + { + FREETYPE_CHECK(FTC_StrokedImageCache_LookupScaler( + m_strokedMetricsCache, + &fontScaler, + m_stroker, + FT_LOAD_DEFAULT, + charIDX.second, + &glyph, + 0)); + } + else + { + FREETYPE_CHECK(FTC_ImageCache_LookupScaler( + m_normalMetricsCache, + &fontScaler, + FT_LOAD_DEFAULT, + charIDX.second, + &glyph, + 0)); + } + + FT_BBox cbox; + FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_PIXELS, &cbox); + + GlyphMetrics m = + { + static_cast(glyph->advance.x >> 16), + static_cast(glyph->advance.y >> 16), + static_cast(cbox.xMin), + static_cast(cbox.yMin), + static_cast(cbox.xMax - cbox.xMin), + static_cast(cbox.yMax - cbox.yMin) + }; + + return m; +} + +shared_ptr const GlyphCacheImpl::getGlyphBitmap(GlyphKey const & key) +{ + pair charIDX = getCharIDX(key); + + FTC_ScalerRec fontScaler = + { + static_cast(charIDX.first), + static_cast(key.m_fontSize), + static_cast(key.m_fontSize), + 1, + 0, + 0 + }; + + FT_Glyph glyph = 0; + FTC_Node node; + + if (key.m_isMask) + { + FREETYPE_CHECK(FTC_StrokedImageCache_LookupScaler( + m_strokedGlyphCache, + &fontScaler, + m_stroker, + FT_LOAD_DEFAULT, + charIDX.second, + &glyph, + &node + )); + } + else + { + FREETYPE_CHECK(FTC_ImageCache_LookupScaler( + m_normalGlyphCache, + &fontScaler, + FT_LOAD_DEFAULT | FT_LOAD_RENDER, + charIDX.second, + &glyph, + &node + )); + } + + GlyphBitmap * bitmap = new GlyphBitmap(); + + FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph; + + bitmap->m_width = bitmapGlyph ? bitmapGlyph->bitmap.width : 0; + bitmap->m_height = bitmapGlyph ? bitmapGlyph->bitmap.rows : 0; + bitmap->m_pitch = bitmapGlyph ? bitmapGlyph->bitmap.pitch : 0; + + if (bitmap->m_width && bitmap->m_height) + { + bitmap->m_data.resize(bitmap->m_pitch * bitmap->m_height); + memcpy(&bitmap->m_data[0], + bitmapGlyph->bitmap.buffer, + bitmap->m_pitch * bitmap->m_height); + } + + FTC_Node_Unref(node, m_manager); + + return shared_ptr(bitmap); +} + +FT_Error GlyphCacheImpl::RequestFace(FTC_FaceID faceID, FT_Library library, FT_Pointer /*requestData*/, FT_Face * face) +{ + //GlyphCacheImpl * glyphCacheImpl = reinterpret_cast(requestData); + Font * font = reinterpret_cast(faceID); + return font->CreateFaceID(library, face); +} + +} +} diff --git a/drape_frontend/watch/glyph_cache_impl.hpp b/drape_frontend/watch/glyph_cache_impl.hpp new file mode 100644 index 0000000000..395e99b237 --- /dev/null +++ b/drape_frontend/watch/glyph_cache_impl.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include "drape_frontend/watch/glyph_cache.hpp" + +#include +#include FT_TYPES_H +#include FT_SYSTEM_H +#include FT_FREETYPE_H +#include FT_STROKER_H +#include FT_CACHE_H + +#include "base/string_utils.hpp" + +#include "coding/reader.hpp" + +#include "std/string.hpp" +#include "std/vector.hpp" +#include "std/shared_ptr.hpp" + +namespace df +{ +namespace watch +{ + +struct Font +{ + FT_Stream m_fontStream; + ReaderPtr m_fontReader; + + /// information about symbol ranges + /// ... + /// constructor + Font(ReaderPtr const & fontReader); + ~Font(); + + FT_Error CreateFaceID(FT_Library library, FT_Face * face); +}; + +/// Information about single unicode block. +struct UnicodeBlock +{ + string m_name; + + /// @{ font matching tuning + /// whitelist has priority over the blacklist in case of duplicates. + /// this fonts are promoted to the top of the font list for this block. + vector m_whitelist; + /// this fonts are removed from the font list for this block. + vector m_blacklist; + /// @} + + strings::UniChar m_start; + strings::UniChar m_end; + /// sorted indices in m_fonts, from the best to the worst + vector > m_fonts; + /// coverage of each font, in symbols + vector m_coverage; + + UnicodeBlock(string const & name, strings::UniChar start, strings::UniChar end); + bool hasSymbol(strings::UniChar sym) const; +}; + +struct GlyphCacheImpl +{ + FT_Library m_lib; + FT_Stroker m_stroker; + + FTC_Manager m_manager; //< freetype cache manager for all caches + + FTC_ImageCache m_normalMetricsCache; //< cache of normal glyph metrics + FTC_ImageCache m_strokedMetricsCache; //< cache of stroked glyph metrics + + FTC_ImageCache m_normalGlyphCache; //< cache of normal glyph images + FTC_ImageCache m_strokedGlyphCache; //< cache of stroked glyph images + + FTC_CMapCache m_charMapCache; //< cache of glyphID -> glyphIdx mapping + + typedef vector unicode_blocks_t; + unicode_blocks_t m_unicodeBlocks; + unicode_blocks_t::iterator m_lastUsedBlock; + bool m_isDebugging; + + typedef vector > TFonts; + TFonts m_fonts; + + static FT_Error RequestFace(FTC_FaceID faceID, FT_Library library, FT_Pointer requestData, FT_Face * face); + + void initBlocks(string const & fileName); + void initFonts(string const & whiteListFile, string const & blackListFile); + + vector > & getFonts(strings::UniChar sym); + void addFont(char const * fileName); + void addFonts(vector const & fontNames); + + int getCharIDX(shared_ptr const & font, strings::UniChar symbolCode); + pair const getCharIDX(GlyphKey const & key); + GlyphMetrics const getGlyphMetrics(GlyphKey const & key); + shared_ptr const getGlyphBitmap(GlyphKey const & key); + + GlyphCacheImpl(GlyphCache::Params const & params); + ~GlyphCacheImpl(); +}; + +} +} diff --git a/drape_frontend/watch/icon_info.hpp b/drape_frontend/watch/icon_info.hpp new file mode 100644 index 0000000000..69918fe6f1 --- /dev/null +++ b/drape_frontend/watch/icon_info.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "std/string.hpp" + +namespace df +{ +namespace watch +{ + +struct IconInfo +{ + string m_name; + + IconInfo() = default; + explicit IconInfo(string const & name) : m_name(name) {} +}; + +} +} diff --git a/drape_frontend/watch/path_info.hpp b/drape_frontend/watch/path_info.hpp new file mode 100644 index 0000000000..19c8c4c5ef --- /dev/null +++ b/drape_frontend/watch/path_info.hpp @@ -0,0 +1,101 @@ +#pragma once + +#include "geometry/point2d.hpp" +#include "geometry/rect2d.hpp" + +#include "std/vector.hpp" +#include "std/algorithm.hpp" + +namespace df +{ +namespace watch +{ + +class PathInfo +{ + double m_fullL; + double m_offset; + +public: + vector m_path; + + // -1.0 means "not" initialized + PathInfo(double offset = -1.0) : m_fullL(-1.0), m_offset(offset) {} + + void swap(PathInfo & r) + { + m_path.swap(r.m_path); + std::swap(m_fullL, r.m_fullL); + std::swap(m_offset, r.m_offset); + } + + void push_back(m2::PointD const & p) + { + m_path.push_back(p); + } + + size_t size() const { return m_path.size(); } + + void SetFullLength(double len) { m_fullL = len; } + double GetFullLength() const + { + ASSERT ( m_fullL > 0.0, (m_fullL) ); + return m_fullL; + } + + double GetLength() const + { + double sum = 0.0; + for (size_t i = 1; i < m_path.size(); ++i) + { + double const l = m_path[i-1].Length(m_path[i]); + sum += l; + } + return sum; + } + + double GetOffset() const + { + ASSERT ( m_offset >= 0.0, (m_offset) ); + return m_offset; + } + + bool GetSmPoint(double part, m2::PointD & pt) const + { + double sum = -GetFullLength() * part + m_offset; + if (sum > 0.0) return false; + + for (size_t i = 1; i < m_path.size(); ++i) + { + double const l = m_path[i-1].Length(m_path[i]); + sum += l; + if (sum >= 0.0) + { + double const factor = (l - sum) / l; + ASSERT_GREATER_OR_EQUAL ( factor, 0.0, () ); + + pt.x = factor * (m_path[i].x - m_path[i-1].x) + m_path[i-1].x; + pt.y = factor * (m_path[i].y - m_path[i-1].y) + m_path[i-1].y; + return true; + } + } + + return false; + } + + m2::RectD GetLimitRect() const + { + m2::RectD rect; + for (size_t i = 0; i < m_path.size(); ++i) + rect.Add(m_path[i]); + return rect; + } +}; + +} +} + +inline void swap(df::watch::PathInfo & p1, df::watch::PathInfo & p2) +{ + p1.swap(p2); +} diff --git a/drape_frontend/watch/pen_info.hpp b/drape_frontend/watch/pen_info.hpp new file mode 100644 index 0000000000..b51a3daac5 --- /dev/null +++ b/drape_frontend/watch/pen_info.hpp @@ -0,0 +1,122 @@ +#pragma once + +#include "drape_frontend/watch/icon_info.hpp" + +#include "drape/drape_global.hpp" + +#include "base/buffer_vector.hpp" +#include "base/math.hpp" + +namespace df +{ +namespace watch +{ + +struct PenInfo +{ + typedef buffer_vector TPattern; + dp::Color m_color; + double m_w; + TPattern m_pat; + double m_offset; + IconInfo m_icon; + double m_step; + dp::LineJoin m_join; + dp::LineCap m_cap; + + bool m_isSolid; + + PenInfo(dp::Color const & color = dp::Color(0, 0, 0, 255), + double width = 1.0, + double const * pattern = 0, + size_t patternSize = 0, + double offset = 0, + char const * symbol = 0, + double step = 0, + dp::LineJoin join = dp::RoundJoin, + dp::LineCap cap = dp::RoundCap) + : m_color(color) + , m_w(width) + , m_offset(offset) + , m_step(step) + , m_join(join) + , m_cap(cap) + , m_isSolid(false) + { + if (symbol != nullptr) + m_icon = IconInfo(symbol); + + if (!m_icon.m_name.empty()) + { + m_isSolid = false; + } + else + { + /// if pattern is solid + if ((pattern == 0 ) || (patternSize == 0)) + m_isSolid = true; + else + { + // hack for Samsung GT-S5570 (GPU floor()'s texture pattern width) + m_w = max(m_w, 1.0); + + buffer_vector tmpV; + copy(pattern, pattern + patternSize, back_inserter(tmpV)); + + if (tmpV.size() % 2) + tmpV.push_back(0); + + double length = 0; + + /// ensuring that a minimal element has a length of 2px + for (size_t i = 0; i < tmpV.size(); ++i) + { + if ((tmpV[i] < 2) && (tmpV[i] > 0)) + tmpV[i] = 2; + length += tmpV[i]; + } + + int i = 0; + + buffer_vector vec; + + if ((offset >= length) || (offset < 0)) + offset -= floor(offset / length) * length; + + double curLen = 0; + + /// shifting pattern + while (true) + { + if (curLen + tmpV[i] > offset) + { + //we're inside, let's split the pattern + + if (i % 2 == 1) + vec.push_back(0); + + vec.push_back(curLen + tmpV[i] - offset); + copy(tmpV.begin() + i + 1, tmpV.end(), back_inserter(vec)); + copy(tmpV.begin(), tmpV.begin() + i, back_inserter(vec)); + vec.push_back(offset - curLen); + + if (i % 2 == 0) + vec.push_back(0); + + break; + } + else + curLen += tmpV[i++]; + } + + int periods = max(int((256 - 4) / length), 1); + m_pat.reserve(periods * vec.size()); + for (int i = 0; i < periods; ++i) + copy(vec.begin(), vec.end(), back_inserter(m_pat)); + } + } + } +}; + +} +} diff --git a/render/point.h b/drape_frontend/watch/point.h similarity index 99% rename from render/point.h rename to drape_frontend/watch/point.h index fe5e4e09cc..9c4c400749 100644 --- a/render/point.h +++ b/drape_frontend/watch/point.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef __IA__POINT__ +#define __IA__POINT__ #include #include @@ -257,5 +258,6 @@ inline std::ostream & operator<<(std::ostream & s, point_base const & p) typedef point_base point_d; typedef point_base point_i; +} -} // namespace ml +#endif diff --git a/render/proto_to_styles.cpp b/drape_frontend/watch/proto_to_styles.cpp similarity index 53% rename from render/proto_to_styles.cpp rename to drape_frontend/watch/proto_to_styles.cpp index c0a2eae618..8d745761ca 100644 --- a/render/proto_to_styles.cpp +++ b/drape_frontend/watch/proto_to_styles.cpp @@ -4,21 +4,27 @@ #include "std/algorithm.hpp" - namespace { - double ConvertWidth(double w, double scale) - { - return max(w * scale, 1.0); - } -} -graphics::Color ConvertColor(uint32_t c) +double ConvertWidth(double w, double scale) { - return graphics::Color::fromXRGB(c, 255 - (c >> 24)); + return max(w * scale, 1.0); } -void ConvertStyle(LineDefProto const * pSrc, double scale, graphics::Pen::Info & dest) +} + +namespace df +{ +namespace watch +{ + +dp::Color ConvertColor(uint32_t c) +{ + return dp::Extract(c, 255 - (c >> 24)); +} + +void ConvertStyle(LineDefProto const * pSrc, double scale, PenInfo & dest) { double offset = 0.0; vector v; @@ -36,10 +42,9 @@ void ConvertStyle(LineDefProto const * pSrc, double scale, graphics::Pen::Info & offset = dd.offset() * scale; } - dest = graphics::Pen::Info( - ConvertColor(pSrc->color()), - ConvertWidth(pSrc->width(), scale), - v.empty() ? 0 : &v[0], v.size(), offset); + dest = PenInfo(ConvertColor(pSrc->color()), + ConvertWidth(pSrc->width(), scale), + v.empty() ? 0 : &v[0], v.size(), offset); if (pSrc->has_pathsym()) { @@ -57,13 +62,13 @@ void ConvertStyle(LineDefProto const * pSrc, double scale, graphics::Pen::Info & switch (pSrc->join()) { case ROUNDJOIN: - dest.m_join = graphics::Pen::Info::ERoundJoin; + dest.m_join = dp::RoundJoin; break; case BEVELJOIN: - dest.m_join = graphics::Pen::Info::EBevelJoin; + dest.m_join = dp::BevelJoin; break; case NOJOIN: - dest.m_join = graphics::Pen::Info::ENoJoin; + dest.m_join = dp::MiterJoin; break; default: break; @@ -75,13 +80,13 @@ void ConvertStyle(LineDefProto const * pSrc, double scale, graphics::Pen::Info & switch (pSrc->cap()) { case ROUNDCAP: - dest.m_cap = graphics::Pen::Info::ERoundCap; + dest.m_cap = dp::RoundCap; break; case BUTTCAP: - dest.m_cap = graphics::Pen::Info::EButtCap; + dest.m_cap = dp::ButtCap; break; case SQUARECAP: - dest.m_cap = graphics::Pen::Info::ESquareCap; + dest.m_cap = dp::SquareCap; break; default: break; @@ -89,24 +94,23 @@ void ConvertStyle(LineDefProto const * pSrc, double scale, graphics::Pen::Info & } } -void ConvertStyle(AreaRuleProto const * pSrc, graphics::Brush::Info & dest) +void ConvertStyle(AreaRuleProto const * pSrc, BrushInfo & dest) { dest.m_color = ConvertColor(pSrc->color()); } -void ConvertStyle(SymbolRuleProto const * pSrc, graphics::Icon::Info & dest) +void ConvertStyle(SymbolRuleProto const * pSrc, IconInfo & dest) { dest.m_name = pSrc->name(); } -void ConvertStyle(CircleRuleProto const * pSrc, double scale, graphics::Circle::Info & dest) +void ConvertStyle(CircleRuleProto const * pSrc, double scale, CircleInfo & dest) { - dest = graphics::Circle::Info(pSrc->radius() * scale, - ConvertColor(pSrc->color())); + dest = CircleInfo(pSrc->radius() * scale, ConvertColor(pSrc->color())); if (pSrc->has_border()) { - graphics::Pen::Info pen; + PenInfo pen; ConvertStyle(&(pSrc->border()), scale, pen); dest.m_isOutlined = true; @@ -115,41 +119,38 @@ void ConvertStyle(CircleRuleProto const * pSrc, double scale, graphics::Circle:: } } -void ConvertStyle(CaptionDefProto const * pSrc, double scale, graphics::FontDesc & dest, m2::PointD & offset) +void ConvertStyle(CaptionDefProto const * pSrc, double scale, dp::FontDecl & dest, m2::PointD & offset) { // fonts smaller than 8px look "jumpy" on LDPI devices uint8_t const h = max(8, static_cast(pSrc->height() * scale)); - offset = m2::PointD(0,0); + offset = m2::PointD(0, 0); if (pSrc->has_offset_x()) offset.x = scale * pSrc->offset_x(); if (pSrc->has_offset_y()) offset.y = scale * pSrc->offset_y(); - dest = graphics::FontDesc(h, ConvertColor(pSrc->color())); + dest = dp::FontDecl(ConvertColor(pSrc->color()), h); if (pSrc->has_stroke_color()) - { - dest.m_isMasked = true; - dest.m_maskColor = ConvertColor(pSrc->stroke_color()); - } + dest.m_outlineColor = ConvertColor(pSrc->stroke_color()); } -void ConvertStyle(ShieldRuleProto const * pSrc, double scale, graphics::FontDesc & dest) +void ConvertStyle(ShieldRuleProto const * pSrc, double scale, dp::FontDecl & dest) { // fonts smaller than 8px look "jumpy" on LDPI devices uint8_t const h = max(8, static_cast(pSrc->height() * scale)); - dest = graphics::FontDesc(h, ConvertColor(pSrc->color())); + dest = dp::FontDecl(ConvertColor(pSrc->color()), h); if (pSrc->has_stroke_color()) - { - dest.m_isMasked = true; - dest.m_maskColor = ConvertColor(pSrc->stroke_color()); - } + dest.m_outlineColor = ConvertColor(pSrc->stroke_color()); } uint8_t GetFontSize(CaptionDefProto const * pSrc) { return pSrc->height(); } + +} +} diff --git a/drape_frontend/watch/proto_to_styles.hpp b/drape_frontend/watch/proto_to_styles.hpp new file mode 100644 index 0000000000..4379f53b9b --- /dev/null +++ b/drape_frontend/watch/proto_to_styles.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include "drape_frontend/watch/pen_info.hpp" +#include "drape_frontend/watch/brush_info.hpp" +#include "drape_frontend/watch/icon_info.hpp" +#include "drape_frontend/watch/circle_info.hpp" + +#include "drape/drape_global.hpp" + +#include "geometry/point2d.hpp" + +class LineDefProto; +class AreaRuleProto; +class SymbolRuleProto; +class CaptionDefProto; +class CircleRuleProto; +class ShieldRuleProto; + +namespace df +{ +namespace watch +{ + +dp::Color ConvertColor(uint32_t c); + +void ConvertStyle(LineDefProto const * pSrc, double scale, PenInfo & dest); +void ConvertStyle(AreaRuleProto const * pSrc, BrushInfo & dest); +void ConvertStyle(SymbolRuleProto const * pSrc, IconInfo & dest); +void ConvertStyle(CircleRuleProto const * pSrc, double scale, CircleInfo & dest); +void ConvertStyle(CaptionDefProto const * pSrc, double scale, dp::FontDecl & dest, m2::PointD & offset); +void ConvertStyle(ShieldRuleProto const * pSrc, double scale, dp::FontDecl & dest); + +uint8_t GetFontSize(CaptionDefProto const * pSrc); + +} +} diff --git a/render/rect.h b/drape_frontend/watch/rect.h similarity index 98% rename from render/rect.h rename to drape_frontend/watch/rect.h index 753d5b6fbf..2a56b38b5c 100644 --- a/render/rect.h +++ b/drape_frontend/watch/rect.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef __IA__RECT__ +#define __IA__RECT__ #include "point.h" #include @@ -163,3 +164,5 @@ typedef rect_base rect_d; typedef rect_base rect_i; } // namespace ml + +#endif diff --git a/render/software_renderer.cpp b/drape_frontend/watch/software_renderer.cpp similarity index 77% rename from render/software_renderer.cpp rename to drape_frontend/watch/software_renderer.cpp index dc648330f1..1f1e4a6de3 100644 --- a/render/software_renderer.cpp +++ b/drape_frontend/watch/software_renderer.cpp @@ -1,12 +1,10 @@ -#include "software_renderer.hpp" -#include "proto_to_styles.hpp" +#include "drape_frontend/watch/software_renderer.hpp" +#include "drape_frontend/watch/proto_to_styles.hpp" -#include "graphics/defines.hpp" -#include "graphics/skin_loader.hpp" +#include "drape/symbols_texture.hpp" #include "platform/platform.hpp" -#include "3party/lodepng/lodepng_io.hpp" #include "coding/png_memory_encoder.hpp" #include "coding/parse_xml.hpp" @@ -15,6 +13,8 @@ #include "base/logging.hpp" +#include "3party/lodepng/lodepng_io.hpp" + #include "3party/agg/agg_rasterizer_scanline_aa.h" #include "3party/agg/agg_scanline_p.h" #include "3party/agg/agg_path_storage.h" @@ -29,18 +29,22 @@ #include "3party/agg/agg_vcgen_stroke.cpp" #include "3party/agg/agg_vcgen_dash.cpp" +namespace df +{ +namespace watch +{ #define BLENDER_TYPE agg::comp_op_src_over class agg_symbol_renderer : public ml::text_renderer { - graphics::Color m_color; - graphics::Color m_colorMask; + dp::Color m_color; + dp::Color m_colorMask; SoftwareRenderer::TBaseRenderer & m_baserenderer; public: agg_symbol_renderer(SoftwareRenderer::TBaseRenderer & baserenderer, - graphics::Color const & color, graphics::Color const & colorMask) + dp::Color const & color, dp::Color const & colorMask) : m_color(color), m_colorMask(colorMask), m_baserenderer(baserenderer) { m_outline = false; @@ -51,103 +55,108 @@ public: virtual void operator()(ml::point_d const & pt, size_t width, size_t height, unsigned char const * data) { - graphics::Color color = m_outline ? m_colorMask : m_color; + dp::Color color = m_outline ? m_colorMask : m_color; for (size_t y = 0; y < height; ++y) { m_baserenderer.blend_solid_hspan(pt.x, pt.y + y, (int)width, - agg::rgba8(color.r, color.g, color.b, color.a), + agg::rgba8(color.GetRed(), color.GetGreen(), color.GetBlue(), color.GetAlfa()), &data[(height - y - 1) * width]); } } }; -void AlignText(ml::text_options & opt, graphics::EPosition anchor) +void AlignText(ml::text_options & opt, dp::Anchor anchor) { switch (anchor) { - case graphics::EPosCenter: + case dp::Anchor::Center: opt.horizontal_align(ml::text::align_center); opt.vertical_align(ml::text::align_center); break; - case graphics::EPosAbove: + case dp::Anchor::Top: opt.horizontal_align(ml::text::align_center); opt.vertical_align(ml::text::align_top); break; - case graphics::EPosUnder: + case dp::Anchor::Bottom: opt.horizontal_align(ml::text::align_center); opt.vertical_align(ml::text::align_bottom); break; - case graphics::EPosLeft: + case dp::Anchor::Left: opt.horizontal_align(ml::text::align_left); opt.vertical_align(ml::text::align_center); break; - case graphics::EPosRight: + case dp::Anchor::Right: opt.horizontal_align(ml::text::align_right); opt.vertical_align(ml::text::align_center); break; - case graphics::EPosAboveLeft: + case dp::Anchor::LeftTop: opt.horizontal_align(ml::text::align_left); opt.vertical_align(ml::text::align_top); break; - case graphics::EPosAboveRight: + case dp::Anchor::RightTop: opt.horizontal_align(ml::text::align_right); opt.vertical_align(ml::text::align_top); break; - case graphics::EPosUnderLeft: + case dp::Anchor::LeftBottom: opt.horizontal_align(ml::text::align_left); opt.vertical_align(ml::text::align_bottom); break; - case graphics::EPosUnderRight: + case dp::Anchor::RightBottom: opt.horizontal_align(ml::text::align_right); opt.vertical_align(ml::text::align_bottom); break; } } -void AlignImage(m2::PointD & pt, graphics::EPosition anchor, size_t width, size_t height) +void AlignImage(m2::PointD & pt, dp::Anchor anchor, size_t width, size_t height) { switch (anchor) { - case graphics::EPosCenter: + case dp::Anchor::Center: return; - case graphics::EPosAbove: + case dp::Anchor::Top: pt.y -= height / 2; break; - case graphics::EPosUnder: + case dp::Anchor::Bottom: pt.y += height / 2; break; - case graphics::EPosLeft: + case dp::Anchor::Left: pt.x -= width / 2; break; - case graphics::EPosRight: + case dp::Anchor::Right: pt.x += width / 2; break; - case graphics::EPosAboveLeft: + case dp::Anchor::LeftTop: pt.y -= height / 2; pt.x -= width / 2; break; - case graphics::EPosAboveRight: + case dp::Anchor::RightTop: pt.y -= height / 2; pt.x += width / 2; break; - case graphics::EPosUnderLeft: + case dp::Anchor::LeftBottom: pt.y += height / 2; pt.x -= width / 2; break; - case graphics::EPosUnderRight: + case dp::Anchor::RightBottom: pt.y += height / 2; pt.x += width / 2; break; } } -SoftwareRenderer::SoftwareRenderer(graphics::GlyphCache::Params const & glyphCacheParams, graphics::EDensity density) - : m_glyphCache(new graphics::GlyphCache(glyphCacheParams)) +bool HasOutline(dp::FontDecl const & fontDecl) +{ + return fontDecl.m_outlineColor.GetAlfa() != 0; +} + +SoftwareRenderer::SoftwareRenderer(GlyphCache::Params const & glyphCacheParams, string const & resourcesPostfix) + : m_glyphCache(new GlyphCache(glyphCacheParams)) , m_skinWidth(0) , m_skinHeight(0) , m_frameWidth(0) , m_frameHeight(0) - , m_pixelFormat(m_renderBuffer , BLENDER_TYPE) + , m_pixelFormat(m_renderBuffer, BLENDER_TYPE) , m_baseRenderer(m_pixelFormat) , m_solidRenderer(m_baseRenderer) { @@ -157,30 +166,12 @@ SoftwareRenderer::SoftwareRenderer(graphics::GlyphCache::Params const & glyphCac pl.GetFontNames(fonts); m_glyphCache->addFonts(fonts); - string textureFileName; - - graphics::SkinLoader loader([this, &textureFileName](m2::RectU const & rect, string const & symbolName, int32_t id, string const & fileName) - { - UNUSED_VALUE(id); - if (textureFileName.empty()) - textureFileName = fileName; - - m_symbolsIndex[symbolName] = rect; - }); - - ReaderSource> source(ReaderPtr(GetStyleReader().GetResourceReader("basic.skn", convert(density)))); - if (!ParseXML(source, loader)) - LOG(LERROR, ("Error parsing skin")); - - ASSERT(!textureFileName.empty(), ()); - ReaderPtr texReader(GetStyleReader().GetResourceReader(textureFileName, convert(density))); - vector textureData; - LodePNG::loadFile(textureData, texReader); - VERIFY(LodePNG::decode(m_symbolsSkin, m_skinWidth, m_skinHeight, textureData) == 0, ()); - ASSERT(m_skinWidth != 0 && m_skinHeight != 0, ()); + VERIFY(dp::SymbolsTexture::DecodeToMemory(resourcesPostfix, m_symbolsSkin, m_symbolsIndex, m_skinWidth, m_skinHeight), ()); + ASSERT_NOT_EQUAL(m_skinWidth, 0, ()); + ASSERT_NOT_EQUAL(m_skinHeight, 0, ()); } -void SoftwareRenderer::BeginFrame(uint32_t width, uint32_t height, graphics::Color const & bgColor) +void SoftwareRenderer::BeginFrame(uint32_t width, uint32_t height, dp::Color const & bgColor) { ASSERT(m_frameWidth == 0 && m_frameHeight == 0, ()); m_frameWidth = width; @@ -195,11 +186,11 @@ void SoftwareRenderer::BeginFrame(uint32_t width, uint32_t height, graphics::Col m_baseRenderer.reset_clipping(true); unsigned op = m_pixelFormat.comp_op(); m_pixelFormat.comp_op(agg::comp_op_src); - m_baseRenderer.clear(agg::rgba8(bgColor.r, bgColor.g, bgColor.b, bgColor.a)); + m_baseRenderer.clear(agg::rgba8(bgColor.GetRed(), bgColor.GetGreen(), bgColor.GetBlue(), bgColor.GetAlfa())); m_pixelFormat.comp_op(op); } -void SoftwareRenderer::DrawSymbol(m2::PointD const & pt, graphics::EPosition anchor, graphics::Icon::Info const & info) +void SoftwareRenderer::DrawSymbol(m2::PointD const & pt, dp::Anchor anchor, IconInfo const & info) { //@TODO (yershov) implement it typedef TBlendAdaptor blender_t; @@ -219,7 +210,7 @@ void SoftwareRenderer::DrawSymbol(m2::PointD const & pt, graphics::EPosition anc m_baseRenderer.blend_from(pixelformat, 0, (int)(p.x - r.SizeX() / 2), (int)(p.y - r.SizeY() / 2)); } -void SoftwareRenderer::DrawCircle(m2::PointD const & pt, graphics::EPosition anchor, graphics::Circle::Info const & info) +void SoftwareRenderer::DrawCircle(m2::PointD const & pt, dp::Anchor anchor, CircleInfo const & info) { //@TODO (yershov) implement it agg::rasterizer_scanline_aa<> rasterizer; @@ -235,45 +226,46 @@ void SoftwareRenderer::DrawCircle(m2::PointD const & pt, graphics::EPosition anc stroke_t stroke_path(path); stroke_path.width(info.m_outlineWidth * 2); rasterizer.add_path(stroke_path); - agg::rgba8 color(info.m_outlineColor.r, info.m_outlineColor.g, info.m_outlineColor.b, - info.m_outlineColor.a); + agg::rgba8 color(info.m_outlineColor.GetRed(), info.m_outlineColor.GetGreen(), + info.m_outlineColor.GetBlue(), info.m_outlineColor.GetAlfa()); agg::render_scanlines_aa_solid(rasterizer, scanline, m_baseRenderer, color); rasterizer.reset(); } rasterizer.add_path(path); - agg::rgba8 color(info.m_color.r, info.m_color.g, info.m_color.b, info.m_color.a); + agg::rgba8 color(info.m_color.GetRed(), info.m_color.GetGreen(), + info.m_color.GetBlue(), info.m_color.GetAlfa()); agg::render_scanlines_aa_solid(rasterizer, scanline, m_baseRenderer, color); } -inline agg::line_cap_e translateLineCap(unsigned int line_cap) +inline agg::line_cap_e translateLineCap(dp::LineCap line_cap) { switch (line_cap) { - case graphics::Pen::Info::EButtCap: + case dp::ButtCap: return agg::butt_cap; - case graphics::Pen::Info::ESquareCap: + case dp::SquareCap: return agg::square_cap; - case graphics::Pen::Info::ERoundCap: + case dp::RoundCap: return agg::round_cap; } return agg::round_cap; } -inline agg::line_join_e translateLineJoin(unsigned int line_join) +inline agg::line_join_e translateLineJoin(dp::LineJoin line_join) { switch (line_join) { - case graphics::Pen::Info::ENoJoin: + case dp::MiterJoin: return agg::miter_join; - case graphics::Pen::Info::ERoundJoin: + case dp::RoundJoin: return agg::round_join; - case graphics::Pen::Info::EBevelJoin: + case dp::BevelJoin: return agg::bevel_join; } return agg::bevel_join; } -void SoftwareRenderer::DrawPath(di::PathInfo const & geometry, graphics::Pen::Info const & info) +void SoftwareRenderer::DrawPath(PathInfo const & geometry, PenInfo const & info) { if (!info.m_icon.m_name.empty()) return; @@ -310,7 +302,8 @@ void SoftwareRenderer::DrawPath(di::PathInfo const & geometry, graphics::Pen::In } agg::scanline32_p8 scanline; - agg::rgba8 color(info.m_color.r, info.m_color.g, info.m_color.b, info.m_color.a); + agg::rgba8 color(info.m_color.GetRed(), info.m_color.GetGreen(), + info.m_color.GetBlue(), info.m_color.GetAlfa()); agg::render_scanlines_aa_solid(rasterizer, scanline, m_baseRenderer, color); } @@ -320,7 +313,7 @@ void SoftwareRenderer::DrawPath(PathWrapper & path, math::Matrix c path.Render(m_solidRenderer, aggM, FrameRect()); } -void SoftwareRenderer::DrawArea(di::AreaInfo const & geometry, graphics::Brush::Info const & info) +void SoftwareRenderer::DrawArea(AreaInfo const & geometry, BrushInfo const & info) { agg::rasterizer_scanline_aa<> rasterizer; rasterizer.clip_box(0, 0, m_frameWidth, m_frameHeight); @@ -336,7 +329,8 @@ void SoftwareRenderer::DrawArea(di::AreaInfo const & geometry, graphics::Brush:: rasterizer.add_path(path); agg::scanline32_p8 scanline; - agg::rgba8 color(info.m_color.r, info.m_color.g, info.m_color.b, info.m_color.a); + agg::rgba8 color(info.m_color.GetRed(), info.m_color.GetGreen(), + info.m_color.GetBlue(), info.m_color.GetAlfa()); bool antialias = false; if (antialias) { @@ -349,7 +343,7 @@ void SoftwareRenderer::DrawArea(di::AreaInfo const & geometry, graphics::Brush:: } } -void SoftwareRenderer::DrawText(m2::PointD const & pt, graphics::EPosition anchor, graphics::FontDesc const & primFont, strings::UniString const & primText) +void SoftwareRenderer::DrawText(m2::PointD const & pt, dp::Anchor anchor, dp::FontDecl const & primFont, strings::UniString const & primText) { //@TODO (yershov) implement it ml::text l(primText); @@ -365,8 +359,8 @@ void SoftwareRenderer::DrawText(m2::PointD const & pt, graphics::EPosition ancho AlignText(opt, anchor); l.warp(base, opt); - agg_symbol_renderer ren(m_baseRenderer, primFont.m_color, primFont.m_maskColor); - if (primFont.m_isMasked) + agg_symbol_renderer ren(m_baseRenderer, primFont.m_color, primFont.m_outlineColor); + if (HasOutline(primFont)) { ren.outline(true); l.render(face, ren); @@ -375,8 +369,8 @@ void SoftwareRenderer::DrawText(m2::PointD const & pt, graphics::EPosition ancho l.render(face, ren); } -void SoftwareRenderer::DrawText(m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & primFont, graphics::FontDesc const & secFont, +void SoftwareRenderer::DrawText(m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & primFont, dp::FontDecl const & secFont, strings::UniString const & primText, strings::UniString const & secText) { //@TODO (yershov) implement it @@ -394,8 +388,8 @@ void SoftwareRenderer::DrawText(m2::PointD const & pt, graphics::EPosition ancho prim.warp(base, opt); bounds = prim.calc_bounds(primFace); - agg_symbol_renderer ren(m_baseRenderer, primFont.m_color, primFont.m_maskColor); - if (primFont.m_isMasked) + agg_symbol_renderer ren(m_baseRenderer, primFont.m_color, primFont.m_outlineColor); + if (HasOutline(primFont)) { ren.outline(true); prim.render(primFace, ren); @@ -414,11 +408,11 @@ void SoftwareRenderer::DrawText(m2::PointD const & pt, graphics::EPosition ancho base.push_back(ml::point_d(currX + boundsSec.width() / 2, bounds.max.y + boundsSec.height() / 2)); ml::text_options secOpt(secFace); - AlignText(secOpt, graphics::EPosCenter); + AlignText(secOpt, dp::Center); sec.warp(base, secOpt); - agg_symbol_renderer ren2(m_baseRenderer, secFont.m_color, secFont.m_maskColor); - if (secFont.m_isMasked) + agg_symbol_renderer ren2(m_baseRenderer, secFont.m_color, secFont.m_outlineColor); + if (HasOutline(secFont)) { ren2.outline(true); sec.render(secFace, ren2); @@ -427,8 +421,8 @@ void SoftwareRenderer::DrawText(m2::PointD const & pt, graphics::EPosition ancho sec.render(secFace, ren2); } -void SoftwareRenderer::CalculateSymbolMetric(m2::PointD const & pt, graphics::EPosition anchor, - graphics::Icon::Info const & info, m2::RectD & rect) +void SoftwareRenderer::CalculateSymbolMetric(m2::PointD const & pt, dp::Anchor anchor, + IconInfo const & info, m2::RectD & rect) { m2::RectD symbolR(m_symbolsIndex[info.m_name]); m2::PointD pivot = pt; @@ -438,8 +432,8 @@ void SoftwareRenderer::CalculateSymbolMetric(m2::PointD const & pt, graphics::EP rect = m2::RectD(pivot - halfSize, pivot + halfSize); } -void SoftwareRenderer::CalculateCircleMetric(m2::PointD const & pt, graphics::EPosition anchor, - graphics::Circle::Info const & info, m2::RectD & rect) +void SoftwareRenderer::CalculateCircleMetric(m2::PointD const & pt, dp::Anchor anchor, + CircleInfo const & info, m2::RectD & rect) { m2::PointD pivot = pt; AlignImage(pivot, anchor, info.m_radius, info.m_radius); @@ -449,8 +443,8 @@ void SoftwareRenderer::CalculateCircleMetric(m2::PointD const & pt, graphics::EP rect = m2::RectD(pivot - halfSize, pivot + halfSize); } -void SoftwareRenderer::CalculateTextMetric(m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & font, strings::UniString const & text, +void SoftwareRenderer::CalculateTextMetric(m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & font, strings::UniString const & text, m2::RectD & result) { //@TODO (yershov) implement it @@ -470,8 +464,8 @@ void SoftwareRenderer::CalculateTextMetric(m2::PointD const & pt, graphics::EPos result = m2::RectD(bounds.min.x, bounds.min.y, bounds.max.x, bounds.max.y); } -void SoftwareRenderer::CalculateTextMetric(m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & primFont, graphics::FontDesc const & secFont, +void SoftwareRenderer::CalculateTextMetric(m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & primFont, dp::FontDecl const & secFont, strings::UniString const & primText, strings::UniString const & secText, m2::RectD & result) { @@ -501,7 +495,7 @@ void SoftwareRenderer::CalculateTextMetric(m2::PointD const & pt, graphics::EPos base.push_back(ml::point_d(currX + boundsSec.width() / 2, bounds.max.y + boundsSec.height() / 2)); ml::text_options secOpt(secFace); - AlignText(secOpt, graphics::EPosCenter); + AlignText(secOpt, dp::Center); sec.warp(base, secOpt); boundsSec = sec.calc_bounds(secFace); @@ -509,7 +503,7 @@ void SoftwareRenderer::CalculateTextMetric(m2::PointD const & pt, graphics::EPos result = m2::RectD(bounds.min.x, bounds.min.y, bounds.max.x, bounds.max.y); } -void SoftwareRenderer::CalculateTextMetric(di::PathInfo const & geometry, graphics::FontDesc const & font, +void SoftwareRenderer::CalculateTextMetric(PathInfo const & geometry, dp::FontDecl const & font, strings::UniString const & text, vector & rects) { ml::text l(text); @@ -526,7 +520,7 @@ void SoftwareRenderer::CalculateTextMetric(di::PathInfo const & geometry, graphi } ml::text_options opt(face); - AlignText(opt, graphics::EPosCenter); + AlignText(opt, dp::Center); l.warp(base, opt); l.calc_bounds(face); for (auto const & sym : l.symbols()) @@ -534,7 +528,7 @@ void SoftwareRenderer::CalculateTextMetric(di::PathInfo const & geometry, graphi sym.bounds().max.y); } -void SoftwareRenderer::DrawPathText(di::PathInfo const & geometry, graphics::FontDesc const & font, +void SoftwareRenderer::DrawPathText(PathInfo const & geometry, dp::FontDecl const & font, strings::UniString const & text) { ml::text l(text); @@ -551,11 +545,11 @@ void SoftwareRenderer::DrawPathText(di::PathInfo const & geometry, graphics::Fon } ml::text_options opt(face); - AlignText(opt, graphics::EPosCenter); + AlignText(opt, dp::Center); l.warp(base, opt); - agg_symbol_renderer ren(m_baseRenderer, font.m_color, font.m_maskColor); - if (font.m_isMasked) + agg_symbol_renderer ren(m_baseRenderer, font.m_color, font.m_outlineColor); + if (HasOutline(font)) { ren.outline(true); l.render(face, ren); @@ -705,3 +699,6 @@ void PathWrapper::Render(SoftwareRenderer::TSolidRenderer & renderer, } } } + +} +} diff --git a/drape_frontend/watch/software_renderer.hpp b/drape_frontend/watch/software_renderer.hpp new file mode 100644 index 0000000000..bd3ca4462a --- /dev/null +++ b/drape_frontend/watch/software_renderer.hpp @@ -0,0 +1,176 @@ +#pragma once + +#include "drape_frontend/watch/path_info.hpp" +#include "drape_frontend/watch/area_info.hpp" +#include "drape_frontend/watch/frame_image.hpp" +#include "drape_frontend/watch/text_engine.h" +#include "drape_frontend/watch/glyph_cache.hpp" +#include "drape_frontend/watch/icon_info.hpp" +#include "drape_frontend/watch/circle_info.hpp" +#include "drape_frontend/watch/pen_info.hpp" +#include "drape_frontend/watch/brush_info.hpp" + +#include "drape/drape_global.hpp" + +#include "geometry/point2d.hpp" + +#include "base/string_utils.hpp" + +#include "3party/agg/agg_rendering_buffer.h" +#include "3party/agg/agg_pixfmt_rgba.h" +#include "3party/agg/agg_renderer_scanline.h" +#include "3party/agg/agg_renderer_primitives.h" +#include "3party/agg/agg_path_storage.h" + +#include "std/cstdint.hpp" +#include "std/unique_ptr.hpp" + +namespace df +{ +namespace watch +{ + +class PathWrapper; + +class SoftwareRenderer +{ +public: + SoftwareRenderer(GlyphCache::Params const & glyphCacheParams, string const & resourcesPostfix); + + void BeginFrame(uint32_t width, uint32_t height, dp::Color const & bgColor); + + void DrawSymbol(m2::PointD const & pt, dp::Anchor anchor, IconInfo const & info); + void DrawCircle(m2::PointD const & pt, dp::Anchor anchor, CircleInfo const & info); + void DrawPath(PathInfo const & geometry, PenInfo const & info); + void DrawPath(PathWrapper & path, math::Matrix const & m); + void DrawArea(AreaInfo const & geometry, BrushInfo const & info); + void DrawText(m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & primFont, strings::UniString const & primText); + void DrawText(m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & primFont, dp::FontDecl const & secFont, + strings::UniString const & primText, strings::UniString const & secText); + void DrawPathText(PathInfo const & geometry, dp::FontDecl const & font, + strings::UniString const & text); + + void CalculateSymbolMetric(m2::PointD const & pt, dp::Anchor anchor, + IconInfo const & info, m2::RectD & rect); + + void CalculateCircleMetric(m2::PointD const & pt, dp::Anchor anchor, + CircleInfo const & info, m2::RectD & rect); + + void CalculateTextMetric(m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & font, strings::UniString const & text, + m2::RectD & result); + /// Result must be bound box contains both texts + void CalculateTextMetric(m2::PointD const & pt, dp::Anchor anchor, + dp::FontDecl const & primFont, dp::FontDecl const & secFont, + strings::UniString const & primText, strings::UniString const & secText, + m2::RectD & result); + /// rects - rect for each glyph + void CalculateTextMetric(PathInfo const & geometry, dp::FontDecl const & font, + strings::UniString const & text, + vector & rects); + + void EndFrame(FrameImage & image); + m2::RectD FrameRect() const; + + GlyphCache * GetGlyphCache() const { return m_glyphCache.get(); } + +private: + template + struct TBlendAdaptor + { + using order_type = TOrder; + using color_type = TColor; + using TValueType = typename color_type::value_type; + using TCalcType = typename color_type::calc_type; + + enum EBaseScale + { + SCALE_SHIFT = color_type::base_shift, + SCALE_MASK = color_type::base_mask + }; + + static AGG_INLINE void blend_pix(unsigned op, TValueType * p, unsigned cr, unsigned cg, + unsigned cb, unsigned ca, unsigned cover) + { + using TBlendTable = agg::comp_op_table_rgba; + if (p[TOrder::A]) + { + TBlendTable::g_comp_op_func[op](p, (cr * ca + SCALE_MASK) >> SCALE_SHIFT, (cg * ca + SCALE_MASK) >> SCALE_SHIFT, + (cb * ca + SCALE_MASK) >> SCALE_SHIFT, ca, cover); + } + else + TBlendTable::g_comp_op_func[op](p, cr, cg, cb, ca, cover); + } + }; + +public: + using TBlender = TBlendAdaptor; + using TPixelFormat = agg::pixfmt_custom_blend_rgba; + + using TBaseRenderer = agg::renderer_base; + using TPrimitivesRenderer = agg::renderer_primitives; + using TSolidRenderer = agg::renderer_scanline_aa_solid; + +private: + unique_ptr m_glyphCache; + map m_symbolsIndex; + vector m_symbolsSkin; + uint32_t m_skinWidth, m_skinHeight; + + std::vector m_frameBuffer; + uint32_t m_frameWidth, m_frameHeight; + + agg::rendering_buffer m_renderBuffer; + TPixelFormat m_pixelFormat; + TBaseRenderer m_baseRenderer; + + TSolidRenderer m_solidRenderer; + + ml::text_engine m_textEngine; +}; + +struct PathParams +{ + agg::rgba8 m_fillColor; + agg::rgba8 m_strokeColor; + bool m_isFill; + bool m_isStroke; + bool m_isEventOdd; + double m_strokeWidth; + + PathParams() + : m_fillColor(agg::rgba(0, 0, 0)) + , m_strokeColor(agg::rgba(0, 0, 0)) + , m_isFill(false) + , m_isStroke(false) + , m_isEventOdd(false) + , m_strokeWidth(1.0) + { + } +}; + +class PathWrapper +{ +public: + void AddParams(PathParams const & params); + void MoveTo(m2::PointD const & pt); + void LineTo(m2::PointD const & pt); + void CurveTo(m2::PointD const & pt1, + m2::PointD const & pt2, + m2::PointD const & ptTo); + void ClosePath(); + void BoundingRect(m2::RectD & rect); + + void Render(SoftwareRenderer::TSolidRenderer & renderer, + agg::trans_affine const & mtx, + m2::RectD const & clipBox); + +private: + agg::path_storage m_storage; + vector m_params; +}; + +} +} diff --git a/render/text_engine.cpp b/drape_frontend/watch/text_engine.cpp similarity index 99% rename from render/text_engine.cpp rename to drape_frontend/watch/text_engine.cpp index b375d46cc1..05b11d9e16 100644 --- a/render/text_engine.cpp +++ b/drape_frontend/watch/text_engine.cpp @@ -456,4 +456,4 @@ text_engine::text_engine() load_face("default", default_font_data, sizeof(default_font_data)); // face("default",16); } -} // namespace ml +} diff --git a/render/text_engine.h b/drape_frontend/watch/text_engine.h similarity index 98% rename from render/text_engine.h rename to drape_frontend/watch/text_engine.h index e5715f6699..8a7e92cac8 100644 --- a/render/text_engine.h +++ b/drape_frontend/watch/text_engine.h @@ -1,4 +1,6 @@ #pragma once +#ifndef __ML__TEXT_ENGINE_H__ +#define __ML__TEXT_ENGINE_H__ #include #include @@ -218,3 +220,5 @@ public: }; } // namespace ml + +#endif // __ML__TEXT_ENGINE_H__ diff --git a/drape_head/drape_head.pro b/drape_head/drape_head.pro index af680d973f..925b12b1ef 100644 --- a/drape_head/drape_head.pro +++ b/drape_head/drape_head.pro @@ -1,6 +1,6 @@ # Head project for drape develop and debuging ROOT_DIR = .. -DEPENDENCIES = map render drape_frontend anim drape indexer platform geometry coding base \ +DEPENDENCIES = map drape_frontend drape indexer storage platform geometry coding base \ freetype expat protobuf jansson fribidi tomcrypt include($$ROOT_DIR/common.pri) @@ -29,15 +29,11 @@ macx-* { HEADERS += \ mainwindow.hpp \ - qtoglcontext.hpp \ - qtoglcontextfactory.hpp \ drape_surface.hpp \ testing_engine.hpp \ SOURCES += \ mainwindow.cpp \ main.cpp \ - qtoglcontext.cpp \ - qtoglcontextfactory.cpp \ drape_surface.cpp \ testing_engine.cpp \ diff --git a/drape_head/drape_surface.cpp b/drape_head/drape_surface.cpp index c1c431ebfa..886f3b4eab 100644 --- a/drape_head/drape_surface.cpp +++ b/drape_head/drape_surface.cpp @@ -1,162 +1,48 @@ #include "drape_head/drape_surface.hpp" #include "drape_frontend/viewport.hpp" -#include "drape_frontend/map_data_provider.hpp" -#include "platform/platform.hpp" - -#include "drape/shader_def.hpp" - -#include "base/stl_add.hpp" #include "base/logging.hpp" -#include "std/bind.hpp" -#include "std/cmath.hpp" - -#include - - DrapeSurface::DrapeSurface() - : m_dragState(false) - , m_navigator(m_scales) - , m_contextFactory(NULL) { - setSurfaceType(QSurface::OpenGLSurface); - - QObject::connect(this, SIGNAL(heightChanged(int)), this, SLOT(sizeChanged(int))); - QObject::connect(this, SIGNAL(widthChanged(int)), this, SLOT(sizeChanged(int))); - - ///{ Temporary initialization - m_model.InitClassificator(); - // Platform::FilesList maps; - // Platform & pl = GetPlatform(); - // pl.GetFilesByExt(pl.WritableDir(), DATA_FILE_EXTENSION, maps); - - // for_each(maps.begin(), maps.end(), bind(&model::FeaturesFetcher::RegisterMap, &m_model, _1)); - // ///} - // /// } DrapeSurface::~DrapeSurface() { - m_drapeEngine.Destroy(); - m_contextFactory.Destroy(); + m_timer.stop(); + m_drapeEngine.reset(); } -void DrapeSurface::exposeEvent(QExposeEvent *e) +void DrapeSurface::initializeGL() { - Q_UNUSED(e); + CreateEngine(); + m_timer.setInterval(1000 / 30); + m_timer.setSingleShot(false); - if (isExposed()) - { - if (m_contextFactory.IsNull()) - { - dp::ThreadSafeFactory * factory = new dp::ThreadSafeFactory(new QtOGLContextFactory(this)); - m_contextFactory = dp::MasterPointer(factory); - CreateEngine(); - UpdateCoverage(); - } - } + connect(&m_timer, SIGNAL(timeout()), SLOT(update())); + m_timer.start(); } -void DrapeSurface::mousePressEvent(QMouseEvent * e) +void DrapeSurface::paintGL() { - QWindow::mousePressEvent(e); - if (!isExposed()) - return; - - if (e->button() == Qt::LeftButton) - { - m2::PointF p = GetDevicePosition(e->pos()); - m_navigator.StartDrag(p, 0); - UpdateCoverage(); - m_dragState = true; - } + m_drapeEngine->Draw(); } -void DrapeSurface::mouseMoveEvent(QMouseEvent * e) +void DrapeSurface::resizeGL(int width, int height) { - QWindow::mouseMoveEvent(e); - if (!isExposed()) - return; - - if (m_dragState) + if (m_drapeEngine != nullptr) { - m2::PointF p = GetDevicePosition(e->pos()); - m_navigator.DoDrag(p, 0); - UpdateCoverage(); - } -} - -void DrapeSurface::mouseReleaseEvent(QMouseEvent * e) -{ - QWindow::mouseReleaseEvent(e); - if (!isExposed()) - return; - - if (m_dragState) - { - m2::PointF p = GetDevicePosition(e->pos()); - m_navigator.StopDrag(p, 0, false); - UpdateCoverage(); - m_dragState = false; - } -} - -void DrapeSurface::wheelEvent(QWheelEvent * e) -{ - if (!m_dragState) - { - m_navigator.ScaleToPoint(GetDevicePosition(e->pos()), exp(e->delta() / 360.0), 0); - UpdateCoverage(); + float const vs = devicePixelRatio(); + int const w = width * vs; + int const h = height * vs; + m_drapeEngine->Resize(w, h); } } void DrapeSurface::CreateEngine() { - dp::RefPointer f(m_contextFactory.GetRefPointer()); - - float pixelRatio = devicePixelRatio(); - - typedef df::MapDataProvider::TReadIDsFn TReadIDsFn; - typedef df::MapDataProvider::TReadFeaturesFn TReadFeaturesFn; - typedef df::MapDataProvider::TReadIdCallback TReadIdCallback; - typedef df::MapDataProvider::TReadFeatureCallback TReadFeatureCallback; - - TReadIDsFn idReadFn = [this](TReadIdCallback const & fn, m2::RectD const & r, int scale) - { - m_model.ForEachFeatureID(r, fn, scale); - }; - - TReadFeaturesFn featureReadFn = [this](TReadFeatureCallback const & fn, vector const & ids) - { - m_model.ReadFeatures(fn, ids); - }; - - m_drapeEngine = TEnginePrt(new df::DrapeEngine(f, df::Viewport(pixelRatio, 0, 0, width(), height()), - df::MapDataProvider(idReadFn, featureReadFn))); -} - -void DrapeSurface::UpdateCoverage() -{ - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -} - -void DrapeSurface::sizeChanged(int) -{ - if (!m_drapeEngine.IsNull()) - { - float vs = devicePixelRatio(); - int w = width() * vs; - int h = height() * vs; - m_navigator.OnSize(0, 0, w, h); - m_drapeEngine->Resize(width(), height()); - UpdateCoverage(); - } -} - -m2::PointF DrapeSurface::GetDevicePosition(QPoint const & p) -{ - qreal const ratio = devicePixelRatio(); - return m2::PointF(p.x() * ratio, p.y() * ratio); + float const pixelRatio = devicePixelRatio(); + m_drapeEngine = make_unique_dp(df::Viewport(0, 0, pixelRatio * width(), pixelRatio * height()), + pixelRatio); } diff --git a/drape_head/drape_surface.hpp b/drape_head/drape_surface.hpp index 7bf939fcb2..fd2ceddb97 100644 --- a/drape_head/drape_surface.hpp +++ b/drape_head/drape_surface.hpp @@ -1,28 +1,11 @@ #pragma once -#include "drape_head/qtoglcontextfactory.hpp" - -#include "map/feature_vec_model.hpp" -#include "map/navigator.hpp" - -#include "render/scales_processor.hpp" - -#include "drape/batcher.hpp" -#include "drape/gpu_program_manager.hpp" -#include "drape/uniform_values_storage.hpp" - -//#define USE_TESTING_ENGINE -#if defined(USE_TESTING_ENGINE) #include "drape_head/testing_engine.hpp" -#define DrapeEngine TestingEngine -#else -#include "drape_frontend/drape_engine.hpp" -#endif -#include -#include +#include +#include -class DrapeSurface : public QWindow +class DrapeSurface : public QOpenGLWindow { Q_OBJECT @@ -31,30 +14,13 @@ public: ~DrapeSurface(); protected: - void exposeEvent(QExposeEvent * e); - void mousePressEvent(QMouseEvent * e); - void mouseMoveEvent(QMouseEvent * e); - void mouseReleaseEvent(QMouseEvent * e); - void wheelEvent(QWheelEvent * e); + void initializeGL() override; + void paintGL() override; + void resizeGL(int w, int h) override; private: void CreateEngine(); - void UpdateCoverage(); - Q_SLOT void sizeChanged(int); - -private: - m2::PointF GetDevicePosition(QPoint const & p); - - bool m_dragState; - - ScalesProcessor m_scales; - model::FeaturesFetcher m_model; - Navigator m_navigator; - -private: - typedef dp::MasterPointer TContextFactoryPtr; - typedef dp::MasterPointer TEnginePrt; - TContextFactoryPtr m_contextFactory; - TEnginePrt m_drapeEngine; + drape_ptr m_drapeEngine; + QTimer m_timer; }; diff --git a/drape_head/mainwindow.cpp b/drape_head/mainwindow.cpp index 96e56f479b..dace369169 100644 --- a/drape_head/mainwindow.cpp +++ b/drape_head/mainwindow.cpp @@ -6,7 +6,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) - , m_surface(NULL) + , m_surface(nullptr) { resize(1200, 800); diff --git a/drape_head/qtoglcontext.cpp b/drape_head/qtoglcontext.cpp deleted file mode 100644 index 750dbe5b4c..0000000000 --- a/drape_head/qtoglcontext.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "drape_head/qtoglcontext.hpp" - -#include "base/assert.hpp" -#include "base/logging.hpp" - -#include "drape/glfunctions.hpp" - -QtOGLContext::QtOGLContext(QWindow * surface, QtOGLContext * contextToShareWith) -{ - m_isContextCreated = false; - m_surface = surface; - m_nativeContext = new QOpenGLContext(); - - if (contextToShareWith != NULL) - m_nativeContext->setShareContext(contextToShareWith->m_nativeContext); - - m_nativeContext->setFormat(m_surface->requestedFormat()); - ASSERT(m_surface->isExposed(), ()); - VERIFY(m_nativeContext->create(), ()); -} - -QtOGLContext::~QtOGLContext() -{ - delete m_nativeContext; -} - -void QtOGLContext::makeCurrent() -{ - ASSERT(m_nativeContext->isValid(), ()); - m_nativeContext->makeCurrent(m_surface); - -#ifdef DEBUG - LOG(LDEBUG, ("Current context : ", m_nativeContext)); - QList list = QOpenGLContextGroup::currentContextGroup()->shares(); - for (int i = 0; i < list.size(); ++i) - LOG(LDEBUG, ("Share context : ", list[i])); -#endif -} - -void QtOGLContext::present() -{ - m_nativeContext->makeCurrent(m_surface); - m_nativeContext->swapBuffers(m_surface); -} - -void QtOGLContext::setDefaultFramebuffer() -{ - GLFunctions::glBindFramebuffer(GL_FRAMEBUFFER, 0); -} diff --git a/drape_head/qtoglcontext.hpp b/drape_head/qtoglcontext.hpp deleted file mode 100644 index 2bc7000de3..0000000000 --- a/drape_head/qtoglcontext.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "drape/oglcontext.hpp" - -#include -#include - -class QtOGLContext: public dp::OGLContext -{ -public: - QtOGLContext(QWindow * surface, QtOGLContext * contextToShareWith); - ~QtOGLContext(); - - virtual void present(); - virtual void makeCurrent(); - virtual void setDefaultFramebuffer(); - -private: - QOpenGLContext * m_nativeContext; - QWindow * m_surface; - bool m_isContextCreated; -}; diff --git a/drape_head/qtoglcontextfactory.cpp b/drape_head/qtoglcontextfactory.cpp deleted file mode 100644 index 28ce15cdae..0000000000 --- a/drape_head/qtoglcontextfactory.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "drape_head/qtoglcontextfactory.hpp" - -#include "base/assert.hpp" - -QtOGLContextFactory::QtOGLContextFactory(QWindow * surface) - : m_surface(surface) - , m_drawContext(NULL) - , m_uploadContext(NULL) -{} - -QtOGLContextFactory::~QtOGLContextFactory() -{ - delete m_drawContext; - delete m_uploadContext; -} - -dp::OGLContext * QtOGLContextFactory::getDrawContext() -{ - if (m_drawContext == NULL) - m_drawContext = new QtOGLContext(m_surface, m_uploadContext); - - return m_drawContext; -} - -dp::OGLContext * QtOGLContextFactory::getResourcesUploadContext() -{ - if (m_uploadContext == NULL) - m_uploadContext = new QtOGLContext(m_surface, m_drawContext); - - return m_uploadContext; -} diff --git a/drape_head/qtoglcontextfactory.hpp b/drape_head/qtoglcontextfactory.hpp deleted file mode 100644 index 0ce63d77d5..0000000000 --- a/drape_head/qtoglcontextfactory.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "drape/oglcontextfactory.hpp" -#include "drape_head/qtoglcontext.hpp" - -#include - -class QtOGLContextFactory : public dp::OGLContextFactory -{ -public: - QtOGLContextFactory(QWindow * surface); - ~QtOGLContextFactory(); - - virtual dp::OGLContext * getDrawContext(); - virtual dp::OGLContext * getResourcesUploadContext(); - -private: - QWindow * m_surface; - QtOGLContext * m_drawContext; - QtOGLContext * m_uploadContext; -}; diff --git a/drape_head/testing_engine.cpp b/drape_head/testing_engine.cpp index 49676a8b88..a7fdc82117 100644 --- a/drape_head/testing_engine.cpp +++ b/drape_head/testing_engine.cpp @@ -3,20 +3,25 @@ #include "coding/file_reader.hpp" #include "platform/platform.hpp" +#include "drape_frontend/gui/gui_text.hpp" + +#include "drape_frontend/visual_params.hpp" +#include "drape_frontend/line_shape.hpp" +#include "drape_frontend/text_shape.hpp" +#include "drape_frontend/path_text_shape.hpp" +#include "drape_frontend/path_symbol_shape.hpp" +#include "drape_frontend/route_shape.hpp" +#include "drape_frontend/area_shape.hpp" +#include "drape_frontend/circle_shape.hpp" +#include "drape_frontend/poi_symbol_shape.hpp" + #include "drape/utils/vertex_decl.hpp" #include "drape/glsl_types.hpp" #include "drape/vertex_array_buffer.hpp" #include "drape/shader_def.hpp" #include "drape/overlay_tree.hpp" #include "drape/stipple_pen_resource.hpp" - -#include "drape_frontend/visual_params.hpp" -#include "drape_frontend/line_shape.hpp" -#include "drape_frontend/text_shape.hpp" -#include "drape_frontend/path_text_shape.hpp" -#include "drape_frontend/path_symbol_shape.hpp" -#include "drape_frontend/area_shape.hpp" -#include "drape_frontend/circle_shape.hpp" +#include "drape/utils/projection.hpp" #include "geometry/transformations.hpp" @@ -32,6 +37,81 @@ namespace df { +class DummyLabel +{ +public: + DummyLabel(m2::PointF const & base, string const & text, dp::Anchor anchor, dp::FontDecl const & font) + : m_base(base) + , m_text(text) + , m_anchor(anchor) + , m_font(font) + { + } + + void Draw(ref_ptr batcher, ref_ptr textures) const + { + gui::StaticLabel::LabelResult result; + gui::StaticLabel::CacheStaticText(m_text, "\n", m_anchor, m_font, textures, result); + for (gui::StaticLabel::Vertex & v : result.m_buffer) + v.m_position = glsl::vec3(glsl::ToVec2(m_base), v.m_position.z); + + dp::AttributeProvider provider(1 /* streamCount */, result.m_buffer.size()); + provider.InitStream(0 /* streamIndex */, gui::StaticLabel::Vertex::GetBindingInfo(), + make_ref(result.m_buffer.data())); + + batcher->InsertListOfStrip(result.m_state, make_ref(&provider), + 4 /* vertexStride */); + } + +private: + m2::PointF m_base; + string const & m_text; + dp::Anchor m_anchor; + dp::FontDecl m_font; +}; + +class DummyMutableLabel +{ +public: + DummyMutableLabel(m2::PointF const & base, string const & text) + : m_base(base) + , m_text(text) + { + } + + void Draw(ref_ptr batcher, ref_ptr textures) const + { + gui::MutableLabel textCacher(dp::LeftBottom); + gui::MutableLabel::PrecacheParams p; + p.m_maxLength = 10; + p.m_alphabet = m_text; + p.m_font = dp::FontDecl(dp::Color(0, 0, 0, 255), 14); + + gui::MutableLabel::PrecacheResult staticData; + textCacher.Precache(p, staticData, textures); + + glsl::vec2 offset = glsl::ToVec2(m_base); + for (gui::MutableLabel::StaticVertex & v : staticData.m_buffer) + v.m_position = glsl::vec3(v.m_position.xy() + offset, v.m_position.z); + + gui::MutableLabel::LabelResult dynResult; + textCacher.SetText(dynResult, m_text); + ASSERT_EQUAL(staticData.m_buffer.size(), dynResult.m_buffer.size(), ()); + + dp::AttributeProvider provider(2, dynResult.m_buffer.size()); + provider.InitStream(0 /* streamIndex */, gui::MutableLabel::StaticVertex::GetBindingInfo(), + make_ref(staticData.m_buffer.data())); + provider.InitStream(1 /* streamIndex */, gui::MutableLabel::DynamicVertex::GetBindingInfo(), + make_ref(dynResult.m_buffer.data())); + + batcher->InsertListOfStrip(staticData.m_state, make_ref(&provider), 4); + } + +private: + m2::PointF m_base; + string m_text; +}; + class DummyStippleElement : public MapShape { public: @@ -40,7 +120,7 @@ public: { } - void Draw(dp::RefPointer batcher, dp::RefPointer textures) const + void Draw(ref_ptr batcher, ref_ptr textures) const { dp::TextureManager::TStipplePattern key; key.push_back(10); @@ -68,13 +148,12 @@ public: dp::AttributeProvider provider(1, 4); - provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), dp::MakeStackRefPointer(vertexes)); + provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), make_ref(vertexes)); dp::GLState state(gpu::TEXTURING_PROGRAM, dp::GLState::GeometryLayer); state.SetColorTexture(region.GetTexture()); - state.SetBlending(dp::Blending(true)); - batcher->InsertTriangleStrip(state, dp::MakeStackRefPointer(&provider)); + batcher->InsertTriangleStrip(state, make_ref(&provider)); } private: @@ -86,7 +165,7 @@ class DummyColorElement : public MapShape public: DummyColorElement() { } - void Draw(dp::RefPointer batcher, dp::RefPointer textures) const + void Draw(ref_ptr batcher, ref_ptr textures) const { dp::TextureManager::ColorRegion region; textures->GetColorRegion(dp::Color(rand() % 256, rand() % 256, rand() % 256, 255), region); @@ -105,17 +184,16 @@ public: }; dp::AttributeProvider provider(1, 4); - provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), dp::MakeStackRefPointer(vertexes)); + provider.InitStream(0, gpu::SolidTexturingVertex::GetBindingInfo(), make_ref(vertexes)); dp::GLState state(gpu::TEXTURING_PROGRAM, dp::GLState::GeometryLayer); state.SetColorTexture(region.GetTexture()); - state.SetBlending(dp::Blending(true)); - batcher->InsertTriangleStrip(state, dp::MakeStackRefPointer(&provider)); + batcher->InsertTriangleStrip(state, make_ref(&provider)); } }; -class MapShapeFactory +/*class MapShapeFactory { typedef function TCreateFn; typedef map TCreatorsMap; @@ -246,45 +324,36 @@ private: private: TCreatorsMap m_creators; -}; +};*/ -TestingEngine::TestingEngine(dp::RefPointer oglcontextfactory, - Viewport const & viewport, - MapDataProvider const & model) - : m_contextFactory(oglcontextfactory) - , m_viewport(viewport) +TestingEngine::TestingEngine(Viewport const & viewport, double vs) + : m_viewport(viewport) { + df::VisualParams::Init(vs, df::CalculateTileSize(viewport.GetWidth(), viewport.GetHeight())); + GLFunctions::Init(); - df::VisualParams::Init(viewport.GetPixelRatio(), df::CalculateTileSize(viewport.GetWidth(), viewport.GetHeight())); - m_contextFactory->getDrawContext()->makeCurrent(); dp::TextureManager::Params params; - params.m_resPrefix = VisualParams::Instance().GetResourcePostfix(); + params.m_resPostfix = VisualParams::Instance().GetResourcePostfix(); params.m_glyphMngParams.m_uniBlocks = "unicode_blocks.txt"; params.m_glyphMngParams.m_whitelist = "fonts_whitelist.txt"; params.m_glyphMngParams.m_blacklist = "fonts_blacklist.txt"; GetPlatform().GetFontNames(params.m_glyphMngParams.m_fonts); - m_textures.Reset(new dp::TextureManager()); + m_textures = make_unique_dp(); m_textures->Init(params); - m_batcher.Reset(new dp::Batcher()); - m_programManager.Reset(new dp::GpuProgramManager()); + m_batcher = make_unique_dp(5000, 5000); + m_programManager = make_unique_dp(); ModelViewInit(); ProjectionInit(); - - m_timerId = startTimer(1000 / 30); } TestingEngine::~TestingEngine() { - killTimer(m_timerId); ClearScene(); - m_batcher.Destroy(); m_textures->Release(); - m_textures.Destroy(); - m_programManager.Destroy(); } void TestingEngine::Draw() @@ -292,9 +361,7 @@ void TestingEngine::Draw() static bool isInitialized = false; if (!isInitialized) { - m_batcher->StartSession(bind(&df::TestingEngine::OnFlushData, this, _1, _2)); DrawImpl(); - m_batcher->EndSession(); m_batcher->StartSession(bind(&df::TestingEngine::OnFlushData, this, _1, _2)); DrawRects(); m_batcher->EndSession(); @@ -305,34 +372,35 @@ void TestingEngine::Draw() ModelViewInit(); m_angle += 0.005; - dp::OGLContext * context = m_contextFactory->getDrawContext(); - context->setDefaultFramebuffer(); - m_viewport.Apply(); GLFunctions::glClearColor(0.65f, 0.65f, 0.65f, 1.0f); GLFunctions::glClear(); GLFunctions::glEnable(gl_const::GLDepthTest); + GLFunctions::glFrontFace(gl_const::GLClockwise); + GLFunctions::glCullFace(gl_const::GLBack); + GLFunctions::glEnable(gl_const::GLCullFace); + TScene::iterator it = m_scene.begin(); for(; it != m_scene.end(); ++it) { + m_textures->UpdateDynamicTextures(); + dp::GLState const & state = it->first; - dp::RefPointer prg = m_programManager->GetProgram(state.GetProgramIndex()); + ref_ptr prg = m_programManager->GetProgram(state.GetProgramIndex()); prg->Bind(); ApplyState(state, prg); ApplyUniforms(m_generalUniforms, prg); - vector > & buckets = it->second; + vector > & buckets = it->second; dp::OverlayTree tree; - tree.StartOverlayPlacing(m_modelView, true); + tree.StartOverlayPlacing(m_modelView); for (size_t i = 0; i < buckets.size(); ++i) - buckets[i]->CollectOverlayHandles(MakeStackRefPointer(&tree)); + buckets[i]->CollectOverlayHandles(make_ref(&tree), false); for (size_t i = 0; i < buckets.size(); ++i) buckets[i]->Render(m_modelView); tree.EndOverlayPlacing(); } - - context->present(); } void TestingEngine::Resize(int w, int h) @@ -342,27 +410,21 @@ void TestingEngine::Resize(int w, int h) m_viewport.SetViewport(0, 0, w, h); ModelViewInit(); ProjectionInit(); - Draw(); -} - -void TestingEngine::DragStarted(m2::PointF const & p) {} -void TestingEngine::Drag(m2::PointF const & p) {} -void TestingEngine::DragEnded(m2::PointF const & p) {} -void TestingEngine::Scale(m2::PointF const & p, double factor) {} - -void TestingEngine::timerEvent(QTimerEvent * e) -{ - if (e->timerId() == m_timerId) - Draw(); } void TestingEngine::DrawImpl() { - FontDecl fd; + m_generalUniforms.SetFloatValue("u_opacity", 1.0f); + m_generalUniforms.SetFloatValue("u_color", 0.0f, 0.0f, 1.0f, 0.7f); + m_generalUniforms.SetFloatValue("u_routeParams", 15.0f, 15.0f * m_modelView.GetScale(), 8.0f); + + dp::Batcher::TFlushFn flushFn = bind(&df::TestingEngine::OnFlushData, this, _1, _2); + m_batcher->StartSession(flushFn); + dp::FontDecl fd; fd.m_color = dp::Color::Black(); fd.m_outlineColor = dp::Color::White(); fd.m_size = 32.0f; - FontDecl auxFd; + dp::FontDecl auxFd; auxFd.m_color = dp::Color(0, 80, 240, 255); auxFd.m_outlineColor = dp::Color::Transparent(); auxFd.m_size = 20.0f; @@ -370,52 +432,134 @@ void TestingEngine::DrawImpl() TextViewParams params; params.m_featureID = FeatureID(MwmSet::MwmId(), 567); params.m_depth = 10.0f; + params.m_minVisibleScale = 1; + params.m_rank = 0; params.m_anchor = dp::Center; params.m_primaryText = "People's republic of China"; params.m_primaryTextFont = fd; params.m_secondaryTextFont = auxFd; params.m_secondaryText = "ÐÐ°Ñ€Ð¾Ð´Ð½Ð°Ñ ÐšÐ¸Ñ‚Ð°Ð¹ÑÐºÐ°Ñ Ñ€ÐµÑпублика"; - TextShape sh1(m2::PointF(82.277071f, 56.9271164f), params); - sh1.Draw(m_batcher.GetRefPointer(), m_textures.GetRefPointer()); + params.m_primaryOffset = m2::PointF(12.0, 20.0); + params.m_primaryOptional = true; + params.m_secondaryOptional = true; + TextShape sh1(m2::PointF(82.277071f, 46.9271164f), params, false); + sh1.Draw(make_ref(m_batcher), make_ref(m_textures)); vector path; path.push_back(m2::PointD(92.277071f, 50.9271164f)); path.push_back(m2::PointD(98.277071f, 50.9271164f)); - path.push_back(m2::PointD(106.277071f, 45.9271164f)); + path.push_back(m2::PointD(106.277071f, 48.9271164f)); m2::SharedSpline spline(path); PathTextViewParams ptvp; ptvp.m_baseGtoPScale = 1.0f / m_modelView.GetScale(); ptvp.m_depth = 100.0f; - ptvp.m_text = "Some text along path"; - ptvp.m_textFont = FontDecl(dp::Color::Black(), 40); + ptvp.m_minVisibleScale = 1; + ptvp.m_rank = 0; + ptvp.m_text = "Some text"; + ptvp.m_textFont = dp::FontDecl(dp::Color::Black(), 40, dp::Color::Red()); - PathTextShape(spline, ptvp).Draw(m_batcher.GetRefPointer(), m_textures.GetRefPointer()); + PathTextShape(spline, ptvp).Draw(make_ref(m_batcher), make_ref(m_textures)); LineViewParams lvp; lvp.m_baseGtoPScale = ptvp.m_baseGtoPScale; lvp.m_depth = 90.0f; + lvp.m_minVisibleScale = 1; + lvp.m_rank = 0; lvp.m_cap = dp::SquareCap; lvp.m_color = dp::Color::Red(); lvp.m_width = 16.0f; lvp.m_join = dp::BevelJoin; - LineShape(spline, lvp).Draw(m_batcher.GetRefPointer(), m_textures.GetRefPointer()); + LineShape(spline, lvp).Draw(make_ref(m_batcher), make_ref(m_textures)); + + { + PathSymbolViewParams p; + p.m_depth = 95.0f; + p.m_minVisibleScale = 1; + p.m_rank = 0; + p.m_baseGtoPScale = ptvp.m_baseGtoPScale; + p.m_offset = 0.0f; + p.m_step = 60.0f; + p.m_symbolName = "swimming"; + PathSymbolShape(spline, p).Draw(make_ref(m_batcher), make_ref(m_textures)); + } { vector path1; + path1.push_back(m2::PointD(92.277071f, 47.9271164f)); path1.push_back(m2::PointD(92.277071f, 45.9271164f)); path1.push_back(m2::PointD(98.277071f, 45.9271164f)); path1.push_back(m2::PointD(98.277071f, 40.9271164f)); - path1.push_back(m2::PointD(100.277071f, 38.9271164f)); + path1.push_back(m2::PointD(100.277071f, 42.9271164f)); path1.push_back(m2::PointD(101.277071f, 49.9271164f)); path1.push_back(m2::PointD(102.277071f, 40.9271164f)); + path1.push_back(m2::PointD(105.277071f, 40.9271164f)); + path1.push_back(m2::PointD(101.277071f, 35.9271164f)); + path1.push_back(m2::PointD(90.277071f, 35.9271164f)); + path1.push_back(m2::PointD(89.277071f, 33.9271164f)); m2::SharedSpline spl1(path1); lvp.m_pattern = dp::TextureManager::TStipplePattern{8, 8}; lvp.m_join = dp::RoundJoin; lvp.m_cap = dp::RoundCap; lvp.m_color = dp::Color::Black(); - LineShape(spl1, lvp).Draw(m_batcher.GetRefPointer(), m_textures.GetRefPointer()); + LineShape(spl1, lvp).Draw(make_ref(m_batcher), make_ref(m_textures)); } + + { + vector trg{ m2::PointD(110.0f, 30.0f), m2::PointD(112.0f, 30.0f), m2::PointD(112.0f, 28.0f), + m2::PointD(110.0f, 30.0f), m2::PointD(112.0f, 28.0f), m2::PointD(110.0f, 28.0f) }; + AreaViewParams p; + p.m_color = dp::Color::White(); + p.m_depth = 0.0f; + params.m_minVisibleScale = 1; + params.m_rank = 0; + AreaShape(move(trg), p).Draw(make_ref(m_batcher), make_ref(m_textures)); + } + m_batcher->EndSession(); + + m_batcher->StartSession(flushFn); + { + vector path; + path.push_back(m2::PointD(120.0f, 30.0f)); + path.push_back(m2::PointD(125.0f, 30.0f)); + m2::SharedSpline spl(path); + + LineViewParams lvpl = lvp; + lvpl.m_pattern.clear(); + lvpl.m_depth = -10.0f; + lvpl.m_width = 2.0f; + LineShape(spl, lvpl).Draw(make_ref(m_batcher), make_ref(m_textures)); + + DummyMutableLabel tt(m2::PointF(120.0f, 30.0f), "200 km"); + tt.Draw(make_ref(m_batcher), make_ref(m_textures)); + } + m_batcher->EndSession(); + + m_batcher->StartSession(flushFn); + { + { + vector path; + path.push_back(m2::PointD(110.0f, 25.0f)); + path.push_back(m2::PointD(130.0f, 25.0f)); + m2::SharedSpline spl(path); + + LineViewParams lvpl = lvp; + lvpl.m_pattern.clear(); + lvpl.m_depth = -10.0f; + lvpl.m_width = 2.0f; + LineShape(spl, lvpl).Draw(make_ref(m_batcher), make_ref(m_textures)); + } + + dp::FontDecl font(dp::Color::Black(), 14); + + DummyLabel(m2::PointF(110.0f, 25.0f), "Top\nText", dp::LeftTop, font) + .Draw(make_ref(m_batcher), make_ref(m_textures)); + DummyLabel(m2::PointF(120.0f, 25.0f), "Center\nText", dp::Center, font) + .Draw(make_ref(m_batcher), make_ref(m_textures)); + DummyLabel(m2::PointF(130.0f, 25.0f), "Bottom\nText", dp::RightBottom, font) + .Draw(make_ref(m_batcher), make_ref(m_textures)); + } + m_batcher->EndSession(); } void TestingEngine::DrawRects() @@ -423,6 +567,8 @@ void TestingEngine::DrawRects() LineViewParams lvp; lvp.m_baseGtoPScale = m_modelView.GetScale(); lvp.m_depth = 0.0f; + lvp.m_minVisibleScale = 1; + lvp.m_rank = 0; lvp.m_cap = dp::RoundCap; lvp.m_join = dp::RoundJoin; lvp.m_color = dp::Color::Red(); @@ -443,7 +589,7 @@ void TestingEngine::DrawRects() }; m2::SharedSpline spline(path); - LineShape(spline, lvp).Draw(m_batcher.GetRefPointer(), m_textures.GetRefPointer()); + LineShape(spline, lvp).Draw(make_ref(m_batcher), make_ref(m_textures)); }; for (m2::RectD const & r : m_boundRects) @@ -463,7 +609,7 @@ void TestingEngine::ModelViewInit() math::Matrix m { 34.1554f, 0.0f, 0.0f, 0.0f, -34.1554f, 0.0f, - -2639.46f, 2080.99f, 1.0f}; + -2639.46f, 1800.99f, 1.0f}; // math::Matrix m = math::Inverse(math::Shift( // math::Rotate( @@ -495,43 +641,32 @@ void TestingEngine::ProjectionInit() float const right = left + m_viewport.GetWidth(); float const bottom = m_viewport.GetY0() + m_viewport.GetHeight(); float const top = m_viewport.GetY0(); - float const nearClip = -20000.0f; - float const farClip = 20000.0f; - float m[4 * 4] = {0.}; - m[0] = 2.0f / (right - left); - m[3] = - (right + left) / (right - left); - m[5] = 2.0f / (top - bottom); - m[7] = - (top + bottom) / (top - bottom); - m[10] = -2.0f / (farClip - nearClip); - m[11] = - (farClip + nearClip) / (farClip - nearClip); - m[15] = 1.0; - - m_generalUniforms.SetMatrix4x4Value("projection", m); + array m; + dp::MakeProjection(m, left, right, bottom, top); + m_generalUniforms.SetMatrix4x4Value("projection", m.data()); } -void TestingEngine::OnFlushData(dp::GLState const & state, dp::TransferPointer vao) +void TestingEngine::OnFlushData(dp::GLState const & state, drape_ptr && vao) { - dp::MasterPointer bucket(vao); + drape_ptr bucket = move(vao); bucket->GetBuffer()->Build(m_programManager->GetProgram(state.GetProgramIndex())); - m_scene[state].push_back(bucket); - bucket->ForEachOverlay([this](dp::OverlayHandle * handle) + m_scene[state].push_back(move(bucket)); + for (size_t i = 0; i < m_scene[state].back()->GetOverlayHandlesCount(); ++i) { - handle->Update(m_modelView); - if (handle->IsValid()) + ref_ptr handle = m_scene[state].back()->GetOverlayHandle(i); + if (handle->Update(m_modelView)) { m_boundRects.push_back(handle->GetPixelRect(m_modelView)); m_rects.resize(m_rects.size() + 1); handle->GetPixelShape(m_modelView, m_rects.back()); } - }); + }; } void TestingEngine::ClearScene() { - TScene::iterator it = m_scene.begin(); - for(; it != m_scene.end(); ++it) - DeleteRange(it->second, dp::MasterPointerDeleter()); + m_scene.clear(); } } // namespace df diff --git a/drape_head/testing_engine.hpp b/drape_head/testing_engine.hpp index 7593dfd12f..fb8c175dce 100644 --- a/drape_head/testing_engine.hpp +++ b/drape_head/testing_engine.hpp @@ -12,49 +12,33 @@ #include "std/map.hpp" -#include -#include - namespace df { -class TestingEngine : public QObject +class TestingEngine { public: - TestingEngine(dp::RefPointer oglcontextfactory, - Viewport const & viewport, - MapDataProvider const & model); + TestingEngine(Viewport const & viewport, double vs); ~TestingEngine(); void Draw(); void Resize(int w, int h); - void DragStarted(m2::PointF const & p); - void Drag(m2::PointF const & p); - void DragEnded(m2::PointF const & p); - void Scale(m2::PointF const & p, double factor); - void UpdateCoverage(ScreenBase const & s){}; - -protected: - void timerEvent(QTimerEvent * e); - - int m_timerId; private: void DrawImpl(); void DrawRects(); void ModelViewInit(); void ProjectionInit(); - void OnFlushData(dp::GLState const & state, dp::TransferPointer vao); + void OnFlushData(dp::GLState const & state, drape_ptr && vao); void ClearScene(); private: - dp::RefPointer m_contextFactory; - dp::MasterPointer m_batcher; - dp::MasterPointer m_programManager; - dp::MasterPointer m_textures; + drape_ptr m_batcher; + drape_ptr m_programManager; + drape_ptr m_textures; df::Viewport m_viewport; - typedef map > > TScene; + typedef map > > TScene; TScene m_scene; ScreenBase m_modelView; float m_angle = 0.0; diff --git a/geometry/geometry_tests/screen_test.cpp b/geometry/geometry_tests/screen_test.cpp index 529a30e909..943a8cbe67 100644 --- a/geometry/geometry_tests/screen_test.cpp +++ b/geometry/geometry_tests/screen_test.cpp @@ -98,7 +98,8 @@ UNIT_TEST(ScreenBase_CalcTransform) math::Matrix m = ScreenBase::CalcTransform( m2::PointD(0, 1), m2::PointD(1, 1), m2::PointD( s * sin(a) + dx, s * cos(a) + dy), - m2::PointD(s * cos(a) + s * sin(a) + dx, -s * sin(a) + s * cos(a) + dy)); + m2::PointD(s * cos(a) + s * sin(a) + dx, -s * sin(a) + s * cos(a) + dy), + true /* allow rotate */); ScreenBase::ExtractGtoPParams(m, a1, s1, dx1, dy1); diff --git a/geometry/polyline2d.hpp b/geometry/polyline2d.hpp index 6a56b17073..d10c1cccf5 100644 --- a/geometry/polyline2d.hpp +++ b/geometry/polyline2d.hpp @@ -89,10 +89,7 @@ public: return m_points[idx]; } - vector> const & GetPoints() const - { - return m_points; - } + vector > const & GetPoints() const { return m_points; } friend string DebugPrint(PolylineT const & p) { diff --git a/geometry/robust_orientation.cpp b/geometry/robust_orientation.cpp index 18844a8e93..e7f2e99aad 100644 --- a/geometry/robust_orientation.cpp +++ b/geometry/robust_orientation.cpp @@ -9,10 +9,10 @@ extern "C" #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wconditional-uninitialized" -#include "../3party/robust/predicates.c" +#include "3party/robust/predicates.c" #pragma clang diagnostic pop #else -#include "../3party/robust/predicates.c" +#include "3party/robust/predicates.c" #endif } diff --git a/geometry/screenbase.cpp b/geometry/screenbase.cpp index 08af3c49a0..fdd0f8cb8d 100644 --- a/geometry/screenbase.cpp +++ b/geometry/screenbase.cpp @@ -153,10 +153,11 @@ int ScreenBase::GetHeight() const ScreenBase::MatrixT const ScreenBase::CalcTransform(m2::PointD const & oldPt1, m2::PointD const & oldPt2, - m2::PointD const & newPt1, m2::PointD const & newPt2) + m2::PointD const & newPt1, m2::PointD const & newPt2, + bool allowRotate) { - double s = newPt1.Length(newPt2) / oldPt1.Length(oldPt2); - double a = ang::AngleTo(newPt1, newPt2) - ang::AngleTo(oldPt1, oldPt2); + double const s = newPt1.Length(newPt2) / oldPt1.Length(oldPt2); + double const a = allowRotate ? ang::AngleTo(newPt1, newPt2) - ang::AngleTo(oldPt1, oldPt2) : 0.0; MatrixT m = math::Shift( diff --git a/geometry/screenbase.hpp b/geometry/screenbase.hpp index bfa912e302..eb767e365f 100644 --- a/geometry/screenbase.hpp +++ b/geometry/screenbase.hpp @@ -116,7 +116,8 @@ public: /// Compute arbitrary pixel transformation, that translates the (oldPt1, oldPt2) -> (newPt1, newPt2) static MatrixT const CalcTransform(m2::PointD const & oldPt1, m2::PointD const & oldPt2, - m2::PointD const & newPt1, m2::PointD const & newPt2); + m2::PointD const & newPt1, m2::PointD const & newPt2, + bool allowRotate); /// Setting GtoP matrix extracts the Angle and m_Org parameters, leaving PixelRect intact void SetGtoPMatrix(MatrixT const & m); diff --git a/geometry/spline.cpp b/geometry/spline.cpp index 418bea301e..c3b038e968 100644 --- a/geometry/spline.cpp +++ b/geometry/spline.cpp @@ -23,6 +23,14 @@ Spline::Spline(vector const & path) } } +Spline::Spline(size_t reservedSize) +{ + ASSERT_LESS(0, reservedSize, ()); + m_position.reserve(reservedSize); + m_direction.reserve(reservedSize - 1); + m_length.reserve(reservedSize - 1); +} + void Spline::AddPoint(PointD const & pt) { /// TODO remove this check when fix generator. @@ -44,6 +52,38 @@ void Spline::AddPoint(PointD const & pt) } } +void Spline::ReplacePoint(PointD const & pt) +{ + ASSERT(m_position.size() > 1, ()); + ASSERT(!m_length.empty(), ()); + ASSERT(!m_direction.empty(), ()); + m_position.pop_back(); + m_length.pop_back(); + m_direction.pop_back(); + AddPoint(pt); +} + +bool Spline::IsPrelonging(PointD const & pt) +{ + if (m_position.size() < 2) + return false; + + PointD dir = pt - m_position.back(); + if (dir.IsAlmostZero()) + return true; + + dir = dir.Normalize(); + PointD prevDir = m_direction.back().Normalize(); + + double const MAX_ANGLE_THRESHOLD = 0.995; + return fabs(DotProduct(prevDir, dir)) > MAX_ANGLE_THRESHOLD; +} + +size_t Spline::GetSize() const +{ + return m_position.size(); +} + bool Spline::IsEmpty() const { return m_position.empty(); diff --git a/geometry/spline.hpp b/geometry/spline.hpp index e2800e4669..33d8a01567 100644 --- a/geometry/spline.hpp +++ b/geometry/spline.hpp @@ -45,10 +45,14 @@ public: public: Spline() {} + Spline(size_t reservedSize); Spline(vector const & path); Spline const & operator = (Spline const & spl); void AddPoint(PointD const & pt); + void ReplacePoint(PointD const & pt); + bool IsPrelonging(PointD const & pt); + size_t GetSize() const; vector const & GetPath() const { return m_position; } template diff --git a/geometry/tree4d.hpp b/geometry/tree4d.hpp index 3b9ee92f1f..f0a61bb6d0 100644 --- a/geometry/tree4d.hpp +++ b/geometry/tree4d.hpp @@ -226,6 +226,16 @@ namespace m4 toDo(v.m_val); } + template + bool FindNode(ToDo const & toDo) const + { + for (ValueT const & v : m_tree) + if (toDo(v.m_val)) + return true; + + return false; + } + template void ForEachWithRect(ToDo toDo) const { diff --git a/graphics/agg_traits.hpp b/graphics/agg_traits.hpp deleted file mode 100644 index 9411854bb3..0000000000 --- a/graphics/agg_traits.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -#include "graphics/opengl/data_traits.hpp" - -template -struct AggTraits -{ -}; - -template <> -struct AggTraits -{ - typedef agg::pixfmt_rgba32 pixfmt_t; -}; - -template <> -struct AggTraits -{ - typedef agg::pixfmt_rgb4444 pixfmt_t; -}; diff --git a/graphics/area_renderer.cpp b/graphics/area_renderer.cpp deleted file mode 100644 index 84caf557fe..0000000000 --- a/graphics/area_renderer.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#include "graphics/area_renderer.hpp" -#include "graphics/brush.hpp" -#include "graphics/resource_cache.hpp" - -#include "graphics/opengl/base_texture.hpp" - -#include "base/logging.hpp" - -namespace graphics -{ - AreaRenderer::Params::Params() - : m_drawAreas(true) - { - } - - AreaRenderer::AreaRenderer(Params const & params) - : base_t(params), - m_drawAreas(params.m_drawAreas) - {} - - void AreaRenderer::beginFrame() - { - base_t::beginFrame(); - m_areasCount = 0; - m_trianglesCount = 0; - } - - void AreaRenderer::endFrame() - { - base_t::endFrame(); - } - - void AreaRenderer::drawTrianglesFan(m2::PointF const * points, - size_t pointsCount, - uint32_t resID, - double depth) - { - ++m_areasCount; - m_trianglesCount += (pointsCount - 2); - - if (!m_drawAreas) - return; - - Resource const * res = base_t::fromID(resID); - - ASSERT(res->m_cat == Resource::EBrush, ("triangleFan should be rendered with Brush resource")); - - if (res == 0) - { - LOG(LDEBUG, ("drawTrianglesFan: resID=", resID, " wasn't found on current skin.")); - return; - } - - ASSERT_GREATER_OR_EQUAL(pointsCount, 2, ()); - - float texX = res->m_texRect.minX() + 1.0f; - float texY = res->m_texRect.minY() + 1.0f; - - GeometryPipeline & p = pipeline(res->m_pipelineID); - shared_ptr texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - texture->mapPixel(texX, texY); - - m2::PointF texCoord(texX, texY); - m2::PointF normal(0, 0); - - addTexturedFanStrided(points, sizeof(m2::PointF), - &normal, 0, - &texCoord, 0, - pointsCount, - depth, - res->m_pipelineID); - } - - void AreaRenderer::drawTrianglesList(m2::PointD const * points, size_t pointsCount, uint32_t resID, double depth) - { - ++m_areasCount; - m_trianglesCount += pointsCount / 3; - - if (!m_drawAreas) - return; - - Resource const * res = base_t::fromID(resID); - - ASSERT(res->m_cat == Resource::EBrush, ("area should be rendered with Brush resource")); - - if (res == 0) - { - LOG(LDEBUG, ("drawArea: resID=", resID, " wasn't found on current skin.")); - return; - } - - if (!hasRoom(pointsCount, pointsCount, res->m_pipelineID)) - flush(res->m_pipelineID); - - ASSERT_GREATER_OR_EQUAL(pointsCount, 2, ()); - - float texX = res->m_texRect.minX() + 1.0f; - float texY = res->m_texRect.minY() + 1.0f; - - GeometryPipeline & p = pipeline(res->m_pipelineID); - shared_ptr texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - texture->mapPixel(texX, texY); - - size_t pointsLeft = pointsCount; - size_t batchOffset = 0; - - while (true) - { - size_t batchSize = pointsLeft; - - int vLeft = verticesLeft(res->m_pipelineID); - int iLeft = indicesLeft(res->m_pipelineID); - - if ((vLeft == -1) || (iLeft == -1)) - return; - - if (batchSize > vLeft) - /// Rounding to the boundary of 3 vertices - batchSize = vLeft / 3 * 3; - - if (batchSize > iLeft) - batchSize = iLeft / 3 * 3; - - bool needToFlush = (batchSize < pointsLeft); - - m2::PointF texCoord(texX, texY); - m2::PointF normal(0, 0); - - addTexturedListStrided(&points[batchOffset], sizeof(m2::PointD), - &normal, 0, - &texCoord, 0, - batchSize, - depth, - res->m_pipelineID); - - batchOffset += batchSize; - pointsLeft -= batchSize; - - if (needToFlush) - flush(res->m_pipelineID); - - if (pointsLeft == 0) - break; - } - } -} diff --git a/graphics/area_renderer.hpp b/graphics/area_renderer.hpp deleted file mode 100644 index d5ffa80fe2..0000000000 --- a/graphics/area_renderer.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "graphics/blitter.hpp" - -namespace graphics -{ - class AreaRenderer : public Blitter - { - private: - - unsigned m_trianglesCount; - unsigned m_areasCount; - bool m_drawAreas; - - public: - - typedef Blitter base_t; - - struct Params : base_t::Params - { - bool m_drawAreas; - Params(); - }; - - AreaRenderer(Params const & params); - - /// drawing triangles list. assuming that each 3 points compose a triangle - void drawTrianglesList(m2::PointD const * points, - size_t pointsCount, - uint32_t resID, - double depth); - - void drawTrianglesFan(m2::PointF const * points, - size_t pointsCount, - uint32_t resID, - double depth); - - void beginFrame(); - void endFrame(); - }; -} diff --git a/graphics/blitter.cpp b/graphics/blitter.cpp deleted file mode 100644 index c2e2d462b0..0000000000 --- a/graphics/blitter.cpp +++ /dev/null @@ -1,132 +0,0 @@ -#include "graphics/opengl/base_texture.hpp" -#include "graphics/opengl/buffer_object.hpp" -#include "graphics/opengl/utils.hpp" -#include "graphics/opengl/storage.hpp" -#include "graphics/opengl/vertex.hpp" -#include "graphics/opengl/texture.hpp" - -#include "graphics/blitter.hpp" -#include "graphics/resource_manager.hpp" -#include "graphics/defines.hpp" - -#include "geometry/screenbase.hpp" - -#include "base/logging.hpp" - -#include "std/cstring.hpp" - - -namespace graphics -{ - Blitter::Blitter(base_t::Params const & params) : base_t(params) - { - } - - Blitter::~Blitter() - { - } - - void Blitter::blit(BlitInfo const * blitInfo, - size_t s, - bool isSubPixel) - { - vector geomPts(4 * s); - vector texPts(4 * s); - vector idxData(4 * s); - - for (size_t i = 0; i < s; ++i) - { - calcPoints(blitInfo[i].m_srcRect, - blitInfo[i].m_texRect, - blitInfo[i].m_srcSurface, - blitInfo[i].m_matrix, - isSubPixel, - &geomPts[i * 4], - &texPts[i * 4]); - - idxData[i * 4 ] = i * 4; - idxData[i * 4 + 1] = i * 4 + 1; - idxData[i * 4 + 2] = i * 4 + 2; - idxData[i * 4 + 3] = i * 4 + 3; - } - - TStoragePool * storagePool = resourceManager()->storagePool(ESmallStorage); - gl::Storage storage = storagePool->Reserve(); - - if (storagePool->IsCancelled()) - { - LOG(LDEBUG, ("skipping multiBlit on cancelled multiBlitStorages pool")); - return; - } - - /// TODO : Bad lock/unlock checking pattern. Should refactor - if (!storage.m_vertices->isLocked()) - storage.m_vertices->lock(); - if (!storage.m_indices->isLocked()) - storage.m_indices->lock(); - - gl::Vertex * pointsData = (gl::Vertex*)storage.m_vertices->data(); - - for (size_t i = 0; i < s; ++i) - { - for (size_t j = i * 4; j < (i + 1) * 4; ++j) - { - pointsData[j].pt.x = geomPts[j].x; - pointsData[j].pt.y = geomPts[j].y; - pointsData[j].depth = blitInfo[i].m_depth; - pointsData[j].tex.x = texPts[j].x; - pointsData[j].tex.y = texPts[j].y; - pointsData[j].normal.x = 0; - pointsData[j].normal.y = 0; - } - // pointsData[i].color = graphics::Color(255, 255, 255, 255); - } - - memcpy(storage.m_indices->data(), &idxData[0], idxData.size() * sizeof(unsigned short)); - - base_t::unlockStorage(storage); - base_t::applyBlitStates(); - - for (unsigned i = 0; i < s; ++i) - base_t::drawGeometry(blitInfo[i].m_srcSurface, - storage, - 4, - sizeof(unsigned short) * i * 4, - ETrianglesFan); - - base_t::applyStates(); - base_t::discardStorage(storage); - - base_t::freeStorage(storage, storagePool); - } - - void Blitter::calcPoints(m2::RectI const & srcRect, - m2::RectU const & texRect, - shared_ptr const & srcSurface, - math::Matrix const & m, - bool isSubPixel, - m2::PointF * geomPts, - m2::PointF * texPts) - { - m2::PointF pt = m2::PointF(m2::PointD(srcRect.minX(), srcRect.minY()) * m); - - if (!isSubPixel) - { - pt.x = pt.x - my::rounds(pt.x); - pt.y = pt.y - my::rounds(pt.y); - } - else - pt = m2::PointF(0, 0); - - geomPts[0] = m2::PointF(m2::PointD(srcRect.minX(), srcRect.minY()) * m) + pt; - geomPts[1] = m2::PointF(m2::PointD(srcRect.maxX(), srcRect.minY()) * m) + pt; - geomPts[2] = m2::PointF(m2::PointD(srcRect.maxX(), srcRect.maxY()) * m) + pt; - geomPts[3] = m2::PointF(m2::PointD(srcRect.minX(), srcRect.maxY()) * m) + pt; - - texPts[0] = srcSurface->mapPixel(m2::PointF(texRect.minX(), texRect.minY())); - texPts[1] = srcSurface->mapPixel(m2::PointF(texRect.maxX(), texRect.minY())); - texPts[2] = srcSurface->mapPixel(m2::PointF(texRect.maxX(), texRect.maxY())); - texPts[3] = srcSurface->mapPixel(m2::PointF(texRect.minX(), texRect.maxY())); - } -} - diff --git a/graphics/blitter.hpp b/graphics/blitter.hpp deleted file mode 100644 index 5a1260f6ed..0000000000 --- a/graphics/blitter.hpp +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include "graphics/opengl/storage.hpp" - -#include "graphics/geometry_batcher.hpp" - -#include "geometry/point2d.hpp" -#include "geometry/rect2d.hpp" - -#include "base/buffer_vector.hpp" - -#include "std/shared_ptr.hpp" - -class ScreenBase; - -namespace graphics -{ - struct Color; - - namespace gl - { - class BaseTexture; - } - - struct BlitInfo - { - shared_ptr m_srcSurface; - math::Matrix m_matrix; - m2::RectI m_srcRect; - m2::RectU m_texRect; - double m_depth; - }; - - class Blitter : public GeometryBatcher - { - protected: - - typedef GeometryBatcher base_t; - - void calcPoints(m2::RectI const & srcRect, - m2::RectU const & texRect, - shared_ptr const & texture, - math::Matrix const & m, - bool isSubPixel, - m2::PointF * geomPts, - m2::PointF * texPts); - public: - - Blitter(base_t::Params const & params); - ~Blitter(); - - /// Immediate mode rendering functions. - /// they doesn't buffer any data as other functions do, but immediately renders it - /// @{ - - void blit(BlitInfo const * blitInfo, - size_t s, - bool isSubPixel); - /// @} - }; -} diff --git a/graphics/brush.cpp b/graphics/brush.cpp deleted file mode 100644 index 8cfdaa2d2d..0000000000 --- a/graphics/brush.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "graphics/brush.hpp" -#include "graphics/opengl/data_traits.hpp" - -namespace graphics -{ - Brush::Info::Info() - : Resource::Info(Resource::EBrush) - {} - - Brush::Info::Info(Color const & color) - : Resource::Info(Resource::EBrush), - m_color(color) - {} - - Resource::Info const & Brush::Info::cacheKey() const - { - return *this; - } - - m2::PointU const Brush::Info::resourceSize() const - { - return m2::PointU(2, 2); - } - - Resource * Brush::Info::createResource(m2::RectU const & texRect, - uint8_t pipelineID) const - { - return new Brush(texRect, - pipelineID, - *this); - } - - bool Brush::Info::lessThan(Resource::Info const * r) const - { - if (m_category != r->m_category) - return m_category < r->m_category; - - Brush::Info const * br = static_cast(r); - - if (m_color != br->m_color) - return m_color < br->m_color; - - return false; - } - - Brush::Brush(m2::RectU const & texRect, - uint8_t pipelineID, - Info const & info) - : Resource(EBrush, texRect, pipelineID), - m_info(info) - { - } - - void Brush::render(void *dst) - { - graphics::Color c = m_info.m_color; - m2::RectU const & r = m_texRect; - - DATA_TRAITS::pixel_t px; - - gil::get_color(px, gil::red_t()) = c.r / DATA_TRAITS::channelScaleFactor; - gil::get_color(px, gil::green_t()) = c.g / DATA_TRAITS::channelScaleFactor; - gil::get_color(px, gil::blue_t()) = c.b / DATA_TRAITS::channelScaleFactor; - gil::get_color(px, gil::alpha_t()) = c.a / DATA_TRAITS::channelScaleFactor; - - DATA_TRAITS::view_t v = gil::interleaved_view( - r.SizeX(), r.SizeY(), - (DATA_TRAITS::pixel_t*)dst, - sizeof(DATA_TRAITS::pixel_t) * r.SizeX() - ); - - for (size_t y = 0; y < r.SizeY(); ++y) - for (size_t x = 0; x < r.SizeX(); ++x) - v(x, y) = px; - } - - Resource::Info const * Brush::info() const - { - return &m_info; - } -} diff --git a/graphics/brush.hpp b/graphics/brush.hpp deleted file mode 100644 index b40f6cd505..0000000000 --- a/graphics/brush.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "graphics/resource.hpp" -#include "graphics/color.hpp" - -namespace graphics -{ - struct Brush : public Resource - { - struct Info : public Resource::Info - { - Color m_color; - - Info(); - explicit Info(Color const & color); - - Resource::Info const & cacheKey() const; - m2::PointU const resourceSize() const; - Resource * createResource(m2::RectU const & texRect, - uint8_t pipelineID) const; - - bool lessThan(Resource::Info const * r) const; - }; - - Info m_info; - - Brush(m2::RectU const & texRect, - uint8_t pipelineID, - Info const & info); - - void render(void * dst); - Resource::Info const * info() const; - }; -} diff --git a/graphics/circle.cpp b/graphics/circle.cpp deleted file mode 100644 index 53d443f9e6..0000000000 --- a/graphics/circle.cpp +++ /dev/null @@ -1,200 +0,0 @@ -#include "base/SRC_FIRST.hpp" - -#include "graphics/circle.hpp" -#include "graphics/opengl/data_traits.hpp" -#include "graphics/agg_traits.hpp" - -#include "base/math.hpp" - -namespace graphics -{ - Circle::Info::Info(double radius, - Color const & color, - bool isOutlined, - double outlineWidth, - Color const & outlineColor) - : Resource::Info(Resource::ECircle), - m_radius(my::rounds(radius)), - m_color(color), - m_isOutlined(isOutlined), - m_outlineWidth(my::rounds(outlineWidth)), - m_outlineColor(outlineColor) - { - if (!m_isOutlined) - { - m_outlineWidth = 0; - m_outlineColor = graphics::Color(0, 0, 0, 0); - } - } - - Circle::Info::Info() - : Resource::Info(Resource::ECircle), - m_radius(0), - m_color(0, 0, 0, 0), - m_isOutlined(false), - m_outlineWidth(0), - m_outlineColor() - {} - - bool Circle::Info::lessThan(Resource::Info const * r) const - { - if (m_category != r->m_category) - return m_category < r->m_category; - - Circle::Info const * ci = static_cast(r); - - if (m_radius != ci->m_radius) - return m_radius < ci->m_radius; - if (m_color != ci->m_color) - return m_color < ci->m_color; - if (m_isOutlined != ci->m_isOutlined) - return m_isOutlined < ci->m_isOutlined; - if (m_outlineWidth != ci->m_outlineWidth) - return m_outlineWidth < ci->m_outlineWidth; - if (m_outlineColor != ci->m_outlineColor) - return m_outlineColor < ci->m_outlineColor; - - return false; - } - - Resource::Info const & Circle::Info::cacheKey() const - { - return *this; - } - - m2::PointU const Circle::Info::resourceSize() const - { - unsigned r = m_isOutlined ? m_radius + m_outlineWidth : m_radius; - return m2::PointU(r * 2 + 4, r * 2 + 4); - } - - Resource * Circle::Info::createResource(m2::RectU const & texRect, - uint8_t pipelineID) const - { - return new Circle(texRect, - pipelineID, - *this); - } - - Circle::Circle(m2::RectU const & texRect, - int pipelineID, - Info const & info) - : Resource(ECircle, texRect, pipelineID), - m_info(info) - {} - - void Circle::render(void * dst) - { - m2::RectU const & rect = m_texRect; - - DATA_TRAITS::view_t v = gil::interleaved_view( - rect.SizeX(), rect.SizeY(), - (DATA_TRAITS::pixel_t*)dst, - sizeof(DATA_TRAITS::pixel_t) * rect.SizeX() - ); - - Circle::Info info = m_info; - - agg::rgba8 aggColor(info.m_color.r, - info.m_color.g, - info.m_color.b, - info.m_color.a); - - agg::rgba8 aggOutlineColor(info.m_outlineColor.r, - info.m_outlineColor.g, - info.m_outlineColor.b, - info.m_outlineColor.a); - - info.m_color /= DATA_TRAITS::channelScaleFactor; - - DATA_TRAITS::pixel_t gilColorTranslucent; - - gil::get_color(gilColorTranslucent, gil::red_t()) = info.m_color.r; - gil::get_color(gilColorTranslucent, gil::green_t()) = info.m_color.g; - gil::get_color(gilColorTranslucent, gil::blue_t()) = info.m_color.b; - gil::get_color(gilColorTranslucent, gil::alpha_t()) = 0; - - info.m_outlineColor /= DATA_TRAITS::channelScaleFactor; - - DATA_TRAITS::pixel_t gilOutlineColorTranslucent; - - gil::get_color(gilOutlineColorTranslucent, gil::red_t()) = info.m_outlineColor.r; - gil::get_color(gilOutlineColorTranslucent, gil::green_t()) = info.m_outlineColor.g; - gil::get_color(gilOutlineColorTranslucent, gil::blue_t()) = info.m_outlineColor.b; - gil::get_color(gilOutlineColorTranslucent, gil::alpha_t()) = 0; - - DATA_TRAITS::pixel_t gilColor = gilColorTranslucent; - gil::get_color(gilColor, gil::alpha_t()) = info.m_color.a; - - DATA_TRAITS::pixel_t gilOutlineColor = gilOutlineColorTranslucent; - gil::get_color(gilOutlineColor, gil::alpha_t()) = info.m_outlineColor.a; - - /// draw circle - agg::rendering_buffer buf( - (unsigned char *)&v(0, 0), - rect.SizeX(), - rect.SizeY(), - rect.SizeX() * sizeof(DATA_TRAITS::pixel_t) - ); - - typedef AggTraits::pixfmt_t agg_pixfmt_t; - - agg_pixfmt_t pixfmt(buf); - agg::renderer_base rbase(pixfmt); - - if (info.m_isOutlined) - gil::fill_pixels(v, gilOutlineColorTranslucent); - else - gil::fill_pixels(v, gilColorTranslucent); - - m2::PointD center(info.resourceSize()); - center *= 0.5; - - agg::scanline_u8 s; - agg::rasterizer_scanline_aa<> rasterizer; - - agg::ellipse ell; - - unsigned radius = info.m_radius; - if (info.m_isOutlined) - radius += info.m_outlineWidth; - - ell.init(center.x, - center.y, - radius, - radius, - 100); - - rasterizer.add_path(ell); - - agg::render_scanlines_aa_solid(rasterizer, - s, - rbase, - info.m_isOutlined ? aggOutlineColor : aggColor); - - if (info.m_isOutlined) - { - /// drawing inner circle - ell.init(center.x, - center.y, - info.m_radius, - info.m_radius, - 100); - - rasterizer.reset(); - rasterizer.add_path(ell); - - agg::render_scanlines_aa_solid(rasterizer, - s, - rbase, - aggColor); - - } - } - - Resource::Info const * Circle::info() const - { - return &m_info; - } -} - diff --git a/graphics/circle.hpp b/graphics/circle.hpp deleted file mode 100644 index 63c8e3c82a..0000000000 --- a/graphics/circle.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include "graphics/color.hpp" -#include "graphics/resource.hpp" - -#include "geometry/point2d.hpp" - -namespace graphics -{ - struct Circle : public Resource - { - struct Info : public Resource::Info - { - unsigned m_radius; - Color m_color; - bool m_isOutlined; - unsigned m_outlineWidth; - Color m_outlineColor; - - Info(); - Info(double radius, - Color const & color = Color(0, 0, 0, 255), - bool isOutlined = false, - double outlineWidth = 1, - Color const & outlineColor = Color(255, 255, 255, 255)); - - Resource::Info const & cacheKey() const; - m2::PointU const resourceSize() const; - Resource * createResource(m2::RectU const & texRect, - uint8_t pipelineID) const; - - bool lessThan(Resource::Info const * r) const; - }; - - Info m_info; - - Circle(m2::RectU const & texRect, - int pipelineID, - Info const & info); - - void render(void * dst); - Resource::Info const * info() const; - }; -} diff --git a/graphics/circle_element.cpp b/graphics/circle_element.cpp deleted file mode 100644 index 50ed0b1dfa..0000000000 --- a/graphics/circle_element.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "graphics/circle_element.hpp" - -#include "graphics/overlay_renderer.hpp" - -namespace graphics -{ - CircleElement::Params::Params() - : m_ci() - {} - - CircleElement::CircleElement(Params const & p) - : BaseT(p), - m_ci(p.m_ci) - {} - - m2::RectD CircleElement::GetBoundRect() const - { - // Skip for one pixel on every border. - m2::PointD sz = m_ci.resourceSize(); - sz -= m2::PointD(2, 2); - - m2::PointD const posPt = computeTopLeft(sz, pivot(), position()); - return m2::RectD(posPt, posPt + sz); - } - - void CircleElement::draw(OverlayRenderer * r, math::Matrix const & m) const - { - if (!isNeedRedraw()) - return; - - uint32_t resID = r->mapInfo(m_ci); - - Resource const * res = r->fromID(resID); - ASSERT_NOT_EQUAL ( res, 0, () ); - - m2::RectI texRect(res->m_texRect); - texRect.Inflate(-1, -1); - - m2::PointD posPt = computeTopLeft(m2::PointD(texRect.SizeX(), texRect.SizeY()), - pivot() * m, - position()); - - - r->drawTexturedPolygon(m2::PointD(0.0, 0.0), 0.0, - texRect.minX(), texRect.minY(), texRect.maxX(), texRect.maxY(), - posPt.x, posPt.y, posPt.x + texRect.SizeX(), posPt.y + texRect.SizeY(), - depth(), - res->m_pipelineID); - } - - void CircleElement::setTransformation(const math::Matrix & m) - { - setPivot(pivot() * getResetMatrix() * m); - BaseT::setTransformation(m); - } -} diff --git a/graphics/circle_element.hpp b/graphics/circle_element.hpp deleted file mode 100644 index aa3a474a62..0000000000 --- a/graphics/circle_element.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "graphics/overlay_element.hpp" -#include "graphics/circle.hpp" - - -namespace graphics -{ - class CircleElement : public OverlayElement - { - Circle::Info m_ci; - - public: - typedef OverlayElement BaseT; - - struct Params : public BaseT::Params - { - Circle::Info m_ci; - Params(); - }; - - CircleElement(Params const & p); - - virtual m2::RectD GetBoundRect() const; - - void draw(OverlayRenderer * s, math::Matrix const & m) const; - - void setTransformation(const math::Matrix & m); - }; -} diff --git a/graphics/circled_symbol.cpp b/graphics/circled_symbol.cpp deleted file mode 100644 index de74075959..0000000000 --- a/graphics/circled_symbol.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "graphics/circled_symbol.hpp" - -namespace graphics -{ - CircledSymbol::CircledSymbol(SymbolElement::Params const & symbolElement, - CircleElement::Params const & circleElement) - : SymbolElement(symbolElement) - , m_circle(circleElement) {} - - void CircledSymbol::draw(OverlayRenderer * s, math::Matrix const & m) const - { - m_circle.draw(s, m); - SymbolElement::draw(s, m); - } - - void CircledSymbol::setTransformation(const math::Matrix & m) - { - m_circle.setTransformation(m); - SymbolElement::setTransformation(m); - } -} diff --git a/graphics/circled_symbol.hpp b/graphics/circled_symbol.hpp deleted file mode 100644 index ece9ec7ff8..0000000000 --- a/graphics/circled_symbol.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "graphics/symbol_element.hpp" -#include "graphics/circle_element.hpp" - -namespace graphics -{ - class CircledSymbol : public SymbolElement - { - public: - CircledSymbol(SymbolElement::Params const & symbolElement, - CircleElement::Params const & circleElement); - - void draw(OverlayRenderer * s, math::Matrix const & m) const; - void setTransformation(const math::Matrix & m); - - private: - CircleElement m_circle; - }; -} diff --git a/graphics/color.cpp b/graphics/color.cpp deleted file mode 100644 index 24c947f705..0000000000 --- a/graphics/color.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "graphics/color.hpp" - - -namespace graphics -{ - -Color::Color(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t a1) - : r(r1), g(g1), b(b1), a(a1) -{} - -Color::Color() : r(0), g(0), b(0), a(0) -{} - -Color::Color(Color const & c) -{ - r = c.r; - g = c.g; - b = c.b; - a = c.a; -} - -Color const & Color::operator=(Color const & c) -{ - if (&c != this) - { - r = c.r; - g = c.g; - b = c.b; - a = c.a; - } - return *this; -} - -Color const Color::fromXRGB(uint32_t _c, uint8_t _a) -{ - return Color(redFromARGB(_c), greenFromARGB(_c), blueFromARGB(_c), _a); -} - -Color const Color::fromARGB(uint32_t _c) -{ - return Color(redFromARGB(_c), greenFromARGB(_c), blueFromARGB(_c), alphaFromARGB(_c)); -} - -Color const & Color::operator /= (unsigned k) -{ - r /= k; - g /= k; - b /= k; - a /= k; - - return *this; -} - -bool operator < (Color const & l, Color const & r) -{ - if (l.r != r.r) return l.r < r.r; - if (l.g != r.g) return l.g < r.g; - if (l.b != r.b) return l.b < r.b; - if (l.a != r.a) return l.a < r.a; - return false; -} - -bool operator > (Color const & l, Color const & r) -{ - if (l.r != r.r) return l.r > r.r; - if (l.g != r.g) return l.g > r.g; - if (l.b != r.b) return l.b > r.b; - if (l.a != r.a) return l.a > r.a; - return false; -} - -bool operator != (Color const & l, Color const & r) -{ - return (l.r != r.r) || (l.g != r.g) || (l.b != r.b) || (l.a != r.a); -} - -bool operator == (Color const & l, Color const & r) -{ - return !(l != r); -} - -Color Color::Black() -{ - return Color(0, 0, 0, 255); -} - -Color Color::White() -{ - return Color(255, 255, 255, 255); -} - -Color Color::Red() -{ - return Color(255, 0, 0, 255); -} - -Color Color::Green() -{ - return Color(0, 255, 0, 255); -} - -Color Color::Blue() -{ - return Color(0, 0, 255, 255); -} - -} diff --git a/graphics/color.hpp b/graphics/color.hpp deleted file mode 100644 index 9c0dd81f71..0000000000 --- a/graphics/color.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include "std/cstdint.hpp" -#include "std/string.hpp" -#include "std/sstream.hpp" - -namespace graphics -{ - -struct Color -{ - uint8_t r; - uint8_t g; - uint8_t b; - uint8_t a; - - /// alpha 255 means non-transparent and 0 means fully transparent - Color(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t a1); - Color(); - Color(Color const & p); - Color const & operator=(Color const & p); - - static Color const fromARGB(uint32_t _c); - static Color const fromXRGB(uint32_t _c, uint8_t _a = 0); - - Color const & operator /= (unsigned k); - - static Color Black(); - static Color White(); - static Color Red(); - static Color Green(); - static Color Blue(); -}; - -bool operator < (Color const & l, Color const & r); -bool operator > (Color const & l, Color const & r); -bool operator !=(Color const & l, Color const & r); -bool operator ==(Color const & l, Color const & r); - -inline int redFromARGB(uint32_t c) {return (c >> 16) & 0xFF;} -inline int greenFromARGB(uint32_t c) {return (c >> 8) & 0xFF; } -inline int blueFromARGB(uint32_t c) {return (c & 0xFF); } -inline int alphaFromARGB(uint32_t c) {return (c >> 24) & 0xFF;} - -inline string DebugPrint(Color const & c) -{ - ostringstream os; - os << "r: " << (int)c.r << " "; - os << "g: " << (int)c.g << " "; - os << "b: " << (int)c.b << " "; - os << "alpha: " << (int)c.a; - return os.str(); -} - -} diff --git a/graphics/coordinates.cpp b/graphics/coordinates.cpp deleted file mode 100644 index ff761e6c21..0000000000 --- a/graphics/coordinates.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "graphics/coordinates.hpp" - -namespace graphics -{ - void getOrthoMatrix(math::Matrix & m, - float l, - float r, - float b, - float t, - float n, - float f) - { - m(0, 0) = 2 / (r - l); m(0, 1) = 0; m(0, 2) = 0; m(0, 3) = -(r + l) / (r - l); - m(1, 0) = 0; m(1, 1) = 2 / (t - b);m(1, 2) = 0; m(1, 3) = -(t + b) / (t - b); - m(2, 0) = 0; m(2, 1) = 0; m(2, 2) = -2 / (f - n); m(2, 3) = (f + n) / (f - n); - m(3, 0) = 0; m(3, 1) = 0; m(3, 2) = 0; m(3, 3) = 1; - } -} diff --git a/graphics/coordinates.hpp b/graphics/coordinates.hpp deleted file mode 100644 index 06d0c26435..0000000000 --- a/graphics/coordinates.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "base/matrix.hpp" - -namespace graphics -{ - /// Calculate matrix for orthographic projection - void getOrthoMatrix(math::Matrix & m, - float left, - float right, - float bottom, - float top, - float near, - float far); -} diff --git a/graphics/data_formats.cpp b/graphics/data_formats.cpp deleted file mode 100644 index 78a058efed..0000000000 --- a/graphics/data_formats.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "graphics/data_formats.hpp" - -namespace graphics -{ - struct DataFormatInfo - { - graphics::DataFormat m_fmt; - unsigned m_size; - char const * m_name; - DataFormatInfo(graphics::DataFormat fmt, unsigned size, char const * name) - : m_fmt(fmt), m_size(size), m_name(name) - {} - }; - - DataFormatInfo s_info [] = {DataFormatInfo(Data4Bpp, 2, "Data4Bpp"), - DataFormatInfo(Data8Bpp, 4, "Data8Bpp"), - DataFormatInfo(Data565Bpp, 2, "Data565Bpp"), - DataFormatInfo((graphics::DataFormat)0, 0, "Unknown")}; - - DataFormatInfo const findInfo(graphics::DataFormat const & fmt) - { - unsigned const cnt = sizeof(s_info) / sizeof(DataFormatInfo); - for (unsigned i = 0; i < cnt; ++i) - if (s_info[i].m_fmt == fmt) - return s_info[i]; - - return s_info[cnt - 1]; - } - - unsigned formatSize(DataFormat const & fmt) - { - return findInfo(fmt).m_size; - } - - char const * formatName(DataFormat const & fmt) - { - return findInfo(fmt).m_name; - } -} diff --git a/graphics/data_formats.hpp b/graphics/data_formats.hpp deleted file mode 100644 index 2f1a1594f9..0000000000 --- a/graphics/data_formats.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -namespace graphics -{ - enum DataFormat - { - Data8Bpp, - Data4Bpp, - Data565Bpp - }; - - /// getting size of the pixel in specified DataFormat. - unsigned formatSize(DataFormat const & fmt); - /// getting string representation of the specified DataFormat. - char const * formatName(DataFormat const & fmt); -} diff --git a/graphics/defines.cpp b/graphics/defines.cpp deleted file mode 100644 index 34b08cc042..0000000000 --- a/graphics/defines.cpp +++ /dev/null @@ -1,159 +0,0 @@ -#include "graphics/defines.hpp" - -#include "coding/file_name_utils.hpp" - -#include "platform/platform.hpp" - -#include "base/macros.hpp" -#include "base/logging.hpp" - -#include "std/string.hpp" -#include "std/cstring.hpp" - - -namespace graphics -{ - namespace - { - // Use custom struct to leave {} initialization notation (pair doesn't support it). - template struct DataT - { - FirstT first; - SecondT second; - }; - - typedef DataT DataIS; - - template - SecondT FindSecondByFirst(DataT (&arr)[N], int t) - { - for (size_t i = 0; i < N; ++i) - { - if (t == arr[i].first) - return arr[i].second; - } - - LOG(LERROR, (t)); - return SecondT(); - } - - template - FirstT FindFirstBySecond(DataT (&arr)[N], - SecondT t, CompareT comp) - { - for (size_t i = 0; i < N; ++i) - { - if (comp(t, arr[i].second)) - return arr[i].first; - } - - LOG(LERROR, (t)); - return FirstT(); - } - - struct EqualStrings - { - bool operator() (char const * s1, char const * s2) const - { - return (strcmp(s1, s2) == 0); - } - }; - } - - DataIS s_density[] = { - {EDensityLDPI, "ldpi"}, - {EDensityMDPI, "mdpi"}, - {EDensityHDPI, "hdpi"}, - {EDensityXHDPI, "xhdpi"}, - {EDensityXXHDPI, "xxhdpi"}, - {EDensityIPhone6Plus, "6plus"} - }; - - char const * convert(EDensity density) - { - return FindSecondByFirst(s_density, density); - } - - void convert(char const * name, EDensity & density) - { - density = static_cast(FindFirstBySecond(s_density, name, EqualStrings())); - } - - double visualScaleExact(int exactDensityDPI) - { - double const mdpiDensityDPI = 160.; - - // For some old devices (for example iPad 2) the density could be less than 160 DPI. - // Returns one in that case to keep readable text on the map. - if (exactDensityDPI <= mdpiDensityDPI) - return 1.; - return exactDensityDPI / mdpiDensityDPI; - } - - DataIS s_semantics[] = { - {ESemPosition, "Position"}, - {ESemNormal, "Normal"}, - {ESemTexCoord0, "TexCoord0"}, - {ESemSampler0, "Sampler0"}, - {ESemModelView, "ModelView"}, - {ESemProjection, "Projection"}, - {ETransparency, "Transparency"}, - {ESemLength, "Length"}, - {ERouteHalfWidth, "u_halfWidth"}, - {ERouteColor, "u_color"}, - {ERouteClipLength, "u_clipLength"}, - {ERouteTextureRect, "u_textureRect"} - }; - - void convert(char const * name, ESemantic & sem) - { - sem = static_cast(FindFirstBySecond(s_semantics, name, EqualStrings())); - } - - DataIS s_storages[] = { - {ETinyStorage, "TinyStorage"}, - {ESmallStorage, "SmallStorage"}, - {EMediumStorage, "MediumStorage"}, - {ELargeStorage, "LargeStorage"}, - {EInvalidStorage, "InvalidStorage"} - }; - - char const * convert(EStorageType type) - { - return FindSecondByFirst(s_storages, type); - } - - DataIS s_textures[] = { - {ESmallTexture, "SmallTexture"}, - {EMediumTexture, "MediumTexture"}, - {ELargeTexture, "LargeTexture"}, - {ERenderTargetTexture, "RenderTargetTexture"}, - {EStaticTexture, "StaticTexture"}, - {EInvalidTexture, "InvalidTexture"} - }; - - char const * convert(ETextureType type) - { - return FindSecondByFirst(s_textures, type); - } - - DataT s_dataTypes[] = { - {EInteger, sizeof(int)}, - {EIntegerVec2, sizeof(int) * 2}, - {EIntegerVec3, sizeof(int) * 3}, - {EIntegerVec4, sizeof(int) * 4}, - {EFloat, sizeof(float)}, - {EFloatVec2, sizeof(float) * 2}, - {EFloatVec3, sizeof(float) * 3}, - {EFloatVec4, sizeof(float) * 4}, - {EFloatMat2, sizeof(float) * 4}, - {EFloatMat3, sizeof(float) * 9}, - {EFloatMat4, sizeof(float) * 16}, - {ESampler2D, sizeof(int)} - }; - - unsigned elemSize(EDataType type) - { - return FindSecondByFirst(s_dataTypes, type); - } -} diff --git a/graphics/defines.hpp b/graphics/defines.hpp deleted file mode 100644 index 348d25effc..0000000000 --- a/graphics/defines.hpp +++ /dev/null @@ -1,133 +0,0 @@ -#pragma once - -#include "std/string.hpp" - -namespace graphics -{ - static const int maxDepth = 20000; - static const int minDepth = -20000; - - enum EDensity - { - EDensityLDPI = 0, //< The first must be 0 - EDensityMDPI, - EDensityHDPI, - EDensityXHDPI, - EDensityXXHDPI, - EDensityIPhone6Plus, - // Add new density here - - // Specifies number of EDensity enum values, must be last - EDensityCount - }; - - /// get density name - char const * convert(EDensity density); - - /// get density from name - void convert(char const * name, EDensity & density); - - /// Gets visual scale by exact density in dpi. - double visualScaleExact(int exactDensityDPI); - - /// When adding values here, - /// please check constructor of ResourceManager, - /// and defines.cpp - enum ETextureType - { - ESmallTexture = 0, - EMediumTexture, - ELargeTexture, - ERenderTargetTexture, - EStaticTexture, - EInvalidTexture //< Should be last - }; - - char const * convert(ETextureType type); - - /// When adding values here, - /// please check constructor of ResourceManager. - enum EStorageType - { - ETinyStorage = 0, - ESmallStorage, - EMediumStorage, - ELargeStorage, - EInvalidStorage //< Should be last - }; - - char const * convert(EStorageType type); - - enum EShaderType - { - EVertexShader, - EFragmentShader - }; - - enum ESemantic - { - ESemPosition, - ESemNormal, - ESemTexCoord0, - ESemSampler0, - ESemModelView, - ESemProjection, - ETransparency, - ESemLength, - ERouteHalfWidth, - ERouteColor, - ERouteClipLength, - ERouteTextureRect - }; - - void convert(char const * name, ESemantic & sem); - - enum EDataType - { - EInteger, - EIntegerVec2, - EIntegerVec3, - EIntegerVec4, - EFloat, - EFloatVec2, - EFloatVec3, - EFloatVec4, - EFloatMat2, - EFloatMat3, - EFloatMat4, - ESampler2D - }; - - unsigned elemSize(EDataType dt); - - enum EPrimitives - { - ETriangles, - ETrianglesFan, - ETrianglesStrip - }; - - enum EMatrix - { - EModelView, - EProjection - }; - - enum EDepthFunc - { - ELessEqual - }; - - enum EPosition - { - EPosCenter = 0x00, - EPosAbove = 0x01, - EPosUnder = 0x02, - EPosLeft = 0x04, - EPosRight = 0x10, - EPosAboveLeft = EPosAbove | EPosLeft, - EPosAboveRight = EPosAbove | EPosRight, - EPosUnderLeft = EPosUnder | EPosLeft, - EPosUnderRight = EPosUnder | EPosRight - }; -} diff --git a/graphics/depth_constants.hpp b/graphics/depth_constants.hpp deleted file mode 100644 index 3b7cb3c042..0000000000 --- a/graphics/depth_constants.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "graphics/defines.hpp" - -namespace graphics -{ - static const int debugDepth = maxDepth; - static const int benchmarkDepth = maxDepth; - - static const int compassDepth = maxDepth; - static const int rulerDepth = maxDepth; - static const int countryStatusDepth = maxDepth - 10; - - /// @todo 100 is a temporary solution fo iOS. - /// Need to review logic of gui elements, glyphs and symbols caching - /// (display_list_cache.dpp). Depth is hardcoded there. - static const int balloonContentInc = 100; - static const int balloonBaseDepth = countryStatusDepth - (balloonContentInc + 10); - - static const int locationDepth = balloonBaseDepth - 10; - static const int locationFaultDepth = locationDepth - 10; - - static const int routingFinishDepth = locationFaultDepth - balloonContentInc; - static const int activePinDepth = routingFinishDepth - balloonContentInc; - static const int routingSymbolsDepth = activePinDepth - balloonContentInc; - static const int tracksDepth = routingSymbolsDepth - balloonContentInc; - static const int arrowDepth = tracksDepth + 10; - static const int tracksOutlineDepth = tracksDepth - 10; - static const int bookmarkDepth = tracksOutlineDepth - balloonContentInc; -} diff --git a/graphics/display_list.cpp b/graphics/display_list.cpp deleted file mode 100644 index af47992f07..0000000000 --- a/graphics/display_list.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "graphics/display_list.hpp" -#include "graphics/render_context.hpp" - -namespace graphics -{ - DisplayList::DisplayList(DisplayListRenderer * parent) - : m_parent(parent), - m_isDebugging(false) - {} - - DisplayList::~DisplayList() - { - set::const_iterator tit; - for (tit = m_textures.begin(); - tit != m_textures.end(); - ++tit) - m_parent->removeTextureRef(*tit); - - set::const_iterator sit; - for (sit = m_storages.begin(); - sit != m_storages.end(); - ++sit) - m_parent->removeStorageRef(*sit); - - m_commands.clear(); - } - - void DisplayList::applySharpStates(shared_ptr const & cmd) - { - cmd->setIsDebugging(m_isDebugging); - m_commands.push_back(cmd); - } - - void DisplayList::applyBlitStates(shared_ptr const & cmd) - { - cmd->setIsDebugging(m_isDebugging); - m_commands.push_back(cmd); - } - - void DisplayList::applyStates(shared_ptr const & cmd) - { - cmd->setIsDebugging(m_isDebugging); - m_commands.push_back(cmd); - } - - void DisplayList::makeTextureRef(shared_ptr const & texture) - { - TextureRef tref(texture.get()); - - if (texture && m_textures.insert(tref).second) - m_parent->addTextureRef(tref); - } - - void DisplayList::makeStorageRef(gl::Storage const & storage) - { - StorageRef sref(storage.m_vertices.get(), storage.m_indices.get()); - - if (storage.isValid() && m_storages.insert(sref).second) - m_parent->addStorageRef(sref); - } - - void DisplayList::drawGeometry(shared_ptr const & cmd) - { - cmd->setIsDebugging(m_isDebugging); - makeTextureRef(cmd->m_texture); - makeStorageRef(cmd->m_storage); - m_commands.push_back(cmd); - } - - void DisplayList::drawRouteGeometry(shared_ptr const & cmd) - { - cmd->setIsDebugging(m_isDebugging); - makeTextureRef(cmd->m_texture); - m_commands.push_back(cmd); - } - - void DisplayList::unlockStorage(shared_ptr const & cmd) - { - cmd->setIsDebugging(m_isDebugging); - m_parent->processCommand(cmd); - } - - void DisplayList::freeStorage(shared_ptr const & cmd) - { - } - - void DisplayList::freeTexture(shared_ptr const & cmd) - { - } - - void DisplayList::discardStorage(shared_ptr const & cmd) - { - } - - void DisplayList::uploadResources(shared_ptr const & cmd) - { - cmd->setIsDebugging(m_isDebugging); - m_parent->processCommand(cmd); - } - - void DisplayList::clear(shared_ptr const & cmd) - { - cmd->setIsDebugging(m_isDebugging); - m_commands.push_back(cmd); - } - - void DisplayList::addCheckPoint() - { - static_cast(m_parent)->addCheckPoint(); - } - - void DisplayList::draw(DisplayListRenderer * r, math::Matrix const & m, - UniformsHolder * holder, size_t indicesCount) - { - math::Matrix mv; - - /// preparing ModelView matrix - - mv(0, 0) = m(0, 0); mv(0, 1) = m(1, 0); mv(0, 2) = 0; mv(0, 3) = m(2, 0); - mv(1, 0) = m(0, 1); mv(1, 1) = m(1, 1); mv(1, 2) = 0; mv(1, 3) = m(2, 1); - mv(2, 0) = 0; mv(2, 1) = 0; mv(2, 2) = 1; mv(2, 3) = 0; - mv(3, 0) = m(0, 2); mv(3, 1) = m(1, 2); mv(3, 2) = 0; mv(3, 3) = m(2, 2); - - r->renderContext()->setMatrix(EModelView, mv); - - /// drawing collected geometry - - for (list >::const_iterator it = m_commands.begin(); - it != m_commands.end(); - ++it) - { - (*it)->setRenderContext(r->renderContext()); - if (holder != NULL && (*it)->isNeedAdditionalUniforms()) - (*it)->setAdditionalUniforms(*holder); - else - (*it)->resetAdditionalUniforms(); - - if ((*it)->isNeedIndicesCount()) - (*it)->setIndicesCount(indicesCount); - - (*it)->perform(); - } - - r->renderContext()->setMatrix(EModelView, math::Identity()); - } -} diff --git a/graphics/display_list.hpp b/graphics/display_list.hpp deleted file mode 100644 index 1c041d66ca..0000000000 --- a/graphics/display_list.hpp +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once - -#include "graphics/uniforms_holder.hpp" -#include "graphics/defines.hpp" -#include "graphics/display_list_renderer.hpp" -#include "graphics/opengl/base_texture.hpp" -#include "graphics/opengl/buffer_object.hpp" - -#include "std/set.hpp" - -namespace graphics -{ - class DisplayList - { - private: - - typedef gl::GeometryRenderer::DrawGeometry DrawGeometryCmd; - typedef gl::GeometryRenderer::DrawRouteGeometry DrawRouteGeometryCmd; - typedef gl::GeometryRenderer::DiscardStorage DiscardStorageCmd; - typedef gl::GeometryRenderer::FreeTexture FreeTextureCmd; - typedef gl::GeometryRenderer::UnlockStorage UnlockStorageCmd; - typedef gl::GeometryRenderer::FreeStorage FreeStorageCmd; - typedef gl::GeometryRenderer::ApplyBlitStates ApplyBlitStatesCmd; - typedef gl::GeometryRenderer::ApplyStates ApplyStatesCmd; - typedef gl::GeometryRenderer::ApplySharpStates ApplySharpStatesCmd; - typedef gl::GeometryRenderer::UploadData UploadDataCmd; - typedef gl::GeometryRenderer::ClearCommand ClearCommandCmd; - - list > m_commands; - - typedef DisplayListRenderer::TextureRef TextureRef; - typedef DisplayListRenderer::StorageRef StorageRef; - - set m_textures; - set m_storages; - - DisplayListRenderer * m_parent; - bool m_isDebugging; - - DisplayList(DisplayListRenderer * parent); - - friend class DisplayListRenderer; - - void makeTextureRef(shared_ptr const & texture); - void makeStorageRef(gl::Storage const & storage); - - public: - - ~DisplayList(); - - void applyStates(shared_ptr const & cmd); - void applyBlitStates(shared_ptr const & cmd); - void applySharpStates(shared_ptr const & cmd); - void drawGeometry(shared_ptr const & cmd); - void drawRouteGeometry(shared_ptr const & cmd); - void unlockStorage(shared_ptr const & cmd); - void discardStorage(shared_ptr const & cmd); - void freeTexture(shared_ptr const & cmd); - void freeStorage(shared_ptr const & cmd); - void uploadResources(shared_ptr const & cmd); - void clear(shared_ptr const & cmd); - void addCheckPoint(); - - void draw(DisplayListRenderer * r, math::Matrix const & m, - UniformsHolder * holder = nullptr, size_t indicesCount = 0); - }; -} diff --git a/graphics/display_list_renderer.cpp b/graphics/display_list_renderer.cpp deleted file mode 100644 index 86336f402f..0000000000 --- a/graphics/display_list_renderer.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include "graphics/display_list_renderer.hpp" -#include "graphics/display_list.hpp" - -namespace graphics -{ - - namespace - { - template - void InsertFreeCommand(DisplayListRenderer::DelayedCommandMap & map, - TKey const & key, shared_ptr const & command) - { - /// Before free resource call we must (and it is) call drawGeometry with this resource - /// It creates node in DelayedCommandMap with empty FreeCommand and sets counter to 1 - /// or simply increments counter. Here we check that node exists - auto it = map.find(key); - ASSERT(it != map.end(), ()); - it->second.second = command; - } - } - - DisplayListRenderer::DisplayListRenderer(Params const & p) - : base_t(p), - m_displayList(0) - { - } - - void DisplayListRenderer::addStorageRef(StorageRef const & storage) - { - m_discardStorageCmds[storage].first++; - m_freeStorageCmds[storage].first++; - } - - void DisplayListRenderer::removeStorageRef(StorageRef const & storage) - { -#ifdef DEBUG - for (auto const & v : m_discardStorageCmds) - { - ASSERT(v.second.first > 0, ()); - ASSERT(v.second.second != nullptr, ()); - } - - for (auto const & v : m_freeStorageCmds) - { - ASSERT(v.second.first > 0, ()); - ASSERT(v.second.second != nullptr, ()); - } -#endif - - DelayedDiscardStorageMap::iterator dit = m_discardStorageCmds.find(storage); - ASSERT(dit != m_discardStorageCmds.end(), ()); - - pair > & dval = dit->second; - --dval.first; - - if ((dval.first == 0) && dval.second) - { - dval.second->perform(); - m_discardStorageCmds.erase(dit); - } - - DelayedFreeStorageMap::iterator fit = m_freeStorageCmds.find(storage); - ASSERT(fit != m_freeStorageCmds.end(), ()); - - pair > & fval = fit->second; - --fval.first; - - if ((fval.first == 0) && fval.second) - { - fval.second->perform(); - m_freeStorageCmds.erase(fit); - } - } - - void DisplayListRenderer::addTextureRef(TextureRef const & texture) - { - pair > & val = m_freeTextureCmds[texture]; - val.first++; - } - - void DisplayListRenderer::removeTextureRef(TextureRef const & texture) - { - DelayedFreeTextureMap::iterator tit = m_freeTextureCmds.find(texture); - ASSERT(tit != m_freeTextureCmds.end(), ()); - - pair > & val = tit->second; - --val.first; - - if ((val.first == 0) && val.second) - { - val.second->perform(); - m_freeTextureCmds.erase(tit); - } - } - - DisplayList * DisplayListRenderer::createDisplayList() - { - return new DisplayList(this); - } - - void DisplayListRenderer::setDisplayList(DisplayList * dl) - { - m_displayList = dl; - } - - DisplayList * DisplayListRenderer::displayList() const - { - return m_displayList; - } - - void DisplayListRenderer::drawDisplayList(DisplayList * dl, math::Matrix const & m, - UniformsHolder * holder, size_t indicesCount) - { - dl->draw(this, m, holder, indicesCount); - } - - void DisplayListRenderer::clear(Color const & c, bool clearRT, float depth, bool clearDepth) - { - if (m_displayList) - m_displayList->clear(make_shared(c, clearRT, depth, clearDepth)); - else - base_t::clear(c, clearRT, depth, clearDepth); - } - - void DisplayListRenderer::drawGeometry(shared_ptr const & texture, - gl::Storage const & storage, - size_t indicesCount, - size_t indicesOffs, - EPrimitives primType) - { - if (m_displayList) - { - shared_ptr command(new DrawGeometry()); - - command->m_texture = texture; - command->m_storage = storage; - command->m_indicesCount = indicesCount; - command->m_indicesOffs = indicesOffs; - command->m_primitiveType = primType; - - m_displayList->drawGeometry(command); - } - else - base_t::drawGeometry(texture, - storage, - indicesCount, - indicesOffs, - primType); - - } - - void DisplayListRenderer::drawRouteGeometry(shared_ptr const & texture, - gl::Storage const & storage) - { - if (m_displayList) - { - shared_ptr command(new DrawRouteGeometry()); - - command->m_texture = texture; - command->m_storage = storage; - - m_displayList->drawRouteGeometry(command); - } - else - { - base_t::drawRouteGeometry(texture, storage); - } - } - - void DisplayListRenderer::uploadResources(shared_ptr const * resources, - size_t count, - shared_ptr const & texture) - { - if (m_displayList) - m_displayList->uploadResources(make_shared(resources, count, texture)); - else - base_t::uploadResources(resources, count, texture); - } - - void DisplayListRenderer::freeTexture(shared_ptr const & texture, - TTexturePool * texturePool) - { - if (m_displayList) - { - shared_ptr command(new FreeTexture()); - - command->m_texture = texture; - command->m_texturePool = texturePool; - TextureRef texRef = texture.get(); - InsertFreeCommand(m_freeTextureCmds, texRef, command); - } - else - base_t::freeTexture(texture, texturePool); - } - - void DisplayListRenderer::freeStorage(gl::Storage const & storage, - TStoragePool * storagePool) - { - if (m_displayList) - { - shared_ptr command(new FreeStorage()); - - command->m_storage = storage; - command->m_storagePool = storagePool; - - StorageRef sref(storage.m_vertices.get(), storage.m_indices.get()); - InsertFreeCommand(m_freeStorageCmds, sref, command); - } - else - base_t::freeStorage(storage, storagePool); - } - - void DisplayListRenderer::unlockStorage(gl::Storage const & storage) - { - if (m_displayList) - { - shared_ptr cmd(new UnlockStorage()); - - cmd->m_storage = storage; - - m_displayList->unlockStorage(cmd); - } - else - base_t::unlockStorage(storage); - } - - void DisplayListRenderer::discardStorage(gl::Storage const & storage) - { - if (m_displayList) - { - shared_ptr cmd(new DiscardStorage()); - - cmd->m_storage = storage; - - StorageRef sref(storage.m_vertices.get(), storage.m_indices.get()); - InsertFreeCommand(m_discardStorageCmds, sref, cmd); - } - else - base_t::discardStorage(storage); - } - - void DisplayListRenderer::applyBlitStates() - { - if (m_displayList) - m_displayList->applyBlitStates(make_shared()); - else - base_t::applyBlitStates(); - } - - void DisplayListRenderer::applyStates() - { - if (m_displayList) - m_displayList->applyStates(make_shared()); - else - base_t::applyStates(); - } - - void DisplayListRenderer::applyVarAlfaStates() - { - if (m_displayList) - m_displayList->applyStates(make_shared(ApplyStates::AlfaVaringProgram)); - else - base_t::applyVarAlfaStates(); - } - - void DisplayListRenderer::applySharpStates() - { - if (m_displayList) - m_displayList->applySharpStates(make_shared()); - else - base_t::applySharpStates(); - } - - void DisplayListRenderer::addCheckPoint() - { - if (m_displayList) - m_displayList->addCheckPoint(); - else - base_t::addCheckPoint(); - } - -} diff --git a/graphics/display_list_renderer.hpp b/graphics/display_list_renderer.hpp deleted file mode 100644 index 901937a7ea..0000000000 --- a/graphics/display_list_renderer.hpp +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#include "std/map.hpp" - -#include "graphics/opengl/storage.hpp" -#include "graphics/opengl/base_texture.hpp" -#include "graphics/opengl/geometry_renderer.hpp" - -namespace graphics -{ - class DisplayList; - - class DisplayListRenderer : public gl::GeometryRenderer - { - private: - - DisplayList * m_displayList; - - public: - - typedef gl::GeometryRenderer base_t; - typedef base_t::Params Params; - - typedef base_t::FreeTexture FreeTextureCmd; - typedef base_t::FreeStorage FreeStorageCmd; - typedef base_t::DiscardStorage DiscardStorageCmd; - typedef base_t::ClearCommand ClearCommandCmd; - - typedef gl::BaseTexture const * TextureRef; - typedef pair StorageRef; - - template - using DelayedCommandMap = map>>; - - using DelayedFreeTextureMap = DelayedCommandMap; - using DelayedFreeStorageMap = DelayedCommandMap; - using DelayedDiscardStorageMap = DelayedCommandMap; - - DelayedFreeTextureMap m_freeTextureCmds; - DelayedFreeStorageMap m_freeStorageCmds; - DelayedDiscardStorageMap m_discardStorageCmds; - - void addStorageRef(StorageRef const & storage); - void removeStorageRef(StorageRef const & storage); - - void addTextureRef(TextureRef const & texture); - void removeTextureRef(TextureRef const & texture); - - DisplayListRenderer(Params const & p); - - /// create display list - DisplayList * createDisplayList(); - /// set current display list - void setDisplayList(DisplayList * displayList); - /// get current display list - DisplayList * displayList() const; - /// draw display list - void drawDisplayList(DisplayList * dl, math::Matrix const & m, - UniformsHolder * holder, size_t indicesCount); - - /// Interceptable commands - /// @{ - void clear(Color const & c, bool clearRT = true, float depth = 1.0, bool clearDepth = true); - - /// draw geometry - void drawGeometry(shared_ptr const & texture, - gl::Storage const & storage, - size_t indicesCount, - size_t indicesOffs, - EPrimitives primType); - /// draw route geometry - void drawRouteGeometry(shared_ptr const & texture, - gl::Storage const & storage); - /// upload ResourceStyle's on texture - void uploadResources(shared_ptr const * resources, - size_t count, - shared_ptr const & texture); - /// free texture - void freeTexture(shared_ptr const & texture, - TTexturePool * texturePool); - /// free storage - void freeStorage(gl::Storage const & storage, - TStoragePool * storagePool); - /// unlock storage - void unlockStorage(gl::Storage const & storage); - /// discard storage - void discardStorage(gl::Storage const & storage); - /// add checkpoint - void addCheckPoint(); - /// apply blit states - void applyBlitStates(); - /// apply geometry rendering states - void applyStates(); - void applyVarAlfaStates(); - /// apply sharp geometry states - void applySharpStates(); - /// @} - }; -} diff --git a/graphics/font_desc.cpp b/graphics/font_desc.cpp deleted file mode 100644 index 320551aae0..0000000000 --- a/graphics/font_desc.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "base/SRC_FIRST.hpp" - -#include "graphics/font_desc.hpp" - -#include "std/cmath.hpp" -#include "std/algorithm.hpp" - - -namespace graphics -{ - FontDesc const & FontDesc::defaultFont = FontDesc(); - - FontDesc::FontDesc(int size, graphics::Color const & color, - bool isMasked, graphics::Color const & maskColor) - : m_size(size), m_color(color), - m_isMasked(isMasked), m_maskColor(maskColor) - {} - - bool FontDesc::IsValid() const - { - return m_size != -1; - } - - bool FontDesc::operator ==(FontDesc const & src) const - { - return (m_size == src.m_size) - && (m_color == src.m_color) - && (m_isMasked == src.m_isMasked) - && (m_maskColor == src.m_maskColor); - } - - bool FontDesc::operator !=(FontDesc const & src) const - { - return !(*this == src); - } - - bool FontDesc::operator < (FontDesc const & src) const - { - if (m_size != src.m_size) - return m_size < src.m_size; - if (m_color != src.m_color) - return m_color < src.m_color; - if (m_isMasked != src.m_isMasked) - return m_isMasked < src.m_isMasked; - if (m_maskColor != src.m_maskColor) - return m_maskColor < src.m_maskColor; - return false; - } - - bool FontDesc::operator > (FontDesc const & src) const - { - if (m_size != src.m_size) - return m_size > src.m_size; - if (m_color != src.m_color) - return m_color > src.m_color; - if (m_isMasked != src.m_isMasked) - return m_isMasked > src.m_isMasked; - if (m_maskColor != src.m_maskColor) - return m_maskColor > src.m_maskColor; - return false; - } -} diff --git a/graphics/font_desc.hpp b/graphics/font_desc.hpp deleted file mode 100644 index c468bbdbd7..0000000000 --- a/graphics/font_desc.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "graphics/color.hpp" - -namespace graphics -{ - struct FontDesc - { - int m_size; - graphics::Color m_color; - bool m_isMasked; - graphics::Color m_maskColor; - - FontDesc(int size = -1, graphics::Color const & color = graphics::Color(0, 0, 0, 255), - bool isMasked = false, graphics::Color const & maskColor = graphics::Color(255, 255, 255, 255)); - - void SetRank(double rank); - bool IsValid() const; - - bool operator != (FontDesc const & src) const; - bool operator == (FontDesc const & src) const; - bool operator < (FontDesc const & src) const; - bool operator > (FontDesc const & src) const; - - static FontDesc const & defaultFont; - }; -} diff --git a/graphics/freetype.cpp b/graphics/freetype.cpp deleted file mode 100644 index 6c656ad7cf..0000000000 --- a/graphics/freetype.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "graphics/freetype.hpp" - -#undef __FTERRORS_H__ -#define FT_ERRORDEF(e, v, s) {e, s}, -#define FT_ERROR_START_LIST { -#define FT_ERROR_END_LIST {0, 0}}; -FreetypeError g_FT_Errors[] = -#include FT_ERRORS_H diff --git a/graphics/freetype.hpp b/graphics/freetype.hpp deleted file mode 100644 index efa9aba3fa..0000000000 --- a/graphics/freetype.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include "base/logging.hpp" - -// Put all needed FT includes in one place -#include -#include FT_TYPES_H -#include FT_SYSTEM_H -#include FT_FREETYPE_H -#include FT_STROKER_H -#include FT_CACHE_H - -struct FreetypeError -{ - int m_code; - char const * m_message; -}; - -extern FreetypeError g_FT_Errors[]; - -#define FREETYPE_CHECK(x) \ - do \ - { \ - FT_Error const err = (x); \ - if (err) \ - LOG(LWARNING, ("Freetype:", g_FT_Errors[err].m_code, g_FT_Errors[err].m_message)); \ - } while (false) - -#define FREETYPE_CHECK_RETURN(x, msg) \ - do \ - { \ - FT_Error const err = (x); \ - if (err) \ - { \ - LOG(LWARNING, ("Freetype", g_FT_Errors[err].m_code, g_FT_Errors[err].m_message, msg)); \ - return; \ - } \ - } while (false) diff --git a/graphics/geometry_batcher.cpp b/graphics/geometry_batcher.cpp deleted file mode 100644 index 6b5db73525..0000000000 --- a/graphics/geometry_batcher.cpp +++ /dev/null @@ -1,891 +0,0 @@ -#include "graphics/geometry_batcher.hpp" -#include "graphics/color.hpp" -#include "graphics/resource_manager.hpp" -#include "graphics/resource_cache.hpp" - -#include "graphics/opengl/base_texture.hpp" -#include "graphics/opengl/utils.hpp" -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/gl_render_context.hpp" - -#include "geometry/rect2d.hpp" - -#include "base/assert.hpp" -#include "base/math.hpp" -#include "base/mutex.hpp" -#include "base/logging.hpp" - -#include "std/algorithm.hpp" -#include "std/bind.hpp" - -namespace graphics -{ - template - void CheckPointLayout() - { - static_assert(sizeof(m2::Point) == 2 * sizeof(T), ""); - m2::Point p; - CHECK_EQUAL(reinterpret_cast(&p), reinterpret_cast(&p.x), ()); - CHECK_EQUAL(reinterpret_cast(&p) + sizeof(T), reinterpret_cast(&p.y), ()); - } - - GeometryBatcher::Params::Params() - : m_storageType(ELargeStorage) - , m_textureType(ELargeTexture) - { - CheckPointLayout(); - CheckPointLayout(); - } - - GeometryBatcher::GeometryBatcher(Params const & p) - : base_t(p), - m_isAntiAliased(true) - { - base_t::applyStates(); - - shared_ptr cache; - ResourceManager::loadSkin(resourceManager(), cache); - - m_staticPagesCount = 1; - m_startStaticPage = reservePipelines({ cache }, - EMediumStorage, - gl::Vertex::getVertexDecl()); - - m_dynamicPagesCount = 2; - m_startDynamicPage = reservePipelines(m_dynamicPagesCount, - p.m_textureType, - p.m_storageType, - gl::Vertex::getVertexDecl()); - m_dynamicPage = m_startDynamicPage; - - /// 1 to turn antialiasing on - /// 2 to switch it off - m_aaShift = m_isAntiAliased ? 1 : 2; - } - - unsigned GeometryBatcher::reservePipelines(vector > const & caches, - EStorageType storageType, - VertexDecl const * decl) - { - unsigned res = base_t::reservePipelines(caches, storageType, decl); - - for (size_t i = res; i < res + caches.size(); ++i) - { - addClearPageFn(i, bind(&GeometryBatcher::flush, this, i), 100); - pipeline(i).addHandlesOverflowFn(bind(&GeometryBatcher::onDynamicOverflow, this, i), 0); - } - - return res; - } - - unsigned GeometryBatcher::reservePipelines(unsigned count, - ETextureType textureType, - EStorageType storageType, - VertexDecl const * decl) - { - unsigned res = base_t::reservePipelines(count, textureType, storageType, decl); - - for (size_t i = res; i < res + count; ++i) - { - addClearPageFn(i, bind(&GeometryBatcher::flush, this, i), 100); - pipeline(i).addHandlesOverflowFn(bind(&GeometryBatcher::onDynamicOverflow, this, i), 0); - } - - return res; - } - - void GeometryBatcher::beginFrame() - { - base_t::beginFrame(); - base_t::applyStates(); - } - - void GeometryBatcher::clear(graphics::Color const & c, bool clearRT, float depth, bool clearDepth) - { - flush(-1); - base_t::clear(c, clearRT, depth, clearDepth); - } - - void GeometryBatcher::endFrame() - { - flush(-1); - base_t::endFrame(); - } - - bool GeometryBatcher::hasRoom(size_t verticesCount, size_t indicesCount, int pipelineID) const - { - return pipeline(pipelineID).hasRoom(verticesCount, indicesCount); - } - - int GeometryBatcher::verticesLeft(int pipelineID) const - { - GeometryPipeline const & p = pipeline(pipelineID); - return p.vxLeft(); - } - - int GeometryBatcher::indicesLeft(int pipelineID) const - { - GeometryPipeline const & p = pipeline(pipelineID); - return p.idxLeft(); - } - - void GeometryBatcher::flush(int pipelineID) - { - for (size_t i = pipelinesCount(); i > 0; --i) - { - size_t id = i - 1; - - if ((pipelineID == -1) || (id == (size_t)pipelineID)) - { - if (flushPipeline(id)) - { - int np = nextPipeline(id); - - if (np != id) - { - // reserving texture in advance, before we'll - // potentially return current texture into the pool. - // this way we make sure that the reserved texture will - // be different from the returned one. - pipeline(np).checkTexture(); - } - - changePipeline(id); - } - } - } - } - - void GeometryBatcher::drawTexturedPolygon( - m2::PointD const & ptShift, - ang::AngleD const & angle, - float tx0, float ty0, float tx1, float ty1, - float x0, float y0, float x1, float y1, - double depth, - int pipelineID) - { - if (!hasRoom(4, 6, pipelineID)) - flush(pipelineID); - - GeometryPipeline & p = pipeline(pipelineID); - - p.checkStorage(); - if (!p.hasStorage()) - return; - - float texMinX = tx0; - float texMaxX = tx1; - float texMinY = ty0; - float texMaxY = ty1; - - shared_ptr const & texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - texture->mapPixel(texMinX, texMinY); - texture->mapPixel(texMaxX, texMaxY); - - /// rotated and translated four points (x0, y0), (x0, y1), (x1, y1), (x1, y0) - - m2::PointF coords[4] = - { - m2::PointF(x0 * angle.cos() - y0 * angle.sin() + ptShift.x, x0 * angle.sin() + y0 * angle.cos() + ptShift.y), - m2::PointF(x0 * angle.cos() - y1 * angle.sin() + ptShift.x, x0 * angle.sin() + y1 * angle.cos() + ptShift.y), - m2::PointF(x1 * angle.cos() - y1 * angle.sin() + ptShift.x, x1 * angle.sin() + y1 * angle.cos() + ptShift.y), - m2::PointF(x1 * angle.cos() - y0 * angle.sin() + ptShift.x, x1 * angle.sin() + y0 * angle.cos() + ptShift.y) - }; - - /// Special case. Making straight fonts sharp. - if (angle.val() == 0) - { - float deltaX = coords[0].x - ceil(coords[0].x); - float deltaY = coords[0].y - ceil(coords[0].y); - - for (size_t i = 0; i < 4; ++i) - { - coords[i].x -= deltaX; - coords[i].y -= deltaY; - } - } - - m2::PointF texCoords[4] = - { - m2::PointF(texMinX, texMinY), - m2::PointF(texMinX, texMaxY), - m2::PointF(texMaxX, texMaxY), - m2::PointF(texMaxX, texMinY) - }; - - m2::PointF normal(0, 0); - - addTexturedFanStrided(coords, sizeof(m2::PointF), - &normal, 0, - texCoords, sizeof(m2::PointF), - 4, - depth, - pipelineID); - } - - void GeometryBatcher::drawStraightTexturedPolygon( - m2::PointD const & ptPivot, - float tx0, float ty0, float tx1, float ty1, - float x0, float y0, float x1, float y1, - double depth, - int pipelineID) - { - if (!hasRoom(4, 6, pipelineID)) - flush(pipelineID); - - GeometryPipeline & p = pipeline(pipelineID); - - p.checkStorage(); - if (!p.hasStorage()) - return; - - float texMinX = tx0; - float texMaxX = tx1; - float texMinY = ty0; - float texMaxY = ty1; - - shared_ptr const & texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - texture->mapPixel(texMinX, texMinY); - texture->mapPixel(texMaxX, texMaxY); - - m2::PointF offsets[4] = - { - m2::PointF(x0, y0), - m2::PointF(x0, y1), - m2::PointF(x1, y1), - m2::PointF(x1, y0) - }; - - m2::PointF texCoords[4] = - { - m2::PointF(texMinX, texMinY), - m2::PointF(texMinX, texMaxY), - m2::PointF(texMaxX, texMaxY), - m2::PointF(texMaxX, texMinY) - }; - - m2::PointF pv(ptPivot.x, ptPivot.y); - - addTexturedFanStrided(&pv, 0, - offsets, sizeof(m2::PointF), - texCoords, sizeof(m2::PointF), - 4, - depth, - pipelineID); - } - - unsigned GeometryBatcher::copyVertices(VertexStream * srcVS, - unsigned vCount, - unsigned iCount, - int pipelineID) - { - if (!hasRoom(vCount, iCount, pipelineID)) - flush(pipelineID); - - GeometryPipeline & p = pipeline(pipelineID); - p.checkStorage(); - - if (!p.hasStorage()) - return (unsigned)-1; - - ASSERT(iCount > 2, ()); - - VertexStream * dstVS = p.vertexStream(); - - unsigned res = p.currentVx(); - - for (unsigned i = 0; i < vCount; ++i) - { - dstVS->copyVertex(srcVS); - srcVS->advanceVertex(1); - p.advanceVx(1); - } - - return res; - } - - void GeometryBatcher::addTriangleFan(VertexStream * srcVS, - unsigned count, - int pipelineID) - { - unsigned vOffset = copyVertices(srcVS, - count, - (count - 2) * 3, - pipelineID); - - GeometryPipeline & p = pipeline(pipelineID); - - if (vOffset != (unsigned)-1) - { - unsigned short * indices = (unsigned short*)p.idxData(); - - unsigned iOffset = p.currentIdx(); - - for (size_t j = 0; j < count - 2; ++j) - { - indices[iOffset + j * 3] = vOffset; - indices[iOffset + j * 3 + 1] = vOffset + j + 1; - indices[iOffset + j * 3 + 2] = vOffset + j + 2; - } - - p.advanceIdx((count - 2) * 3); - } - } - - void GeometryBatcher::addTriangleStrip(VertexStream * srcVS, - unsigned count, - int pipelineID) - { - unsigned vOffset = copyVertices(srcVS, - count, - (count - 2) * 3, - pipelineID); - - GeometryPipeline & p = pipeline(pipelineID); - - if (vOffset != (unsigned)-1) - { - unsigned short * indices = (unsigned short*)p.idxData(); - - unsigned iOffset = p.currentIdx(); - - size_t oldIdx1 = vOffset; - size_t oldIdx2 = vOffset + 1; - - for (size_t j = 0; j < count - 2; ++j) - { - indices[iOffset + j * 3] = oldIdx1; - indices[iOffset + j * 3 + 1] = oldIdx2; - indices[iOffset + j * 3 + 2] = vOffset + j + 2; - - oldIdx1 = oldIdx2; - oldIdx2 = vOffset + j + 2; - } - - p.advanceIdx((count - 2) * 3); - } - } - - void GeometryBatcher::addTriangleList(VertexStream * srcVS, - unsigned count, - int pipelineID) - { - unsigned vOffset = copyVertices(srcVS, - count, - count, - pipelineID); - - GeometryPipeline & p = pipeline(pipelineID); - - if (vOffset != (unsigned)-1) - { - unsigned short * indices = (unsigned short*)p.idxData(); - - unsigned iOffset = p.currentIdx(); - - for (size_t j = 0; j < count; ++j) - indices[iOffset + j] = vOffset + j; - - p.advanceIdx(count); - } - - } - - void GeometryBatcher::addTexturedFan(m2::PointF const * coords, - m2::PointF const * normals, - m2::PointF const * texCoords, - unsigned size, - double depth, - int pipelineID) - { - static_assert(sizeof(m2::PointF) == 2 * sizeof(float), ""); - - VertexStream vs; - - vs.m_fPos.m_x = (float*)(coords); - vs.m_fPos.m_xStride = sizeof(m2::PointF); - vs.m_fPos.m_y = (float*)(coords) + 1; - vs.m_fPos.m_yStride = sizeof(m2::PointF); - vs.m_dPos.m_z = (double*)(&depth); - vs.m_dPos.m_zStride = 0; - vs.m_fNormal.m_x = (float*)(normals); - vs.m_fNormal.m_xStride = sizeof(m2::PointF); - vs.m_fNormal.m_y = (float*)(normals) + 1; - vs.m_fNormal.m_yStride = sizeof(m2::PointF); - vs.m_fTex.m_u = (float*)(texCoords); - vs.m_fTex.m_uStride = sizeof(m2::PointF); - vs.m_fTex.m_v = (float*)(texCoords) + 1; - vs.m_fTex.m_vStride = sizeof(m2::PointF); - - addTriangleFan(&vs, size, pipelineID); - } - - void GeometryBatcher::addTexturedFanStrided(m2::PointF const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID) - { - static_assert(sizeof(m2::PointF) == 2 * sizeof(float), ""); - - VertexStream vs; - - vs.m_fPos.m_x = (float*)(coords); - vs.m_fPos.m_xStride = coordsStride; - vs.m_fPos.m_y = (float*)(coords) + 1; - vs.m_fPos.m_yStride = coordsStride; - vs.m_dPos.m_z = (double*)(&depth); - vs.m_dPos.m_zStride = 0; - vs.m_fNormal.m_x = (float*)(normals); - vs.m_fNormal.m_xStride = normalsStride; - vs.m_fNormal.m_y = (float*)(normals) + 1; - vs.m_fNormal.m_yStride = normalsStride; - vs.m_fTex.m_u = (float*)(texCoords); - vs.m_fTex.m_uStride = texCoordsStride; - vs.m_fTex.m_v = (float*)(texCoords) + 1; - vs.m_fTex.m_vStride = texCoordsStride; - - addTriangleFan(&vs, size, pipelineID); - } - - void GeometryBatcher::addTexturedStrip( - m2::PointF const * coords, - m2::PointF const * normals, - m2::PointF const * texCoords, - unsigned size, - double depth, - int pipelineID - ) - { - static_assert(sizeof(m2::PointF) == 2 * sizeof(float), ""); - - VertexStream vs; - - vs.m_fPos.m_x = (float*)(coords); - vs.m_fPos.m_xStride = sizeof(m2::PointF); - vs.m_fPos.m_y = (float*)(coords) + 1; - vs.m_fPos.m_yStride = sizeof(m2::PointF); - vs.m_dPos.m_z = (double*)(&depth); - vs.m_dPos.m_zStride = 0; - vs.m_fNormal.m_x = (float*)(normals); - vs.m_fNormal.m_xStride = sizeof(m2::PointF); - vs.m_fNormal.m_y = (float*)(normals) + 1; - vs.m_fNormal.m_yStride = sizeof(m2::PointF); - vs.m_fTex.m_u = (float*)(texCoords); - vs.m_fTex.m_uStride = sizeof(m2::PointF); - vs.m_fTex.m_v = (float*)(texCoords) + 1; - vs.m_fTex.m_vStride = sizeof(m2::PointF); - - addTriangleStrip(&vs, size, pipelineID); - } - - void GeometryBatcher::addTexturedStripStrided( - m2::PointF const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID) - { - static_assert(sizeof(m2::PointF) == 2 * sizeof(float), ""); - - VertexStream vs; - - vs.m_fPos.m_x = (float*)(coords); - vs.m_fPos.m_xStride = coordsStride; - vs.m_fPos.m_y = (float*)(coords) + 1; - vs.m_fPos.m_yStride = coordsStride; - vs.m_dPos.m_z = (double*)(&depth); - vs.m_dPos.m_zStride = 0; - vs.m_fNormal.m_x = (float*)(normals); - vs.m_fNormal.m_xStride = normalsStride; - vs.m_fNormal.m_y = (float*)(normals) + 1; - vs.m_fNormal.m_yStride = normalsStride; - vs.m_fTex.m_u = (float*)(texCoords); - vs.m_fTex.m_uStride = texCoordsStride; - vs.m_fTex.m_v = (float*)(texCoords) + 1; - vs.m_fTex.m_vStride = texCoordsStride; - - addTriangleStrip(&vs, size, pipelineID); - } - - void GeometryBatcher::addTexturedStripStrided( - m2::PointD const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID) - { - static_assert(sizeof(m2::PointD) == 2 * sizeof(double), ""); - static_assert(sizeof(m2::PointF) == 2 * sizeof(float), ""); - - VertexStream vs; - - vs.m_dPos.m_x = (double*)(coords); - vs.m_dPos.m_xStride = coordsStride; - vs.m_dPos.m_y = (double*)(coords) + 1; - vs.m_dPos.m_yStride = coordsStride; - vs.m_dPos.m_z = (double*)(&depth); - vs.m_dPos.m_zStride = 0; - vs.m_fNormal.m_x = (float*)(normals); - vs.m_fNormal.m_xStride = normalsStride; - vs.m_fNormal.m_y = (float*)(normals) + 1; - vs.m_fNormal.m_yStride = normalsStride; - vs.m_fTex.m_u = (float*)(texCoords); - vs.m_fTex.m_uStride = texCoordsStride; - vs.m_fTex.m_v = (float*)(texCoords) + 1; - vs.m_fTex.m_vStride = texCoordsStride; - - addTriangleStrip(&vs, size, pipelineID); - } - - void GeometryBatcher::addTexturedListStrided( - m2::PointD const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID) - { - static_assert(sizeof(m2::PointD) == 2 * sizeof(double), ""); - static_assert(sizeof(m2::PointF) == 2 * sizeof(float), ""); - - VertexStream vs; - - vs.m_dPos.m_x = (double*)(coords); - vs.m_dPos.m_xStride = coordsStride; - vs.m_dPos.m_y = (double*)(coords) + 1; - vs.m_dPos.m_yStride = coordsStride; - vs.m_dPos.m_z = (double*)(&depth); - vs.m_dPos.m_zStride = 0; - vs.m_fNormal.m_x = (float*)(normals); - vs.m_fNormal.m_xStride = normalsStride; - vs.m_fNormal.m_y = (float*)(normals) + 1; - vs.m_fNormal.m_yStride = normalsStride; - vs.m_fTex.m_u = (float*)(texCoords); - vs.m_fTex.m_uStride = texCoordsStride; - vs.m_fTex.m_v = (float*)(texCoords) + 1; - vs.m_fTex.m_vStride = texCoordsStride; - - addTriangleList(&vs, size, pipelineID); - } - - - void GeometryBatcher::addTexturedListStrided( - m2::PointF const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID) - { - static_assert(sizeof(m2::PointF) == 2 * sizeof(float), ""); - - VertexStream vs; - - vs.m_fPos.m_x = (float*)(coords); - vs.m_fPos.m_xStride = coordsStride; - vs.m_fPos.m_y = (float*)(coords) + 1; - vs.m_fPos.m_yStride = coordsStride; - vs.m_dPos.m_z = (double*)(&depth); - vs.m_dPos.m_zStride = 0; - vs.m_fNormal.m_x = (float*)(normals); - vs.m_fNormal.m_xStride = normalsStride; - vs.m_fNormal.m_y = (float*)(normals) + 1; - vs.m_fNormal.m_yStride = normalsStride; - vs.m_fTex.m_u = (float*)(texCoords); - vs.m_fTex.m_uStride = texCoordsStride; - vs.m_fTex.m_v = (float*)(texCoords) + 1; - vs.m_fTex.m_vStride = texCoordsStride; - - addTriangleList(&vs, size, pipelineID); - } - - void GeometryBatcher::addTexturedList(m2::PointF const * coords, - m2::PointF const * normals, - m2::PointF const * texCoords, - unsigned size, - double depth, - int pipelineID) - { - addTexturedListStrided(coords, sizeof(m2::PointF), - normals, sizeof(m2::PointF), - texCoords, sizeof(m2::PointF), - size, depth, pipelineID); - } - - void GeometryBatcher::enableClipRect(bool flag) - { - flush(-1); - base_t::enableClipRect(flag); - } - - void GeometryBatcher::setClipRect(m2::RectI const & rect) - { - flush(-1); - base_t::setClipRect(rect); - } - - int GeometryBatcher::aaShift() const - { - return m_aaShift; - } - - void GeometryBatcher::setDisplayList(DisplayList * dl) - { - flush(-1); - base_t::setDisplayList(dl); - } - - void GeometryBatcher::drawDisplayList(DisplayList * dl, math::Matrix const & m, - UniformsHolder * holder, size_t indicesCount) - { - flush(-1); - base_t::drawDisplayList(dl, m, holder, indicesCount); - } - - void GeometryBatcher::uploadResources(shared_ptr const * resources, - size_t count, - shared_ptr const & texture) - { - /// splitting the whole queue of commands into the chunks no more - /// than 64KB of uploadable data each - - size_t bytesUploaded = 0; - size_t bytesPerPixel = graphics::formatSize(resourceManager()->params().m_texFormat); - size_t prev = 0; - - for (size_t i = 0; i < count; ++i) - { - shared_ptr const & res = resources[i]; - - bytesUploaded += res->m_texRect.SizeX() * res->m_texRect.SizeY() * bytesPerPixel; - - if (bytesUploaded > 64 * 1024) - { - base_t::uploadResources(resources + prev, i + 1 - prev, texture); - if (i + 1 < count) - addCheckPoint(); - - prev = i + 1; - bytesUploaded = 0; - } - } - - if (count != 0) - { - base_t::uploadResources(resources, count, texture); - bytesUploaded = 0; - } - } - - void GeometryBatcher::applyStates() - { - flush(-1); - base_t::applyStates(); - } - - void GeometryBatcher::applyBlitStates() - { - flush(-1); - base_t::applyBlitStates(); - } - - void GeometryBatcher::applySharpStates() - { - flush(-1); - base_t::applySharpStates(); - } - - bool GeometryBatcher::isDynamicPage(int i) const - { - return (i >= m_startDynamicPage) && (i < m_startDynamicPage + m_dynamicPagesCount); - } - - void GeometryBatcher::flushDynamicPage() - { - int currentDynamicPage = m_dynamicPage; - callClearPageFns(m_dynamicPage); - if (currentDynamicPage != m_dynamicPage) - changeDynamicPage(); - } - - int GeometryBatcher::nextDynamicPage() const - { - if (m_dynamicPage == m_startDynamicPage + m_dynamicPagesCount - 1) - return m_startDynamicPage; - else - return m_dynamicPage + 1; - } - - void GeometryBatcher::changeDynamicPage() - { - m_dynamicPage = nextDynamicPage(); - } - - int GeometryBatcher::nextPipeline(int i) const - { - ASSERT(i < pipelinesCount(), ()); - - if (isDynamicPage(i)) - return nextDynamicPage(); - - /// for static and text pages return same index as passed in. - return i; - } - - void GeometryBatcher::changePipeline(int i) - { - if (isDynamicPage(i)) - changeDynamicPage(); - } - - /// This function is set to perform as a callback on texture or handles overflow - /// BUT! Never called on texture overflow, as this situation - /// is explicitly checked in the mapXXX() functions. - void GeometryBatcher::onDynamicOverflow(int pipelineID) - { - LOG(LDEBUG, ("DynamicPage flushing, pipelineID=", (uint32_t)pipelineID)); - flushDynamicPage(); - } - - uint8_t GeometryBatcher::dynamicPage() const - { - return m_dynamicPage; - } - - uint32_t GeometryBatcher::mapInfo(Resource::Info const & info) - { - uint32_t res = invalidPageHandle(); - - for (uint8_t i = 0; i < pipelinesCount(); ++i) - { - ResourceCache * cache = pipeline(i).cache().get(); - res = cache->findInfo(info); - if (res != invalidPageHandle()) - return packID(i, res); - else - { - /// trying to find cacheKey - res = cache->findInfo(info.cacheKey()); - if (res != invalidPageHandle()) - { - res = cache->addParentInfo(info); - return packID(i, res); - } - } - } - - if (!pipeline(m_dynamicPage).cache()->hasRoom(info)) - flushDynamicPage(); - - return packID(m_dynamicPage, - pipeline(m_dynamicPage).cache()->mapInfo(info)); - } - - uint32_t GeometryBatcher::findInfo(Resource::Info const & info) - { - uint32_t res = invalidPageHandle(); - - for (uint8_t i = 0; i < pipelinesCount(); ++i) - { - res = pipeline(i).cache()->findInfo(info); - if (res != invalidPageHandle()) - return packID(i, res); - } - - return res; - } - - bool GeometryBatcher::mapInfo(Resource::Info const * const * infos, - uint32_t * ids, - size_t count) - { - for (unsigned cycles = 0; cycles < 2; ++cycles) - { - bool packed = true; - for (unsigned i = 0; i < count; ++i) - { - ResourceCache * staticCache = pipeline(m_startStaticPage).cache().get(); - ResourceCache * dynamicCache = pipeline(m_dynamicPage).cache().get(); - - ids[i] = staticCache->findInfo(*infos[i]); - - if (ids[i] != invalidPageHandle()) - { - ids[i] = packID(m_startStaticPage, ids[i]); - continue; - } - - ids[i] = staticCache->findInfo(infos[i]->cacheKey()); - if (ids[i] != invalidPageHandle()) - { - ids[i] = staticCache->addParentInfo(*infos[i]); - ids[i] = packID(m_startStaticPage, ids[i]); - continue; - } - - ids[i] = dynamicCache->findInfo(*infos[i]); - if (ids[i] != invalidPageHandle()) - { - ids[i] = packID(m_dynamicPage, ids[i]); - } - else - { - if (dynamicCache->hasRoom(*infos[i])) - ids[i] = packID(m_dynamicPage, dynamicCache->mapInfo(*infos[i])); - else - { - packed = false; - break; - } - } - } - - if (packed) - return true; - else - { -#ifdef DEBUG - int lastPage = m_dynamicPage; -#endif - flushDynamicPage(); - ASSERT(lastPage == m_dynamicPage, ()); - } - } - - return false; - } - -} // namespace graphics diff --git a/graphics/geometry_batcher.hpp b/graphics/geometry_batcher.hpp deleted file mode 100644 index 88fa21696f..0000000000 --- a/graphics/geometry_batcher.hpp +++ /dev/null @@ -1,238 +0,0 @@ -#pragma once - -#include "graphics/opengl/vertex.hpp" -#include "graphics/opengl/buffer_object.hpp" -#include "graphics/opengl/renderbuffer.hpp" -#include "graphics/opengl/framebuffer.hpp" -#include "graphics/opengl/storage.hpp" - -#include "graphics/pipeline_manager.hpp" -#include "graphics/resource_cache.hpp" -#include "graphics/resource_manager.hpp" - -#include "std/vector.hpp" -#include "std/string.hpp" -#include "std/list.hpp" -#include "std/function.hpp" - -#include "geometry/angles.hpp" - -#include "base/matrix.hpp" - -namespace graphics -{ - class GeometryBatcher : public PipelinesManager - { - private: - - typedef PipelinesManager base_t; - - bool m_isAntiAliased; - - int m_aaShift; - - public: - - /// INTERNAL API! USE WITH CAUTION - /// @{ - void flush(int pipelineID); - /// @} - - bool hasRoom(size_t verticesCount, size_t indicesCount, int pipelineID) const; - int verticesLeft(int pipelineID) const; - int indicesLeft(int pipelineID) const; - - struct Params : public base_t::Params - { - EStorageType m_storageType; - ETextureType m_textureType; - - Params(); - }; - - uint8_t m_startStaticPage; - uint8_t m_staticPagesCount; - - uint8_t m_startDynamicPage; - uint8_t m_dynamicPage; - uint8_t m_dynamicPagesCount; - - GeometryBatcher(Params const & params); - - void beginFrame(); - void endFrame(); - - bool isDynamicPage(int i) const; - void flushDynamicPage(); - int nextDynamicPage() const; - void changeDynamicPage(); - - void onDynamicOverflow(int pipelineID); - - /// copy vertices from source VertexStream - unsigned copyVertices(VertexStream * srcVS, - unsigned vCount, - unsigned iCount, - int pipelineID); - - public: - - /// This functions hide the base_t functions with the same name and signature - /// to flush(-1) upon calling them - /// @{ - void enableClipRect(bool flag); - void setClipRect(m2::RectI const & rect); - - void clear(Color const & c, bool clearRT = true, float depth = 1.0, bool clearDepth = true); - /// @} - - unsigned reservePipelines(vector > const & caches, - EStorageType storageType, - VertexDecl const * decl); - - unsigned reservePipelines(unsigned count, - ETextureType textureType, - EStorageType storageType, - VertexDecl const * decl); - - void addTriangleStrip(VertexStream * srcVS, - unsigned count, - int pipelineID); - - void addTriangleList(VertexStream * srcVS, - unsigned count, - int pipelineID); - - void addTriangleFan(VertexStream * srcVS, - unsigned count, - int pipelineID); - - void addTexturedFan(m2::PointF const * coords, - m2::PointF const * normals, - m2::PointF const * texCoords, - unsigned size, - double depth, - int pipelineID); - - void addTexturedFanStrided(m2::PointF const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID); - - void addTexturedStrip(m2::PointF const * coords, - m2::PointF const * normals, - m2::PointF const * texCoords, - unsigned size, - double depth, - int pipelineID); - - void addTexturedStripStrided(m2::PointF const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID); - - void addTexturedStripStrided(m2::PointD const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID); - - void addTexturedList(m2::PointF const * coords, - m2::PointF const * texCoords, - m2::PointF const * normalCoords, - unsigned size, - double depth, - int pipelineID); - - void addTexturedListStrided(m2::PointF const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID); - - void addTexturedListStrided(m2::PointD const * coords, - size_t coordsStride, - m2::PointF const * normals, - size_t normalsStride, - m2::PointF const * texCoords, - size_t texCoordsStride, - unsigned size, - double depth, - int pipelineID); - - int aaShift() const; - - void drawStraightTexturedPolygon( - m2::PointD const & ptPivot, - float tx0, float ty0, float tx1, float ty1, - float x0, float y0, float x1, float y1, - double depth, - int pipelineID); - - /// drawing textured polygon with antialiasing - /// we assume that the (tx0, ty0, tx1, ty1) area on texture is surrounded by (0, 0, 0, 0) pixels, - /// and the 1px interior area is also (0, 0, 0, 0). - void drawTexturedPolygon( - m2::PointD const & ptWhere, - ang::AngleD const & angle, - float tx0, float ty0, float tx1, float ty1, - float x0, float y0, float x1, float y1, - double depth, - int pipelineID); - - void setDisplayList(DisplayList * dl); - void drawDisplayList(DisplayList * dl, math::Matrix const & m, - UniformsHolder * holder = nullptr, size_t indicesCount = 0); - - void uploadResources(shared_ptr const * resources, - size_t count, - shared_ptr const & texture); - - void applyStates(); - void applyBlitStates(); - void applySharpStates(); - - /// map Resource::Info on skin - /// if found - return id. - /// if not - pack and return id. - uint32_t mapInfo(Resource::Info const & info); - /// map array of Resource::Info's on skin - bool mapInfo(Resource::Info const * const * infos, - uint32_t * ids, - size_t count); - - uint32_t findInfo(Resource::Info const & info); - - - uint8_t dynamicPage() const; - - /// change pipeline for its "backbuffer" counterpart. - /// pipelines works in pairs to employ "double-buffering" technique - /// to enhance CPU-GPU parallelism. - /// this function is called after any rendering command - /// issued to avoid the "GPU is waiting on texture used in - /// rendering call" issue. - /// @warning does nothing for pipelines with EStaticTexture type. - /// (pipelines loaded at screen creation time) - void changePipeline(int i); - int nextPipeline(int i) const; - }; -} diff --git a/graphics/geometry_pipeline.cpp b/graphics/geometry_pipeline.cpp deleted file mode 100644 index b9737682bd..0000000000 --- a/graphics/geometry_pipeline.cpp +++ /dev/null @@ -1,242 +0,0 @@ -#include "graphics/geometry_pipeline.hpp" -#include "graphics/resource_manager.hpp" -#include "graphics/resource_cache.hpp" -#include "graphics/opengl/buffer_object.hpp" - -namespace graphics -{ - GeometryPipeline::GeometryPipeline(shared_ptr const & cache, - EStorageType storageType, - shared_ptr const & rm, - VertexDecl const * decl) - : m_decl(decl), - m_cache(cache), - m_currentVx(0), - m_currentIdx(0), - m_maxVx(0), - m_maxIdx(0), - m_rm(rm), - m_storageType(storageType) - { - } - - GeometryPipeline::GeometryPipeline(ETextureType textureType, - EStorageType storageType, - shared_ptr const & rm, - VertexDecl const * decl, - uint8_t pipelineID) - : m_decl(decl), - m_cache(new ResourceCache(rm, textureType, pipelineID)), - m_currentVx(0), - m_currentIdx(0), - m_maxVx(0), - m_maxIdx(0), - m_rm(rm), - m_storageType(storageType) - {} - - bool GeometryPipeline::hasStorage() const - { - return m_storage.isValid(); - } - - bool GeometryPipeline::hasTexture() const - { - return m_cache->texture() != 0; - } - - void GeometryPipeline::checkStorage() const - { - if (!m_storage.isValid()) - { - resetStorage(); - m_storage = m_rm->storagePool(m_storageType)->Reserve(); - - if (m_storage.isValid()) - { - if (!m_storage.m_vertices->isLocked()) - m_storage.m_vertices->lock(); - if (!m_storage.m_indices->isLocked()) - m_storage.m_indices->lock(); - - m_decl->initStream(&m_vertexStream, - (unsigned char*)m_storage.m_vertices->data()); - - m_maxVx = m_storage.m_vertices->size() / m_decl->elemSize(); - m_maxIdx = m_storage.m_indices->size() / sizeof(unsigned short); - } - } - } - - void GeometryPipeline::checkTexture() const - { - m_cache->checkTexture(); - } - - void GeometryPipeline::resetTexture() - { - m_cache->resetTexture(); - } - - void GeometryPipeline::clearStorage() const - { - m_currentVx = 0; - m_currentIdx = 0; - } - - void GeometryPipeline::resetStorage() const - { - m_storage = gl::Storage(); - m_maxIdx = 0; - m_maxVx = 0; - clearStorage(); - } - - bool GeometryPipeline::hasRoom(unsigned verticesCount, unsigned indicesCount) const - { - checkStorage(); - if (!hasStorage()) - return false; - - return ((m_currentVx + verticesCount <= m_maxVx) - && (m_currentIdx + indicesCount <= m_maxIdx)); - } - - void GeometryPipeline::setVertexDecl(VertexDecl * decl) - { - m_decl = decl; - } - - VertexDecl const * GeometryPipeline::vertexDecl() const - { - return m_decl; - } - - VertexStream * GeometryPipeline::vertexStream() - { - return &m_vertexStream; - } - - shared_ptr const & GeometryPipeline::program() const - { - return m_program; - } - - void GeometryPipeline::setProgram(shared_ptr const & prg) - { - m_program = prg; - } - - uint8_t GeometryPipeline::pipelineID() const - { - return m_cache->pipelineID(); - } - - shared_ptr const & GeometryPipeline::texture() const - { - return m_cache->texture(); - } - - gl::Storage const & GeometryPipeline::storage() const - { - return m_storage; - } - - TTexturePool * GeometryPipeline::texturePool() const - { - return m_cache->texturePool(); - } - - TStoragePool * GeometryPipeline::storagePool() const - { - if (m_storageType != EInvalidStorage) - return m_rm->storagePool(m_storageType); - else - { - LOG(LERROR, ("no storagePool for such storageType", m_storageType)); - return 0; - } - } - - bool GeometryPipeline::hasGeometry() const - { - return m_storage.isValid() && (m_currentIdx != 0); - } - - ResourceCache::TUploadQueue const & GeometryPipeline::uploadQueue() const - { - return m_cache->uploadQueue(); - } - - void GeometryPipeline::clearUploadQueue() - { - return m_cache->clearUploadQueue(); - } - - bool GeometryPipeline::hasUploadData() const - { - return m_cache->hasData(); - } - - unsigned GeometryPipeline::vxLeft() const - { - checkStorage(); - - if (!m_storage.isValid()) - return (unsigned)-1; - - return m_maxVx - m_currentVx; - } - - unsigned GeometryPipeline::currentVx() const - { - return m_currentVx; - } - - void GeometryPipeline::advanceVx(unsigned elemCnt) - { - m_currentVx += elemCnt; - m_vertexStream.advanceVertex(elemCnt); - } - - void * GeometryPipeline::vxData() - { - return m_storage.m_vertices->data(); - } - - unsigned GeometryPipeline::idxLeft() const - { - checkStorage(); - - if (!m_storage.isValid()) - return (unsigned)-1; - - return m_maxIdx - m_currentIdx; - } - - unsigned GeometryPipeline::currentIdx() const - { - return m_currentIdx; - } - - void GeometryPipeline::advanceIdx(unsigned elemCnt) - { - m_currentIdx += elemCnt; - } - - void * GeometryPipeline::idxData() - { - return m_storage.m_indices->data(); - } - - void GeometryPipeline::addHandlesOverflowFn(ResourceCache::handlesOverflowFn const & fn, - int priority) - { - m_cache->addHandlesOverflowFn(fn, priority); - } - - shared_ptr const & GeometryPipeline::cache() const - { - return m_cache; - } -} diff --git a/graphics/geometry_pipeline.hpp b/graphics/geometry_pipeline.hpp deleted file mode 100644 index d8a96c90ab..0000000000 --- a/graphics/geometry_pipeline.hpp +++ /dev/null @@ -1,167 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" - -#include "graphics/opengl/storage.hpp" -#include "graphics/opengl/program.hpp" - -#include "graphics/defines.hpp" -#include "graphics/vertex_decl.hpp" -#include "graphics/resource_cache.hpp" -#include "graphics/resource_manager.hpp" - -namespace graphics -{ - class ResourceCache; - class ResourceManager; - - /// Single pipeline for batchable geometry. - class GeometryPipeline - { - private: - - /// VertexDeclaration, which sets how the - /// vertex is interpreted into m_storage.m_vertexBuffer - VertexDecl const * m_decl; - - /// Stream of interpreted data from m_storage, - /// created according to m_decl. - mutable VertexStream m_vertexStream; - - /// Program, which is used for this pipeline. - /// Different pipelines could use different programs. - shared_ptr m_program; - - /// ResourceCache, which collects Resource's which are used - /// by objects while batching them into this pipeline - shared_ptr m_cache; - /// Storage, which contains vertex and index data - mutable gl::Storage m_storage; - - /// current rendering position - /// @{ - mutable size_t m_currentVx; - mutable size_t m_currentIdx; - - mutable size_t m_maxVx; - mutable size_t m_maxIdx; - /// @} - - /// resource manager to interact with pool's - shared_ptr m_rm; - - /// type of storage pools - EStorageType m_storageType; - - public: - - typedef ResourceCache::handlesOverflowFn handlesOverflowFn; - - /// Constructor of static GeometryPipeline from predefined - /// ResourceCache(possibly loaded from file) - GeometryPipeline(shared_ptr const & cache, - EStorageType storageType, - shared_ptr const & rm, - VertexDecl const * decl); - - /// Constructor of dynamic GeometryPipeline from texture - /// and storage pool types and resourceManager - GeometryPipeline(ETextureType textureType, - EStorageType storageType, - shared_ptr const & rm, - VertexDecl const * decl, - uint8_t pipelineID); - - /// Setting VertexDeclaration on this pipeline, which will define - /// how to interpret data into m_storage.m_vertexBuffer - void setVertexDecl(VertexDecl * decl); - VertexDecl const * vertexDecl() const; - - /// Get structured stream of vertex data from m_storage. - VertexStream * vertexStream(); - - /// Does this pipeline holds enough free room for the - /// specified amount of vertices and indices. - bool hasRoom(unsigned verticesCount, - unsigned indicesCount) const; - - /// Get ResourceCache, associated with this pipeline - shared_ptr const & cache() const; - - void setProgram(shared_ptr const & prg); - shared_ptr const & program() const; - - /// ID of this pipeline - uint8_t pipelineID() const; - - /// Working with texture and ResourceCache - /// @{ - - /// Checking, whether this pipeline - /// has texture associated with it. - bool hasTexture() const; - /// Reserve texture if there is no texture at this pipeline. - void checkTexture() const; - /// Get the texture associated with this pipeline. - shared_ptr const & texture() const; - /// Get the texture pool this pipeline get it's texture from. - TTexturePool * texturePool() const; - /// Reset the texture, associated with this pipeline. - void resetTexture(); - /// Does this pipeline has something to upload before render? - bool hasUploadData() const; - /// Get the queue of resources, which are waiting for upload - ResourceCache::TUploadQueue const & uploadQueue() const; - /// Clear upload queue - void clearUploadQueue(); - - /// @} - - /// Working with Storage - /// @{ - - /// Checking, whether we should allocate the storage for this pipeline. - void checkStorage() const; - /// Checking, whether we have a valid storage - /// associated with this pipeline. - bool hasStorage() const; - /// getting storage associated with this pipeline - gl::Storage const & storage() const; - /// Get the storage pool this pipeline get it's storages from - TStoragePool * storagePool() const; - /// Reset storage and rendering info, - /// associated with this pipeline. - void resetStorage() const; - /// Clear rendered geometry information. - void clearStorage() const; - /// Does this pipeline has something to render? - bool hasGeometry() const; - - /// How much more vertices with the current VertexDecl - /// could be fitted into this pipeline - unsigned vxLeft() const; - /// Current vertex number - unsigned currentVx() const; - /// Advance current vertex number - void advanceVx(unsigned elemCnt); - /// Get direct pointer to vertex data - void * vxData(); - /// Get VertexDecl - VertexDecl * decl() const; - - /// How much more indices could be fitted into this pipeline - unsigned idxLeft() const; - /// Current index number - unsigned currentIdx() const; - /// Advance current index number - void advanceIdx(unsigned elemCnt); - /// Get direct pointer to index data - void * idxData(); - - /// @} - - /// Add function, which will be called upon handles overflow. - void addHandlesOverflowFn(ResourceCache::handlesOverflowFn const & fn, - int priority); - }; -} diff --git a/graphics/glyph.cpp b/graphics/glyph.cpp deleted file mode 100644 index 3fceb66bf0..0000000000 --- a/graphics/glyph.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include "graphics/glyph.hpp" -#include "graphics/glyph_cache.hpp" -#include "graphics/agg_traits.hpp" - -#include "graphics/opengl/data_traits.hpp" - -namespace graphics -{ - Glyph::Info::Info() - : Resource::Info(Resource::EGlyph) - {} - - Glyph::Info::Info(GlyphKey const & key, - GlyphCache * cache) - : Resource::Info(Resource::EGlyph), - m_key(key), - m_cache(cache) - { - m_metrics = m_cache->getGlyphMetrics(m_key); - } - - Resource::Info const & Glyph::Info::cacheKey() const - { - return *this; - } - - m2::PointU const Glyph::Info::resourceSize() const - { - return m2::PointU(m_metrics.m_width + 4, - m_metrics.m_height + 4); - } - - Resource * Glyph::Info::createResource(m2::RectU const & texRect, - uint8_t pipelineID) const - { - return new Glyph(*this, - texRect, - pipelineID); - } - - bool Glyph::Info::lessThan(Resource::Info const * r) const - { - if (m_category != r->m_category) - return m_category < r->m_category; - - Glyph::Info const * ri = static_cast(r); - - if (m_key != ri->m_key) - return m_key < ri->m_key; - - return false; - } - - Glyph::Glyph(Info const & info, - m2::RectU const & texRect, - int pipelineID) - : Resource(EGlyph, - texRect, - pipelineID), - m_info(info) - { - m_bitmap = m_info.m_cache->getGlyphBitmap(m_info.m_key); - } - - void Glyph::render(void * dst) - { - m2::RectU const & rect = m_texRect; - - DATA_TRAITS::view_t v = gil::interleaved_view( - rect.SizeX(), rect.SizeY(), - (DATA_TRAITS::pixel_t*)dst, - sizeof(DATA_TRAITS::pixel_t) * rect.SizeX() - ); - - DATA_TRAITS::pixel_t pxTranslucent; - - gil::get_color(pxTranslucent, gil::red_t()) = m_info.m_key.m_color.r / DATA_TRAITS::channelScaleFactor; - gil::get_color(pxTranslucent, gil::green_t()) = m_info.m_key.m_color.g / DATA_TRAITS::channelScaleFactor; - gil::get_color(pxTranslucent, gil::blue_t()) = m_info.m_key.m_color.b / DATA_TRAITS::channelScaleFactor; - gil::get_color(pxTranslucent, gil::alpha_t()) = 0; - - for (size_t y = 0; y < 2; ++y) - for (size_t x = 0; x < rect.SizeX(); ++x) - v(x, y) = pxTranslucent; - - for (size_t y = rect.SizeY() - 2; y < rect.SizeY(); ++y) - for (size_t x = 0; x < rect.SizeX(); ++x) - v(x, y) = pxTranslucent; - - for (size_t y = 2; y < rect.SizeY() - 2; ++y) - { - v(0, y) = pxTranslucent; - v(1, y) = pxTranslucent; - v(rect.SizeX() - 2, y) = pxTranslucent; - v(rect.SizeX() - 1, y) = pxTranslucent; - } - - if ((m_info.m_metrics.m_width != 0) - && (m_info.m_metrics.m_height != 0)) - { - gil::gray8c_view_t srcView = gil::interleaved_view( - m_info.m_metrics.m_width, - m_info.m_metrics.m_height, - (gil::gray8_pixel_t*)&m_bitmap->m_data[0], - m_bitmap->m_pitch - ); - - DATA_TRAITS::pixel_t c; - - gil::get_color(c, gil::red_t()) = m_info.m_key.m_color.r / DATA_TRAITS::channelScaleFactor; - gil::get_color(c, gil::green_t()) = m_info.m_key.m_color.g / DATA_TRAITS::channelScaleFactor; - gil::get_color(c, gil::blue_t()) = m_info.m_key.m_color.b / DATA_TRAITS::channelScaleFactor; - gil::get_color(c, gil::alpha_t()) = m_info.m_key.m_color.a / DATA_TRAITS::channelScaleFactor; - - for (size_t y = 2; y < rect.SizeY() - 2; ++y) - for (size_t x = 2; x < rect.SizeX() - 2; ++x) - { - gil::get_color(c, gil::alpha_t()) = srcView(x - 2, y - 2) / DATA_TRAITS::channelScaleFactor; - v(x, y) = c; - } - } - } - - Resource::Info const * Glyph::info() const - { - return &m_info; - } -} diff --git a/graphics/glyph.hpp b/graphics/glyph.hpp deleted file mode 100644 index 68887b3ec5..0000000000 --- a/graphics/glyph.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "graphics/resource.hpp" -#include "graphics/glyph_cache.hpp" - -namespace graphics -{ - struct Glyph : public Resource - { - struct Info : public Resource::Info - { - GlyphKey m_key; - GlyphMetrics m_metrics; - GlyphCache * m_cache; - - Info(); - Info(GlyphKey const & key, - GlyphCache * cache); - - Resource::Info const & cacheKey() const; - m2::PointU const resourceSize() const; - Resource * createResource(m2::RectU const & texRect, - uint8_t pipelineID) const; - - bool lessThan(Resource::Info const * r) const; - }; - - Info m_info; - - shared_ptr m_bitmap; - - Glyph(Info const & info, - m2::RectU const & texRect, - int pipelineID); - - void render(void * dst); - Resource::Info const * info() const; - }; -} diff --git a/graphics/glyph_cache.cpp b/graphics/glyph_cache.cpp deleted file mode 100644 index 96642364a8..0000000000 --- a/graphics/glyph_cache.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "graphics/glyph_cache.hpp" -#include "graphics/glyph_cache_impl.hpp" - -#include "3party/fribidi/lib/fribidi.h" - - -namespace graphics -{ - GlyphKey::GlyphKey(strings::UniChar symbolCode, - int fontSize, - bool isMask, - Color const & color) - : m_symbolCode(symbolCode), - m_fontSize(fontSize), - m_isMask(isMask), - m_color(color) - {} - - GlyphKey::GlyphKey() - : m_symbolCode(0), - m_fontSize(), - m_isMask(), - m_color() - {} - - bool operator<(GlyphKey const & l, GlyphKey const & r) - { - if (l.m_symbolCode != r.m_symbolCode) - return l.m_symbolCode < r.m_symbolCode; - if (l.m_fontSize != r.m_fontSize) - return l.m_fontSize < r.m_fontSize; - if (l.m_isMask != r.m_isMask) - return l.m_isMask < r.m_isMask; - return l.m_color < r.m_color; - } - - bool operator!=(GlyphKey const & l, GlyphKey const & r) - { - return (l.m_symbolCode != r.m_symbolCode) - || (l.m_fontSize != r.m_fontSize) - || (l.m_isMask != r.m_isMask) - || (l.m_color != r.m_color); - } - - GlyphCache::Params::Params(string const & blocksFile, - string const & whiteListFile, - string const & blackListFile, - size_t maxSize, - EDensity density, - int exactDensityDPI, - bool isDebugging) - : m_blocksFile(blocksFile), - m_whiteListFile(whiteListFile), - m_blackListFile(blackListFile), - m_maxSize(maxSize), - m_density(density), - m_exactDensityDPI(exactDensityDPI), - m_isDebugging(isDebugging) - {} - - GlyphCache::GlyphCache() - {} - - GlyphCache::GlyphCache(Params const & params) : m_impl(new GlyphCacheImpl(params)) - { - } - - void GlyphCache::addFonts(vector const & fontNames) - { - m_impl->addFonts(fontNames); - } - - pair GlyphCache::getCharIDX(GlyphKey const & key) - { - return m_impl->getCharIDX(key); - } - - GlyphMetrics const GlyphCache::getGlyphMetrics(GlyphKey const & key) - { - return m_impl->getGlyphMetrics(key); - } - - shared_ptr const GlyphCache::getGlyphBitmap(GlyphKey const & key) - { - return m_impl->getGlyphBitmap(key); - } - - double GlyphCache::getTextLength(double fontSize, string const & text) - { - strings::UniString const s = strings::MakeUniString(text); - double len = 0; - for (unsigned i = 0; i < s.size(); ++i) - { - GlyphKey k(s[i], static_cast(fontSize), false, graphics::Color(0, 0, 0, 255)); - len += getGlyphMetrics(k).m_xAdvance; - } - - return len; - } - - threads::Mutex GlyphCache::s_fribidiMutex; - - strings::UniString GlyphCache::log2vis(strings::UniString const & str) - { - size_t const count = str.size(); - if (count == 0) - return str; - - strings::UniString res(count); - - //FriBidiEnv env; - threads::MutexGuard g(s_fribidiMutex); - FriBidiParType dir = FRIBIDI_PAR_LTR; // requested base direction - fribidi_log2vis(&str[0], count, &dir, &res[0], 0, 0, 0); - return res; - } -} diff --git a/graphics/glyph_cache.hpp b/graphics/glyph_cache.hpp deleted file mode 100644 index 9260623397..0000000000 --- a/graphics/glyph_cache.hpp +++ /dev/null @@ -1,103 +0,0 @@ -#pragma once - -#include "graphics/color.hpp" - -#include "graphics/defines.hpp" - -#include "base/string_utils.hpp" -#include "base/mutex.hpp" - -#include "std/shared_ptr.hpp" -#include "std/vector.hpp" -#include "std/string.hpp" -#include "std/utility.hpp" - - -namespace graphics -{ - /// metrics of the single glyph - struct GlyphMetrics - { - int m_xAdvance; - int m_yAdvance; - int m_xOffset; - int m_yOffset; - int m_width; - int m_height; - }; - - struct GlyphBitmap - { - unsigned m_width; - unsigned m_height; - unsigned m_pitch; - vector m_data; - }; - - struct GlyphKey - { - strings::UniChar m_symbolCode; - int m_fontSize; - bool m_isMask; - graphics::Color m_color; - - GlyphKey(strings::UniChar symbolCode, - int fontSize, - bool isMask, - Color const & color); - GlyphKey(); - }; - - struct Font; - - bool operator<(GlyphKey const & l, GlyphKey const & r); - bool operator!=(GlyphKey const & l, GlyphKey const & r); - - struct GlyphCacheImpl; - - class GlyphCache - { - private: - - shared_ptr m_impl; - - static threads::Mutex s_fribidiMutex; - - public: - - struct Params - { - string m_blocksFile; - string m_whiteListFile; - string m_blackListFile; - size_t m_maxSize; - EDensity m_density; - int m_exactDensityDPI; - bool m_isDebugging; - - Params(string const & blocksFile, - string const & whiteListFile, - string const & blackListFile, - size_t maxSize, - EDensity density, - int exactDensityDPI, - bool isDebugging); - }; - - GlyphCache(); - GlyphCache(Params const & params); - - void reset(); - void addFonts(vector const & fontNames); - - pair getCharIDX(GlyphKey const & key); - - shared_ptr const getGlyphBitmap(GlyphKey const & key); - /// return control box(could be slightly larger than the precise bound box). - GlyphMetrics const getGlyphMetrics(GlyphKey const & key); - - double getTextLength(double fontSize, string const & text); - - static strings::UniString log2vis(strings::UniString const & str); - }; -} diff --git a/graphics/glyph_cache_impl.cpp b/graphics/glyph_cache_impl.cpp deleted file mode 100644 index 7064dba526..0000000000 --- a/graphics/glyph_cache_impl.cpp +++ /dev/null @@ -1,581 +0,0 @@ -#include "graphics/glyph_cache_impl.hpp" -#include "graphics/freetype.hpp" - -#include "platform/platform.hpp" - -#include "coding/reader.hpp" - -#include "base/assert.hpp" - -#include "std/bind.hpp" -#include "std/cstring.hpp" - -#include - - -namespace graphics -{ - UnicodeBlock::UnicodeBlock(string const & name, strings::UniChar start, strings::UniChar end) - : m_name(name), m_start(start), m_end(end) - {} - - bool UnicodeBlock::hasSymbol(strings::UniChar sym) const - { - return (m_start <= sym) && (m_end >= sym); - } - - /// Called by FreeType to read data - static unsigned long FTStreamIOFunc(FT_Stream stream, - unsigned long offset, - unsigned char * buffer, - unsigned long count) - { - // FreeType can call us with 0 to "Skip" bytes - if (count != 0) - reinterpret_cast *>(stream->descriptor.pointer)->Read(offset, buffer, count); - return count; - } - - static void FTStreamCloseFunc(FT_Stream) - { - } - - Font::Font(ReaderPtr const & fontReader) : m_fontReader(fontReader) - { - m_fontStream = new FT_StreamRec; - m_fontStream->base = 0; - m_fontStream->size = m_fontReader.Size(); - m_fontStream->pos = 0; - m_fontStream->descriptor.pointer = &m_fontReader; - m_fontStream->pathname.pointer = 0; - m_fontStream->read = &FTStreamIOFunc; - m_fontStream->close = &FTStreamCloseFunc; - m_fontStream->memory = 0; - m_fontStream->cursor = 0; - m_fontStream->limit = 0; - } - - Font::~Font() - { - delete m_fontStream; - } - - FT_Error Font::CreateFaceID(FT_Library library, FT_Face * face) - { - FT_Open_Args args; - args.flags = FT_OPEN_STREAM; - args.memory_base = 0; - args.memory_size = 0; - args.pathname = 0; - args.stream = m_fontStream; - args.driver = 0; - args.num_params = 0; - args.params = 0; - return FT_Open_Face(library, &args, 0, face); - //return FT_New_Memory_Face(library, (unsigned char*)m_fontData.data(), m_fontData.size(), 0, face); - } - - void GlyphCacheImpl::initBlocks(string const & fileName) - { - string buffer; - try - { - ReaderPtr(GetPlatform().GetReader(fileName)).ReadAsString(buffer); - } - catch (RootException const & e) - { - LOG(LERROR, ("Error reading unicode blocks: ", e.what())); - return; - } - - istringstream fin(buffer); - while (true) - { - string name; - strings::UniChar start; - strings::UniChar end; - fin >> name >> std::hex >> start >> std::hex >> end; - if (!fin) - break; - - m_unicodeBlocks.push_back(UnicodeBlock(name, start, end)); - } - - m_lastUsedBlock = m_unicodeBlocks.end(); - } - - bool find_ub_by_name(string const & ubName, UnicodeBlock const & ub) - { - return ubName == ub.m_name; - } - - void GlyphCacheImpl::initFonts(string const & whiteListFile, string const & blackListFile) - { - { - string buffer; - try - { - ReaderPtr(GetPlatform().GetReader(whiteListFile)).ReadAsString(buffer); - } - catch (RootException const & e) - { - LOG(LERROR, ("Error reading white list fonts: ", e.what())); - return; - } - - istringstream fin(buffer); - while (true) - { - string ubName; - string fontName; - fin >> ubName >> fontName; - if (!fin) - break; - - LOG(LDEBUG, ("whitelisting ", fontName, " for ", ubName)); - - if (ubName == "*") - for (unicode_blocks_t::iterator it = m_unicodeBlocks.begin(); it != m_unicodeBlocks.end(); ++it) - it->m_whitelist.push_back(fontName); - else - { - unicode_blocks_t::iterator it = find_if(m_unicodeBlocks.begin(), m_unicodeBlocks.end(), bind(&find_ub_by_name, ubName, _1)); - if (it != m_unicodeBlocks.end()) - it->m_whitelist.push_back(fontName); - } - } - } - - { - string buffer; - try - { - ReaderPtr(GetPlatform().GetReader(blackListFile)).ReadAsString(buffer); - } - catch (RootException const & e) - { - LOG(LERROR, ("Error reading black list fonts: ", e.what())); - return; - } - - istringstream fin(buffer); - while (true) - { - string ubName; - string fontName; - fin >> ubName >> fontName; - if (!fin) - break; - - LOG(LDEBUG, ("blacklisting ", fontName, " for ", ubName)); - - if (ubName == "*") - for (unicode_blocks_t::iterator it = m_unicodeBlocks.begin(); it != m_unicodeBlocks.end(); ++it) - it->m_blacklist.push_back(fontName); - else - { - unicode_blocks_t::iterator it = find_if(m_unicodeBlocks.begin(), m_unicodeBlocks.end(), bind(&find_ub_by_name, ubName, _1)); - if (it != m_unicodeBlocks.end()) - it->m_blacklist.push_back(fontName); - } - } - } - } - - bool greater_coverage(pair > const & l, pair > const & r) - { - return l.first > r.first; - } - - void GlyphCacheImpl::addFonts(vector const & fontNames) - { - if (m_isDebugging) - return; - - for (size_t i = 0; i < fontNames.size(); ++i) - { - try - { - addFont(fontNames[i].c_str()); - } - catch (RootException const & ex) - { - LOG(LERROR, ("Can't load font", fontNames[i], ex.Msg())); - } - } - } - - void GlyphCacheImpl::addFont(char const * fileName) - { - if (m_isDebugging) - return; - - shared_ptr pFont(new Font(GetPlatform().GetReader(fileName))); - - // Obtaining all glyphs, supported by this font. Call to FTCHECKRETURN functions may return - // from routine, so add font to fonts array only in the end. - - FT_Face face; - FREETYPE_CHECK_RETURN(pFont->CreateFaceID(m_lib, &face), fileName); - - vector charcodes; - - FT_UInt gindex; - charcodes.push_back(FT_Get_First_Char(face, &gindex)); - while (gindex) - charcodes.push_back(FT_Get_Next_Char(face, charcodes.back(), &gindex)); - - sort(charcodes.begin(), charcodes.end()); - charcodes.erase(unique(charcodes.begin(), charcodes.end()), charcodes.end()); - - FREETYPE_CHECK_RETURN(FT_Done_Face(face), fileName); - - m_fonts.push_back(pFont); - - // modifying the m_unicodeBlocks - unicode_blocks_t::iterator ubIt = m_unicodeBlocks.begin(); - vector::iterator ccIt = charcodes.begin(); - - while (ccIt != charcodes.end()) - { - while (ubIt != m_unicodeBlocks.end()) - { - ASSERT ( ccIt != charcodes.end(), () ); - if (ubIt->hasSymbol(*ccIt)) - break; - ++ubIt; - } - - if (ubIt == m_unicodeBlocks.end()) - break; - - // here we have unicode block, which contains the specified symbol. - if (ubIt->m_fonts.empty() || (ubIt->m_fonts.back() != m_fonts.back())) - { - ubIt->m_fonts.push_back(m_fonts.back()); - ubIt->m_coverage.push_back(0); - - // checking blacklist and whitelist - - for (size_t i = 0; i < ubIt->m_blacklist.size(); ++i) - if (ubIt->m_blacklist[i] == fileName) - { - // if font is blacklisted for this unicode block - ubIt->m_coverage.back() = -1; - } - - for (size_t i = 0; i < ubIt->m_whitelist.size(); ++i) - if (ubIt->m_whitelist[i] == fileName) - { - if (ubIt->m_coverage.back() == -1) - { - LOG(LWARNING, ("font ", fileName, "is present both at blacklist and whitelist. whitelist prevails.")); - } - // weight used for sorting are boosted to the top. - // the order of elements are saved by adding 'i' value as a shift. - ubIt->m_coverage.back() = ubIt->m_end + 1 - ubIt->m_start + i + 1; - } - } - - if ((ubIt->m_coverage.back() >= 0) && (ubIt->m_coverage.back() < ubIt->m_end + 1 - ubIt->m_start)) - ++ubIt->m_coverage.back(); - ++ccIt; - } - - // rearrange fonts in all unicode blocks according to it's coverage - for (ubIt = m_unicodeBlocks.begin(); ubIt != m_unicodeBlocks.end(); ++ubIt) - { - /// @todo Make sorting of 2 vectors ubIt->m_coverage, ubIt->m_fonts - /// with one criteria without temporary vector sortData. - - size_t const count = ubIt->m_fonts.size(); - - vector > > sortData; - sortData.reserve(count); - - for (size_t i = 0; i < count; ++i) - sortData.push_back(make_pair(ubIt->m_coverage[i], ubIt->m_fonts[i])); - - sort(sortData.begin(), sortData.end(), &greater_coverage); - - for (size_t i = 0; i < count; ++i) - { - ubIt->m_coverage[i] = sortData[i].first; - ubIt->m_fonts[i] = sortData[i].second; - } - } - } - - struct sym_in_block - { - bool operator() (UnicodeBlock const & b, strings::UniChar sym) const - { - return (b.m_start < sym); - } - bool operator() (strings::UniChar sym, UnicodeBlock const & b) const - { - return (sym < b.m_start); - } - bool operator() (UnicodeBlock const & b1, UnicodeBlock const & b2) const - { - return (b1.m_start < b2.m_start); - } - }; - - vector > & GlyphCacheImpl::getFonts(strings::UniChar sym) - { - if ((m_lastUsedBlock != m_unicodeBlocks.end()) && m_lastUsedBlock->hasSymbol(sym)) - return m_lastUsedBlock->m_fonts; - - unicode_blocks_t::iterator it = lower_bound(m_unicodeBlocks.begin(), - m_unicodeBlocks.end(), - sym, - sym_in_block()); - - if (it == m_unicodeBlocks.end()) - it = m_unicodeBlocks.end()-1; - else - if (it != m_unicodeBlocks.begin()) - it = it-1; - - m_lastUsedBlock = it; - - if ((it != m_unicodeBlocks.end()) && it->hasSymbol(sym)) - { - if (it->m_fonts.empty()) - { - LOG(LDEBUG, ("querying symbol for empty ", it->m_name, " unicode block")); - ASSERT(!m_fonts.empty(), ("Empty fonts container")); - - it->m_fonts.push_back(m_fonts.front()); - } - - return it->m_fonts; - } - else - return m_fonts; - } - - - GlyphCacheImpl::GlyphCacheImpl(GlyphCache::Params const & params) - { - m_isDebugging = params.m_isDebugging; - - initBlocks(params.m_blocksFile); - initFonts(params.m_whiteListFile, params.m_blackListFile); - - if (!m_isDebugging) - { - FREETYPE_CHECK(FT_Init_FreeType(&m_lib)); - - /// Initializing caches - FREETYPE_CHECK(FTC_Manager_New(m_lib, 3, 10, params.m_maxSize, &RequestFace, 0, &m_manager)); - - FREETYPE_CHECK(FTC_ImageCache_New(m_manager, &m_normalGlyphCache)); - FREETYPE_CHECK(FTC_StrokedImageCache_New(m_manager, &m_strokedGlyphCache)); - - FREETYPE_CHECK(FTC_ImageCache_New(m_manager, &m_normalMetricsCache)); - FREETYPE_CHECK(FTC_StrokedImageCache_New(m_manager, &m_strokedMetricsCache)); - - /// Initializing stroker - FREETYPE_CHECK(FT_Stroker_New(m_lib, &m_stroker)); - FT_Stroker_Set(m_stroker, FT_Fixed(visualScaleExact(params.m_exactDensityDPI) * 2 * 64), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); - - FREETYPE_CHECK(FTC_CMapCache_New(m_manager, &m_charMapCache)); - } - else - { - /// initialize fake bitmap - } - } - - GlyphCacheImpl::~GlyphCacheImpl() - { - if (!m_isDebugging) - { - FTC_Manager_Done(m_manager); - FT_Stroker_Done(m_stroker); - FT_Done_FreeType(m_lib); - } - } - - int GlyphCacheImpl::getCharIDX(shared_ptr const & font, strings::UniChar symbolCode) - { - if (m_isDebugging) - return 0; - - FTC_FaceID faceID = reinterpret_cast(font.get()); - - return FTC_CMapCache_Lookup( - m_charMapCache, - faceID, - -1, - symbolCode - ); - } - - pair const GlyphCacheImpl::getCharIDX(GlyphKey const & key) - { - if (m_isDebugging) - return make_pair((Font*)0, 0); - - vector > & fonts = getFonts(key.m_symbolCode); - - Font * font = 0; - - int charIDX; - - for (size_t i = 0; i < fonts.size(); ++i) - { - charIDX = getCharIDX(fonts[i], key.m_symbolCode); - - if (charIDX != 0) - return make_pair(fonts[i].get(), charIDX); - } - -#ifdef DEBUG - - for (size_t i = 0; i < m_unicodeBlocks.size(); ++i) - { - if (m_unicodeBlocks[i].hasSymbol(key.m_symbolCode)) - { - LOG(LDEBUG, ("Symbol", key.m_symbolCode, "not found, unicodeBlock=", m_unicodeBlocks[i].m_name)); - break; - } - } - -#endif - - font = fonts.front().get(); - - /// taking substitution character from the first font in the list - charIDX = getCharIDX(fonts.front(), 65533); - if (charIDX == 0) - charIDX = getCharIDX(fonts.front(), 32); - - return make_pair(font, charIDX); - } - - GlyphMetrics const GlyphCacheImpl::getGlyphMetrics(GlyphKey const & key) - { - pair charIDX = getCharIDX(key); - - FTC_ScalerRec fontScaler = - { - static_cast(charIDX.first), - static_cast(key.m_fontSize), - static_cast(key.m_fontSize), - 1, - 0, - 0 - }; - - FT_Glyph glyph = 0; - - if (key.m_isMask) - { - FREETYPE_CHECK(FTC_StrokedImageCache_LookupScaler( - m_strokedMetricsCache, - &fontScaler, - m_stroker, - FT_LOAD_DEFAULT, - charIDX.second, - &glyph, - 0)); - } - else - { - FREETYPE_CHECK(FTC_ImageCache_LookupScaler( - m_normalMetricsCache, - &fontScaler, - FT_LOAD_DEFAULT, - charIDX.second, - &glyph, - 0)); - } - - FT_BBox cbox; - FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_PIXELS, &cbox); - - GlyphMetrics m = - { - static_cast(glyph->advance.x >> 16), - static_cast(glyph->advance.y >> 16), - static_cast(cbox.xMin), - static_cast(cbox.yMin), - static_cast(cbox.xMax - cbox.xMin), - static_cast(cbox.yMax - cbox.yMin) - }; - - return m; - } - - shared_ptr const GlyphCacheImpl::getGlyphBitmap(GlyphKey const & key) - { - pair charIDX = getCharIDX(key); - - FTC_ScalerRec fontScaler = - { - static_cast(charIDX.first), - static_cast(key.m_fontSize), - static_cast(key.m_fontSize), - 1, - 0, - 0 - }; - - FT_Glyph glyph = 0; - FTC_Node node; - - if (key.m_isMask) - { - FREETYPE_CHECK(FTC_StrokedImageCache_LookupScaler( - m_strokedGlyphCache, - &fontScaler, - m_stroker, - FT_LOAD_DEFAULT, - charIDX.second, - &glyph, - &node - )); - } - else - { - FREETYPE_CHECK(FTC_ImageCache_LookupScaler( - m_normalGlyphCache, - &fontScaler, - FT_LOAD_DEFAULT | FT_LOAD_RENDER, - charIDX.second, - &glyph, - &node - )); - } - - GlyphBitmap * bitmap = new GlyphBitmap(); - - FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph; - - bitmap->m_width = bitmapGlyph ? bitmapGlyph->bitmap.width : 0; - bitmap->m_height = bitmapGlyph ? bitmapGlyph->bitmap.rows : 0; - bitmap->m_pitch = bitmapGlyph ? bitmapGlyph->bitmap.pitch : 0; - - if (bitmap->m_width && bitmap->m_height) - { - bitmap->m_data.resize(bitmap->m_pitch * bitmap->m_height); - memcpy(&bitmap->m_data[0], - bitmapGlyph->bitmap.buffer, - bitmap->m_pitch * bitmap->m_height); - } - - FTC_Node_Unref(node, m_manager); - - return shared_ptr(bitmap); - } - - FT_Error GlyphCacheImpl::RequestFace(FTC_FaceID faceID, FT_Library library, FT_Pointer /*requestData*/, FT_Face * face) - { - //GlyphCacheImpl * glyphCacheImpl = reinterpret_cast(requestData); - Font * font = reinterpret_cast(faceID); - return font->CreateFaceID(library, face); - } -} diff --git a/graphics/glyph_cache_impl.hpp b/graphics/glyph_cache_impl.hpp deleted file mode 100644 index 522d7010cc..0000000000 --- a/graphics/glyph_cache_impl.hpp +++ /dev/null @@ -1,95 +0,0 @@ -#pragma once - -#include "graphics/glyph_cache.hpp" -#include "graphics/freetype.hpp" - -#include "base/string_utils.hpp" - -#include "coding/reader.hpp" - -#include "std/string.hpp" -#include "std/vector.hpp" -#include "std/shared_ptr.hpp" - - -namespace graphics -{ - struct Font - { - FT_Stream m_fontStream; - ReaderPtr m_fontReader; - - /// information about symbol ranges - /// ... - /// constructor - Font(ReaderPtr const & fontReader); - ~Font(); - - FT_Error CreateFaceID(FT_Library library, FT_Face * face); - }; - - /// Information about single unicode block. - struct UnicodeBlock - { - string m_name; - - /// @{ font matching tuning - /// whitelist has priority over the blacklist in case of duplicates. - /// this fonts are promoted to the top of the font list for this block. - vector m_whitelist; - /// this fonts are removed from the font list for this block. - vector m_blacklist; - /// @} - - strings::UniChar m_start; - strings::UniChar m_end; - /// sorted indices in m_fonts, from the best to the worst - vector > m_fonts; - /// coverage of each font, in symbols - vector m_coverage; - - UnicodeBlock(string const & name, strings::UniChar start, strings::UniChar end); - bool hasSymbol(strings::UniChar sym) const; - }; - - struct GlyphCacheImpl - { - FT_Library m_lib; - FT_Stroker m_stroker; - - FTC_Manager m_manager; //< freetype cache manager for all caches - - FTC_ImageCache m_normalMetricsCache; //< cache of normal glyph metrics - FTC_ImageCache m_strokedMetricsCache; //< cache of stroked glyph metrics - - FTC_ImageCache m_normalGlyphCache; //< cache of normal glyph images - FTC_ImageCache m_strokedGlyphCache; //< cache of stroked glyph images - - FTC_CMapCache m_charMapCache; //< cache of glyphID -> glyphIdx mapping - - typedef vector unicode_blocks_t; - unicode_blocks_t m_unicodeBlocks; - unicode_blocks_t::iterator m_lastUsedBlock; - bool m_isDebugging; - - typedef vector > TFonts; - TFonts m_fonts; - - static FT_Error RequestFace(FTC_FaceID faceID, FT_Library library, FT_Pointer requestData, FT_Face * face); - - void initBlocks(string const & fileName); - void initFonts(string const & whiteListFile, string const & blackListFile); - - vector > & getFonts(strings::UniChar sym); - void addFont(char const * fileName); - void addFonts(vector const & fontNames); - - int getCharIDX(shared_ptr const & font, strings::UniChar symbolCode); - pair const getCharIDX(GlyphKey const & key); - GlyphMetrics const getGlyphMetrics(GlyphKey const & key); - shared_ptr const getGlyphBitmap(GlyphKey const & key); - - GlyphCacheImpl(GlyphCache::Params const & params); - ~GlyphCacheImpl(); - }; -} diff --git a/graphics/glyph_layout.cpp b/graphics/glyph_layout.cpp deleted file mode 100644 index cd65be899c..0000000000 --- a/graphics/glyph_layout.cpp +++ /dev/null @@ -1,412 +0,0 @@ -#include "graphics/glyph_layout.hpp" -#include "graphics/resource.hpp" - -#include "base/logging.hpp" -#include "base/math.hpp" - - -namespace graphics -{ - GlyphLayout::GlyphLayout(FontDesc const & font) - : m_firstVisible(0), - m_lastVisible(0), - m_fontDesc(font), - m_pivot(0, 0), - m_offset(0, 0), - m_textLength(0) - { - } - - GlyphLayout::GlyphLayout(GlyphCache * glyphCache, - FontDesc const & fontDesc, - m2::PointD const & pt, - strings::UniString const & visText, - graphics::EPosition pos, - unsigned maxWidth) - : m_firstVisible(0), - m_lastVisible(visText.size()), - m_fontDesc(fontDesc), - m_pivot(pt), - m_offset(0, 0), - m_textLength(0) - { - initStraigthText(glyphCache, fontDesc, pt, visText, pos, maxWidth); - } - - GlyphLayoutPath::GlyphLayoutPath(GlyphLayoutPath const & src, - math::Matrix const & m) - : GlyphLayout(src.m_fontDesc), - m_path(src.m_path, m), - m_visText(src.m_visText) - { - if (!m_fontDesc.IsValid()) - return; - - m_metrics = src.m_metrics; - m_textLength = src.m_textLength; - - m_boundRects.push_back(m2::AnyRectD(m2::RectD(0, 0, 0, 0))); - - m_textOffset = (m2::PointD(0, src.m_textOffset) * m).Length(m2::PointD(0, 0) * m); - - // if isReverse flag is changed, recalculate m_textOffset - if (src.m_path.isReverse() != m_path.isReverse()) - m_textOffset = m_path.fullLength() - m_textOffset - m_textLength; - - recalcAlongPath(); - } - - GlyphLayoutPath::GlyphLayoutPath(GlyphCache * glyphCache, - FontDesc const & fontDesc, - m2::PointD const * pts, - size_t ptsCount, - strings::UniString const & visText, - double fullLength, - double pathOffset, - double textOffset) - : GlyphLayout(fontDesc), - m_path(pts, ptsCount, fullLength, pathOffset), - m_visText(visText), - m_textOffset(textOffset) - { - if (!m_fontDesc.IsValid()) - return; - - m_boundRects.push_back(m2::AnyRectD(m2::RectD(0, 0, 0, 0))); - - size_t const cnt = m_visText.size(); - m_metrics.resize(cnt); - - for (size_t i = 0; i < cnt; ++i) - { - GlyphKey key(visText[i], - m_fontDesc.m_size, - false, // calculating glyph positions using the unmasked glyphs. - graphics::Color(0, 0, 0, 0)); - m_metrics[i] = glyphCache->getGlyphMetrics(key); - m_textLength += m_metrics[i].m_xAdvance; - } - - // if was reversed - recalculate m_textOffset - if (m_path.isReverse()) - m_textOffset = m_path.fullLength() - m_textOffset - m_textLength; - - recalcAlongPath(); - } - - void GlyphLayout::addGlyph(GlyphCache * glyphCache, - GlyphKey const & key, - bool isFirst, - strings::UniChar symbol, - m2::RectD & boundRect, - m2::PointD & curPt) - { - GlyphMetrics const m = glyphCache->getGlyphMetrics(key); - - m_textLength += m.m_xAdvance; - - if (isFirst) - { - boundRect = m2::RectD(m.m_xOffset, - -m.m_yOffset, - m.m_xOffset, - -m.m_yOffset); - - } - else - boundRect.Add(m2::PointD(m.m_xOffset + curPt.x, -m.m_yOffset + curPt.y)); - - boundRect.Add(m2::PointD(m.m_xOffset + m.m_width, - -(m.m_yOffset + m.m_height)) + curPt); - - GlyphLayoutElem elem; - elem.m_sym = symbol; - elem.m_angle = 0; - elem.m_pt = curPt; - m_entries.push_back(elem); - m_metrics.push_back(m); - - curPt += m2::PointD(m.m_xAdvance, m.m_yAdvance); - } - - void GlyphLayout::initStraigthText(GlyphCache * glyphCache, - FontDesc const & fontDesc, - m2::PointD const & pt, - strings::UniString const & visText, - graphics::EPosition pos, - unsigned maxWidth) - { - if (!m_fontDesc.IsValid()) - return; - - size_t const cnt = visText.size(); - ASSERT_GREATER(cnt, 0, ()); - - m_entries.reserve(cnt + 2); - m_metrics.reserve(cnt + 2); - - m2::RectD boundRect; - m2::PointD curPt(0, 0); - - bool isFirst = true; - - strings::UniChar dotSymbol = '.'; - GlyphKey dotKey(dotSymbol, - fontDesc.m_size, - false, - fontDesc.m_color); - maxWidth -= glyphCache->getGlyphMetrics(dotKey).m_xAdvance; - - for (size_t i = 0; i < visText.size(); ++i) - { - if (m_textLength >= maxWidth) - { - addGlyph(glyphCache, dotKey, isFirst, dotSymbol, boundRect, curPt); - addGlyph(glyphCache, dotKey, isFirst, dotSymbol, boundRect, curPt); - addGlyph(glyphCache, dotKey, isFirst, dotSymbol, boundRect, curPt); - m_lastVisible = i + 3; - break; - } - - GlyphKey glyphKey(visText[i], - fontDesc.m_size, - false, //< calculating glyph positions using unmasked glyphs. - fontDesc.m_color); - - addGlyph(glyphCache, glyphKey, isFirst, visText[i], boundRect, curPt); - isFirst = false; - } - - boundRect.Inflate(2, 2); - - double halfSizeX = boundRect.SizeX() / 2.0; - double halfSizeY = boundRect.SizeY() / 2.0; - - m2::PointD ptOffs(-halfSizeX - boundRect.minX(), - -halfSizeY - boundRect.minY()); - - // adjusting according to position - if (pos & EPosLeft) - ptOffs += m2::PointD(-halfSizeX, 0); - - if (pos & EPosRight) - ptOffs += m2::PointD(halfSizeX, 0); - - if (pos & EPosAbove) - ptOffs += m2::PointD(0, -halfSizeY); - - if (pos & EPosUnder) - ptOffs += m2::PointD(0, halfSizeY); - - for (unsigned i = 0; i < m_entries.size(); ++i) - m_entries[i].m_pt += ptOffs; - - boundRect.Offset(ptOffs); - - m_boundRects.push_back(m2::AnyRectD(boundRect)); - } - - void GlyphLayoutPath::recalcAlongPath() - { - size_t const count = m_visText.size(); - if (count == 0 || m_path.fullLength() < m_textLength) - return; - - m_entries.resize(count); - for (size_t i = 0; i < count; ++i) - m_entries[i].m_sym = m_visText[i]; - - PathPoint arrPathStart = m_path.front(); - - // Offset of the text from path's start. - // In normal behaviour it should be always > 0, - // but now we do scale tiles for the fixed layout. - double offset = m_textOffset - m_path.pathOffset(); - if (offset < 0.0) - { - /// @todo Try to fix this heuristic. - if (offset > -3.0) - offset = 0.0; - else - return; - } - - // find first visible glyph - size_t symPos = 0; - - PathPoint glyphStartPt = m_path.offsetPoint(arrPathStart, offset); - - /// @todo Calculate better pivot (invariant point when scaling and rotating text). - m_pivot = glyphStartPt.m_pt; - - m_firstVisible = symPos; - - GlyphLayoutElem prevElem; - bool hasPrevElem = false; - - // calculate base line offset - double const blOffset = 2 - m_fontDesc.m_size / 2; - - for (; symPos < count; ++symPos) - { - // can we find this glyph in fonts? - if (glyphStartPt.m_i == -1) - return; - - GlyphMetrics const & metrics = m_metrics[symPos]; - GlyphLayoutElem & entry = m_entries[symPos]; - - if (metrics.m_width != 0) - { - - PivotPoint pivotPt = m_path.findPivotPoint(glyphStartPt, metrics); - - // do we still have space on path for this glyph? - if (pivotPt.m_pp.m_i == -1) - return; - - entry.m_angle = pivotPt.m_angle; - - // is path too bended to be shown at all? - if (hasPrevElem && fabs(ang::GetShortestDistance(prevElem.m_angle.val(), entry.m_angle.val())) > 0.5) - break; - - double const centerOffset = metrics.m_xOffset + metrics.m_width / 2.0; - entry.m_pt = pivotPt.m_pp.m_pt.Move(-centerOffset, - entry.m_angle.sin(), - entry.m_angle.cos()); - - entry.m_pt = entry.m_pt.Move(blOffset, - -entry.m_angle.cos(), - entry.m_angle.sin()); - - // kerning should be computed for baseline centered glyph - prevElem = entry; - hasPrevElem = true; - } - else - { - if (symPos == m_firstVisible) - { - m_firstVisible = symPos + 1; - } - else - { - m_entries[symPos].m_angle = ang::AngleD(); - m_entries[symPos].m_pt = glyphStartPt.m_pt; - } - } - - glyphStartPt = m_path.offsetPoint(glyphStartPt, metrics.m_xAdvance); - - m_lastVisible = symPos + 1; - } - - // storing glyph coordinates relative to pivot point. - for (size_t i = m_firstVisible; i < m_lastVisible; ++i) - m_entries[i].m_pt -= m_pivot; - - computeBoundRects(); - } - - void GlyphLayout::computeBoundRects() - { - map rects; - - for (size_t i = m_firstVisible; i < m_lastVisible; ++i) - { - if (m_metrics[i].m_width != 0) - { - ang::AngleD const & a = m_entries[i].m_angle; - - map::iterator it = rects.find(a.val()); - - m2::AnyRectD symRectAA( - m_entries[i].m_pt.Move(m_metrics[i].m_height + m_metrics[i].m_yOffset, -a.cos(), a.sin()), //< moving by angle = m_entries[i].m_angle - math::pi / 2 - a, - m2::RectD(m_metrics[i].m_xOffset, - 0, - m_metrics[i].m_xOffset + m_metrics[i].m_width, - m_metrics[i].m_height - )); - - if (it == rects.end()) - rects[a.val()] = symRectAA; - else - rects[a.val()].Add(symRectAA); - } - } - - m_boundRects.clear(); - - for (map::const_iterator it = rects.begin(); it != rects.end(); ++it) - { - m2::AnyRectD r(it->second); - m2::PointD zero = r.GlobalZero(); - - double dx = zero.x - floor(zero.x); - double dy = zero.y - floor(zero.y); - - r.Offset(m2::PointD(-dx, -dy)); - - r.Offset(m_pivot); - - m_boundRects.push_back(r); - } - } - - size_t GlyphLayout::firstVisible() const - { - return m_firstVisible; - } - - size_t GlyphLayout::lastVisible() const - { - return m_lastVisible; - } - - m2::PointD const & GlyphLayout::pivot() const - { - return m_pivot; - } - - void GlyphLayout::setPivot(m2::PointD const & pivot) - { - for (size_t i = 0; i < m_boundRects.size(); ++i) - m_boundRects[i].Offset(pivot - m_pivot); - - m_pivot = pivot; - } - - m2::PointD const & GlyphLayout::offset() const - { - return m_offset; - } - - void GlyphLayout::setOffset(m2::PointD const & offset) - { - for (size_t i = 0; i < m_boundRects.size(); ++i) - m_boundRects[i].Offset(offset - m_offset); - - m_offset = offset; - } - - graphics::FontDesc const & GlyphLayout::fontDesc() const - { - return m_fontDesc; - } - - int GlyphLayout::baseLineOffset() - { - int result = 0; - for (size_t i = 0; i < m_metrics.size(); ++i) - result = min(m_metrics[i].m_yOffset, result); - - return -result; - } - - bool GlyphLayoutPath::IsFullVisible() const - { - return (m_firstVisible == 0 && m_lastVisible == m_visText.size()); - } -} diff --git a/graphics/glyph_layout.hpp b/graphics/glyph_layout.hpp deleted file mode 100644 index 927c10e542..0000000000 --- a/graphics/glyph_layout.hpp +++ /dev/null @@ -1,121 +0,0 @@ -#pragma once - -#include "graphics/glyph_cache.hpp" -#include "graphics/defines.hpp" -#include "graphics/text_path.hpp" -#include "graphics/font_desc.hpp" - -#include "geometry/rect2d.hpp" -#include "geometry/point2d.hpp" -#include "geometry/any_rect2d.hpp" -#include "geometry/angles.hpp" - -#include "base/string_utils.hpp" - - -namespace graphics -{ - class GlyphCache; - - struct GlyphLayoutElem - { - strings::UniChar m_sym; - ang::AngleD m_angle; - m2::PointD m_pt; - - void transform(math::Matrix const & m); - }; - - class GlyphLayout - { - protected: - size_t m_firstVisible; - size_t m_lastVisible; - - graphics::FontDesc m_fontDesc; - - buffer_vector m_metrics; - buffer_vector m_entries; - buffer_vector m_boundRects; - - m2::PointD m_pivot; - m2::PointD m_offset; - - double m_textLength; - - void computeBoundRects(); - - void addGlyph(GlyphCache * glyphCache, - GlyphKey const & key, - bool isFirst, - strings::UniChar symbol, - m2::RectD & boundRect, - m2::PointD & curPt); - - void initStraigthText(GlyphCache * glyphCache, - FontDesc const & font, - m2::PointD const & pt, - strings::UniString const & visText, - graphics::EPosition pos, - unsigned maxWidth); - - protected: - GlyphLayout(FontDesc const & font); - - public: - GlyphLayout() {} - - GlyphLayout(GlyphCache * glyphCache, - FontDesc const & font, - m2::PointD const & pt, - strings::UniString const & visText, - graphics::EPosition pos, - unsigned maxWidth = numeric_limits::max()); - - size_t firstVisible() const; - size_t lastVisible() const; - - buffer_vector const & entries() const { return m_entries; } - buffer_vector const & boundRects() const { return m_boundRects; } - - /// @note! Used only in StraightTextElement. - m2::RectD GetLastGlobalRect() const { return m_boundRects.back().GetGlobalRect(); } - - graphics::FontDesc const & fontDesc() const; - - m2::PointD const & pivot() const; - void setPivot(m2::PointD const & pv); - - m2::PointD const & offset() const; - void setOffset(m2::PointD const & offs); - - int baseLineOffset(); - }; - - class GlyphLayoutPath : public GlyphLayout - { - TextPath m_path; - strings::UniString m_visText; - - double m_textOffset; - - void recalcAlongPath(); - - public: - GlyphLayoutPath() {} - - GlyphLayoutPath(GlyphLayoutPath const & layout, - math::Matrix const & m); - - GlyphLayoutPath(GlyphCache * glyphCache, - FontDesc const & font, - m2::PointD const * pts, - size_t ptsCount, - strings::UniString const & visText, - double fullLength, - double pathOffset, - double textOffset); - - bool IsFullVisible() const; - }; -} diff --git a/graphics/graphics.pro b/graphics/graphics.pro deleted file mode 100644 index 4ea50e30ea..0000000000 --- a/graphics/graphics.pro +++ /dev/null @@ -1,164 +0,0 @@ -# Graphics library. - -TARGET = graphics -TEMPLATE = lib -CONFIG += staticlib warn_on -DEFINES += GRAPHICS_LIBRARY - -ROOT_DIR = .. - -INCLUDEPATH += $$ROOT_DIR/3party/freetype/include $$ROOT_DIR/3party/agg - -include($$ROOT_DIR/common.pri) - -SOURCES += \ - opengl/framebuffer.cpp \ - opengl/opengl.cpp \ - opengl/buffer_object.cpp \ - opengl/renderbuffer.cpp \ - opengl/base_texture.cpp \ - opengl/managed_texture.cpp \ - opengl/renderer.cpp \ - opengl/vertex.cpp \ - opengl/route_vertex.cpp \ - opengl/clipper.cpp \ - opengl/geometry_renderer.cpp \ - opengl/shader.cpp \ - opengl/program.cpp \ - opengl/defines_conv.cpp \ - opengl/program_manager.cpp \ - opengl/gl_render_context.cpp \ - opengl/storage.cpp \ - blitter.cpp \ - resource_manager.cpp \ - pen.cpp \ - resource.cpp \ - color.cpp \ - skin_loader.cpp \ - resource_cache.cpp \ - glyph_cache.cpp \ - freetype.cpp \ - glyph_cache_impl.cpp \ - geometry_batcher.cpp \ - text_renderer.cpp \ - path_renderer.cpp \ - shape_renderer.cpp \ - circle.cpp \ - area_renderer.cpp \ - font_desc.cpp \ - glyph_layout.cpp \ - text_element.cpp \ - text_path.cpp \ - overlay.cpp \ - overlay_element.cpp \ - symbol_element.cpp \ - overlay_renderer.cpp \ - path_text_element.cpp \ - straight_text_element.cpp \ - glyph.cpp \ - circle_element.cpp \ - packets_queue.cpp \ - display_list.cpp \ - data_formats.cpp \ - image.cpp \ - image_renderer.cpp \ - display_list_renderer.cpp \ - vertex_decl.cpp \ - render_context.cpp \ - coordinates.cpp \ - render_target.cpp \ - defines.cpp \ - icon.cpp \ - brush.cpp \ - pipeline_manager.cpp \ - geometry_pipeline.cpp \ - path_view.cpp \ - circled_symbol.cpp \ - uniforms_holder.cpp - -HEADERS += \ - opengl/opengl.hpp \ - opengl/gl_procedures.inl \ - opengl/vertex.hpp \ - opengl/route_vertex.hpp \ - opengl/texture.hpp \ - opengl/framebuffer.hpp \ - opengl/buffer_object.hpp \ - opengl/renderbuffer.hpp \ - opengl/base_texture.hpp \ - opengl/managed_texture.hpp \ - opengl/gl_render_context.hpp \ - opengl/clipper.hpp \ - opengl/renderer.hpp \ - opengl/geometry_renderer.hpp \ - opengl/data_traits.hpp \ - opengl/storage.hpp \ - opengl/shader.hpp \ - opengl/program.hpp \ - opengl/defines_conv.hpp \ - opengl/program_manager.hpp \ - blitter.hpp \ - resource_manager.hpp \ - skin_loader.hpp \ - pen.hpp \ - resource.hpp \ - color.hpp \ - resource_cache.hpp \ - render_target.hpp \ - glyph_cache.hpp \ - data_formats.hpp \ - glyph_cache_impl.hpp \ - freetype.hpp \ - text_renderer.hpp \ - geometry_batcher.hpp \ - screen.hpp \ - defines.hpp \ - path_renderer.hpp \ - shape_renderer.hpp \ - circle.hpp \ - area_renderer.hpp \ - font_desc.hpp \ - glyph_layout.hpp \ - text_element.hpp \ - text_path.hpp \ - overlay.hpp \ - overlay_element.hpp \ - symbol_element.hpp \ - overlay_renderer.hpp \ - path_text_element.hpp \ - straight_text_element.hpp \ - agg_traits.hpp \ - circle_element.hpp \ - packets_queue.hpp \ - display_list.hpp \ - image_renderer.hpp \ - image.hpp \ - display_list_renderer.hpp \ - vertex_decl.hpp \ - render_context.hpp \ - coordinates.hpp \ - icon.hpp \ - glyph.hpp \ - brush.hpp \ - geometry_pipeline.hpp \ - pipeline_manager.hpp \ - vertex_stream.hpp \ - path_view.hpp \ - path.hpp \ - depth_constants.hpp \ - circled_symbol.hpp \ - uniforms_holder.hpp - -win32* { - SOURCES += opengl/opengl_win32.cpp -} else: android*|iphone*|tizen* { - HEADERS += - SOURCES += opengl/opengl_es2.cpp -} else { - HEADERS += - CONFIG(OMIM_OS_MAEMO) { - SOURCES += opengl/opengl_es2.cpp - } else { - SOURCES += opengl/opengl_ext.cpp - } -} diff --git a/graphics/graphics_tests/formats_loading_test.cpp b/graphics/graphics_tests/formats_loading_test.cpp deleted file mode 100644 index a60c855435..0000000000 --- a/graphics/graphics_tests/formats_loading_test.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include "base/SRC_FIRST.hpp" -#include "testing/testing.hpp" -#include "3party/lodepng/lodepng_io.hpp" -#include "platform/platform.hpp" - -#include -#include -#include "std/iostream.hpp" -#include "std/iomanip.hpp" - -#include "graphics/texture.hpp" - -namespace gil = boost::gil; -namespace mpl = boost::mpl; - -typedef yg::gl::RGBA4Texture::pixel_t pixel_t; -typedef yg::gl::RGBA4Texture::view_t view_t; -typedef yg::gl::RGBA4Texture::image_t image_t; -//typedef yg::gl::Texture::iterator_t iterator_t; -//typedef yg::gl::Texture::locator_t locator_t; - -UNIT_TEST(ABGR4_GIL_COPY) -{ - image_t image(4, 4); - view_t view = gil::view(image); - - gil::fill_pixels(view, pixel_t(0x0, 0x0, 0x0, 0x0)); - - for (size_t y = 0; y < 4; ++y) - { - for (size_t x = 0; x < 4; ++x) - { - unsigned short val = *((unsigned short *)&view(x, y)); - cout << hex << val << " "; - } - cout << endl; - } - - pixel_t cl(0xF, 0, 0xF, 0); - - view(1, 1) = cl; - view(1, 2) = cl; - view(2, 1) = cl; - view(2, 2) = cl; - - for (size_t y = 0; y < 4; ++y) - { - for (size_t x = 0; x < 4; ++x) - { - unsigned short val = *((unsigned short *)&view(x, y)); - - cout << hex << val << " "; - } - cout << endl; - } -} - -UNIT_TEST(FormatABGR4_Layout) -{ - pixel_t px[2] = {pixel_t(0xF, 0xE, 0xD, 0xC), pixel_t(0xF, 0xE, 0xD, 0xC)}; - - uint32_t raw = *(uint32_t *)(px); - - cout << "packed 2 pixels " << hex << raw << std::endl; - - TEST_EQUAL(raw, 0xCDEFCDEF, ()); -} - -UNIT_TEST(FormatRGBA4444_Layout) -{ - pixel_t px(15, 14, 13, 12); - uint16_t * pxp = (uint16_t*)&px; - uint16_t val = *pxp; - - cout << "shifting 1 << 4 = " << (1 << 4) << endl; - cout << "shifting 1 >> 4 = " << (1 >> 4) << endl; - - cout << "value : " << hex << val - << ", sh1 : " << hex << ((val) & 0xF) - << ", sh2 : " << hex << ((val >> 4) & 0xF) - << ", sh3 : " << hex << ((val >> 8) & 0xF) - << ", sh4 : " << hex << ((val >> 12) & 0xF) << endl; - - TEST_EQUAL(gil::get_color(px, gil::alpha_t()), 15, ()); - TEST_EQUAL(gil::get_color(px, gil::blue_t()), 14, ()); - TEST_EQUAL(gil::get_color(px, gil::green_t()), 13, ()); - TEST_EQUAL(gil::get_color(px, gil::red_t()), 12, ()); -} - -UNIT_TEST(FormatRGBA4444_SaveLoad) -{ - image_t image; - -// gil::lodepng_read_image((GetPlatform().ResourcesDir() + "basic.png").c_str(), image); -} diff --git a/graphics/graphics_tests/graphics_tests.pro b/graphics/graphics_tests/graphics_tests.pro deleted file mode 100644 index 38f8eddeed..0000000000 --- a/graphics/graphics_tests/graphics_tests.pro +++ /dev/null @@ -1,19 +0,0 @@ -TARGET = graphics_tests -CONFIG += console warn_on -CONFIG -= app_bundle -TEMPLATE = app - -ROOT_DIR = ../.. -DEPENDENCIES = qt_tstfrm map graphics indexer platform geometry coding base \ - expat freetype fribidi protobuf tomcrypt - -include($$ROOT_DIR/common.pri) - -QT *= opengl gui core - -win32*: LIBS *= -lopengl32 - -SOURCES += \ - ../../testing/testingmain.cpp \ - screenglglobal_test.cpp \ - shape_renderer_test.cpp \ diff --git a/graphics/graphics_tests/screenglglobal_test.cpp b/graphics/graphics_tests/screenglglobal_test.cpp deleted file mode 100644 index 2d9527171a..0000000000 --- a/graphics/graphics_tests/screenglglobal_test.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "base/SRC_FIRST.hpp" -#include "graphics/screen.hpp" -#include "graphics/pen.hpp" -#include "geometry/screenbase.hpp" -#include "geometry/point2d.hpp" -#include "std/vector.hpp" -#include "qt_tstfrm/macros.hpp" - -namespace -{ - struct TestBase - { - ScreenBase m_screenBase; - - void Init() - { - m_screenBase.SetFromRect(m2::AnyRectD(m2::RectD(-20, -10, 20, 10))); - m_screenBase.Rotate(math::pi / 6); - } - - void toPixel(std::vector & v) - { - for (size_t i = 0; i < v.size(); ++i) - v[i] = m_screenBase.GtoP(v[i]); - } - }; - - struct TestDrawPath : public TestBase - { - void Init() - { - TestBase::Init(); - } - - void DoDraw(shared_ptr p) - { - std::vector pts; - - pts.push_back(m2::PointD(0, 0)); - pts.push_back(m2::PointD(5, 2)); - pts.push_back(m2::PointD(10, 0)); - pts.push_back(m2::PointD(15, -5)); - pts.push_back(m2::PointD(19, 0)); - - toPixel(pts); - - p->drawPath(&pts[0], - pts.size(), - 0, - p->mapInfo(graphics::Pen::Info(graphics::Color(255, 0, 0, 255), 2, 0, 0, 0)), - 0); - } - }; - -// UNIT_TEST_GL(TestDrawPath); -} - diff --git a/graphics/graphics_tests/shape_renderer_test.cpp b/graphics/graphics_tests/shape_renderer_test.cpp deleted file mode 100644 index f9ac42be80..0000000000 --- a/graphics/graphics_tests/shape_renderer_test.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "testing/testing.hpp" -#include "graphics/shape_renderer.hpp" -#include "base/math.hpp" - -using namespace graphics; - -namespace -{ - void TestPoints(m2::PointD const & center, float r, vector const & points) - { - for (size_t i = 0; i < points.size(); ++i) - { - TEST_LESS(fabs(center.Length(points[i]) - r), 0.0001, (points[i])); - } - } -} - -UNIT_TEST(ApproximateArc_Smoke) -{ - m2::PointD const center(1, 2); - float r = 10; - vector points; - ShapeRenderer::approximateArc(center, 0, math::pi / 4, r, points); - TestPoints(center, r, points); -} - -UNIT_TEST(ApproximateArc_Crash) -{ - // this test gives only two result points on the device, - // and the second one is NAN inside ShapeRenderer::fillSector() - m2::PointD const center(511.7547811565455, 511.84095156751573); - double const startA = -1.5707963267948966; - double const endA = -1.6057029118347832; - double const r = 127.99998027132824; - vector points; - ShapeRenderer::approximateArc(center, startA, endA, r, points); - TestPoints(center, r, points); -} - -//UNIT_TEST(ApproximateArc_TooManyPoints) -//{ -// m2::PointD const center(10, 10); -// double const startA = 10; -// double const endA = 0.1; -// double const r = 10; -//} diff --git a/graphics/icon.cpp b/graphics/icon.cpp deleted file mode 100644 index ac958a4287..0000000000 --- a/graphics/icon.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "graphics/icon.hpp" - -namespace graphics -{ - Icon::Info::Info() - : Resource::Info(Resource::EIcon) - {} - - Icon::Info::Info(string const & name) - : Resource::Info(Resource::EIcon), - m_name(name) - {} - - Resource::Info const & Icon::Info::cacheKey() const - { - return *this; - } - - m2::PointU const Icon::Info::resourceSize() const - { - return m2::PointU(0, 0); - } - - Resource * Icon::Info::createResource(m2::RectU const & texRect, - uint8_t pipelineID) const - { - return 0; - } - - bool Icon::Info::lessThan(Resource::Info const * i) const - { - if (m_category != i->m_category) - return m_category < i->m_category; - - Icon::Info const * ii = static_cast(i); - - if (m_name != ii->m_name) - return m_name < ii->m_name; - - return false; - } - - - Icon::Icon(m2::RectU const & texRect, - int pipelineID, - Info const & info) - : Resource(EIcon, - texRect, - pipelineID), - m_info(info) - {} - - void Icon::render(void *) - {} - - Resource::Info const * Icon::info() const - { - return &m_info; - } -} diff --git a/graphics/icon.hpp b/graphics/icon.hpp deleted file mode 100644 index 364ec5326d..0000000000 --- a/graphics/icon.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "std/string.hpp" - -#include "graphics/resource.hpp" - -namespace graphics -{ - struct Icon : public Resource - { - struct Info : public Resource::Info - { - string m_name; - - Info(); - Info(string const & name); - - Resource::Info const & cacheKey() const; - m2::PointU const resourceSize() const; - Resource * createResource(m2::RectU const & texRect, - uint8_t pipelineID) const; - bool lessThan(Resource::Info const * r) const; - }; - - Info m_info; - - Icon(m2::RectU const & texRect, - int pipelineID, - Info const & info); - - void render(void * dst); - Resource::Info const * info() const; - }; -} diff --git a/graphics/image.cpp b/graphics/image.cpp deleted file mode 100644 index c64fd9006b..0000000000 --- a/graphics/image.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include "graphics/image.hpp" - -#include "graphics/opengl/data_traits.hpp" - -#include "indexer/map_style_reader.hpp" - -#include "3party/lodepng/lodepng_io.hpp" - -namespace gil = boost::gil; - -namespace graphics -{ - m2::PointU const GetDimensions(string const & resName, EDensity density) - { - ReaderPtr reader = GetStyleReader().GetResourceReader(resName, convert(density)); - gil::point2 size = gil::lodepng_read_dimensions(reader); - return m2::PointU(size.x, size.y); - } - - Image::Info::Info() - : Resource::Info(Resource::EImage), - m_size(0, 0) - {} - - Image::Info::Info(char const * name, EDensity density) - : Resource::Info(Resource::EImage), - m_resourceName(name), - m_size(0, 0) - { - try - { - m_size = GetDimensions(name, density); - m_data.resize(m_size.x * m_size.y * sizeof(DATA_TRAITS::pixel_t)); - - DATA_TRAITS::view_t v = gil::interleaved_view( - m_size.x, m_size.y, - (DATA_TRAITS::pixel_t*)&m_data[0], - m_size.x * sizeof(DATA_TRAITS::pixel_t)); - - ReaderPtr reader = GetStyleReader().GetResourceReader(name, convert(density)); - - gil::lodepng_read_and_convert_view(reader, v, DATA_TRAITS::color_converter()); - } - catch (RootException const &) - { - } - } - - unsigned Image::Info::width() const - { - return m_size.x; - } - - unsigned Image::Info::height() const - { - return m_size.y; - } - - unsigned char const * Image::Info::data() const - { - return &m_data[0]; - } - - bool Image::Info::lessThan(Resource::Info const * r) const - { - if (m_category != r->m_category) - return m_category < r->m_category; - - Image::Info const * ri = static_cast(r); - - if (m_resourceName != ri->m_resourceName) - return m_resourceName < ri->m_resourceName; - - return false; - } - - Resource::Info const & Image::Info::cacheKey() const - { - return *this; - } - - m2::PointU const Image::Info::resourceSize() const - { - return m2::PointU(m_size.x + 4, m_size.y + 4); - } - - Resource * Image::Info::createResource(m2::RectU const & texRect, - uint8_t pipelineID) const - { - return new Image(texRect, - pipelineID, - *this); - } - - Image::Image(m2::RectU const & texRect, - int pipelineID, - Info const & info) - : Resource(EImage, texRect, pipelineID), - m_info(info) - { - } - - void Image::render(void * dst) - { - DATA_TRAITS::view_t dstView = gil::interleaved_view( - m_info.m_size.x + 4, m_info.m_size.y + 4, - (DATA_TRAITS::pixel_t*)dst, - (m_info.m_size.x + 4) * sizeof(DATA_TRAITS::pixel_t)); - - if ((m_info.m_size.x != 0) && (m_info.m_size.y != 0)) - { - DATA_TRAITS::view_t srcView = gil::interleaved_view( - m_info.m_size.x, m_info.m_size.y, - (DATA_TRAITS::pixel_t*)&m_info.m_data[0], - m_info.m_size.x * sizeof(DATA_TRAITS::pixel_t)); - - gil::copy_pixels( - srcView, - gil::subimage_view(dstView, 2, 2, m_info.m_size.x, m_info.m_size.y)); - } - - DATA_TRAITS::pixel_t pxBorder = DATA_TRAITS::createPixel(Color(0, 0, 0, 0)); - - for (unsigned y = 0; y < 2; ++y) - for (unsigned x = 0; x < m_info.m_size.x + 4; ++x) - dstView(x, y) = pxBorder; - - for (unsigned y = 2; y < m_info.m_size.y + 2; ++y) - { - for (unsigned x = 0; x < 2; ++x) - dstView(x, y) = pxBorder; - for (unsigned x = m_info.m_size.x + 2; x < m_info.m_size.x + 4; ++x) - dstView(x, y) = pxBorder; - } - - for (unsigned y = m_info.m_size.y + 2; y < m_info.m_size.y + 4; ++y) - for (unsigned x = 0; x < m_info.m_size.x + 4; ++x) - dstView(x, y) = pxBorder; - } - - Resource::Info const * Image::info() const - { - return &m_info; - } -} diff --git a/graphics/image.hpp b/graphics/image.hpp deleted file mode 100644 index dbf82fd5da..0000000000 --- a/graphics/image.hpp +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include "graphics/defines.hpp" -#include "graphics/resource.hpp" - -#include "std/string.hpp" - -#include "geometry/point2d.hpp" - -namespace graphics -{ - /// get dimensions of PNG image specified by it's resName. - m2::PointU const GetDimensions(string const & resName, EDensity density); - - struct Image : public Resource - { - struct Info : public Resource::Info - { - string m_resourceName; - m2::PointU m_size; - vector m_data; - - Info(); - Info(char const * resName, EDensity density); - - unsigned width() const; - unsigned height() const; - unsigned char const * data() const; - - Resource::Info const & cacheKey() const; - m2::PointU const resourceSize() const; - Resource * createResource(m2::RectU const & texRect, - uint8_t pipelineID) const; - bool lessThan(Resource::Info const * r) const; - }; - - Info m_info; - - Image(m2::RectU const & texRect, - int pipelineID, - Info const & info); - - void render(void * dst); - Resource::Info const * info() const; - }; -} diff --git a/graphics/image_renderer.cpp b/graphics/image_renderer.cpp deleted file mode 100644 index eecd6cb8c8..0000000000 --- a/graphics/image_renderer.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "graphics/image_renderer.hpp" -#include "graphics/resource.hpp" - -#include "graphics/opengl/base_texture.hpp" - -#include "base/assert.hpp" -#include "base/macros.hpp" - -namespace graphics -{ - ImageRenderer::ImageRenderer(base_t::Params const & p) - : base_t(p) - {} - - void ImageRenderer::drawImage(math::Matrix const & m, - uint32_t resID, - double depth) - { - Resource const * res(base_t::fromID(resID)); - - if (res == 0) - { - LOG(LDEBUG, ("drawImage: resID=", resID, "wasn't found on current skin")); - return; - } - - ASSERT(res->m_cat == Resource::EImage, ()); - - m2::RectI texRect(res->m_texRect); - texRect.Inflate(-2, -2); - - m2::PointF pts[6] = - { - m2::PointF(m2::PointD(0, 0) * m), - m2::PointF(m2::PointD(texRect.SizeX(), 0) * m), - m2::PointF(m2::PointD(texRect.SizeX(), texRect.SizeY()) * m), - m2::PointF(m2::PointD(texRect.SizeX(), texRect.SizeY()) * m), - m2::PointF(m2::PointD(0, texRect.SizeY()) * m), - m2::PointF(m2::PointD(0, 0) * m) - }; - - GeometryPipeline & p = pipeline(res->m_pipelineID); - - shared_ptr const & texture = p.texture(); - - m2::PointF texPts[6] = - { - m2::PointF(texRect.minX(), texRect.minY()), - m2::PointF(texRect.maxX(), texRect.minY()), - m2::PointF(texRect.maxX(), texRect.maxY()), - m2::PointF(texRect.maxX(), texRect.maxY()), - m2::PointF(texRect.minX(), texRect.maxY()), - m2::PointF(texRect.minX(), texRect.minY()) - }; - - for (unsigned i = 0; i < ARRAY_SIZE(texPts); ++i) - texture->mapPixel(texPts[i].x, texPts[i].y); - - m2::PointF normal(0, 0); - - addTexturedListStrided(pts, sizeof(m2::PointF), - &normal, 0, - texPts, sizeof(m2::PointF), - 6, - depth, - res->m_pipelineID); - } -} diff --git a/graphics/image_renderer.hpp b/graphics/image_renderer.hpp deleted file mode 100644 index 6baeccdfa8..0000000000 --- a/graphics/image_renderer.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "graphics/shape_renderer.hpp" -#include "graphics/defines.hpp" - -namespace graphics -{ - class ImageRenderer : public ShapeRenderer - { - private: - public: - - typedef ShapeRenderer base_t; - - ImageRenderer(base_t::Params const & p); - - void drawImage(math::Matrix const & m, - uint32_t resID, - double depth); - }; -} diff --git a/graphics/opengl/base_texture.cpp b/graphics/opengl/base_texture.cpp deleted file mode 100644 index 8e35556993..0000000000 --- a/graphics/opengl/base_texture.cpp +++ /dev/null @@ -1,118 +0,0 @@ -#include "base/SRC_FIRST.hpp" - -#include "base/logging.hpp" -#include "std/bind.hpp" - -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/base_texture.hpp" -#include "graphics/opengl/utils.hpp" - -namespace graphics -{ - namespace gl - { - void BaseTexture::init() const - { - OGLCHECK(glGenTextures(1, &m_id)); - - OGLCHECK(glBindTexture(GL_TEXTURE_2D, m_id)); - - OGLCHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)); - OGLCHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)); - OGLCHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - OGLCHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - } - - BaseTexture::BaseTexture(m2::PointU const & size) - : m_id(0), m_width(size.x), m_height(size.y) - { - init(); - } - - BaseTexture::BaseTexture(unsigned width, unsigned height) - : m_id(0), m_width(width), m_height(height) - { - init(); - } - - BaseTexture::~BaseTexture() - { - if (g_hasContext) - OGLCHECK(glDeleteTextures(1, &m_id)); - } - - unsigned BaseTexture::width() const - { - return m_width; - } - - unsigned BaseTexture::height() const - { - return m_height; - } - - void BaseTexture::attachToFrameBuffer() - { - OGLCHECK(glFramebufferTexture2DFn(GL_FRAMEBUFFER_MWM, - GL_COLOR_ATTACHMENT0_MWM, - GL_TEXTURE_2D, - id(), - 0)); - } - - void BaseTexture::detachFromFrameBuffer() - { - OGLCHECK(glFramebufferTexture2DFn(GL_FRAMEBUFFER_MWM, - GL_COLOR_ATTACHMENT0_MWM, - GL_TEXTURE_2D, - 0, - 0)); - } - - unsigned BaseTexture::current() - { - int id = 0; - OGLCHECK(glGetIntegerv(GL_TEXTURE_BINDING_2D, &id)); - return id; - } - - void BaseTexture::makeCurrent(graphics::PacketsQueue * queue) const - { - if (queue) - { - queue->processFn([this](){ makeCurrent(0); }); - return; - } - - OGLCHECK(glBindTexture(GL_TEXTURE_2D, m_id)); - } - - unsigned BaseTexture::id() const - { - return m_id; - } - - m2::PointF const BaseTexture::mapPixel(m2::PointF const & p) const - { - return m2::PointF(p.x / (float) width(), - p.y / (float) height()); - } - - void BaseTexture::mapPixel(float & x, float & y) const - { - x = x / width(); - y = y / height(); - } - - m2::RectF const BaseTexture::mapRect(m2::RectF const & r) const - { - m2::PointF pt1(r.minX(), r.minY()); - m2::PointF pt2(r.maxX(), r.maxY()); - - pt1 = mapPixel(pt1); - pt2 = mapPixel(pt2); - - return m2::RectF(pt1.x, pt1.y, pt2.x, pt2.y); - } - } -} diff --git a/graphics/opengl/base_texture.hpp b/graphics/opengl/base_texture.hpp deleted file mode 100644 index e89a09afe0..0000000000 --- a/graphics/opengl/base_texture.hpp +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include "geometry/rect2d.hpp" -#include "geometry/point2d.hpp" - -#include "graphics/render_target.hpp" -#include "graphics/packets_queue.hpp" - -namespace graphics -{ - struct Color; - class PacketsQueue; - - namespace gl - { - class BaseTexture : public RenderTarget - { - private: - - /// OpenGL texture ID - mutable unsigned m_id; - /// texture dimensions - /// @{ - unsigned m_width; - unsigned m_height; - /// @} - - void init() const; - - public: - - BaseTexture(m2::PointU const & size); - BaseTexture(unsigned width, unsigned height); - ~BaseTexture(); - - unsigned width() const; - unsigned height() const; - - unsigned id() const; - void makeCurrent(graphics::PacketsQueue * queue = 0) const; - void attachToFrameBuffer(); - void detachFromFrameBuffer(); - - m2::PointF const mapPixel(m2::PointF const & p) const; - m2::RectF const mapRect(m2::RectF const & r) const; - void mapPixel(float & x, float & y) const; - - virtual void fill(graphics::Color const & c) = 0; - virtual void dump(char const * fileName) = 0; - - static unsigned current(); - }; - } -} diff --git a/graphics/opengl/buffer_object.cpp b/graphics/opengl/buffer_object.cpp deleted file mode 100644 index 2789fb3cac..0000000000 --- a/graphics/opengl/buffer_object.cpp +++ /dev/null @@ -1,218 +0,0 @@ -#include "graphics/opengl/buffer_object.hpp" -#include "graphics/opengl/opengl.hpp" - -#include "base/assert.hpp" -#include "base/logging.hpp" -#include "base/macros.hpp" -#include "base/shared_buffer_manager.hpp" -#include "base/SRC_FIRST.hpp" - -#include "std/list.hpp" - - -namespace graphics -{ - namespace gl - { - void BufferObject::Binder::Reset(BufferObject & bufferObj) - { - ASSERT(!bufferObj.IsBound(), ()); - - m_bufferObj = &bufferObj; - m_bufferObj->Bind(); - } - - BufferObject::Binder::~Binder() - { - if (m_bufferObj != nullptr) - m_bufferObj->Unbind(); - } - - BufferObject::BufferObject(unsigned target) - : m_target(target), - m_size(0), - m_gpuData(0), - m_isLocked(false), - m_isUsingMapBuffer(false) - { - if (g_isBufferObjectsSupported) - OGLCHECK(glGenBuffersFn(1, &m_id)); - } - - BufferObject::BufferObject(size_t size, unsigned target) - : m_target(target), - m_size(0), - m_gpuData(0), - m_isLocked(false), - m_isUsingMapBuffer(false), - m_bound(false) - { - if (g_isBufferObjectsSupported) - OGLCHECK(glGenBuffersFn(1, &m_id)); - resize(size); - } - - void BufferObject::resize(size_t size) - { - ASSERT(!m_isLocked, ()); - - if (size != m_size) - { - discard(); - - m_size = size; - - /// When binder leaves the scope the buffer object will be unbound. - Binder binder; - makeCurrent(binder); - if (g_isBufferObjectsSupported) - { - OGLCHECK(glBufferDataFn(m_target, m_size, 0, GL_DYNAMIC_DRAW)); - /// In multithreaded resource usage scenarios the suggested way to see - /// resource update made in one thread to the another thread is - /// to call the glFlush in thread, which modifies resource and then rebind - /// resource in another threads that is using this resource, if any. - OGLCHECK(glFlushFn()); - } - } - } - - size_t BufferObject::size() const - { - return m_size; - } - - BufferObject::~BufferObject() - { - if (g_isBufferObjectsSupported && (g_hasContext)) - OGLCHECK(glDeleteBuffersFn(1, &m_id)); - } - - bool BufferObject::isLocked() const - { - return m_isLocked; - } - - void * BufferObject::data() - { - ASSERT(m_isLocked, ("BufferObject is not locked")); - return m_gpuData; - } - - void * BufferObject::lock() - { - ASSERT(!m_isLocked, ()); - m_isLocked = true; - - if (g_isMapBufferSupported) - { - m_isUsingMapBuffer = true; - Bind(); - OGLCHECK(glBufferDataFn(m_target, m_size, 0, GL_DYNAMIC_DRAW)); - if (graphics::gl::g_hasContext) - m_gpuData = glMapBufferFn(m_target, GL_WRITE_ONLY_MWM); - else - { - m_gpuData = 0; - LOG(LDEBUG, ("no OGL context. skipping OGL call")); - } - OGLCHECKAFTER; - - if (m_gpuData != 0) - return m_gpuData; - } - - m_isUsingMapBuffer = false; - m_sharedBuffer = SharedBufferManager::instance().reserveSharedBuffer(m_size); - - m_gpuData = &m_sharedBuffer->at(0); - return m_gpuData; - } - - void BufferObject::unlock() - { - ASSERT(m_isLocked, ()); - m_isLocked = false; - - if (g_isBufferObjectsSupported) - { - ASSERT(m_gpuData != 0, ("BufferObject is not locked")); - - Bind(); - - if (g_isMapBufferSupported && m_isUsingMapBuffer) - { - if (graphics::gl::g_hasContext) - { - if (glUnmapBufferFn(m_target) == GL_FALSE) - LOG(LDEBUG/*LWARNING*/, ("glUnmapBuffer returned GL_FALSE!")); - OGLCHECKAFTER; - } - else - LOG(LDEBUG, ("no OGL context. skipping OGL call.")); - } - else - { - m_isUsingMapBuffer = false; - OGLCHECK(glBufferDataFn(m_target, m_size, m_gpuData, GL_DYNAMIC_DRAW)); - SharedBufferManager::instance().freeSharedBuffer(m_size, m_sharedBuffer); - m_sharedBuffer.reset(); - } - - m_gpuData = 0; - } - Unbind(); - } - - void BufferObject::discard() - { - if (!g_isBufferObjectsSupported) - { - if (m_sharedBuffer) - { - SharedBufferManager::instance().freeSharedBuffer(m_size, m_sharedBuffer); - m_sharedBuffer.reset(); - m_gpuData = 0; - } - } - } - - void * BufferObject::glPtr() - { - if (!g_isBufferObjectsSupported) - return m_gpuData; - else - return 0; - } - - void BufferObject::makeCurrent(Binder & binder) - { -/*#ifndef OMIM_OS_ANDROID - if (m_id != current()) -#endif*/ - binder.Reset(*this); - } - - void BufferObject::Bind() - { - if (!g_isBufferObjectsSupported || m_bound) - return; - - OGLCHECK(glBindBufferFn(m_target, m_id)); - m_bound = true; - } - - void BufferObject::Unbind() - { - if (!m_bound) - return; - - m_bound = false; -#ifdef OMIM_OS_IPHONE - OGLCHECK(glBindBufferFn(m_target, 0)); -#else - UNUSED_VALUE(m_target); -#endif - } - } -} diff --git a/graphics/opengl/buffer_object.hpp b/graphics/opengl/buffer_object.hpp deleted file mode 100644 index a85c7e661e..0000000000 --- a/graphics/opengl/buffer_object.hpp +++ /dev/null @@ -1,74 +0,0 @@ -#pragma once - -#include "base/macros.hpp" - -#include "std/vector.hpp" -#include "std/shared_ptr.hpp" - -namespace graphics -{ - namespace gl - { - class BufferObject - { - private: - - unsigned const m_target; - unsigned int m_id; - unsigned int m_size; - void * m_gpuData; - bool m_isLocked; - bool m_isUsingMapBuffer; - shared_ptr > m_sharedBuffer; - bool m_bound; - - public: - class Binder; - /// Binds the buffer object to the current thread. - /// The buffer object will be unbound from the current thread on calling the destructor of Binder in case of iOS. - void makeCurrent(Binder & binder); - - /// This class is wrapper for binding and unbinding gl buffers. - class Binder - { - friend void BufferObject::makeCurrent(Binder & binder); - BufferObject * m_bufferObj; - - void Reset(BufferObject & bufferObj); - - public: - Binder() : m_bufferObj(nullptr) {} - ~Binder(); - DISALLOW_COPY_AND_MOVE(Binder); - }; - - BufferObject(unsigned target); - BufferObject(size_t size, unsigned target); - ~BufferObject(); - - void resize(size_t size); - size_t size() const; - - /// Multithreading notes for Bind and Unbind methods: - /// 1. Method Unbind should be called from the same thread on which method Bind was called. - /// 2. After Unbind() call the current instance can be used by other threads. - /// Binds the buffer object to the current thread. - void Bind(); - /// Unbinds the buffer object from the current thread only for iOS. - void Unbind(); - bool IsBound() const { return m_bound; } - - /// This method locks the instance of a buffer object and returns a pointer to a GPU buffer. - /// Notes. The buffer object will be bound to the current thread. - /// It shall not be unbound until unlock is called. - void * lock(); - /// Informs gl that the instance of a buffer object is released and unbind it. - void unlock(); - void discard(); - - void * glPtr(); - void * data(); - bool isLocked() const; - }; - } -} diff --git a/graphics/opengl/clipper.cpp b/graphics/opengl/clipper.cpp deleted file mode 100644 index 3b80550559..0000000000 --- a/graphics/opengl/clipper.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "std/bind.hpp" -#include "base/logging.hpp" - -#include "graphics/opengl/clipper.hpp" -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - Clipper::Clipper(base_t::Params const & params) - : base_t(params), - m_isClippingEnabled(false) - {} - - void Clipper::beginFrame() - { - base_t::beginFrame(); - - enableClipRect(m_isClippingEnabled); - setClipRect(m_clipRect); - } - - void Clipper::endFrame() - { - /// clipper code goes here - base_t::endFrame(); - } - - Clipper::EnableClipRect::EnableClipRect(bool flag) - : m_flag(flag) - {} - - void Clipper::EnableClipRect::perform() - { - if (m_flag) - OGLCHECK(glEnable(GL_SCISSOR_TEST)); - else - OGLCHECK(glDisable(GL_SCISSOR_TEST)); - } - - void Clipper::enableClipRect(bool flag) - { - m_isClippingEnabled = flag; - - processCommand(make_shared(flag)); - } - - bool Clipper::clipRectEnabled() const - { - return m_isClippingEnabled; - } - - Clipper::SetClipRect::SetClipRect(m2::RectI const & rect) - : m_rect(rect) - {} - - void Clipper::SetClipRect::perform() - { - OGLCHECK(glScissor(m_rect.minX(), m_rect.minY(), m_rect.SizeX(), m_rect.SizeY())); - } - - void Clipper::setClipRect(m2::RectI const & rect) - { - m_clipRect = rect; - if (!m_clipRect.Intersect(m2::RectI(0, 0, width(), height()))) - m_clipRect = m2::RectI(0, 0, 0, 0); - - ASSERT ( m_clipRect.IsValid(), (m_clipRect) ); - - processCommand(make_shared(m_clipRect)); - } - - m2::RectI const & Clipper::clipRect() const - { - return m_clipRect; - } - } -} diff --git a/graphics/opengl/clipper.hpp b/graphics/opengl/clipper.hpp deleted file mode 100644 index 6535fe6b2b..0000000000 --- a/graphics/opengl/clipper.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "geometry/rect2d.hpp" -#include "graphics/opengl/renderer.hpp" - -namespace graphics -{ - namespace gl - { - class Clipper : public Renderer - { - private: - - typedef Renderer base_t; - - bool m_isClippingEnabled; - m2::RectI m_clipRect; - - void enableClipRectImpl(bool flag); - void setClipRectImpl(m2::RectI const & rect); - - struct EnableClipRect : public Command - { - bool m_flag; - EnableClipRect(bool flag); - void perform(); - }; - - struct SetClipRect : public Command - { - m2::RectI m_rect; - SetClipRect(m2::RectI const & rect); - void perform(); - }; - - public: - - Clipper(base_t::Params const & params); - - void beginFrame(); - void endFrame(); - - /// Working with clip rect - /// @{ - /// enabling/disabling and querying clipping state - void enableClipRect(bool flag); - bool clipRectEnabled() const; - - /// Setting and querying clipRect - void setClipRect(m2::RectI const & rect); - m2::RectI const & clipRect() const; - /// @} - - }; - } -} diff --git a/graphics/opengl/data_traits.hpp b/graphics/opengl/data_traits.hpp deleted file mode 100644 index bc3dcb3d53..0000000000 --- a/graphics/opengl/data_traits.hpp +++ /dev/null @@ -1,140 +0,0 @@ -#pragma once - -#include "graphics/opengl/opengl.hpp" -#include "graphics/color.hpp" -#include -#include - -namespace gil = boost::gil; -namespace mpl = boost::mpl; - -namespace graphics -{ - template - struct DownsampleImpl - { - template - void operator()(Ch1 const & ch1, Ch2 & ch2) const - { - ch2 = ch1 / Denom; - } - }; - - template - struct Downsample - { - static const int Denom = 1 << (FromBig - ToSmall); - - template - void operator()(SrcP const & src, DstP & dst) const - { - static_for_each(src, dst, DownsampleImpl()); - } - }; - - struct RGBA8Traits - { - typedef gil::rgba8_pixel_t pixel_t; - typedef gil::rgba8c_pixel_t const_pixel_t; - typedef gil::rgba8_view_t view_t; - typedef gil::rgba8c_view_t const_view_t; - typedef gil::rgba8_image_t image_t; - - static const int maxChannelVal = 255; - static const int channelScaleFactor = 1; - - static const int gl_pixel_data_type = GL_UNSIGNED_BYTE; - static const int gl_pixel_format_type = GL_RGBA; - - typedef Downsample<8, 8> color_converter; - - static pixel_t const createPixel(graphics::Color const & c) - { - return pixel_t((unsigned char)(c.r / 255.0f) * maxChannelVal, - (unsigned char)(c.g / 255.0f) * maxChannelVal, - (unsigned char)(c.b / 255.0f) * maxChannelVal, - (unsigned char)(c.a / 255.0f) * maxChannelVal); - } - }; - - struct RGB565Traits - { - typedef gil::packed_pixel_type< - unsigned short, - mpl::vector3_c, - gil::bgr_layout_t - >::type pixel_t; - - typedef gil::memory_based_step_iterator iterator_t; - typedef gil::memory_based_2d_locator locator_t; - typedef gil::image_view view_t; - - typedef pixel_t const const_pixel_t; - - typedef gil::memory_based_step_iterator const_iterator_t; - typedef gil::memory_based_2d_locator const_locator_t; - typedef gil::image_view const_view_t; - - typedef gil::image image_t; - - static const int maxChannelVal = 32; - static const int channelScaleFactor = 8; - - static const int gl_pixel_data_type = GL_UNSIGNED_SHORT_5_6_5; - static const int gl_pixel_format_type = GL_RGB; - - typedef Downsample<8, 5> color_converter; - - static pixel_t const createPixel(graphics::Color const & c) - { - return pixel_t((int)(c.r / 255.0f) * maxChannelVal, - (int)(c.g / 255.0f) * maxChannelVal, //< fix this channel - (int)(c.b / 255.0f) * maxChannelVal); - } - }; - - struct RGBA4Traits - { - typedef gil::packed_pixel_type< - unsigned short, - mpl::vector4_c, - gil::abgr_layout_t - >::type pixel_t; - - typedef gil::memory_based_step_iterator iterator_t; - typedef gil::memory_based_2d_locator locator_t; - typedef gil::image_view view_t; - - typedef pixel_t const const_pixel_t; - - typedef gil::memory_based_step_iterator const_iterator_t; - typedef gil::memory_based_2d_locator const_locator_t; - typedef gil::image_view const_view_t; - - typedef gil::image image_t; - - static const int maxChannelVal = 15; - static const int channelScaleFactor = 16; - - static const int gl_pixel_data_type = GL_UNSIGNED_SHORT_4_4_4_4; - static const int gl_pixel_format_type = GL_RGBA; - - typedef Downsample<8, 4> color_converter; - - static pixel_t const createPixel(graphics::Color const & c) - { - return pixel_t((int)(c.r / 255.0f) * maxChannelVal, - (int)(c.g / 255.0f) * maxChannelVal, - (int)(c.b / 255.0f) * maxChannelVal, - (int)(c.a / 255.0f) * maxChannelVal); - } - }; -} - -#ifdef OMIM_GL_ES - #define DATA_TRAITS graphics::RGBA4Traits - #define RT_TRAITS graphics::RGBA4Traits -#else - #define DATA_TRAITS graphics::RGBA8Traits - #define RT_TRAITS graphics::RGBA8Traits -#endif diff --git a/graphics/opengl/defines_conv.cpp b/graphics/opengl/defines_conv.cpp deleted file mode 100644 index f13d139849..0000000000 --- a/graphics/opengl/defines_conv.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "graphics/opengl/defines_conv.hpp" -#include "base/macros.hpp" - -namespace graphics -{ - namespace gl - { - struct Info - { - int m_firstFull; - int m_firstBase; - char const * m_firstName; - int m_secondFull; - int m_secondBase; - int m_countBase; - char const * m_secondName; - }; - - Info s_dataTypes [] = - { - {GL_FLOAT, GL_FLOAT, "GL_FLOAT", EFloat, EFloat, 1, "EFloatVec1"}, - {GL_FLOAT_VEC2, GL_FLOAT, "GL_FLOAT_VEC2", EFloatVec2, EFloat, 2, "EFloatVec2"}, - {GL_FLOAT_VEC3, GL_FLOAT, "GL_FLOAT_VEC3", EFloatVec3, EFloat, 3, "EFloatVec3"}, - {GL_FLOAT_VEC4, GL_FLOAT, "GL_FLOAT_VEC4", EFloatVec4, EFloat, 4, "EFloatVec4"}, - {GL_INT, GL_INT, "GL_INT", EInteger, EInteger, 1, "EIntegerVec1"}, - {GL_INT_VEC2, GL_INT, "GL_INT_VEC2", EIntegerVec2, EInteger, 2, "EIntegerVec2"}, - {GL_INT_VEC3, GL_INT, "GL_INT_VEC3", EIntegerVec3, EInteger, 3, "EIntegerVec3"}, - {GL_INT_VEC4, GL_INT, "GL_INT_VEC4", EIntegerVec4, EInteger, 4, "EIntegerVec4"}, - {GL_FLOAT_MAT2, GL_FLOAT_MAT2, "GL_FLOAT_MAT2", EFloatMat2, EFloatMat2, 1, "EFloatMat2"}, - {GL_FLOAT_MAT3, GL_FLOAT_MAT3, "GL_FLOAT_MAT3", EFloatMat3, EFloatMat3, 1, "EFloatMat3"}, - {GL_FLOAT_MAT4, GL_FLOAT_MAT4, "GL_FLOAT_MAT4", EFloatMat4, EFloatMat4, 1, "EFloatMat4"}, - {GL_SAMPLER_2D, GL_SAMPLER_2D, "GL_SAMPLER_2D", ESampler2D, ESampler2D, 1, "ESampler2D"} - }; - - void convert(GLenum from, EDataType & to) - { - for (unsigned i = 0; i < ARRAY_SIZE(s_dataTypes); ++i) - if (s_dataTypes[i].m_firstFull == from) - { - to = (EDataType)s_dataTypes[i].m_secondFull; - return; - } - to = (EDataType)0; - LOG(LERROR, ("Unknown GLenum for EDataType specified")); - } - - void convert(EDataType from, GLenum & to) - { - for (unsigned i = 0; i < ARRAY_SIZE(s_dataTypes); ++i) - if (s_dataTypes[i].m_secondFull == from) - { - to = s_dataTypes[i].m_firstFull; - return; - } - - to = 0; - LOG(LERROR, ("Unknown EDataType specified")); - } - - void convert(GLenum from, EDataType & to, size_t & count) - { - for (unsigned i = 0; i < ARRAY_SIZE(s_dataTypes); ++i) - if (s_dataTypes[i].m_firstFull == from) - { - to = (EDataType)s_dataTypes[i].m_secondBase; - count = s_dataTypes[i].m_countBase; - return; - } - to = (EDataType)0; - count = 0; - LOG(LERROR, ("Unknown GLenum for EDataType specified")); - } - - void convert(EShaderType from, GLenum & to) - { - switch (from) - { - case EVertexShader: - to = GL_VERTEX_SHADER; - break; - case EFragmentShader: - to = GL_FRAGMENT_SHADER; - break; - default: - LOG(LERROR, ("Unknown EShaderType specified: ", from)); - to = 0; - } - } - - void convert(EPrimitives from, GLenum & to) - { - switch (from) - { - case ETriangles: - to = GL_TRIANGLES; - break; - case ETrianglesFan: - to = GL_TRIANGLE_FAN; - break; - case ETrianglesStrip: - to = GL_TRIANGLE_STRIP; - break; - default: - LOG(LERROR, ("Unknown EPrimitives specified: ", from)); - to = 0; - } - } - } -} diff --git a/graphics/opengl/defines_conv.hpp b/graphics/opengl/defines_conv.hpp deleted file mode 100644 index 4a1f2ee084..0000000000 --- a/graphics/opengl/defines_conv.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "graphics/defines.hpp" -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - void convert(EDataType from, GLenum & to); - void convert(GLenum from, EDataType & to); - - void convert(GLenum from, EDataType & to, size_t & cnt); - - void convert(EShaderType from, GLenum & to); - void convert(EPrimitives from, GLenum & to); - } -} diff --git a/graphics/opengl/framebuffer.cpp b/graphics/opengl/framebuffer.cpp deleted file mode 100644 index a6c704a6a5..0000000000 --- a/graphics/opengl/framebuffer.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "graphics/opengl/framebuffer.hpp" -#include "graphics/opengl/renderbuffer.hpp" -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/utils.hpp" - -#include "graphics/render_target.hpp" - -#include "base/logging.hpp" -#include "std/list.hpp" - - -namespace graphics -{ - namespace gl - { - FrameBuffer::FrameBuffer(bool defaultFB /*= false*/) : m_width(0), m_height(0) - { - if (defaultFB) - m_id = 0; - else - OGLCHECK(glGenFramebuffersFn(1, &m_id)); - } - - FrameBuffer::~FrameBuffer() - { - if ((m_id != 0) && g_hasContext) - OGLCHECK(glDeleteFramebuffersFn(1, &m_id)); - } - - void FrameBuffer::makeCurrent() - { - OGLCHECK(glBindFramebufferFn(GL_FRAMEBUFFER_MWM, m_id)); - - if (m_depthBuffer) - m_depthBuffer->attachToFrameBuffer(); - else - { - if (m_id != 0) - OGLCHECK(glFramebufferRenderbufferFn( - GL_FRAMEBUFFER_MWM, - GL_DEPTH_ATTACHMENT_MWM, - GL_RENDERBUFFER_MWM, - 0)); - } - - if (m_renderTarget) - m_renderTarget->attachToFrameBuffer(); - else - { - if (m_id != 0) - OGLCHECK(glFramebufferTexture2DFn( - GL_FRAMEBUFFER_MWM, - GL_COLOR_ATTACHMENT0_MWM, - GL_TEXTURE_2D, - 0, - 0)); - } - } - - void FrameBuffer::setRenderTarget(shared_ptr const & renderTarget) - { - m_renderTarget = renderTarget; - } - - shared_ptr const & FrameBuffer::renderTarget() const - { - return m_renderTarget; - } - - void FrameBuffer::resetRenderTarget() - { - m_renderTarget.reset(); - } - - void FrameBuffer::setDepthBuffer(shared_ptr const & depthBuffer) - { - m_depthBuffer = depthBuffer; - } - - shared_ptr const & FrameBuffer::depthBuffer() const - { - return m_depthBuffer; - } - - void FrameBuffer::resetDepthBuffer() - { - m_depthBuffer.reset(); - } - - int FrameBuffer::id() const - { - return m_id; - } - - unsigned FrameBuffer::width() const - { - return m_width; - } - - unsigned FrameBuffer::height() const - { - return m_height; - } - - void FrameBuffer::onSize(unsigned width, unsigned height) - { - m_width = width; - m_height = height; - } - - void FrameBuffer::checkStatus() - { - GLenum res = glCheckFramebufferStatusFn(GL_FRAMEBUFFER_MWM); - OGLCHECKAFTER; - if (res == GL_FRAMEBUFFER_UNSUPPORTED_MWM) - LOG(LDEBUG, ("unsupported combination of attached target formats. could be possibly skipped. id=", m_id)); - else if (res == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM) - LOG(LDEBUG, ("incomplete attachment. id=", m_id)); - else if (res == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM) - LOG(LDEBUG, ("incomplete missing attachment. id=", m_id)); - else if (res == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM) - { - LOG(LDEBUG, ("incomplete dimensions. id=", m_id)); - } - } - } -} diff --git a/graphics/opengl/framebuffer.hpp b/graphics/opengl/framebuffer.hpp deleted file mode 100644 index 50aca9c768..0000000000 --- a/graphics/opengl/framebuffer.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" - -namespace graphics -{ - class RenderTarget; - - namespace gl - { - class BaseTexture; - class RenderBuffer; - - class FrameBuffer - { - private: - - unsigned int m_id; - - shared_ptr m_renderTarget; - shared_ptr m_depthBuffer; - - unsigned m_width; - unsigned m_height; - - public: - - FrameBuffer(bool defaultFB = false); - ~FrameBuffer(); - - int id() const; - - void setRenderTarget(shared_ptr const & renderTarget); - shared_ptr const & renderTarget() const; - void resetRenderTarget(); - - void setDepthBuffer(shared_ptr const & depthBuffer); - shared_ptr const & depthBuffer() const; - void resetDepthBuffer(); - - void makeCurrent(); - - void onSize(unsigned width, unsigned height); - - unsigned width() const; - unsigned height() const; - - static unsigned current(); - - void checkStatus(); - }; - } -} diff --git a/graphics/opengl/geometry_renderer.cpp b/graphics/opengl/geometry_renderer.cpp deleted file mode 100644 index 9a9d1bbc09..0000000000 --- a/graphics/opengl/geometry_renderer.cpp +++ /dev/null @@ -1,591 +0,0 @@ -#include "graphics/opengl/geometry_renderer.hpp" -#include "graphics/resource.hpp" -#include "graphics/opengl/base_texture.hpp" -#include "graphics/opengl/texture.hpp" -#include "graphics/opengl/buffer_object.hpp" -#include "graphics/opengl/managed_texture.hpp" -#include "graphics/opengl/vertex.hpp" -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/gl_render_context.hpp" -#include "graphics/opengl/defines_conv.hpp" -#include "graphics/opengl/route_vertex.hpp" - -#include "base/logging.hpp" -#include "base/shared_buffer_manager.hpp" -#include "base/math.hpp" -#include "std/bind.hpp" - -namespace graphics -{ - namespace gl - { - typedef Texture TDynamicTexture; - - GeometryRenderer::GeometryRenderer(base_t::Params const & params) - : base_t(params) - {} - - GeometryRenderer::UploadData::UploadData(shared_ptr const * resources, - size_t count, - shared_ptr const & texture) - : m_texture(texture) - { - m_uploadQueue.reserve(count); - copy(resources, resources + count, back_inserter(m_uploadQueue)); - } - - GeometryRenderer::UploadData::UploadData() - {} - - void GeometryRenderer::UploadData::perform() - { - if (!m_texture) - { - LOG(LDEBUG, ("no texture on upload")); - return; - } - - if (m_uploadQueue.empty()) - return; - - size_t ranges[4]; - ranges[0] = 0; - ranges[1] = ranges[2] = ranges[3] = m_uploadQueue.size(); - m2::RectU maxRects[3]; - - size_t maxIndex = 1; - m2::RectU currentMaxRect = m_uploadQueue[0]->m_texRect; - - for (size_t i = 1; i < m_uploadQueue.size(); ++i) - { - shared_ptr const & resource = m_uploadQueue[i]; - if (resource->m_texRect.minY() >= currentMaxRect.maxY()) - { - ranges[maxIndex] = i; - if (resource->m_texRect.minX() < currentMaxRect.minX()) - { - maxRects[maxIndex - 1] = currentMaxRect; - maxIndex++; - } - else - maxRects[maxIndex - 1].Add(currentMaxRect); - - currentMaxRect = resource->m_texRect; - } - else - currentMaxRect.Add(resource->m_texRect); - } - - if (ranges[maxIndex] != m_uploadQueue.size()) - maxIndex++; - maxRects[maxIndex - 1] = currentMaxRect; - - static_cast(m_texture.get())->lock(); - - TDynamicTexture * dynTexture = static_cast(m_texture.get()); - - for (size_t rangesIt = 1; rangesIt < maxIndex + 1; ++rangesIt) - { - m2::RectU const & maxRect = maxRects[rangesIt - 1]; - TDynamicTexture::view_t v = dynTexture->view(maxRect.SizeX(), - maxRect.SizeY()); - for (size_t resourceIt = ranges[rangesIt - 1]; resourceIt < ranges[rangesIt]; ++resourceIt) - { - shared_ptr const & resource = m_uploadQueue[resourceIt]; - m2::RectU currentRect = resource->m_texRect; - currentRect.setMinY(currentRect.minY() - maxRect.minY()); - currentRect.setMaxY(currentRect.maxY() - maxRect.minY()); - currentRect.setMinX(currentRect.minX() - maxRect.minX()); - currentRect.setMaxX(currentRect.maxX() - maxRect.minX()); - - size_t renderBufferSize = my::NextPowOf2(currentRect.SizeX() * - currentRect.SizeY() * - sizeof(TDynamicTexture::pixel_t)); - SharedBufferManager::shared_buffer_ptr_t buffer = SharedBufferManager::instance().reserveSharedBuffer(renderBufferSize); - TDynamicTexture::view_t bufferView = gil::interleaved_view(currentRect.SizeX(), - currentRect.SizeY(), - (TDynamicTexture::pixel_t *)&((*buffer)[0]), - currentRect.SizeX() * sizeof(TDynamicTexture::pixel_t)); - - resource->render(&bufferView(0, 0)); - TDynamicTexture::view_t subImage = gil::subimage_view(v, currentRect.minX(), currentRect.minY(), - currentRect.SizeX(), currentRect.SizeY()); - gil::copy_pixels(bufferView, subImage); - SharedBufferManager::instance().freeSharedBuffer(renderBufferSize, buffer); - } - - dynTexture->upload(&v(0,0), maxRect); - } - - /// In multithreaded resource usage scenarios the suggested way to see - /// resource update made in one thread to the another thread is - /// to call the glFlush in thread, which modifies resource and then rebind - /// resource in another threads that is using this resource, if any. - OGLCHECK(glFlushFn()); - - static_cast(m_texture.get())->unlock(); - } - - void GeometryRenderer::UploadData::cancel() - { - perform(); - } - - void GeometryRenderer::UploadData::dump() - { - m2::RectU r(0, 0, 0, 0); - if (!m_uploadQueue.empty()) - r = m_uploadQueue[0]->m_texRect; - LOG(LDEBUG, ("UploadData: texture", m_texture->id(), ", count=", m_uploadQueue.size(), ", first=", r)); - } - - - void GeometryRenderer::uploadResources(shared_ptr const * resources, - size_t count, - shared_ptr const & texture) - { - processCommand(make_shared(resources, count, texture)); - } - - GeometryRenderer::DrawGeometry::DrawGeometry() - : m_alfa(1.0) - { - } - - bool GeometryRenderer::DrawGeometry::isNeedAdditionalUniforms() const - { - gl::RenderContext const * rc = static_cast(renderContext()); - - shared_ptr const & prg = rc->program(); - return prg->isParamExist(ETransparency); - } - - void GeometryRenderer::DrawGeometry::setAdditionalUniforms(const UniformsHolder & holder) - { - VERIFY(holder.getValue(ETransparency, m_alfa), ()); - } - - void GeometryRenderer::DrawGeometry::resetAdditionalUniforms() - { - m_alfa = 1.0; - } - - void GeometryRenderer::DrawGeometry::perform() - { - gl::RenderContext * rc = static_cast(renderContext()); - - shared_ptr const & prg = rc->program(); - - prg->setParam(ESemModelView, rc->matrix(EModelView)); - prg->setParam(ESemProjection, rc->matrix(EProjection)); - prg->setParam(ESemSampler0, 0); - - if (prg->isParamExist(ETransparency)) - prg->setParam(ETransparency, m_alfa); - - prg->setStorage(m_storage); - prg->setVertexDecl(Vertex::getVertexDecl()); - - /// When the binders leave the scope the buffer object will be unbound. - gl::BufferObject::Binder verticesBufBinder, indicesBufBinder; - prg->makeCurrent(verticesBufBinder, indicesBufBinder); - - if (m_texture) - m_texture->makeCurrent(); - else - LOG(LDEBUG, ("null texture used in DrawGeometry")); - - unsigned glPrimType; - convert(m_primitiveType, glPrimType); - - OGLCHECK(glDrawElements( - glPrimType, - m_indicesCount, - GL_UNSIGNED_SHORT, - ((unsigned char*)m_storage.m_indices->glPtr()) + m_indicesOffs)); - } - - void GeometryRenderer::DrawGeometry::dump() - { - LOG(LDEBUG, ("DrawGeometry, texture=", m_texture->id(), ", indicesCount=", m_indicesCount)); - } - - GeometryRenderer::DrawRouteGeometry::DrawRouteGeometry() - : m_indicesCount(0) - { - ResetUniforms(); - } - - bool GeometryRenderer::DrawRouteGeometry::isNeedAdditionalUniforms() const - { - return true; - } - - void GeometryRenderer::DrawRouteGeometry::setAdditionalUniforms(UniformsHolder const & holder) - { - holder.getValue(ERouteHalfWidth, m_halfWidth[0], m_halfWidth[1]); - holder.getValue(ERouteColor, m_color[0], m_color[1], m_color[2], m_color[3]); - holder.getValue(ERouteClipLength, m_clipLength); - holder.getValue(ERouteTextureRect, m_textureRect[0], m_textureRect[1], m_textureRect[2], m_textureRect[3]); - } - - void GeometryRenderer::DrawRouteGeometry::ResetUniforms() - { - m_halfWidth[0] = 0.0f; - m_halfWidth[1] = 0.0f; - - m_color[0] = 0.0f; - m_color[1] = 0.0f; - m_color[2] = 0.0f; - m_color[3] = 0.0f; - - m_clipLength = 0.0f; - - m_textureRect[0] = 0.0f; - m_textureRect[1] = 0.0f; - m_textureRect[2] = 0.0f; - m_textureRect[3] = 0.0f; - - m_arrowBorders = math::Zero(); - } - - void GeometryRenderer::DrawRouteGeometry::resetAdditionalUniforms() - { - ResetUniforms(); - } - - bool GeometryRenderer::DrawRouteGeometry::isNeedIndicesCount() const - { - return true; - } - - void GeometryRenderer::DrawRouteGeometry::setIndicesCount(size_t indicesCount) - { - m_indicesCount = indicesCount; - } - - void GeometryRenderer::DrawRouteGeometry::perform() - { - gl::RenderContext * rc = static_cast(renderContext()); - - shared_ptr const & prg = rc->program(); - - prg->setParam(ESemModelView, rc->matrix(EModelView)); - prg->setParam(ESemProjection, rc->matrix(EProjection)); - prg->setParam(ERouteHalfWidth, m_halfWidth[0], m_halfWidth[1]); - - if (prg->isParamExist(ESemSampler0)) - prg->setParam(ESemSampler0, 0); - - if (prg->isParamExist(ERouteColor)) - prg->setParam(ERouteColor, m_color[0], m_color[1], m_color[2], m_color[3]); - - if (prg->isParamExist(ERouteClipLength)) - prg->setParam(ERouteClipLength, m_clipLength); - - if (prg->isParamExist(ERouteTextureRect)) - prg->setParam(ERouteTextureRect, m_textureRect[0], m_textureRect[1], m_textureRect[2], m_textureRect[3]); - - prg->setStorage(m_storage); - prg->setVertexDecl(RouteVertex::getVertexDecl()); - - /// When the binders leave the scope the buffer object will be unbound. - gl::BufferObject::Binder verticesBufBinder, indicesBufBinder; - prg->makeCurrent(verticesBufBinder, indicesBufBinder); - - if (m_texture) - m_texture->makeCurrent(); - else - LOG(LDEBUG, ("null texture used in DrawGeometry")); - - OGLCHECK(glDrawElements( - GL_TRIANGLES, - m_indicesCount, - GL_UNSIGNED_SHORT, - (unsigned char*)m_storage.m_indices->glPtr())); - } - - void GeometryRenderer::DrawRouteGeometry::dump() - { - LOG(LDEBUG, ("DrawRouteGeometry, texture=", m_texture->id(), ", indicesCount=", m_indicesCount)); - } - - void GeometryRenderer::drawGeometry(shared_ptr const & texture, - Storage const & storage, - size_t indicesCount, - size_t indicesOffs, - EPrimitives primType) - { - shared_ptr command(new DrawGeometry()); - - command->m_texture = texture; - command->m_storage = storage; - command->m_indicesCount = indicesCount; - command->m_indicesOffs = indicesOffs; - command->m_primitiveType = primType; - - processCommand(command); - } - - void GeometryRenderer::drawRouteGeometry(shared_ptr const & texture, - Storage const & storage) - { - shared_ptr command(new DrawRouteGeometry()); - - command->m_texture = texture; - command->m_storage = storage; - - processCommand(command); - } - - void GeometryRenderer::clearRouteGeometry() - { - gl::RenderContext * rc = static_cast(renderContext()); - ProgramManager * pm = rc->programManager(); - - shared_ptr prg = pm->getProgram(EVxRoute, EFrgRoute); - prg->setStorage(gl::Storage()); - - prg = pm->getProgram(EVxRoute, EFrgRouteArrow); - prg->setStorage(gl::Storage()); - } - - void GeometryRenderer::FreeStorage::perform() - { - if (m_storagePool->IsCancelled()) - return; - - m_storagePool->Free(m_storage); - } - - void GeometryRenderer::FreeStorage::cancel() - { - perform(); - } - - void GeometryRenderer::freeStorage(Storage const & storage, TStoragePool * storagePool) - { - shared_ptr command(new FreeStorage()); - - command->m_storage = storage; - command->m_storagePool = storagePool; - - processCommand(command); - } - - void GeometryRenderer::FreeTexture::perform() - { - if (m_texturePool->IsCancelled()) - return; - - m_texturePool->Free(m_texture); - } - - void GeometryRenderer::FreeTexture::dump() - { - LOG(LDEBUG, ("FreeTexture, texture=", m_texture->id(), ", pool=", m_texturePool->ResName())); - } - - void GeometryRenderer::FreeTexture::cancel() - { - perform(); - } - - void GeometryRenderer::freeTexture(shared_ptr const & texture, TTexturePool * texturePool) - { - shared_ptr command(new FreeTexture()); - - command->m_texture = texture; - command->m_texturePool = texturePool; - - processCommand(command); - } - - void GeometryRenderer::UnlockStorage::perform() - { - if (m_storage.m_vertices && m_storage.m_indices) - { - m_storage.m_vertices->unlock(); - m_storage.m_indices->unlock(); - - /// In multithreaded resource usage scenarios the suggested way to see - /// resource update made in one thread to the another thread is - /// to call the glFlush in thread, which modifies resource and then rebind - /// resource in another threads that is using this resource, if any. - OGLCHECK(glFlushFn()); - } - else - LOG(LDEBUG, ("no storage to unlock")); - } - - void GeometryRenderer::UnlockStorage::cancel() - { - perform(); - } - - void GeometryRenderer::unlockStorage(Storage const & storage) - { - shared_ptr command(new UnlockStorage()); - - command->m_storage = storage; - - processCommand(command); - } - - void GeometryRenderer::DiscardStorage::perform() - { - if (m_storage.m_vertices && m_storage.m_indices) - { - m_storage.m_vertices->discard(); - m_storage.m_indices->discard(); - } - else - LOG(LDEBUG, ("no storage to discard")); - } - - void GeometryRenderer::DiscardStorage::cancel() - { - perform(); - } - - void GeometryRenderer::discardStorage(Storage const & storage) - { - shared_ptr command(new DiscardStorage()); - - command->m_storage = storage; - - processCommand(command); - } - - void GeometryRenderer::ApplyStates::perform() - { - // Disable dither to fix 4-bit textures "grid" issue on Nvidia Tegra cards - OGLCHECK(glDisable(GL_DITHER)); - - OGLCHECK(glActiveTextureFn(GL_TEXTURE0)); - - OGLCHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - OGLCHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - - OGLCHECK(glEnable(GL_DEPTH_TEST)); - OGLCHECK(glDepthFunc(GL_LEQUAL)); - - OGLCHECK(glEnable(GL_BLEND)); - OGLCHECK(glDepthMask(GL_TRUE)); - - if (graphics::gl::g_isSeparateBlendFuncSupported) - OGLCHECK(glBlendFuncSeparateFn(GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA, - GL_ZERO, - GL_ONE)); - else - OGLCHECK(glBlendFunc(GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA)); - - /// Applying program - gl::RenderContext * rc = static_cast(renderContext()); - ProgramManager * pm = rc->programManager(); - shared_ptr prg = pm->getProgram(EVxTextured, EFrgAlphaTest); - if (m_type == AlfaVaringProgram) - prg = pm->getProgram(EVxTextured, EFrgVarAlfa); - else if (m_type == RouteProgram) - prg = pm->getProgram(EVxRoute, EFrgRoute); - else if (m_type == RouteArrowProgram) - prg = pm->getProgram(EVxRoute, EFrgRouteArrow); - - if (m_type == DefaultProgram || m_type == AlfaVaringProgram) - { - prg->setParam(ESemModelView, rc->matrix(EModelView)); - prg->setParam(ESemProjection, rc->matrix(EProjection)); - prg->setParam(ESemSampler0, 0); - } - - rc->setProgram(prg); - } - - void GeometryRenderer::applyStates() - { - processCommand(make_shared()); - } - - void GeometryRenderer::applyVarAlfaStates() - { - processCommand(make_shared(ApplyStates::AlfaVaringProgram)); - } - - void GeometryRenderer::applyRouteStates() - { - processCommand(make_shared(ApplyStates::RouteProgram)); - } - - void GeometryRenderer::applyRouteArrowStates() - { - processCommand(make_shared(ApplyStates::RouteArrowProgram)); - } - - void GeometryRenderer::ApplyBlitStates::perform() - { - OGLCHECK(glEnable(GL_DEPTH_TEST)); - OGLCHECK(glDepthFunc(GL_LEQUAL)); - OGLCHECK(glDepthMask(GL_TRUE)); - - /// Applying program - gl::RenderContext * rc = static_cast(renderContext()); - ProgramManager * pm = rc->programManager(); - shared_ptr prg = pm->getProgram(EVxTextured, EFrgNoAlphaTest); - - prg->setParam(ESemModelView, rc->matrix(EModelView)); - prg->setParam(ESemProjection, rc->matrix(EProjection)); - prg->setParam(ESemSampler0, 0); - - rc->setProgram(prg); - } - - void GeometryRenderer::applyBlitStates() - { - processCommand(make_shared()); - } - - void GeometryRenderer::ApplySharpStates::perform() - { - // Disable dither to fix 4-bit textures "grid" issue on Nvidia Tegra cards - OGLCHECK(glDisable(GL_DITHER)); - - OGLCHECK(glActiveTextureFn(GL_TEXTURE0)); - - OGLCHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); - OGLCHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); - - OGLCHECK(glEnable(GL_DEPTH_TEST)); - OGLCHECK(glDepthFunc(GL_LEQUAL)); - - OGLCHECK(glEnable(GL_BLEND)); - OGLCHECK(glDepthMask(GL_TRUE)); - - if (graphics::gl::g_isSeparateBlendFuncSupported) - OGLCHECK(glBlendFuncSeparateFn(GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA, - GL_ZERO, - GL_ONE)); - else - OGLCHECK(glBlendFunc(GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA)); - - /// Applying program - gl::RenderContext * rc = static_cast(renderContext()); - ProgramManager * pm = rc->programManager(); - shared_ptr prg = pm->getProgram(EVxSharp, EFrgAlphaTest); - - prg->setParam(ESemModelView, rc->matrix(EModelView)); - prg->setParam(ESemProjection, rc->matrix(EProjection)); - prg->setParam(ESemSampler0, 0); - - rc->setProgram(prg); - } - - void GeometryRenderer::applySharpStates() - { - processCommand(make_shared()); - } - } -} diff --git a/graphics/opengl/geometry_renderer.hpp b/graphics/opengl/geometry_renderer.hpp deleted file mode 100644 index b0dd371004..0000000000 --- a/graphics/opengl/geometry_renderer.hpp +++ /dev/null @@ -1,179 +0,0 @@ -#pragma once - -#include "graphics/defines.hpp" -#include "graphics/resource_cache.hpp" - -#include "graphics/opengl/clipper.hpp" - -#include "base/matrix.hpp" -#include "base/threaded_list.hpp" - -#include "std/shared_ptr.hpp" -#include "std/function.hpp" - -namespace graphics -{ - struct Resource; - - namespace gl - { - class BaseTexture; - - class GeometryRenderer : public Clipper - { - public: - - typedef Clipper base_t; - - struct UploadData : public Command - { - vector > m_uploadQueue; - shared_ptr m_texture; - - UploadData(); - UploadData(shared_ptr const * styles, - size_t count, - shared_ptr const & texture); - - void perform(); - void cancel(); - void dump(); - }; - - struct DrawGeometry : public Command - { - shared_ptr m_texture; - Storage m_storage; - size_t m_indicesCount; - size_t m_indicesOffs; - EPrimitives m_primitiveType; - - DrawGeometry(); - virtual bool isNeedAdditionalUniforms() const; - virtual void setAdditionalUniforms(UniformsHolder const & holder); - virtual void resetAdditionalUniforms(); - void perform(); - void dump(); - - private: - float m_alfa; - }; - - struct DrawRouteGeometry : public Command - { - shared_ptr m_texture; - Storage m_storage; - - DrawRouteGeometry(); - bool isNeedAdditionalUniforms() const override; - void setAdditionalUniforms(UniformsHolder const & holder) override; - void resetAdditionalUniforms() override; - bool isNeedIndicesCount() const override; - void setIndicesCount(size_t indicesCount) override; - void perform() override; - void dump() override; - - private: - void ResetUniforms(); - - float m_halfWidth[2]; - float m_color[4]; - float m_clipLength; - float m_textureRect[4]; - math::Matrix m_arrowBorders; - size_t m_indicesCount; - }; - - struct FreeStorage : public Command - { - TStoragePool * m_storagePool; - Storage m_storage; - - void perform(); - void cancel(); - }; - - struct FreeTexture : public Command - { - TTexturePool * m_texturePool; - shared_ptr m_texture; - - void perform(); - void cancel(); - void dump(); - }; - - struct UnlockStorage : public Command - { - Storage m_storage; - - void perform(); - void cancel(); - }; - - struct DiscardStorage : public Command - { - Storage m_storage; - - void perform(); - void cancel(); - }; - - struct ApplySharpStates : public Command - { - void perform(); - }; - - struct ApplyStates : public Command - { - enum ProgramType - { - DefaultProgram, - AlfaVaringProgram, - RouteProgram, - RouteArrowProgram - }; - - ApplyStates(ProgramType type = DefaultProgram) : m_type(type) {} - void perform(); - - private: - ProgramType m_type; - }; - - struct ApplyBlitStates : public Command - { - void perform(); - }; - - GeometryRenderer(base_t::Params const & params); - - void drawGeometry(shared_ptr const & texture, - Storage const & storage, - size_t indicesCount, - size_t indicesOffs, - EPrimitives primType); - - void drawRouteGeometry(shared_ptr const & texture, - Storage const & storage); - void clearRouteGeometry(); - - void uploadResources(shared_ptr const * styles, - size_t count, - shared_ptr const & texture); - - void freeTexture(shared_ptr const & texture, TTexturePool * texturePool); - void freeStorage(Storage const & storage, TStoragePool * storagePool); - void unlockStorage(Storage const & storage); - void discardStorage(Storage const & storage); - - void applySharpStates(); - void applyBlitStates(); - void applyVarAlfaStates(); - void applyStates(); - void applyRouteStates(); - void applyRouteArrowStates(); - }; - } -} - diff --git a/graphics/opengl/gl_procedures.inl b/graphics/opengl/gl_procedures.inl deleted file mode 100644 index 8f13fba3c3..0000000000 --- a/graphics/opengl/gl_procedures.inl +++ /dev/null @@ -1,59 +0,0 @@ -// Intentionally no #pragma once - -// buffer objects extensions - -DEFINE_GL_PROC("glActiveTexture", glActiveTextureFn) -DEFINE_GL_PROC("glGetAttribLocation", glGetAttribLocationFn) -DEFINE_GL_PROC("glGetActiveAttrib", glGetActiveAttribFn) -DEFINE_GL_PROC("glGetActiveUniform", glGetActiveUniformFn) -DEFINE_GL_PROC("glGetUniformLocation", glGetUniformLocationFn) -DEFINE_GL_PROC("glGetProgramInfoLog", glGetProgramInfoLogFn) -DEFINE_GL_PROC("glGetProgramiv", glGetProgramivFn) -DEFINE_GL_PROC("glLinkProgram", glLinkProgramFn) -DEFINE_GL_PROC("glAttachShader", glAttachShaderFn) -DEFINE_GL_PROC("glCreateProgram", glCreateProgramFn) -DEFINE_GL_PROC("glDeleteProgram", glDeleteProgramFn) -DEFINE_GL_PROC("glVertexAttribPointer", glVertexAttribPointerFn) -DEFINE_GL_PROC("glEnableVertexAttribArray", glEnableVertexAttribArrayFn) -DEFINE_GL_PROC("glUniformMatrix4fv", glUniformMatrix4fvFn) -DEFINE_GL_PROC("glUniformMatrix3fv", glUniformMatrix3fvFn) -DEFINE_GL_PROC("glUniformMatrix2fv", glUniformMatrix2fvFn) -DEFINE_GL_PROC("glUniform4i", glUniform4iFn) -DEFINE_GL_PROC("glUniform3i", glUniform3iFn) -DEFINE_GL_PROC("glUniform2i", glUniform2iFn) -DEFINE_GL_PROC("glUniform1i", glUniform1iFn) -DEFINE_GL_PROC("glUniform4f", glUniform4fFn) -DEFINE_GL_PROC("glUniform3f", glUniform3fFn) -DEFINE_GL_PROC("glUniform2f", glUniform2fFn) -DEFINE_GL_PROC("glUniform1f", glUniform1fFn) -DEFINE_GL_PROC("glUseProgram", glUseProgramFn) -DEFINE_GL_PROC("glGetShaderInfoLog", glGetShaderInfoLogFn) -DEFINE_GL_PROC("glGetShaderiv", glGetShaderivFn) -DEFINE_GL_PROC("glCompileShader", glCompileShaderFn) -DEFINE_GL_PROC("glShaderSource", glShaderSourceFn) -DEFINE_GL_PROC("glCreateShader", glCreateShaderFn) -DEFINE_GL_PROC("glDeleteShader", glDeleteShaderFn) - -DEFINE_GL_PROC("glBindBuffer", glBindBufferFn) -DEFINE_GL_PROC("glGenBuffers", glGenBuffersFn) -DEFINE_GL_PROC("glBufferData", glBufferDataFn) -DEFINE_GL_PROC("glBufferSubData", glBufferSubDataFn) -DEFINE_GL_PROC("glDeleteBuffers", glDeleteBuffersFn) -DEFINE_GL_PROC("glMapBuffer", glMapBufferFn) -DEFINE_GL_PROC("glUnmapBuffer", glUnmapBufferFn) - -// framebuffers extensions - -DEFINE_GL_PROC("glBindFramebuffer", glBindFramebufferFn) -DEFINE_GL_PROC("glFramebufferTexture2D", glFramebufferTexture2DFn) -DEFINE_GL_PROC("glFramebufferRenderbuffer", glFramebufferRenderbufferFn) -DEFINE_GL_PROC("glGenFramebuffers", glGenFramebuffersFn) -DEFINE_GL_PROC("glDeleteFramebuffers", glDeleteFramebuffersFn) -DEFINE_GL_PROC("glCheckFramebufferStatus", glCheckFramebufferStatusFn) - -// renderbuffer extensions - -DEFINE_GL_PROC("glGenRenderbuffers", glGenRenderbuffersFn) -DEFINE_GL_PROC("glDeleteRenderbuffers", glDeleteRenderbuffersFn) -DEFINE_GL_PROC("glBindRenderbuffer", glBindRenderbufferFn) -DEFINE_GL_PROC("glRenderbufferStorage", glRenderbufferStorageFn) diff --git a/graphics/opengl/gl_render_context.cpp b/graphics/opengl/gl_render_context.cpp deleted file mode 100644 index 7929d9bcb5..0000000000 --- a/graphics/opengl/gl_render_context.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "graphics/resource_manager.hpp" - -#include "graphics/opengl/gl_render_context.hpp" -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - void RenderContext::startThreadDrawing(unsigned ts) - { - OGLCHECK(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); - OGLCHECK(glPixelStorei(GL_PACK_ALIGNMENT, 1)); - graphics::RenderContext::startThreadDrawing(ts); - - m_programManager = resourceManager()->programManager(threadSlot()); - } - - void RenderContext::endThreadDrawing(unsigned ts) - { - graphics::RenderContext::endThreadDrawing(ts); - } - - Storage const & RenderContext::storage() const - { - return m_storage; - } - - void RenderContext::setStorage(Storage const & storage) - { - m_storage = storage; - } - - shared_ptr const & RenderContext::program() const - { - return m_program; - } - - void RenderContext::setProgram(shared_ptr const & prg) - { - if (m_program != prg) - { - m_program = prg; - m_program->riseChangedFlag(); - } - } - - ProgramManager * RenderContext::programManager() - { - return m_programManager; - } - } -} diff --git a/graphics/opengl/gl_render_context.hpp b/graphics/opengl/gl_render_context.hpp deleted file mode 100644 index 7f359724f9..0000000000 --- a/graphics/opengl/gl_render_context.hpp +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" -#include "graphics/render_context.hpp" -#include "graphics/opengl/program_manager.hpp" -#include "graphics/opengl/storage.hpp" - -namespace graphics -{ - class ResourceManager; - - namespace gl - { - class ProgramManager; - class Program; - - class RenderContext : public graphics::RenderContext - { - private: - /// Program manager to get Program's from. - ProgramManager * m_programManager; - - /// @{ OpenGL specific rendering states - /// Current Storage - Storage m_storage; - /// Current Program - shared_ptr m_program; - /// @} - public: - - ProgramManager * programManager(); - - /// @{ OpenGL specific rendering states - - Storage const & storage() const; - void setStorage(Storage const & storage); - - shared_ptr const & program() const; - void setProgram(shared_ptr const & prg); - - /// @} - - /// Start rendering in the specified thread - void startThreadDrawing(unsigned threadSlot); - /// End rendering in the specified thread - void endThreadDrawing(unsigned threadSlot); - }; - } -} diff --git a/graphics/opengl/managed_texture.cpp b/graphics/opengl/managed_texture.cpp deleted file mode 100644 index 769d8150c3..0000000000 --- a/graphics/opengl/managed_texture.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "base/shared_buffer_manager.hpp" - -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/managed_texture.hpp" - -namespace graphics -{ - namespace gl - { - ManagedTexture::ManagedTexture(unsigned width, unsigned height, size_t pixelSize) - : BaseTexture(width, height), m_imageSize(width * height * pixelSize), m_isLocked(false) - {} - - ManagedTexture::ManagedTexture(m2::PointU const & size, size_t pixelSize) - : BaseTexture(size.x, size.y), m_imageSize(size.x * size.y * pixelSize), m_isLocked(false) - {} - - void ManagedTexture::lock() - { - m_isLocked = true; - m_auxData = SharedBufferManager::instance().reserveSharedBuffer(m_imageSize); - } - - void ManagedTexture::unlock() - { - SharedBufferManager::instance().freeSharedBuffer(m_imageSize, m_auxData); - - m_auxData.reset(); - - m_isLocked = false; - } - - void * ManagedTexture::auxData() - { - ASSERT(m_isLocked, ("texture is unlocked")); - return &(*m_auxData)[0]; - } - } -} diff --git a/graphics/opengl/managed_texture.hpp b/graphics/opengl/managed_texture.hpp deleted file mode 100644 index 22346b0367..0000000000 --- a/graphics/opengl/managed_texture.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include "geometry/rect2d.hpp" -#include "geometry/point2d.hpp" - -#include "std/vector.hpp" -#include "std/shared_ptr.hpp" - -#include "graphics/opengl/base_texture.hpp" - -namespace graphics -{ - namespace gl - { - class ManagedTexture : public BaseTexture - { - private: - - /// size of the allocated shared buffers - size_t m_imageSize; - - protected: - - /// is the texture locked - bool m_isLocked; - - virtual void upload(void * data) = 0; - virtual void upload(void * data, m2::RectU const & r) = 0; - - /// system memory buffer for the purpose of correct working of glTexSubImage2D. - /// in OpenGL ES 1.1 there are no way to specify GL_UNPACK_ROW_LENGTH so - /// the data supplied to glTexSubImage2D should be continous. - shared_ptr > m_auxData; - - public: - - ManagedTexture(m2::PointU const & size, size_t pixelSize); - ManagedTexture(unsigned width, unsigned height, size_t pixelSize); - - void lock(); - void unlock(); - void * auxData(); - }; - } -} diff --git a/graphics/opengl/opengl.cpp b/graphics/opengl/opengl.cpp deleted file mode 100644 index 0d96810c94..0000000000 --- a/graphics/opengl/opengl.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#include "graphics/opengl/opengl.hpp" - -#include "base/logging.hpp" -#include "base/string_utils.hpp" -#include "base/stl_add.hpp" - -#include "std/bind.hpp" - -namespace graphics -{ - namespace gl - { - platform_unsupported::platform_unsupported(char const * reason) - : m_reason(reason) - {} - - platform_unsupported::~platform_unsupported() throw() - {} - - char const * platform_unsupported::what() const throw() - { - return m_reason.c_str(); - } - - bool HasExtension(const char *name) - { - string allExtensions(reinterpret_cast(glGetString(GL_EXTENSIONS))); - return allExtensions.find(name) != string::npos; - } - - void DumpGLInformation() - { - LOG(LINFO, ("OpenGL Vendor :", glGetString(GL_VENDOR))); - LOG(LINFO, ("OpenGL Renderer :", glGetString(GL_RENDERER))); - LOG(LINFO, ("OpenGL Version :", glGetString(GL_VERSION))); - - vector names; - - strings::Tokenize(string(reinterpret_cast(glGetString(GL_EXTENSIONS))), " ", MakeBackInsertFunctor(names)); - - for (unsigned i = 0; i < names.size(); ++i) - { - if (i == 0) - LOG(LINFO, ("OpenGL Extensions:", names[i])); - else - LOG(LINFO, (" ", names[i])); - } - } - - void (OPENGL_CALLING_CONVENTION * glActiveTextureFn) (GLenum texture); - GLint (OPENGL_CALLING_CONVENTION * glGetAttribLocationFn)(GLuint program, const GLchar *name); - void (OPENGL_CALLING_CONVENTION * glGetActiveAttribFn)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GLint (OPENGL_CALLING_CONVENTION * glGetUniformLocationFn)(GLuint program, const GLchar *name); - void (OPENGL_CALLING_CONVENTION * glGetActiveUniformFn)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - void (OPENGL_CALLING_CONVENTION * glGetProgramInfoLogFn)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - void (OPENGL_CALLING_CONVENTION * glGetProgramivFn)(GLuint program, GLenum pname, GLint *params); - void (OPENGL_CALLING_CONVENTION * glLinkProgramFn)(GLuint program); - void (OPENGL_CALLING_CONVENTION * glAttachShaderFn)(GLuint program, GLuint shader); - GLuint (OPENGL_CALLING_CONVENTION * glCreateProgramFn)(void); - void (OPENGL_CALLING_CONVENTION * glDeleteProgramFn)(GLuint program); - void (OPENGL_CALLING_CONVENTION * glVertexAttribPointerFn)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); - void (OPENGL_CALLING_CONVENTION * glEnableVertexAttribArrayFn)(GLuint index); - void (OPENGL_CALLING_CONVENTION * glUniformMatrix4fvFn)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - void (OPENGL_CALLING_CONVENTION * glUniformMatrix3fvFn)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - void (OPENGL_CALLING_CONVENTION * glUniformMatrix2fvFn)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - void (OPENGL_CALLING_CONVENTION * glUniform4iFn)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - void (OPENGL_CALLING_CONVENTION * glUniform3iFn)(GLint location, GLint v0, GLint v1, GLint v2); - void (OPENGL_CALLING_CONVENTION * glUniform1iFn)(GLint location, GLint v0); - void (OPENGL_CALLING_CONVENTION * glUniform2iFn)(GLint location, GLint v0, GLint v1); - void (OPENGL_CALLING_CONVENTION * glUniform4fFn)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - void (OPENGL_CALLING_CONVENTION * glUniform3fFn)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - void (OPENGL_CALLING_CONVENTION * glUniform2fFn)(GLint location, GLfloat v0, GLfloat v1); - void (OPENGL_CALLING_CONVENTION * glUniform1fFn)(GLint location, GLfloat v0); - void (OPENGL_CALLING_CONVENTION * glUseProgramFn)(GLuint program); - void (OPENGL_CALLING_CONVENTION * glGetShaderInfoLogFn)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - void (OPENGL_CALLING_CONVENTION * glGetShaderivFn)(GLuint shader, GLenum pname, GLint *params); - void (OPENGL_CALLING_CONVENTION * glCompileShaderFn)(GLuint shader); - void (OPENGL_CALLING_CONVENTION * glShaderSourceFn)(GLuint shader, GLsizei count, const GLchar ** string, const GLint * length); - GLuint (OPENGL_CALLING_CONVENTION * glCreateShaderFn)(GLenum type); - void (OPENGL_CALLING_CONVENTION * glDeleteShaderFn)(GLuint shader); - - // basic opengl functions and constants - void (OPENGL_CALLING_CONVENTION * glEnableFn)(GLenum cap); - void (OPENGL_CALLING_CONVENTION * glDisableFn)(GLenum cap); - void (OPENGL_CALLING_CONVENTION * glAlphaFuncFn)(GLenum func, GLclampf ref); - - void (OPENGL_CALLING_CONVENTION * glEnableClientStateFn) (GLenum array); - void (OPENGL_CALLING_CONVENTION * glVertexPointerFn) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - void (OPENGL_CALLING_CONVENTION * glNormalPointerFn) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - void (OPENGL_CALLING_CONVENTION * glTexCoordPointerFn) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - - void (OPENGL_CALLING_CONVENTION * glMatrixModeFn) (GLenum mode); - void (OPENGL_CALLING_CONVENTION * glLoadIdentityFn)(); - void (OPENGL_CALLING_CONVENTION * glLoadMatrixfFn) (const GLfloat *m); - void (OPENGL_CALLING_CONVENTION * glOrthoFn) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); - void (OPENGL_CALLING_CONVENTION * glDrawElementsFn) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); - void (OPENGL_CALLING_CONVENTION * glFlushFn)(); - - bool g_isBufferObjectsSupported = true; - bool g_isMapBufferSupported = false; //true; - bool g_isFramebufferSupported = true; - bool g_isRenderbufferSupported = true; - bool g_isSeparateBlendFuncSupported = false; - - void (OPENGL_CALLING_CONVENTION * glBindBufferFn) (GLenum target, GLuint buffer); - void (OPENGL_CALLING_CONVENTION * glGenBuffersFn) (GLsizei n, GLuint *buffers); - void (OPENGL_CALLING_CONVENTION * glBufferDataFn) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); - void (OPENGL_CALLING_CONVENTION * glBufferSubDataFn) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); - void (OPENGL_CALLING_CONVENTION * glDeleteBuffersFn) (GLsizei n, const GLuint *buffers); - void * (OPENGL_CALLING_CONVENTION * glMapBufferFn) (GLenum target, GLenum access); - GLboolean (OPENGL_CALLING_CONVENTION * glUnmapBufferFn) (GLenum target); - - void (OPENGL_CALLING_CONVENTION * glBindFramebufferFn) (GLenum target, GLuint framebuffer); - void (OPENGL_CALLING_CONVENTION * glFramebufferTexture2DFn) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - void (OPENGL_CALLING_CONVENTION * glFramebufferRenderbufferFn) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - void (OPENGL_CALLING_CONVENTION * glGenFramebuffersFn) (GLsizei n, GLuint *framebuffers); - void (OPENGL_CALLING_CONVENTION * glDeleteFramebuffersFn) (GLsizei n, const GLuint *framebuffers); - GLenum (OPENGL_CALLING_CONVENTION * glCheckFramebufferStatusFn) (GLenum target); - void (OPENGL_CALLING_CONVENTION * glDiscardFramebufferFn)(GLenum target, GLsizei numAttachments, GLenum const * attachments) = 0; - - void (OPENGL_CALLING_CONVENTION * glGenRenderbuffersFn) (GLsizei n, GLuint *renderbuffers); - void (OPENGL_CALLING_CONVENTION * glDeleteRenderbuffersFn) (GLsizei n, const GLuint *renderbuffers); - void (OPENGL_CALLING_CONVENTION * glBindRenderbufferFn) (GLenum target, GLuint renderbuffer); - void (OPENGL_CALLING_CONVENTION * glRenderbufferStorageFn) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - - void (OPENGL_CALLING_CONVENTION * glUseSharpGeometryFn)(GLboolean flag); - - void (OPENGL_CALLING_CONVENTION * glBlendFuncSeparateFn) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - - bool g_hasContext = true; - bool g_doLogOGLCalls = false; - - void CheckExtensionSupport() - { - if (!g_isFramebufferSupported) - throw platform_unsupported("no framebuffer support"); - - if (!g_isRenderbufferSupported) - throw platform_unsupported("no renderbuffer support"); - } - - void LogError(char const * err, my::SrcPoint const & srcPt) - { - if (err) - { - LOG(LERROR, (err, srcPt.FileName(), srcPt.Line())); - } - } - - char const * Error2String(int error) - { - switch (error) - { - case GL_INVALID_ENUM: return "GL_INVALID_ENUM"; - case GL_INVALID_VALUE: return "GL_INVALID_VALUE"; - case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION"; -// case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW"; //< not supported in OpenGL ES2.0 -// case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW"; //< not supported in OpenGL ES2.0 - case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY"; - default: return 0; - } - } - - void CheckError(my::SrcPoint const & srcPt) - { - LogError(Error2String(glGetError()), srcPt); - } - } -} diff --git a/graphics/opengl/opengl.hpp b/graphics/opengl/opengl.hpp deleted file mode 100644 index afcfce40d1..0000000000 --- a/graphics/opengl/opengl.hpp +++ /dev/null @@ -1,247 +0,0 @@ -#pragma once - -#include "base/logging.hpp" - -#include "std/target_os.hpp" - - -#if defined(OMIM_OS_WINDOWS) - #include "../../std/windows.hpp" - #include - #define GL_GLEXT_PROTOTYPES - #include "../../3party/GL/glext.h" - -#elif defined(OMIM_OS_TIZEN) - #include - using namespace Tizen::Graphics::Opengl; - #define OMIM_GL_ES - -#elif defined(OMIM_OS_MAC) || defined(OMIM_OS_IPHONE) - #include - - #ifdef OMIM_OS_IPHONE - #define USE_OPENGLES20_IF_AVAILABLE 1 - #include - #include - #define OMIM_GL_ES - #else - #include - #include - #endif - -#elif defined(OMIM_OS_ANDROID) - - #include - #define GL_GLEXT_PROTOTYPES - #include - #define OMIM_GL_ES - -#elif defined(OMIM_OS_MAEMO) - #define USE_OPENGLES20_IF_AVAILABLE 1 - #include - #include - #define OMIM_GL_ES - -#elif defined(OMIM_OS_TIZEN) - #include - #define GL_GLEXT_PROTOTYPES - #include - #define OMIM_GL_ES - -#else - #define GL_GLEXT_PROTOTYPES - #include - #include - -#endif - - -#if defined(OMIM_OS_WINDOWS) - #define OPENGL_CALLING_CONVENTION __stdcall -#elif defined(OMIM_OS_ANDROID) - #define OPENGL_CALLING_CONVENTION __NDK_FPABI__ -#else - #define OPENGL_CALLING_CONVENTION -#endif - -#include "base/src_point.hpp" -#include "std/exception.hpp" - - -namespace graphics -{ - namespace gl - { - // basic opengl functions and constants - extern void (OPENGL_CALLING_CONVENTION * glEnableFn)(GLenum cap); - extern void (OPENGL_CALLING_CONVENTION * glDisableFn)(GLenum cap); - extern void (OPENGL_CALLING_CONVENTION * glAlphaFuncFn)(GLenum func, GLclampf ref); - extern void (OPENGL_CALLING_CONVENTION * glEnableClientStateFn) (GLenum array); - extern void (OPENGL_CALLING_CONVENTION * glVertexPointerFn) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - extern void (OPENGL_CALLING_CONVENTION * glNormalPointerFn) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - extern void (OPENGL_CALLING_CONVENTION * glTexCoordPointerFn) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - - /// this is a quickfix for sharpness of straight texts and symbols. - /// should be refactored to something more consistent. - extern void (OPENGL_CALLING_CONVENTION * glUseSharpGeometryFn) (GLboolean flag); - - extern const GLenum GL_VERTEX_ARRAY_MWM; - extern const GLenum GL_TEXTURE_COORD_ARRAY_MWM; - extern const GLenum GL_NORMAL_ARRAY_MWM; - - extern void (OPENGL_CALLING_CONVENTION * glMatrixModeFn) (GLenum mode); - extern void (OPENGL_CALLING_CONVENTION * glLoadIdentityFn)(); - extern void (OPENGL_CALLING_CONVENTION * glLoadMatrixfFn) (const GLfloat *m); - - extern void (OPENGL_CALLING_CONVENTION * glOrthoFn) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); - extern void (OPENGL_CALLING_CONVENTION * glDrawElementsFn) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); - extern void (OPENGL_CALLING_CONVENTION * glFlushFn)(); - - extern const GLenum GL_MODELVIEW_MWM; - extern const GLenum GL_PROJECTION_MWM; - - extern const GLenum GL_ALPHA_TEST_MWM; - - /// information about supported extensions - - extern bool g_isMapBufferSupported; - extern bool g_isBufferObjectsSupported; - extern bool g_isFramebufferSupported; - extern bool g_isRenderbufferSupported; - extern bool g_isSeparateBlendFuncSupported; - - // buffer objects extensions - - extern const int GL_WRITE_ONLY_MWM; - - extern void (OPENGL_CALLING_CONVENTION * glBindBufferFn) (GLenum target, GLuint buffer); - extern void (OPENGL_CALLING_CONVENTION * glGenBuffersFn) (GLsizei n, GLuint *buffers); - extern void (OPENGL_CALLING_CONVENTION * glBufferDataFn) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); - extern void (OPENGL_CALLING_CONVENTION * glBufferSubDataFn) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); - extern void (OPENGL_CALLING_CONVENTION * glDeleteBuffersFn) (GLsizei n, const GLuint *buffers); - extern void * (OPENGL_CALLING_CONVENTION * glMapBufferFn) (GLenum target, GLenum access); - extern GLboolean (OPENGL_CALLING_CONVENTION * glUnmapBufferFn) (GLenum target); - - // framebuffers extensions - - extern const int GL_FRAMEBUFFER_BINDING_MWM; - extern const int GL_FRAMEBUFFER_MWM; - extern const int GL_FRAMEBUFFER_UNSUPPORTED_MWM; - extern const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM; - extern const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM; - extern const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM; - extern const int GL_FRAMEBUFFER_COMPLETE_MWM; - extern const int GL_DEPTH_ATTACHMENT_MWM; - extern const int GL_COLOR_ATTACHMENT0_MWM; - extern const int GL_RENDERBUFFER_MWM; - extern const int GL_RENDERBUFFER_BINDING_MWM; - extern const int GL_DEPTH_COMPONENT16_MWM; - extern const int GL_DEPTH_COMPONENT24_MWM; - extern const int GL_RGBA8_MWM; - extern const int GL_RGBA4_MWM; - - extern void (OPENGL_CALLING_CONVENTION * glBindFramebufferFn) (GLenum target, GLuint framebuffer); - extern void (OPENGL_CALLING_CONVENTION * glFramebufferTexture2DFn) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - extern void (OPENGL_CALLING_CONVENTION * glFramebufferRenderbufferFn) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - extern void (OPENGL_CALLING_CONVENTION * glGenFramebuffersFn) (GLsizei n, GLuint *framebuffers); - extern void (OPENGL_CALLING_CONVENTION * glDeleteFramebuffersFn) (GLsizei n, const GLuint *framebuffers); - extern GLenum (OPENGL_CALLING_CONVENTION * glCheckFramebufferStatusFn) (GLenum target); - extern void (OPENGL_CALLING_CONVENTION * glDiscardFramebufferFn)(GLenum target, GLsizei numAttachments, GLenum const * attachments); - - // renderbuffer extensions - - extern void (OPENGL_CALLING_CONVENTION * glGenRenderbuffersFn) (GLsizei n, GLuint *renderbuffers); - extern void (OPENGL_CALLING_CONVENTION * glDeleteRenderbuffersFn) (GLsizei n, const GLuint *renderbuffers); - extern void (OPENGL_CALLING_CONVENTION * glBindRenderbufferFn) (GLenum target, GLuint renderbuffer); - extern void (OPENGL_CALLING_CONVENTION * glRenderbufferStorageFn) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - - // separate alpha blending extension - - extern void (OPENGL_CALLING_CONVENTION * glBlendFuncSeparateFn) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - - extern void (OPENGL_CALLING_CONVENTION * glActiveTextureFn) (GLenum texture); - extern GLint (OPENGL_CALLING_CONVENTION * glGetAttribLocationFn) (GLuint program, const GLchar *name); - extern void (OPENGL_CALLING_CONVENTION * glGetActiveAttribFn)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - extern GLint (OPENGL_CALLING_CONVENTION * glGetUniformLocationFn)(GLuint program, const GLchar *name); - extern void (OPENGL_CALLING_CONVENTION * glGetActiveUniformFn)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - extern void (OPENGL_CALLING_CONVENTION * glGetProgramInfoLogFn)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - extern void (OPENGL_CALLING_CONVENTION * glGetProgramivFn)(GLuint program, GLenum pname, GLint *params); - extern void (OPENGL_CALLING_CONVENTION * glLinkProgramFn)(GLuint program); - extern void (OPENGL_CALLING_CONVENTION * glAttachShaderFn)(GLuint program, GLuint shader); - extern GLuint (OPENGL_CALLING_CONVENTION * glCreateProgramFn)(void); - extern void (OPENGL_CALLING_CONVENTION * glDeleteProgramFn)(GLuint program); - extern void (OPENGL_CALLING_CONVENTION * glVertexAttribPointerFn)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); - extern void (OPENGL_CALLING_CONVENTION * glEnableVertexAttribArrayFn)(GLuint index); - extern void (OPENGL_CALLING_CONVENTION * glUniformMatrix4fvFn)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - extern void (OPENGL_CALLING_CONVENTION * glUniformMatrix3fvFn)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - extern void (OPENGL_CALLING_CONVENTION * glUniformMatrix2fvFn)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); - extern void (OPENGL_CALLING_CONVENTION * glUniform4iFn)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - extern void (OPENGL_CALLING_CONVENTION * glUniform3iFn)(GLint location, GLint v0, GLint v1, GLint v2); - extern void (OPENGL_CALLING_CONVENTION * glUniform2iFn)(GLint location, GLint v0, GLint v1); - extern void (OPENGL_CALLING_CONVENTION * glUniform1iFn)(GLint location, GLint v0); - extern void (OPENGL_CALLING_CONVENTION * glUniform4fFn)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - extern void (OPENGL_CALLING_CONVENTION * glUniform3fFn)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - extern void (OPENGL_CALLING_CONVENTION * glUniform2fFn)(GLint location, GLfloat v0, GLfloat v1); - extern void (OPENGL_CALLING_CONVENTION * glUniform1fFn)(GLint location, GLfloat v0); - extern void (OPENGL_CALLING_CONVENTION * glUseProgramFn)(GLuint program); - extern void (OPENGL_CALLING_CONVENTION * glGetShaderInfoLogFn)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - extern void (OPENGL_CALLING_CONVENTION * glGetShaderivFn)(GLuint shader, GLenum pname, GLint *params); - extern void (OPENGL_CALLING_CONVENTION * glCompileShaderFn)(GLuint shader); - extern void (OPENGL_CALLING_CONVENTION * glShaderSourceFn)(GLuint shader, GLsizei count, const GLchar ** string, const GLint * length); - extern GLuint (OPENGL_CALLING_CONVENTION * glCreateShaderFn)(GLenum type); - extern void (OPENGL_CALLING_CONVENTION * glDeleteShaderFn)(GLuint shader); - - /// This flag controls, whether OpenGL resources should delete themselves upon destruction. - /// Sounds odd, but in EGL there are cases when the only function one should call to finish - /// its work with resources is eglTerminate, which by itself internally deletes all OpenGL resources. - /// In this case we should set this variable to true to correctly deletes all our wrapper - /// classes without calls to glDeleteXXX. - - extern bool g_hasContext; - - /// This flag controls, whether the OGLCHECK macroses should log OGL calls. - /// This is for debugging purpose only. - - extern bool g_doLogOGLCalls; - - /// each platform should have an implementation of this function - /// to check extensions support and initialize function pointers. - void InitExtensions(); - - /// Does we have an extension with the specified name? - bool HasExtension(char const * name); - - void DumpGLInformation(); - - /// return false to terminate program - /// @throws platform_unsupported - is the platform we are running on is unsupported. - void CheckExtensionSupport(); - - struct platform_unsupported : public exception - { - string m_reason; - const char * what() const throw(); - platform_unsupported(char const * reason); - ~platform_unsupported() throw(); - }; - - void CheckError(my::SrcPoint const & srcPt); - - } -} - -//#define OMIM_GL_ENABLE_TRACE 1 - -#ifdef DEBUG - #ifdef OMIM_GL_ENABLE_TRACE - #define OGLCHECK(f) do { if (graphics::gl::g_doLogOGLCalls) LOG(LDEBUG, (#f)); if (graphics::gl::g_hasContext) {f; graphics::gl::CheckError(SRC());} else LOG(LDEBUG, ("no OGL context. skipping OGL call")); } while(false) - #define OGLCHECKAFTER if (graphics::gl::g_doLogOGLCalls) LOG(LDEBUG, ("OGLCHECKAFTER")); graphics::gl::CheckError(SRC()) - #else - #define OGLCHECK(f) do { if (graphics::gl::g_hasContext) {f; graphics::gl::CheckError(SRC());} else LOG(LDEBUG, ("no OGL context. skipping OGL call.")); } while(false) - #define OGLCHECKAFTER graphics::gl::CheckError(SRC()) - #endif - -#else -#define OGLCHECK(f) do {if (graphics::gl::g_hasContext) {f;} else LOG(LDEBUG, ("no OGL context. skipping OGL call."));} while (false) -#define OGLCHECKAFTER -#endif diff --git a/graphics/opengl/opengl_es.cpp b/graphics/opengl/opengl_es.cpp deleted file mode 100644 index 8699725494..0000000000 --- a/graphics/opengl/opengl_es.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "graphics/opengl/opengl.hpp" - -#ifdef OMIM_OS_ANDROID - #define GL_GLEXT_PROTOTYPES - #include -#endif - -#ifdef OMIM_OS_IPHONE - #include - #include -#endif - -namespace yg -{ - namespace gl - { - const int GL_FRAMEBUFFER_BINDING_MWM = GL_FRAMEBUFFER_BINDING_OES; - const int GL_FRAMEBUFFER_MWM = GL_FRAMEBUFFER_OES; - const int GL_FRAMEBUFFER_UNSUPPORTED_MWM = GL_FRAMEBUFFER_UNSUPPORTED_OES; - const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; - const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES; - const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES; - const int GL_FRAMEBUFFER_COMPLETE_MWM = GL_FRAMEBUFFER_COMPLETE_OES; - - const int GL_DEPTH_ATTACHMENT_MWM = GL_DEPTH_ATTACHMENT_OES; - const int GL_COLOR_ATTACHMENT0_MWM = GL_COLOR_ATTACHMENT0_OES; - const int GL_RENDERBUFFER_MWM = GL_RENDERBUFFER_OES; - const int GL_RENDERBUFFER_BINDING_MWM = GL_RENDERBUFFER_BINDING_OES; - const int GL_DEPTH_COMPONENT16_MWM = GL_DEPTH_COMPONENT16_OES; - const int GL_DEPTH_COMPONENT24_MWM = GL_DEPTH_COMPONENT24_OES; - const int GL_RGBA8_MWM = GL_RGBA8_OES; - - const int GL_WRITE_ONLY_MWM = GL_WRITE_ONLY_OES; - - const GLenum GL_MODELVIEW_MWM = GL_MODELVIEW; - const GLenum GL_PROJECTION_MWM = GL_PROJECTION; - const GLenum GL_ALPHA_TEST_MWM = GL_ALPHA_TEST; - - const GLenum GL_VERTEX_ARRAY_MWM = GL_VERTEX_ARRAY; - const GLenum GL_TEXTURE_COORD_ARRAY_MWM = GL_TEXTURE_COORD_ARRAY; - const GLenum GL_NORMAL_ARRAY_MWM = GL_NORMAL_ARRAY; - - void InitializeThread() - {} - - void FinalizeThread() - {} - - void glNormalPointerImpl(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) - { - glNormalPointer(type, stride, pointer); - } - - void glUseSharpGeometryImpl(GLboolean) - {} - - void InitExtensions() - { - DumpGLInformation(); - - glEnableFn = &glEnable; - glDisableFn = &glDisable; - glAlphaFuncFn = &glAlphaFunc; - - glVertexPointerFn = &glVertexPointer; - glTexCoordPointerFn = &glTexCoordPointer; - glNormalPointerFn = &glNormalPointerImpl; - glEnableClientStateFn = &glEnableClientState; - glUseSharpGeometryFn = &glUseSharpGeometryImpl; - - glMatrixModeFn = &glMatrixMode; - glLoadIdentityFn = &glLoadIdentity; - glLoadMatrixfFn = &glLoadMatrixf; - glOrthoFn = &glOrthof; - glDrawElementsFn = &glDrawElements; - - g_isMapBufferSupported = HasExtension("GL_OES_mapbuffer"); - - glMapBufferFn = &glMapBufferOES; - glUnmapBufferFn = &glUnmapBufferOES; - - /// generally speaking we should check for ARB_vertex_buffer extension - g_isBufferObjectsSupported = g_isMapBufferSupported; - - glBindBufferFn = &glBindBuffer; - glGenBuffersFn = &glGenBuffers; - glBufferDataFn = &glBufferData; - glBufferSubDataFn = &glBufferSubData; - glDeleteBuffersFn = &glDeleteBuffers; - - g_isFramebufferSupported = HasExtension("GL_OES_framebuffer_object"); - - glBindFramebufferFn = &glBindFramebufferOES; - glFramebufferTexture2DFn = &glFramebufferTexture2DOES; - glFramebufferRenderbufferFn = &glFramebufferRenderbufferOES; - glGenFramebuffersFn = &glGenFramebuffersOES; - glDeleteFramebuffersFn = &glDeleteFramebuffersOES; - glCheckFramebufferStatusFn = &glCheckFramebufferStatusOES; - - g_isRenderbufferSupported = g_isFramebufferSupported; - - glGenRenderbuffersFn = &glGenRenderbuffersOES; - glDeleteRenderbuffersFn = &glDeleteRenderbuffersOES; - glBindRenderbufferFn = &glBindRenderbufferOES; - glRenderbufferStorageFn = &glRenderbufferStorageOES; - - g_isSeparateBlendFuncSupported = HasExtension("GL_OES_blend_func_separate"); - glBlendFuncSeparateFn = &glBlendFuncSeparateOES; - } - } -} diff --git a/graphics/opengl/opengl_es2.cpp b/graphics/opengl/opengl_es2.cpp deleted file mode 100644 index 2fefcc0c0a..0000000000 --- a/graphics/opengl/opengl_es2.cpp +++ /dev/null @@ -1,124 +0,0 @@ -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/opengl_glsl_impl.hpp" - -namespace graphics -{ - namespace gl - { - -#ifndef OMIM_OS_IPHONE - namespace - { - void OPENGL_CALLING_CONVENTION emptyFlushFn() {} - } -#endif - - const int GL_FRAMEBUFFER_BINDING_MWM = GL_FRAMEBUFFER_BINDING; - const int GL_FRAMEBUFFER_MWM = GL_FRAMEBUFFER; - const int GL_FRAMEBUFFER_UNSUPPORTED_MWM = GL_FRAMEBUFFER_UNSUPPORTED; - const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; - const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; - const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; - const int GL_FRAMEBUFFER_COMPLETE_MWM = GL_FRAMEBUFFER_COMPLETE; - - const int GL_DEPTH_ATTACHMENT_MWM = GL_DEPTH_ATTACHMENT; - const int GL_COLOR_ATTACHMENT0_MWM = GL_COLOR_ATTACHMENT0; - const int GL_RENDERBUFFER_MWM = GL_RENDERBUFFER; - const int GL_RENDERBUFFER_BINDING_MWM = GL_RENDERBUFFER_BINDING; - const int GL_DEPTH_COMPONENT16_MWM = GL_DEPTH_COMPONENT16; - const int GL_DEPTH_COMPONENT24_MWM = GL_DEPTH_COMPONENT24_OES; - const int GL_RGBA8_MWM = GL_RGBA8_OES; - const int GL_RGBA4_MWM = GL_RGBA4; - - const int GL_WRITE_ONLY_MWM = GL_WRITE_ONLY_OES; - - void InitExtensions() - { - DumpGLInformation(); - - g_isBufferObjectsSupported = true; - - glBindBufferFn = &glBindBuffer; - glGenBuffersFn = &glGenBuffers; - glBufferDataFn = &glBufferData; - glBufferSubDataFn = &glBufferSubData; - glDeleteBuffersFn = &glDeleteBuffers; - - g_isMapBufferSupported = false; //HasExtension("GL_OES_mapbuffer"); - -#if defined(OMIM_OS_MAEMO) || defined(OMIM_OS_TIZEN) - glMapBufferFn = 0; - glUnmapBufferFn = 0; -#else - glMapBufferFn = &glMapBufferOES; - glUnmapBufferFn = &glUnmapBufferOES; -#endif - -#ifdef OMIM_OS_IPHONE - glFlushFn = &glFlush; -#else - glFlushFn = &emptyFlushFn; -#endif - - g_isFramebufferSupported = true; - - glBindFramebufferFn = &glBindFramebuffer; - glFramebufferTexture2DFn = &glFramebufferTexture2D; - glFramebufferRenderbufferFn = &glFramebufferRenderbuffer; - glGenFramebuffersFn = &glGenFramebuffers; - glDeleteFramebuffersFn = &glDeleteFramebuffers; - glCheckFramebufferStatusFn = &glCheckFramebufferStatus; - // this extension is defined in headers but absent in library on Android ARM platform -#if (defined(OMIM_OS_ANDROID) && defined(__arm__)) || defined(OMIM_OS_MAEMO) || defined(OMIM_OS_TIZEN) - glDiscardFramebufferFn = 0; -#else - glDiscardFramebufferFn = &glDiscardFramebufferEXT; -#endif - - g_isRenderbufferSupported = g_isFramebufferSupported; - - glGenRenderbuffersFn = &glGenRenderbuffers; - glDeleteRenderbuffersFn = &glDeleteRenderbuffers; - glBindRenderbufferFn = &glBindRenderbuffer; - glRenderbufferStorageFn = &glRenderbufferStorage; - - g_isSeparateBlendFuncSupported = true; - glBlendFuncSeparateFn = &glBlendFuncSeparate; - - glActiveTextureFn = &glActiveTexture; - glGetAttribLocationFn = &glGetAttribLocation; - glGetActiveAttribFn = &glGetActiveAttrib; - glGetUniformLocationFn = &glGetUniformLocation; - glGetActiveUniformFn = &glGetActiveUniform; - glGetProgramInfoLogFn = &glGetProgramInfoLog; - glGetProgramivFn = &glGetProgramiv; - glLinkProgramFn = &glLinkProgram; - glAttachShaderFn = &glAttachShader; - glCreateProgramFn = &glCreateProgram; - glDeleteProgramFn = & glDeleteProgram; - glVertexAttribPointerFn = &glVertexAttribPointer; - glEnableVertexAttribArrayFn = &glEnableVertexAttribArray; - glUniformMatrix4fvFn = &glUniformMatrix4fv; - glUniformMatrix3fvFn = &glUniformMatrix3fv; - glUniformMatrix2fvFn = &glUniformMatrix2fv; - glUniform4iFn = &glUniform4i; - glUniform3iFn = &glUniform3i; - glUniform2iFn = &glUniform2i; - glUniform1iFn = &glUniform1i; - glUniform4fFn = &glUniform4f; - glUniform3fFn = &glUniform3f; - glUniform2fFn = &glUniform2f; - glUniform1fFn = &glUniform1f; - glUseProgramFn = &glUseProgram; - glGetShaderInfoLogFn = &glGetShaderInfoLog; - glGetShaderivFn = &glGetShaderiv; - glCompileShaderFn = &glCompileShader; - // hack to avoid failed compilation on iOS 7.0+ - typedef void (OPENGL_CALLING_CONVENTION * glShaderSourceFn_Type)(GLuint shader, GLsizei count, const GLchar ** string, const GLint *length); - glShaderSourceFn = reinterpret_cast(&glShaderSource); - glCreateShaderFn = &glCreateShader; - glDeleteShaderFn = &glDeleteShader; - } - } -} - diff --git a/graphics/opengl/opengl_ext.cpp b/graphics/opengl/opengl_ext.cpp deleted file mode 100644 index f7b18c3301..0000000000 --- a/graphics/opengl/opengl_ext.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - const int GL_FRAMEBUFFER_BINDING_MWM = GL_FRAMEBUFFER_BINDING_EXT; - const int GL_FRAMEBUFFER_MWM = GL_FRAMEBUFFER_EXT; - const int GL_FRAMEBUFFER_UNSUPPORTED_MWM = GL_FRAMEBUFFER_UNSUPPORTED_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT; - const int GL_FRAMEBUFFER_COMPLETE_MWM = GL_FRAMEBUFFER_COMPLETE_EXT; - - const int GL_DEPTH_ATTACHMENT_MWM = GL_DEPTH_ATTACHMENT_EXT; - const int GL_COLOR_ATTACHMENT0_MWM = GL_COLOR_ATTACHMENT0_EXT; - const int GL_RENDERBUFFER_MWM = GL_RENDERBUFFER_EXT; - const int GL_RENDERBUFFER_BINDING_MWM = GL_RENDERBUFFER_BINDING_EXT; - const int GL_DEPTH_COMPONENT16_MWM = GL_DEPTH_COMPONENT16; - const int GL_DEPTH_COMPONENT24_MWM = GL_DEPTH_COMPONENT24; - const int GL_RGBA8_MWM = GL_RGBA8; - const int GL_RGBA4_MWM = GL_RGBA4; - - const int GL_WRITE_ONLY_MWM = GL_WRITE_ONLY; - - const GLenum GL_MODELVIEW_MWM = GL_MODELVIEW; - const GLenum GL_PROJECTION_MWM = GL_PROJECTION; - const GLenum GL_ALPHA_TEST_MWM = GL_ALPHA_TEST; - - void InitExtensions() - { - DumpGLInformation(); - - g_isBufferObjectsSupported = HasExtension("GL_ARB_vertex_buffer_object") - || HasExtension("GLX_ARB_vertex_buffer_object"); - - glBindBufferFn = &glBindBuffer; - glGenBuffersFn = &glGenBuffers; - glBufferDataFn = &glBufferData; - glBufferSubDataFn = &glBufferSubData; - glDeleteBuffersFn = &glDeleteBuffers; - - g_isMapBufferSupported = false; //g_isBufferObjectsSupported; - - glMapBufferFn = &glMapBuffer; - glUnmapBufferFn = &glUnmapBuffer; - - g_isFramebufferSupported = HasExtension("GL_ARB_framebuffer_object"); - - glBindFramebufferFn = &glBindFramebufferEXT; - glFramebufferTexture2DFn = &glFramebufferTexture2DEXT; - glFramebufferRenderbufferFn = &glFramebufferRenderbufferEXT; - glGenFramebuffersFn = &glGenFramebuffersEXT; - glDeleteFramebuffersFn = &glDeleteFramebuffersEXT; - glCheckFramebufferStatusFn = &glCheckFramebufferStatusEXT; - - g_isRenderbufferSupported = g_isFramebufferSupported; - - glGenRenderbuffersFn = &glGenRenderbuffersEXT; - glDeleteRenderbuffersFn = &glDeleteRenderbuffersEXT; - glBindRenderbufferFn = &glBindRenderbufferEXT; - glRenderbufferStorageFn = &glRenderbufferStorageEXT; - - g_isSeparateBlendFuncSupported = HasExtension("GL_EXT_blend_func_separate"); - - glBlendFuncSeparateFn = &glBlendFuncSeparateEXT; - glFlushFn = &glFlush; - - glActiveTextureFn = &glActiveTexture; - glGetAttribLocationFn = &glGetAttribLocation; - glGetActiveAttribFn = &glGetActiveAttrib; - glGetUniformLocationFn = &glGetUniformLocation; - glGetActiveUniformFn = &glGetActiveUniform; - glGetProgramInfoLogFn = &glGetProgramInfoLog; - glGetProgramivFn = &glGetProgramiv; - glLinkProgramFn = &glLinkProgram; - glAttachShaderFn = &glAttachShader; - glCreateProgramFn = &glCreateProgram; - glDeleteProgramFn = & glDeleteProgram; - glVertexAttribPointerFn = &glVertexAttribPointer; - glEnableVertexAttribArrayFn = &glEnableVertexAttribArray; - glUniformMatrix4fvFn = &glUniformMatrix4fv; - glUniformMatrix3fvFn = &glUniformMatrix3fv; - glUniformMatrix2fvFn = &glUniformMatrix2fv; - glUniform4iFn = &glUniform4i; - glUniform3iFn = &glUniform3i; - glUniform2iFn = &glUniform2i; - glUniform1iFn = &glUniform1i; - glUniform4fFn = &glUniform4f; - glUniform3fFn = &glUniform3f; - glUniform2fFn = &glUniform2f; - glUniform1fFn = &glUniform1f; - glUseProgramFn = &glUseProgram; - glGetShaderInfoLogFn = &glGetShaderInfoLog; - glGetShaderivFn = &glGetShaderiv; - glCompileShaderFn = &glCompileShader; - // hack to avoid failed compilation on Mac OS X 10.8+ - typedef void (OPENGL_CALLING_CONVENTION * glShaderSourceFn_Type)(GLuint shader, GLsizei count, const GLchar ** string, const GLint *length); - glShaderSourceFn = reinterpret_cast(&glShaderSource); - glCreateShaderFn = &glCreateShader; - glDeleteShaderFn = &glDeleteShader; - } - } -} - diff --git a/graphics/opengl/opengl_glsl_ext.cpp b/graphics/opengl/opengl_glsl_ext.cpp deleted file mode 100644 index 14c757aed6..0000000000 --- a/graphics/opengl/opengl_glsl_ext.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "graphics/opengl/opengl.hpp" - -#include "graphics/opengl/opengl_glsl_impl.hpp" - -#include "base/matrix.hpp" -#include "platform/platform.hpp" - -namespace graphics -{ - namespace gl - { - const int GL_FRAMEBUFFER_BINDING_MWM = GL_FRAMEBUFFER_BINDING_EXT; - const int GL_FRAMEBUFFER_MWM = GL_FRAMEBUFFER_EXT; - const int GL_FRAMEBUFFER_UNSUPPORTED_MWM = GL_FRAMEBUFFER_UNSUPPORTED_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT; - const int GL_FRAMEBUFFER_COMPLETE_MWM = GL_FRAMEBUFFER_COMPLETE_EXT; - - const int GL_DEPTH_ATTACHMENT_MWM = GL_DEPTH_ATTACHMENT_EXT; - const int GL_COLOR_ATTACHMENT0_MWM = GL_COLOR_ATTACHMENT0_EXT; - const int GL_RENDERBUFFER_MWM = GL_RENDERBUFFER_EXT; - const int GL_RENDERBUFFER_BINDING_MWM = GL_RENDERBUFFER_BINDING_EXT; - const int GL_DEPTH_COMPONENT16_MWM = GL_DEPTH_COMPONENT16; - const int GL_DEPTH_COMPONENT24_MWM = GL_DEPTH_COMPONENT24; - const int GL_RGBA8_MWM = GL_RGBA8; - - const int GL_WRITE_ONLY_MWM = GL_WRITE_ONLY; - - void InitExtensions() - { - DumpGLInformation(); - - glEnableFn = &glsl::glEnable; - glDisableFn = &glsl::glDisable; - glAlphaFuncFn = &glsl::glAlphaFunc; - - glVertexPointerFn = &glsl::glVertexPointer; - glNormalPointerFn = &glsl::glNormalPointer; - glTexCoordPointerFn = &glsl::glTexCoordPointer; - glEnableClientStateFn = &glsl::glEnableClientState; - glUseSharpGeometryFn = &glsl::glUseSharpGeometry; - - glMatrixModeFn = &glsl::glMatrixMode; - glLoadIdentityFn = &glsl::glLoadIdentity; - glLoadMatrixfFn = &glsl::glLoadMatrixf; - glOrthoFn = &glsl::glOrtho; - glDrawElementsFn = &glsl::glDrawElements; - - g_isBufferObjectsSupported = true; - - glBindBufferFn = &glBindBuffer; - glGenBuffersFn = &glGenBuffers; - glBufferDataFn = &glBufferData; - glBufferSubDataFn = &glBufferSubData; - glDeleteBuffersFn = &glDeleteBuffers; - - g_isMapBufferSupported = false; //true; - - glMapBufferFn = &glMapBuffer; - glUnmapBufferFn = &glUnmapBuffer; - - g_isFramebufferSupported = HasExtension("GL_ARB_framebuffer_object"); - - glBindFramebufferFn = &glBindFramebufferEXT; - glFramebufferTexture2DFn = &glFramebufferTexture2DEXT; - glFramebufferRenderbufferFn = &glFramebufferRenderbufferEXT; - glGenFramebuffersFn = &glGenFramebuffersEXT; - glDeleteFramebuffersFn = &glDeleteFramebuffersEXT; - glCheckFramebufferStatusFn = &glCheckFramebufferStatusEXT; - - g_isRenderbufferSupported = g_isFramebufferSupported; - - glGenRenderbuffersFn = &glGenRenderbuffersEXT; - glDeleteRenderbuffersFn = &glDeleteRenderbuffersEXT; - glBindRenderbufferFn = &glBindRenderbufferEXT; - glRenderbufferStorageFn = &glRenderbufferStorageEXT; - - g_isSeparateBlendFuncSupported = HasExtension("GL_EXT_blend_func_separate"); - glBlendFuncSeparateFn = &glBlendFuncSeparateEXT; - } - } -} - - diff --git a/graphics/opengl/opengl_glsl_impl.cpp b/graphics/opengl/opengl_glsl_impl.cpp deleted file mode 100644 index 0c6444924d..0000000000 --- a/graphics/opengl/opengl_glsl_impl.cpp +++ /dev/null @@ -1,485 +0,0 @@ -#include "graphics/opengl/opengl_glsl_impl.hpp" - -#include "graphics/opengl/opengl.hpp" - -#include "base/matrix.hpp" -#include "base/thread.hpp" - -#include "std/memcpy.hpp" - -namespace graphics -{ - namespace gl - { - const GLenum GL_MODELVIEW_MWM = 0; - const GLenum GL_PROJECTION_MWM = 1; - - const GLenum GL_VERTEX_ARRAY_MWM = 0; - const GLenum GL_TEXTURE_COORD_ARRAY_MWM = 1; - const GLenum GL_NORMAL_ARRAY_MWM = 2; - - const GLenum GL_ALPHA_TEST_MWM = 0x0BC0; - -#if defined(OMIM_GL_ES) - #define PRECISION "lowp" -#else - #define PRECISION "" -#endif - - namespace glsl - { - /// Vertex Shader Source - - static const char g_vxSrc[] = - "attribute vec4 Position;\n" - "attribute vec2 Normal;\n" - "attribute vec2 TexCoordIn;\n" - "uniform mat4 ProjM;\n" - "uniform mat4 ModelViewM;\n" - "varying vec2 TexCoordOut;\n" - "void main(void) {\n" - " gl_Position = (vec4(Normal, 0.0, 0.0) + Position * ModelViewM) * ProjM;\n" - " TexCoordOut = TexCoordIn;\n" - "}\n"; - - /// Sharp Vertex Shader Source - - static const char g_sharpVxSrc[] = - "attribute vec4 Position;\n" - "attribute vec2 Normal;\n" - "attribute vec2 TexCoordIn;\n" - "uniform mat4 ProjM;\n" - "uniform mat4 ModelViewM;\n" - "varying vec2 TexCoordOut;\n" - "void main(void) {\n" - " gl_Position = floor(vec4(Normal, 0.0, 0.0) + Position * ModelViewM) * ProjM;\n" - " TexCoordOut = TexCoordIn;\n" - "}\n"; - - /// Fragment Shader with alphaTest - - static const char g_alphaTestFrgSrc [] = - "uniform sampler2D Texture;\n" - "varying " PRECISION " vec2 TexCoordOut;\n" - "void main(void) {\n" - " gl_FragColor = texture2D(Texture, TexCoordOut);\n" - " if (gl_FragColor.a == 0.0)\n" - " discard;\n" - "}\n"; - - /// Fragment shader without alphaTest - - static const char g_noAlphaTestFrgSrc[] = - "uniform sampler2D Texture;\n" - "varying " PRECISION " vec2 TexCoordOut;\n" - "void main(void) {\n" - " gl_FragColor = texture2D(Texture, TexCoordOut);\n" - "}\n"; - - /// Structure that holds a single GLSL program - /// along with handles to attributes and uniforms - struct Program - { - GLuint m_program; - GLuint m_positionHandle; - GLuint m_texCoordHandle; - GLuint m_normalHandle; - GLuint m_projectionUniform; - GLuint m_modelViewUniform; - GLuint m_textureUniform; - - bool createProgram(GLuint vertexShader, GLuint fragmentShader) - { - m_program = ::glCreateProgram(); - OGLCHECKAFTER; - - if (!m_program) - return false; - - OGLCHECK(::glAttachShader(m_program, vertexShader)); - OGLCHECK(::glAttachShader(m_program, fragmentShader)); - OGLCHECK(::glLinkProgram(m_program)); - - int linkStatus = GL_FALSE; - OGLCHECK(::glGetProgramiv(m_program, GL_LINK_STATUS, &linkStatus)); - - if (linkStatus != GL_TRUE) - { - int bufLength = 0; - OGLCHECK(::glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &bufLength)); - if (bufLength) - { - char * buf = new char[bufLength]; - ::glGetProgramInfoLog(m_program, bufLength, NULL, buf); - LOG(LINFO, ("Could not link program:")); - LOG(LINFO, (buf)); - delete [] buf; - } - - return false; - } - - return true; - } - - void attachProjection(char const * name) - { - m_projectionUniform = ::glGetUniformLocation(m_program, name); - OGLCHECKAFTER; - } - - void attachModelView(char const * name) - { - m_modelViewUniform = ::glGetUniformLocation(m_program, name); - OGLCHECKAFTER; - } - - void attachTexture(char const * name) - { - m_textureUniform = ::glGetUniformLocation(m_program, name); - OGLCHECKAFTER; - } - - void attachNormal(char const * name) - { - m_normalHandle = ::glGetAttribLocation(m_program, name); - OGLCHECKAFTER; - } - - void attachPosition(char const * name) - { - m_positionHandle = ::glGetAttribLocation(m_program, name); - OGLCHECKAFTER; - } - - void attachTexCoord(char const * name) - { - m_texCoordHandle = ::glGetAttribLocation(m_program, name); - OGLCHECKAFTER; - } - - void apply() - { - OGLCHECK(::glUseProgram(m_program)); - } - }; - - struct ThreadData - { - GLenum m_matrixMode; - math::Matrix m_matrices[2]; - - Program m_noAlphaTestProgram; - Program m_alphaTestProgram; - - Program m_noAlphaTestSharpProgram; - Program m_alphaTestSharpProgram; - - /// currently bound GLSL program - Program * m_currentProgram; - - GLuint m_vxShader; - GLuint m_sharpVxShader; - GLuint m_noAlphaTestFrgSh; - GLuint m_alphaTestFrgSh; - - GLboolean m_useAlphaTest; - GLboolean m_useSharpGeometry; - - Program * selectCurrentProgram() - { - if (m_useAlphaTest) - if (m_useSharpGeometry) - return &m_alphaTestSharpProgram; - else - return &m_alphaTestProgram; - else - if (m_useSharpGeometry) - return &m_noAlphaTestSharpProgram; - else - return &m_noAlphaTestProgram; - } - - void setCurrentProgram(Program * program) - { - if (m_currentProgram != program) - { - m_currentProgram = program; - m_currentProgram->apply(); - } - } - - GLuint loadShader(char const * shaderSource, GLenum shaderType) - { - GLuint res = ::glCreateShader(shaderType); - OGLCHECKAFTER; - - int len = strlen(shaderSource); - - OGLCHECK(::glShaderSource(res, 1, &shaderSource, &len)); - - OGLCHECK(::glCompileShader(res)); - - GLint compileRes; - OGLCHECK(::glGetShaderiv(res, GL_COMPILE_STATUS, &compileRes)); - - if (compileRes == GL_FALSE) - { - GLchar msg[256]; - OGLCHECK(::glGetShaderInfoLog(res, sizeof(msg), 0, msg)); - LOG(LINFO, ("Couldn't compile shader :")); - LOG(LERROR, (msg)); - return 0; - } - - return res; - } - - ThreadData() - : m_matrixMode(-1), - m_vxShader(0), - m_sharpVxShader(0), - m_noAlphaTestFrgSh(0), - m_alphaTestFrgSh(0), - m_useAlphaTest(false), - m_useSharpGeometry(false) - {} - - void Initialize() - { - m_vxShader = loadShader(g_vxSrc, GL_VERTEX_SHADER); - m_sharpVxShader = loadShader(g_sharpVxSrc, GL_VERTEX_SHADER); - - m_noAlphaTestFrgSh = loadShader(g_noAlphaTestFrgSrc, GL_FRAGMENT_SHADER); - m_alphaTestFrgSh = loadShader(g_alphaTestFrgSrc, GL_FRAGMENT_SHADER); - - /// creating program - m_alphaTestProgram.createProgram(m_vxShader, m_alphaTestFrgSh); - m_noAlphaTestProgram.createProgram(m_vxShader, m_noAlphaTestFrgSh); - - m_alphaTestSharpProgram.createProgram(m_sharpVxShader, m_alphaTestFrgSh); - m_noAlphaTestSharpProgram.createProgram(m_sharpVxShader, m_noAlphaTestFrgSh); - - m_alphaTestProgram.attachProjection("ProjM"); - m_alphaTestProgram.attachModelView("ModelViewM"); - m_alphaTestProgram.attachTexture("Texture"); - m_alphaTestProgram.attachPosition("Position"); - m_alphaTestProgram.attachTexCoord("TexCoordIn"); - m_alphaTestProgram.attachNormal("Normal"); - - m_alphaTestSharpProgram.attachProjection("ProjM"); - m_alphaTestSharpProgram.attachModelView("ModelViewM"); - m_alphaTestSharpProgram.attachTexture("Texture"); - m_alphaTestSharpProgram.attachPosition("Position"); - m_alphaTestSharpProgram.attachTexCoord("TexCoordIn"); - m_alphaTestSharpProgram.attachNormal("Normal"); - - m_noAlphaTestProgram.attachProjection("ProjM"); - m_noAlphaTestProgram.attachModelView("ModelViewM"); - m_noAlphaTestProgram.attachTexture("Texture"); - m_noAlphaTestProgram.attachPosition("Position"); - m_noAlphaTestProgram.attachTexCoord("TexCoordIn"); - m_noAlphaTestProgram.attachNormal("Normal"); - - m_noAlphaTestSharpProgram.attachProjection("ProjM"); - m_noAlphaTestSharpProgram.attachModelView("ModelViewM"); - m_noAlphaTestSharpProgram.attachTexture("Texture"); - m_noAlphaTestSharpProgram.attachPosition("Position"); - m_noAlphaTestSharpProgram.attachTexCoord("TexCoordIn"); - m_noAlphaTestSharpProgram.attachNormal("Normal"); - - selectCurrentProgram()->apply(); - } - - void Finalize() - { - if (graphics::gl::g_hasContext) - ::glDeleteProgram(m_alphaTestProgram.m_program); - if (graphics::gl::g_hasContext) - ::glDeleteProgram(m_noAlphaTestProgram.m_program); - if (graphics::gl::g_hasContext) - ::glDeleteProgram(m_alphaTestSharpProgram.m_program); - if (graphics::gl::g_hasContext) - ::glDeleteProgram(m_noAlphaTestSharpProgram.m_program); - if (graphics::gl::g_hasContext) - ::glDeleteShader(m_vxShader); - if (graphics::gl::g_hasContext) - ::glDeleteShader(m_sharpVxShader); - if (graphics::gl::g_hasContext) - ::glDeleteShader(m_noAlphaTestFrgSh); - if (graphics::gl::g_hasContext) - ::glDeleteShader(m_alphaTestFrgSh); - } - }; - - typedef map ThreadDataMap; - ThreadDataMap g_threadData; - - void glEnable(GLenum cap) - { - if (cap == GL_ALPHA_TEST_MWM) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - threadData.m_useAlphaTest = true; - } - else - ::glEnable(cap); - } - - void glDisable(GLenum cap) - { - if (cap == GL_ALPHA_TEST_MWM) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - threadData.m_useAlphaTest = false; - } - else - ::glDisable(cap); - } - - void glAlphaFunc(GLenum func, GLclampf ref) - { - ASSERT((func == GL_NOTEQUAL) && (ref == 0.0), ("only GL_NOEQUAL with 0.0 reference value is supported for alphaTest")); - } - - void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - ::glVertexAttribPointer(threadData.m_alphaTestProgram.m_positionHandle, size, type, GL_FALSE, stride, pointer); - ::glVertexAttribPointer(threadData.m_noAlphaTestProgram.m_positionHandle, size, type, GL_FALSE, stride, pointer); - } - - void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - ::glVertexAttribPointer(threadData.m_alphaTestProgram.m_texCoordHandle, size, type, GL_FALSE, stride, pointer); - ::glVertexAttribPointer(threadData.m_noAlphaTestProgram.m_texCoordHandle, size, type, GL_FALSE, stride, pointer); - } - - void glNormalPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - ::glVertexAttribPointer(threadData.m_alphaTestProgram.m_normalHandle, size, type, GL_FALSE, stride, pointer); - ::glVertexAttribPointer(threadData.m_noAlphaTestProgram.m_normalHandle, size, type, GL_FALSE, stride, pointer); - } - - void glEnableClientState(GLenum array) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - switch (array) - { - case GL_VERTEX_ARRAY_MWM: - ::glEnableVertexAttribArray(threadData.m_alphaTestProgram.m_positionHandle); - ::glEnableVertexAttribArray(threadData.m_noAlphaTestProgram.m_positionHandle); - break; - case GL_TEXTURE_COORD_ARRAY_MWM: - ::glEnableVertexAttribArray(threadData.m_alphaTestProgram.m_texCoordHandle); - ::glEnableVertexAttribArray(threadData.m_noAlphaTestProgram.m_texCoordHandle); - break; - case GL_NORMAL_ARRAY_MWM: - ::glEnableVertexAttribArray(threadData.m_alphaTestProgram.m_normalHandle); - ::glEnableVertexAttribArray(threadData.m_noAlphaTestProgram.m_normalHandle); - break; - default: - LOG(LERROR, ("Unknown option is passed to glEnableClientState")); - }; - } - - void glUseSharpGeometry(GLboolean flag) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - threadData.m_useSharpGeometry = flag; - } - - void glMatrixMode(GLenum mode) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - threadData.m_matrixMode = mode; - } - - void glLoadIdentity() - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - threadData.m_matrices[threadData.m_matrixMode] = math::Identity(); - } - - void glLoadMatrixf(GLfloat const * d) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - - math::Matrix m; - - m(0, 0) = d[0]; m(0, 1) = d[1]; m(0, 2) = d[2]; m(0, 3) = d[3]; - m(1, 0) = d[4]; m(1, 1) = d[5]; m(1, 2) = d[6]; m(1, 3) = d[7]; - m(2, 0) = d[8]; m(2, 1) = d[9]; m(2, 2) = d[10]; m(2, 3) = d[11]; - m(3, 0) = d[12]; m(3, 1) = d[13]; m(3, 2) = d[14]; m(3, 3) = d[15]; - - threadData.m_matrices[threadData.m_matrixMode] = m * threadData.m_matrices[threadData.m_matrixMode]; - } - - void glOrtho(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - - math::Matrix m = math::Identity(); - - m(0, 0) = 2 / (r - l); m(0, 1) = 0; m(0, 2) = 0; m(0, 3) = -(r + l) / (r - l); - m(1, 0) = 0; m(1, 1) = 2 / (t - b);m(1, 2) = 0; m(1, 3) = -(t + b) / (t - b); - m(2, 0) = 0; m(2, 1) = 0; m(2, 2) = -2 / (f - n); m(2, 3) = - (f + n) / (f - n); - m(3, 0) = 0; m(3, 1) = 0; m(3, 2) = 0; m(3, 3) = 1; - - threadData.m_matrices[threadData.m_matrixMode] = m * threadData.m_matrices[threadData.m_matrixMode]; - } - - void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) - { - ThreadData & threadData = g_threadData[threads::GetCurrentThreadID()]; - - math::Matrix const & projM = threadData.m_matrices[GL_PROJECTION_MWM]; - math::Matrix const & modelViewM = threadData.m_matrices[GL_MODELVIEW_MWM]; - - threadData.setCurrentProgram(threadData.selectCurrentProgram()); - - // applying shader parameters - OGLCHECK(::glUniformMatrix4fv(threadData.m_currentProgram->m_projectionUniform, 1, 0, &projM(0, 0))); - OGLCHECK(::glUniformMatrix4fv(threadData.m_currentProgram->m_modelViewUniform, 1, 0, &modelViewM(0, 0))); - OGLCHECK(::glUniform1i(threadData.m_currentProgram->m_textureUniform, 0)); - - // drawing elements - OGLCHECK(::glDrawElements(mode, count, type, indices)); - } - } - - void InitializeThread() - { - threads::ThreadID id = threads::GetCurrentThreadID(); - glsl::ThreadDataMap::const_iterator it = glsl::g_threadData.find(id); - - if (it != glsl::g_threadData.end()) - { - LOG(LWARNING, ("GLSL structures for thread", threads::GetCurrentThreadID(), "is already initialized")); - return; - } - - LOG(LINFO, ("initializing GLSL structures for thread", threads::GetCurrentThreadID())); - glsl::g_threadData[id].Initialize(); - } - - void FinalizeThread() - { - threads::ThreadID id = threads::GetCurrentThreadID(); - glsl::ThreadDataMap::const_iterator it = glsl::g_threadData.find(id); - - if (it == glsl::g_threadData.end()) - { - LOG(LWARNING, ("GLSL structures for thread", threads::GetCurrentThreadID(), "is already finalized")); - return; - } - - LOG(LINFO, ("finalizing GLSL structures for thread", threads::GetCurrentThreadID())); - - glsl::g_threadData[id].Finalize(); - glsl::g_threadData.erase(id); - } - } -} diff --git a/graphics/opengl/opengl_glsl_impl.hpp b/graphics/opengl/opengl_glsl_impl.hpp deleted file mode 100644 index c6178e27fc..0000000000 --- a/graphics/opengl/opengl_glsl_impl.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - namespace glsl - { - void glEnable(GLenum cap); - void glDisable(GLenum cap); - void glAlphaFunc(GLenum func, GLclampf ref); - - void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - void glNormalPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); - void glEnableClientState(GLenum array); - - void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); - void glOrtho(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); - void glLoadIdentity(); - void glLoadMatrixf(GLfloat const * data); - void glMatrixMode(GLenum mode); - - void glUseSharpGeometry(GLboolean flag); - } - } -} diff --git a/graphics/opengl/opengl_win32.cpp b/graphics/opengl/opengl_win32.cpp deleted file mode 100644 index 72b96768b5..0000000000 --- a/graphics/opengl/opengl_win32.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include "graphics/opengl/opengl.hpp" - -//#include "../../3party/GL/glext.h" - -#include "base/logging.hpp" - - -namespace graphics -{ - namespace gl - { - const int GL_FRAMEBUFFER_BINDING_MWM = GL_FRAMEBUFFER_BINDING_EXT; - const int GL_FRAMEBUFFER_MWM = GL_FRAMEBUFFER_EXT; - const int GL_FRAMEBUFFER_UNSUPPORTED_MWM = GL_FRAMEBUFFER_UNSUPPORTED_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_MWM = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT; - const int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_MWM = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT; - const int GL_FRAMEBUFFER_COMPLETE_MWM = GL_FRAMEBUFFER_COMPLETE_EXT; - - const int GL_DEPTH_ATTACHMENT_MWM = GL_DEPTH_ATTACHMENT_EXT; - const int GL_COLOR_ATTACHMENT0_MWM = GL_COLOR_ATTACHMENT0_EXT; - const int GL_RENDERBUFFER_MWM = GL_RENDERBUFFER_EXT; - const int GL_RENDERBUFFER_BINDING_MWM = GL_RENDERBUFFER_BINDING_EXT; - const int GL_DEPTH_COMPONENT16_MWM = GL_DEPTH_COMPONENT16; - const int GL_DEPTH_COMPONENT24_MWM = GL_DEPTH_COMPONENT24; - const int GL_RGBA8_MWM = GL_RGBA8; - const int GL_RGBA4_MWM = GL_RGBA4; - - const int GL_WRITE_ONLY_MWM = GL_WRITE_ONLY; - - //GL_FRAMEBUFFER_BINDING = GL_FRAMEBUFFER_BINDING_EXT; - - template - void AssignGLProc(HMODULE, char const * name, T & res) - { - PROC p = ::wglGetProcAddress(name); - if (p == 0) - { - DWORD const err = ::GetLastError(); - LOG(LINFO, ("OpenGL extension function ", name, " not found. Last error = ", err)); - } - res = reinterpret_cast(p); - } - - void InitExtensions() - { - HMODULE hInst = 0; - - // Loading procedures, trying "EXT" suffix if alias doesn't exist - -#define DEFINE_GL_PROC(name, fn) \ - AssignGLProc(hInst, name, fn); \ - if (fn == NULL) \ - { \ - string const extName = string(name) + "EXT"; \ - AssignGLProc(hInst, extName.c_str(), fn); \ - } -#include "graphics/opengl/gl_procedures.inl" -#undef DEFINE_GL_PROC - - // glFlush is a globally defined function - glFlushFn = &glFlush; - - graphics::gl::g_isBufferObjectsSupported = glBindBufferFn - && glGenBuffersFn - && glBufferDataFn - && glBufferSubDataFn - && glDeleteBuffersFn; - - graphics::gl::g_isMapBufferSupported = glMapBufferFn - && glUnmapBufferFn; - - graphics::gl::g_isFramebufferSupported = glBindFramebufferFn - && glFramebufferTexture2DFn - && glFramebufferRenderbufferFn - && glGenFramebuffersFn - && glDeleteFramebuffersFn - && glCheckFramebufferStatusFn; - - graphics::gl::g_isRenderbufferSupported = glGenRenderbuffersFn - && glDeleteRenderbuffersFn - && glBindRenderbufferFn - && glRenderbufferStorageFn; - - graphics::gl::g_isSeparateBlendFuncSupported = false; - } - } -} // namespace win32 diff --git a/graphics/opengl/program.cpp b/graphics/opengl/program.cpp deleted file mode 100644 index ea3b200b9f..0000000000 --- a/graphics/opengl/program.cpp +++ /dev/null @@ -1,432 +0,0 @@ -#include "graphics/opengl/program.hpp" -#include "graphics/opengl/shader.hpp" -#include "graphics/opengl/buffer_object.hpp" -#include "graphics/opengl/defines_conv.hpp" -#include "base/thread.hpp" - -#include "std/bind.hpp" -#include "graphics/vertex_decl.hpp" - -namespace graphics -{ - namespace gl - { - Program::Program(shared_ptr const & vxShader, - shared_ptr const & frgShader) - { - m_handle = glCreateProgramFn(); - OGLCHECKAFTER; - - if (!m_handle) - throw Exception("CreateProgram error", "could not create Program!"); - - OGLCHECK(glAttachShaderFn(m_handle, vxShader->id())); - OGLCHECK(glAttachShaderFn(m_handle, frgShader->id())); - - OGLCHECK(glLinkProgramFn(m_handle)); - - int linkStatus = GL_FALSE; - OGLCHECK(glGetProgramivFn(m_handle, GL_LINK_STATUS, &linkStatus)); - - if (linkStatus != GL_TRUE) - { - int bufLength = 0; - OGLCHECK(glGetProgramivFn(m_handle, GL_INFO_LOG_LENGTH, &bufLength)); - if (bufLength) - { - vector v; - v.resize(bufLength); - glGetProgramInfoLogFn(m_handle, bufLength, NULL, &v[0]); - - throw LinkException("Could not link program: ", &v[0]); - } - - throw LinkException("Could not link program: ", "Unknown link error"); - } - - /// getting all uniforms - int cnt = 0; - - OGLCHECK(glGetProgramivFn(m_handle, GL_ACTIVE_UNIFORMS, &cnt)); - - GLchar name[1024]; - GLsizei len = 0; - GLint size; - GLenum type; - - for (unsigned i = 0; i < cnt; ++i) - { - Uniform f; - ESemantic sem; - - OGLCHECK(glGetActiveUniformFn(m_handle, i, ARRAY_SIZE(name), &len, &size, &type, name)); - - f.m_handle = glGetUniformLocationFn(m_handle, name); - OGLCHECKAFTER; - - convert(type, f.m_type); - convert(name, sem); - - m_uniforms[sem] = f; - } - - OGLCHECK(glGetProgramivFn(m_handle, GL_ACTIVE_ATTRIBUTES, &cnt)); - - for (unsigned i = 0; i < cnt; ++i) - { - Attribute a; - ESemantic sem; - - OGLCHECK(glGetActiveAttribFn(m_handle, i, ARRAY_SIZE(name), &len, &size, &type, name)); - - a.m_handle = glGetAttribLocationFn(m_handle, name); - OGLCHECKAFTER; - - convert(type, a.m_type, a.m_count); - convert(name, sem); - - m_attributes[sem] = a; - } - } - - Program::~Program() - { - OGLCHECK(glDeleteProgramFn(m_handle)); - } - - bool Program::isParamExist(ESemantic sem) const - { - return m_uniforms.find(sem) != m_uniforms.end(); - } - - void Program::setParam(ESemantic sem, float v0) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = EFloat; - if (f.m_data.m_floatVal[0] != v0) - { - f.m_data.m_floatVal[0] = v0; - f.m_changed = true; - } - } - - void Program::setParam(ESemantic sem, float v0, float v1) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = EFloatVec2; - if (f.m_data.m_floatVal[0] != v0 || - f.m_data.m_floatVal[1] != v1) - { - f.m_data.m_floatVal[0] = v0; - f.m_data.m_floatVal[1] = v1; - f.m_changed = true; - } - } - - void Program::setParam(ESemantic sem, float v0, float v1, float v2) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = EFloatVec3; - if (f.m_data.m_floatVal[0] != v0 || - f.m_data.m_floatVal[1] != v1 || - f.m_data.m_floatVal[2] != v2) - { - f.m_data.m_floatVal[0] = v0; - f.m_data.m_floatVal[1] = v1; - f.m_data.m_floatVal[2] = v2; - f.m_changed = true; - } - } - - void Program::setParam(ESemantic sem, float v0, float v1, float v2, float v3) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = EFloatVec4; - if (f.m_data.m_floatVal[0] != v0 || - f.m_data.m_floatVal[1] != v1 || - f.m_data.m_floatVal[2] != v2 || - f.m_data.m_floatVal[3] != v3) - { - f.m_data.m_floatVal[0] = v0; - f.m_data.m_floatVal[1] = v1; - f.m_data.m_floatVal[2] = v2; - f.m_data.m_floatVal[3] = v3; - f.m_changed = true; - } - } - - void Program::setParam(ESemantic sem, int v0) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = EInteger; - if (f.m_data.m_intVal[0] != v0) - { - f.m_data.m_intVal[0] = v0; - f.m_changed = true; - } - } - - void Program::setParam(ESemantic sem, int v0, int v1) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = EIntegerVec2; - if (f.m_data.m_intVal[0] != v0 || - f.m_data.m_intVal[1] != v1) - { - f.m_data.m_intVal[0] = v0; - f.m_data.m_intVal[1] = v1; - f.m_changed = true; - } - } - - void Program::setParam(ESemantic sem, int v0, int v1, int v2) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = EIntegerVec3; - if (f.m_data.m_intVal[0] != v0 || - f.m_data.m_intVal[1] != v1 || - f.m_data.m_intVal[2] != v2) - { - f.m_data.m_intVal[0] = v0; - f.m_data.m_intVal[1] = v1; - f.m_data.m_intVal[2] = v2; - f.m_changed = true; - } - } - - void Program::setParam(ESemantic sem, int v0, int v1, int v2, int v3) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = EIntegerVec4; - if (f.m_data.m_intVal[0] != v0 || - f.m_data.m_intVal[1] != v1 || - f.m_data.m_intVal[2] != v2 || - f.m_data.m_intVal[3] != v3) - { - f.m_data.m_intVal[0] = v0; - f.m_data.m_intVal[1] = v1; - f.m_data.m_intVal[2] = v2; - f.m_data.m_intVal[3] = v3; - f.m_changed = true; - } - } - - template - void Program::setParamImpl(ESemantic sem, - EDataType dt, - math::Matrix const & m) - { - map::iterator it = m_uniforms.find(sem); - ASSERT(it != m_uniforms.end(), ()); - Uniform & f = it->second; - - f.m_type = dt; - if (!equal(&m(0, 0), &m(0, 0) + N * N, f.m_data.m_matVal)) - { - copy(&m(0, 0), &m(0, 0) + N * N, f.m_data.m_matVal); - f.m_changed = true; - } - } - - void Program::setParam(ESemantic sem, math::Matrix const & m) - { - setParamImpl(sem, EFloatMat2, m); - } - - void Program::setParam(ESemantic sem, math::Matrix const & m) - { - setParamImpl(sem, EFloatMat3, m); - } - - void Program::setParam(ESemantic sem, math::Matrix const & m) - { - setParamImpl(sem, EFloatMat4, m); - } - - void Program::setVertexDecl(VertexDecl const * decl) - { - for (size_t i = 0; i < decl->attrCount(); ++i) - { - VertexAttrib const * va = decl->getAttr(i); - - map::iterator it = m_attributes.find(va->m_semantic); - ASSERT(it != m_attributes.end(), ()); - Attribute & a = it->second; - - a.m_offset = va->m_offset; - a.m_stride = va->m_stride; - a.m_count = va->m_elemCount; - - /// a.m_count could be different from va->m_elemCount - /// as GLSL could provide missing attribute components - /// with default values according to internal rules. - /// (f.e. all components except 4th in vec4 are made 0 - /// by default, and 4th is 1 by default). - -// ASSERT(a.m_count == va->m_elemCount, ()); - ASSERT(a.m_type == va->m_elemType, ()); - } - } - - void Program::setStorage(Storage const & storage) - { - m_storage = storage; - } - - void Program::applyAttributes() - { - /// setting all attributes streams; - for (TAttributes::const_iterator it = m_attributes.begin(); - it != m_attributes.end(); - ++it) - { - Attribute const & a = it->second; - - GLenum t; - convert(a.m_type, t); - - OGLCHECK(glEnableVertexAttribArrayFn(a.m_handle)); - OGLCHECK(glVertexAttribPointerFn(a.m_handle, - a.m_count, - t, - false, - a.m_stride, - (void*)((unsigned char *)m_storage.m_vertices->glPtr() + a.m_offset))); - } - } - - void Program::applyUniforms() - { - /// setting all uniforms - typedef pair TNode; - for (TNode & node : m_uniforms) - { - Uniform & u = node.second; - if (!u.m_changed) - continue; - - u.m_changed = false; - - switch (u.m_type) - { - case EFloat: - OGLCHECK(glUniform1fFn(u.m_handle, - u.m_data.m_floatVal[0])); - break; - case EFloatVec2: - OGLCHECK(glUniform2fFn(u.m_handle, - u.m_data.m_floatVal[0], - u.m_data.m_floatVal[1])); - break; - case EFloatVec3: - OGLCHECK(glUniform3fFn(u.m_handle, - u.m_data.m_floatVal[0], - u.m_data.m_floatVal[1], - u.m_data.m_floatVal[2])); - break; - case EFloatVec4: - OGLCHECK(glUniform4fFn(u.m_handle, - u.m_data.m_floatVal[0], - u.m_data.m_floatVal[1], - u.m_data.m_floatVal[2], - u.m_data.m_floatVal[3])); - break; - case EInteger: - OGLCHECK(glUniform1iFn(u.m_handle, - u.m_data.m_intVal[0])); - break; - case EIntegerVec2: - OGLCHECK(glUniform2iFn(u.m_handle, - u.m_data.m_intVal[0], - u.m_data.m_intVal[1])); - break; - case EIntegerVec3: - OGLCHECK(glUniform3iFn(u.m_handle, - u.m_data.m_intVal[0], - u.m_data.m_intVal[1], - u.m_data.m_intVal[2])); - break; - case EIntegerVec4: - OGLCHECK(glUniform4iFn(u.m_handle, - u.m_data.m_intVal[0], - u.m_data.m_intVal[1], - u.m_data.m_intVal[2], - u.m_data.m_intVal[3])); - break; - case EFloatMat2: - OGLCHECK(glUniformMatrix2fvFn(u.m_handle, - 1, - false, - u.m_data.m_matVal)); - break; - case EFloatMat3: - OGLCHECK(glUniformMatrix3fvFn(u.m_handle, - 1, - false, - u.m_data.m_matVal)); - break; - case EFloatMat4: - OGLCHECK(glUniformMatrix4fvFn(u.m_handle, - 1, - false, - u.m_data.m_matVal)); - break; - case ESampler2D: - OGLCHECK(glUniform1iFn(u.m_handle, - u.m_data.m_intVal[0])); - break; - } - } - } - - void Program::makeCurrent(gl::BufferObject::Binder & verticesBufBinder, gl::BufferObject::Binder & indicesBufBinder) - { - if (m_changed) - { - - OGLCHECK(glUseProgramFn(m_handle)); - m_changed = false; - } - - m_storage.m_vertices->makeCurrent(verticesBufBinder); - - applyAttributes(); - - m_storage.m_indices->makeCurrent(indicesBufBinder); - - applyUniforms(); - } - - void Program::riseChangedFlag() - { - m_changed = true; - } - } - -} - - diff --git a/graphics/opengl/program.hpp b/graphics/opengl/program.hpp deleted file mode 100644 index dee0d58d9f..0000000000 --- a/graphics/opengl/program.hpp +++ /dev/null @@ -1,102 +0,0 @@ -#pragma once - -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/storage.hpp" -#include "graphics/opengl/buffer_object.hpp" - -#include "graphics/defines.hpp" - -#include "base/matrix.hpp" -#include "base/exception.hpp" - -#include "std/shared_ptr.hpp" -#include "std/function.hpp" -#include "std/string.hpp" - -namespace graphics -{ - class VertexDecl; - namespace gl - { - class Shader; - - class Program - { - private: - - void applyAttributes(); - void applyUniforms(); - - struct Uniform - { - struct Data - { - float m_matVal[4 * 4]; - int m_intVal[4]; - float m_floatVal[4]; - } m_data; - EDataType m_type; - GLint m_handle; - bool m_changed = true; - }; - - struct Attribute - { - GLint m_handle; - size_t m_offset; - EDataType m_type; - size_t m_count; - size_t m_stride; - }; - - bool m_changed = true; - GLuint m_handle; - - typedef map TUniforms; - TUniforms m_uniforms; - - typedef map TAttributes; - TAttributes m_attributes; - - Storage m_storage; - - template - void setParamImpl(ESemantic sem, - EDataType dt, - math::Matrix const & m); - - public: - - DECLARE_EXCEPTION(Exception, RootException); - DECLARE_EXCEPTION(LinkException, Exception); - - Program(shared_ptr const & vxShader, - shared_ptr const & frgShader); - - ~Program(); - - bool isParamExist(ESemantic sem) const; - - void setParam(ESemantic sem, float v0); - void setParam(ESemantic sem, float v0, float v1); - void setParam(ESemantic sem, float v0, float v1, float v2); - void setParam(ESemantic sem, float v0, float v1, float v2, float v3); - - void setParam(ESemantic sem, int v0); - void setParam(ESemantic sem, int v0, int v1); - void setParam(ESemantic sem, int v0, int v1, int v2); - void setParam(ESemantic sem, int v0, int v1, int v2, int v3); - - void setParam(ESemantic sem, math::Matrix const & m); - void setParam(ESemantic sem, math::Matrix const & m); - void setParam(ESemantic sem, math::Matrix const & m); - - void setVertexDecl(VertexDecl const * decl); - - void setStorage(Storage const & storage); - - void makeCurrent(gl::BufferObject::Binder & verticesBufBinder, gl::BufferObject::Binder & indicesBufBinder); - void riseChangedFlag(); - }; - } -} diff --git a/graphics/opengl/program_manager.cpp b/graphics/opengl/program_manager.cpp deleted file mode 100644 index 3f2ebd2a6c..0000000000 --- a/graphics/opengl/program_manager.cpp +++ /dev/null @@ -1,177 +0,0 @@ -#include "graphics/opengl/program_manager.hpp" -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - -#if defined(OMIM_GL_ES) - #define PRECISION "lowp" - #define PRECISION_ROUTE "precision highp float;\n" -#else - #define PRECISION "" - #define PRECISION_ROUTE "" -#endif - - ProgramManager::ProgramManager() - { - /// Vertex Shader Source - static const char vxSrc[] = - "attribute vec4 Position;\n" - "attribute vec2 Normal;\n" - "attribute vec2 TexCoord0;\n" - "uniform mat4 Projection;\n" - "uniform mat4 ModelView;\n" - "varying vec2 TexCoordOut0;\n" - "void main(void) {\n" - " gl_Position = (vec4(Normal, 0.0, 0.0) + Position * ModelView) * Projection;\n" - " TexCoordOut0 = TexCoord0;\n" - "}\n"; - - m_vxShaders[EVxTextured].reset(new Shader(vxSrc, EVertexShader)); - - /// Sharp Vertex Shader Source - - static const char sharpVxSrc[] = - "attribute vec4 Position;\n" - "attribute vec2 Normal;\n" - "attribute vec2 TexCoord0;\n" - "uniform mat4 Projection;\n" - "uniform mat4 ModelView;\n" - "varying vec2 TexCoordOut0;\n" - "void main(void) {\n" - " gl_Position = floor(vec4(Normal, 0.0, 0.0) + Position * ModelView) * Projection;\n" - " TexCoordOut0 = TexCoord0;\n" - "}\n"; - - m_vxShaders[EVxSharp].reset(new Shader(sharpVxSrc, EVertexShader)); - - /// Fragment Shader with alphaTest - - static const char alphaTestFrgSrc [] = - "uniform sampler2D Sampler0;\n" - "varying " PRECISION " vec2 TexCoordOut0;\n" - "void main(void) {\n" - " gl_FragColor = texture2D(Sampler0, TexCoordOut0);\n" - " if (gl_FragColor.a == 0.0)\n" - " discard;\n" - "}\n"; - - m_frgShaders[EFrgAlphaTest].reset(new Shader(alphaTestFrgSrc, EFragmentShader)); - - /// Fragment shader without alphaTest - - static const char noAlphaTestFrgSrc[] = - "uniform sampler2D Sampler0;\n" - "varying " PRECISION " vec2 TexCoordOut0;\n" - "void main(void) {\n" - " gl_FragColor = texture2D(Sampler0, TexCoordOut0);\n" - "}\n"; - m_frgShaders[EFrgNoAlphaTest].reset(new Shader(noAlphaTestFrgSrc, EFragmentShader)); - - static const char uniformAlfaFrgSrc[] = - "uniform sampler2D Sampler0;\n" - "uniform " PRECISION " float Transparency;\n" - "varying " PRECISION " vec2 TexCoordOut0;\n" - "void main(void) {\n" - " " PRECISION " vec4 color = texture2D(Sampler0, TexCoordOut0);\n" - " " PRECISION " float t = color.a;\n" - " if (t > Transparency)\n" - " t = Transparency;\n" - " if (t < 0.05)\n" - " discard;\n" - " gl_FragColor = vec4(color.rgb, t);\n" - "}\n"; - - m_frgShaders[EFrgVarAlfa].reset(new Shader(uniformAlfaFrgSrc, EFragmentShader)); - - static const char routeVxSrc[] = - PRECISION_ROUTE - "attribute vec3 Position;\n" - "attribute vec2 Normal;\n" - "attribute vec3 Length;\n" - "uniform mat4 ModelView;\n" - "uniform mat4 Projection;\n" - "uniform vec2 u_halfWidth;\n" - "varying vec2 v_length;\n" - "void main(void)\n" - "{\n" - " float normalLen = length(Normal);\n" - " vec2 transformedAxisPos = (vec4(Position.xy, 0.0, 1.0) * ModelView).xy;\n" - " vec2 len = vec2(Length.x, Length.z);\n" - " if (u_halfWidth.x != 0.0 && normalLen != 0.0)\n" - " {\n" - " vec2 norm = Normal * u_halfWidth.x;\n" - " float actualHalfWidth = length(norm);\n" - " vec4 glbShiftPos = vec4(Position.xy + norm, 0.0, 1.0);\n" - " vec2 shiftPos = (glbShiftPos * ModelView).xy;\n" - " transformedAxisPos = transformedAxisPos + normalize(shiftPos - transformedAxisPos) * actualHalfWidth;\n" - " if (u_halfWidth.y != 0.0)\n" - " len = vec2(Length.x + Length.y * u_halfWidth.y, Length.z);\n" - " }\n" - " v_length = len;\n" - " gl_Position = vec4(transformedAxisPos, 0.0, 1.0) * Projection;\n" - "}\n"; - - m_vxShaders[EVxRoute].reset(new Shader(routeVxSrc, EVertexShader)); - - static const char routeFrgSrc[] = - PRECISION_ROUTE - "varying vec2 v_length;\n" - "uniform vec4 u_color;\n" - "uniform float u_clipLength;\n" - "void main(void)\n" - "{\n" - " vec4 color = u_color;\n" - " if (v_length.x < u_clipLength)\n" - " color.a = 0.0;\n" - " gl_FragColor = color;\n" - "}\n"; - - m_frgShaders[EFrgRoute].reset(new Shader(routeFrgSrc, EFragmentShader)); - - static const char routeArrowFrgSrc[] = - PRECISION_ROUTE - "varying vec2 v_length;\n" - "uniform sampler2D Sampler0;\n" - "uniform vec4 u_textureRect;\n" - "void main(void)\n" - "{\n" - " float u = clamp(v_length.x, 0.0, 1.0);\n" - " float v = 0.5 * v_length.y + 0.5;\n" - " vec2 uv = vec2(mix(u_textureRect.x, u_textureRect.z, u), mix(u_textureRect.y, u_textureRect.w, v));\n" - " vec4 color = texture2D(Sampler0, uv);\n" - " gl_FragColor = color;\n" - "}\n"; - - m_frgShaders[EFrgRouteArrow].reset(new Shader(routeArrowFrgSrc, EFragmentShader)); - - getProgram(EVxTextured, EFrgAlphaTest); - getProgram(EVxTextured, EFrgNoAlphaTest); - getProgram(EVxTextured, EFrgVarAlfa); - - getProgram(EVxSharp, EFrgAlphaTest); - getProgram(EVxSharp, EFrgNoAlphaTest); - - getProgram(EVxRoute, EFrgRoute); - getProgram(EVxRoute, EFrgRouteArrow); - } - - shared_ptr const ProgramManager::getProgram(EVxType vxType, - EFrgType frgType) - { - pair key(vxType, frgType); - - map, shared_ptr >::const_iterator it = m_programs.find(key); - if (it != m_programs.end()) - return it->second; - - shared_ptr program(new Program(m_vxShaders[vxType], m_frgShaders[frgType])); - - m_programs[key] = program; - - return program; - } - } -} diff --git a/graphics/opengl/program_manager.hpp b/graphics/opengl/program_manager.hpp deleted file mode 100644 index 5bd0c3b10f..0000000000 --- a/graphics/opengl/program_manager.hpp +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include "graphics/opengl/program.hpp" -#include "graphics/opengl/shader.hpp" - -#include "std/shared_ptr.hpp" -#include "std/map.hpp" -#include "std/string.hpp" - -namespace graphics -{ - namespace gl - { - enum EVxType - { - EVxTextured, - EVxSharp, - EVxRoute - }; - - enum EFrgType - { - EFrgAlphaTest, - EFrgNoAlphaTest, - EFrgVarAlfa, - EFrgRoute, - EFrgRouteArrow - }; - - class ProgramManager - { - private: - - map > m_vxShaders; - map > m_frgShaders; - map , shared_ptr > m_programs; - - public: - - ProgramManager(); - - shared_ptr const getProgram(EVxType vxType, - EFrgType frgType); - }; - } -} diff --git a/graphics/opengl/renderbuffer.cpp b/graphics/opengl/renderbuffer.cpp deleted file mode 100644 index 2708974fd7..0000000000 --- a/graphics/opengl/renderbuffer.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "graphics/opengl/renderbuffer.hpp" -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/utils.hpp" - -#include "base/logging.hpp" -#include "base/assert.hpp" - -#include "std/list.hpp" - -namespace graphics -{ - namespace gl - { - RenderBuffer::RenderBuffer(size_t width, size_t height, bool isDepthBuffer, bool isRgba4) - : m_id(0), m_isDepthBuffer(isDepthBuffer), m_width(width), m_height(height) - { - OGLCHECK(glGenRenderbuffersFn(1, &m_id)); - - makeCurrent(); - - GLenum target = GL_RENDERBUFFER_MWM; - GLenum internalFormat = m_isDepthBuffer ? GL_DEPTH_COMPONENT16_MWM : GL_RGBA8_MWM; - - if (m_isDepthBuffer == false && isRgba4 == true) - internalFormat = GL_RGBA4_MWM; - - if (m_isDepthBuffer == false) - LOG(LDEBUG, ("Color buffer format : ", internalFormat)); - OGLCHECK(glRenderbufferStorageFn(target, - internalFormat, - m_width, - m_height)); - } - - RenderBuffer::~RenderBuffer() - { - if (g_hasContext) - OGLCHECK(glDeleteRenderbuffersFn(1, &m_id)); - } - - unsigned int RenderBuffer::id() const - { - return m_id; - } - - void RenderBuffer::attachToFrameBuffer() - { - OGLCHECK(glFramebufferRenderbufferFn( - GL_FRAMEBUFFER_MWM, - isDepthBuffer() ? GL_DEPTH_ATTACHMENT_MWM : GL_COLOR_ATTACHMENT0_MWM, - GL_RENDERBUFFER_MWM, - id())); - } - - void RenderBuffer::detachFromFrameBuffer() - { - OGLCHECK(glFramebufferRenderbufferFn( - GL_FRAMEBUFFER_MWM, - isDepthBuffer() ? GL_DEPTH_ATTACHMENT_MWM : GL_COLOR_ATTACHMENT0_MWM, - GL_RENDERBUFFER_MWM, - 0)); - } - - void RenderBuffer::makeCurrent() const - { - OGLCHECK(glBindRenderbufferFn(GL_RENDERBUFFER_MWM, m_id)); - } - - bool RenderBuffer::isDepthBuffer() const - { - return m_isDepthBuffer; - } - - unsigned RenderBuffer::width() const - { - return m_width; - } - - unsigned RenderBuffer::height() const - { - return m_height; - } - } -} diff --git a/graphics/opengl/renderbuffer.hpp b/graphics/opengl/renderbuffer.hpp deleted file mode 100644 index 22577958cb..0000000000 --- a/graphics/opengl/renderbuffer.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" -#include "graphics/render_target.hpp" -#include "graphics/data_formats.hpp" - -namespace graphics -{ - namespace gl - { - class RenderBuffer : public RenderTarget - { - private: - - mutable unsigned int m_id; - bool m_isDepthBuffer; - - size_t m_width; - size_t m_height; - - public: - - // Create depth buffer - RenderBuffer(size_t width, size_t height, bool isDepthBuffer = false, bool isRgba4 = false); - ~RenderBuffer(); - - unsigned int id() const; - void makeCurrent() const; - - void attachToFrameBuffer(); - void detachFromFrameBuffer(); - - bool isDepthBuffer() const; - - static int current(); - - unsigned width() const; - unsigned height() const; - }; - } -} diff --git a/graphics/opengl/renderer.cpp b/graphics/opengl/renderer.cpp deleted file mode 100644 index cb5b76623c..0000000000 --- a/graphics/opengl/renderer.cpp +++ /dev/null @@ -1,326 +0,0 @@ -#include "base/logging.hpp" - -#include "graphics/resource_manager.hpp" -#include "graphics/render_context.hpp" -#include "graphics/coordinates.hpp" - -#include "graphics/opengl/renderer.hpp" -#include "graphics/opengl/data_traits.hpp" -#include "graphics/opengl/utils.hpp" -#include "graphics/opengl/framebuffer.hpp" -#include "graphics/opengl/renderbuffer.hpp" -#include "graphics/opengl/base_texture.hpp" -#include "graphics/opengl/program.hpp" -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - const graphics::Color Renderer::s_bgColor(192, 192, 192, 255); - - Renderer::Params::Params() - : m_isDebugging(false), - m_renderQueue(0), - m_threadSlot(-1) - {} - - Renderer::Renderer(Params const & params) - : m_isDebugging(params.m_isDebugging), - m_isRendering(false), - m_width(0), - m_height(0), - m_env(0), - m_threadSlot(params.m_threadSlot) - { - m_renderContext = params.m_renderContext; - m_frameBuffer = params.m_frameBuffer; - m_resourceManager = params.m_resourceManager; - - if (m_frameBuffer) - { - m_renderTarget = m_frameBuffer->renderTarget(); - m_depthBuffer = m_frameBuffer->depthBuffer(); - } - - m_renderQueue = params.m_renderQueue; - } - - Renderer::~Renderer() - {} - - shared_ptr const & Renderer::resourceManager() const - { - return m_resourceManager; - } - - void Renderer::beginFrame() - { - CHECK(!m_isRendering, ("beginFrame called inside beginFrame/endFrame pair!")); - m_isRendering = true; - - math::Matrix coordM; - getOrthoMatrix(coordM, - 0, m_width, - m_height, 0, - graphics::minDepth, - graphics::maxDepth + 100); - - - if (m_frameBuffer) - { - m_frameBuffer->setRenderTarget(m_renderTarget); - m_frameBuffer->setDepthBuffer(m_depthBuffer); - - processCommand(make_shared(m_frameBuffer)); - - if (m_renderTarget != 0) - m_renderTarget->coordMatrix(coordM); - } - - processCommand(make_shared(EProjection, coordM)); - processCommand(make_shared(EModelView, math::Identity())); - } - - bool Renderer::isRendering() const - { - return m_isRendering; - } - - Renderer::ChangeMatrix::ChangeMatrix(EMatrix mt, math::Matrix const & m) - : m_matrixType(mt), m_matrix(m) - {} - - void Renderer::ChangeMatrix::perform() - { - renderContext()->setMatrix(m_matrixType, m_matrix); - } - - Renderer::DiscardFramebuffer::DiscardFramebuffer(bool doDiscardColor, bool doDiscardDepth) - : m_doDiscardColor(doDiscardColor), m_doDiscardDepth(doDiscardDepth) - {} - - void Renderer::DiscardFramebuffer::perform() - { - GLenum attachments[2]; - int numAttachments = 0; - if (m_doDiscardColor) - attachments[numAttachments++] = GL_COLOR_ATTACHMENT0_MWM; - if (m_doDiscardDepth) - attachments[numAttachments++] = GL_DEPTH_ATTACHMENT_MWM; - glDiscardFramebufferFn(GL_FRAMEBUFFER_MWM, numAttachments, attachments); - } - - void Renderer::discardFramebuffer(bool doDiscardColor, bool doDiscardDepth) - { - static bool firstReport = true; - if (firstReport) - { - if (!glDiscardFramebufferFn) - LOG(LDEBUG, ("GL_EXT_discard_framebuffer is unsupported")); - firstReport = false; - } - - if (glDiscardFramebufferFn) - processCommand(make_shared(doDiscardColor, doDiscardDepth)); - } - - void Renderer::copyFramebufferToImage(shared_ptr target) - { - processCommand(make_shared(target)); - } - - void Renderer::endFrame() - { - CHECK(m_isRendering, ("endFrame called outside beginFrame/endFrame pair!")); - m_isRendering = false; - } - - shared_ptr const & Renderer::frameBuffer() const - { - return m_frameBuffer; - } - - shared_ptr const & Renderer::renderTarget() const - { - return m_renderTarget; - } - - void Renderer::setRenderTarget(shared_ptr const & rt) - { - CHECK(!isRendering(), ("should call this function only outside beginFrame/endFrame")); - m_renderTarget = rt; - } - - void Renderer::resetRenderTarget() - { - CHECK(!isRendering(), ("should call this function only outside beginFrame/endFrame")); - m_renderTarget.reset(); - } - - shared_ptr const & Renderer::depthBuffer() const - { - return m_depthBuffer; - } - - void Renderer::setDepthBuffer(shared_ptr const & rt) - { - CHECK(!isRendering(), ("should call this function only outside beginFrame/endFrame")); - m_depthBuffer = rt; - } - - void Renderer::resetDepthBuffer() - { - CHECK(!isRendering(), ("should call this function only outside beginFrame/endFrame")); - m_depthBuffer.reset(); - } - - Renderer::ClearCommand::ClearCommand(graphics::Color const & color, - bool clearRT, - float depth, - bool clearDepth) - : m_color(color), - m_clearRT(clearRT), - m_depth(depth), - m_clearDepth(clearDepth) - {} - - void Renderer::ClearCommand::perform() - { - OGLCHECK(glClearColor(m_color.r / 255.0f, - m_color.g / 255.0f, - m_color.b / 255.0f, - m_color.a / 255.0f)); - #ifdef OMIM_GL_ES - OGLCHECK(glClearDepthf(m_depth)); - #else - OGLCHECK(glClearDepth(m_depth)); - #endif - - GLbitfield mask = 0; - if (m_clearRT) - mask |= GL_COLOR_BUFFER_BIT; - if (m_clearDepth) - mask |= GL_DEPTH_BUFFER_BIT; - - OGLCHECK(glDepthMask(GL_TRUE)); - - OGLCHECK(glClear(mask)); - } - - void Renderer::clear(graphics::Color const & c, bool clearRT, float depth, bool clearDepth) - { - shared_ptr command(new ClearCommand(c, clearRT, depth, clearDepth)); - processCommand(command); - } - - Renderer::CopyFramebufferToImage::CopyFramebufferToImage(shared_ptr target) - : m_target(target) {} - - void Renderer::CopyFramebufferToImage::perform() - { - m_target->makeCurrent(); - OGLCHECK(glCopyTexImage2D(GL_TEXTURE_2D, 0, DATA_TRAITS::gl_pixel_format_type, - 0, 0, m_target->width(), m_target->height(), 0)); - } - - Renderer::ChangeFrameBuffer::ChangeFrameBuffer(shared_ptr const & fb) - : m_frameBuffer(fb) - {} - - void Renderer::ChangeFrameBuffer::perform() - { - m_frameBuffer->makeCurrent(); - - OGLCHECK(glViewport(0, 0, m_frameBuffer->width(), m_frameBuffer->height())); - } - - void Renderer::onSize(unsigned int width, unsigned int height) - { - if (width < 2) width = 2; - if (height < 2) height = 2; - - m_width = width; - m_height = height; - - if (m_frameBuffer) - m_frameBuffer->onSize(width, height); - } - - unsigned int Renderer::width() const - { - return m_width; - } - - unsigned int Renderer::height() const - { - return m_height; - } - - bool Renderer::isDebugging() const - { - return m_isDebugging; - } - - void Renderer::processCommand(shared_ptr const & command, Packet::EType type, bool doForce) - { - if (command) - command->setIsDebugging(renderQueue() && !doForce); - - if (renderQueue() && !doForce) - renderQueue()->processPacket(Packet(command, type)); - else - if (command) - { - command->setRenderContext(m_renderContext.get()); - command->perform(); - } - } - - PacketsQueue * Renderer::renderQueue() - { - return m_renderQueue; - } - - void Renderer::addFramePoint() - { - if (m_renderQueue) - m_renderQueue->processPacket(Packet(Packet::EFramePoint)); - } - - void Renderer::addCheckPoint() - { - if (m_renderQueue) - m_renderQueue->processPacket(Packet(Packet::ECheckPoint)); - } - - void Renderer::completeCommands() - { - if (m_renderQueue) - m_renderQueue->completeCommands(); - } - - void Renderer::setEnvironment(core::CommandsQueue::Environment const * env) - { - m_env = env; - } - - bool Renderer::isCancelled() const - { - if (m_env) - return m_env->IsCancelled(); - else - return false; - } - - RenderContext * Renderer::renderContext() const - { - return m_renderContext.get(); - } - - int Renderer::threadSlot() const - { - return m_threadSlot; - } - } -} diff --git a/graphics/opengl/renderer.hpp b/graphics/opengl/renderer.hpp deleted file mode 100644 index 9de2974ce2..0000000000 --- a/graphics/opengl/renderer.hpp +++ /dev/null @@ -1,174 +0,0 @@ -#pragma once - -#include "graphics/color.hpp" -#include "graphics/packets_queue.hpp" -#include "graphics/resource_manager.hpp" - -#include "base/threaded_list.hpp" -#include "base/commands_queue.hpp" -#include "std/function.hpp" -#include "std/shared_ptr.hpp" -#include "geometry/rect2d.hpp" - -namespace graphics -{ - class ResourceManager; - class RenderTarget; - class RenderContext; - - namespace gl - { - class FrameBuffer; - class RenderBuffer; - class BaseTexture; - class Program; - - class Renderer - { - public: - - struct ClearCommand : Command - { - graphics::Color m_color; - bool m_clearRT; - float m_depth; - bool m_clearDepth; - - ClearCommand(graphics::Color const & color, - bool clearRT = true, - float depth = 1.0, - bool clearDepth = true); - - void perform(); - }; - - struct ChangeFrameBuffer : Command - { - shared_ptr m_frameBuffer; - - ChangeFrameBuffer(shared_ptr const & fb); - - void perform(); - }; - - struct ChangeMatrix : Command - { - EMatrix m_matrixType; - math::Matrix m_matrix; - - ChangeMatrix(EMatrix mt, math::Matrix const & m); - void perform(); - }; - - struct DiscardFramebuffer : Command - { - bool m_doDiscardColor; - bool m_doDiscardDepth; - DiscardFramebuffer(bool doDiscardColor, bool doDiscardDepth); - void perform(); - }; - - struct CopyFramebufferToImage : Command - { - shared_ptr m_target; - - CopyFramebufferToImage(shared_ptr target); - - void perform(); - }; - - virtual ~Renderer(); - - struct Params - { - shared_ptr m_renderContext; - shared_ptr m_resourceManager; - shared_ptr m_frameBuffer; - bool m_isDebugging; - PacketsQueue * m_renderQueue; - int m_threadSlot; - Params(); - }; - - private: - - shared_ptr m_frameBuffer; - shared_ptr m_renderTarget; - shared_ptr m_depthBuffer; - shared_ptr m_resourceManager; - - PacketsQueue * m_renderQueue; - - bool m_isDebugging; - - bool m_isRendering; - - unsigned int m_width; - unsigned int m_height; - - core::CommandsQueue::Environment const * m_env; - - int m_threadSlot; - - shared_ptr m_renderContext; - - public: - - static const graphics::Color s_bgColor; - - Renderer(Params const & params = Params()); - - void beginFrame(); - void endFrame(); - - bool isRendering() const; - - shared_ptr const & resourceManager() const; - - shared_ptr const & frameBuffer() const; - - void setRenderTarget(shared_ptr const & rt); - shared_ptr const & renderTarget() const; - void resetRenderTarget(); - - void setDepthBuffer(shared_ptr const & rt); - shared_ptr const & depthBuffer() const; - void resetDepthBuffer(); - - void discardFramebuffer(bool doDiscardColor, bool doDiscardDepth); - void copyFramebufferToImage(shared_ptr target); - - /// @param clearRT - should we clear the renderTarget data (visible pixels)? - /// @param clearDepth - should we clear depthBuffer data? - /// @warning this function respects the clipping rect set and enabled(!) - /// by the setClipRect/enableClipRect. Whether the clipping is - /// not enabled - the entire currently bound render surface is used. - void clear(graphics::Color const & c, bool clearRT = true, float depth = 1.0, bool clearDepth = true); - - void onSize(unsigned width, unsigned height); - - unsigned int width() const; - unsigned int height() const; - - bool isDebugging() const; - - void processCommand(shared_ptr const & command, Packet::EType type = Packet::ECommand, bool doForce = false); - PacketsQueue * renderQueue(); - - void addCheckPoint(); - void addFramePoint(); - - void completeCommands(); - - void setEnvironment(core::CommandsQueue::Environment const * env); - bool isCancelled() const; - - void setProgram(shared_ptr const & prg); - shared_ptr const & program() const; - - RenderContext * renderContext() const; - - int threadSlot() const; - }; - } -} diff --git a/graphics/opengl/route_vertex.cpp b/graphics/opengl/route_vertex.cpp deleted file mode 100644 index 0044d61c2f..0000000000 --- a/graphics/opengl/route_vertex.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "graphics/opengl/route_vertex.hpp" -#include "graphics/opengl/opengl.hpp" - -#include "base/macros.hpp" - -namespace graphics -{ -namespace gl -{ - -RouteVertex::RouteVertex() -{} - -RouteVertex::RouteVertex(RouteVertex const & v) - : pt(v.pt), - depth(v.depth), - normal(v.normal), - length(v.length), - lengthZ(v.lengthZ) -{} - -RouteVertex::RouteVertex(m2::PointF const & _pt, float const _depth, m2::PointF const & _normal, - m2::PointF const & _length, float const _lengthZ) - : pt(_pt), - depth(_depth), - normal(_normal), - length(_length), - lengthZ(_lengthZ) -{} - -RouteVertex const & RouteVertex::operator=(RouteVertex const & v) -{ - if (this != &v) - { - pt = v.pt; - depth = v.depth; - normal = v.normal; - length = v.length; - lengthZ = v.lengthZ; - } - return *this; -} - -VertexDecl const * RouteVertex::getVertexDecl() -{ - static VertexAttrib attrs [] = - { - VertexAttrib(ESemPosition, vertexOffset, EFloat, 3, sizeof(RouteVertex)), - VertexAttrib(ESemNormal, normalOffset, EFloat, 2, sizeof(RouteVertex)), - VertexAttrib(ESemLength, lengthOffset, EFloat, 3, sizeof(RouteVertex)) - }; - - static VertexDecl vd(attrs, ARRAY_SIZE(attrs)); - return &vd; -} - -} // namespace gl -} // namespace graphics diff --git a/graphics/opengl/route_vertex.hpp b/graphics/opengl/route_vertex.hpp deleted file mode 100644 index 325476f832..0000000000 --- a/graphics/opengl/route_vertex.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include "graphics/color.hpp" -#include "graphics/vertex_decl.hpp" - -#include "geometry/point2d.hpp" - -namespace graphics -{ - namespace gl - { - struct RouteVertex - { - m2::PointF pt; - float depth; - m2::PointF normal; - m2::PointF length; - float lengthZ; - - static const int vertexOffset = 0; - static const int normalOffset = sizeof(m2::PointF) + sizeof(float); - static const int lengthOffset = sizeof(m2::PointF) + sizeof(float) + sizeof(m2::PointF); - - RouteVertex(); - RouteVertex(m2::PointF const & _pt, float const _depth, m2::PointF const & _normal, - m2::PointF const & _length, float const _lengthZ); - RouteVertex(RouteVertex const & v); - RouteVertex const & operator=(RouteVertex const & v); - - static VertexDecl const * getVertexDecl(); - }; - } -} diff --git a/graphics/opengl/shader.cpp b/graphics/opengl/shader.cpp deleted file mode 100644 index d63f984a6a..0000000000 --- a/graphics/opengl/shader.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "graphics/opengl/shader.hpp" -#include "graphics/opengl/defines_conv.hpp" -#include "graphics/opengl/opengl.hpp" - -#include "std/cstring.hpp" - - -namespace graphics -{ - namespace gl - { - Shader::Shader(const char *src, EShaderType type) - { - GLenum glType; - convert(type, glType); - - m_handle = glCreateShaderFn(glType); - OGLCHECKAFTER; - - if (!m_handle) - throw Exception("CreateShader error", "could not create Shader!"); - - int len = strlen(src); - - OGLCHECK(glShaderSourceFn(m_handle, 1, &src, &len)); - - OGLCHECK(glCompileShaderFn(m_handle)); - - GLint compileRes = GL_FALSE; - OGLCHECK(glGetShaderivFn(m_handle, GL_COMPILE_STATUS, &compileRes)); - - if (compileRes == GL_FALSE) - { - GLchar msg[256]; - OGLCHECK(glGetShaderInfoLogFn(m_handle, sizeof(msg), 0, msg)); - throw CompileException("Couldn't compile shader: ", msg); - } - } - - Shader::~Shader() - { - OGLCHECK(glDeleteShaderFn(m_handle)); - } - - GLuint Shader::id() const - { - return m_handle; - } - } -} diff --git a/graphics/opengl/shader.hpp b/graphics/opengl/shader.hpp deleted file mode 100644 index 293f910141..0000000000 --- a/graphics/opengl/shader.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "base/exception.hpp" - -#include "graphics/defines.hpp" - -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - class Shader - { - private: - GLuint m_handle; - public: - - DECLARE_EXCEPTION(Exception, RootException); - DECLARE_EXCEPTION(CompileException, Exception); - - /// Constructor. - Shader(char const * src, EShaderType type); - /// Destructor. - ~Shader(); - /// Handle to the program. - GLuint id() const; - }; - } -} diff --git a/graphics/opengl/storage.cpp b/graphics/opengl/storage.cpp deleted file mode 100644 index 657065b48d..0000000000 --- a/graphics/opengl/storage.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "graphics/opengl/storage.hpp" -#include "graphics/opengl/buffer_object.hpp" - -#include "graphics/opengl/opengl.hpp" - -namespace graphics -{ - namespace gl - { - Storage::Storage() - {} - - Storage::Storage(size_t vbSize, size_t ibSize) : - m_vertices(new BufferObject(vbSize, GL_ARRAY_BUFFER)), - m_indices(new BufferObject(ibSize, GL_ELEMENT_ARRAY_BUFFER)) - {} - - bool Storage::isValid() const - { - return m_vertices && m_indices; - } - } -} diff --git a/graphics/opengl/storage.hpp b/graphics/opengl/storage.hpp deleted file mode 100644 index a5f819d8d9..0000000000 --- a/graphics/opengl/storage.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" - -namespace graphics -{ - namespace gl - { - class BufferObject; - - class Storage - { - public: - shared_ptr m_vertices; - shared_ptr m_indices; - - Storage(); - Storage(size_t vbSize, size_t ibSize); - - bool isValid() const; - }; - } -} - diff --git a/graphics/opengl/texture.hpp b/graphics/opengl/texture.hpp deleted file mode 100644 index a8257ac64f..0000000000 --- a/graphics/opengl/texture.hpp +++ /dev/null @@ -1,325 +0,0 @@ -#pragma once - -#include "graphics/opengl/managed_texture.hpp" -#include "graphics/opengl/data_traits.hpp" - -#include "graphics/image.hpp" - -#include "indexer/map_style_reader.hpp" - -#include "3party/lodepng/lodepng_io.hpp" - -namespace gil = boost::gil; -namespace mpl = boost::mpl; - -namespace graphics -{ - namespace gl - { - - template - class Texture{}; - - - template - class Texture : public BaseTexture - { - public: - - typedef Traits traits_t; - typedef typename Traits::pixel_t pixel_t; - typedef typename Traits::const_pixel_t const_pixel_t; - typedef typename Traits::view_t view_t; - typedef typename Traits::const_view_t const_view_t; - typedef typename Traits::image_t image_t; - - static const int maxChannelVal = Traits::maxChannelVal; - static const int channelScaleFactor = Traits::channelScaleFactor; - static const int gl_pixel_data_type = Traits::gl_pixel_data_type; - static const int gl_pixel_format_type = Traits::gl_pixel_format_type; - - private: - - void upload(void * data) - { - makeCurrent(); - - OGLCHECK(glTexImage2D( - GL_TEXTURE_2D, - 0, - Traits::gl_pixel_format_type, - width(), - height(), - 0, - Traits::gl_pixel_format_type, - Traits::gl_pixel_data_type, - data)); - - /// In multithreaded resource usage scenarios the suggested way to see - /// resource update made in one thread to the another thread is - /// to call the glFlush in thread, which modifies resource and then rebind - /// resource in another threads that is using this resource, if any. - OGLCHECK(glFlushFn()); - - } - - public: - - Texture(string const & fileName, EDensity density) : BaseTexture(GetDimensions(fileName, density)) - { - typename Traits::image_t image(width(), height()); - ReaderPtr reader = GetStyleReader().GetResourceReader(fileName, convert(density)); - gil::lodepng_read_and_convert_image(reader, image, typename Traits::color_converter()); - upload(&gil::view(image)(0, 0)); - } - - Texture(unsigned width, unsigned height) - : BaseTexture(width, height) - { - upload(0); - } - - void fill(graphics::Color const & c) - { - makeCurrent(); - - typename Traits::image_t image(width(), height()); - - typename Traits::pixel_t val = Traits::createPixel(c); - - typename Traits::view_t v = gil::view(image); - - for (size_t y = 0; y < height(); ++y) - for (size_t x = 0; x < width(); ++x) - v(x, y) = val; - - upload(&v(0, 0)); - } - - void dump(char const * fileName) - { - makeCurrent(); -// std::string const fullPath = GetPlatform().WritablePathForFile(fileName); - - typename Traits::image_t image(width(), height()); - -#ifndef OMIM_GL_ES - OGLCHECK(glGetTexImage( - GL_TEXTURE_2D, - 0, - Traits::gl_pixel_format_type, - Traits::gl_pixel_data_type, - &gil::view(image)(0, 0))); -// boost::gil::lodepng_write_view(fullPath.c_str(), gil::view(image)); -#endif - - - } - }; - - template - class Texture : public ManagedTexture - { - public: - - typedef Traits traits_t; - typedef typename Traits::pixel_t pixel_t; - typedef typename Traits::const_pixel_t const_pixel_t; - typedef typename Traits::view_t view_t; - typedef typename Traits::const_view_t const_view_t; - typedef typename Traits::image_t image_t; - - static const int maxChannelVal = Traits::maxChannelVal; - static const int channelScaleFactor = Traits::channelScaleFactor; - static const int gl_pixel_data_type = Traits::gl_pixel_data_type; - static const int gl_pixel_format_type = Traits::gl_pixel_format_type; - - private: - - void updateDirty(m2::RectU const & r); - - public: - - void upload(void * data); - void upload(void * data, m2::RectU const & r); - - /// Create the texture loading it from file - Texture(string const & fileName, EDensity density); - /// Create the texture with the predefined dimensions - Texture(size_t width, size_t height); - Texture(m2::RectU const & r); - - /// You can call this anytime, regardless the locking status of the texture. - /// const_view_t const_view() const; - /// You can call this on locked texture only. All your changess to this view's data will be - /// uploaded to the video memory on unlock() - view_t view(size_t width, size_t height); - - void fill(graphics::Color const & c); - - /// dump the texture into the file. - void dump(char const * fileName); - /// videomem -> sysmem texture image transfer. - /// @warning could be very slow. use with caution. - void readback(); - - void randomize(); - }; - - typedef Texture RGBA8Texture; - typedef Texture RGBA4Texture; - - typedef Texture RawRGBA8Texture; - typedef Texture RawRGBA4Texture; - - typedef Texture RawRGB565Texture; - - template - Texture::Texture(const m2::RectU &r) - : ManagedTexture(r.SizeX(), r.SizeY(), sizeof(pixel_t)) - { - upload(0); - } - - template - Texture::Texture(size_t width, size_t height) - : ManagedTexture(width, height, sizeof(pixel_t)) - { - upload(0); - } - - template - Texture::Texture(string const & fileName, EDensity density) - : ManagedTexture(GetDimensions(fileName, density), sizeof(pixel_t)) - { - lock(); - view_t v = view(width(), height()); - ReaderPtr reader = GetStyleReader().GetResourceReader(fileName, convert(density)); - gil::lodepng_read_and_convert_view(reader, v, typename Traits::color_converter()); - upload(&v(0, 0)); - unlock(); - } - - template - typename Texture::view_t Texture::view(size_t w, size_t h) - { - ASSERT(m_isLocked, ("non const access to unlocked texture!")); - return gil::interleaved_view( - w, - h, - (pixel_t*)auxData(), - w * sizeof(pixel_t)); - } - -/* template - typename Texture::const_view_t Texture::const_view() const - { - return gil::const_view(m_image); - } - */ - - template - void Texture::upload(void * data) - { - makeCurrent(); - - OGLCHECK(glTexImage2D( - GL_TEXTURE_2D, - 0, - gl_pixel_format_type, - width(), - height(), - 0, - gl_pixel_format_type, - gl_pixel_data_type, - data)); - - /// In multithreaded resource usage scenarios the suggested way to see - /// resource update made in one thread to the another thread is - /// to call the glFlush in thread, which modifies resource and then rebind - /// resource in another threads that is using this resource, if any. - OGLCHECK(glFlushFn()); - } - - template - void Texture::upload(void * data, m2::RectU const & r) - { - makeCurrent(); - /// Uploading texture data - OGLCHECK(glTexSubImage2D( - GL_TEXTURE_2D, - 0, - r.minX(), - r.minY(), - r.SizeX(), - r.SizeY(), - gl_pixel_format_type, - gl_pixel_data_type, - data)); - } - - template - void Texture::randomize() - { - makeCurrent(); - lock(); - view_t v = view(width(), height()); - - for (size_t y = 0; y < height(); ++y) - for (size_t x = 0; x < width(); ++x) - v(x, y) = pixel_t(rand() % maxChannelVal, rand() % maxChannelVal, rand() % maxChannelVal, maxChannelVal); - - upload(&v(0, 0), m2::RectU(0, 0, width(), height())); - unlock(); - } - - template - void Texture::readback() - { - makeCurrent(); -#ifndef OMIM_GL_ES - OGLCHECK(glGetTexImage( - GL_TEXTURE_2D, - 0, - gl_pixel_format_type, - Traits::gl_pixel_data_type, - &view(width(), height())(0, 0))); -#else - ASSERT(false, ("no glGetTexImage function in OpenGL ES")); -#endif - } - - template - void Texture::dump(char const * fileName) - { - lock(); - readback(); -// std::string const fullPath = GetPlatform().WritablePathForFile(fileName); -#ifndef OMIM_GL_ES -// boost::gil::lodepng_write_view(fullPath.c_str(), view(width(), height())); -#endif - unlock(); - } - - template - void Texture::fill(graphics::Color const & /*c*/) - { -/* makeCurrent(); - lock(); - view_t v = view(); - - pixel_t val((c.r / 255.0f) * maxChannelVal, - (c.g / 255.0f) * maxChannelVal, - (c.b / 255.0f) * maxChannelVal, - (c.a / 255.0f) * maxChannelVal); - - for (size_t y = 0; y < height(); ++y) - for (size_t x = 0; x < width(); ++x) - v(x, y) = val; - - addDirtyRect(m2::RectU(0, 0, width(), height())); - unlock(); - */ - } - } -} diff --git a/graphics/opengl/utils.cpp b/graphics/opengl/utils.cpp deleted file mode 100644 index b594f761e9..0000000000 --- a/graphics/opengl/utils.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "graphics/opengl/defines.hpp" -#include "graphics/opengl/utils.hpp" - -#include "graphics/opengl/opengl/opengl.hpp" - -#include "graphics/std/target_os.hpp" - -namespace graphics -{ - namespace gl - { - namespace utils - { - void setupCoordinates(size_t width, size_t height, bool doSwap /*= true*/) - { - OGLCHECK(glViewport(0, 0, width, height)); - - OGLCHECK(glMatrixModeFn(GL_MODELVIEW_MWM)); - OGLCHECK(glLoadIdentityFn()); - - OGLCHECK(glMatrixModeFn(GL_PROJECTION_MWM)); - OGLCHECK(glLoadIdentityFn()); - - if (!doSwap) - OGLCHECK(glOrthoFn(0, width, 0, height, -graphics::maxDepth, graphics::maxDepth)); - else - OGLCHECK(glOrthoFn(0, width, height, 0, -graphics::maxDepth, graphics::maxDepth)); - } - } - } -} diff --git a/graphics/opengl/utils.hpp b/graphics/opengl/utils.hpp deleted file mode 100644 index fd10ee2405..0000000000 --- a/graphics/opengl/utils.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "std/cstdint.hpp" - -namespace graphics -{ - namespace gl - { - namespace utils - { - void setupCoordinates(size_t width, size_t height, bool doSwap = false); - } - } -} diff --git a/graphics/opengl/vertex.cpp b/graphics/opengl/vertex.cpp deleted file mode 100644 index 912589bbdb..0000000000 --- a/graphics/opengl/vertex.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "graphics/opengl/vertex.hpp" -#include "graphics/opengl/opengl.hpp" - -#include "base/macros.hpp" - -namespace graphics -{ - namespace gl - { - Vertex::Vertex() - {} - - Vertex::Vertex(m2::PointF const & _pt, - float _depth, - m2::PointF const & _normal, - m2::PointF const & _tex) - : pt(_pt), - depth(_depth), - normal(_normal), - tex(_tex) - {} - - Vertex::Vertex(Vertex const & v) - : pt(v.pt), - depth(v.depth), - normal(v.normal), - tex(v.tex) - {} - - Vertex const & Vertex::operator=(Vertex const & v) - { - if (this != &v) - { - pt = v.pt; - depth = v.depth; - normal = v.normal; - tex = v.tex; - } - return *this; - } - - VertexDecl const * Vertex::getVertexDecl() - { - static VertexAttrib attrs [] = - { - VertexAttrib(ESemPosition, vertexOffset, EFloat, 3, sizeof(Vertex)), - VertexAttrib(ESemNormal, normalOffset, EFloat, 2, sizeof(Vertex)), - VertexAttrib(ESemTexCoord0, texCoordOffset, EFloat, 2, sizeof(Vertex)) - }; - - static VertexDecl vd(attrs, ARRAY_SIZE(attrs)); - return &vd; - } - } -} diff --git a/graphics/opengl/vertex.hpp b/graphics/opengl/vertex.hpp deleted file mode 100644 index 51b71f725d..0000000000 --- a/graphics/opengl/vertex.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "graphics/color.hpp" -#include "graphics/vertex_decl.hpp" - -#include "geometry/point2d.hpp" - -namespace graphics -{ - /// Vertex Data Element - namespace gl - { - struct Vertex - { - m2::PointF pt; - float depth; - m2::PointF normal; - m2::PointF tex; - - static const int vertexOffset = 0; - static const int normalOffset = sizeof(m2::PointF) + sizeof(float); - static const int texCoordOffset = sizeof(m2::PointF) + sizeof(float) + sizeof(m2::PointF); - - Vertex(); - Vertex(m2::PointF const & _pt, - float _depth = 0, - m2::PointF const & _normal = m2::PointF(), - m2::PointF const & _tex = m2::PointF()); - Vertex(Vertex const & v); - Vertex const & operator=(Vertex const & v); - - static VertexDecl const * getVertexDecl(); - }; - } -} diff --git a/graphics/overlay.cpp b/graphics/overlay.cpp deleted file mode 100644 index b68a84830c..0000000000 --- a/graphics/overlay.cpp +++ /dev/null @@ -1,260 +0,0 @@ -#include "graphics/overlay.hpp" -#include "graphics/overlay_renderer.hpp" - -#include "base/logging.hpp" -#include "base/stl_add.hpp" - -#include "std/bind.hpp" -#include "std/vector.hpp" - - -namespace graphics -{ - -OverlayStorage::OverlayStorage() - : m_needClip(false) -{ -} - -OverlayStorage::OverlayStorage(const m2::RectD & clipRect) - : m_clipRect(clipRect) - , m_needClip(true) -{ -} - -size_t OverlayStorage::GetSize() const -{ - return m_elements.size(); -} - -void OverlayStorage::AddElement(const shared_ptr & elem) -{ - if (m_needClip == false) - { - m_elements.push_back(elem); - return; - } - - OverlayElement::RectsT rects; - elem->GetMiniBoundRects(rects); - - for (size_t j = 0; j < rects.size(); ++j) - { - if (m_clipRect.IsIntersect(rects[j])) - { - m_elements.push_back(elem); - break; - } - } -} - -bool betterOverlayElement(shared_ptr const & l, - shared_ptr const & r) -{ - // "frozen" object shouldn't be popped out. - if (r->isFrozen()) - return false; - - // for the composite elements, collected in OverlayRenderer to replace the part elements - return l->priority() > r->priority(); -} - -m2::RectD const OverlayElementTraits::LimitRect(shared_ptr const & elem) -{ - return elem->GetBoundRect(); -} - -size_t Overlay::getElementsCount() const -{ - return m_tree.GetSize(); -} - -void Overlay::lock() -{ - m_mutex.Lock(); -} - -void Overlay::unlock() -{ - m_mutex.Unlock(); -} - -void Overlay::clear() -{ - m_tree.Clear(); -} - -struct DoPreciseSelectByRect -{ - m2::AnyRectD m_rect; - list > * m_elements; - - DoPreciseSelectByRect(m2::RectD const & rect, - list > * elements) - : m_rect(rect), - m_elements(elements) - {} - - void operator()(shared_ptr const & e) - { - OverlayElement::RectsT rects; - e->GetMiniBoundRects(rects); - - for (size_t i = 0; i < rects.size(); ++i) - { - if (m_rect.IsIntersect(rects[i])) - { - m_elements->push_back(e); - break; - } - } - } -}; - -class DoPreciseIntersect -{ - shared_ptr m_oe; - OverlayElement::RectsT m_rects; - - bool m_isIntersect; - -public: - DoPreciseIntersect(shared_ptr const & oe) - : m_oe(oe), m_isIntersect(false) - { - m_oe->GetMiniBoundRects(m_rects); - } - - m2::RectD GetSearchRect() const - { - m2::RectD rect; - for (size_t i = 0; i < m_rects.size(); ++i) - rect.Add(m_rects[i].GetGlobalRect()); - return rect; - } - - void operator()(shared_ptr const & e) - { - if (m_isIntersect) - return; - - if (m_oe->m_userInfo == e->m_userInfo) - return; - - OverlayElement::RectsT rects; - e->GetMiniBoundRects(rects); - - for (size_t i = 0; i < m_rects.size(); ++i) - for (size_t j = 0; j < rects.size(); ++j) - { - m_isIntersect = m_rects[i].IsIntersect(rects[j]); - if (m_isIntersect) - return; - } - } - - bool IsIntersect() const { return m_isIntersect; } -}; - -void Overlay::selectOverlayElements(m2::RectD const & rect, list > & res) const -{ - DoPreciseSelectByRect fn(rect, &res); - m_tree.ForEachInRect(rect, fn); -} - -void Overlay::replaceOverlayElement(shared_ptr const & oe) -{ - DoPreciseIntersect fn(oe); - m_tree.ForEachInRect(fn.GetSearchRect(), ref(fn)); - - if (fn.IsIntersect()) - m_tree.ReplaceAllInRect(oe, &betterOverlayElement); - else - m_tree.Add(oe); -} - -void Overlay::processOverlayElement(shared_ptr const & oe, math::Matrix const & m) -{ - oe->setTransformation(m); - if (oe->isValid()) - processOverlayElement(oe); -} - -void Overlay::processOverlayElement(shared_ptr const & oe) -{ - if (oe->isValid()) - replaceOverlayElement(oe); -} - -bool greater_priority(shared_ptr const & l, - shared_ptr const & r) -{ - return l->priority() > r->priority(); -} - -void Overlay::merge(shared_ptr const & layer, math::Matrix const & m) -{ - buffer_vector, 256> v; - v.reserve(layer->GetSize()); - - // 1. collecting all elements from tree - layer->ForEach(MakeBackInsertFunctor(v)); - - // 2. sorting by priority, so the more important ones comes first - sort(v.begin(), v.end(), &greater_priority); - - // 3. merging them into the infoLayer starting from most - // important one to optimize the space usage. - for_each(v.begin(), v.end(), [&] (shared_ptr const & p) - { - processOverlayElement(p, m); - }); -} - -void Overlay::merge(shared_ptr const & infoLayer) -{ - buffer_vector, 265> v; - v.reserve(infoLayer->GetSize()); - - // 1. collecting all elements from tree - infoLayer->ForEach(MakeBackInsertFunctor(v)); - - // 2. sorting by priority, so the more important ones comes first - sort(v.begin(), v.end(), &greater_priority); - - // 3. merging them into the infoLayer starting from most - // important one to optimize the space usage. - for_each(v.begin(), v.end(), [this] (shared_ptr const & p) - { - processOverlayElement(p); - }); -} - -void Overlay::clip(m2::RectI const & r) -{ - vector > v; - v.reserve(m_tree.GetSize()); - m_tree.ForEach(MakeBackInsertFunctor(v)); - m_tree.Clear(); - - m2::RectD const rd(r); - m2::AnyRectD ard(rd); - - for (shared_ptr const & e : v) - { - if (!e->isVisible()) - continue; - - OverlayElement::RectsT rects; - e->GetMiniBoundRects(rects); - - for (size_t j = 0; j < rects.size(); ++j) - if (ard.IsIntersect(rects[j])) - { - processOverlayElement(e); - break; - } - } -} - -} diff --git a/graphics/overlay.hpp b/graphics/overlay.hpp deleted file mode 100644 index f9d5525dd2..0000000000 --- a/graphics/overlay.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#pragma once - -#include "geometry/rect2d.hpp" -#include "geometry/any_rect2d.hpp" -#include "geometry/point2d.hpp" -#include "geometry/tree4d.hpp" - -#include "base/matrix.hpp" -#include "base/mutex.hpp" -#include "base/buffer_vector.hpp" - -#include "std/list.hpp" -#include "std/shared_ptr.hpp" - - -namespace graphics -{ - class OverlayRenderer; - class OverlayElement; - - struct OverlayElementTraits - { - static m2::RectD const LimitRect(shared_ptr const & elem); - }; - - class OverlayStorage - { - public: - OverlayStorage(); - OverlayStorage(m2::RectD const & clipRect); - - size_t GetSize() const; - void AddElement(shared_ptr const & elem); - - template - void ForEach(Functor const & fn) - { - for (shared_ptr const & e : m_elements) - fn(e); - } - - private: - m2::AnyRectD m_clipRect; - bool m_needClip; - buffer_vector, 128> m_elements; - }; - - class Overlay - { - private: - threads::Mutex m_mutex; - - m4::Tree, OverlayElementTraits> m_tree; - - void replaceOverlayElement(shared_ptr const & oe); - void processOverlayElement(shared_ptr const & oe); - void processOverlayElement(shared_ptr const & oe, math::Matrix const & m); - - Overlay(Overlay const & src) {} - - public: - Overlay() {} - - void selectOverlayElements(m2::RectD const & rect, list > & res) const; - size_t getElementsCount() const; - - void lock(); - void unlock(); - - void clear(); - - void merge(shared_ptr const & infoLayer, math::Matrix const & m); - void merge(shared_ptr const & infoLayer); - - void clip(m2::RectI const & r); - - template - void forEach(Fn fn) - { - m_tree.ForEach(fn); - } - }; -} diff --git a/graphics/overlay_element.cpp b/graphics/overlay_element.cpp deleted file mode 100644 index 2970a3771e..0000000000 --- a/graphics/overlay_element.cpp +++ /dev/null @@ -1,227 +0,0 @@ -#include "graphics/overlay_element.hpp" -#include "graphics/overlay_renderer.hpp" - - -namespace graphics -{ - OverlayElement::~OverlayElement() - {} - - OverlayElement::Params::Params() - : m_pivot(0, 0), - m_position(EPosAboveRight), - m_depth(0), - m_userInfo() - {} - - OverlayElement::OverlayElement(Params const & p) - : m_pivot(p.m_pivot), - m_position(p.m_position), - m_depth(p.m_depth), - m_inverseMatrix(math::Identity()), - m_userInfo(p.m_userInfo) - { - m_flags.set(); - m_flags[FROZEN] = false; - } - - m2::PointD const OverlayElement::computeTopLeft(m2::PointD const & sz, - m2::PointD const & pv, - EPosition pos) - { - m2::PointD res; - - if (pos & EPosLeft) - res.x = pv.x - sz.x; - else if (pos & EPosRight) - res.x = pv.x; - else - res.x = pv.x - sz.x / 2; - - if (pos & EPosAbove) - res.y = pv.y - sz.y; - else if (pos & EPosUnder) - res.y = pv.y; - else - res.y = pv.y - sz.y / 2; - - return res; - } - - void OverlayElement::offset(m2::PointD const & offs) - { - setPivot(pivot() + offs); - } - - m2::PointD const & OverlayElement::pivot() const - { - return m_pivot; - } - - void OverlayElement::setPivot(m2::PointD const & pivot, bool dirtyFlag) - { - m_pivot = pivot; - if (dirtyFlag) - setIsDirtyLayout(true); - } - - graphics::EPosition OverlayElement::position() const - { - return m_position; - } - - void OverlayElement::setPosition(graphics::EPosition pos) - { - m_position = pos; - setIsDirtyLayout(true); - } - - double OverlayElement::depth() const - { - return m_depth; - } - - void OverlayElement::setDepth(double depth) - { - m_depth = depth; - } - - bool OverlayElement::isFrozen() const - { - return m_flags[FROZEN]; - } - - void OverlayElement::setIsFrozen(bool flag) - { - m_flags[FROZEN] = flag; - } - - bool OverlayElement::isNeedRedraw() const - { - return m_flags[NEED_REDRAW]; - } - - void OverlayElement::setIsNeedRedraw(bool flag) - { - m_flags[NEED_REDRAW] = flag; - } - - bool OverlayElement::isVisible() const - { - return m_flags[VISIBLE]; - } - - void OverlayElement::setIsVisible(bool flag) const - { - m_flags[VISIBLE] = flag; - } - - bool OverlayElement::isDirtyLayout() const - { - return m_flags[DIRTY_LAYOUT]; - } - - void OverlayElement::setIsDirtyLayout(bool flag) const - { - m_flags[DIRTY_LAYOUT] = flag; - } - - m2::RectD OverlayElement::GetBoundRect() const - { - RectsT rects; - GetMiniBoundRects(rects); - - m2::RectD rect; - for (size_t i = 0; i < rects.size(); ++i) - rect.Add(rects[i].GetGlobalRect()); - return rect; - } - - void OverlayElement::GetMiniBoundRects(RectsT & rects) const - { - rects.push_back(m2::AnyRectD(GetBoundRect())); - } - - bool OverlayElement::hitTest(m2::PointD const & pt) const - { - RectsT rects; - GetMiniBoundRects(rects); - - for (size_t i = 0; i < rects.size(); ++i) - if (rects[i].IsPointInside(pt)) - return true; - - return false; - } - - bool OverlayElement::isValid() const - { - return m_flags[VALID]; - } - - void OverlayElement::setIsValid(bool flag) - { - m_flags[VALID] = flag; - } - - OverlayElement::UserInfo const & OverlayElement::userInfo() const - { - return m_userInfo; - } - - m2::PointD const OverlayElement::point(EPosition pos) const - { - /// @todo It's better to call roughBoundRect(), or place ASSERT(!m_isDirtyRoughRect, ()) here. - /// In general there is no need to store m_roughBoundRect at all. - /// It's calculating time is fast, because elements already cache vector. - - m2::RectD const rect = GetBoundRect(); - m2::PointD res = rect.Center(); - - if (pos & EPosLeft) - res.x = rect.minX(); - if (pos & EPosRight) - res.x = rect.maxX(); - - if (pos & EPosAbove) - res.y = rect.minY(); - if (pos & EPosUnder) - res.y = rect.maxY(); - - return res; - } - - bool OverlayElement::hasSharpGeometry() const - { - return false; - } - - double OverlayElement::priority() const - { - return m_depth; - } - - math::Matrix const & OverlayElement::getResetMatrix() const - { - return m_inverseMatrix; - } - - void OverlayElement::setTransformation(const math::Matrix & m) - { - m_inverseMatrix = math::Inverse(m); - } - - void OverlayElement::resetTransformation() - { - setTransformation(math::Identity()); - } - - void OverlayElement::DrawRectsDebug(graphics::OverlayRenderer * r, Color color, double depth) const - { - RectsT rects; - GetMiniBoundRects(rects); - - for (size_t i = 0; i < rects.size(); ++i) - r->drawRectangle(rects[i], color, depth); - } -} diff --git a/graphics/overlay_element.hpp b/graphics/overlay_element.hpp deleted file mode 100644 index 4c6c0441f1..0000000000 --- a/graphics/overlay_element.hpp +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once - -#include "graphics/defines.hpp" -#include "graphics/color.hpp" - -#include "indexer/feature_decl.hpp" - -#include "geometry/point2d.hpp" -#include "geometry/any_rect2d.hpp" - -#include "base/matrix.hpp" -#include "base/buffer_vector.hpp" - -#include "std/bitset.hpp" - - -namespace graphics -{ - class OverlayRenderer; - - class OverlayElement - { - public: - struct UserInfo - { - FeatureID m_featureID; - - inline bool IsValid() const { return m_featureID.IsValid(); } - inline bool operator== (UserInfo const & r) const - { - return (IsValid() && m_featureID == r.m_featureID); - } - }; - - private: - m2::PointD m_pivot; - graphics::EPosition m_position; - double m_depth; - - enum { NEED_REDRAW, - FROZEN, - VISIBLE, - VALID, - DIRTY_LAYOUT, - FLAGS_COUNT }; - - mutable bitset m_flags; - - math::Matrix m_inverseMatrix; - - protected: - math::Matrix const & getResetMatrix() const; - - public: - UserInfo m_userInfo; - - static m2::PointD const computeTopLeft(m2::PointD const & sz, - m2::PointD const & pv, - EPosition pos); - - struct Params - { - m2::PointD m_pivot; - graphics::EPosition m_position; - double m_depth; - UserInfo m_userInfo; - Params(); - }; - - OverlayElement(Params const & p); - virtual ~OverlayElement(); - - /// @name Getting element boundaries. - //@{ - virtual m2::RectD GetBoundRect() const; - typedef buffer_vector RectsT; - virtual void GetMiniBoundRects(RectsT & rects) const; - //@} - - virtual void draw(OverlayRenderer * r, math::Matrix const & m) const = 0; - /// Set new transformation ! RELATIVE TO INIT STATE ! for drawing and safe information for reseting - /// Need to call base class method - virtual void setTransformation(math::Matrix const & m) = 0; - /// This method reset transformation to initial state. - /// Geometry stored in coordinates relative to the tile. - /// Need to call base class method - virtual void resetTransformation(); - - virtual double priority() const; - - m2::PointD const & pivot() const; - virtual void setPivot(m2::PointD const & pv, bool dirtyFlag = true); - - m2::PointD const point(EPosition pos) const; - - void offset(m2::PointD const & offs); - - graphics::EPosition position() const; - void setPosition(graphics::EPosition pos); - - double depth() const; - void setDepth(double depth); - - bool isFrozen() const; - void setIsFrozen(bool flag); - - bool isNeedRedraw() const; - void setIsNeedRedraw(bool flag); - - bool isDirtyLayout() const; - virtual void setIsDirtyLayout(bool flag) const; - - virtual bool isVisible() const; - virtual void setIsVisible(bool flag) const; - - bool isValid() const; - void setIsValid(bool flag); - - m2::PointD getOffset() const; - void setOffset(m2::PointD offset); - - UserInfo const & userInfo() const; - - virtual bool hitTest(m2::PointD const & pt) const; - virtual bool hasSharpGeometry() const; - - void DrawRectsDebug(graphics::OverlayRenderer * r, Color color, double depth) const; - }; -} diff --git a/graphics/overlay_renderer.cpp b/graphics/overlay_renderer.cpp deleted file mode 100644 index 5ed69f23f7..0000000000 --- a/graphics/overlay_renderer.cpp +++ /dev/null @@ -1,241 +0,0 @@ -#include "graphics/overlay_renderer.hpp" -#include "graphics/straight_text_element.hpp" -#include "graphics/path_text_element.hpp" -#include "graphics/symbol_element.hpp" -#include "graphics/circle_element.hpp" -#include "graphics/circled_symbol.hpp" -#include "graphics/overlay.hpp" -#include "graphics/resource_manager.hpp" - - -namespace graphics -{ - OverlayRenderer::Params::Params() - : m_drawTexts(true), - m_drawSymbols(true) - { - } - - OverlayRenderer::OverlayRenderer(Params const & p) - : TextRenderer(p), - m_drawTexts(p.m_drawTexts), - m_drawSymbols(p.m_drawSymbols) - { - } - - void OverlayRenderer::drawSymbol(SymbolElement::Params & params) - { - if (!m_drawSymbols) - return; - - shared_ptr oe(new SymbolElement(params)); - - math::Matrix id = math::Identity(); - - if (!m_overlayStorage.get()) - oe->draw(this, id); - else - m_overlayStorage->AddElement(oe); - } - - void OverlayRenderer::drawSymbol(m2::PointD const & pt, string const & name, EPosition pos, int depth) - { - graphics::SymbolElement::Params params; - - params.m_depth = depth; - params.m_position = pos; - params.m_pivot = pt; - params.m_info.m_name = name; - params.m_renderer = this; - - drawSymbol(params); - } - - void OverlayRenderer::drawCircle(CircleElement::Params & params) - { - shared_ptr oe(new CircleElement(params)); - - math::Matrix id = math::Identity(); - - if (!m_overlayStorage.get()) - oe->draw(this, id); - else - m_overlayStorage->AddElement(oe); - } - - void OverlayRenderer::drawCircle(m2::PointD const & pt, - graphics::Circle::Info const & ci, - EPosition pos, - double depth) - { - CircleElement::Params params; - - params.m_depth = depth; - params.m_position = pos; - params.m_pivot = pt; - params.m_ci = ci; - - drawCircle(params); - } - - void OverlayRenderer::drawCircledSymbol(SymbolElement::Params const & symParams, - CircleElement::Params const & circleParams) - { - shared_ptr oe(new CircledSymbol(symParams, circleParams)); - - math::Matrix id = math::Identity(); - - if (!m_overlayStorage.get()) - oe->draw(this, id); - else - m_overlayStorage->AddElement(oe); - } - - void OverlayRenderer::drawText(FontDesc const & fontDesc, - m2::PointD const & pt, - graphics::EPosition pos, - string const & utf8Text, - double depth, - bool log2vis, - bool doSplit) - { - if (!m_drawTexts) - return; - - StraightTextElement::Params params; - params.m_depth = depth; - params.m_fontDesc = fontDesc; - params.m_log2vis = log2vis; - params.m_pivot = pt; - params.m_position = pos; - params.m_logText = strings::MakeUniString(utf8Text); - params.m_doSplit = doSplit; - params.m_useAllParts = false; - params.m_offset = m2::PointD(0,0); - params.m_glyphCache = glyphCache(); - - shared_ptr oe(new StraightTextElement(params)); - - math::Matrix id = math::Identity(); - - if (!m_overlayStorage.get()) - oe->draw(this, id); - else - m_overlayStorage->AddElement(oe); - } - - void OverlayRenderer::drawTextEx(StraightTextElement::Params & params) - { - if (!m_drawTexts) - return; - - params.m_glyphCache = glyphCache(); - - shared_ptr oe(new StraightTextElement(params)); - - math::Matrix id = math::Identity(); - - if (!m_overlayStorage.get()) - oe->draw(this, id); - else - m_overlayStorage->AddElement(oe); - } - - void OverlayRenderer::drawTextEx(FontDesc const & primaryFont, - FontDesc const & secondaryFont, - m2::PointD const & pt, - graphics::EPosition pos, - string const & text, - string const & secondaryText, - double depth, - bool log2vis, - bool doSplit) - { - if (!m_drawTexts) - return; - - StraightTextElement::Params params; - params.m_depth = depth; - params.m_fontDesc = primaryFont; - params.m_auxFontDesc = secondaryFont; - params.m_log2vis = log2vis; - params.m_pivot = pt; - params.m_position = pos; - params.m_logText = strings::MakeUniString(text); - params.m_auxLogText = strings::MakeUniString(secondaryText); - params.m_doSplit = doSplit; - params.m_useAllParts = false; - - drawTextEx(params); - } - - void OverlayRenderer::drawPathText(FontDesc const & fontDesc, - m2::PointD const * path, - size_t pathSize, - string const & utf8Text, - double fullLength, - double pathOffset, - double textOffset, - double depth) - { - if (!m_drawTexts) - return; - - PathTextElement::Params params; - - params.m_pts = path; - params.m_ptsCount = pathSize; - params.m_fullLength = fullLength; - params.m_pathOffset = pathOffset; - params.m_fontDesc = fontDesc; - params.m_logText = strings::MakeUniString(utf8Text); - params.m_depth = depth; - params.m_log2vis = true; - params.m_textOffset = textOffset; - params.m_glyphCache = glyphCache(); - params.m_pivot = path[0]; - - shared_ptr pte(new PathTextElement(params)); - - math::Matrix id = math::Identity(); - - if (!m_overlayStorage.get()) - pte->draw(this, id); - else - m_overlayStorage->AddElement(pte); - } - - void OverlayRenderer::drawPathText(FontDesc const & fontDesc, - m2::PointD const * path, - size_t pathSize, - string const & utf8Text, - double fullLength, - double pathOffset, - double const * textOffsets, - size_t offsSize, - double depth) - { - if (!m_drawTexts) - return; - - for (unsigned i = 0; i < offsSize; ++i) - drawPathText(fontDesc, - path, - pathSize, - utf8Text, - fullLength, - pathOffset, - textOffsets[i], - depth); - } - - void OverlayRenderer::setOverlay(const shared_ptr & overlayStorage) - { - m_overlayStorage = overlayStorage; - } - - void OverlayRenderer::resetOverlay() - { - m_overlayStorage.reset(); - } -} diff --git a/graphics/overlay_renderer.hpp b/graphics/overlay_renderer.hpp deleted file mode 100644 index 60df0a3443..0000000000 --- a/graphics/overlay_renderer.hpp +++ /dev/null @@ -1,92 +0,0 @@ -#pragma once - -#include "graphics/text_renderer.hpp" -#include "graphics/overlay.hpp" -#include "graphics/circle_element.hpp" -#include "graphics/symbol_element.hpp" -#include "graphics/straight_text_element.hpp" - -#include "std/shared_ptr.hpp" -#include "std/map.hpp" - - -namespace graphics -{ - class OverlayRenderer : public TextRenderer - { - private: - - bool m_drawTexts; - bool m_drawSymbols; - shared_ptr m_overlayStorage; - - public: - - struct Params : public TextRenderer::Params - { - bool m_drawTexts; - bool m_drawSymbols; - Params(); - }; - - OverlayRenderer(Params const & p); - - /// Drawing POI symbol - void drawSymbol(SymbolElement::Params & params); - void drawSymbol(m2::PointD const & pt, string const & symbolName, EPosition pos, int depth); - - /// Drawing circle - void drawCircle(CircleElement::Params & params); - void drawCircle(m2::PointD const & pt, - Circle::Info const & ci, - EPosition pos, - double depth); - - void drawCircledSymbol(SymbolElement::Params const & symParams, - CircleElement::Params const & circleParams); - - /// drawing straight text - void drawText(FontDesc const & fontDesc, - m2::PointD const & pt, - graphics::EPosition pos, - string const & utf8Text, - double depth, - bool log2vis, - bool doSplit = false); - - void drawTextEx(StraightTextElement::Params & params); - - void drawTextEx(FontDesc const & primaryFont, - FontDesc const & secondaryFont, - m2::PointD const & pt, - graphics::EPosition pos, - string const & text, - string const & secondaryText, - double depth, - bool log2vis, - bool doSplit = false); - - void drawPathText(FontDesc const & fontDesc, - m2::PointD const * path, - size_t s, - string const & utf8Text, - double fullLength, - double pathOffset, - double textOffset, - double depth); - - /// drawing text on the path - void drawPathText(FontDesc const & fontDesc, - m2::PointD const * path, - size_t s, - string const & utf8Text, - double fullLength, - double pathOffset, - double const * textOffsets, - size_t offsSize, - double depth); - - void setOverlay(shared_ptr const & overlayStorage); - void resetOverlay(); - }; -} diff --git a/graphics/packets_queue.cpp b/graphics/packets_queue.cpp deleted file mode 100644 index 83cf56516d..0000000000 --- a/graphics/packets_queue.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "graphics/packets_queue.hpp" -#include "base/logging.hpp" - -namespace graphics -{ - bool Command::isDebugging() const - { - return m_isDebugging; - } - - void Command::setIsDebugging(bool flag) - { - m_isDebugging = flag; - } - - void Command::setRenderContext(RenderContext * ctx) - { - m_ctx = ctx; - } - - RenderContext * Command::renderContext() - { - return m_ctx; - } - - const RenderContext *Command::renderContext() const - { - return m_ctx; - } - - Command::Command() - : m_isDebugging(false) - {} - - Command::~Command() - {} - - void Command::cancel() - {} - - void Command::perform() - {} - - void Command::dump() - {} - - DumpCommand::DumpCommand(shared_ptr const & cmd) - : m_cmd(cmd) - {} - - void DumpCommand::perform() - { - m_cmd->dump(); - } - - Packet::Packet() - {} - - Packet::Packet(EType type) - : m_type(type) - {} - - Packet::Packet(shared_ptr const & command, - EType type) - : m_command(command), - m_type(type) - {} - - PacketsQueue::PacketsQueue() - : m_fenceManager(5) - {} - - struct SignalFence : public Command - { - int m_id; - FenceManager * m_fenceManager; - - SignalFence(int id, FenceManager * fenceManager) - : m_id(id), m_fenceManager(fenceManager) - {} - - void perform() - { - m_fenceManager->signalFence(m_id); - } - - void cancel() - { - perform(); - } - }; - - int PacketsQueue::insertFence(Packet::EType type) - { - int id = m_fenceManager.insertFence(); - processPacket(Packet(make_shared(id, &m_fenceManager), type)); - return id; - } - - void PacketsQueue::joinFence(int id) - { - m_fenceManager.joinFence(id); - } - - void PacketsQueue::completeCommands() - { - joinFence(insertFence(Packet::EFramePoint)); - } - - void PacketsQueue::cancelCommands() - { - joinFence(insertFence(Packet::ECancelPoint)); - } - - void PacketsQueue::cancel() - { - m_packets.Cancel(); - m_fenceManager.cancel(); - } - - void PacketsQueue::cancelFences() - { - m_fenceManager.cancel(); - } - - void PacketsQueue::processPacket(Packet const & packet) - { - if (m_packets.IsCancelled()) - { - if (packet.m_command) - packet.m_command->cancel(); - } - else - m_packets.PushBack(packet); - } - - bool PacketsQueue::empty() const - { - return m_packets.Empty(); - } - - size_t PacketsQueue::size() const - { - return m_packets.Size(); - } -} diff --git a/graphics/packets_queue.hpp b/graphics/packets_queue.hpp deleted file mode 100644 index 9f9bb358c3..0000000000 --- a/graphics/packets_queue.hpp +++ /dev/null @@ -1,139 +0,0 @@ -#pragma once - -#include "graphics/uniforms_holder.hpp" - -#include "base/fence_manager.hpp" - -#include "base/threaded_list.hpp" -#include "base/mutex.hpp" -#include "base/condition.hpp" - -#include "std/shared_ptr.hpp" - -namespace graphics -{ - class RenderContext; - - struct Command - { - private: - - bool m_isDebugging; - string m_name; - - RenderContext * m_ctx; - - public: - - bool isDebugging() const; - void setIsDebugging(bool flag); - - virtual bool isNeedAdditionalUniforms() const { return false; } - virtual void setAdditionalUniforms(UniformsHolder const & /*uniforms*/) {} - virtual void resetAdditionalUniforms() {} - - virtual bool isNeedIndicesCount() const { return false; } - virtual void setIndicesCount(size_t indicesCount) {} - - void setRenderContext(RenderContext * ctx); - RenderContext * renderContext(); - RenderContext const * renderContext() const; - - Command(); - - virtual ~Command(); - virtual void perform(); - virtual void cancel(); - virtual void dump(); - }; - - struct DumpCommand : Command - { - shared_ptr m_cmd; - - DumpCommand(shared_ptr const & cmd); - - void perform(); - }; - - template - struct FunctorCommand : Command - { - Fn m_fn; - bool m_performOnCancel; - - FunctorCommand(Fn fn, bool performOnCancel = false) - : m_fn(fn), m_performOnCancel(performOnCancel) - {} - - void perform() - { - m_fn(); - } - - void cancel() - { - if (m_performOnCancel) - m_fn(); - } - }; - - struct Packet - { - enum EType - { - ECommand, - ECheckPoint, - EFramePoint, - ECancelPoint - }; - - shared_ptr m_command; - EType m_type; - - Packet(); - /// empty packet act as a frame delimiter or a checkpoint. - explicit Packet(EType type); - /// simple command - Packet(shared_ptr const & command, - EType type); - }; - - class PacketsQueue - { - private: - - ThreadedList m_packets; - FenceManager m_fenceManager; - - public: - - PacketsQueue(); - - void processPacket(Packet const & packet); - void cancel(); - void cancelFences(); - bool empty() const; - size_t size() const; - - int insertFence(Packet::EType type); - void joinFence(int id); - - /// convenience functions - - void completeCommands(); - void cancelCommands(); - - template - void processFn(Fn const & fn, bool performOnCancel = false) - { - processPacket(Packet(make_shared>(fn), Packet::ECommand)); - } - - template - void processList(Fn const & fn) - { - m_packets.ProcessList(fn); - } - }; -} diff --git a/graphics/path.hpp b/graphics/path.hpp deleted file mode 100644 index 2a3041f2f0..0000000000 --- a/graphics/path.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include "geometry/point2d.hpp" - -namespace graphics -{ - template - class Path - { - private: - - vector > m_pts; - - public: - - void reset(m2::Point const & pt) - { - m_pts.clear(); - m_pts.push_back(pt); - } - - void lineRel(m2::Point const & pt) - { - ASSERT(!m_pts.empty(), ()); - m2::Point const & p = m_pts.back(); - m_pts.push_back(p + pt); - } - - void eclipseArcRel(m2::Point const & pt) - { - /// TODO : write implementation - } - - m2::Point const * points() const - { - ASSERT(!m_pts.empty(), ()); - return &m_pts[0]; - } - - unsigned size() const - { - return m_pts.size(); - } - }; -} diff --git a/graphics/path_renderer.cpp b/graphics/path_renderer.cpp deleted file mode 100644 index 90bb57a49d..0000000000 --- a/graphics/path_renderer.cpp +++ /dev/null @@ -1,484 +0,0 @@ -#include "graphics/path_renderer.hpp" -#include "graphics/resource.hpp" -#include "graphics/pen.hpp" -#include "graphics/resource_cache.hpp" -#include "graphics/path_view.hpp" - -#include "graphics/opengl/base_texture.hpp" - -#include "base/logging.hpp" - -namespace graphics -{ - PathRenderer::Params::Params() - : m_drawPathes(true) - {} - - PathRenderer::PathRenderer(Params const & p) - : base_t(p), - m_drawPathes(p.m_drawPathes) - {} - - void PathRenderer::drawPath(m2::PointD const * pts, size_t ptsCount, double offset, uint32_t resID, double depth) - { - ++m_pathCount; - m_pointsCount += ptsCount; - - if (!m_drawPathes) - return; - - ASSERT_GREATER_OR_EQUAL(ptsCount, 2, ()); - ASSERT_NOT_EQUAL(resID, uint32_t(-1), ()); - - Resource const * res = base_t::fromID(resID); - - if (res == 0) - { - LOG(LDEBUG, ("drawPath: resID=", resID, "wasn't found on current skin")); - return; - } - - ASSERT(res->m_cat == Resource::EPen, ()); - - Pen const * pen = static_cast(res); - - if (!pen->m_info.m_icon.m_name.empty()) - drawSymbolPath(pts, ptsCount, offset, pen, depth); - else - if (pen->m_isSolid) - drawSolidPath(pts, ptsCount, offset, pen, depth); - else - drawStipplePath(pts, ptsCount, offset, pen, depth); - } - - void PathRenderer::drawSymbolPath(m2::PointD const * pts, size_t ptsCount, double offset, Pen const * pen, double depth) - { - PathView pv(pts, ptsCount); - - PathPoint pt = pv.front(); - - double step = pen->m_info.m_step; - - offset += pen->m_info.m_offset; - - if (offset < 0) - offset = fmod(offset, step); - - pt = pv.offsetPoint(pt, offset); - - m2::RectU texRect = pen->m_texRect; - texRect.Inflate(-1, -1); - - double const w = texRect.SizeX(); - double const h = texRect.SizeY(); - - double const hw = w / 2.0; - double const hh = h / 2.0; - - /// do not render start symbol if it's - /// completely outside the first segment. - if (offset + w < 0) - { - pv.offsetPoint(pt, step); - offset += step; - } - - shared_ptr tex = pipeline(pen->m_pipelineID).texture(); - - while (true) - { - PivotPoint pvPt = pv.findPivotPoint(pt, hw - 1); - - if (pvPt.m_pp.m_i == -1) - break; - - ang::AngleD ang = pvPt.m_angle; - - m2::PointD pts[4]; - - pts[0] = pvPt.m_pp.m_pt.Move(-hw, ang.sin(), ang.cos()); - pts[0] = pts[0].Move(hh + 1, -ang.cos(), ang.sin()); - - pts[1] = pts[0].Move(w, ang.sin(), ang.cos()); - pts[2] = pts[0].Move(-h, -ang.cos(), ang.sin()); - pts[3] = pts[2].Move(w, ang.sin(), ang.cos()); - - m2::PointF texPts[4] = - { - tex->mapPixel(m2::PointF(texRect.minX(), texRect.minY())), - tex->mapPixel(m2::PointF(texRect.maxX(), texRect.minY())), - tex->mapPixel(m2::PointF(texRect.minX(), texRect.maxY())), - tex->mapPixel(m2::PointF(texRect.maxX(), texRect.maxY())) - }; - - m2::PointF normal(0, 0); - - addTexturedStripStrided(pts, sizeof(m2::PointD), - &normal, 0, - texPts, sizeof(m2::PointF), - 4, - depth, - pen->m_pipelineID); - - pt = pv.offsetPoint(pvPt.m_pp, pen->m_info.m_step); - - if (pt.m_i == -1) - break; - } - } - - void PathRenderer::drawStipplePath(m2::PointD const * points, size_t pointsCount, double offset, Pen const * pen, double depth) - { - bool const hasRoundJoin = (pen->m_info.m_join == pen->m_info.ERoundJoin); -// bool const hasBevelJoin = (pen->m_info.m_join == pen->m_info.EBevelJoin); - bool const hasJoin = (pen->m_info.m_join != pen->m_info.ENoJoin); - - float rawTileStartLen = 0; - - float rawTileLen = (float)pen->rawTileLen(); - - if (offset < 0) - offset = offset - rawTileLen * ceil(offset / rawTileLen); - - bool skipToOffset = true; - - /// Geometry width. It's 1px wider than the pattern width. - float const geomWidth = pen->m_info.m_w + 4 - 2 * aaShift(); - float const geomHalfWidth = geomWidth / 2.0; - - for (size_t i = 0; i < pointsCount - 1; ++i) - { - m2::PointD dir = points[i + 1] - points[i]; - dir *= 1.0 / dir.Length(m2::PointD(0, 0)); - m2::PointD norm(-dir.y, dir.x); - - /// The length of the current segment. - float segLen = points[i + 1].Length(points[i]); - /// The remaining length of the segment - float segLenRemain = segLen; - - if (skipToOffset) - { - offset -= segLen; - if (offset >= 0) - continue; - else - { - skipToOffset = false; - segLenRemain = -offset; - } - } - - /// Starting point of the tiles on this segment - m2::PointF rawTileStartPt = points[i] + dir * (segLen - segLenRemain); - - /// Tiling procedes as following : - /// The leftmost tile goes antialiased at left and non-antialiased at right. - /// The inner tiles goes non-antialiased at both sides. - /// The rightmost tile goes non-antialised at left and antialiased at right side. - - /// Length of the actual pattern data being tiling(without antialiasing zones). - rawTileLen = 0; - - GeometryPipeline & p = pipeline(pen->m_pipelineID); - - shared_ptr texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - float texMaxY = pen->m_texRect.maxY() - aaShift(); - float texMinY = pen->m_texRect.minY() + aaShift(); - - m2::PointF const fNorm = norm * geomHalfWidth; // enough to calc it once - - while (segLenRemain > 0) - { - rawTileLen = std::min(((float)pen->rawTileLen() - rawTileStartLen), segLenRemain); - - float texMinX = pen->m_texRect.minX() + 2 + rawTileStartLen; - float texMaxX = texMinX + rawTileLen; - - rawTileStartLen += rawTileLen; - if (rawTileStartLen >= pen->rawTileLen()) - rawTileStartLen -= pen->rawTileLen(); - ASSERT(rawTileStartLen < pen->rawTileLen(), ()); - - m2::PointF rawTileEndPt(rawTileStartPt.x + dir.x * rawTileLen, rawTileStartPt.y + dir.y * rawTileLen); - - m2::PointF coords[4]; - - coords[0] = rawTileStartPt; - coords[1] = rawTileStartPt; - coords[2] = rawTileEndPt; - coords[3] = rawTileEndPt; - - m2::PointF texCoords[4] = - { - texture->mapPixel(m2::PointF(texMinX, texMinY)), - texture->mapPixel(m2::PointF(texMinX, texMaxY)), - texture->mapPixel(m2::PointF(texMaxX, texMaxY)), - texture->mapPixel(m2::PointF(texMaxX, texMinY)) - }; - - m2::PointF normals[4] = - { - fNorm, - -fNorm, - -fNorm, - fNorm - }; - - addTexturedFan(coords, - normals, - texCoords, - 4, - depth, - pen->m_pipelineID); - - segLenRemain -= rawTileLen; - - rawTileStartPt = rawTileEndPt; - } - - bool isColorJoin = hasJoin && pen->m_info.atDashOffset(rawTileLen); - - /// Adding geometry for a line join between previous and current segment. - if ((i != pointsCount - 2) && isColorJoin) - { - m2::PointD nextDir = points[i + 2] - points[i + 1]; - nextDir *= 1.0 / nextDir.Length(m2::PointD(0, 0)); - m2::PointD nextNorm(-nextDir.y, nextDir.x); - - /// Computing the sin of angle between directions. - double alphaSin = dir.x * nextDir.y - dir.y * nextDir.x; - double alphaCos = dir.x * nextDir.x + dir.y * nextDir.y; - double alpha = atan2(alphaSin, alphaCos); - - int angleSegCount = 1; // bevel join - 1 segment - if (hasRoundJoin) - angleSegCount= int(ceil(fabs(alpha) / (math::pi / 6))); - - double angleStep = alpha / angleSegCount; - - m2::PointD startVec; - - if (alpha > 0) - { - /// The outer side is on the prevNorm direction. - startVec = -norm; - } - else - { - /// The outer side is on the -prevNorm direction - startVec = norm; - } - - GeometryPipeline & p = pipeline(pen->m_pipelineID); - - shared_ptr texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - m2::PointF joinSegTex[3] = - { - texture->mapPixel(pen->m_centerColorPixel), - texture->mapPixel(pen->m_borderColorPixel), - texture->mapPixel(pen->m_borderColorPixel) - }; - - m2::PointD prevStartVec = startVec; - for (int j = 0; j < angleSegCount; ++j) - { - /// Rotate start vector to find another point on a join. - startVec.Rotate(angleStep); - - m2::PointF joinSeg[3] = - { - points[i + 1], - points[i + 1], - points[i + 1] - }; - m2::PointF joinSegNormals[3] = - { - m2::PointF(0, 0), - startVec * geomHalfWidth, - prevStartVec * geomHalfWidth - }; - - addTexturedFan(joinSeg, - joinSegNormals, - joinSegTex, - 3, - depth, - pen->m_pipelineID); - - prevStartVec = startVec; - } - } - } - } - - - void PathRenderer::drawSolidPath(m2::PointD const * points, size_t pointsCount, double offset, Pen const * pen, double depth) - { - ASSERT(pen->m_isSolid, ()); - - bool const hasRoundCap = (pen->m_info.m_cap == pen->m_info.ERoundCap); - bool const hasSquareCap = (pen->m_info.m_cap == pen->m_info.ESquareCap); - bool const hasRoundJoin = (pen->m_info.m_join == pen->m_info.ERoundJoin); - bool const hasBevelJoin = (pen->m_info.m_join == pen->m_info.EBevelJoin); - - float geomHalfWidth = (pen->m_info.m_w + 4 - aaShift() * 2) / 2.0; - - m2::PointD dir = points[1] - points[0]; - double len = dir.Length(m2::PointD(0, 0)); - dir *= 1.0 / len; - m2::PointD const norm(-dir.y, dir.x); - m2::PointD fNorm = norm * geomHalfWidth; - m2::PointD fDir(fNorm.y, -fNorm.x); - - m2::PointD fNormNextSeg; - m2::PointD fDirNextSeg; - - for (size_t i = 0; i < pointsCount - 1; ++i) - { - bool const leftIsCap = i == 0; - bool const rightIsCap = i == (pointsCount - 2); - - if (!leftIsCap) - { - fNorm = fNormNextSeg; - fDir = fDirNextSeg; - } - - m2::PointD const & nextPt = points[i + 1]; - - if (!rightIsCap) - { - m2::PointD dirNextSeg = points[i + 2] - points[i + 1]; - double lenNextSeg = dirNextSeg.Length(m2::PointD(0, 0)); - dirNextSeg *= 1.0 / lenNextSeg; - m2::PointD normNextSeg(-dirNextSeg.y, dirNextSeg.x); - fNormNextSeg = normNextSeg * geomHalfWidth; - fDirNextSeg = m2::PointD(fNormNextSeg.y, -fNormNextSeg.x); - } - - float texMinX = pen->m_texRect.minX() + aaShift(); - float texMaxX = pen->m_texRect.maxX() - aaShift(); - - float texMinY = pen->m_texRect.minY() + aaShift(); - float texMaxY = pen->m_texRect.maxY() - aaShift(); - - float texCenterX = (texMinX + texMaxX) / 2; - - int numPoints = 4; - - if (leftIsCap && (hasRoundCap || hasSquareCap)) - numPoints += 2; - if ((rightIsCap && (hasRoundCap || hasSquareCap)) - || (!rightIsCap && (hasRoundJoin || hasBevelJoin))) - numPoints += 2; - - int cur = 0; - - ASSERT(numPoints <= 8, ("numPoints is more than 8, won't fit in array")); - m2::PointF coords[8]; - - if (leftIsCap && (hasRoundCap || hasSquareCap)) - { - coords[cur++] = points[i] - fDir + fNorm; - coords[cur++] = points[i] - fDir - fNorm; - } - - coords[cur++] = points[i] + fNorm; - coords[cur++] = points[i] - fNorm; - coords[cur++] = nextPt + fNorm; - coords[cur++] = nextPt - fNorm; - - if ((rightIsCap && (hasRoundCap || hasSquareCap)) - || (!rightIsCap && hasRoundJoin)) - { - coords[cur++] = nextPt + fDir + fNorm; - coords[cur++] = nextPt + fDir - fNorm; - } - else if (!rightIsCap && hasBevelJoin) - { - coords[cur++] = points[i + 1] + fNormNextSeg; - coords[cur++] = points[i + 1] - fNormNextSeg; - } - - GeometryPipeline & p = pipeline(pen->m_pipelineID); - - shared_ptr texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - m2::PointF texCoords[8]; - cur = 0; - - if (leftIsCap && hasRoundCap) - { - texCoords[cur++] = texture->mapPixel(m2::PointF(texMinX, texMinY)); - texCoords[cur++] = texture->mapPixel(m2::PointF(texMinX, texMaxY)); - } - else if (leftIsCap && hasSquareCap) - { - texCoords[cur++] = texture->mapPixel(m2::PointF(texCenterX, texMinY)); - texCoords[cur++] = texture->mapPixel(m2::PointF(texCenterX, texMaxY)); - } - - texCoords[cur++] = texture->mapPixel(m2::PointF(texCenterX, texMinY)); - texCoords[cur++] = texture->mapPixel(m2::PointF(texCenterX, texMaxY)); - texCoords[cur++] = texture->mapPixel(m2::PointF(texCenterX, texMinY)); - texCoords[cur++] = texture->mapPixel(m2::PointF(texCenterX, texMaxY)); - - if ((rightIsCap && hasRoundCap) - || (!rightIsCap && hasRoundJoin)) - { - texCoords[cur++] = texture->mapPixel(m2::PointF(texMinX, texMinY)); - texCoords[cur++] = texture->mapPixel(m2::PointF(texMinX, texMaxY)); - } - else if ((rightIsCap && hasSquareCap) - || (!rightIsCap && hasBevelJoin)) - { - texCoords[cur++] = texture->mapPixel(m2::PointF(texCenterX, texMinY)); - texCoords[cur++] = texture->mapPixel(m2::PointF(texCenterX, texMaxY)); - } - - m2::PointF normal(0, 0); - - addTexturedStripStrided(coords, sizeof(m2::PointF), - &normal, 0, - texCoords, sizeof(m2::PointF), - numPoints, - depth, - pen->m_pipelineID); - } - } - - void PathRenderer::beginFrame() - { - base_t::beginFrame(); - m_pathCount = 0; - m_pointsCount = 0; - } - - void PathRenderer::endFrame() - { - base_t::endFrame(); - } - -} - diff --git a/graphics/path_renderer.hpp b/graphics/path_renderer.hpp deleted file mode 100644 index d492dbb87f..0000000000 --- a/graphics/path_renderer.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include "graphics/area_renderer.hpp" -#include "geometry/point2d.hpp" - -namespace graphics -{ - struct Pen; - - class PathRenderer : public AreaRenderer - { - private: - - unsigned m_pathCount; - unsigned m_pointsCount; - bool m_drawPathes; - - void drawSolidPath(m2::PointD const * pts, size_t ptsCount, double offset, Pen const * pen, double depth); - void drawStipplePath(m2::PointD const * pts, size_t ptsCount, double offset, Pen const * pen, double depth); - void drawSymbolPath(m2::PointD const * pts, size_t ptsCount, double offset, Pen const * pen, double depth); - - public: - - typedef AreaRenderer base_t; - - struct Params : base_t::Params - { - bool m_drawPathes; - Params(); - }; - - PathRenderer(Params const & params); - - void drawPath(m2::PointD const * pts, size_t ptsCount, double offset, uint32_t resID, double depth); - - void beginFrame(); - void endFrame(); - - }; -} diff --git a/graphics/path_text_element.cpp b/graphics/path_text_element.cpp deleted file mode 100644 index 05086a458c..0000000000 --- a/graphics/path_text_element.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include "graphics/path_text_element.hpp" -#include "graphics/overlay_renderer.hpp" - - -namespace graphics -{ - PathTextElement::Params::Params() - : m_pts(0), - m_ptsCount(0), - m_fullLength(0), - m_pathOffset(0), - m_textOffset(0) - {} - - PathTextElement::PathTextElement(Params const & p) - : BaseT(p) - { - strings::UniString visText, auxVisText; - (void) p.GetVisibleTexts(visText, auxVisText); - - m_glyphLayout = GlyphLayoutPath(p.m_glyphCache, p.m_fontDesc, - p.m_pts, p.m_ptsCount, - visText, p.m_fullLength, - p.m_pathOffset, p.m_textOffset); - - setPivot(m_glyphLayout.pivot()); - setIsValid(m_glyphLayout.IsFullVisible()); - } - - m2::RectD PathTextElement::GetBoundRect() const - { - if (isDirtyLayout()) - { - m_boundRect = BaseT::GetBoundRect(); - setIsDirtyLayout(false); - } - return m_boundRect; - } - - void PathTextElement::GetMiniBoundRects(RectsT & rects) const - { - size_t const count = m_glyphLayout.boundRects().size(); - rects.reserve(count); - copy(m_glyphLayout.boundRects().begin(), - m_glyphLayout.boundRects().end(), - back_inserter(rects)); - } - - void PathTextElement::draw(OverlayRenderer * screen, math::Matrix const & m) const - { - int doffs = 0; - if (screen->isDebugging()) - { - graphics::Color c(255, 255, 255, 32); - - if (isFrozen()) - c = graphics::Color(0, 0, 255, 64); - if (isNeedRedraw()) - c = graphics::Color(255, 0, 0, 64); - - screen->drawRectangle(GetBoundRect(), graphics::Color(255, 255, 0, 64), depth() + doffs++); - - DrawRectsDebug(screen, c, depth() + doffs++); - } - - if (!isNeedRedraw() || !isVisible() || !isValid()) - return; - - graphics::FontDesc desc = m_fontDesc; - - if (desc.m_isMasked) - { - drawTextImpl(m_glyphLayout, screen, m, false, false, desc, depth() + doffs++); - desc.m_isMasked = false; - } - - drawTextImpl(m_glyphLayout, screen, m, false, false, desc, depth() + doffs++); - } - - void PathTextElement::setPivot(m2::PointD const & pivot, bool dirtyFlag) - { - TextElement::setPivot(pivot, dirtyFlag); - - m_glyphLayout.setPivot(pivot); - } - - void PathTextElement::setTransformation(const math::Matrix & m) - { - m_glyphLayout = GlyphLayoutPath(m_glyphLayout, getResetMatrix() * m); - TextElement::setPivot(m_glyphLayout.pivot()); - setIsValid(m_glyphLayout.IsFullVisible()); - - TextElement::setTransformation(m); - } -} diff --git a/graphics/path_text_element.hpp b/graphics/path_text_element.hpp deleted file mode 100644 index de7625757e..0000000000 --- a/graphics/path_text_element.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "graphics/text_element.hpp" -#include "graphics/glyph_layout.hpp" - - -namespace graphics -{ - class PathTextElement : public TextElement - { - typedef TextElement BaseT; - - GlyphLayoutPath m_glyphLayout; - - /// Cached bound rect for the fast Overlay tree routine. - mutable m2::RectD m_boundRect; - - public: - struct Params : BaseT::Params - { - m2::PointD const * m_pts; - size_t m_ptsCount; - double m_fullLength; - double m_pathOffset; - double m_textOffset; - Params(); - }; - - PathTextElement(Params const & p); - - virtual m2::RectD GetBoundRect() const; - virtual void GetMiniBoundRects(RectsT & rects) const; - - void draw(OverlayRenderer * r, math::Matrix const & m) const; - - void setPivot(m2::PointD const & pivot, bool dirtyFlag = true); - void setTransformation(const math::Matrix & m); - }; -} diff --git a/graphics/path_view.cpp b/graphics/path_view.cpp deleted file mode 100644 index a80f5cf161..0000000000 --- a/graphics/path_view.cpp +++ /dev/null @@ -1,153 +0,0 @@ -#include "graphics/path_view.hpp" - -namespace graphics -{ - PathPoint::PathPoint(int i, ang::AngleD const & segAngle, m2::PointD const & pt) - : m_i(i), - m_segAngle(segAngle), - m_pt(pt) - {} - - PivotPoint::PivotPoint(ang::AngleD const & angle, PathPoint const & pp) - : m_angle(angle), m_pp(pp) - {} - - PathView::PathView() - : m_pts(0), - m_ptsCount(0), - m_isReverse(false) - {} - - PathView::PathView(m2::PointD const * pts, - size_t ptsCount) - : m_pts(pts), - m_ptsCount(ptsCount), - m_isReverse(false) - { - } - - size_t PathView::size() const - { - return m_ptsCount; - } - - m2::PointD const & PathView::get(size_t i) const - { - ASSERT(i < m_ptsCount, ("index out of range")); - return m_pts[m_isReverse ? m_ptsCount - i - 1 : i]; - } - - void PathView::setIsReverse(bool flag) - { - m_isReverse = flag; - } - - bool PathView::isReverse() const - { - return m_isReverse; - } - - PathPoint const PathView::offsetPoint(PathPoint const & pp, double offset) const - { - PathPoint res = pp; - - if (res.m_i == -1) - return res; - - if (offset == 0) - return pp; - - bool found = false; - - for (size_t i = res.m_i; i < size() - 1; ++i) - { - double l = res.m_pt.Length(get(i + 1)); - - if (offset <= l) - { - if (i != res.m_i) - res.m_segAngle = ang::AngleD(ang::AngleTo(get(i), get(i + 1))); - - res.m_pt = res.m_pt.Move(offset, res.m_segAngle.sin(), res.m_segAngle.cos()); - res.m_i = i; - found = true; - break; - } - else - { - offset -= l; - res.m_pt = get(i + 1); - } - } - - if (!found) - res.m_i = -1; - - return res; - } - - PivotPoint PathView::findPivotPoint(PathPoint const & pp, double advance) const - { - PathPoint startPt = pp; - - PivotPoint res; - if (startPt.m_i == -1) - return res; - - m2::PointD pt1 = startPt.m_pt; - - double angle = 0; - - int j = startPt.m_i; - - if (advance < 0) - { - res.m_angle = startPt.m_segAngle; - res.m_pp.m_segAngle = startPt.m_segAngle; - res.m_pp.m_i = j; - res.m_pp.m_pt = pt1.Move(advance, startPt.m_segAngle.sin(), startPt.m_segAngle.cos()); - return res; - } - - while (advance > 0) - { - if (j + 1 == size()) - return res; - - double l = get(j + 1).Length(pt1); - - double segAngle = j == startPt.m_i ? startPt.m_segAngle.val() - : ang::AngleTo(get(j), get(j + 1)); - - angle += segAngle; - - if (l < advance) - { - advance -= l; - pt1 = get(j + 1); - ++j; - } - else - { - ang::AngleD a(segAngle); - - res.m_pp.m_i = j; - res.m_pp.m_pt = pt1.Move(advance, a.sin(), a.cos()); - advance = 0; - - angle /= (res.m_pp.m_i - startPt.m_i + 1); - res.m_angle = ang::AngleD(angle); - res.m_pp.m_segAngle = a; - - break; - } - } - - return res; - } - - PathPoint const PathView::front() const - { - return PathPoint(0, ang::AngleD(ang::AngleTo(get(0), get(1))), get(0)); - } -} diff --git a/graphics/path_view.hpp b/graphics/path_view.hpp deleted file mode 100644 index d3a3d846f8..0000000000 --- a/graphics/path_view.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include "geometry/point2d.hpp" -#include "geometry/angles.hpp" - -namespace graphics -{ - struct PathPoint - { - int m_i; //< segment number - ang::AngleD m_segAngle; - m2::PointD m_pt; //< point on segment - PathPoint(int i = -1, - ang::AngleD const & segAngle = ang::AngleD(), - m2::PointD const & pt = m2::PointD()); - }; - - struct PivotPoint - { - ang::AngleD m_angle; - PathPoint m_pp; - PivotPoint(ang::AngleD const & angle = ang::AngleD(), PathPoint const & pp = PathPoint()); - }; - - class PathView - { - private: - - m2::PointD const * m_pts; - size_t m_ptsCount; - bool m_isReverse; - - public: - - PathView(); - PathView(m2::PointD const * pts, size_t ptsCount); - - size_t size() const; - - m2::PointD const & get(size_t i) const; - - void setIsReverse(bool flag); - bool isReverse() const; - - PathPoint const offsetPoint(PathPoint const & pp, double offset) const; - PivotPoint findPivotPoint(PathPoint const & pp, double advance) const; - - PathPoint const front() const; - }; - -} diff --git a/graphics/pen.cpp b/graphics/pen.cpp deleted file mode 100644 index 5aa2a1edb9..0000000000 --- a/graphics/pen.cpp +++ /dev/null @@ -1,370 +0,0 @@ -#include "graphics/pen.hpp" - -#include "base/logging.hpp" - -#include "std/algorithm.hpp" -#include "std/iterator.hpp" -#include "std/numeric.hpp" - -#include "graphics/opengl/data_traits.hpp" -#include "graphics/agg_traits.hpp" - -namespace graphics -{ - Pen::Info::Info(Color const & color, - double w, - double const * pattern, - size_t patternSize, - double offset, - char const * symbol, - double step, - ELineJoin join, - ELineCap cap) - : Resource::Info(EPen), - m_color(color), - m_w(w), - m_offset(offset), - m_step(step), - m_join(join), - m_cap(cap), - m_isSolid(false) - { - if (symbol != 0) - m_icon = Icon::Info(symbol); - - if (!m_icon.m_name.empty()) - { - m_isSolid = false; - } - else - { - /// if pattern is solid - if ((pattern == 0 ) || (patternSize == 0)) - m_isSolid = true; - else - { - // hack for Samsung GT-S5570 (GPU floor()'s texture pattern width) - m_w = max(m_w, 1.0); - - buffer_vector tmpV; - copy(pattern, pattern + patternSize, back_inserter(tmpV)); - - if (tmpV.size() % 2) - tmpV.push_back(0); - - double length = 0; - - /// ensuring that a minimal element has a length of 2px - for (size_t i = 0; i < tmpV.size(); ++i) - { - if ((tmpV[i] < 2) && (tmpV[i] > 0)) - tmpV[i] = 2; - length += tmpV[i]; - } - - int i = 0; - - buffer_vector vec; - - if ((offset >= length) || (offset < 0)) - offset -= floor(offset / length) * length; - - double curLen = 0; - - /// shifting pattern - while (true) - { - if (curLen + tmpV[i] > offset) - { - //we're inside, let's split the pattern - - if (i % 2 == 1) - vec.push_back(0); - - vec.push_back(curLen + tmpV[i] - offset); - copy(tmpV.begin() + i + 1, tmpV.end(), back_inserter(vec)); - copy(tmpV.begin(), tmpV.begin() + i, back_inserter(vec)); - vec.push_back(offset - curLen); - - if (i % 2 == 0) - vec.push_back(0); - - break; - } - else - curLen += tmpV[i++]; - } - - int periods = max(int((256 - 4) / length), 1); - m_pat.reserve(periods * vec.size()); - for (int i = 0; i < periods; ++i) - copy(vec.begin(), vec.end(), back_inserter(m_pat)); - } - } - } - - double Pen::Info::firstDashOffset() const - { - double res = 0; - for (size_t i = 0; i < m_pat.size() / 2; ++i) - { - if (m_pat[i * 2] == 0) - res += m_pat[i * 2 + 1]; - } - return res; - } - - bool Pen::Info::atDashOffset(double offset) const - { - double nextDashStart = 0; - for (size_t i = 0; i < m_pat.size() / 2; ++i) - { - if ((offset >= nextDashStart) && (offset < nextDashStart + m_pat[i * 2])) - return true; - else - if ((offset >= nextDashStart + m_pat[i * 2]) && (offset < nextDashStart + m_pat[i * 2] + m_pat[i * 2 + 1])) - return false; - - nextDashStart += m_pat[i * 2] + m_pat[i * 2 + 1]; - } - return false; - } - - Resource::Info const & Pen::Info::cacheKey() const - { - if (!m_icon.m_name.empty()) - return m_icon; - else - return *this; - } - - m2::PointU const Pen::Info::resourceSize() const - { - if (!m_icon.m_name.empty()) - return m_icon.resourceSize(); - - if (m_isSolid) - return m2::PointU(static_cast(ceil(m_w / 2)) * 2 + 4, - static_cast(ceil(m_w / 2)) * 2 + 4); - else - { - uint32_t len = static_cast(accumulate(m_pat.begin(), m_pat.end(), 0.0)); - return m2::PointU(len + 4, static_cast(m_w) + 4); - } - } - - Resource * Pen::Info::createResource(m2::RectU const & texRect, - uint8_t pipelineID) const - { - return new Pen(texRect, - pipelineID, - *this); - } - - bool Pen::Info::lessThan(Resource::Info const * r) const - { - if (m_category != r->m_category) - return m_category < r->m_category; - - Info const * rp = static_cast(r); - - if (m_isSolid != rp->m_isSolid) - return m_isSolid < rp->m_isSolid; - if (m_color != rp->m_color) - return m_color < rp->m_color; - if (m_w != rp->m_w) - return m_w < rp->m_w; - if (m_offset != rp->m_offset) - return m_offset < rp->m_offset; - if (m_pat.size() != rp->m_pat.size()) - return m_pat.size() < rp->m_pat.size(); - for (size_t i = 0; i < m_pat.size(); ++i) - if (m_pat[i] != rp->m_pat[i]) - return m_pat[i] < rp->m_pat[i]; - if (m_join != rp->m_join) - return m_join < rp->m_join; - if (m_cap != rp->m_cap) - return m_cap < rp->m_cap; - if (m_icon.m_name != rp->m_icon.m_name) - return m_icon.m_name < rp->m_icon.m_name; - if (m_step != rp->m_step) - return m_step < rp->m_step; - - return false; - } - - Pen::Pen(m2::RectU const & texRect, - int pipelineID, - Info const & info) - : Resource(EPen, texRect, pipelineID), - m_info(info), - m_isSolid(info.m_isSolid) - { - if (m_isSolid) - m_borderColorPixel = m_centerColorPixel = m2::PointU(texRect.minX() + 1, texRect.minY() + 1); - else - { - double firstDashOffset = info.firstDashOffset(); - m_centerColorPixel = m2::PointU(static_cast(firstDashOffset + texRect.minX() + 3), - static_cast(texRect.minY() + texRect.SizeY() / 2.0)); - m_borderColorPixel = m2::PointU(static_cast(firstDashOffset + texRect.minX() + 3), - static_cast(texRect.minY() + 1)); - } - } - - double Pen::geometryTileLen() const - { - return m_texRect.SizeX() - 2; - } - - double Pen::geometryTileWidth() const - { - return m_texRect.SizeY() - 2; - } - - double Pen::rawTileLen() const - { - return m_texRect.SizeX() - 4; - } - - double Pen::rawTileWidth() const - { - return m_texRect.SizeY() - 4; - } - - void Pen::render(void * dst) - { - Info const & info = m_info; - m2::RectU const & rect = m_texRect; - - DATA_TRAITS::view_t v = gil::interleaved_view(rect.SizeX(), - rect.SizeY(), - (DATA_TRAITS::pixel_t*)dst, - sizeof(DATA_TRAITS::pixel_t) * rect.SizeX()); - - graphics::Color penColor = info.m_color; - - penColor /= DATA_TRAITS::channelScaleFactor; - - DATA_TRAITS::pixel_t penColorTranslucent; - - gil::get_color(penColorTranslucent, gil::red_t()) = penColor.r; - gil::get_color(penColorTranslucent, gil::green_t()) = penColor.g; - gil::get_color(penColorTranslucent, gil::blue_t()) = penColor.b; - gil::get_color(penColorTranslucent, gil::alpha_t()) = 0; - - DATA_TRAITS::pixel_t pxPenColor = penColorTranslucent; - gil::get_color(pxPenColor, gil::alpha_t()) = penColor.a; - - if (info.m_isSolid) - { - /// draw circle - - // we need symmetrical non-antialiased circle. To achive symmetry, ceil it to pixel boundary - // exact sub-pixel line width gets set later, and texture gets sceled down a bit for anti-aliasing - float r = ceil(info.m_w / 2.0); - - agg::rendering_buffer buf( - (unsigned char *)&v(0, 0), - rect.SizeX(), - rect.SizeY(), - rect.SizeX() * sizeof(DATA_TRAITS::pixel_t) - ); - - typedef AggTraits::pixfmt_t agg_pixfmt_t; - - agg_pixfmt_t pixfmt(buf); - agg::renderer_base rbase(pixfmt); - - gil::fill_pixels(v, penColorTranslucent); - - agg::scanline_u8 s; - agg::rasterizer_scanline_aa<> rasterizer; - - agg::ellipse ell; - - ell.init(r + 2, r + 2, r, r, 100); - rasterizer.add_path(ell); - - agg::render_scanlines_aa_solid(rasterizer, - s, - rbase, - agg::rgba8(info.m_color.r, - info.m_color.g, - info.m_color.b, - info.m_color.a)); - - for (size_t x = 2; x <= v.width() - 2; ++x) - for (size_t y = 2; y <= v.height() - 2; ++y) - { - unsigned char alpha = gil::get_color(v(x, y), gil::alpha_t()); - if (alpha != 0) - v(x, y) = pxPenColor; - } - } - else - { - /// First two and last two rows of a pattern are filled - /// with a penColorTranslucent pixel for the antialiasing. - for (size_t y = 0; y < 2; ++y) - for (size_t x = 0; x < rect.SizeX(); ++x) - v(x, y) = penColorTranslucent; - - for (size_t y = rect.SizeY() - 2; y < rect.SizeY(); ++y) - for (size_t x = 0; x < rect.SizeX(); ++x) - v(x, y) = penColorTranslucent; - - /// first and last two pixels filled with penColorTranslucent - for (size_t y = 2; y < rect.SizeY() - 2; ++y) - { - v(0, y) = penColorTranslucent; - v(1, y) = penColorTranslucent; - v(rect.SizeX() - 2, y) = penColorTranslucent; - v(rect.SizeX() - 1, y) = penColorTranslucent; - } - - /// draw pattern - for (size_t y = 2; y < rect.SizeY() - 2; ++y) - { - double curLen = 0; - - DATA_TRAITS::pixel_t px = pxPenColor; - - /// In general case this code is incorrect. - /// TODO : Make a pattern start and end with a dash. - uint32_t curLenI = static_cast(curLen); - - v(curLenI, y) = px; - v(curLenI + 1, y) = px; - - for (size_t i = 0; i < info.m_pat.size(); ++i) - { - for (size_t j = 0; j < info.m_pat[i]; ++j) - { - uint32_t val = (i + 1) % 2; - - if (val == 0) - gil::get_color(px, gil::alpha_t()) = 0; - else - gil::get_color(px, gil::alpha_t()) = penColor.a; - - v(curLenI + j + 2, y) = px; - } - - v(static_cast(curLen + 2 + info.m_pat[i]), y) = px; - v(static_cast(curLen + 2 + info.m_pat[i] + 1), y) = px; - - curLen += info.m_pat[i]; - - curLenI = static_cast(curLen); - } - } - } - } - - Resource::Info const * Pen::info() const - { - return &m_info; - } - -} diff --git a/graphics/pen.hpp b/graphics/pen.hpp deleted file mode 100644 index f238a67527..0000000000 --- a/graphics/pen.hpp +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -#include "graphics/resource.hpp" -#include "graphics/icon.hpp" -#include "graphics/color.hpp" - -#include "geometry/point2d.hpp" - -#include "base/buffer_vector.hpp" - -namespace graphics -{ - struct Pen : public Resource - { - /// definition of the line style pattern - /// used as a texture-cache-key - struct Info : public Resource::Info - { - enum ELineJoin - { - ERoundJoin, - EBevelJoin, - ENoJoin - }; - - enum ELineCap - { - ERoundCap, - EButtCap, - ESquareCap - }; - - typedef buffer_vector TPattern; - Color m_color; - double m_w; - TPattern m_pat; - double m_offset; - Icon::Info m_icon; - double m_step; - ELineJoin m_join; - ELineCap m_cap; - - bool m_isSolid; - - Info(Color const & color = Color(0, 0, 0, 255), - double width = 1.0, - double const * pattern = 0, - size_t patternSize = 0, - double offset = 0, - char const * symbol = 0, - double step = 0, - ELineJoin join = ERoundJoin, - ELineCap cap = ERoundCap); - - double firstDashOffset() const; - bool atDashOffset(double offset) const; - - Resource::Info const & cacheKey() const; - m2::PointU const resourceSize() const; - Resource * createResource(m2::RectU const & texRect, - uint8_t pipelineID) const; - - bool lessThan(Resource::Info const * r) const; - }; - - Info m_info; - - bool m_isSolid; - - m2::PointU m_centerColorPixel; - m2::PointU m_borderColorPixel; - - Pen(m2::RectU const & texRect, - int pipelineID, - Info const & info); - - /// with antialiasing zones - double geometryTileLen() const; - double geometryTileWidth() const; - - /// without antialiasing zones - double rawTileLen() const; - double rawTileWidth() const; - - void render(void * dst); - Resource::Info const * info() const; - }; -} diff --git a/graphics/pipeline_manager.cpp b/graphics/pipeline_manager.cpp deleted file mode 100644 index 1be0ae6583..0000000000 --- a/graphics/pipeline_manager.cpp +++ /dev/null @@ -1,286 +0,0 @@ -#include "graphics/pipeline_manager.hpp" -#include "graphics/resource_cache.hpp" -#include "graphics/resource_manager.hpp" - -#include "graphics/opengl/buffer_object.hpp" - -#include "platform/platform.hpp" - -#include "base/logging.hpp" - -#include "std/iterator.hpp" -#include "std/bind.hpp" -#include "std/numeric.hpp" -#include "std/utility.hpp" - -namespace graphics -{ - PipelinesManager::PipelinesManager(base_t::Params const & p) - : base_t(p) - {} - - unsigned PipelinesManager::reservePipelines(unsigned count, - ETextureType textureType, - EStorageType storageType, - VertexDecl const * decl) - { - vector > v; - - for (unsigned i = 0; i < count; ++i) - v.push_back(make_shared(resourceManager(), - textureType, - pipelinesCount() + i)); - - return reservePipelines(v, storageType, decl); - } - - unsigned PipelinesManager::reservePipelines(vector > const & caches, - EStorageType storageType, - VertexDecl const * decl) - { - unsigned res = m_pipelines.size(); - - for (unsigned i = 0; i < caches.size(); ++i) - { - GeometryPipeline p(caches[i], - storageType, - resourceManager(), - decl); - - m_pipelines.push_back(p); - m_clearPageFns.push_back(clearPageFns()); - - int pipelineID = res + i; - - addClearPageFn(pipelineID, bind(&PipelinesManager::freeTexture, this, pipelineID), 99); - addClearPageFn(pipelineID, bind(&PipelinesManager::clearPageHandles, this, pipelineID), 0); - - } - - return res; - } - - PipelinesManager::~PipelinesManager() - { - for (size_t i = 0; i < m_pipelines.size(); ++i) - { - discardPipeline(i); - freePipeline(i); - freeTexture(i); - } - } - - pair PipelinesManager::unpackID(uint32_t id) const - { - uint8_t const pipelineID = (id & 0xFF000000) >> 24; - uint32_t const h = (id & 0x00FFFFFF); - return make_pair(pipelineID, h); - } - - uint32_t PipelinesManager::packID(uint8_t pipelineID, uint32_t handle) const - { - uint32_t const pipelineIDMask = (uint32_t)pipelineID << 24; - uint32_t const h = (handle & 0x00FFFFFF); - return static_cast(pipelineIDMask | h); - } - - Resource const * PipelinesManager::fromID(uint32_t id) - { - if (id == invalidHandle()) - return 0; - - id_pair_t p = unpackID(id); - - ASSERT(p.first < m_pipelines.size(), ()); - return m_pipelines[p.first].cache()->fromID(p.second); - } - - - void PipelinesManager::addClearPageFn(int pipelineID, clearPageFn fn, int priority) - { - m_clearPageFns[pipelineID].push(std::pair(priority, fn)); - } - - void PipelinesManager::callClearPageFns(int pipelineID) - { - clearPageFns handlersCopy = m_clearPageFns[pipelineID]; - while (!handlersCopy.empty()) - { - handlersCopy.top().second(); - handlersCopy.pop(); - } - } - - void PipelinesManager::clearPageHandles(int pipelineID) - { - m_pipelines[pipelineID].cache()->clearHandles(); - } - - uint32_t PipelinesManager::invalidHandle() const - { - return 0xFFFFFFFF; - } - - uint32_t PipelinesManager::invalidPageHandle() const - { - return 0x00FFFFFF; - } - - void PipelinesManager::memoryWarning() - { - } - - void PipelinesManager::enterBackground() - { - } - - void PipelinesManager::enterForeground() - { - } - - void PipelinesManager::clearHandles() - { - for (unsigned i = 0; i < m_pipelines.size(); ++i) - m_pipelines[i].cache()->clear(); - } - - void PipelinesManager::freeTexture(int pipelineID) - { - GeometryPipeline & p = m_pipelines[pipelineID]; - - if (p.hasTexture()) - { - shared_ptr texture = p.texture(); - TTexturePool * texturePool = p.texturePool(); - - if (texturePool == 0) - return; - - base_t::freeTexture(texture, texturePool); - - p.resetTexture(); - } - } - - void PipelinesManager::freePipeline(int pipelineID) - { - GeometryPipeline & p = m_pipelines[pipelineID]; - - if (p.hasStorage()) - { - TStoragePool * storagePool = p.storagePool(); - - if (storagePool == 0) - return; - - base_t::freeStorage(p.storage(), storagePool); - - p.resetStorage(); - } - } - - bool PipelinesManager::flushPipeline(int pipelineID) - { - GeometryPipeline & p = m_pipelines[pipelineID]; - - if (p.hasGeometry()) - { - if (p.hasUploadData()) - { - ResourceCache::TUploadQueue const & uploadQueue = p.uploadQueue(); - - uploadResources(&uploadQueue[0], - uploadQueue.size(), - p.texture()); - - p.clearUploadQueue(); - } - - unlockPipeline(pipelineID); - - drawGeometry(p.texture(), - p.storage(), - p.currentIdx(), - 0, - ETriangles); - - discardPipeline(pipelineID); - - freePipeline(pipelineID); - - resetPipeline(pipelineID); - - return true; - } - - return false; - } - - void PipelinesManager::unlockPipeline(int pipelineID) - { - GeometryPipeline & pipeline = m_pipelines[pipelineID]; - if (pipeline.hasStorage()) - base_t::unlockStorage(pipeline.storage()); - } - - void PipelinesManager::discardPipeline(int pipelineID) - { - GeometryPipeline & pipeline = m_pipelines[pipelineID]; - if (pipeline.hasStorage()) - base_t::discardStorage(pipeline.storage()); - } - - void PipelinesManager::resetPipeline(int pipelineID) - { - for (size_t i = 0; i < m_pipelines.size(); ++i) - { - if ((pipelineID == -1) || ((size_t)pipelineID == i)) - pipeline(i).resetStorage(); - } - } - - void PipelinesManager::clearPipeline(int pipelineID) - { - for (size_t i = 0; i < m_pipelines.size(); ++i) - { - if ((pipelineID == -1) || ((size_t)pipelineID == i)) - pipeline(i).clearStorage(); - } - } - - void PipelinesManager::beginFrame() - { - base_t::beginFrame(); - clearPipeline(-1); - } - - void PipelinesManager::endFrame() - { - enableClipRect(false); - - /// is the rendering was cancelled, there possibly could - /// be "ghost" render styles which are present in internal - /// skin structures, but aren't rendered onto skin texture. - /// so we are clearing the whole skin, to ensure that they - /// are gone(slightly heavy, but very simple solution). - if (isCancelled()) - clearHandles(); - - base_t::endFrame(); - } - - unsigned PipelinesManager::pipelinesCount() const - { - return m_pipelines.size(); - } - - GeometryPipeline & PipelinesManager::pipeline(int i) - { - return m_pipelines[i]; - } - - GeometryPipeline const & PipelinesManager::pipeline(int i) const - { - return m_pipelines[i]; - } -} diff --git a/graphics/pipeline_manager.hpp b/graphics/pipeline_manager.hpp deleted file mode 100644 index 0f9e8f35c0..0000000000 --- a/graphics/pipeline_manager.hpp +++ /dev/null @@ -1,109 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" -#include "std/function.hpp" -#include "std/vector.hpp" -#include "std/queue.hpp" - -#include "geometry/rect2d.hpp" - -#include "graphics/opengl/vertex.hpp" - -#include "graphics/display_list_renderer.hpp" -#include "graphics/resource.hpp" -#include "graphics/geometry_pipeline.hpp" - -namespace graphics -{ - template - struct first_less - { - bool operator()(pair_t const & first, pair_t const & second) - { - return first.first < second.first; - } - }; - - class PipelinesManager : public DisplayListRenderer - { - public: - - typedef DisplayListRenderer base_t; - - typedef function clearPageFn; - typedef function overflowFn; - - private: - - vector m_pipelines; - - typedef pair id_pair_t; - - typedef priority_queue, - vector >, - first_less > - > clearPageFns; - - vector m_clearPageFns; - - typedef priority_queue, - vector >, - first_less > - > overflowFns; - - vector m_overflowFns; - void callOverflowFns(uint8_t pipelineID); - - void clearPageHandles(int pipelineID); - - public: - - PipelinesManager(base_t::Params const & params); - ~PipelinesManager(); - - id_pair_t unpackID(uint32_t id) const; - uint32_t packID(uint8_t, uint32_t) const; - - /// obtain Resource from id - Resource const * fromID(uint32_t id); - - void addClearPageFn(int pipelineID, clearPageFn fn, int priority); - void callClearPageFns(int pipelineID); - - /// reserve static pipelines - unsigned reservePipelines(vector > const & caches, - EStorageType storageType, - VertexDecl const * decl); - - /// reserve dynamic pipelines - unsigned reservePipelines(unsigned count, - ETextureType textureType, - EStorageType storageType, - VertexDecl const * decl); - - void freePipeline(int pipelineID); - void freeTexture(int pipelineID); - - bool flushPipeline(int pipelineID); - void unlockPipeline(int pipelineID); - void discardPipeline(int pipelineID); - void resetPipeline(int pipelineID); - void clearPipeline(int pipelineID); - - GeometryPipeline const & pipeline(int i) const; - GeometryPipeline & pipeline(int i); - unsigned pipelinesCount() const; - - uint32_t invalidHandle() const; - uint32_t invalidPageHandle() const; - - void clearHandles(); - - void memoryWarning(); - void enterBackground(); - void enterForeground(); - - void beginFrame(); - void endFrame(); - }; -} diff --git a/graphics/render_context.cpp b/graphics/render_context.cpp deleted file mode 100644 index 60b5cf1c58..0000000000 --- a/graphics/render_context.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "base/SRC_FIRST.hpp" -#include "graphics/render_context.hpp" - -namespace graphics -{ - void RenderContext::setMatrix(EMatrix mt, TMatrix const & m) - { - m_matrices[mt] = m; - } - - RenderContext::TMatrix const & RenderContext::matrix(EMatrix m) const - { - map::const_iterator it = m_matrices.find(m); - return it->second; - } - - void RenderContext::startThreadDrawing(unsigned threadSlot) - { - ASSERT(m_threadSlot == -1, ()); - m_threadSlot = threadSlot; - } - - void RenderContext::endThreadDrawing(unsigned threadSlot) - { - ASSERT(m_threadSlot != -1, ()); - m_threadSlot = -1; - } - - RenderContext::RenderContext() - : m_threadSlot(-1) - { - setMatrix(EModelView, math::Identity()); - setMatrix(EProjection, math::Identity()); - } - - RenderContext::~RenderContext() - {} - - void RenderContext::setResourceManager(const shared_ptr &rm) - { - m_resourceManager = rm; - } - - shared_ptr const & RenderContext::resourceManager() const - { - return m_resourceManager; - } - - unsigned RenderContext::threadSlot() const - { - return m_threadSlot; - } -} diff --git a/graphics/render_context.hpp b/graphics/render_context.hpp deleted file mode 100644 index 3c9e3745e0..0000000000 --- a/graphics/render_context.hpp +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" -#include "std/map.hpp" -#include "base/matrix.hpp" -#include "graphics/defines.hpp" - -namespace graphics -{ - class ResourceManager; - - /// base class for render contexts. - /// contains current render state data. - class RenderContext - { - public: - - typedef math::Matrix TMatrix; - - private: - - /// Rendering states - /// @{ - map m_matrices; - /// @} - - unsigned m_threadSlot; - shared_ptr m_resourceManager; - - protected: - - unsigned threadSlot() const; - - public: - - /// Working with rendering states. - /// @{ - TMatrix const & matrix(EMatrix m) const; - void setMatrix(EMatrix mt, TMatrix const & m); - /// @} - - /// Constructor - RenderContext(); - /// Destructor. - virtual ~RenderContext(); - /// Make this context current for the specified thread. - virtual void makeCurrent() = 0; - /// Create a render context which is shared with this one. - /// Context sharing means that all resources created in one context - /// can be used in shared context and vice versa. - virtual RenderContext * createShared() = 0; - /// this function should be called from each opengl thread - /// to setup some thread parameters. - virtual void startThreadDrawing(unsigned threadSlot); - /// called at the end of thread - virtual void endThreadDrawing(unsigned threadSlot); - /// set attached resource manager - void setResourceManager(shared_ptr const & rm); - /// get the attached resource manager - shared_ptr const & resourceManager() const; - }; -} diff --git a/graphics/render_state_layer.hpp b/graphics/render_state_layer.hpp deleted file mode 100644 index 4181baf0ab..0000000000 --- a/graphics/render_state_layer.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "geometry/screenbase.hpp" -#include "std/shared_ptr.hpp" - -namespace yg -{ - namespace gl - { - class RenderState; - class BaseTexture; - - struct RenderStateLayer - { - RenderState * m_renderState; - - shared_ptr m_frontBuffer; - ScreenBase m_frontScreen; - - shared_ptr m_backBuffer; - ScreenBase m_backScreen; - }; - } -} diff --git a/graphics/render_target.cpp b/graphics/render_target.cpp deleted file mode 100644 index 5f62afe42a..0000000000 --- a/graphics/render_target.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "graphics/render_target.hpp" -#include "graphics/coordinates.hpp" -#include "graphics/defines.hpp" - -namespace graphics -{ - RenderTarget::~RenderTarget() - {} - - void RenderTarget::coordMatrix(math::Matrix & m) - { - getOrthoMatrix(m, 0, width(), 0, height(), minDepth, maxDepth + 100); - } -} diff --git a/graphics/render_target.hpp b/graphics/render_target.hpp deleted file mode 100644 index f4715ea9db..0000000000 --- a/graphics/render_target.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "base/matrix.hpp" - -namespace graphics -{ - class RenderTarget - { - public: - virtual ~RenderTarget(); - virtual unsigned int id() const = 0; - /// attach render target to framebuffer and setup coordinate system - virtual void attachToFrameBuffer() = 0; - virtual void detachFromFrameBuffer() = 0; - virtual void coordMatrix(math::Matrix & m); - virtual unsigned width() const = 0; - virtual unsigned height() const = 0; - }; -} diff --git a/graphics/resource.cpp b/graphics/resource.cpp deleted file mode 100644 index 3c69c800ad..0000000000 --- a/graphics/resource.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "graphics/resource.hpp" - -#include "graphics/opengl/data_traits.hpp" - -namespace graphics -{ - bool Resource::LessThan::operator()(Info const * l, - Info const * r) const - { - return l->lessThan(r); - } - - Resource::Info::Info(Category cat) - : m_category(cat) - {} - - Resource::Resource( - Category cat, - m2::RectU const & texRect, - int pipelineID) - : m_cat(cat), - m_texRect(texRect), - m_pipelineID(pipelineID) - {} - - Resource::~Resource() - {} -} diff --git a/graphics/resource.hpp b/graphics/resource.hpp deleted file mode 100644 index 59a6ba42fb..0000000000 --- a/graphics/resource.hpp +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "geometry/rect2d.hpp" - - -namespace graphics -{ - struct Resource - { - enum Category - { - EBrush = 1, - EPen, - EGlyph, - EIcon, - ECircle, - EImage, - EUnknown - }; - - /// Base class for lighweight Resource description - struct Info - { - Category m_category; - - Info(Category cat); - - virtual Info const & cacheKey() const = 0; - /// returns the size of this resource info which will - /// be occupied in texture cache. - virtual m2::PointU const resourceSize() const = 0; - /// factory method for Resource object - virtual Resource * createResource(m2::RectU const & texRect, - uint8_t pipelineID) const = 0; - /// comparing for using Info as a key in map. - virtual bool lessThan(Info const * r) const = 0; - }; - - Category m_cat; - m2::RectU m_texRect; - int m_pipelineID; - - virtual ~Resource(); - virtual void render(void * dst) = 0; - /// get key for ResourceCache. - virtual Info const * info() const = 0; - - struct LessThan - { - bool operator()(Info const * l, - Info const * r) const; - }; - - protected: - Resource(Category cat, - m2::RectU const & texRect, - int pipelineID); - }; -} diff --git a/graphics/resource_cache.cpp b/graphics/resource_cache.cpp deleted file mode 100644 index 16c851178b..0000000000 --- a/graphics/resource_cache.cpp +++ /dev/null @@ -1,249 +0,0 @@ -#include "graphics/resource_cache.hpp" - -#include "graphics/opengl/texture.hpp" -#include "graphics/opengl/data_traits.hpp" - -#include "graphics/resource_manager.hpp" - -#include "base/logging.hpp" - -#include "std/bind.hpp" -#include "std/numeric.hpp" - -namespace graphics -{ - typedef gl::Texture TDynamicTexture; - - ResourceCache::ResourceCache() - : m_textureType(EStaticTexture), - m_pipelineID(0) - {} - - ResourceCache::ResourceCache(shared_ptr const & resourceManager, - string const & name, - uint8_t pipelineID) - : m_texture(resourceManager->getTexture(name)), - m_packer(m_texture->width(), m_texture->height(), 0x00FFFFFF - 1), - m_textureType(EStaticTexture), - m_pipelineID(pipelineID) - { - } - - ResourceCache::ResourceCache(shared_ptr const & resourceManager, - ETextureType type, - uint8_t pipelineID) - : m_resourceManager(resourceManager), - m_textureType(type), - m_pipelineID(pipelineID) - { - createPacker(); - /// clear handles will be called only upon handles overflow, - /// as the texture overflow is processed separately - addHandlesOverflowFn(bind(&ResourceCache::clearHandles, this), 0); - } - - void ResourceCache::clearHandles() - { - if (m_textureType != graphics::EStaticTexture) - { - /// clearing only non-static caches. - for (TResourceInfos::const_iterator it = m_infos.begin(); - it != m_infos.end(); - ++it) - m_resources.erase(it->second); - - m_infos.clear(); - m_packer.reset(); - } - } - - void ResourceCache::clearUploadQueue() - { - m_uploadQueue.clear(); - } - - void ResourceCache::clear() - { - if (m_textureType != EStaticTexture) - { - clearHandles(); - clearUploadQueue(); - } - } - - uint32_t ResourceCache::findInfo(Resource::Info const & info) const - { - TResourceInfos::const_iterator it = m_infos.find(&info); - if (it == m_infos.end()) - return m_packer.invalidHandle(); - else - return it->second; - } - - uint32_t ResourceCache::mapInfo(Resource::Info const & info) - { - uint32_t foundHandle = findInfo(info); - if (foundHandle != m_packer.invalidHandle()) - return foundHandle; - - m2::PointU sz = info.resourceSize(); - - m2::Packer::handle_t h = m_packer.pack(sz.x, sz.y); - - m2::RectU texRect = m_packer.find(h).second; - shared_ptr resource(info.createResource(texRect, m_pipelineID)); - - m_resources[h] = resource; - m_infos[resource->info()] = h; - m_uploadQueue.push_back(resource); - - return h; - } - - uint32_t ResourceCache::addParentInfo(Resource::Info const & fullInfo) - { - uint32_t id = findInfo(fullInfo.cacheKey()); - Resource * r = fromID(id); - - shared_ptr resource(fullInfo.createResource(r->m_texRect, r->m_pipelineID)); - - uint32_t newID = m_packer.freeHandle(); - - m_parentResources[newID] = resource; - m_infos[resource->info()] = newID; - - return newID; - } - - bool ResourceCache::hasRoom(Resource::Info const & info) const - { - m2::PointU sz = info.resourceSize(); - return m_packer.hasRoom(sz.x, sz.y); - } - - void ResourceCache::setType(ETextureType textureType) - { - m_textureType = textureType; - createPacker(); - if (m_textureType != EStaticTexture) - addHandlesOverflowFn(bind(&ResourceCache::clearHandles, this), 0); - } - - ETextureType ResourceCache::type() const - { - return m_textureType; - } - - bool ResourceCache::hasData() - { - return !m_uploadQueue.empty(); - } - - ResourceCache::TUploadQueue const & ResourceCache::uploadQueue() const - { - return m_uploadQueue; - } - - void ResourceCache::checkTexture() const - { - if ((m_textureType != EStaticTexture) && (m_texture == 0)) - reserveTexture(); - } - - void ResourceCache::setPipelineID(uint8_t pipelineID) - { - m_pipelineID = pipelineID; - for (TResources::iterator it = m_resources.begin(); - it != m_resources.end(); - ++it) - it->second->m_pipelineID = pipelineID; - } - - uint8_t ResourceCache::pipelineID() const - { - return m_pipelineID; - } - - Resource * ResourceCache::fromID(uint32_t idx) const - { - TResources::const_iterator it = m_parentResources.find(idx); - - it = m_parentResources.find(idx); - - if (it != m_parentResources.end()) - return it->second.get(); - - it = m_resources.find(idx); - - if (it != m_resources.end()) - return it->second.get(); - - return 0; - } - - shared_ptr const & ResourceCache::texture() const - { - checkTexture(); - return m_texture; - } - - bool ResourceCache::hasTexture() const - { - return m_texture != 0; - } - - void ResourceCache::setTexture(shared_ptr const & texture) - { - m_texture = texture; - m_packer = m2::Packer(texture->width(), - texture->height(), - 0x00FFFFFF - 1); - } - - void ResourceCache::resetTexture() - { - m_texture.reset(); - } - - void ResourceCache::reserveTexture() const - { - if (m_textureType != EStaticTexture) - m_texture = m_resourceManager->texturePool(m_textureType)->Reserve(); - else - LOG(LDEBUG, ("reserveTexture call for with invalid type param")); - } - - TTexturePool * ResourceCache::texturePool() const - { - if (m_textureType == EStaticTexture) - return 0; - - if (m_textureType != EInvalidTexture) - return m_resourceManager->texturePool(m_textureType); - else - { - LOG(LDEBUG/*LWARNING*/, ("no texturePool with such type", m_textureType)); - return 0; - } - } - - void ResourceCache::createPacker() - { - if (m_textureType != EStaticTexture) - m_packer = m2::Packer(m_resourceManager->params().m_textureParams[m_textureType].m_texWidth, - m_resourceManager->params().m_textureParams[m_textureType].m_texHeight, - 0x00FFFFFF - 1); - else - LOG(LDEBUG, ("createPacker call for invalid type param")); - } - - shared_ptr const & ResourceCache::resourceManager() const - { - return m_resourceManager; - } - - void ResourceCache::addHandlesOverflowFn(handlesOverflowFn const & fn, int priority) - { - m_packer.addOverflowFn(fn, priority); - } -} diff --git a/graphics/resource_cache.hpp b/graphics/resource_cache.hpp deleted file mode 100644 index 01f9ba519c..0000000000 --- a/graphics/resource_cache.hpp +++ /dev/null @@ -1,111 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" -#include "std/map.hpp" - -#include "geometry/packer.hpp" -#include "geometry/rect2d.hpp" - -#include "graphics/resource.hpp" -#include "graphics/packets_queue.hpp" -#include "graphics/defines.hpp" -#include "graphics/resource_manager.hpp" - -namespace graphics -{ - namespace gl - { - class BaseTexture; - } - - class ResourceManager; - - class ResourceCache - { - public: - - typedef m2::Packer::overflowFn handlesOverflowFn; - - typedef vector > TUploadQueue; - - private: - - typedef map > TResources; - - TResources m_resources; - TResources m_parentResources; - - typedef map TResourceInfos; - TResourceInfos m_infos; - - /// made mutable to implement lazy reservation of texture - /// @{ - mutable shared_ptr m_texture; - mutable shared_ptr m_resourceManager; - /// @} - - m2::Packer m_packer; - - TUploadQueue m_uploadQueue; - - ETextureType m_textureType; - EStorageType m_storageType; - uint32_t m_pipelineID; - - /// number of pending rendering commands, - /// that are using this skin_page - uint32_t m_activeCommands; - - friend class ResourceManager; - - public: - - void clearHandles(); - void clear(); - - bool hasData(); - TUploadQueue const & uploadQueue() const; - void clearUploadQueue(); - - void checkTexture() const; - - uint8_t pipelineID() const; - void setPipelineID(uint8_t pipelineID); - - /// creation of detached page - ResourceCache(); - - /// creation of a static page - ResourceCache(shared_ptr const & resourceManager, - string const & name, - uint8_t pipelineID); - - /// creation of a dynamic page - ResourceCache(shared_ptr const & resourceManager, - ETextureType type, - uint8_t pipelineID); - - void reserveTexture() const; - void resetTexture(); - void createPacker(); - - uint32_t findInfo(Resource::Info const & info) const; - uint32_t mapInfo(Resource::Info const & info); - uint32_t addParentInfo(Resource::Info const & fullInfo); - bool hasRoom(Resource::Info const & info) const; - - Resource * fromID(uint32_t idx) const; - - void setType(ETextureType textureType); - ETextureType type() const; - shared_ptr const & resourceManager() const; - - void addHandlesOverflowFn(handlesOverflowFn const & fn, int priority); - - bool hasTexture() const; - shared_ptr const & texture() const; - void setTexture(shared_ptr const & t); - - TTexturePool * texturePool() const; - }; -} diff --git a/graphics/resource_manager.cpp b/graphics/resource_manager.cpp deleted file mode 100644 index 39e8b982d1..0000000000 --- a/graphics/resource_manager.cpp +++ /dev/null @@ -1,502 +0,0 @@ -#include "graphics/resource_manager.hpp" - -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/base_texture.hpp" -#include "graphics/opengl/data_traits.hpp" -#include "graphics/opengl/storage.hpp" -#include "graphics/opengl/texture.hpp" -#include "graphics/opengl/buffer_object.hpp" - -#include "graphics/resource_manager.hpp" -#include "graphics/resource_cache.hpp" -#include "graphics/icon.hpp" -#include "graphics/skin_loader.hpp" - -#include "coding/file_reader.hpp" -#include "coding/parse_xml.hpp" - -#include "base/logging.hpp" -#include "base/exception.hpp" - -#include "indexer/map_style_reader.hpp" - -namespace graphics -{ - typedef gl::Texture TDynamicTexture; - typedef gl::Texture TStaticTexture; - - DECLARE_EXCEPTION(ResourceManagerException, RootException); - - size_t pixelSize(graphics::DataFormat texFormat) - { - switch (texFormat) - { - case graphics::Data8Bpp: - return 4; - case graphics::Data4Bpp: - return 2; - case graphics::Data565Bpp: - return 2; - default: - return 0; - } - } - - TTextureFactory::TTextureFactory(size_t w, size_t h, graphics::DataFormat format, char const * resName, size_t batchSize) - : BasePoolElemFactory(resName, w * h * pixelSize(format), batchSize), - m_w(w), m_h(h), m_format(format) - {} - - shared_ptr const TTextureFactory::Create() - { - switch (m_format) - { - case graphics::Data4Bpp: - return shared_ptr(new gl::Texture(m_w, m_h)); - case graphics::Data8Bpp: - return shared_ptr(new gl::Texture(m_w, m_h)); - case graphics::Data565Bpp: - return shared_ptr(new gl::Texture(m_w, m_h)); - default: - return shared_ptr(); - } - } - - TStorageFactory::TStorageFactory(size_t vbSize, size_t ibSize, bool useSingleThreadedOGL, char const * resName, size_t batchSize) - : BasePoolElemFactory(resName, vbSize + ibSize, batchSize), - m_vbSize(vbSize), - m_ibSize(ibSize), - m_useSingleThreadedOGL(useSingleThreadedOGL) - {} - - gl::Storage const TStorageFactory::Create() - { - gl::Storage res(m_vbSize, m_ibSize); - - if (m_useSingleThreadedOGL) - { - res.m_indices->lock(); - res.m_vertices->lock(); - } - return res; - } - - void TStorageFactory::BeforeMerge(gl::Storage const & e) - { - if (m_useSingleThreadedOGL) - { - if (e.m_indices->isLocked()) - e.m_indices->unlock(); - - e.m_indices->lock(); - - if (e.m_vertices->isLocked()) - e.m_vertices->unlock(); - - e.m_vertices->lock(); - } - } - - ResourceManager::StoragePoolParams::StoragePoolParams(size_t vbSize, - size_t vertexSize, - size_t ibSize, - size_t indexSize, - size_t storagesCount, - EStorageType storageType, - bool isDebugging) - : m_vbSize(vbSize), - m_vertexSize(vertexSize), - m_ibSize(ibSize), - m_indexSize(indexSize), - m_storagesCount(storagesCount), - m_storageType(storageType), - m_isDebugging(isDebugging) - {} - - ResourceManager::StoragePoolParams::StoragePoolParams(EStorageType storageType) - : m_vbSize(0), - m_vertexSize(0), - m_ibSize(0), - m_indexSize(0), - m_storagesCount(0), - m_storageType(storageType), - m_isDebugging(false) - {} - - ResourceManager::StoragePoolParams::StoragePoolParams() - : m_vbSize(0), - m_vertexSize(0), - m_ibSize(0), - m_indexSize(0), - m_storagesCount(0), - m_storageType(EInvalidStorage), - m_isDebugging(false) - {} - - bool ResourceManager::StoragePoolParams::isValid() const - { - return m_vbSize && m_ibSize && m_storagesCount; - } - - ResourceManager::TexturePoolParams::TexturePoolParams(size_t texWidth, - size_t texHeight, - size_t texCount, - graphics::DataFormat format, - ETextureType textureType, - bool isDebugging) - : m_texWidth(texWidth), - m_texHeight(texHeight), - m_texCount(texCount), - m_format(format), - m_textureType(textureType), - m_isDebugging(isDebugging) - {} - - ResourceManager::TexturePoolParams::TexturePoolParams(ETextureType textureType) - : m_texWidth(0), - m_texHeight(0), - m_texCount(0), - m_textureType(textureType), - m_isDebugging(false) - {} - - ResourceManager::TexturePoolParams::TexturePoolParams() - : m_texWidth(0), - m_texHeight(0), - m_texCount(0), - m_textureType(EInvalidTexture), - m_isDebugging(false) - {} - - bool ResourceManager::TexturePoolParams::isValid() const - { - return m_texWidth && m_texHeight && m_texCount; - } - - ResourceManager::GlyphCacheParams::GlyphCacheParams() - : m_glyphCacheMemoryLimit(0) - {} - - ResourceManager::GlyphCacheParams::GlyphCacheParams(string const & unicodeBlockFile, - string const & whiteListFile, - string const & blackListFile, - size_t glyphCacheMemoryLimit, - EDensity density) - : m_unicodeBlockFile(unicodeBlockFile), - m_whiteListFile(whiteListFile), - m_blackListFile(blackListFile), - m_glyphCacheMemoryLimit(glyphCacheMemoryLimit), - m_density(density) - {} - -namespace -{ - void GetGLStringSafe(GLenum name, string & str) - { - char const * s = reinterpret_cast(glGetString(name)); - if (s) - str = s; - else - { - OGLCHECKAFTER; - LOG(LDEBUG/*LWARNING*/, ("Can't get OpenGL name")); - } - } -} - - ResourceManager::Params::Params() - : m_texFormat(graphics::Data4Bpp), - m_texRtFormat(graphics::Data4Bpp), - m_useSingleThreadedOGL(false), - m_videoMemoryLimit(0), - m_renderThreadsCount(0), - m_threadSlotsCount(0) - { - for (unsigned i = 0; i < EInvalidStorage + 1; ++i) - m_storageParams.push_back(ResourceManager::StoragePoolParams(EStorageType(i))); - - for (unsigned i = 0; i < EInvalidTexture + 1; ++i) - m_textureParams.push_back(ResourceManager::TexturePoolParams(ETextureType(i))); - - GetGLStringSafe(GL_VENDOR, m_vendorName); - GetGLStringSafe(GL_RENDERER, m_rendererName); - GetGLStringSafe(GL_VERSION, m_versionName); - } - - bool ResourceManager::Params::isGPU(char const * vendorName, char const * rendererName, bool strictMatch) const - { - if (strictMatch) - { - return (m_vendorName == string(vendorName)) - && (m_rendererName == string(rendererName)); - } - else - return (m_vendorName.find(vendorName) != string::npos) - && (m_rendererName.find(rendererName) != string::npos); - } - - void ResourceManager::Params::checkDeviceCaps() - { - /// general case - m_texRtFormat = graphics::Data4Bpp; - - /*if (isGPU("Qualcomm", "Adreno", false)) - m_texRtFormat = graphics::Data8Bpp; - - if (isGPU("Samsung Electronics", "FIMG-3DSE", false)) - m_texRtFormat = graphics::Data8Bpp;*/ - - if (isGPU("Broadcom", "VideoCore IV HW", false)) - m_texRtFormat = graphics::Data8Bpp; - - /*if (isGPU("Imagination Technologies", "PowerVR MBX", false)) - m_texRtFormat = graphics::Data8Bpp;*/ - - m_rgba4RenderBuffer = false; -#ifdef OMIM_OS_ANDROID - if (isGPU("NVIDIA Corporation", "NVIDIA Tegra", false)) - m_rgba4RenderBuffer = true; -#endif - - LOG(LDEBUG, ("using GL_RGBA4 for color buffer : ", m_rgba4RenderBuffer)); - LOG(LDEBUG, ("selected", graphics::formatName(m_texRtFormat), "format for tile textures")); - } - - bool ResourceManager::Params::canUseNPOTextures() - { - return graphics::gl::HasExtension("GL_OES_texture_npot"); - } - - void ResourceManager::loadSkinInfoAndTexture(string const & skinFileName, EDensity density) - { - try - { - ReaderPtr reader(GetStyleReader().GetResourceReader(skinFileName, convert(density))); - reader.ReadAsString(m_skinBuffer); - - size_t i = m_skinBuffer.find("file=\"", 0); - if (i == string::npos) - MYTHROW(RootException, ("Invalid skin file")); - i += strlen("file=\""); - - size_t const j = m_skinBuffer.find('\"', i); - if (j == string::npos) - MYTHROW(RootException, ("Invalid skin file")); - - string const textureFileName = m_skinBuffer.substr(i, j-i); - m_staticTextures[textureFileName] = make_shared(textureFileName, density); - } - catch (RootException const & ex) - { - LOG(LERROR, ("Error reading skin file", skinFileName, ex.Msg())); - } - } - - ResourceManager::ResourceManager(Params const & p, string const & skinFileName, EDensity density) - : m_params(p) - { - // Load skin and texture once before thread's initializing. - loadSkinInfoAndTexture(skinFileName, density); - - initThreadSlots(p); - - m_storagePools.resize(EInvalidStorage + 1); - - for (unsigned i = 0; i < EInvalidStorage + 1; ++i) - initStoragePool(p.m_storageParams[i], m_storagePools[i]); - - m_texturePools.resize(EInvalidTexture + 1); - - for (unsigned i = 0; i < EInvalidTexture + 1; ++i) - initTexturePool(p.m_textureParams[i], m_texturePools[i]); - - if (!graphics::gl::g_isBufferObjectsSupported) - LOG(LDEBUG, ("buffer objects are unsupported. using client vertex array instead.")); - } - - void ResourceManager::initThreadSlots(Params const & p) - { - LOG(LDEBUG, ("allocating ", p.m_threadSlotsCount, " threads slots")); - LOG(LDEBUG, ("glyphCacheMemoryLimit is ", p.m_glyphCacheParams.m_glyphCacheMemoryLimit, " bytes total.")); - - m_threadSlots.resize(p.m_threadSlotsCount); - - for (unsigned i = 0; i < p.m_threadSlotsCount; ++i) - { - GlyphCacheParams gccp = p.m_glyphCacheParams; - - GlyphCache::Params gcp(gccp.m_unicodeBlockFile, - gccp.m_whiteListFile, - gccp.m_blackListFile, - gccp.m_glyphCacheMemoryLimit / p.m_threadSlotsCount, - gccp.m_density, - p.m_exactDensityDPI, - false); - - m_threadSlots[i].m_glyphCache.reset(new GlyphCache(gcp)); - - if (p.m_useSingleThreadedOGL) - { - if (i == 0) - m_threadSlots[i].m_programManager.reset(new gl::ProgramManager()); - else - m_threadSlots[i].m_programManager = m_threadSlots[0].m_programManager; - } - else - m_threadSlots[i].m_programManager.reset(new gl::ProgramManager()); - } - } - - void ResourceManager::initStoragePool(StoragePoolParams const & p, shared_ptr & pool) - { - if (p.isValid()) - { - LOG(LDEBUG, ("initializing", convert(p.m_storageType), "resource pool. vbSize=", p.m_vbSize, ", ibSize=", p.m_ibSize)); - TStorageFactory storageFactory(p.m_vbSize, - p.m_ibSize, - m_params.m_useSingleThreadedOGL, - convert(p.m_storageType), - p.m_storagesCount); - - if (m_params.m_useSingleThreadedOGL) - pool.reset(new TOnDemandSingleThreadedStoragePoolImpl(new TOnDemandSingleThreadedStoragePoolTraits(storageFactory, p.m_storagesCount))); - else - pool.reset(new TOnDemandMultiThreadedStoragePoolImpl(new TOnDemandMultiThreadedStoragePoolTraits(storageFactory, p.m_storagesCount))); - - pool->SetIsDebugging(p.m_isDebugging); - } - else - LOG(LDEBUG, ("no ", convert(p.m_storageType), " resource")); - } - - TStoragePool * ResourceManager::storagePool(EStorageType type) - { - return m_storagePools[type].get(); - } - - void ResourceManager::initTexturePool(TexturePoolParams const & p, - shared_ptr & pool) - { - if (p.isValid()) - { - TTextureFactory textureFactory(p.m_texWidth, - p.m_texHeight, - p.m_format, - convert(p.m_textureType), - p.m_texCount); - - if (m_params.m_useSingleThreadedOGL) - pool.reset(new TOnDemandSingleThreadedTexturePoolImpl(new TOnDemandSingleThreadedTexturePoolTraits(textureFactory, p.m_texCount))); - else - pool.reset(new TOnDemandMultiThreadedTexturePoolImpl(new TOnDemandMultiThreadedTexturePoolTraits(textureFactory, p.m_texCount))); - - pool->SetIsDebugging(p.m_isDebugging); - } - else - LOG(LDEBUG, ("no ", convert(p.m_textureType), " resource")); - } - - TTexturePool * ResourceManager::texturePool(ETextureType type) - { - return m_texturePools[type].get(); - } - - shared_ptr const & ResourceManager::getTexture(string const & name) - { - TStaticTextures::const_iterator it = m_staticTextures.find(name); - ASSERT ( it != m_staticTextures.end(), () ); - return it->second; - } - - void ResourceManager::loadSkin(shared_ptr const & rm, - shared_ptr & cache) - { - SkinLoader loader([&rm, &cache](m2::RectU const & rect, string const & symbolName, - int32_t id, string const & fileName) - { - if (cache == nullptr) - cache.reset(new ResourceCache(rm, fileName, 0)); - Icon * icon = new Icon(rect, 0, Icon::Info(symbolName)); - cache->m_resources[id] = shared_ptr(icon); - cache->m_infos[&icon->m_info] = id; - }); - - ReaderSource source(MemReader(rm->m_skinBuffer.c_str(), rm->m_skinBuffer.size())); - if (!ParseXML(source, loader)) - LOG(LERROR, ("Error parsing skin")); - } - - ResourceManager::Params const & ResourceManager::params() const - { - return m_params; - } - - GlyphCache * ResourceManager::glyphCache(int threadSlot) - { - return threadSlot == -1 ? 0 : m_threadSlots[threadSlot].m_glyphCache.get(); - } - - void ResourceManager::addFonts(vector const & fontNames) - { - for (unsigned i = 0; i < m_threadSlots.size(); ++i) - m_threadSlots[i].m_glyphCache->addFonts(fontNames); - } - - shared_ptr ResourceManager::createRenderTarget(unsigned w, unsigned h) - { - switch (m_params.m_texRtFormat) - { - case Data8Bpp: - return make_shared>(w, h); - case Data4Bpp: - return make_shared>(w, h); - case Data565Bpp: - return make_shared>(w, h); - default: - MYTHROW(ResourceManagerException, ("unknown render target format")); - }; - } - - int ResourceManager::renderThreadSlot(int threadNum) const - { - ASSERT(threadNum < m_params.m_renderThreadsCount, (threadNum, m_params.m_renderThreadsCount)); - return 1 + threadNum; - } - - int ResourceManager::guiThreadSlot() const - { - return 0; - } - - int ResourceManager::cacheThreadSlot() const - { - return 1 + m_params.m_renderThreadsCount; - } - - void ResourceManager::updatePoolState() - { - for (unsigned i = 0; i < m_texturePools.size(); ++i) - if (m_texturePools[i].get()) - m_texturePools[i]->UpdateState(); - - for (unsigned i = 0; i < m_storagePools.size(); ++i) - if (m_storagePools[i].get()) - m_storagePools[i]->UpdateState(); - } - - void ResourceManager::cancel() - { - for (unsigned i = 0; i < m_texturePools.size(); ++i) - if (m_texturePools[i].get()) - m_texturePools[i]->Cancel(); - - for (unsigned i = 0; i < m_storagePools.size(); ++i) - if (m_storagePools[i].get()) - m_storagePools[i]->Cancel(); - } - - gl::ProgramManager * ResourceManager::programManager(int threadSlot) - { - return threadSlot == -1 ? 0 : m_threadSlots[threadSlot].m_programManager.get(); - } -} diff --git a/graphics/resource_manager.hpp b/graphics/resource_manager.hpp deleted file mode 100644 index 4703fa61e6..0000000000 --- a/graphics/resource_manager.hpp +++ /dev/null @@ -1,297 +0,0 @@ -#pragma once - -#include "graphics/opengl/storage.hpp" -#include "graphics/opengl/program_manager.hpp" -#include "graphics/glyph_cache.hpp" -#include "graphics/data_formats.hpp" -#include "graphics/defines.hpp" - -#include "base/resource_pool.hpp" - -#include "std/shared_ptr.hpp" -#include "std/map.hpp" -#include "std/string.hpp" -#include "std/vector.hpp" - - -namespace graphics -{ - class ResourceCache; - - namespace gl - { - class BaseTexture; - class Storage; - class ProgramManager; - } - - struct GlyphInfo; - - struct TTextureFactory : BasePoolElemFactory - { - size_t m_w; - size_t m_h; - graphics::DataFormat m_format; - TTextureFactory(size_t w, - size_t h, - graphics::DataFormat format, - char const * resName, - size_t batchSize); - shared_ptr const Create(); - }; - - struct TStorageFactory : BasePoolElemFactory - { - size_t m_vbSize; - size_t m_ibSize; - bool m_useSingleThreadedOGL; - TStorageFactory(size_t vbSize, - size_t ibSize, - bool useSingleThreadedOGL, - char const * resName, - size_t batchSize); - gl::Storage const Create(); - void BeforeMerge(gl::Storage const & e); - }; - - - struct StoragePoolTraits : BasePoolTraits - { - StoragePoolTraits(TStorageFactory const & factory) : BasePoolTraits(factory) {} - virtual void Free(gl::Storage const & elem) - { -#ifdef OMIM_OS_IPHONE - /// Any buffer in the pool may be reused on any thread. - /// So it should be unbound if it goes to the pool. - ASSERT(!elem.m_vertices->IsBound(), ()); - ASSERT(!elem.m_indices->IsBound(), ()); -#endif - BasePoolTraits::Free(elem); - } - }; - - /// ---- Texture Pools ---- - - /// Basic texture pool traits - typedef BasePoolTraits, TTextureFactory> TBaseTexturePoolTraits; - - /// Fixed-Size texture pool - typedef FixedSizePoolTraits TFixedSizeTexturePoolTraits; - typedef ResourcePoolImpl TFixedSizeTexturePoolImpl; - - /// On-Demand multi-threaded texture pool - - typedef AllocateOnDemandMultiThreadedPoolTraits TOnDemandMultiThreadedTexturePoolTraits; - typedef ResourcePoolImpl TOnDemandMultiThreadedTexturePoolImpl; - - /// On-Demand single-threaded texture pool - /// (with postponed resource allocation) - typedef AllocateOnDemandSingleThreadedPoolTraits TOnDemandSingleThreadedTexturePoolTraits; - typedef ResourcePoolImpl TOnDemandSingleThreadedTexturePoolImpl; - - /// Interface for texture pool - typedef ResourcePool > TTexturePool; - - /// ---- Storage Pools ---- - - /// Basic storage traits - typedef StoragePoolTraits TBaseStoragePoolTraits; - - /// Fixed-Size mergeable storage pool - typedef SeparateFreePoolTraits TSeparateFreeStoragePoolTraits; - typedef FixedSizePoolTraits TFixedSizeMergeableStoragePoolTraits; - typedef ResourcePoolImpl TFixedSizeMergeableStoragePoolImpl; - - /// Fixed-Size non-mergeable storage pool - typedef FixedSizePoolTraits TFixedSizeNonMergeableStoragePoolTraits; - typedef ResourcePoolImpl TFixedSizeNonMergeableStoragePoolImpl; - - /// On-Demand single-threaded storage pool - /// (with postponed resource allocation and separate list of freed resources) - typedef AllocateOnDemandSingleThreadedPoolTraits TOnDemandSingleThreadedStoragePoolTraits; - typedef ResourcePoolImpl TOnDemandSingleThreadedStoragePoolImpl; - - /// On-Demand multi-threaded storage pool - typedef AllocateOnDemandMultiThreadedPoolTraits TOnDemandMultiThreadedStoragePoolTraits; - typedef ResourcePoolImpl TOnDemandMultiThreadedStoragePoolImpl; - - /// Interface for storage pool - typedef ResourcePool TStoragePool; - - class ResourceManager - { - public: - - struct StoragePoolParams - { - size_t m_vbSize; - size_t m_vertexSize; - size_t m_ibSize; - size_t m_indexSize; - size_t m_storagesCount; - EStorageType m_storageType; - bool m_isDebugging; - - StoragePoolParams(); - StoragePoolParams(EStorageType storageType); - StoragePoolParams(size_t vbSize, - size_t vertexSize, - size_t ibSize, - size_t indexSize, - size_t storagesCount, - EStorageType storageType, - bool isDebugging); - - bool isValid() const; - }; - - struct TexturePoolParams - { - size_t m_texWidth; - size_t m_texHeight; - size_t m_texCount; - graphics::DataFormat m_format; - ETextureType m_textureType; - bool m_isDebugging; - - TexturePoolParams(); - TexturePoolParams(ETextureType textureType); - TexturePoolParams(size_t texWidth, - size_t texHeight, - size_t texCount, - graphics::DataFormat format, - ETextureType textureType, - bool isDebugging); - - bool isValid() const; - }; - - struct GlyphCacheParams - { - string m_unicodeBlockFile; - string m_whiteListFile; - string m_blackListFile; - - size_t m_glyphCacheMemoryLimit; - - EDensity m_density; - - GlyphCacheParams(); - GlyphCacheParams(string const & unicodeBlockFile, - string const & whiteListFile, - string const & blackListFile, - size_t glyphCacheMemoryLimit, - EDensity density); - }; - - struct Params - { - private: - - string m_vendorName; - string m_rendererName; - string m_versionName; - - /// check non-strict matching upon vendorName and rendererName - bool isGPU(char const * vendorName, char const * rendererName, bool strictMatch) const; - - public: - DataFormat m_texFormat; - DataFormat m_texRtFormat; - bool m_useSingleThreadedOGL; - - size_t m_videoMemoryLimit; - - /// storages params - vector m_storageParams; - - /// textures params - vector m_textureParams; - - /// glyph caches params - GlyphCacheParams m_glyphCacheParams; - - unsigned m_renderThreadsCount; - unsigned m_threadSlotsCount; - - bool m_rgba4RenderBuffer; - int m_exactDensityDPI; - - Params(); - - void distributeFreeMemory(int freeVideoMemory); - void checkDeviceCaps(); - int memoryUsage() const; - int fixedMemoryUsage() const; - void initScaleWeights(); - bool canUseNPOTextures(); - }; - - private: - - typedef map > TStaticTextures; - TStaticTextures m_staticTextures; - string m_skinBuffer; - - void loadSkinInfoAndTexture(string const & skinFileName, EDensity density); - - //threads::Mutex m_mutex; - - vector > m_texturePools; - vector > m_storagePools; - - struct ThreadSlot - { - shared_ptr m_programManager; - shared_ptr m_glyphCache; - }; - - vector m_threadSlots; - - Params m_params; - - public: - ResourceManager(Params const & p, string const & skinFileName, EDensity density); - - /// Use like static function with shared_ptr instead of this. - /// @todo Check if we can remove shared_ptrs from this logic. - static void loadSkin(shared_ptr const & rm, - shared_ptr & cache); - - void initThreadSlots(Params const & p); - - void initStoragePool(StoragePoolParams const & p, shared_ptr & pool); - - TStoragePool * storagePool(EStorageType type); - - void initTexturePool(TexturePoolParams const & p, shared_ptr & pool); - - TTexturePool * texturePool(ETextureType type); - - shared_ptr const & getTexture(string const & name); - - Params const & params() const; - - GlyphCache * glyphCache(int threadSlot = 0); - - int renderThreadSlot(int threadNum) const; - int guiThreadSlot() const; - int cacheThreadSlot() const; - - void addFonts(vector const & fontNames); - - /* - void memoryWarning(); - void enterBackground(); - void enterForeground(); - */ - - void updatePoolState(); - - void cancel(); - - shared_ptr createRenderTarget(unsigned w, unsigned h); - gl::ProgramManager * programManager(int threadSlot); - }; -} - diff --git a/graphics/screen.hpp b/graphics/screen.hpp deleted file mode 100644 index 58e70c006d..0000000000 --- a/graphics/screen.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "graphics/overlay_renderer.hpp" - -namespace graphics -{ - class Screen : public OverlayRenderer - { - public: - typedef OverlayRenderer::Params Params; - Screen(Params const & params) : OverlayRenderer(params) - {} - }; -} diff --git a/graphics/shape_renderer.cpp b/graphics/shape_renderer.cpp deleted file mode 100644 index f6d6d033c0..0000000000 --- a/graphics/shape_renderer.cpp +++ /dev/null @@ -1,275 +0,0 @@ -#include "graphics/shape_renderer.hpp" -#include "graphics/pen.hpp" -#include "graphics/brush.hpp" -#include "graphics/resource.hpp" -#include "graphics/resource_cache.hpp" - -#include "graphics/opengl/base_texture.hpp" - -#include "geometry/point2d.hpp" - -#include "base/logging.hpp" - -namespace graphics -{ - ShapeRenderer::ShapeRenderer(base_t::Params const & params) : base_t(params) - { - } - - void ShapeRenderer::drawConvexPolygon(m2::PointF const * pts, size_t ptsCount, graphics::Color const & color, double depth) - { - uint32_t resID = base_t::mapInfo(Brush::Info(color)); - - if (resID == base_t::invalidHandle()) - { - LOG(LDEBUG, ("cannot map color")); - return; - } - - drawTrianglesFan(pts, ptsCount, resID, depth); - } - - void ShapeRenderer::drawArc(m2::PointD const & center, double startA, double endA, double r, graphics::Color const & c, double depth) - { - vector pts; - approximateArc(center, startA, endA, r, pts); - - if (pts.size() < 2) - return; - - drawPath(&pts[0], - pts.size(), - 0, - base_t::mapInfo(graphics::Pen::Info(c, 3, 0, 0, 0)), - depth); - } - - void ShapeRenderer::approximateArc(m2::PointD const & center, double startA, double endA, double r, vector & pts) - { - double sectorA = math::pi / 30.0; - size_t const sectorsCount = max(size_t(1), static_cast(floor(fabs(endA - startA) / sectorA))); - sectorA = (endA - startA) / sectorsCount; - - for (size_t i = 0; i <= sectorsCount; ++i) - pts.push_back(m2::Shift(m2::Rotate(m2::PointD(r, 0), startA + i * sectorA), center)); - } - - void ShapeRenderer::drawSector(m2::PointD const & center, double startA, double endA, double r, graphics::Color const & c, double depth) - { - vector pts; - - pts.push_back(center); - approximateArc(center, startA, endA, r, pts); - pts.push_back(center); - - if (pts.size() < 3) - return; - - drawPath(&pts[0], - pts.size(), - 0, - base_t::mapInfo(graphics::Pen::Info(c, 2, 0, 0, 0)), - depth); - } - - void ShapeRenderer::fillSector(m2::PointD const & center, double startA, double endA, double r, graphics::Color const & c, double depth) - { - vector arcPts; - - arcPts.push_back(center); - approximateArc(center, startA, endA, r, arcPts); - - if (arcPts.size() < 3) - return; - - m2::PointD pt0 = arcPts[0]; - m2::PointD pt1 = arcPts[1]; - - vector sectorPts; - - for (size_t i = 2; i < arcPts.size(); ++i) - { - sectorPts.push_back(pt0); - sectorPts.push_back(pt1); - sectorPts.push_back(arcPts[i]); - pt1 = arcPts[i]; - } - - drawTrianglesList(§orPts[0], - sectorPts.size(), - base_t::mapInfo(Brush::Info(c)), - depth); - } - - void ShapeRenderer::drawRectangle(m2::AnyRectD const & r, graphics::Color const & c, double depth) - { - uint32_t id = base_t::mapInfo(Brush::Info(c)); - Resource const * res = base_t::fromID(id); - - if (res == 0) - { - LOG(LDEBUG, ("cannot map color")); - return; - } - - m2::PointD rectPts[4]; - - r.GetGlobalPoints(rectPts); - swap(rectPts[2], rectPts[3]); - - m2::PointF rectPtsF[4]; - for (int i = 0; i < 4; ++i) - rectPtsF[i] = m2::PointF(rectPts[i].x, rectPts[i].y); - - GeometryPipeline & p = pipeline(res->m_pipelineID); - - shared_ptr texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - m2::PointF texPt = texture->mapPixel(m2::RectF(res->m_texRect).Center()); - - m2::PointF normal(0, 0); - - addTexturedStripStrided( - rectPtsF, - sizeof(m2::PointF), - &normal, - 0, - &texPt, - 0, - 4, - depth, - res->m_pipelineID); - } - - void ShapeRenderer::drawRectangle(m2::RectD const & r, graphics::Color const & c, double depth) - { - uint32_t id = base_t::mapInfo(Brush::Info(c)); - Resource const * res = base_t::fromID(id); - - if (res == 0) - { - LOG(LDEBUG, ("cannot map color")); - return; - } - - m2::PointF rectPts[4] = { - m2::PointF(r.minX(), r.minY()), - m2::PointF(r.maxX(), r.minY()), - m2::PointF(r.minX(), r.maxY()), - m2::PointF(r.maxX(), r.maxY()) - }; - - GeometryPipeline & p = pipeline(res->m_pipelineID); - - shared_ptr texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - m2::PointF texPt = texture->mapPixel(m2::RectF(res->m_texRect).Center()); - - m2::PointF normal(0, 0); - - addTexturedStripStrided( - rectPts, - sizeof(m2::PointF), - &normal, - 0, - &texPt, - 0, - 4, - depth, - res->m_pipelineID - ); - } - - void ShapeRenderer::drawRoundedRectangle(m2::RectD const & r, double rad, graphics::Color const & c, double depth) - { - uint32_t id = base_t::mapInfo(Brush::Info(c)); - Resource const * res = base_t::fromID(id); - - if (res == 0) - { - LOG(LDEBUG, ("cannot map color")); - return; - } - - GeometryPipeline & p = pipeline(res->m_pipelineID); - - shared_ptr texture = p.texture(); - - if (!texture) - { - LOG(LDEBUG, ("returning as no texture is reserved")); - return; - } - - m2::PointF texPt = texture->mapPixel(m2::RectF(res->m_texRect).Center()); - - vector seg00; - vector seg10; - vector seg11; - vector seg01; - - approximateArc(m2::PointD(r.minX() + rad, r.minY() + rad), - math::pi, - 3 * math::pi / 2, - rad, - seg00); - - approximateArc(m2::PointD(r.minX() + rad, r.maxY() - rad), - math::pi / 2, - math::pi, - rad, - seg01); - - approximateArc(m2::PointD(r.maxX() - rad, r.maxY() - rad), - 0, - math::pi / 2, - rad, - seg11); - - approximateArc(m2::PointD(r.maxX() - rad, r.minY() + rad), - 3 * math::pi / 2, - math::pi * 2, - rad, - seg10); - - vector pts; - - for (unsigned i = 0; i < seg11.size(); ++i) - pts.push_back(m2::PointF(seg11[i])); - - for (unsigned i = 0; i < seg01.size(); ++i) - pts.push_back(m2::PointF(seg01[i])); - - for (unsigned i = 0; i < seg00.size(); ++i) - pts.push_back(m2::PointF(seg00[i])); - - for (unsigned i = 0; i < seg10.size(); ++i) - pts.push_back(m2::PointF(seg10[i])); - - m2::PointF normal(0, 0); - - addTexturedFanStrided( - &pts[0], - sizeof(m2::PointF), - &normal, - 0, - &texPt, - 0, - pts.size(), - depth, - res->m_pipelineID - ); - } -} diff --git a/graphics/shape_renderer.hpp b/graphics/shape_renderer.hpp deleted file mode 100644 index 793df4daee..0000000000 --- a/graphics/shape_renderer.hpp +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once - -#include "graphics/path_renderer.hpp" -#include "geometry/rect2d.hpp" -#include "geometry/any_rect2d.hpp" - -namespace graphics -{ - class ShapeRenderer : public PathRenderer - { - private: - typedef PathRenderer base_t; - public: - - ShapeRenderer(base_t::Params const & params); - - void drawConvexPolygon(m2::PointF const * points, - size_t pointsCount, - Color const & color, - double depth); - - static void approximateArc(m2::PointD const & center, - double startA, - double endA, - double r, - vector & pts); - - void drawArc(m2::PointD const & center, - double startA, - double endA, - double r, - Color const & c, - double depth); - - void drawSector(m2::PointD const & center, - double startA, - double endA, - double r, - Color const & c, - double depth); - - void fillSector(m2::PointD const & center, - double startA, - double endA, - double r, - Color const & c, - double depth); - - void drawRectangle(m2::AnyRectD const & r, - Color const & c, - double depth); - - void drawRectangle(m2::RectD const & r, - Color const & c, - double depth); - - void drawRoundedRectangle(m2::RectD const & r, - double rad, - Color const & c, - double depth); - }; -} diff --git a/graphics/skin_loader.cpp b/graphics/skin_loader.cpp deleted file mode 100644 index 4a7af9bb1d..0000000000 --- a/graphics/skin_loader.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "graphics/skin_loader.hpp" - -#include "base/string_utils.hpp" - -namespace graphics -{ - SkinLoader::SkinLoader(TIconCallback const & callback) - : m_id(-1) - , m_fileName("") - , m_callback(callback) - { - m_mode.push_back(ERoot); - } - - void SkinLoader::popIcon() - { - m_callback(m2::RectU(m_texX, m_texY, m_texX + m_texWidth, m_texY + m_texHeight), - m_resID, m_id, m_fileName); - } - -#define PUSH_MODE(mode, name) \ - if (element == name) \ - m_mode.push_back(mode);\ - -#define PUSH_MODE_EX(mode, name, fn)\ - if (element == name)\ - {\ - m_mode.push_back(mode);\ - fn();\ - } - -#define POP_MODE(mode, name) \ - if (element == name) \ - m_mode.pop_back(); - - -#define POP_MODE_EX(mode, name, f) \ - if (element == name)\ - {\ - f();\ - m_mode.pop_back();\ - } - - bool SkinLoader::Push(string const & element) - { - PUSH_MODE(ESkin, "skin"); - PUSH_MODE(EPage, "page"); - PUSH_MODE(EIcon, "symbolStyle"); - PUSH_MODE(EResource, "resourceStyle"); - return true; - } - - void SkinLoader::Pop(string const & element) - { - POP_MODE(ESkin, "skin"); - POP_MODE(EPage, "page"); - POP_MODE_EX(EIcon, "symbolStyle", popIcon); - POP_MODE(EResource, "resourceStyle"); - } - - int StrToInt(string const & s) - { - int i; - VERIFY ( strings::to_int(s, i), ("Bad int int StrToInt function") ); - return i; - } - - void SkinLoader::AddAttr(string const & attr, string const & value) - { - switch (m_mode.back()) - { - case ESkin: - break; - case EPage: - if (attr == "file") - m_fileName = value; - break; - case EIcon: - if (attr == "id") - m_id = StrToInt(value); - else if (attr == "name") - m_resID = value; - break; - case EResource: - if (attr == "x") - m_texX = StrToInt(value); - else if (attr == "y") - m_texY = StrToInt(value); - else if (attr == "height") - m_texHeight = StrToInt(value); - else if (attr == "width") - m_texWidth = StrToInt(value); - break; - default: - break; - } - } -} diff --git a/graphics/skin_loader.hpp b/graphics/skin_loader.hpp deleted file mode 100644 index 44b0714a76..0000000000 --- a/graphics/skin_loader.hpp +++ /dev/null @@ -1,60 +0,0 @@ -/// @author Siarhei Rachytski -#pragma once - -#include "geometry/rect2d.hpp" - -#include "std/function.hpp" -#include "std/list.hpp" -#include "std/shared_ptr.hpp" - -namespace graphics -{ - class SkinLoader - { - private: - - enum EMode - { - ERoot, - EPage, - ESkin, - EIcon, - EResource - }; - - list m_mode; - - /// resourceStyle-specific parameters - int32_t m_id; - uint32_t m_texX; - uint32_t m_texY; - uint32_t m_texWidth; - uint32_t m_texHeight; - - /// pointStyle-specific parameters - string m_resID; - - /// skin-page specific parameters - string m_fileName; - - public: - - /// @param _1 - symbol rect on texture. Pixel rect - /// @param _2 - symbol name. Key on resource search - /// @param _3 - unique id - /// @param _4 - texture file name - using TIconCallback = function; - - SkinLoader(TIconCallback const & callback); - - bool Push(string const & element); - void Pop(string const & element); - void AddAttr(string const & attribute, string const & value); - void CharData(string const &) {} - - void popIcon(); - - private: - TIconCallback m_callback; - }; -} diff --git a/graphics/skin_xml_parser.hpp b/graphics/skin_xml_parser.hpp deleted file mode 100644 index 396cfa193e..0000000000 --- a/graphics/skin_xml_parser.hpp +++ /dev/null @@ -1,141 +0,0 @@ -/// @author Alex Zolotarev -#pragma once - -#include "graphics/resource_style.hpp" -#include "geometry/rect2d.hpp" -#include "base/base.hpp" -#include "std/string.hpp" -#include "coding/strutil.hpp" - -#include "base/start_mem_debug.hpp" - -/// @example -/// -/// -/// -/// ... -/// -/// -/// -/// -/// -/// ... -/// -/// - -namespace yg -{ - /// used to parse xml skin description file in BMFont app out format - template - class SkinXmlParser - { - private: - enum TMode - { - EModeUnknown, - EModeSkin, - EModeFont - }; - - TMode m_mode; - bool m_ready; - - uint16_t m_x; - uint16_t m_y; - uint16_t m_width; - uint16_t m_height; - int8_t m_xOffset; - int8_t m_yOffset; - int8_t m_xAdvance; - int m_id; - /// How many pixels from top left to baseline (down) - int m_baseline; - /// width of the font texture - int m_scaleW; - /// height of the font texture - int m_scaleH; - TSkinInserter m_skinInserter; - TFontInserter m_fontInserter; - - public: - - SkinXmlParser(TSkinInserter skinInserter, TFontInserter fontInserter) - : m_mode(EModeUnknown), m_ready(false), m_baseline(0), m_scaleW(0), m_scaleH(0), - m_skinInserter(skinInserter), m_fontInserter(fontInserter) - {} - - int FontTextureWidth() const { return m_scaleW; } - int FontTextureHeight() const { return m_scaleH; } - int BaseLineOffset() const { return m_baseline; } - - bool Push(string const & element) - { - if (m_mode == EModeUnknown) - { - if (element == "skin") - m_mode = EModeSkin; - else if (element == "font") - m_mode = EModeFont; - } - else if (element == "char") - m_ready = true; - return true; - } - - void AddAttr(string const & attribute, string const & value) - { - if (m_ready) - { - if (attribute == "id") - m_id = StrToInt(value); - else if (attribute == "x") - m_x = static_cast(StrToInt(value)); - else if (attribute == "y") - m_y = static_cast(StrToInt(value)); - else if (attribute == "width") - m_width = static_cast(StrToInt(value)); - else if (attribute == "height") - m_height = static_cast(StrToInt(value)); - else if (attribute == "xoffset") - m_xOffset = static_cast(StrToInt(value)); - else if (attribute == "yoffset") - m_yOffset = static_cast(StrToInt(value)); - else if (attribute == "xadvance") - m_xAdvance = static_cast(StrToInt(value)); - } - else - { - if (attribute == "base") - m_baseline = StrToInt(value); - else if (attribute == "scaleW") - m_scaleW = StrToInt(value); - else if (attribute == "scaleH") - m_scaleH = StrToInt(value); - } - } - - void Pop(string const & element) - { - if (m_ready) - { - switch (m_mode) - { - case EModeSkin: - m_skinInserter = - make_pair(m_id, shared_ptr(new ResourceStyle(m2::RectU(m_x, m_y, m_x + m_width, m_y + m_height)))); - break; - case EModeFont: - m_fontInserter = - make_pair(m_id, shared_ptr(new FontStyle(m2::RectU(m_x, m_y, m_x + m_width, m_y + m_height), - m_xOffset, m_baseline - m_yOffset - m_height, m_xAdvance))); - break; - default: - break; - } - m_ready = false; - } - else if (element == "skin" || element == "font") - m_mode = EModeUnknown; - } - }; -} diff --git a/graphics/straight_text_element.cpp b/graphics/straight_text_element.cpp deleted file mode 100644 index 1a9bd005e8..0000000000 --- a/graphics/straight_text_element.cpp +++ /dev/null @@ -1,256 +0,0 @@ -#include "graphics/straight_text_element.hpp" -#include "graphics/overlay_renderer.hpp" - -#include "std/iterator.hpp" -#include "std/algorithm.hpp" -#include "std/cstring.hpp" - - -namespace graphics -{ - void visSplit(strings::UniString const & visText, - buffer_vector & res, - char const * delims, - bool splitAllFound) - { - if (!splitAllFound) - { - size_t count = visText.size(); - if (count > 15) - { - // split on two parts - typedef strings::UniString::const_iterator IterT; - IterT const iMiddle = visText.begin() + count/2; - - size_t const delimsSize = strlen(delims); - - // find next delimeter after middle [m, e) - IterT iNext = find_first_of(iMiddle, - visText.end(), - delims, delims + delimsSize); - - // find last delimeter before middle [b, m) - IterT iPrev = find_first_of(reverse_iterator(iMiddle), - reverse_iterator(visText.begin()), - delims, delims + delimsSize).base(); - // don't do split like this: - // xxxx - // xxxxxxxxxxxx - if (4 * distance(visText.begin(), iPrev) <= count) - iPrev = visText.end(); - else - --iPrev; - - // get closest delimiter to the middle - if (iNext == visText.end() || - (iPrev != visText.end() && distance(iPrev, iMiddle) < distance(iMiddle, iNext))) - { - iNext = iPrev; - } - - // split string on 2 parts - if (iNext != visText.end()) - { - ASSERT_NOT_EQUAL(iNext, visText.begin(), ()); - res.push_back(strings::UniString(visText.begin(), iNext)); - - if (++iNext != visText.end()) - res.push_back(strings::UniString(iNext, visText.end())); - - return; - } - } - - res.push_back(visText); - } - else - { - // split string using according to all delimiters - typedef strings::SimpleDelimiter DelimT; - for (strings::TokenizeIterator iter(visText, DelimT(delims)); iter; ++iter) - res.push_back(iter.GetUniString()); - } - } - - StraightTextElement::StraightTextElement(Params const & p) - : TextElement(p) - { - ASSERT(p.m_fontDesc.IsValid(), ()); - - double allElemWidth = 0; - double allElemHeight = 0; - - strings::UniString visText, auxVisText; - pair const isBidi = p.GetVisibleTexts(visText, auxVisText); - - if (!visText.empty()) - { - buffer_vector res; - if (p.m_doForceSplit || (p.m_doSplit && !isBidi.first)) - { - res.clear(); - if (!p.m_delimiters.empty()) - visSplit(visText, res, p.m_delimiters.c_str(), p.m_useAllParts); - else - visSplit(visText, res, " \n\t", p.m_useAllParts); - } - else - res.push_back(visText); - - for (size_t i = 0; i < res.size(); ++i) - { - m_glyphLayouts.push_back(GlyphLayout(p.m_glyphCache, p.m_fontDesc, m2::PointD(0, 0), res[i], graphics::EPosCenter, p.m_maxPixelWidth)); - m2::RectD const r = m_glyphLayouts.back().GetLastGlobalRect(); - allElemWidth = max(r.SizeX(), allElemWidth); - allElemHeight += r.SizeY(); - } - } - - if (p.m_auxFontDesc.IsValid() && !auxVisText.empty()) - { - buffer_vector auxRes; - - GlyphLayout l(p.m_glyphCache, p.m_auxFontDesc, m2::PointD(0, 0), auxVisText, graphics::EPosCenter); - if (l.GetLastGlobalRect().SizeX() > allElemWidth) - { - // should split - if (p.m_doSplit && !isBidi.second) - { - if (!p.m_delimiters.empty()) - visSplit(auxVisText, auxRes, p.m_delimiters.c_str(), p.m_useAllParts); - else - visSplit(auxVisText, auxRes, " \n\t", p.m_useAllParts); - } - else - auxRes.push_back(auxVisText); - } - else - auxRes.push_back(auxVisText); - - for (size_t i = 0; i < auxRes.size(); ++i) - m_glyphLayouts.push_back(GlyphLayout(p.m_glyphCache, p.m_auxFontDesc, m2::PointD(0, 0), auxRes[i], graphics::EPosCenter)); - } - - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - allElemHeight -= m_glyphLayouts[i].baseLineOffset(); - - double curShift = allElemHeight / 2; - - // performing aligning of glyphLayouts as for the center position - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - { - double const elemSize = m_glyphLayouts[i].GetLastGlobalRect().SizeY(); - m_glyphLayouts[i].setPivot(m_glyphLayouts[i].pivot() + m2::PointD(0, -curShift + elemSize / 2) + p.m_offset); - curShift -= elemSize; - } - - if (position() & graphics::EPosLeft) - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - m_glyphLayouts[i].setPivot(m_glyphLayouts[i].pivot() + m2::PointD(-allElemWidth / 2, 0)); - - if (position() & graphics::EPosRight) - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - m_glyphLayouts[i].setPivot(m_glyphLayouts[i].pivot() + m2::PointD(allElemWidth / 2, 0)); - - if (position() & graphics::EPosAbove) - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - m_glyphLayouts[i].setPivot(m_glyphLayouts[i].pivot() + m2::PointD(0, -allElemHeight / 2)); - - if (position() & graphics::EPosUnder) - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - m_glyphLayouts[i].setPivot(m_glyphLayouts[i].pivot() + m2::PointD(0, allElemHeight / 2)); - - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - { - m_offsets.push_back(m_glyphLayouts[i].pivot()); - m_glyphLayouts[i].setPivot(m_offsets[i] + pivot()); - } - } - - StraightTextElement::Params::Params() - : m_minWordsInRow(2), - m_maxWordsInRow(4), - m_minSymInRow(10), - m_maxSymInRow(20), - m_maxPixelWidth(numeric_limits::max()), - m_doSplit(false), - m_doForceSplit(false), - m_useAllParts(true), - m_offset(0, 0) - {} - - void StraightTextElement::GetMiniBoundRects(RectsT & rects) const - { - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - { - copy(m_glyphLayouts[i].boundRects().begin(), - m_glyphLayouts[i].boundRects().end(), - back_inserter(rects)); - } - } - - void StraightTextElement::draw(OverlayRenderer * screen, math::Matrix const & m) const - { - int doffs = 0; - if (screen->isDebugging()) - { - graphics::Color c(255, 255, 255, 32); - - if (isFrozen()) - c = graphics::Color(0, 0, 255, 64); - if (isNeedRedraw()) - c = graphics::Color(255, 0, 0, 64); - - screen->drawRectangle(GetBoundRect(), graphics::Color(255, 255, 0, 64), depth() + doffs++); - - DrawRectsDebug(screen, c, depth() + doffs++); - } - - if (!isNeedRedraw()) - return; - - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - { - if (m_glyphLayouts[i].fontDesc().m_isMasked) - drawTextImpl(m_glyphLayouts[i], screen, m, true, true, m_glyphLayouts[i].fontDesc(), depth() + doffs); - } - - doffs += 1; - - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - { - graphics::FontDesc fontDesc = m_glyphLayouts[i].fontDesc(); - fontDesc.m_isMasked = false; - drawTextImpl(m_glyphLayouts[i], screen, m, true, true, fontDesc, depth() + doffs); - } - } - - void StraightTextElement::setPivot(m2::PointD const & pv, bool dirtyFlag) - { - m2::PointD oldPv = pivot(); - m2::PointD offs = pv - oldPv; - - TextElement::setPivot(pv, dirtyFlag); - - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - m_glyphLayouts[i].setPivot(m_glyphLayouts[i].pivot() + offs); - } - - void StraightTextElement::setTransformation(const math::Matrix & m) - { - setPivot(pivot() * getResetMatrix() * m); - - for (size_t i = 0; i < m_glyphLayouts.size(); ++i) - { - m_glyphLayouts[i].setPivot(pivot()); - m_glyphLayouts[i].setOffset(m_offsets[i]); - } - - TextElement::setTransformation(m); - } - - bool StraightTextElement::hasSharpGeometry() const - { - return true; - } -} diff --git a/graphics/straight_text_element.hpp b/graphics/straight_text_element.hpp deleted file mode 100644 index d3bae45ed8..0000000000 --- a/graphics/straight_text_element.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include "graphics/text_element.hpp" -#include "graphics/glyph_layout.hpp" - - -namespace graphics -{ - class StraightTextElement : public TextElement - { - private: - - // Glyph layout of the text parts. - // In 99% cases cantainers will hold 1 element. - buffer_vector m_glyphLayouts; - buffer_vector m_offsets; - - public: - - struct Params : TextElement::Params - { - unsigned m_minWordsInRow; - unsigned m_maxWordsInRow; - unsigned m_minSymInRow; - unsigned m_maxSymInRow; - unsigned m_maxPixelWidth; - bool m_doSplit; - bool m_doForceSplit; - bool m_useAllParts; - m2::PointD m_offset; - string m_delimiters; - Params(); - }; - - StraightTextElement(Params const & p); - - virtual void GetMiniBoundRects(RectsT & rects) const; - - void draw(OverlayRenderer * r, math::Matrix const & m) const; - - void setPivot(m2::PointD const & pv, bool dirtyFlag = true); - - void setTransformation(const math::Matrix & m); - - bool hasSharpGeometry() const; - }; -} diff --git a/graphics/symbol_element.cpp b/graphics/symbol_element.cpp deleted file mode 100644 index 8a2e73e0b8..0000000000 --- a/graphics/symbol_element.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#include "base/logging.hpp" - -#include "graphics/symbol_element.hpp" -#include "graphics/resource.hpp" -#include "graphics/icon.hpp" -#include "graphics/overlay_renderer.hpp" - -namespace graphics -{ - SymbolElement::Params::Params() - : m_info(), - m_symbolRect(0, 0, 0, 0), - m_renderer(0) - {} - - SymbolElement::SymbolElement(Params const & p) - : BaseT(p), - m_info(p.m_info), - m_symbolRect(0, 0, 0, 0) - { - uint32_t resID = p.m_renderer->findInfo(m_info); - Resource const * res = p.m_renderer->fromID(resID); - - if (res == 0) - { - LOG(LWARNING, ("POI", m_info.m_name, "wasn't found on current skin.")); - return; - } - - m_symbolRect = res->m_texRect; - } - - m2::RectD SymbolElement::GetBoundRect() const - { - // Skip for one pixel on every border. - m2::PointD const sz(m_symbolRect.SizeX() - 2, m_symbolRect.SizeY() - 2); - m2::PointD const posPt = computeTopLeft(sz, pivot(), position()); - - return m2::RectD(posPt, posPt + sz); - } - - void SymbolElement::draw(OverlayRenderer * r, math::Matrix const & m) const - { - if (!isNeedRedraw()) - return; - - uint32_t resID = r->findInfo(m_info); - Resource const * res = r->fromID(resID); - - if (res == 0) - { - LOG(LDEBUG, ("POI(", m_info.m_name, ") wasn't found on the current skin")); - return; - } - - if (res->m_texRect != m_symbolRect) - { - LOG(LDEBUG, ("POI(", m_info.m_name, ") rects doesn't match")); - return; - } - - m2::RectI texRect(res->m_texRect); - texRect.Inflate(-1, -1); - - m2::PointD sz(texRect.SizeX(), texRect.SizeY()); - - m2::PointD posPt = computeTopLeft(sz, - pivot() * m, - position()); - - posPt -= pivot(); - - r->drawStraightTexturedPolygon(pivot(), - texRect.minX(), texRect.minY(), texRect.maxX(), texRect.maxY(), - posPt.x, posPt.y, posPt.x + sz.x, posPt.y + sz.y, - depth(), - res->m_pipelineID); - } - - void SymbolElement::setTransformation(const math::Matrix & m) - { - setPivot(pivot() * getResetMatrix() * m); - BaseT::setTransformation(m); - } - - bool SymbolElement::hasSharpGeometry() const - { - return true; - } -} diff --git a/graphics/symbol_element.hpp b/graphics/symbol_element.hpp deleted file mode 100644 index 2833b8f80e..0000000000 --- a/graphics/symbol_element.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include "graphics/overlay_element.hpp" -#include "graphics/icon.hpp" - -namespace graphics -{ - class Skin; - - class SymbolElement : public OverlayElement - { - Icon::Info m_info; - m2::RectU m_symbolRect; - - public: - typedef OverlayElement BaseT; - - struct Params : public BaseT::Params - { - Icon::Info m_info; - m2::RectU m_symbolRect; - OverlayRenderer * m_renderer; - Params(); - }; - - SymbolElement(Params const & p); - - virtual m2::RectD GetBoundRect() const; - - void draw(OverlayRenderer * s, math::Matrix const & m) const; - - uint32_t resID() const; - - bool hasSharpGeometry() const; - - void setTransformation(const math::Matrix & m); - }; -} diff --git a/graphics/text_element.cpp b/graphics/text_element.cpp deleted file mode 100644 index e3069737d2..0000000000 --- a/graphics/text_element.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "graphics/text_element.hpp" -#include "graphics/overlay_renderer.hpp" -#include "graphics/glyph.hpp" -#include "graphics/glyph_layout.hpp" - -#include "base/logging.hpp" - - -namespace graphics -{ - TextElement::TextElement(Params const & p) - : OverlayElement(p), - m_fontDesc(p.m_fontDesc), - m_auxFontDesc(p.m_auxFontDesc) - { - } - - pair TextElement::Params::GetVisibleTexts( - strings::UniString & visText, strings::UniString & auxVisText) const - { - if (m_log2vis) - { - visText = m_glyphCache->log2vis(m_logText); - if (!m_auxLogText.empty()) - auxVisText = m_glyphCache->log2vis(m_auxLogText); - - return make_pair(visText != m_logText, auxVisText != m_auxLogText); - } - else - { - visText = m_logText; - auxVisText = m_auxLogText; - - return make_pair(false, false); - } - } - - FontDesc const & TextElement::fontDesc() const - { - return m_fontDesc; - } - - FontDesc const & TextElement::auxFontDesc() const - { - return m_auxFontDesc; - } - - void TextElement::drawTextImpl(GlyphLayout const & layout, - OverlayRenderer * screen, - math::Matrix const & m, - bool doTransformPivotOnly, - bool doAlignPivot, - FontDesc const & fontDesc, - double depth) const - { - if (!fontDesc.IsValid()) - return; - - m2::PointD pv = layout.pivot(); - m2::PointD offs = layout.offset(); - double deltaA = 0; - - if (doTransformPivotOnly) - pv *= m; - else - { - double k = (sqrt((m(0, 0) * m(0, 0) + m(0, 1) * m(0, 1) + m(1, 0) * m(1, 0) + m(1, 1) * m(1, 1)) / 2)); - - if ((k > 1.1) || (k < 1 / 1.1)) - return; - - deltaA = (ang::AngleD(0) * m).val(); - } - - size_t const cnt = layout.entries().size(); - - buffer_vector glyphInfos(cnt); - buffer_vector resInfos(cnt); - buffer_vector glyphIDs(cnt); - - size_t const firstVis = layout.firstVisible(); - size_t const lastVis = layout.lastVisible(); - - /// collecting all glyph infos in one array and packing them as a whole. - for (size_t i = firstVis; i < lastVis; ++i) - { - GlyphKey glyphKey(layout.entries()[i].m_sym, - fontDesc.m_size, - fontDesc.m_isMasked, - fontDesc.m_isMasked ? fontDesc.m_maskColor : fontDesc.m_color); - - glyphInfos[i] = Glyph::Info(glyphKey, screen->glyphCache()); - resInfos[i] = &glyphInfos[i]; - } - - if (firstVis != lastVis && - !screen->mapInfo(&resInfos[firstVis], - &glyphIDs[firstVis], - lastVis - firstVis)) - { - LOG(LDEBUG, ("cannot render string", lastVis - firstVis, "characters long")); - return; - } - - for (size_t i = firstVis; i < lastVis; ++i) - { - GlyphLayoutElem const & elem = layout.entries()[i]; - Glyph const * glyph = static_cast(screen->fromID(glyphIDs[i])); - - m2::PointD glyphPt; - ang::AngleD glyphAngle; - - if (doTransformPivotOnly) - { - m2::PointD offsPt = offs + elem.m_pt; - screen->drawStraightGlyph(pv, offsPt, glyph, depth); - } - else - { - glyphPt = (pv + offs + elem.m_pt) * m; - glyphAngle = ang::AngleD(elem.m_angle.val() + deltaA); - - screen->drawGlyph(glyphPt, m2::PointD(0.0, 0.0), glyphAngle, 0, glyph, depth); - } - } - } -} diff --git a/graphics/text_element.hpp b/graphics/text_element.hpp deleted file mode 100644 index a54bc1e738..0000000000 --- a/graphics/text_element.hpp +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once -#include "graphics/overlay_element.hpp" -#include "graphics/font_desc.hpp" - -#include "base/matrix.hpp" -#include "base/string_utils.hpp" - - -namespace graphics -{ - class GlyphLayout; - class GlyphCache; - class OverlayRenderer; - - class TextElement : public OverlayElement - { - protected: - FontDesc m_fontDesc, m_auxFontDesc; - - public: - struct Params : OverlayElement::Params - { - FontDesc m_fontDesc; - strings::UniString m_logText; - - FontDesc m_auxFontDesc; - strings::UniString m_auxLogText; - - bool m_log2vis; - GlyphCache * m_glyphCache; - - pair GetVisibleTexts(strings::UniString & visText, - strings::UniString & auxVisText) const; - }; - - TextElement(Params const & p); - - void drawTextImpl(GlyphLayout const & layout, - OverlayRenderer * r, - math::Matrix const & m, - bool doTransformPivotOnly, - bool doAlignPivot, - FontDesc const & desc, - double depth) const; - - FontDesc const & fontDesc() const; - FontDesc const & auxFontDesc() const; - }; -} diff --git a/graphics/text_path.cpp b/graphics/text_path.cpp deleted file mode 100644 index 30c7c8b608..0000000000 --- a/graphics/text_path.cpp +++ /dev/null @@ -1,159 +0,0 @@ -#include "graphics/text_path.hpp" -#include "graphics/glyph_cache.hpp" - -#include "geometry/angles.hpp" - - -namespace graphics -{ - TextPath::TextPath() - : m_pv(), - m_fullLength(0), - m_pathOffset(0) - {} - - TextPath::TextPath(TextPath const & src, math::Matrix const & m) - { - m_arr.resize(src.m_arr.size()); - for (unsigned i = 0; i < m_arr.size(); ++i) - m_arr[i] = src.m_arr[i] * m; - - m_fullLength = (m2::PointD(src.m_fullLength, 0) * m).Length(m2::PointD(0, 0) * m); - m_pathOffset = (m2::PointD(src.m_pathOffset, 0) * m).Length(m2::PointD(0, 0) * m); - - m_pv = PathView(&m_arr[0], m_arr.size()); - - /// Fix: Check for reversing only when rotation is active, - /// otherwise we have some flicker-blit issues for street names on zooming. - /// @todo Should investigate this stuff. - if (m(0, 1) != 0.0 && m(1, 0) != 0.0) - checkReverse(); - else - setIsReverse(src.isReverse()); - } - - TextPath::TextPath(m2::PointD const * arr, size_t sz, double fullLength, double pathOffset) - : m_fullLength(fullLength), - m_pathOffset(pathOffset) - { - ASSERT ( sz > 1, () ); - - m_arr.resize(sz); - copy(arr, arr + sz, m_arr.begin()); - - m_pv = PathView(&m_arr[0], m_arr.size()); - - checkReverse(); - } - - bool TextPath::isReverse() const - { - return m_pv.isReverse(); - } - - void TextPath::setIsReverse(bool flag) - { - m_pv.setIsReverse(flag); - } - - void TextPath::checkReverse() - { - /* assume, that readable text in path should be ('o' - start draw point): - * / o - * / \ - * / or \ - * o \ - */ - - double const a = ang::AngleTo(m_arr[0], m_arr[m_arr.size() - 1]); - - if (fabs(a) > math::pi / 2.0) - { - // if we swap direction, we need to recalculate path offset from the end - double len = 0.0; - for (size_t i = 1; i < m_arr.size(); ++i) - len += m_arr[i-1].Length(m_arr[i]); - - m_pathOffset = m_fullLength - m_pathOffset - len; - ASSERT ( m_pathOffset >= -1.0E-6, () ); - if (m_pathOffset < 0.0) - m_pathOffset = 0.0; - - setIsReverse(true); - } - else - setIsReverse(false); - } - - double TextPath::fullLength() const - { - return m_fullLength; - } - - double TextPath::pathOffset() const - { - return m_pathOffset; - } - - size_t TextPath::size() const - { - return m_pv.size(); - } - - m2::PointD TextPath::get(size_t i) const - { - return m_pv.get(i); - } - - m2::PointD TextPath::operator[](size_t i) const - { - return get(i); - } - - PathPoint const TextPath::offsetPoint(PathPoint const & pp, double offset) const - { - return m_pv.offsetPoint(pp, offset); - } - - void TextPath::copyWithOffset(double offset, vector & path) const - { - PathPoint pt = m_pv.offsetPoint(front(), m_pathOffset + offset); - path.push_back(pt.m_pt); - path.insert(path.end(), m_arr.begin() + pt.m_i, m_arr.end()); - } - - PivotPoint TextPath::findPivotPoint(PathPoint const & pp, GlyphMetrics const & sym) const - { - const PivotPoint ptStart = m_pv.findPivotPoint(pp, sym.m_xOffset - sym.m_width); - const PivotPoint ptEnd = m_pv.findPivotPoint(pp, sym.m_xOffset + sym.m_width * 2); - - // both start and end are on the same segment, no need to calculate - if (ptStart.m_pp.m_i == ptEnd.m_pp.m_i) - return PivotPoint(ptStart.m_angle, - PathPoint(ptStart.m_pp.m_i, ptStart.m_angle, (ptStart.m_pp.m_pt + ptEnd.m_pp.m_pt) / 2.0)); - - // points are on different segments, average the angle and middle point - const PivotPoint ptMid = m_pv.findPivotPoint(pp, sym.m_xOffset + sym.m_width / 2.0); - if ((ptStart.m_pp.m_i != -1) && (ptMid.m_pp.m_i != -1) && (ptEnd.m_pp.m_i != -1)) - { - const ang::AngleD avgAngle(ang::GetMiddleAngle(ptStart.m_angle.val(), ptEnd.m_angle.val())); - - return PivotPoint(avgAngle, - PathPoint(ptMid.m_pp.m_i, ptMid.m_angle, - (ptStart.m_pp.m_pt + - ptMid.m_pp.m_pt + ptMid.m_pp.m_pt + // twice to compensate for long distance - ptEnd.m_pp.m_pt) / 4.0)); - } - else - { - // if some of the pivot points are outside of the path, just take the middle value - return ptMid; - } - } - - PathPoint const TextPath::front() const - { - return m_pv.front(); - } -} - diff --git a/graphics/text_path.hpp b/graphics/text_path.hpp deleted file mode 100644 index 95818e178b..0000000000 --- a/graphics/text_path.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "graphics/path_view.hpp" - -#include "base/matrix.hpp" -#include "base/buffer_vector.hpp" - - -namespace graphics -{ - struct GlyphMetrics; - - class TextPath - { - private: - - buffer_vector m_arr; - PathView m_pv; - - double m_fullLength; - double m_pathOffset; - - void checkReverse(); - - public: - - TextPath(); - TextPath(TextPath const & src, math::Matrix const & m); - TextPath(m2::PointD const * arr, size_t sz, double fullLength, double pathOffset); - - size_t size() const; - - m2::PointD get(size_t i) const; - m2::PointD operator[](size_t i) const; - - double fullLength() const; - double pathOffset() const; - - void setIsReverse(bool flag); - bool isReverse() const; - - PathPoint const offsetPoint(PathPoint const & pp, double offset) const; - void copyWithOffset(double offset, vector & path) const; - PivotPoint findPivotPoint(PathPoint const & pp, GlyphMetrics const & sym) const; - - PathPoint const front() const; - }; -} diff --git a/graphics/text_renderer.cpp b/graphics/text_renderer.cpp deleted file mode 100644 index 7a8eb3321f..0000000000 --- a/graphics/text_renderer.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "graphics/text_renderer.hpp" -#include "graphics/overlay.hpp" -#include "graphics/resource_manager.hpp" -#include "graphics/glyph.hpp" - -#include "geometry/angles.hpp" - -#include "std/bind.hpp" - -#include "base/string_utils.hpp" - - -namespace graphics -{ - //TextRenderer::Params::Params() - // : m_drawTexts(true) - //{} - - TextRenderer::TextRenderer(base_t::Params const & params) - : base_t(params)//, m_drawTexts(params.m_drawTexts) - {} - - void TextRenderer::drawStraightGlyph(m2::PointD const & ptPivot, - m2::PointD const & ptOffs, - Glyph const * p, - float depth) - { - float x0 = ptOffs.x + (p->m_info.m_metrics.m_xOffset - 1); - float y1 = ptOffs.y - (p->m_info.m_metrics.m_yOffset - 1); - float y0 = y1 - (p->m_texRect.SizeY() - 2); - float x1 = x0 + (p->m_texRect.SizeX() - 2); - - drawStraightTexturedPolygon( - ptPivot, - p->m_texRect.minX() + 1, - p->m_texRect.minY() + 1, - p->m_texRect.maxX() - 1, - p->m_texRect.maxY() - 1, - x0, y0, x1, y1, - depth, - p->m_pipelineID - ); - } - - void TextRenderer::drawGlyph(m2::PointD const & ptOrg, - m2::PointD const & ptGlyph, - ang::AngleD const & angle, - float /*blOffset*/, - Glyph const * p, - double depth) - { - float x0 = ptGlyph.x + (p->m_info.m_metrics.m_xOffset - 1); - float y1 = ptGlyph.y - (p->m_info.m_metrics.m_yOffset - 1); - float y0 = y1 - (p->m_texRect.SizeY() - 2); - float x1 = x0 + (p->m_texRect.SizeX() - 2); - - drawTexturedPolygon(ptOrg, angle, - p->m_texRect.minX() + 1, - p->m_texRect.minY() + 1, - p->m_texRect.maxX() - 1, - p->m_texRect.maxY() - 1, - x0, y0, x1, y1, - depth, - p->m_pipelineID); - } - - GlyphCache * TextRenderer::glyphCache() const - { - return resourceManager()->glyphCache(threadSlot()); - } -} diff --git a/graphics/text_renderer.hpp b/graphics/text_renderer.hpp deleted file mode 100644 index 5cbcc2c8af..0000000000 --- a/graphics/text_renderer.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include "graphics/image_renderer.hpp" -#include "graphics/defines.hpp" -#include "graphics/font_desc.hpp" -#include "graphics/text_element.hpp" - -#include "geometry/tree4d.hpp" - -#include "std/shared_ptr.hpp" - - -namespace graphics -{ - struct Glyph; - - class TextRenderer : public ImageRenderer - { - private: - -// bool m_drawTexts; - - public: - - typedef ImageRenderer base_t; - -// struct Params : base_t::Params -// { -// bool m_drawTexts; -// Params(); -// }; - - TextRenderer(base_t::Params const & params); - - void drawStraightGlyph(m2::PointD const & ptOrg, - m2::PointD const & ptGlyph, - Glyph const * p, - float depth); - - void drawGlyph(m2::PointD const & ptOrg, - m2::PointD const & ptGlyph, - ang::AngleD const & angle, - float blOffset, - Glyph const * p, - double depth); - - - GlyphCache * glyphCache() const; - }; -} diff --git a/graphics/uniforms_holder.cpp b/graphics/uniforms_holder.cpp deleted file mode 100644 index f3758494b8..0000000000 --- a/graphics/uniforms_holder.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "graphics/uniforms_holder.hpp" - -#include "std/utility.hpp" - -namespace graphics -{ - -bool UniformsHolder::insertValue(ESemantic sem, float value) -{ - return insertValue(m_floatHolder, sem, value); -} - -bool UniformsHolder::insertValue(ESemantic sem, float x, float y) -{ - return insertValue(m_vec2Holder, sem, m2::PointF(x, y)); -} - -bool UniformsHolder::insertValue(ESemantic sem, float x, float y, float z, float w) -{ - return insertValue(m_vec4Holder, sem, array({{ x, y, z, w }})); -} - -bool UniformsHolder::insertValue(ESemantic sem, math::Matrix const & matrix) -{ - return insertValue(m_mat4Holder, sem, matrix); -} - -bool UniformsHolder::getValue(ESemantic sem, float & value) const -{ - return getValue(m_floatHolder, sem, value); -} - -bool UniformsHolder::getValue(ESemantic sem, float & x, float & y) const -{ - m2::PointF pt; - if (!getValue(m_vec2Holder, sem, pt)) - return false; - - x = pt.x; - y = pt.y; - return true; -} - -bool UniformsHolder::getValue(ESemantic sem, float & x, float & y, float & z, float & w) const -{ - array v; - if (!getValue(m_vec4Holder, sem, v)) - return false; - - x = v[0]; - y = v[1]; - z = v[2]; - w = v[3]; - return true; -} - -bool UniformsHolder::getValue(ESemantic sem, math::Matrix & value) const -{ - return getValue(m_mat4Holder, sem, value); -} - -} // namespace graphics diff --git a/graphics/uniforms_holder.hpp b/graphics/uniforms_holder.hpp deleted file mode 100644 index fd5995a65a..0000000000 --- a/graphics/uniforms_holder.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "graphics/defines.hpp" -#include "geometry/point2d.hpp" -#include "base/matrix.hpp" -#include "std/array.hpp" -#include "std/map.hpp" - -namespace graphics -{ - -class UniformsHolder -{ -public: - bool insertValue(ESemantic sem, float value); - bool insertValue(ESemantic sem, float x, float y); - bool insertValue(ESemantic sem, float x, float y, float z, float w); - bool insertValue(ESemantic sem, math::Matrix const & matrix); - - bool getValue(ESemantic sem, float & value) const; - bool getValue(ESemantic sem, float & x, float & y) const; - bool getValue(ESemantic sem, float & x, float & y, float & z, float & w) const; - bool getValue(ESemantic sem, math::Matrix & value) const; - -private: - template using THolderMap = map; - using TFloatMap = THolderMap; - using TVec2Map = THolderMap; - using TVec4Map = THolderMap>; - using TMat4Map = THolderMap>; - - template - static bool insertValue(THolderMap & holder, ESemantic sem, THolder const & value) - { - return holder.insert(make_pair(sem, value)).second; - } - - template - static bool getValue(THolderMap const & holder, ESemantic sem, THolder & value) - { - auto it = holder.find(sem); - if (it == holder.end()) - return false; - - value = it->second; - return true; - } - - TFloatMap m_floatHolder; - TVec2Map m_vec2Holder; - TVec4Map m_vec4Holder; - TMat4Map m_mat4Holder; -}; - -} // namespace graphics - diff --git a/graphics/vertex_decl.cpp b/graphics/vertex_decl.cpp deleted file mode 100644 index aa0ef3a0a9..0000000000 --- a/graphics/vertex_decl.cpp +++ /dev/null @@ -1,178 +0,0 @@ -#include "graphics/vertex_decl.hpp" -#include "graphics/defines.hpp" -#include "base/assert.hpp" -#include "base/logging.hpp" - -namespace graphics -{ - VertexAttrib::VertexAttrib(ESemantic semantic, - size_t offset, - EDataType elemType, - size_t elemCount, - size_t stride) - : m_semantic(semantic), - m_offset(offset), - m_elemType(elemType), - m_elemCount(elemCount), - m_stride(stride) - {} - - template - struct FillPosition - { - static void fill(VertexAttrib const * va, PosField * p, unsigned char * v, unsigned stride) - { - if (va->m_elemCount > 3) - { - p->m_w = reinterpret_cast(v + sizeof(T) * 3); - p->m_wStride = stride; - } - if (va->m_elemCount > 2) - { - p->m_z = reinterpret_cast(v + sizeof(T) * 2); - p->m_zStride = stride; - } - if (va->m_elemCount > 1) - { - p->m_y = reinterpret_cast(v + sizeof(T) * 1); - p->m_yStride = stride; - } - if (va->m_elemCount > 0) - { - p->m_x = reinterpret_cast(v); - p->m_xStride = stride; - } - } - }; - - template - struct FillSemantic - { - static void fill(VertexAttrib const * va, VertexStream * vs, unsigned char * v); - }; - - template <> - struct FillSemantic - { - static void fill(VertexAttrib const * va, VertexStream * vs, unsigned char * v, unsigned stride) - { - switch (va->m_elemType) - { - case EFloat: - FillPosition::fill(va, &vs->m_fPos, v, stride); - break; - default: - break; - } - } - }; - - template <> - struct FillSemantic - { - static void fill(VertexAttrib const * va, VertexStream * vs, unsigned char * v, unsigned stride) - { - switch (va->m_elemType) - { - case EFloat: - FillPosition::fill(va, &vs->m_fNormal, v, stride); - break; - default: - ASSERT(false, ("Not supported")); - } - } - }; - - template - struct FillTexCoord - { - static void fill(VertexAttrib const * va, TexField * p, unsigned char * v, unsigned stride) - { - if (va->m_elemCount > 1) - { - p->m_v = reinterpret_cast(v + sizeof(T)); - p->m_vStride = stride; - } - if (va->m_elemCount > 0) - { - p->m_u = reinterpret_cast(v); - p->m_uStride = stride; - } - } - }; - - template <> - struct FillSemantic - { - static void fill(VertexAttrib const * va, VertexStream * vs, unsigned char * v, unsigned stride) - { - switch (va->m_elemType) - { - case EFloat: - FillTexCoord::fill(va, &vs->m_fTex, v, stride); - break; - default: - ASSERT(false, ("Not supported")); - }; - } - }; - - void VertexAttrib::initStream(VertexStream * vs, unsigned char * v, unsigned stride) const - { - switch (m_semantic) - { - case ESemPosition: - FillSemantic::fill(this, vs, v, stride); - break; - case ESemNormal: - FillSemantic::fill(this, vs, v, stride); - break; - case ESemTexCoord0: - FillSemantic::fill(this, vs, v, stride); - break; - default: - LOG(LERROR, ("Unknown semantic specified")); - break; - }; - } - - - VertexDecl::VertexDecl(VertexAttrib const * attrs, size_t cnt) - { - copy(attrs, attrs + cnt, back_inserter(m_attrs)); - - m_elemSize = 0; - - for (unsigned i = 0; i < m_attrs.size(); ++i) - { - VertexAttrib & va = m_attrs[i]; - m_elemSize += graphics::elemSize(va.m_elemType) * va.m_elemCount; - } - } - - VertexAttrib const * VertexDecl::getAttr(size_t i) const - { - return &m_attrs[i]; - } - - size_t VertexDecl::attrCount() const - { - return m_attrs.size(); - } - - size_t VertexDecl::elemSize() const - { - return m_elemSize; - } - - void VertexDecl::initStream(VertexStream *vs, unsigned char * v) const - { - *vs = VertexStream(); - unsigned char * fieldOffs = v; - for (size_t i = 0; i < m_attrs.size(); ++i) - { - VertexAttrib const * va = &m_attrs[i]; - va->initStream(vs, fieldOffs + va->m_offset, m_elemSize); - } - } -} diff --git a/graphics/vertex_decl.hpp b/graphics/vertex_decl.hpp deleted file mode 100644 index 07717063e6..0000000000 --- a/graphics/vertex_decl.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include "graphics/defines.hpp" -#include "graphics/vertex_stream.hpp" - -#include "std/vector.hpp" -#include "std/string.hpp" - -namespace graphics -{ - struct VertexStream; - /// Single attribute of vertex. - struct VertexAttrib - { - ESemantic m_semantic; - size_t m_offset; - EDataType m_elemType; - size_t m_elemCount; - size_t m_stride; - - VertexAttrib(ESemantic semantic, - size_t offset, - EDataType elemType, - size_t elemCount, - size_t stride); - - void initStream(VertexStream * vs, - unsigned char * v, - unsigned stride) const; - }; - - /// Vertex structure declaration. - class VertexDecl - { - private: - vector m_attrs; - size_t m_elemSize; - public: - /// constructor. - VertexDecl(VertexAttrib const * attrs, size_t cnt); - /// get the number of attributes. - size_t attrCount() const; - /// get vertex attribute. - VertexAttrib const * getAttr(size_t i) const; - /// size of single element. - size_t elemSize() const; - /// initialize vertex stream - void initStream(VertexStream * vs, unsigned char * v) const; - }; -} diff --git a/graphics/vertex_stream.hpp b/graphics/vertex_stream.hpp deleted file mode 100644 index 4f99426fdb..0000000000 --- a/graphics/vertex_stream.hpp +++ /dev/null @@ -1,127 +0,0 @@ -#pragma once - -namespace graphics -{ - template - struct PosField - { - T * m_x; - unsigned short m_xStride; - - T * m_y; - unsigned short m_yStride; - - T * m_z; - unsigned short m_zStride; - - T * m_w; - unsigned short m_wStride; - - PosField() : m_x(0), - m_xStride(0), - m_y(0), - m_yStride(0), - m_z(0), - m_zStride(0), - m_w(0), - m_wStride(0) - {} - - template - void copyFrom(PosField const & u) - { - if (m_x && u.m_x) - *m_x = static_cast(*u.m_x); - if (m_y && u.m_y) - *m_y = static_cast(*u.m_y); - if (m_z && u.m_z) - *m_z = static_cast(*u.m_z); - if (m_w && u.m_w) - *m_w = static_cast(*u.m_w); - } - - void advance(unsigned cnt) - { - if (m_x) - m_x = reinterpret_cast(reinterpret_cast(m_x) + m_xStride * cnt); - if (m_y) - m_y = reinterpret_cast(reinterpret_cast(m_y) + m_yStride * cnt); - if (m_z) - m_z = reinterpret_cast(reinterpret_cast(m_z) + m_zStride * cnt); - if (m_w) - m_w = reinterpret_cast(reinterpret_cast(m_w) + m_wStride * cnt); - } - }; - - template - struct TexField - { - T * m_u; - unsigned short m_uStride; - - T * m_v; - unsigned short m_vStride; - - TexField() : m_u(0), - m_uStride(0), - m_v(0), - m_vStride(0) - {} - - template - void copyFrom(TexField const & u) - { - if (m_u && u.m_u) - *m_u = static_cast(*u.m_u); - if (m_v && u.m_v) - *m_v = static_cast(*u.m_v); - } - - void advance(unsigned cnt) - { - if (m_u) - m_u = reinterpret_cast(reinterpret_cast(m_u) + m_uStride * cnt); - if (m_v) - m_v = reinterpret_cast(reinterpret_cast(m_v) + m_vStride * cnt); - } - }; - - struct VertexStream - { - PosField m_fPos; - PosField m_dPos; - PosField m_fNormal; - PosField m_dNormal; - TexField m_fTex; - TexField m_dTex; - - /// should be inline for max performance - inline void copyVertex(VertexStream * dstVS) - { - m_fPos.copyFrom(dstVS->m_fPos); - m_fPos.copyFrom(dstVS->m_dPos); - m_dPos.copyFrom(dstVS->m_fPos); - m_dPos.copyFrom(dstVS->m_dPos); - - m_fNormal.copyFrom(dstVS->m_fNormal); - m_fNormal.copyFrom(dstVS->m_dNormal); - m_dNormal.copyFrom(dstVS->m_fNormal); - m_dNormal.copyFrom(dstVS->m_dNormal); - - m_fTex.copyFrom(dstVS->m_fTex); - m_fTex.copyFrom(dstVS->m_dTex); - m_dTex.copyFrom(dstVS->m_fTex); - m_dTex.copyFrom(dstVS->m_dTex); - } - /// should be inline for max performance - inline void advanceVertex(unsigned cnt) - { - m_fPos.advance(cnt); - m_dPos.advance(cnt); - m_fNormal.advance(cnt); - m_dNormal.advance(cnt); - m_fTex.advance(cnt); - m_dTex.advance(cnt); - } - }; -} diff --git a/gui/button.cpp b/gui/button.cpp deleted file mode 100644 index f67b2e29b5..0000000000 --- a/gui/button.cpp +++ /dev/null @@ -1,215 +0,0 @@ -#include "gui/button.hpp" -#include "gui/controller.hpp" - -#include "graphics/screen.hpp" -#include "graphics/display_list.hpp" - -#include "geometry/transformations.hpp" - - -namespace gui -{ - Button::Params::Params() - : m_minWidth(10), - m_minHeight(10) - {} - - Button::Button(Params const & p) : Element(p) - { - TextView::Params tp; - - tp.m_depth = p.m_depth + 1; - tp.m_pivot = p.m_pivot; - tp.m_position = graphics::EPosCenter; - tp.m_text = p.m_text; - - m_textView.reset(new TextView(tp)); - - setMinWidth(p.m_minWidth); - setMinHeight(p.m_minHeight); - setText(p.m_text); - - setFont(EActive, graphics::FontDesc(12, graphics::Color(0, 0, 0, 255))); - setFont(EPressed, graphics::FontDesc(12, graphics::Color(0, 0, 0, 255))); - - setColor(EActive, graphics::Color(graphics::Color(192, 192, 192, 255))); - setColor(EPressed, graphics::Color(graphics::Color(64, 64, 64, 255))); - } - - void Button::setOnClickListener(TOnClickListener const & l) - { - m_OnClickListener = l; - } - - bool Button::onTapStarted(m2::PointD const & pt) - { - setState(EPressed); - invalidate(); - return false; - } - - bool Button::onTapCancelled(m2::PointD const & pt) - { - setState(EActive); - invalidate(); - return false; - } - - bool Button::onTapEnded(m2::PointD const & pt) - { - setState(EActive); - if (m_OnClickListener) - m_OnClickListener(this); - invalidate(); - return false; - } - - bool Button::onTapMoved(m2::PointD const & pt) - { - invalidate(); - return false; - } - - void Button::setText(string const & text) - { - m_textView->setText(text); - } - - string const & Button::text() const - { - return m_textView->text(); - } - - void Button::setMinWidth(unsigned minWidth) - { - m_minWidth = minWidth; - invalidate(); - } - - unsigned Button::minWidth() const - { - return m_minWidth; - } - - void Button::setMinHeight(unsigned minHeight) - { - m_minHeight = minHeight; - invalidate(); - } - - unsigned Button::minHeight() const - { - return m_minHeight; - } - - void Button::setController(Controller *controller) - { - m_textView->setController(controller); - Element::setController(controller); - } - - void Button::cacheButtonBody(EState state) - { - double const k = visualScale(); - m2::RectD const rr = GetBoundRect(); - - graphics::Screen * cs = m_controller->GetCacheScreen(); - - cs->beginFrame(); - - unique_ptr & dl = m_dls[state]; - - dl.reset(); - dl.reset(cs->createDisplayList()); - - cs->setDisplayList(dl.get()); - - cs->drawRoundedRectangle(m2::RectD(-rr.SizeX() / 2, - -rr.SizeY() / 2, - rr.SizeX() / 2, - rr.SizeY() / 2), - 10 * k, color(state), depth()); - - cs->setDisplayList(0); - - cs->endFrame(); - } - - void Button::cache() - { - cacheButtonBody(EActive); - cacheButtonBody(EPressed); - } - - void Button::purge() - { - m_dls.clear(); - m_textView->purge(); - } - - void Button::layout() - { - m_textView->setIsDirtyLayout(true); - } - - m2::RectD Button::GetBoundRect() const - { - double const k = visualScale(); - - m2::RectD tr(m_textView->GetBoundRect()); - m2::RectD rc(0, 0, tr.SizeX(), tr.SizeY()); - - rc.Inflate(15 * k, 5 * k); - - double dx = 0; - double dy = 0; - - if (rc.SizeX() < m_minWidth * k) - dx = (m_minWidth * k - rc.SizeX()) / 2; - if (rc.SizeY() < m_minHeight * k) - dy = (m_minHeight * k - rc.SizeY()) / 2; - - rc.Inflate(dx, dy); - rc.Offset(-rc.minX(), -rc.minY()); - - m2::PointD pt = computeTopLeft(m2::PointD(rc.SizeX(), rc.SizeY()), - pivot(), - position()); - - rc.Offset(pt); - - return rc; - } - - void Button::draw(graphics::OverlayRenderer * r, math::Matrix const & m) const - { - if (isVisible()) - { - checkDirtyLayout(); - - math::Matrix const drawM = math::Shift(math::Identity(), pivot()); - - r->drawDisplayList(m_dls.at(state()).get(), drawM * m); - - m_textView->draw(r, m); - } - } - - void Button::setPivot(m2::PointD const & pv, bool dirtyFlag) - { - m_textView->setPivot(pv, dirtyFlag); - Element::setPivot(pv, dirtyFlag); - } - - void Button::setFont(EState state, graphics::FontDesc const & font) - { - m_textView->setFont(state, font); - Element::setFont(state, font); - } - - void Button::setColor(EState state, graphics::Color const & c) - { - m_textView->setColor(state, c); - Element::setColor(state, c); - } -} diff --git a/gui/button.hpp b/gui/button.hpp deleted file mode 100644 index c9f44082b3..0000000000 --- a/gui/button.hpp +++ /dev/null @@ -1,84 +0,0 @@ -#pragma once - -#include "gui/element.hpp" -#include "gui/text_view.hpp" - -#include "std/function.hpp" -#include "std/string.hpp" -#include "std/unique_ptr.hpp" - - -namespace graphics -{ - class OverlayElement; - class DisplayList; - - namespace gl - { - class OverlayRenderer; - } -} - -namespace gui -{ - class Button : public Element - { - public: - typedef function TOnClickListener; - - private: - TOnClickListener m_OnClickListener; - - unsigned m_minWidth; - unsigned m_minHeight; - - unique_ptr m_textView; - map > m_dls; - - void cacheButtonBody(EState state); - - public: - struct Params : Element::Params - { - unsigned m_minWidth; - unsigned m_minHeight; - string m_text; - Params(); - }; - - Button(Params const & p); - - void setOnClickListener(TOnClickListener const & l); - - void setFont(EState state, graphics::FontDesc const & font); - void setColor(EState state, graphics::Color const & c); - - void setText(string const & text); - string const & text() const; - - void setMinWidth(unsigned minWidthInDIP); - unsigned minWidth() const; - - void setMinHeight(unsigned minHeightInDIP); - unsigned minHeight() const; - - /// @name Override from graphics::OverlayElement and gui::Element. - //@{ - virtual m2::RectD GetBoundRect() const; - - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - void setPivot(m2::PointD const & pv, bool dirtyFlag = true); - - void purge(); - void layout(); - void cache(); - - void setController(Controller * controller); - - bool onTapStarted(m2::PointD const & pt); - bool onTapMoved(m2::PointD const & pt); - bool onTapEnded(m2::PointD const & pt); - bool onTapCancelled(m2::PointD const & pt); - //@} - }; -} diff --git a/gui/cached_text_view.cpp b/gui/cached_text_view.cpp deleted file mode 100644 index 419a4a06c7..0000000000 --- a/gui/cached_text_view.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "gui/cached_text_view.hpp" -#include "gui/controller.hpp" - -#include "geometry/transformations.hpp" - -#include "graphics/glyph.hpp" -#include "graphics/screen.hpp" -#include "graphics/display_list.hpp" -#include "graphics/glyph_layout.hpp" - - -using namespace graphics; - -namespace gui -{ - CachedTextView::CachedTextView(Params const & p) - : Element(p) - , m_isAnimated(false) - { - setText(p.m_text); - - setFont(EActive, FontDesc(12, Color(0, 0, 0, 255))); - setFont(EPressed, FontDesc(12, Color(0, 0, 0, 255))); - - setColor(EActive, Color(Color(192, 192, 192, 255))); - setColor(EPressed, Color(Color(64, 64, 64, 255))); - } - - void CachedTextView::setText(string const & text) - { - strings::UniString const uText = strings::MakeUniString(text); - if (uText != m_uniText) - { - m_uniText = uText; - setIsDirtyLayout(true); - } - } - - void CachedTextView::setAnimated(TAlfaGetterFn const & fn) - { - m_isAnimated = true; - m_alfaGetter = fn; - } - - void CachedTextView::setFont(EState state, FontDesc const & desc) - { - setIsDirtyLayout(true); - Element::setFont(state, desc); - } - - void CachedTextView::GetMiniBoundRects(RectsT & rects) const - { - rects.resize(m_layout->boundRects().size()); - copy(m_layout->boundRects().begin(), - m_layout->boundRects().end(), - back_inserter(rects)); - } - - void CachedTextView::draw(OverlayRenderer * r, math::Matrix const & m) const - { - if (isVisible()) - { - checkDirtyLayout(); - - math::Matrix id = math::Identity(); - UniformsHolder holder; - UniformsHolder * drawHolder = NULL; - - if (m_isAnimated) - { - r->applyVarAlfaStates(); - drawHolder = &holder; - ASSERT(m_alfaGetter, ()); - drawHolder->insertValue(graphics::ETransparency, m_alfaGetter()); - } - - if (m_maskedLayout) - for (size_t i = 0; i < m_uniText.size(); ++i) - r->drawDisplayList(m_maskedDls[i].get(), - math::Shift(id, m_maskedLayout->entries()[i].m_pt + m_maskedLayout->pivot()), - drawHolder); - - for (size_t i = 0; i < m_uniText.size(); ++i) - r->drawDisplayList(m_dls[i].get(), - math::Shift(id, m_layout->entries()[i].m_pt + m_layout->pivot()), - drawHolder); - } - } - - void CachedTextView::cache() - { - DisplayListCache * dlc = m_controller->GetDisplayListCache(); - FontDesc fontDesc = font(EActive); - - if (fontDesc.m_isMasked) - { - m_maskedDls.resize(m_uniText.size()); - for (size_t i = 0; i < m_uniText.size(); ++i) - m_maskedDls[i] = dlc->FindGlyph(GlyphKey(m_uniText[i], - fontDesc.m_size, - fontDesc.m_isMasked, - fontDesc.m_isMasked ? fontDesc.m_maskColor : fontDesc.m_color)); - - fontDesc.m_isMasked = false; - } - - m_dls.resize(m_uniText.size()); - - for (size_t i = 0; i < m_uniText.size(); ++i) - m_dls[i] = dlc->FindGlyph(GlyphKey(m_uniText[i], - fontDesc.m_size, - fontDesc.m_isMasked, - fontDesc.m_color)); - } - - void CachedTextView::purge() - { - m_maskedDls.clear(); - m_dls.clear(); - } - - void CachedTextView::layout() - { - if (m_uniText.empty()) - return; - - FontDesc fontDesc = font(EActive); - - if (fontDesc.m_isMasked) - { - m_maskedLayout.reset(new GlyphLayout(m_controller->GetGlyphCache(), - fontDesc, - pivot(), - m_uniText, - position())); - fontDesc.m_isMasked = false; - } - - m_layout.reset(new GlyphLayout(m_controller->GetGlyphCache(), - fontDesc, - pivot(), - m_uniText, - position())); - } - - void CachedTextView::setPivot(m2::PointD const & pv, bool dirtyFlag) - { - Element::setPivot(pv, dirtyFlag); - - if (m_maskedLayout) - m_maskedLayout->setPivot(pivot()); - if (m_layout) - m_layout->setPivot(pivot()); - } -} diff --git a/gui/cached_text_view.hpp b/gui/cached_text_view.hpp deleted file mode 100644 index 2fe1b6410d..0000000000 --- a/gui/cached_text_view.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include "gui/element.hpp" - -#include "base/string_utils.hpp" -#include "base/matrix.hpp" - -#include "std/vector.hpp" -#include "std/shared_ptr.hpp" -#include "std/unique_ptr.hpp" -#include "std/function.hpp" - - -namespace graphics -{ - class DisplayList; - class GlyphLayout; -} - -namespace gui -{ - class CachedTextView : public Element - { - strings::UniString m_uniText; - - vector > m_dls; - vector > m_maskedDls; - - unique_ptr m_layout; - unique_ptr m_maskedLayout; - - public: - struct Params : public Element::Params - { - string m_text; - }; - - CachedTextView(Params const & p); - - void setText(string const & text); - - typedef function TAlfaGetterFn; - void setAnimated(TAlfaGetterFn const & fn); - - /// @name Overrider from graphics::OverlayElement and gui::Element. - //@{ - virtual void GetMiniBoundRects(RectsT & rects) const; - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - - void cache(); - void purge(); - void layout(); - - void setFont(EState state, graphics::FontDesc const & desc); - - void setPivot(m2::PointD const & pv, bool dirtyFlag = true); - //@} - - private: - bool m_isAnimated; - TAlfaGetterFn m_alfaGetter; - }; -} diff --git a/gui/controller.cpp b/gui/controller.cpp deleted file mode 100644 index de505984cc..0000000000 --- a/gui/controller.cpp +++ /dev/null @@ -1,254 +0,0 @@ -#include "gui/controller.hpp" -#include "gui/element.hpp" - -#include "graphics/screen.hpp" - -#include "std/bind.hpp" - - -namespace gui -{ - Controller::RenderParams::RenderParams() - : m_Density(graphics::EDensityMDPI), m_exactDensityDPI(0), m_GlyphCache(0) - {} - - Controller::Controller() - : m_Density(graphics::EDensityMDPI), m_GlyphCache(0) - {} - - Controller::RenderParams::RenderParams(graphics::EDensity density, - int exactDensityDPI, - TInvalidateFn invalidateFn, - graphics::GlyphCache * glyphCache, - graphics::Screen * cacheScreen) - : m_Density(density), - m_exactDensityDPI(exactDensityDPI), - m_InvalidateFn(invalidateFn), - m_GlyphCache(glyphCache), - m_CacheScreen(cacheScreen) - {} - - Controller::~Controller() - {} - - shared_ptr Controller::SelectTopElement(m2::PointD const & pt, bool onlyVisible) const - { - shared_ptr res; - - for (ElemsT::const_iterator it = m_Elements.begin(); it != m_Elements.end(); ++it) - { - shared_ptr const & e = *it; - if ((!onlyVisible || e->isVisible()) && e->hitTest(pt)) - { - if (!res || e->depth() > res->depth()) - res = e; - } - } - - return res; - } - - bool Controller::OnTapStarted(m2::PointD const & pt) - { - if (GetCacheScreen() == nullptr) - return false; - - shared_ptr e = SelectTopElement(pt, true); - if (e) - { - m_focusedElement = e; - m_focusedElement->onTapStarted(pt); - m_LastTapCancelled = false; - return true; - } - - return false; - } - - bool Controller::OnTapMoved(m2::PointD const & pt) - { - if (GetCacheScreen() == nullptr) - return false; - - if (m_focusedElement) - { - if (!m_LastTapCancelled) - { - if (!m_focusedElement->hitTest(pt)) - { - m_focusedElement->onTapCancelled(pt); - m_LastTapCancelled = true; - } - else - m_focusedElement->onTapMoved(pt); - } - - // event handled - return true; - } - - return false; - } - - bool Controller::OnTapEnded(m2::PointD const & pt) - { - if (GetCacheScreen() == nullptr) - return false; - - if (m_focusedElement) - { - // re-checking, whether we are above the gui element. - if (!m_LastTapCancelled) - { - if (!m_focusedElement->hitTest(pt)) - { - m_focusedElement->onTapCancelled(pt); - m_LastTapCancelled = true; - } - else - m_focusedElement->onTapEnded(pt); - } - - m_focusedElement.reset(); - m_LastTapCancelled = false; - - return true; - } - - return false; - } - - bool Controller::OnTapCancelled(m2::PointD const & pt) - { - if (GetCacheScreen() == nullptr) - return false; - - if (m_focusedElement) - { - m_focusedElement->onTapCancelled(pt); - m_focusedElement.reset(); - return true; - } - - return false; - } - - void Controller::RemoveElement(shared_ptr const & e) - { - ElemsT::iterator it = find(m_Elements.begin(), m_Elements.end(), e); - - if (it != m_Elements.end()) - m_Elements.erase(it); - - e->setController(0); - } - - void Controller::AddElement(shared_ptr const & e) - { - e->setController(this); - m_Elements.push_back(e); - } - - double Controller::GetVisualScale() const - { - return m_VisualScale; - } - - graphics::EDensity Controller::GetDensity() const - { - return m_Density; - } - - void Controller::SetRenderParams(RenderParams const & p) - { - m_GlyphCache = p.m_GlyphCache; - m_InvalidateFn = p.m_InvalidateFn; - m_Density = p.m_Density; - m_VisualScale = graphics::visualScaleExact(p.m_exactDensityDPI); - m_CacheScreen = p.m_CacheScreen; - - m_DisplayListCache.reset(new DisplayListCache(m_CacheScreen, m_GlyphCache)); - - LayoutElements(); - } - - void Controller::ResetRenderParams() - { - m_GlyphCache = 0; - m_Density = graphics::EDensityLDPI; - m_InvalidateFn = TInvalidateFn(); - m_CacheScreen = nullptr; - - PurgeElements(); - - m_DisplayListCache.reset(); - } - - void Controller::DrawFrame(graphics::Screen * screen) - { - if (m_CacheScreen == nullptr) - return; - - screen->beginFrame(); - - math::Matrix const m = math::Identity(); - for (auto const & element : m_Elements) - element->draw(screen, m); - - screen->endFrame(); - } - - void Controller::Invalidate() - { - if (m_InvalidateFn) - m_InvalidateFn(); - } - - graphics::GlyphCache * Controller::GetGlyphCache() const - { - return m_GlyphCache; - } - - void Controller::SetStringsBundle(StringsBundle const * bundle) - { - m_bundle = bundle; - for (auto const & element : m_Elements) - element->setIsDirtyLayout(true); - } - - StringsBundle const * Controller::GetStringsBundle() const - { - return m_bundle; - } - - graphics::Screen * Controller::GetCacheScreen() const - { - return m_CacheScreen; - } - - DisplayListCache * Controller::GetDisplayListCache() const - { - return m_DisplayListCache.get(); - } - - void Controller::UpdateElements() - { - for (auto const & element : m_Elements) - element->update(); - } - - void Controller::PurgeElements() - { - for (auto const & element : m_Elements) - { - element->purge(); - element->setIsDirtyLayout(true); - } - } - - void Controller::LayoutElements() - { - for (auto const & element : m_Elements) - element->checkDirtyLayout(); - } -} diff --git a/gui/controller.hpp b/gui/controller.hpp deleted file mode 100644 index 8c51189d8f..0000000000 --- a/gui/controller.hpp +++ /dev/null @@ -1,137 +0,0 @@ -#pragma once - -#include "gui/display_list_cache.hpp" - -#include "graphics/defines.hpp" - -#include "geometry/point2d.hpp" - -#include "base/strings_bundle.hpp" - -#include "std/shared_ptr.hpp" -#include "std/unique_ptr.hpp" -#include "std/function.hpp" -#include "std/list.hpp" - - -namespace graphics -{ - class GlyphCache; - class Screen; -} - -namespace gui -{ - class Element; - - /// Controller for GUI elements, which tracks mouse, keyboard and - /// touch user interactions into interactions with GUI elements. - class Controller - { - public: - - /// Invalidate functor type - typedef function TInvalidateFn; - - struct RenderParams - { - graphics::EDensity m_Density; - int m_exactDensityDPI; - TInvalidateFn m_InvalidateFn; - graphics::GlyphCache * m_GlyphCache; - graphics::Screen * m_CacheScreen; - RenderParams(); - RenderParams(graphics::EDensity density, - int exactDensityDPI, - TInvalidateFn invalidateFn, - graphics::GlyphCache * glyphCache, - graphics::Screen * cacheScreen); - }; - - private: - - /// Element that has focus. - shared_ptr m_focusedElement; - - typedef list > ElemsT; - - ElemsT m_Elements; - - /// Select top element under specified point for tap processing. - shared_ptr SelectTopElement(m2::PointD const & pt, bool onlyVisible) const; - - /// Invalidate GUI function - TInvalidateFn m_InvalidateFn; - - /// Screen density - graphics::EDensity m_Density; - - /// VisualScale to multiply all Device-Independent-Pixels dimensions. - double m_VisualScale; - - /// GlyphCache for text rendering by GUI elements. - graphics::GlyphCache * m_GlyphCache; - - /// Cache for display lists for fast rendering on GUI thread - unique_ptr m_DisplayListCache; - - /// Localized strings for GUI. - StringsBundle const * m_bundle; - - /// Screen, which is used to cache gui::Elements into display lists. - graphics::Screen * m_CacheScreen = nullptr; - - /// Should we call the onTapEnded when the tap finished(we should - /// not if the tap was cancelled while moving). - bool m_LastTapCancelled; - - public: - - /// Constructor with GestureDetector to route events from. - Controller(); - /// Destructor - virtual ~Controller(); - - /// Handlers to be called from the client code to power up the GUI. - /// @{ - bool OnTapStarted(m2::PointD const & pt); - bool OnTapMoved(m2::PointD const & pt); - bool OnTapEnded(m2::PointD const & pt); - bool OnTapCancelled(m2::PointD const & pt); - /// @} - - /// Attach GUI Controller to the renderer - void SetRenderParams(RenderParams const & p); - /// Set the bundle with localized strings - void SetStringsBundle(StringsBundle const * bundle); - /// Detach GUI Controller from the renderer - void ResetRenderParams(); - /// Invalidate the scene - void Invalidate(); - /// Remove GUI element by pointer - void RemoveElement(shared_ptr const & e); - /// Add GUI element to the controller - void AddElement(shared_ptr const & e); - /// Get VisualScale parameter - double GetVisualScale() const; - /// Get Density parameter - graphics::EDensity GetDensity() const; - /// Get localized strings bundle - StringsBundle const * GetStringsBundle() const; - /// Get GlyphCache - graphics::GlyphCache * GetGlyphCache() const; - /// Get graphics::Screen, which is used to cache gui::Element's - /// into display lists. - graphics::Screen * GetCacheScreen() const; - /// Get display list cache - DisplayListCache * GetDisplayListCache() const; - /// Redraw GUI - void DrawFrame(graphics::Screen * screen); - /// Calling gui::Element::update for every element. - void UpdateElements(); - /// Calling gui::Element::purge for every element. - void PurgeElements(); - /// Calling gui::Element::performLayout for every element - void LayoutElements(); - }; -} diff --git a/gui/display_list_cache.cpp b/gui/display_list_cache.cpp deleted file mode 100644 index 353a84c742..0000000000 --- a/gui/display_list_cache.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include "gui/display_list_cache.hpp" - -#include "graphics/screen.hpp" -#include "graphics/display_list.hpp" -#include "graphics/glyph.hpp" -#include "graphics/depth_constants.hpp" - - -using namespace graphics; - -namespace gui -{ - DisplayListCache::DisplayListCache(Screen * CacheScreen, - GlyphCache * GlyphCache) - : m_CacheScreen(CacheScreen), - m_GlyphCache(GlyphCache) - {} - - shared_ptr const & DisplayListCache::FindGlyph(GlyphKey const & key) - { - TGlyphs::const_iterator it = m_Glyphs.find(key); - - if (it != m_Glyphs.end()) - return it->second; - - shared_ptr & dl = m_Glyphs[key]; - - dl.reset(m_CacheScreen->createDisplayList()); - - m_CacheScreen->beginFrame(); - m_CacheScreen->setDisplayList(dl.get()); - - uint32_t resID = m_CacheScreen->mapInfo(Glyph::Info(key, m_GlyphCache)); - Resource const * res = m_CacheScreen->fromID(resID); - - ASSERT(res->m_cat == Resource::EGlyph, ()); - Glyph const * glyph = static_cast(res); - - m_CacheScreen->drawGlyph(m2::PointD(0, 0), m2::PointD(0, 0), ang::AngleD(0), 0, glyph, maxDepth - 10); - - m_CacheScreen->setDisplayList(0); - m_CacheScreen->endFrame(); - - return dl; - } - - void DisplayListCache::TouchGlyph(GlyphKey const & key) - { - FindGlyph(key); - } - - bool DisplayListCache::HasGlyph(GlyphKey const & key) - { - return m_Glyphs.find(key) != m_Glyphs.end(); - } - - /* - void DisplayListCache::TouchSymbol(char const * name) - { - FindSymbol(name); - } - - bool DisplayListCache::HasSymbol(char const * name) - { - return m_Symbols.find(name) != m_Symbols.end(); - } - - shared_ptr const & DisplayListCache::FindSymbol(char const * name) - { - string s(name); - TSymbols::const_iterator it = m_Symbols.find(s); - - if (it != m_Symbols.end()) - return it->second; - - shared_ptr & dl = m_Symbols[s]; - - dl.reset(m_CacheScreen->createDisplayList()); - - m_CacheScreen->beginFrame(); - m_CacheScreen->setDisplayList(dl.get()); - - EPosition pos = EPosAbove; - if (s == "search-result") - pos = EPosCenter; - - /// @todo do not cache depth in display list. use separate vertex shader and uniform constant - /// to specify it while rendering display list. - m_CacheScreen->drawSymbol(m2::PointD(0, 0), name, pos, poiDepth); - - m_CacheScreen->setDisplayList(0); - m_CacheScreen->endFrame(); - - return dl; - } - */ -} diff --git a/gui/display_list_cache.hpp b/gui/display_list_cache.hpp deleted file mode 100644 index a88f1137d6..0000000000 --- a/gui/display_list_cache.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - - -#include "graphics/glyph_cache.hpp" - -#include "std/shared_ptr.hpp" - - -namespace graphics -{ - class Screen; - class DisplayList; -} - -namespace gui -{ - class DisplayListCache - { - private: - - /// Screen, which should be used for caching - graphics::Screen * m_CacheScreen; - /// GlyphCache, which should be used for caching - graphics::GlyphCache * m_GlyphCache; - /// Actual cache of glyphs as a display lists - typedef map > TGlyphs; - TGlyphs m_Glyphs; - - typedef map > TSymbols; - TSymbols m_Symbols; - - public: - - DisplayListCache(graphics::Screen * CacheScreen, - graphics::GlyphCache * GlyphCache); - - /// Add element to cache if needed - void TouchGlyph(graphics::GlyphKey const & key); - /// Find glyph in cache, caching if needed. - shared_ptr const & FindGlyph(graphics::GlyphKey const & key); - /// Check, whether the glyph is present in cache. - bool HasGlyph(graphics::GlyphKey const & key); - - /* - /// Add symbol to cache if needed - void TouchSymbol(char const * name); - /// Find symbol in cache, caching if needed - shared_ptr const & FindSymbol(char const * name); - /// Check, whether the display list for specified symbol is present in cache - bool HasSymbol(char const * name); - */ - }; -} diff --git a/gui/element.cpp b/gui/element.cpp deleted file mode 100644 index 8e55a03f22..0000000000 --- a/gui/element.cpp +++ /dev/null @@ -1,124 +0,0 @@ -#include "gui/element.hpp" -#include "gui/controller.hpp" - -#include "base/logging.hpp" - - -namespace gui -{ - Element::Element(Params const & p) - : OverlayElement(p), - m_controller(0), - m_state(EActive) - {} - - void Element::setState(EState state) - { - m_state = state; - } - - Element::EState Element::state() const - { - return m_state; - } - - void Element::setFont(EState state, graphics::FontDesc const & font) - { - m_fonts[state] = font; - } - - graphics::FontDesc const & Element::font(EState state) const - { - return m_fonts[state]; - } - - void Element::setColor(EState state, graphics::Color const & c) - { - m_colors[state] = c; - } - - graphics::Color const & Element::color(EState state) const - { - return m_colors[state]; - } - - void Element::invalidate() - { - if (m_controller) - m_controller->Invalidate(); - else - LOG(LDEBUG/*LWARNING*/, ("unattached gui::Element couldn't be invalidated!")); - } - - double Element::visualScale() const - { - if (m_controller) - return m_controller->GetVisualScale(); - else - { - LOG(LDEBUG/*LWARNING*/, ("unattached gui::Elements shouldn't call gui::Element::visualScale function")); - return 0.0; - } - } - - void Element::cache() - {} - - void Element::purge() - {} - - void Element::update() - {} - - void Element::layout() - {} - - void Element::checkDirtyLayout() const - { - if (isDirtyLayout()) - { - const_cast(this)->layout(); - const_cast(this)->cache(); - setIsDirtyLayout(false); - } - } - - void Element::draw(graphics::OverlayRenderer * r, math::Matrix const &) const - { - DrawRectsDebug(r, color(state()), depth()); - } - - double Element::priority() const - { - return 0; - } - - bool Element::onTapStarted(m2::PointD const & pt) - { - return false; - } - - bool Element::onTapMoved(m2::PointD const & pt) - { - return false; - } - - bool Element::onTapEnded(m2::PointD const & pt) - { - return false; - } - - bool Element::onTapCancelled(m2::PointD const & pt) - { - return false; - } - - void Element::setController(Controller * controller) - { - m_controller = controller; - } - - void Element::setTransformation(const math::Matrix & /*m*/) - { - } -} diff --git a/gui/element.hpp b/gui/element.hpp deleted file mode 100644 index 1e3416e1e0..0000000000 --- a/gui/element.hpp +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once - -#include "graphics/overlay_element.hpp" -#include "graphics/color.hpp" -#include "graphics/font_desc.hpp" - -#include "std/map.hpp" - - -namespace graphics -{ - namespace gl - { - class OverlayRenderer; - } -} - -namespace gui -{ - class Controller; - - class Element : public graphics::OverlayElement - { - public: - enum EState - { - EInactive = 0, - EActive, - EPressed, - ESelected - }; - - protected: - Controller * m_controller; - - private: - EState m_state; - - mutable map m_fonts; - mutable map m_colors; - - public: - typedef OverlayElement::Params Params; - - Element(Params const & p); - - void setState(EState state); - EState state() const; - - virtual void setFont(EState state, graphics::FontDesc const & font); - graphics::FontDesc const & font(EState state) const; - - virtual void setColor(EState state, graphics::Color const & c); - graphics::Color const & color(EState state) const; - - /// Implement this method to handle single tap on the GUI element. - //@{ - virtual bool onTapStarted(m2::PointD const & pt); - virtual bool onTapMoved(m2::PointD const & pt); - virtual bool onTapEnded(m2::PointD const & pt); - virtual bool onTapCancelled(m2::PointD const & pt); - //@} - - /// Invalidate the rendering system to redraw the gui elements. - void invalidate(); - /// obtain @see VisualScale - double visualScale() const; - - /// This method is called to cache visual appearance of gui::Element for fast rendering. - /// It should be called after layout() is calculated properly. - virtual void cache(); - /// This method is called upon renderPolicy destruction and should clean - /// all rendering-related resources, p.e. displayLists. - virtual void purge(); - /// This method is called in each frame and should be overriden if the - /// element wants to update it's internal state. - virtual void update(); - /// This method is called after gui::Controller::SetRenderParams to - /// perform layout calculations which might depends on RenderParams. - /// It should be called when isDirtyLayout is set to true (visual parameters of object is changed). - virtual void layout(); - /// Set the parent controller for this element. Should be called for all inner Elemen's too. - virtual void setController(Controller * controller); - - /// Check if the layout of element is dirty and re-layout element if needed. - /// Used in a "lazy" layout/cache strategy (called before actual drawing). - void checkDirtyLayout() const; - - /// @name Override from OverlayElement. - //@{ - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - double priority() const; - void setTransformation(const math::Matrix & m); - //@} - }; -} diff --git a/gui/gui.pro b/gui/gui.pro deleted file mode 100644 index 725de88b88..0000000000 --- a/gui/gui.pro +++ /dev/null @@ -1,27 +0,0 @@ -# GUI library on top of Graphics - -TARGET = gui -TEMPLATE = lib -CONFIG += staticlib warn_on - -ROOT_DIR = .. - -include($$ROOT_DIR/common.pri) - -HEADERS += \ - controller.hpp\ - element.hpp \ - button.hpp \ - text_view.hpp \ - image_view.hpp \ - cached_text_view.hpp \ - display_list_cache.hpp - -SOURCES += \ - controller.cpp \ - element.cpp \ - button.cpp \ - text_view.cpp \ - image_view.cpp \ - cached_text_view.cpp \ - display_list_cache.cpp diff --git a/gui/gui_tests/gui_tests.cpp b/gui/gui_tests/gui_tests.cpp deleted file mode 100644 index 0e9f374288..0000000000 --- a/gui/gui_tests/gui_tests.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "qt_tstfrm/gui_test_widget.hpp" - -#include "gui/button.hpp" -#include "gui/text_view.hpp" -#include "gui/image_view.hpp" -#include "gui/cached_text_view.hpp" - -#include "graphics/display_list.hpp" - -#include "map/country_status_display.hpp" -#include "map/framework.hpp" - - -struct ButtonTest -{ - shared_ptr m_button; - - void Init(gui::Controller * c) - { - gui::Button::Params bp; - - bp.m_depth = graphics::maxDepth - 10; - bp.m_pivot = m2::PointD(200, 200); - bp.m_position = graphics::EPosAbove; - bp.m_text = "TestButton"; - bp.m_minWidth = 200; - bp.m_minHeight = 40; - - m_button.reset(new gui::Button(bp)); - - m_button->setFont(gui::Element::EActive, graphics::FontDesc(16, graphics::Color(255, 255, 255, 255))); - m_button->setFont(gui::Element::EPressed, graphics::FontDesc(16, graphics::Color(255, 255, 255, 255))); - - m_button->setColor(gui::Element::EActive, graphics::Color(graphics::Color(0, 0, 0, 0.6 * 255))); - m_button->setColor(gui::Element::EPressed, graphics::Color(graphics::Color(0, 0, 0, 0.4 * 255))); - - c->AddElement(m_button); - } - - void DoDraw(shared_ptr const & p) - { - } -}; - -struct TextViewTest -{ - shared_ptr m_textView; - - void Init(gui::Controller * c) - { - gui::TextView::Params tp; - - tp.m_pivot = m2::PointD(100, 100); - tp.m_depth = graphics::maxDepth; - tp.m_position = graphics::EPosRight; - tp.m_text = "Simplicity is the ultimate"; - - m_textView.reset(new gui::TextView(tp)); - m_textView->setIsVisible(true); - - c->AddElement(m_textView); - } - - void DoDraw(shared_ptr const & p) - { - } -}; - -struct CachedTextViewTest -{ - shared_ptr m_cachedTextView; - - void Init(gui::Controller * c) - { - gui::CachedTextView::Params ctp; - - ctp.m_pivot = m2::PointD(100, 100); - ctp.m_depth = graphics::maxDepth; - ctp.m_position = graphics::EPosAbove; - ctp.m_text = "(123.15, 783.123)"; - - m_cachedTextView.reset(new gui::CachedTextView(ctp)); - m_cachedTextView->setIsVisible(true); - - m_cachedTextView->setFont(gui::Element::EActive, - graphics::FontDesc(20, graphics::Color(255, 0, 0, 255), true)); - - c->AddElement(m_cachedTextView); - } - - void DoDraw(shared_ptr const & p) - { - } -}; - -struct ImageViewTest -{ - shared_ptr m_imageView; - m2::PointD m_pivot; - - void Init(gui::Controller * c) - { - gui::ImageView::Params ip; - - m_pivot = m2::PointD(100, 100); - - ip.m_depth = graphics::maxDepth; - ip.m_pivot = m_pivot; - ip.m_position = graphics::EPosUnder; - - ip.m_image = graphics::Image::Info("arrow.png", graphics::EDensityMDPI); - - m_imageView.reset(new gui::ImageView(ip)); - - c->AddElement(m_imageView); - - m_imageView->setIsVisible(true); - } - - void DoDraw(shared_ptr const & p) - { - m2::RectD r(m_pivot, m_pivot); - - r.Inflate(2, 2); - - p->drawRectangle(r, graphics::Color(255, 0, 0, 255), graphics::maxDepth); - } -}; - -struct CountryStatusDisplayTest -{ - shared_ptr m_countryStatus; - shared_ptr m_framework; - m2::PointD m_pivot; - - void Init(gui::Controller * c) - { - CountryStatusDisplay::Params p(m_framework->GetCountryTree().GetActiveMapLayout()); - - m_pivot = m2::PointD(400, 400); - - m_framework.reset(new Framework()); - - p.m_depth = graphics::maxDepth; - p.m_pivot = m_pivot; - p.m_position = graphics::EPosAboveLeft; - - m_countryStatus.reset(new CountryStatusDisplay(p)); - m_countryStatus->SetCountryIndex(storage::TIndex(1, 1, 1)); - m_countryStatus->setPivot(m_pivot); - c->AddElement(m_countryStatus); - } - - void DoDraw(shared_ptr const & p) - { - } -}; - -//UNIT_TEST_GUI(ButtonTest); -//UNIT_TEST_GUI(TextViewTest); -//UNIT_TEST_GUI(ImageViewTest); -//UNIT_TEST_GUI(CachedTextViewTest); -//UNIT_TEST_GUI(CountryStatusDisplayTest); - diff --git a/gui/gui_tests/gui_tests.pro b/gui/gui_tests/gui_tests.pro deleted file mode 100644 index d2983b1e24..0000000000 --- a/gui/gui_tests/gui_tests.pro +++ /dev/null @@ -1,20 +0,0 @@ -TARGET = gui_tests -CONFIG += console warn_on -CONFIG -= app_bundle -TEMPLATE = app - -ROOT_DIR = ../.. -DEPENDENCIES = qt_tstfrm map gui indexer graphics storage platform geometry coding base \ - expat freetype fribidi protobuf tomcrypt jansson - -include($$ROOT_DIR/common.pri) - -QT *= opengl gui core - -win32*: LIBS *= -lopengl32 -macx-*: LIBS *= "-framework IOKit" - -SOURCES += \ - ../../testing/testingmain.cpp \ - gui_tests.cpp - diff --git a/gui/image_view.cpp b/gui/image_view.cpp deleted file mode 100644 index 6dec9261a9..0000000000 --- a/gui/image_view.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "gui/image_view.hpp" -#include "gui/controller.hpp" - -#include "graphics/screen.hpp" -#include "graphics/display_list.hpp" - -#include "geometry/transformations.hpp" - -#include "base/matrix.hpp" - - -namespace gui -{ - ImageView::Params::Params() - {} - - ImageView::ImageView(Params const & p) - : BaseT(p) - { - m_image = p.m_image; - } - - void ImageView::cache() - { - graphics::Screen * cs = m_controller->GetCacheScreen(); - - m_displayList.reset(); - m_displayList.reset(cs->createDisplayList()); - - cs->beginFrame(); - cs->setDisplayList(m_displayList.get()); - - math::Matrix m = - math::Shift( - math::Identity(), - -(int)m_image.m_size.x / 2, -(int)m_image.m_size.y / 2); - - uint32_t const imageResID = cs->mapInfo(m_image); - cs->drawImage(m, imageResID, depth()); - - cs->setDisplayList(0); - cs->endFrame(); - } - - void ImageView::purge() - { - m_displayList.reset(); - } - - m2::RectD ImageView::GetBoundRect() const - { - m2::PointD const sz(m_image.m_size); - m2::PointD const pt = computeTopLeft(sz, pivot(), position()); - return m2::RectD(pt, pt + sz); - } - - void ImageView::draw(graphics::OverlayRenderer * r, - math::Matrix const & m) const - { - if (isVisible()) - { - checkDirtyLayout(); - - m2::PointD pt = computeTopLeft(m_image.m_size, - pivot() * m, - position()); - - math::Matrix drawM = math::Shift(math::Identity(), - pt.x + m_image.m_size.x / 2, - pt.y + m_image.m_size.y / 2); - - r->drawDisplayList(m_displayList.get(), drawM * m); - } - } - - void ImageView::setImage(graphics::Image::Info const & info) - { - m_image = info; - setIsDirtyLayout(true); - } -} diff --git a/gui/image_view.hpp b/gui/image_view.hpp deleted file mode 100644 index befe761a6c..0000000000 --- a/gui/image_view.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include "gui/element.hpp" - -#include "graphics/image.hpp" - -#include "std/unique_ptr.hpp" - - -namespace graphics -{ - class OverlayRenderer; - class DisplayList; -} - -namespace gui -{ - class ImageView : public Element - { - graphics::Image::Info m_image; - m2::RectU m_margin; - unique_ptr m_displayList; - - public: - typedef Element BaseT; - - struct Params : public BaseT::Params - { - graphics::Image::Info m_image; - Params(); - }; - - ImageView(Params const & p); - - void setImage(graphics::Image::Info const & info); - - /// @name Override from graphics::OverlayElement and gui::Element. - //@{ - virtual m2::RectD GetBoundRect() const; - - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - - void cache(); - void purge(); - //@} - }; -} diff --git a/gui/text_view.cpp b/gui/text_view.cpp deleted file mode 100644 index 534b2d4823..0000000000 --- a/gui/text_view.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include "gui/text_view.hpp" -#include "gui/controller.hpp" - -#include "graphics/display_list.hpp" -#include "graphics/screen.hpp" -#include "graphics/straight_text_element.hpp" - -#include "geometry/transformations.hpp" - - -namespace gui -{ - TextView::TextView(Params const & p) - : Element(p), m_maxWidth(numeric_limits::max()) - { - setText(p.m_text); - - setFont(EActive, graphics::FontDesc(12, graphics::Color(0, 0, 0, 255))); - setFont(EPressed, graphics::FontDesc(12, graphics::Color(0, 0, 0, 255))); - - setColor(EActive, graphics::Color(graphics::Color(192, 192, 192, 255))); - setColor(EPressed, graphics::Color(graphics::Color(64, 64, 64, 255))); - } - - void TextView::setText(string const & text) - { - if (m_text != text) - { - m_text = text; - setIsDirtyLayout(true); - } - } - - string const & TextView::text() const - { - return m_text; - } - - void TextView::layoutBody(EState state) - { - unique_ptr & elem = m_elems[state]; - - graphics::StraightTextElement::Params params; - - params.m_depth = depth(); - params.m_fontDesc = font(state); - params.m_fontDesc.m_size *= visualScale(); - params.m_log2vis = true; - params.m_pivot = m2::PointD(0.0, 0.0); - params.m_position = position(); - params.m_glyphCache = m_controller->GetGlyphCache(); - params.m_logText = strings::MakeUniString(m_text); - params.m_doSplit = true; - params.m_doForceSplit = true; - params.m_delimiters = "\n"; - params.m_useAllParts = true; - params.m_maxPixelWidth = m_maxWidth; - - elem.reset(new graphics::StraightTextElement(params)); - } - - void TextView::layout() - { - layoutBody(EActive); - layoutBody(EPressed); - } - - void TextView::cacheBody(EState state) - { - graphics::Screen * cs = m_controller->GetCacheScreen(); - - unique_ptr & dl = m_dls[state]; - - dl.reset(); - dl.reset(cs->createDisplayList()); - - cs->beginFrame(); - cs->setDisplayList(dl.get()); - - m_elems[state]->draw(cs, math::Identity()); - - cs->setDisplayList(0); - cs->endFrame(); - } - - void TextView::cache() - { - cacheBody(EActive); - cacheBody(EPressed); - } - - void TextView::purge() - { - m_dls.clear(); - } - - void TextView::draw(graphics::OverlayRenderer *r, math::Matrix const & m) const - { - if (isVisible()) - { - checkDirtyLayout(); - - math::Matrix drawM = math::Shift(math::Identity(), - pivot()); - - r->drawDisplayList(m_dls.at(state()).get(), drawM * m); - } - } - - void TextView::GetMiniBoundRects(RectsT & rects) const - { - checkDirtyLayout(); - - m2::PointD const pt = pivot(); - - rects.push_back(m2::AnyRectD(Offset(m_elems.at(EActive)->GetBoundRect(), pt))); - rects.push_back(m2::AnyRectD(Offset(m_elems.at(EPressed)->GetBoundRect(), pt))); - } - - void TextView::setMaxWidth(unsigned width) - { - m_maxWidth = width; - setIsDirtyLayout(true); - } - - bool TextView::onTapStarted(m2::PointD const & pt) - { - return false; - } - - bool TextView::onTapMoved(m2::PointD const & pt) - { - return false; - } - - bool TextView::onTapEnded(m2::PointD const & pt) - { - return false; - } - - bool TextView::onTapCancelled(m2::PointD const & pt) - { - return false; - } -} diff --git a/gui/text_view.hpp b/gui/text_view.hpp deleted file mode 100644 index ea6cf783bd..0000000000 --- a/gui/text_view.hpp +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -#include "gui/element.hpp" - -#include "std/unique_ptr.hpp" - - -namespace graphics -{ - class DisplayList; - class StraightTextElement; -} - -namespace gui -{ - class TextView : public Element - { - map > m_dls; - - typedef map > ElemsMapT; - ElemsMapT m_elems; - - string m_text; - unsigned m_maxWidth; - - void cacheBody(EState state); - void layoutBody(EState state); - - public: - struct Params : public Element::Params - { - string m_text; - }; - - TextView(Params const & p); - - void setText(string const & text); - string const & text() const; - void setMaxWidth(unsigned width); - - /// @name Overrider from graphics::OverlayElement and gui::Element. - //@{ - virtual void GetMiniBoundRects(RectsT & rects) const; - - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - - void cache(); - void purge(); - void layout(); - - bool onTapStarted(m2::PointD const & pt); - bool onTapMoved(m2::PointD const & pt); - bool onTapEnded(m2::PointD const & pt); - bool onTapCancelled(m2::PointD const & pt); - //@} - }; -} diff --git a/indexer/cell_id.hpp b/indexer/cell_id.hpp index d9babb1378..6d9a014366 100644 --- a/indexer/cell_id.hpp +++ b/indexer/cell_id.hpp @@ -68,12 +68,12 @@ public: id2 = id2.Parent(); } #if 0 // DEBUG - CoordT minX, minY, maxX, maxY; + double minX, minY, maxX, maxY; GetCellBounds(id1, minX, minY, maxX, maxY); - ASSERT(minX <= x1 && x1 <= maxX, (x1, y1, x2, y2, id1, minX, minY, maxX, maxY)); - ASSERT(minX <= x2 && x2 <= maxX, (x1, y1, x2, y2, id1, minX, minY, maxX, maxY)); - ASSERT(minY <= y1 && y1 <= maxY, (x1, y1, x2, y2, id1, minX, minY, maxX, maxY)); - ASSERT(minY <= y2 && y2 <= maxY, (x1, y1, x2, y2, id1, minX, minY, maxX, maxY)); + ASSERT(my::between_s(minX, maxX, x1), (x1, minX, maxX)); + ASSERT(my::between_s(minX, maxX, x2), (x2, minX, maxX)); + ASSERT(my::between_s(minY, maxY, y1), (y1, minY, maxY)); + ASSERT(my::between_s(minY, maxY, y2), (y2, minY, maxY)); #endif return id1; } diff --git a/indexer/drules_struct.pb.cc b/indexer/drules_struct.pb.cc index f09838dbee..b89e69ffbf 100644 --- a/indexer/drules_struct.pb.cc +++ b/indexer/drules_struct.pb.cc @@ -1751,6 +1751,7 @@ void AreaRuleProto::Swap(AreaRuleProto* other) { const int SymbolRuleProto::kNameFieldNumber; const int SymbolRuleProto::kApplyForTypeFieldNumber; const int SymbolRuleProto::kPriorityFieldNumber; +const int SymbolRuleProto::kMinDistanceFieldNumber; #endif // !_MSC_VER SymbolRuleProto::SymbolRuleProto() @@ -1775,6 +1776,7 @@ void SymbolRuleProto::SharedCtor() { name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); apply_for_type_ = 0; priority_ = 0; + min_distance_ = 0; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } @@ -1826,8 +1828,8 @@ void SymbolRuleProto::Clear() { ::memset(&first, 0, n); \ } while (0) - if (_has_bits_[0 / 32] & 7) { - ZR_(apply_for_type_, priority_); + if (_has_bits_[0 / 32] & 15) { + ZR_(apply_for_type_, min_distance_); if (has_name()) { if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { name_->clear(); @@ -1894,6 +1896,21 @@ bool SymbolRuleProto::MergePartialFromCodedStream( } else { goto handle_unusual; } + if (input->ExpectTag(32)) goto parse_min_distance; + break; + } + + // optional int32 min_distance = 4; + case 4: { + if (tag == 32) { + parse_min_distance: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &min_distance_))); + set_has_min_distance(); + } else { + goto handle_unusual; + } if (input->ExpectAtEnd()) goto success; break; } @@ -1939,6 +1956,11 @@ void SymbolRuleProto::SerializeWithCachedSizes( ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->priority(), output); } + // optional int32 min_distance = 4; + if (has_min_distance()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(4, this->min_distance(), output); + } + output->WriteRaw(unknown_fields().data(), unknown_fields().size()); // @@protoc_insertion_point(serialize_end:SymbolRuleProto) @@ -1969,6 +1991,13 @@ int SymbolRuleProto::ByteSize() const { this->priority()); } + // optional int32 min_distance = 4; + if (has_min_distance()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->min_distance()); + } + } total_size += unknown_fields().size(); @@ -1995,6 +2024,9 @@ void SymbolRuleProto::MergeFrom(const SymbolRuleProto& from) { if (from.has_priority()) { set_priority(from.priority()); } + if (from.has_min_distance()) { + set_min_distance(from.min_distance()); + } } mutable_unknown_fields()->append(from.unknown_fields()); } @@ -2016,6 +2048,7 @@ void SymbolRuleProto::Swap(SymbolRuleProto* other) { std::swap(name_, other->name_); std::swap(apply_for_type_, other->apply_for_type_); std::swap(priority_, other->priority_); + std::swap(min_distance_, other->min_distance_); std::swap(_has_bits_[0], other->_has_bits_[0]); _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); @@ -2036,6 +2069,7 @@ const int CaptionDefProto::kStrokeColorFieldNumber; const int CaptionDefProto::kOffsetXFieldNumber; const int CaptionDefProto::kOffsetYFieldNumber; const int CaptionDefProto::kTextFieldNumber; +const int CaptionDefProto::kIsOptionalFieldNumber; #endif // !_MSC_VER CaptionDefProto::CaptionDefProto() @@ -2063,6 +2097,7 @@ void CaptionDefProto::SharedCtor() { offset_x_ = 0; offset_y_ = 0; text_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + is_optional_ = false; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } @@ -2114,9 +2149,9 @@ void CaptionDefProto::Clear() { ::memset(&first, 0, n); \ } while (0) - if (_has_bits_[0 / 32] & 63) { + if (_has_bits_[0 / 32] & 127) { ZR_(height_, offset_x_); - offset_y_ = 0; + ZR_(offset_y_, is_optional_); if (has_text()) { if (text_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { text_->clear(); @@ -2228,6 +2263,21 @@ bool CaptionDefProto::MergePartialFromCodedStream( } else { goto handle_unusual; } + if (input->ExpectTag(56)) goto parse_is_optional; + break; + } + + // optional bool is_optional = 7; + case 7: { + if (tag == 56) { + parse_is_optional: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &is_optional_))); + set_has_is_optional(); + } else { + goto handle_unusual; + } if (input->ExpectAtEnd()) goto success; break; } @@ -2288,6 +2338,11 @@ void CaptionDefProto::SerializeWithCachedSizes( 6, this->text(), output); } + // optional bool is_optional = 7; + if (has_is_optional()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(7, this->is_optional(), output); + } + output->WriteRaw(unknown_fields().data(), unknown_fields().size()); // @@protoc_insertion_point(serialize_end:CaptionDefProto) @@ -2339,6 +2394,11 @@ int CaptionDefProto::ByteSize() const { this->text()); } + // optional bool is_optional = 7; + if (has_is_optional()) { + total_size += 1 + 1; + } + } total_size += unknown_fields().size(); @@ -2374,6 +2434,9 @@ void CaptionDefProto::MergeFrom(const CaptionDefProto& from) { if (from.has_text()) { set_text(from.text()); } + if (from.has_is_optional()) { + set_is_optional(from.is_optional()); + } } mutable_unknown_fields()->append(from.unknown_fields()); } @@ -2398,6 +2461,7 @@ void CaptionDefProto::Swap(CaptionDefProto* other) { std::swap(offset_x_, other->offset_x_); std::swap(offset_y_, other->offset_y_); std::swap(text_, other->text_); + std::swap(is_optional_, other->is_optional_); std::swap(_has_bits_[0], other->_has_bits_[0]); _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); @@ -3302,6 +3366,7 @@ const int ShieldRuleProto::kHeightFieldNumber; const int ShieldRuleProto::kColorFieldNumber; const int ShieldRuleProto::kStrokeColorFieldNumber; const int ShieldRuleProto::kPriorityFieldNumber; +const int ShieldRuleProto::kMinDistanceFieldNumber; #endif // !_MSC_VER ShieldRuleProto::ShieldRuleProto() @@ -3326,6 +3391,7 @@ void ShieldRuleProto::SharedCtor() { color_ = 0u; stroke_color_ = 0u; priority_ = 0; + min_distance_ = 0; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } @@ -3374,7 +3440,9 @@ void ShieldRuleProto::Clear() { ::memset(&first, 0, n); \ } while (0) - ZR_(height_, priority_); + if (_has_bits_[0 / 32] & 31) { + ZR_(height_, min_distance_); + } #undef OFFSET_OF_FIELD_ #undef ZR_ @@ -3452,6 +3520,21 @@ bool ShieldRuleProto::MergePartialFromCodedStream( } else { goto handle_unusual; } + if (input->ExpectTag(40)) goto parse_min_distance; + break; + } + + // optional int32 min_distance = 5; + case 5: { + if (tag == 40) { + parse_min_distance: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &min_distance_))); + set_has_min_distance(); + } else { + goto handle_unusual; + } if (input->ExpectAtEnd()) goto success; break; } @@ -3501,6 +3584,11 @@ void ShieldRuleProto::SerializeWithCachedSizes( ::google::protobuf::internal::WireFormatLite::WriteInt32(4, this->priority(), output); } + // optional int32 min_distance = 5; + if (has_min_distance()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(5, this->min_distance(), output); + } + output->WriteRaw(unknown_fields().data(), unknown_fields().size()); // @@protoc_insertion_point(serialize_end:ShieldRuleProto) @@ -3538,6 +3626,13 @@ int ShieldRuleProto::ByteSize() const { this->priority()); } + // optional int32 min_distance = 5; + if (has_min_distance()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->min_distance()); + } + } total_size += unknown_fields().size(); @@ -3567,6 +3662,9 @@ void ShieldRuleProto::MergeFrom(const ShieldRuleProto& from) { if (from.has_priority()) { set_priority(from.priority()); } + if (from.has_min_distance()) { + set_min_distance(from.min_distance()); + } } mutable_unknown_fields()->append(from.unknown_fields()); } @@ -3589,6 +3687,7 @@ void ShieldRuleProto::Swap(ShieldRuleProto* other) { std::swap(color_, other->color_); std::swap(stroke_color_, other->stroke_color_); std::swap(priority_, other->priority_); + std::swap(min_distance_, other->min_distance_); std::swap(_has_bits_[0], other->_has_bits_[0]); _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); diff --git a/indexer/drules_struct.pb.h b/indexer/drules_struct.pb.h index e1fd153ea9..509ae69ce1 100644 --- a/indexer/drules_struct.pb.h +++ b/indexer/drules_struct.pb.h @@ -787,6 +787,13 @@ class SymbolRuleProto : public ::google::protobuf::MessageLite { inline ::google::protobuf::int32 priority() const; inline void set_priority(::google::protobuf::int32 value); + // optional int32 min_distance = 4; + inline bool has_min_distance() const; + inline void clear_min_distance(); + static const int kMinDistanceFieldNumber = 4; + inline ::google::protobuf::int32 min_distance() const; + inline void set_min_distance(::google::protobuf::int32 value); + // @@protoc_insertion_point(class_scope:SymbolRuleProto) private: inline void set_has_name(); @@ -795,6 +802,8 @@ class SymbolRuleProto : public ::google::protobuf::MessageLite { inline void clear_has_apply_for_type(); inline void set_has_priority(); inline void clear_has_priority(); + inline void set_has_min_distance(); + inline void clear_has_min_distance(); ::std::string _unknown_fields_; @@ -803,6 +812,7 @@ class SymbolRuleProto : public ::google::protobuf::MessageLite { ::std::string* name_; ::google::protobuf::int32 apply_for_type_; ::google::protobuf::int32 priority_; + ::google::protobuf::int32 min_distance_; #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER friend void protobuf_AddDesc_drules_5fstruct_2eproto_impl(); #else @@ -924,6 +934,13 @@ class CaptionDefProto : public ::google::protobuf::MessageLite { inline ::std::string* release_text(); inline void set_allocated_text(::std::string* text); + // optional bool is_optional = 7; + inline bool has_is_optional() const; + inline void clear_is_optional(); + static const int kIsOptionalFieldNumber = 7; + inline bool is_optional() const; + inline void set_is_optional(bool value); + // @@protoc_insertion_point(class_scope:CaptionDefProto) private: inline void set_has_height(); @@ -938,6 +955,8 @@ class CaptionDefProto : public ::google::protobuf::MessageLite { inline void clear_has_offset_y(); inline void set_has_text(); inline void clear_has_text(); + inline void set_has_is_optional(); + inline void clear_has_is_optional(); ::std::string _unknown_fields_; @@ -949,6 +968,7 @@ class CaptionDefProto : public ::google::protobuf::MessageLite { ::google::protobuf::int32 offset_x_; ::std::string* text_; ::google::protobuf::int32 offset_y_; + bool is_optional_; #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER friend void protobuf_AddDesc_drules_5fstruct_2eproto_impl(); #else @@ -1404,6 +1424,13 @@ class ShieldRuleProto : public ::google::protobuf::MessageLite { inline ::google::protobuf::int32 priority() const; inline void set_priority(::google::protobuf::int32 value); + // optional int32 min_distance = 5; + inline bool has_min_distance() const; + inline void clear_min_distance(); + static const int kMinDistanceFieldNumber = 5; + inline ::google::protobuf::int32 min_distance() const; + inline void set_min_distance(::google::protobuf::int32 value); + // @@protoc_insertion_point(class_scope:ShieldRuleProto) private: inline void set_has_height(); @@ -1414,6 +1441,8 @@ class ShieldRuleProto : public ::google::protobuf::MessageLite { inline void clear_has_stroke_color(); inline void set_has_priority(); inline void clear_has_priority(); + inline void set_has_min_distance(); + inline void clear_has_min_distance(); ::std::string _unknown_fields_; @@ -1423,6 +1452,7 @@ class ShieldRuleProto : public ::google::protobuf::MessageLite { ::google::protobuf::uint32 color_; ::google::protobuf::uint32 stroke_color_; ::google::protobuf::int32 priority_; + ::google::protobuf::int32 min_distance_; #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER friend void protobuf_AddDesc_drules_5fstruct_2eproto_impl(); #else @@ -2652,6 +2682,30 @@ inline void SymbolRuleProto::set_priority(::google::protobuf::int32 value) { // @@protoc_insertion_point(field_set:SymbolRuleProto.priority) } +// optional int32 min_distance = 4; +inline bool SymbolRuleProto::has_min_distance() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void SymbolRuleProto::set_has_min_distance() { + _has_bits_[0] |= 0x00000008u; +} +inline void SymbolRuleProto::clear_has_min_distance() { + _has_bits_[0] &= ~0x00000008u; +} +inline void SymbolRuleProto::clear_min_distance() { + min_distance_ = 0; + clear_has_min_distance(); +} +inline ::google::protobuf::int32 SymbolRuleProto::min_distance() const { + // @@protoc_insertion_point(field_get:SymbolRuleProto.min_distance) + return min_distance_; +} +inline void SymbolRuleProto::set_min_distance(::google::protobuf::int32 value) { + set_has_min_distance(); + min_distance_ = value; + // @@protoc_insertion_point(field_set:SymbolRuleProto.min_distance) +} + // ------------------------------------------------------------------- // CaptionDefProto @@ -2852,6 +2906,30 @@ inline void CaptionDefProto::set_allocated_text(::std::string* text) { // @@protoc_insertion_point(field_set_allocated:CaptionDefProto.text) } +// optional bool is_optional = 7; +inline bool CaptionDefProto::has_is_optional() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void CaptionDefProto::set_has_is_optional() { + _has_bits_[0] |= 0x00000040u; +} +inline void CaptionDefProto::clear_has_is_optional() { + _has_bits_[0] &= ~0x00000040u; +} +inline void CaptionDefProto::clear_is_optional() { + is_optional_ = false; + clear_has_is_optional(); +} +inline bool CaptionDefProto::is_optional() const { + // @@protoc_insertion_point(field_get:CaptionDefProto.is_optional) + return is_optional_; +} +inline void CaptionDefProto::set_is_optional(bool value) { + set_has_is_optional(); + is_optional_ = value; + // @@protoc_insertion_point(field_set:CaptionDefProto.is_optional) +} + // ------------------------------------------------------------------- // CaptionRuleProto @@ -3309,6 +3387,30 @@ inline void ShieldRuleProto::set_priority(::google::protobuf::int32 value) { // @@protoc_insertion_point(field_set:ShieldRuleProto.priority) } +// optional int32 min_distance = 5; +inline bool ShieldRuleProto::has_min_distance() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ShieldRuleProto::set_has_min_distance() { + _has_bits_[0] |= 0x00000010u; +} +inline void ShieldRuleProto::clear_has_min_distance() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ShieldRuleProto::clear_min_distance() { + min_distance_ = 0; + clear_has_min_distance(); +} +inline ::google::protobuf::int32 ShieldRuleProto::min_distance() const { + // @@protoc_insertion_point(field_get:ShieldRuleProto.min_distance) + return min_distance_; +} +inline void ShieldRuleProto::set_min_distance(::google::protobuf::int32 value) { + set_has_min_distance(); + min_distance_ = value; + // @@protoc_insertion_point(field_set:ShieldRuleProto.min_distance) +} + // ------------------------------------------------------------------- // DrawElementProto diff --git a/indexer/drules_struct.proto b/indexer/drules_struct.proto index 887f29be65..2b1eb35733 100644 --- a/indexer/drules_struct.proto +++ b/indexer/drules_struct.proto @@ -60,6 +60,7 @@ message SymbolRuleProto required string name = 1; optional int32 apply_for_type = 2; // 1 - for nodes, 2 - for ways, default - for all required int32 priority = 3; + optional int32 min_distance = 4; } message CaptionDefProto @@ -70,6 +71,7 @@ message CaptionDefProto optional int32 offset_x = 4; optional int32 offset_y = 5; optional string text = 6; + optional bool is_optional = 7; } message CaptionRuleProto @@ -100,6 +102,7 @@ message ShieldRuleProto required uint32 color = 2; optional uint32 stroke_color = 3; required int32 priority = 4; + optional int32 min_distance = 5; } message DrawElementProto diff --git a/indexer/feature.cpp b/indexer/feature.cpp index d46961bdf0..899e751f34 100644 --- a/indexer/feature.cpp +++ b/indexer/feature.cpp @@ -8,7 +8,7 @@ #include "platform/preferred_languages.hpp" -#include "../defines.hpp" // just for file extensions +#include "defines.hpp" // just for file extensions using namespace feature; diff --git a/indexer/feature_covering.cpp b/indexer/feature_covering.cpp index e153818b4f..4503e1de88 100644 --- a/indexer/feature_covering.cpp +++ b/indexer/feature_covering.cpp @@ -206,8 +206,9 @@ void CoverViewportAndAppendLowerLevels(m2::RectD const & r, int cellDepth, Inter RectId GetRectIdAsIs(m2::RectD const & r) { double const eps = MercatorBounds::GetCellID2PointAbsEpsilon(); + using TConverter = CellIdConverter; - return CellIdConverter::Cover2PointsWithCell( + return TConverter::Cover2PointsWithCell( MercatorBounds::ClampX(r.minX() + eps), MercatorBounds::ClampY(r.minY() + eps), MercatorBounds::ClampX(r.maxX() - eps), @@ -241,6 +242,16 @@ IntervalsT const & CoveringGetter::Get(int scale) while (id.Level() >= cellDepth) id = id.Parent(); AppendLowerLevels(id, cellDepth, m_res[ind]); + + // Check for optimal result intervals. +#if 0 + size_t oldSize = m_res[ind].size(); + IntervalsT res; + SortAndMergeIntervals(m_res[ind], res); + if (res.size() != oldSize) + LOG(LINFO, ("Old =", oldSize, "; New =", res.size())); + res.swap(m_res[ind]); +#endif break; } diff --git a/indexer/index.hpp b/indexer/index.hpp index 02ab500383..dafe1bca85 100644 --- a/indexer/index.hpp +++ b/indexer/index.hpp @@ -255,6 +255,15 @@ private: ASSERT_LESS(index, features.size(), ()); size_t result = index; MwmId id = features[index].m_mwmId; + + if (!id.IsAlive()) + { + while (features[result].m_mwmId == id) + ++result; + + return result; + } + MwmHandle const handle = GetMwmHandleById(id); MwmValue const * pValue = handle.GetValue(); if (pValue) diff --git a/indexer/indexer_tests/search_string_utils_test.cpp b/indexer/indexer_tests/search_string_utils_test.cpp index 10d92a9c59..b4cf3eecb1 100644 --- a/indexer/indexer_tests/search_string_utils_test.cpp +++ b/indexer/indexer_tests/search_string_utils_test.cpp @@ -1,7 +1,7 @@ -#include "../../testing/testing.hpp" -#include "../search_string_utils.hpp" +#include "testing/testing.hpp" +#include "indexer/search_string_utils.hpp" -#include "../../base/string_utils.hpp" +#include "base/string_utils.hpp" UNIT_TEST(FeatureTypeToString) { diff --git a/indexer/indexer_tests/test_polylines.hpp b/indexer/indexer_tests/test_polylines.hpp index 12e80f4fe2..77171d2a5a 100644 --- a/indexer/indexer_tests/test_polylines.hpp +++ b/indexer/indexer_tests/test_polylines.hpp @@ -1,6 +1,6 @@ #pragma once -#include "../../geometry/point2d.hpp" +#include "geometry/point2d.hpp" namespace index_test { diff --git a/indexer/search_index_builder.cpp b/indexer/search_index_builder.cpp index 0048ad9108..6ac289ce5a 100644 --- a/indexer/search_index_builder.cpp +++ b/indexer/search_index_builder.cpp @@ -12,7 +12,7 @@ #include "indexer/string_file.hpp" #include "indexer/string_file_values.hpp" -#include "../search/search_common.hpp" // for MAX_TOKENS constant +#include "search/search_common.hpp" // for MAX_TOKENS constant #include "defines.hpp" diff --git a/iphone/Maps/Bookmarks/BookmarksRootVC.mm b/iphone/Maps/Bookmarks/BookmarksRootVC.mm index 0db727b339..25860761d9 100644 --- a/iphone/Maps/Bookmarks/BookmarksRootVC.mm +++ b/iphone/Maps/Bookmarks/BookmarksRootVC.mm @@ -92,7 +92,10 @@ [[Statistics instance] logEvent:kStatEventName(kStatBookmarks, kStatToggleVisibility) withParameters:@{kStatValue : visible ? kStatVisible : kStatHidden}]; cell.imageView.image = [UIImage imageNamed:(visible ? @"ic_show_light" : @"ic_hide_light")]; - cat->SetVisible(visible); + { + BookmarkCategory::Guard guard(*cat); + guard.m_controller.SetIsVisible(visible); + } cat->SaveToKMLFile(); } } @@ -119,7 +122,7 @@ NSString * title = @(cat->GetName().c_str()); cell.textLabel.text = [self truncateString:title toWidth:(self.tableView.width - 122) withFont:cell.textLabel.font]; cell.imageView.image = [UIImage imageNamed:(cat->IsVisible() ? @"ic_show_light" : @"ic_hide_light")]; - cell.detailTextLabel.text = [NSString stringWithFormat:@"%ld", cat->GetBookmarksCount() + cat->GetTracksCount()]; + cell.detailTextLabel.text = [NSString stringWithFormat:@"%ld", cat->GetUserMarkCount() + cat->GetTracksCount()]; } return cell; } diff --git a/iphone/Maps/Bookmarks/BookmarksVC.mm b/iphone/Maps/Bookmarks/BookmarksVC.mm index a7c1f68340..2bc8216e19 100644 --- a/iphone/Maps/Bookmarks/BookmarksVC.mm +++ b/iphone/Maps/Bookmarks/BookmarksVC.mm @@ -67,7 +67,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi else if (section == m_trackSection) return GetFramework().GetBmCategory(m_categoryIndex)->GetTracksCount(); else if (section == m_bookmarkSection) - return GetFramework().GetBmCategory(m_categoryIndex)->GetBookmarksCount(); + return GetFramework().GetBmCategory(m_categoryIndex)->GetUserMarkCount(); else if (section == m_shareSection) return 1; else @@ -79,7 +79,10 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi [[Statistics instance] logEvent:kStatEventName(kStatBookmarks, kStatToggleVisibility) withParameters:@{kStatValue : sender.on ? kStatVisible : kStatHidden}]; BookmarkCategory * cat = GetFramework().GetBmCategory(m_categoryIndex); - cat->SetVisible(sender.on); + { + BookmarkCategory::Guard guard(*cat); + guard.m_controller.SetIsVisible(sender.on); + } cat->SaveToKMLFile(); } @@ -166,8 +169,9 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %@", L(@"length"), [NSString stringWithUTF8String:dist.c_str()]]; else cell.detailTextLabel.text = nil; - const graphics::Color c = tr->GetMainColor(); - cell.imageView.image = [CircleView createCircleImageWith:PINDIAMETER andColor:[UIColor colorWithRed:c.r/255.f green:c.g/255.f blue:c.b/255.f alpha:1.f]]; + const dp::Color c = tr->GetColor(0); + cell.imageView.image = [CircleView createCircleImageWith:PINDIAMETER andColor:[UIColor colorWithRed:c.GetRed()/255.f green:c.GetGreen()/255.f + blue:c.GetBlue()/255.f alpha:1.f]]; } // Contains bookmarks list else if (indexPath.section == m_bookmarkSection) @@ -175,7 +179,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi BookmarkCell * bmCell = (BookmarkCell *)[tableView dequeueReusableCellWithIdentifier:@"BookmarksVCBookmarkItemCell"]; if (!bmCell) bmCell = [[BookmarkCell alloc] initWithReuseIdentifier:@"BookmarksVCBookmarkItemCell"]; - Bookmark const * bm = cat->GetBookmark(indexPath.row); + Bookmark const * bm = static_cast(cat->GetUserMark(indexPath.row)); if (bm) { bmCell.bmName.text = @(bm->GetName().c_str()); @@ -191,7 +195,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi [m_locationManager getNorthRad:north]; string distance; - fr.GetDistanceAndAzimut(bm->GetOrg(), lat, lon, north, distance, azimut); + fr.GetDistanceAndAzimut(bm->GetPivot(), lat, lon, north, distance, azimut); bmCell.bmDistance.text = @(distance.c_str()); } @@ -251,7 +255,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi { if (cat) { - Bookmark const * bm = cat->GetBookmark(indexPath.row); + Bookmark const * bm = static_cast(cat->GetUserMark(indexPath.row)); ASSERT(bm, ("NULL bookmark")); if (bm) { @@ -320,7 +324,8 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi BookmarkAndCategory bookmarkAndCategory = BookmarkAndCategory(m_categoryIndex, indexPath.row); NSValue * value = [NSValue valueWithBytes:&bookmarkAndCategory objCType:@encode(BookmarkAndCategory)]; [[NSNotificationCenter defaultCenter] postNotificationName:BOOKMARK_DELETED_NOTIFICATION object:value]; - cat->DeleteBookmark(indexPath.row); + BookmarkCategory::Guard guard(*cat); + guard.m_controller.DeleteUserMark(indexPath.row); [NSNotificationCenter.defaultCenter postNotificationName:kBookmarksChangedNotification object:nil userInfo:nil]; @@ -334,7 +339,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; else [self.tableView reloadData]; - if (cat->GetBookmarksCount() + cat->GetTracksCount() == 0) + if (cat->GetUserMarkCount() + cat->GetTracksCount() == 0) { self.navigationItem.rightBarButtonItem = nil; [self setEditing:NO animated:YES]; @@ -359,10 +364,10 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi NSIndexPath * indexPath = [table indexPathForCell:cell]; if (indexPath.section == m_bookmarkSection) { - Bookmark const * bm = cat->GetBookmark(indexPath.row); + Bookmark const * bm = static_cast(cat->GetUserMark(indexPath.row)); if (bm) { - m2::PointD const center = bm->GetOrg(); + m2::PointD const center = bm->GetPivot(); double const metres = ms::DistanceOnEarth(info.m_latitude, info.m_longitude, MercatorBounds::YToLat(center.y), MercatorBounds::XToLon(center.x)); cell.bmDistance.text = [LocationManager formattedDistance:metres]; @@ -388,7 +393,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi // Display Edit button only if table is not empty BookmarkCategory * cat = GetFramework().GetBmCategory(m_categoryIndex); - if (cat && (cat->GetBookmarksCount() + cat->GetTracksCount())) + if (cat && (cat->GetUserMarkCount() + cat->GetTracksCount())) self.navigationItem.rightBarButtonItem = self.editButtonItem; else self.navigationItem.rightBarButtonItem = nil; @@ -450,7 +455,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi m_trackSection = index++; else m_trackSection = EMPTY_SECTION; - if (cat->GetBookmarksCount()) + if (cat->GetUserMarkCount()) m_bookmarkSection = index++; else m_bookmarkSection = EMPTY_SECTION; diff --git a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.mm b/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.mm index 79ae1ddad8..023910452d 100644 --- a/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.mm +++ b/iphone/Maps/Classes/CustomAlert/DefaultAlert/MWMDefaultAlert.mm @@ -98,7 +98,7 @@ static NSString * const kDefaultAlertNibName = @"MWMDefaultAlert"; kStatisticsEvent = @"Disabled Location Alert"; RightButtonAction action = ^ { - GetFramework().GetLocationState()->SwitchToNextMode(); + GetFramework().SwitchMyPositionNextMode(); }; return [MWMDefaultAlert defaultAlertWithTitle:@"dialog_routing_location_turn_on" message:@"dialog_routing_location_unknown_turn_on" rightButtonTitle:@"turn_on" leftButtonTitle:@"later" rightButtonAction:action]; } diff --git a/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.xib b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.xib index 6f6503e292..cef6c92c7b 100644 --- a/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.xib +++ b/iphone/Maps/Classes/CustomAlert/RateAlert/MWMRateAlert.xib @@ -1,5 +1,5 @@ - + diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/APIBar/MWMAPIBar.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/APIBar/MWMAPIBar.mm index 3820836faf..a4dccde010 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/APIBar/MWMAPIBar.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/APIBar/MWMAPIBar.mm @@ -53,12 +53,10 @@ static NSString * const kKeyPath = @"subviews"; - (IBAction)back { [[Statistics instance] logEvent:kStatEventName(kStatAPI, kStatBack)]; - auto & f = GetFramework(); - auto & bm = f.GetBalloonManager(); - bm.RemovePin(); - bm.Dismiss(); - f.GetBookmarkManager().UserMarksClear(UserMarkContainer::API_MARK); - f.Invalidate(); + Framework & f = GetFramework(); + f.ActivateUserMark(nullptr, true); + UserMarkControllerGuard guard(f.GetBookmarkManager(), UserMarkType::API_MARK); + guard.m_controller.Clear(); self.isVisible = NO; NSURL * url = [NSURL URLWithString:@(f.GetApiDataHolder().GetGlobalBackUrl().c_str())]; [[UIApplication sharedApplication] openURL:url]; diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuView.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuView.mm index 89f1c583bf..d641849b02 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuView.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuView.mm @@ -1,5 +1,6 @@ #import "Common.h" #import "MapsAppDelegate.h" +#import "EAGLView.h" #import "MWMBottomMenuView.h" #import "UIButton+RuntimeAttributes.h" #import "UIColor+MapsMeColor.h" @@ -69,7 +70,7 @@ } [UIView animateWithDuration:kDefaultAnimationDuration animations:^{ [self updateAlphaAndColor]; } completion:^(BOOL finished) { [self updateVisibility]; }]; - [self layoutWidgets]; + ((EAGLView *)self.superview).widgetsManager.bottomBound = self.mainButtons.height; [super layoutSubviews]; } @@ -171,17 +172,6 @@ } } -- (void)layoutWidgets -{ - UIView * superView = self.superview; - CGFloat const contentScaleFactor = superView.contentScaleFactor; - m2::PointD const pivot(superView.width * contentScaleFactor - 36.0, - (superView.height - self.mainButtons.height) * contentScaleFactor - 24.0); - auto & infoDisplay = GetFramework().GetInformationDisplay(); - infoDisplay.SetWidgetPivot(InformationDisplay::WidgetType::Ruler, pivot); - infoDisplay.SetWidgetPivot(InformationDisplay::WidgetType::CopyrightLabel, pivot); -} - - (void)layoutGeometry { switch (self.state) diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.h b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.h index e52c0819db..5e9bad036e 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.h +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.h @@ -1,6 +1,8 @@ #import "MWMBottomMenuView.h" +#include "platform/location.hpp" + @class MapViewController; @protocol MWMBottomMenuControllerProtocol @@ -28,4 +30,6 @@ - (void)refreshLayout; +- (void)onLocationStateModeChanged:(location::EMyPositionMode)state; + @end diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm index 01314ff151..f7a8e75208 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/BottomMenu/MWMBottomMenuViewController.mm @@ -1,4 +1,5 @@ #import "Common.h" +#import "EAGLView.h" #import "MapsAppDelegate.h" #import "MapViewController.h" #import "MWMActivityViewController.h" @@ -52,10 +53,6 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) @property (nonatomic) MWMBottomMenuState restoreState; -@property (nonatomic) int locationListenerSlot; - -@property (nonatomic) location::State::Mode locationState; - @property (nonatomic, readonly) NSUInteger additionalButtonsCount; @end @@ -104,20 +101,15 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) { [super viewWillAppear:animated]; [self refreshLayout]; - - [self configLocationListener]; - [self onLocationStateModeChanged:GetFramework().GetLocationState()->GetMode()]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - GetFramework().GetLocationState()->RemoveStateModeListener(self.locationListenerSlot); } - (void)onEnterForeground { - [self onLocationStateModeChanged:GetFramework().GetLocationState()->GetMode()]; } #pragma mark - Refresh Collection View layout @@ -175,30 +167,18 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) #pragma mark - Location button -- (void)configLocationListener +- (void)onLocationStateModeChanged:(location::EMyPositionMode)state { - typedef void (*LocationStateModeFnT)(id, SEL, location::State::Mode); - SEL locationStateModeSelector = @selector(onLocationStateModeChanged:); - LocationStateModeFnT locationStateModeFn = - (LocationStateModeFnT)[self methodForSelector:locationStateModeSelector]; - - self.locationListenerSlot = GetFramework().GetLocationState()->AddStateModeListener( - bind(locationStateModeFn, self, locationStateModeSelector, _1)); -} - -- (void)onLocationStateModeChanged:(location::State::Mode)state -{ - self.locationState = state; UIButton * locBtn = self.locationButton; [locBtn.imageView stopAnimating]; [locBtn.imageView.layer removeAllAnimations]; switch (state) { - case location::State::Mode::UnknownPosition: - case location::State::Mode::NotFollow: - case location::State::Mode::Follow: + case location::MODE_UNKNOWN_POSITION: + case location::MODE_NOT_FOLLOW: + case location::MODE_FOLLOW: break; - case location::State::Mode::PendingPosition: + case location::MODE_PENDING_POSITION: { [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_pending"] forState:UIControlStateNormal]; @@ -211,7 +191,7 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) [locBtn.imageView.layer addAnimation:rotation forKey:@"locationImage"]; break; } - case location::State::Mode::RotateAndFollow: + case location::MODE_ROTATE_AND_FOLLOW: { NSUInteger const morphImagesCount = 6; NSUInteger const endValue = morphImagesCount + 1; @@ -225,34 +205,34 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) break; } } - [self refreshLocationButtonState]; + [self refreshLocationButtonState: state]; } -- (void)refreshLocationButtonState +- (void)refreshLocationButtonState:(location::EMyPositionMode)state { dispatch_async(dispatch_get_main_queue(), ^ { if (self.locationButton.imageView.isAnimating) { - [self refreshLocationButtonState]; + [self refreshLocationButtonState: state]; } else { UIButton * locBtn = self.locationButton; - switch (self.locationState) + switch (state) { - case location::State::Mode::PendingPosition: + case location::MODE_PENDING_POSITION: break; - case location::State::Mode::UnknownPosition: + case location::MODE_UNKNOWN_POSITION: [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_off_mode_light"] forState:UIControlStateNormal]; break; - case location::State::Mode::NotFollow: + case location::MODE_NOT_FOLLOW: [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_get_position"] forState:UIControlStateNormal]; break; - case location::State::Mode::Follow: + case location::MODE_FOLLOW: [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_follow"] forState:UIControlStateNormal]; break; - case location::State::Mode::RotateAndFollow: + case location::MODE_ROTATE_AND_FOLLOW: [locBtn setImage:[UIImage imageNamed:@"ic_menu_location_follow_and_rotate"] forState:UIControlStateNormal]; break; } @@ -411,7 +391,7 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) - (IBAction)locationButtonTouchUpInside:(UIButton *)sender { [[Statistics instance] logEvent:kStatMenu withParameters:@{kStatButton : kStatLocation}]; - GetFramework().GetLocationState()->SwitchToNextMode(); + GetFramework().SwitchMyPositionNextMode(); } - (IBAction)point2PointButtonTouchUpInside:(UIButton *)sender @@ -554,6 +534,7 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) - (void)setLeftBound:(CGFloat)leftBound { ((MWMBottomMenuView *)self.view).leftBound = leftBound; + ((EAGLView *)self.controller.view).widgetsManager.leftBound = leftBound; } - (CGFloat)leftBound diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.h b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.h index 72625f9e18..48e64ac543 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.h +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.h @@ -14,6 +14,7 @@ @property (nonatomic) MWMBottomMenuState menuState; @property (nonatomic, readonly) MWMNavigationDashboardState navigationState; @property (nonatomic) BOOL searchHidden; +@property (nonatomic) location::EMyPositionMode myPositionMode; - (instancetype)init __attribute__((unavailable("init is not available"))); - (instancetype)initWithParentController:(MapViewController *)controller; diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm index b8d9761920..95cd491adc 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm @@ -1,5 +1,6 @@ #import "Common.h" #import "CountryTreeVC.h" +#import "EAGLView.h" #import "MapsAppDelegate.h" #import "MapViewController.h" #import "MWMAlertViewController.h" @@ -44,6 +45,12 @@ extern NSString * const kAlohalyticsTapEventKey; @implementation MWMMapViewControlsManager +- (void)setMyPositionMode:(location::EMyPositionMode)mode +{ + _myPositionMode = mode; + [self.menuController onLocationStateModeChanged:mode]; +} + - (instancetype)initWithParentController:(MapViewController *)controller { if (!controller) @@ -423,10 +430,10 @@ extern NSString * const kAlohalyticsTapEventKey; { MWMAlertViewController * controller = [[MWMAlertViewController alloc] initWithViewController:self.ownerController]; LocationManager * manager = MapsAppDelegate.theApp.m_locationManager; - auto const m = GetFramework().GetLocationState()->GetMode(); + auto const m = self.myPositionMode; BOOL const needToRebuild = manager.lastLocationIsValid && - m != location::State::Mode::PendingPosition && - m != location::State::Mode::UnknownPosition && + m != location::MODE_PENDING_POSITION && + m != location::MODE_UNKNOWN_POSITION && !isDestinationMyPosition; [controller presentPoint2PointAlertWithOkBlock:^ { @@ -467,6 +474,7 @@ extern NSString * const kAlohalyticsTapEventKey; GetFramework().SetRouteStartPoint(self.routeSource.Point(), self.routeSource != MWMRoutePoint::MWMRoutePointZero()); + GetFramework().SetRouteFinishPoint(self.routeDestination.Point(), self.routeDestination != MWMRoutePoint::MWMRoutePointZero()); } @@ -559,7 +567,8 @@ extern NSString * const kAlohalyticsTapEventKey; _hidden = hidden; self.zoomHidden = _zoomHidden; self.menuState = _menuState; - GetFramework().SetFullScreenMode(hidden); + EAGLView * glView = (EAGLView *)self.ownerController.view; + glView.widgetsManager.fullScreen = hidden; } - (void)setZoomHidden:(BOOL)zoomHidden diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm index a93032534b..041fd614d2 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/Search/MWMSearchManager.mm @@ -286,9 +286,7 @@ extern NSString * const kSearchStateKey = @"SearchStateKey"; UITextField * textField = self.searchTextField; f.SaveSearchQuery(make_pair(textField.textInputMode.primaryLanguage.UTF8String, textField.text.precomposedStringWithCompatibilityMapping.UTF8String)); - PinClickManager & bm = f.GetBalloonManager(); - bm.RemovePin(); - bm.Dismiss(); + f.ActivateUserMark(nullptr, true); [self.searchTextField resignFirstResponder]; self.rootView.compact = YES; self.tableViewController.searchOnMap = YES; diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/Search/TabbedView/BookmarksTab/MWMSearchBookmarksCell.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/Search/TabbedView/BookmarksTab/MWMSearchBookmarksCell.mm index 4630fa4f8e..f23b3fcf53 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/Search/TabbedView/BookmarksTab/MWMSearchBookmarksCell.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/Search/TabbedView/BookmarksTab/MWMSearchBookmarksCell.mm @@ -27,10 +27,15 @@ - (void)configForIndex:(NSInteger)index { - BookmarkCategory const * cat = GetFramework().GetBmCategory(index); + BookmarkCategory * cat = GetFramework().GetBmCategory(index); self.index = index; self.isVisible = cat->IsVisible(); - self.count = cat->GetBookmarksCount() + cat->GetTracksCount(); + size_t userMarksCount = 0; + { + BookmarkCategory::Guard guard(*cat); + userMarksCount = guard.m_controller.GetUserMarkCount(); + } + self.count = userMarksCount + cat->GetTracksCount(); self.titleLabel.text = @(cat->GetName().c_str()); } @@ -38,7 +43,8 @@ { self.isVisible = !self.isVisible; BookmarkCategory * cat = GetFramework().GetBmCategory(self.index); - cat->SetVisible(self.isVisible); + BookmarkCategory::Guard guard(*cat); + guard.m_controller.SetIsVisible(self.isVisible); cat->SaveToKMLFile(); } diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtons.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtons.mm index a7984be027..5b76472c85 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtons.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/ZoomButtons/MWMZoomButtons.mm @@ -50,23 +50,18 @@ extern NSString * const kAlohalyticsTapEventKey; self.zoomView.bottomBound = bound; } -- (void)zoom:(CGFloat)scale -{ - GetFramework().Scale(scale); -} - - (void)zoomIn { [[Statistics instance] logEvent:kStatEventName(kStatZoom, kStatIn)]; [Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"+"]; - [self zoom:2.0]; + GetFramework().Scale(Framework::SCALE_MAG, true); } - (void)zoomOut { [[Statistics instance] logEvent:kStatEventName(kStatZoom, kStatOut)]; [Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"-"]; - [self zoom:0.5]; + GetFramework().Scale(Framework::SCALE_MIN, true); } #pragma mark - Actions @@ -97,8 +92,8 @@ extern NSString * const kAlohalyticsTapEventKey; UIView * const superview = self.zoomView.superview; CGFloat const translation = -[sender translationInView:superview].y / superview.bounds.size.height; - CGFloat const scale = pow(2, translation); - [self zoom:scale]; + CGFloat const scaleFactor = exp(translation); + GetFramework().Scale(scaleFactor, false); } #pragma mark - Properties diff --git a/iphone/Maps/Classes/EAGLView.h b/iphone/Maps/Classes/EAGLView.h index 04c7e16a6f..a9121a63b8 100644 --- a/iphone/Maps/Classes/EAGLView.h +++ b/iphone/Maps/Classes/EAGLView.h @@ -1,59 +1,28 @@ -#import +#import "MWMMapWidgets.h" +#include "../../std/shared_ptr.hpp" +#include "../../indexer/map_style.hpp" +#include "../../drape/pointers.hpp" -#include "std/shared_ptr.hpp" -#include "indexer/map_style.hpp" - -#ifndef USE_DRAPE - -class VideoTimer; -class RenderPolicy; - -namespace iphone -{ - class RenderContext; - class RenderBuffer; -} - -namespace graphics -{ - namespace gl - { - class FrameBuffer; - } -} - -#else - -#include "drape/pointers.hpp" namespace dp { class OGLContextFactory; } -#endif - // This class wraps the CAEAGLLayer from CoreAnimation into a convenient UIView subclass. // The view content is basically an EAGL surface you render your OpenGL scene into. // Note that setting the view non-opaque will only work if the EAGL surface has an alpha channel. @interface EAGLView : UIView { -#ifndef USE_DRAPE - VideoTimer * videoTimer; - shared_ptr renderContext; - shared_ptr frameBuffer; - shared_ptr renderBuffer; - RenderPolicy * renderPolicy; -#else - dp::MasterPointer m_factory; -#endif + drape_ptr m_factory; // Do not call onSize from layoutSubViews when real size wasn't changed. // It's possible when we add/remove subviews (bookmark balloons) and it hangs the map without this check CGRect lastViewSize; } -- (void)initRenderPolicy; -- (void)setMapStyle:(MapStyle)mapStyle; +@property (nonatomic) MWMMapWidgets * widgetsManager; + +- (void)deallocateNative; - (CGPoint)viewPoint2GlobalPoint:(CGPoint)pt; - (CGPoint)globalPoint2ViewPoint:(CGPoint)pt; diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index 0406a6d560..a8165fc11f 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -1,85 +1,52 @@ -#import -#import #import "Common.h" #import "EAGLView.h" #import "MWMDirectionView.h" +#import "../Platform/opengl/iosOGLContextFactory.h" + #include "Framework.h" - -#ifndef USE_DRAPE - #include "RenderBuffer.hpp" - #include "RenderContext.hpp" - #include "graphics/resource_manager.hpp" - #include "graphics/opengl/opengl.hpp" - #include "graphics/data_formats.hpp" - #include "indexer/classificator_loader.hpp" -#else - #import "../Platform/opengl/iosOGLContextFactory.h" -#endif - -#include "render/render_policy.hpp" +#include "indexer/classificator_loader.hpp" #include "platform/platform.hpp" -#include "platform/video_timer.hpp" + +#include "drape/visual_scale.hpp" #include "std/bind.hpp" #include "std/limits.hpp" - +#include "std/unique_ptr.hpp" @implementation EAGLView namespace { +// Returns native scale if it's possible. +double correctContentScale() +{ + UIScreen * uiScreen = [UIScreen mainScreen]; + + if (isIOSVersionLessThan(8)) + return [uiScreen respondsToSelector:@selector(scale)] ? [uiScreen scale] : 1.f; + else + return [uiScreen respondsToSelector:@selector(nativeScale)] ? [uiScreen nativeScale] : 1.f; +} + // Returns DPI as exact as possible. It works for iPhone, iPad and iWatch. -double getExactDPI() +double getExactDPI(double contentScaleFactor) { float const iPadDPI = 132.f; float const iPhoneDPI = 163.f; float const mDPI = 160.f; - UIScreen * screen = [UIScreen mainScreen]; - float const scale = [screen respondsToSelector:@selector(scale)] ? [screen scale] : 1.f; - switch (UI_USER_INTERFACE_IDIOM()) { case UIUserInterfaceIdiomPhone: - return iPhoneDPI * scale; + return iPhoneDPI * contentScaleFactor; case UIUserInterfaceIdiomPad: - return iPadDPI * scale; + return iPadDPI * contentScaleFactor; default: - return mDPI * scale; + return mDPI * contentScaleFactor; } } - -graphics::EDensity getDensityType(int exactDensityDPI, double scale) -{ - if (scale > 2) - return graphics::EDensityIPhone6Plus; - - typedef pair P; - P dens[] = { - // P(120, graphics::EDensityLDPI), - P(160, graphics::EDensityMDPI), - P(240, graphics::EDensityHDPI), - P(320, graphics::EDensityXHDPI), - P(480, graphics::EDensityXXHDPI) - }; - - int prevRange = numeric_limits::max(); - int bestRangeIndex = 0; - for (int i = 0; i < ARRAY_SIZE(dens); i++) - { - int currRange = abs(exactDensityDPI - dens[i].first); - if (currRange <= prevRange) - { - bestRangeIndex = i; - prevRange = currRange; - } - else - break; - } - return dens[bestRangeIndex].second; -} } // namespace // You must implement this method @@ -95,92 +62,39 @@ graphics::EDensity getDensityType(int exactDensityDPI, double scale) if ((self = [super initWithCoder:coder])) { + lastViewSize = CGRectZero; + _widgetsManager = [[MWMMapWidgets alloc] init]; + // Setup Layer Properties CAEAGLLayer * eaglLayer = (CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; - // ColorFormat : RGB565 - // Backbuffer : YES, (to prevent from loosing content when mixing with ordinary layers). - eaglLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking : @NO, kEAGLDrawablePropertyColorFormat : kEAGLColorFormatRGB565}; + eaglLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking : @NO, + kEAGLDrawablePropertyColorFormat : kEAGLColorFormatRGBA8}; // Correct retina display support in opengl renderbuffer - self.contentScaleFactor = [self correctContentScale]; + self.contentScaleFactor = correctContentScale(); -#ifndef USE_DRAPE - renderContext = shared_ptr(new iphone::RenderContext()); - - if (!renderContext.get()) - { - NSLog(@"EAGLView initWithCoder Error"); - return nil; - } - - renderContext->makeCurrent(); - - typedef void (*drawFrameFn)(id, SEL); - SEL drawFrameSel = @selector(drawFrame); - drawFrameFn drawFrameImpl = (drawFrameFn)[self methodForSelector:drawFrameSel]; - - videoTimer = CreateIOSVideoTimer(bind(drawFrameImpl, self, drawFrameSel)); -#else - dp::ThreadSafeFactory * factory = new dp::ThreadSafeFactory(new iosOGLContextFactory(eaglLayer)); - m_factory.Reset(factory); -#endif + m_factory = make_unique_dp(new iosOGLContextFactory(eaglLayer)); } NSLog(@"EAGLView initWithCoder Ended"); return self; } -- (void)initRenderPolicy +- (void)createDrapeEngineWithWidth:(int)width height:(int)height { - NSLog(@"EAGLView initRenderPolicy Started"); - -#ifndef USE_DRAPE - int const dpi = static_cast(getExactDPI()); - - graphics::ResourceManager::Params rmParams; - rmParams.m_videoMemoryLimit = GetPlatform().VideoMemoryLimit(); - rmParams.m_texFormat = graphics::Data4Bpp; - rmParams.m_exactDensityDPI = dpi; + NSLog(@"EAGLView createDrapeEngine Started"); - RenderPolicy::Params rpParams; + Framework::DrapeCreationParams p; + p.m_surfaceWidth = width; + p.m_surfaceHeight = height; + p.m_visualScale = dp::VisualScale(getExactDPI(self.contentScaleFactor)); - UIScreen * screen = [UIScreen mainScreen]; - CGRect screenRect = screen.bounds; + [self.widgetsManager setupWidgets:p]; + GetFramework().CreateDrapeEngine(make_ref(m_factory), move(p)); - double vs = self.contentScaleFactor; - - rpParams.m_screenWidth = screenRect.size.width * vs; - rpParams.m_screenHeight = screenRect.size.height * vs; - rpParams.m_skinName = "basic.skn"; - rpParams.m_density = getDensityType(dpi, vs); - rpParams.m_exactDensityDPI = dpi; - rpParams.m_videoTimer = videoTimer; - rpParams.m_useDefaultFB = false; - rpParams.m_rmParams = rmParams; - rpParams.m_primaryRC = renderContext; - - try - { - renderPolicy = CreateRenderPolicy(rpParams); - } - catch (graphics::gl::platform_unsupported const & ) - { - /// terminate program (though this situation is unreal :) ) - } - - frameBuffer = renderPolicy->GetDrawer()->Screen()->frameBuffer(); - - Framework & f = GetFramework(); - f.SetRenderPolicy(renderPolicy); - f.InitGuiSubsystem(); -#else - CGRect frameRect = [UIScreen mainScreen].applicationFrame; - GetFramework().CreateDrapeEngine(m_factory.GetRefPointer(), self.contentScaleFactor, frameRect.size.width, frameRect.size.height); -#endif - - NSLog(@"EAGLView initRenderPolicy Ended"); + NSLog(@"EAGLView createDrapeEngine Ended"); } - (void)addSubview:(UIView *)view @@ -196,126 +110,44 @@ graphics::EDensity getDensityType(int exactDensityDPI, double scale) } } -- (void)setMapStyle:(MapStyle)mapStyle +- (void)applyOnSize:(int)width withHeight:(int)height { - Framework & f = GetFramework(); - - if (f.GetMapStyle() == mapStyle) - return; - - NSLog(@"EAGLView setMapStyle Started"); - - renderContext->makeCurrent(); - - /// drop old render policy - f.SetRenderPolicy(nullptr); - frameBuffer.reset(); - - f.SetMapStyle(mapStyle); - - /// init new render policy - [self initRenderPolicy]; - - /// restore render policy screen - CGFloat const scale = self.contentScaleFactor; - CGSize const s = self.bounds.size; - [self onSize:s.width * scale withHeight:s.height * scale]; - - /// update framework - f.SetUpdatesEnabled(true); - - NSLog(@"EAGLView setMapStyle Ended"); + dispatch_async(dispatch_get_main_queue(), ^ + { + GetFramework().OnSize(width, height); + [self.widgetsManager resize:CGSizeMake(width, height)]; + }); } - (void)onSize:(int)width withHeight:(int)height { -#ifndef USE_DRAPE - frameBuffer->onSize(width, height); - - graphics::Screen * screen = renderPolicy->GetDrawer()->Screen(); + int w = width * self.contentScaleFactor; + int h = height * self.contentScaleFactor; - /// free old render buffer, as we would not create a new one. - screen->resetRenderTarget(); - screen->resetDepthBuffer(); - renderBuffer.reset(); - - /// detaching of old render target will occur inside beginFrame - screen->beginFrame(); - screen->endFrame(); - - /// allocate the new one - renderBuffer.reset(); - renderBuffer.reset(new iphone::RenderBuffer(renderContext, (CAEAGLLayer*)self.layer)); - - screen->setRenderTarget(renderBuffer); - screen->setDepthBuffer(make_shared(width, height, true)); -#endif - - GetFramework().OnSize(width, height); - -#ifndef USE_DRAPE - screen->beginFrame(); - screen->clear(graphics::Screen::s_bgColor); - screen->endFrame(); - GetFramework().SetNeedRedraw(true); -#endif -} - -- (double)correctContentScale -{ - UIScreen * uiScreen = [UIScreen mainScreen]; - if (isIOSVersionLessThan(8)) - return uiScreen.scale; - else - return uiScreen.nativeScale; -} - -#ifndef USE_DRAPE -- (void)drawFrame -{ - shared_ptr pe(new PaintEvent(renderPolicy->GetDrawer().get())); - - Framework & f = GetFramework(); - if (f.NeedRedraw()) + if (GetFramework().GetDrapeEngine() == nullptr) { - // Workaround. iOS Voice recognition creates own OGL-context, so here we must set ours - // (http://discuss.cocos2d-x.org/t/engine-crash-on-ios7/9129/6) - [EAGLContext setCurrentContext:renderContext->getEAGLContext()]; - - f.SetNeedRedraw(false); - f.BeginPaint(pe); - f.DoPaint(pe); - renderBuffer->present(); - f.EndPaint(pe); + [self createDrapeEngineWithWidth:w height:h]; + GetFramework().LoadState(); + return; } + + [self applyOnSize:w withHeight:h]; } -#endif - (void)layoutSubviews { if (!CGRectEqualToRect(lastViewSize, self.frame)) { lastViewSize = self.frame; -#ifndef USE_DRAPE - CGFloat const scale = self.contentScaleFactor; - CGSize const s = self.bounds.size; - [self onSize:s.width * scale withHeight:s.height * scale]; -#else CGSize const s = self.bounds.size; [self onSize:s.width withHeight:s.height]; -#endif } } -- (void)dealloc +- (void)deallocateNative { -#ifndef USE_DRAPE - delete videoTimer; - [EAGLContext setCurrentContext:nil]; -#else GetFramework().PrepareToShutdown(); - m_factory.Destroy(); -#endif + m_factory.reset(); } - (CGPoint)viewPoint2GlobalPoint:(CGPoint)pt diff --git a/iphone/Maps/Classes/LocalNotificationManager.mm b/iphone/Maps/Classes/LocalNotificationManager.mm index 109e86beeb..24212e4f8c 100644 --- a/iphone/Maps/Classes/LocalNotificationManager.mm +++ b/iphone/Maps/Classes/LocalNotificationManager.mm @@ -110,9 +110,9 @@ using namespace storage; /// @todo Fix this logic after Framework -> CountryTree -> ActiveMapLayout refactoring. /// Call download via Framework. Framework & f = GetFramework(); - f.GetCountryTree().GetActiveMapLayout().DownloadMap(index, MapOptions::Map); + f.GetActiveMaps()->DownloadMap(index, MapOptions::Map); double const defaultZoom = 10; - f.ShowRect(f.GetCountryBounds(index).Center(), defaultZoom); + f.ShowRect(f.GetCountryBounds(index), defaultZoom); } - (NSString *)flagStringForIndex:(TIndex)index diff --git a/iphone/Maps/Classes/LocationPredictor.h b/iphone/Maps/Classes/LocationPredictor.h index 53bce91870..4aef44861e 100644 --- a/iphone/Maps/Classes/LocationPredictor.h +++ b/iphone/Maps/Classes/LocationPredictor.h @@ -8,5 +8,6 @@ -(id)initWithObserver:(NSObject *) observer; -(void)reset:(location::GpsInfo const &) info; +-(void)setMode:(location::EMyPositionMode) mode; @end diff --git a/iphone/Maps/Classes/LocationPredictor.mm b/iphone/Maps/Classes/LocationPredictor.mm index 2fed7c2f83..1a39793210 100644 --- a/iphone/Maps/Classes/LocationPredictor.mm +++ b/iphone/Maps/Classes/LocationPredictor.mm @@ -4,8 +4,6 @@ #include "base/timer.hpp" -#include "map/location_state.hpp" - namespace { NSTimeInterval const PREDICTION_INTERVAL = 0.2; // in seconds @@ -33,23 +31,18 @@ namespace m_timer = nil; m_gpsInfoIsValid = false; m_generatePredictions = false; - - m_connectionSlot = GetFramework().GetLocationState()->AddStateModeListener([self](location::State::Mode mode) - { - m_generatePredictions = (mode == location::State::RotateAndFollow); - if (mode < location::State::NotFollow) - m_gpsInfoIsValid = false; - - [self resetTimer]; - }); } return self; } --(void)dealloc +-(void)setMode:(location::EMyPositionMode) mode { - GetFramework().GetLocationState()->RemoveStateModeListener(m_connectionSlot); + m_generatePredictions = (mode == location::MODE_ROTATE_AND_FOLLOW); + if (mode < location::MODE_NOT_FOLLOW) + m_gpsInfoIsValid = false; + + [self resetTimer]; } -(void)reset:(location::GpsInfo const &)info diff --git a/iphone/Maps/Classes/MWMBookmarkColorViewController.mm b/iphone/Maps/Classes/MWMBookmarkColorViewController.mm index c8fc77d400..9ea7e801bf 100644 --- a/iphone/Maps/Classes/MWMBookmarkColorViewController.mm +++ b/iphone/Maps/Classes/MWMBookmarkColorViewController.mm @@ -129,7 +129,7 @@ static NSString * const kBookmarkColorCellIdentifier = @"MWMBookmarkColorCell"; if (!self.iPadOwnerNavigationController) return; - GetFramework().Invalidate(); + [self.placePageManager reloadBookmark]; } @end diff --git a/iphone/Maps/Classes/MWMPlacePageEntity.mm b/iphone/Maps/Classes/MWMPlacePageEntity.mm index 7281387cf1..9273b25350 100644 --- a/iphone/Maps/Classes/MWMPlacePageEntity.mm +++ b/iphone/Maps/Classes/MWMPlacePageEntity.mm @@ -63,7 +63,6 @@ using feature::Metadata; [self configureForBookmark:mark]; break; } - GetFramework().ActivateUserMark(mark); } - (void)configureForBookmark:(UserMark const *)bookmark @@ -73,7 +72,7 @@ using feature::Metadata; self.type = MWMPlacePageEntityTypeBookmark; BookmarkCategory * category = f.GetBmCategory(self.bac.first); BookmarkData const & data = static_cast(bookmark)->GetData(); - m2::PointD const & point = bookmark->GetOrg(); + m2::PointD const & point = bookmark->GetPivot(); Metadata metadata; search::AddressInfo info; f.FindClosestPOIMetadata(point, metadata); @@ -95,7 +94,7 @@ using feature::Metadata; //Workaround for framework bug. //TODO: Make correct way to get search metadata. Metadata metadata; - GetFramework().FindClosestPOIMetadata(searchMark->GetOrg(), metadata); + GetFramework().FindClosestPOIMetadata(searchMark->GetPivot(), metadata); [self configureEntityWithMetadata:metadata addressInfo:searchMark->GetInfo()]; } @@ -328,7 +327,8 @@ using feature::Metadata; if (!category) return; - Bookmark * bookmark = category->GetBookmark(self.bac.second); + BookmarkCategory::Guard guard(*category); + Bookmark * bookmark = static_cast(guard.m_controller.GetUserMarkForEdit(self.bac.second)); if (!bookmark) return; diff --git a/iphone/Maps/Classes/MWMPlacePageViewManager.mm b/iphone/Maps/Classes/MWMPlacePageViewManager.mm index 21769ba8a8..846b7aecff 100644 --- a/iphone/Maps/Classes/MWMPlacePageViewManager.mm +++ b/iphone/Maps/Classes/MWMPlacePageViewManager.mm @@ -67,12 +67,14 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageManagerState) - (void)dismissPlacePage { + if (!m_userMark) + return; [self.delegate placePageDidClose]; self.state = MWMPlacePageManagerStateClosed; [self.placePage dismiss]; [[MapsAppDelegate theApp].m_locationManager stop:self]; - GetFramework().GetBalloonManager().RemovePin(); m_userMark = nullptr; + GetFramework().DeactivateUserMark(); self.entity = nil; self.placePage = nil; } @@ -193,12 +195,11 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageManagerState) [[Statistics instance] logEvent:kStatEventName(kStatPlacePage, kStatBuildRoute) withParameters:@{kStatValue : kStatDestination}]; [Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"ppRoute"]; - m2::PointD const & destination = m_userMark->GetUserMark()->GetOrg(); - - auto const mode = GetFramework().GetLocationState()->GetMode(); - m2::PointD const myPosition {MapsAppDelegate.theApp.m_locationManager.lastLocation.mercator}; + m2::PointD const & destination = m_userMark->GetUserMark()->GetPivot(); + m2::PointD const myPosition([MapsAppDelegate theApp].m_locationManager.lastLocation.mercator); using namespace location; - [self.delegate buildRouteFrom:mode != State::Mode::UnknownPosition && mode != State::Mode::PendingPosition ? + EMyPositionMode mode = self.delegate.myPositionMode; + [self.delegate buildRouteFrom:mode != EMyPositionMode::MODE_UNKNOWN_POSITION && mode != EMyPositionMode::MODE_PENDING_POSITION ? MWMRoutePoint(myPosition) : MWMRoutePoint::MWMRoutePointZero() to:{destination, self.placePage.basePlacePageView.titleLabel.text}]; @@ -225,7 +226,7 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageManagerState) - (MWMRoutePoint)target { UserMark const * m = m_userMark->GetUserMark(); - m2::PointD const & org = m->GetOrg(); + m2::PointD const & org = m->GetPivot(); return m->GetMarkType() == UserMark::Type::MY_POSITION ? MWMRoutePoint(org) : MWMRoutePoint(org, self.placePage.basePlacePageView.titleLabel.text); @@ -257,8 +258,9 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageManagerState) - (void)changeBookmarkCategory:(BookmarkAndCategory)bac; { - BookmarkCategory const * category = GetFramework().GetBmCategory(bac.first); - Bookmark const * bookmark = category->GetBookmark(bac.second); + BookmarkCategory * category = GetFramework().GetBmCategory(bac.first); + BookmarkCategory::Guard guard(*category); + UserMark const * bookmark = guard.m_controller.GetUserMark(bac.second); m_userMark.reset(new UserMarkCopy(bookmark, false)); } @@ -269,15 +271,14 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageManagerState) Framework & f = GetFramework(); BookmarkData data = BookmarkData(self.entity.title.UTF8String, f.LastEditedBMType()); size_t const categoryIndex = f.LastEditedBMCategory(); - size_t const bookmarkIndex = - f.GetBookmarkManager().AddBookmark(categoryIndex, m_userMark->GetUserMark()->GetOrg(), data); + size_t const bookmarkIndex = f.GetBookmarkManager().AddBookmark(categoryIndex, m_userMark->GetUserMark()->GetPivot(), data); self.entity.bac = make_pair(categoryIndex, bookmarkIndex); self.entity.type = MWMPlacePageEntityTypeBookmark; - BookmarkCategory const * category = f.GetBmCategory(categoryIndex); - Bookmark const * bookmark = category->GetBookmark(bookmarkIndex); + + BookmarkCategory::Guard guard(*f.GetBmCategory(categoryIndex)); + + UserMark const * bookmark = guard.m_controller.GetUserMark(bookmarkIndex); m_userMark.reset(new UserMarkCopy(bookmark, false)); - f.ActivateUserMark(bookmark); - f.Invalidate(); [NSNotificationCenter.defaultCenter postNotificationName:kBookmarksChangedNotification object:nil userInfo:nil]; @@ -289,19 +290,24 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageManagerState) [[Statistics instance] logEvent:kStatEventName(kStatPlacePage, kStatBookmarks) withParameters:@{kStatValue : kStatRemove}]; Framework & f = GetFramework(); - BookmarkCategory * bookmarkCategory = f.GetBookmarkManager().GetBmCategory(self.entity.bac.first); - UserMark const * bookmark = bookmarkCategory->GetBookmark(self.entity.bac.second); - BookmarkAndCategory const bookmarkAndCategory = f.FindBookmark(bookmark); + BookmarkAndCategory bookmarkAndCategory = self.entity.bac; + BookmarkCategory * bookmarkCategory = f.GetBookmarkManager().GetBmCategory(bookmarkAndCategory.first); + if (!bookmarkCategory) + return; + + UserMark const * bookmark = bookmarkCategory->GetUserMark(bookmarkAndCategory.second); + ASSERT_EQUAL(bookmarkAndCategory, f.FindBookmark(bookmark), ()); + self.entity.type = MWMPlacePageEntityTypeRegular; - PoiMarkPoint const * poi = f.GetAddressMark(bookmark->GetOrg()); + + PoiMarkPoint const * poi = f.GetAddressMark(bookmark->GetPivot()); m_userMark.reset(new UserMarkCopy(poi, false)); - f.ActivateUserMark(poi); if (bookmarkCategory) { - bookmarkCategory->DeleteBookmark(bookmarkAndCategory.second); + BookmarkCategory::Guard guard(*bookmarkCategory); + guard.m_controller.DeleteUserMark(bookmarkAndCategory.second); bookmarkCategory->SaveToKMLFile(); } - f.Invalidate(); [NSNotificationCenter.defaultCenter postNotificationName:kBookmarksChangedNotification object:nil userInfo:nil]; @@ -340,7 +346,7 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageManagerState) return @""; string distance; CLLocationCoordinate2D const coord = location.coordinate; - ms::LatLon const target = MercatorBounds::ToLatLon(m_userMark->GetUserMark()->GetOrg()); + ms::LatLon const target = MercatorBounds::ToLatLon(m_userMark->GetUserMark()->GetPivot()); MeasurementUtils::FormatDistance(ms::DistanceOnEarth(coord.latitude, coord.longitude, target.lat, target.lon), distance); return @(distance.c_str()); @@ -352,7 +358,7 @@ typedef NS_ENUM(NSUInteger, MWMPlacePageManagerState) if (!location || !m_userMark) return; - CGFloat const angle = ang::AngleTo(location.mercator, m_userMark->GetUserMark()->GetOrg()) + info.m_bearing; + CGFloat const angle = ang::AngleTo(location.mercator, m_userMark->GetUserMark()->GetPivot()) + info.m_bearing; CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_2 - angle); [self.placePage setDirectionArrowTransform:transform]; [self.directionView setDirectionArrowTransform:transform]; diff --git a/iphone/Maps/Classes/MWMPlacePageViewManagerDelegate.h b/iphone/Maps/Classes/MWMPlacePageViewManagerDelegate.h index bf345cda8f..dea0d17c82 100644 --- a/iphone/Maps/Classes/MWMPlacePageViewManagerDelegate.h +++ b/iphone/Maps/Classes/MWMPlacePageViewManagerDelegate.h @@ -1,7 +1,11 @@ #import "MWMRoutingProtocol.h" +#include "platform/location.hpp" + @protocol MWMPlacePageViewManagerProtocol +@property (nonatomic) location::EMyPositionMode myPositionMode; + - (void)dragPlacePage:(CGRect)frame; - (void)addPlacePageViews:(NSArray *)views; - (void)updateStatusBarStyle; diff --git a/iphone/Maps/Classes/MWMiPhoneLandscapePlacePage.mm b/iphone/Maps/Classes/MWMiPhoneLandscapePlacePage.mm index 5317c28005..c1cdffd37a 100644 --- a/iphone/Maps/Classes/MWMiPhoneLandscapePlacePage.mm +++ b/iphone/Maps/Classes/MWMiPhoneLandscapePlacePage.mm @@ -188,7 +188,8 @@ typedef NS_ENUM(NSUInteger, MWMiPhoneLandscapePlacePageState) __weak MWMiPhoneLandscapePlacePage * weakSelf = self; BOOL const stateClosed = self.state == MWMiPhoneLandscapePlacePageStateClosed; if (stateClosed) - GetFramework().GetBalloonManager().RemovePin(); + GetFramework().DeactivateUserMark(); + self.panRecognizer.enabled = !stateClosed; [self startAnimatingPlacePage:self initialVelocity:CGPointMake(self.panVelocity, 0.0) completion:^ { diff --git a/iphone/Maps/Classes/MWMiPhonePortraitPlacePage.mm b/iphone/Maps/Classes/MWMiPhonePortraitPlacePage.mm index 9b0dc6ea31..e7e813b038 100644 --- a/iphone/Maps/Classes/MWMiPhonePortraitPlacePage.mm +++ b/iphone/Maps/Classes/MWMiPhonePortraitPlacePage.mm @@ -333,7 +333,8 @@ typedef NS_ENUM(NSUInteger, MWMiPhonePortraitPlacePageState) _targetPoint = targetPoint; __weak MWMiPhonePortraitPlacePage * weakSelf = self; if (self.state == MWMiPhonePortraitPlacePageStateClosed) - GetFramework().GetBalloonManager().RemovePin(); + GetFramework().DeactivateUserMark(); + [self startAnimatingPlacePage:self initialVelocity:{0.0, self.panVelocity} completion:^ { __strong MWMiPhonePortraitPlacePage * self = weakSelf; diff --git a/iphone/Maps/Classes/MapViewController.h b/iphone/Maps/Classes/MapViewController.h index 460435e256..b4f1b89267 100644 --- a/iphone/Maps/Classes/MapViewController.h +++ b/iphone/Maps/Classes/MapViewController.h @@ -15,20 +15,11 @@ namespace search { struct AddressInfo; } @interface MapViewController : ViewController { - bool m_isSticking; - size_t m_StickyThreshold; - m2::PointD m_Pt1, m_Pt2; - - /// Temporary solution to improve long touch detection. - m2::PointD m_touchDownPoint; - CGPoint m_popoverPos; LocationPredictor * m_predictor; } -- (void)setupMeasurementSystem; - // called when app is terminated by system - (void)onTerminate; - (void)onEnterForeground; diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index 821d94dfb1..3868c560b9 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -18,14 +18,13 @@ #import "3party/Alohalytics/src/alohalytics_objc.h" #include "Framework.h" -#include "RenderContext.hpp" -#include "anim/controller.hpp" -#include "gui/controller.hpp" +#include "../Statistics/Statistics.h" -#include "map/country_status_display.hpp" #include "map/user_mark.hpp" +#include "drape_frontend/user_event_stream.hpp" + #include "platform/file_logging.hpp" #include "platform/platform.hpp" #include "platform/settings.hpp" @@ -169,25 +168,28 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) GetFramework().OnCompassUpdate(info); } -- (void)onLocationStateModeChanged:(location::State::Mode)newMode +- (void)onLocationStateModeChanged:(location::EMyPositionMode)newMode { + [m_predictor setMode:newMode]; + [self.controlsManager setMyPositionMode:newMode]; + switch (newMode) { - case location::State::UnknownPosition: + case location::MODE_UNKNOWN_POSITION: { self.disableStandbyOnLocationStateMode = NO; [[MapsAppDelegate theApp].m_locationManager stop:self]; break; } - case location::State::PendingPosition: + case location::MODE_PENDING_POSITION: self.disableStandbyOnLocationStateMode = NO; [[MapsAppDelegate theApp].m_locationManager start:self]; break; - case location::State::NotFollow: + case location::MODE_NOT_FOLLOW: self.disableStandbyOnLocationStateMode = NO; break; - case location::State::Follow: - case location::State::RotateAndFollow: + case location::MODE_FOLLOW: + case location::MODE_ROTATE_AND_FOLLOW: self.disableStandbyOnLocationStateMode = YES; break; } @@ -213,72 +215,78 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) - (void)onUserMarkClicked:(unique_ptr)mark { - [self.controlsManager showPlacePageWithUserMark:std::move(mark)]; -} - -- (void)processMapClickAtPoint:(CGPoint)point longClick:(BOOL)isLongClick -{ - CGFloat const scaleFactor = self.view.contentScaleFactor; - m2::PointD const pxClicked(point.x * scaleFactor, point.y * scaleFactor); - - Framework & f = GetFramework(); - UserMark const * userMark = f.GetUserMark(pxClicked, isLongClick); - if (!f.HasActiveUserMark() && self.controlsManager.searchHidden && !f.IsRouteNavigable() - && MapsAppDelegate.theApp.routingPlaneMode == MWMRoutingPlaneModeNone) + if (mark == nullptr) { - if (userMark == nullptr) + [self dismissPlacePage]; + + auto & f = GetFramework(); + if (!f.HasActiveUserMark() && self.controlsManager.searchHidden && !f.IsRouteNavigable()) self.controlsManager.hidden = !self.controlsManager.hidden; - else - self.controlsManager.hidden = NO; } - f.GetBalloonManager().OnShowMark(userMark); + else + { + self.controlsManager.hidden = NO; + [self.controlsManager showPlacePageWithUserMark:move(mark)]; + } } -- (void)onSingleTap:(NSValueWrapper *)point +- (void)onMyPositionClicked:(id)sender { - [self processMapClickAtPoint:[[point getInnerValue] CGPointValue] longClick:NO]; -} - -- (void)onLongTap:(NSValueWrapper *)point -{ - [self processMapClickAtPoint:[[point getInnerValue] CGPointValue] longClick:YES]; + GetFramework().SwitchMyPositionNextMode(); } - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { [self destroyPopover]; - [self invalidate]; } -- (void)updatePointsFromEvent:(UIEvent *)event +- (void)checkMaskedPointer:(UITouch *)touch withEvent:(df::TouchEvent &)e { - NSSet * allTouches = [event allTouches]; + int64_t id = reinterpret_cast(touch); + int8_t pointerIndex = df::TouchEvent::INVALID_MASKED_POINTER; + if (e.m_touches[0].m_id == id) + pointerIndex = 0; + else if (e.m_touches[1].m_id == id) + pointerIndex = 1; + + if (e.GetFirstMaskedPointer() == df::TouchEvent::INVALID_MASKED_POINTER) + e.SetFirstMaskedPointer(pointerIndex); + else + e.SetSecondMaskedPointer(pointerIndex); +} + +- (void)sendTouchType:(df::TouchEvent::ETouchType)type withTouches:(NSSet *)touches andEvent:(UIEvent *)event +{ + NSArray * allTouches = [[event allTouches] allObjects]; + if ([allTouches count] < 1) + return; UIView * v = self.view; CGFloat const scaleFactor = v.contentScaleFactor; - // 0 touches are possible from touchesCancelled. - switch ([allTouches count]) + df::TouchEvent e; + UITouch * touch = [allTouches objectAtIndex:0]; + CGPoint const pt = [touch locationInView:v]; + e.m_type = type; + e.m_touches[0].m_id = reinterpret_cast(touch); + e.m_touches[0].m_location = m2::PointD(pt.x * scaleFactor, pt.y * scaleFactor); + if (allTouches.count > 1) { - case 0: - break; - case 1: - { - CGPoint const pt = [[[allTouches allObjects] objectAtIndex:0] locationInView:v]; - m_Pt1 = m2::PointD(pt.x * scaleFactor, pt.y * scaleFactor); - break; - } - default: - { - NSArray * sortedTouches = [[allTouches allObjects] sortedArrayUsingFunction:compareAddress context:NULL]; - CGPoint const pt1 = [[sortedTouches objectAtIndex:0] locationInView:v]; - CGPoint const pt2 = [[sortedTouches objectAtIndex:1] locationInView:v]; - - m_Pt1 = m2::PointD(pt1.x * scaleFactor, pt1.y * scaleFactor); - m_Pt2 = m2::PointD(pt2.x * scaleFactor, pt2.y * scaleFactor); - break; - } + UITouch * touch = [allTouches objectAtIndex:1]; + CGPoint const pt = [touch locationInView:v]; + e.m_touches[1].m_id = reinterpret_cast(touch); + e.m_touches[1].m_location = m2::PointD(pt.x * scaleFactor, pt.y * scaleFactor); } + + NSArray * toggledTouches = [touches allObjects]; + if (toggledTouches.count > 0) + [self checkMaskedPointer:[toggledTouches objectAtIndex:0] withEvent:e]; + + if (toggledTouches.count > 1) + [self checkMaskedPointer:[toggledTouches objectAtIndex:1] withEvent:e]; + + Framework & f = GetFramework(); + f.TouchEvent(e); } - (BOOL)hasForceTouch @@ -288,179 +296,24 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) return self.view.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable; } --(void)preformLongTapSelector:(NSValue *)object -{ - if (![self hasForceTouch]) - [self performSelector:@selector(onLongTap:) withObject:[[NSValueWrapper alloc] initWithValue:object] afterDelay:1.0]; -} - --(void)performSingleTapSelector:(NSValue *)object -{ - [self performSelector:@selector(onSingleTap:) withObject:[[NSValueWrapper alloc] initWithValue:object] afterDelay:0.3]; -} - --(void)cancelLongTap -{ - if (![self hasForceTouch]) - [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(onLongTap:) object:[[NSValueWrapper alloc] initWithValue:nil]]; -} - --(void)cancelSingleTap -{ - [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(onSingleTap:) object:[[NSValueWrapper alloc] initWithValue:nil]]; -} - - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { - // To cancel single tap timer - UITouch * theTouch = (UITouch *)[touches anyObject]; - if (theTouch.tapCount > 1) - [self cancelSingleTap]; - - [self updatePointsFromEvent:event]; - - Framework & f = GetFramework(); - - if ([event allTouches].count == 1) - { - if (f.GetGuiController()->OnTapStarted(m_Pt1)) - return; - self.userTouchesAction = UserTouchesActionDrag; - - // Start long-tap timer - [self preformLongTapSelector:[NSValue valueWithCGPoint:[theTouch locationInView:self.view]]]; - // Temporary solution to filter long touch - m_touchDownPoint = m_Pt1; - } - else - { - self.userTouchesAction = UserTouchesActionScale; - } - - m_isSticking = true; + [self sendTouchType:df::TouchEvent::TOUCH_DOWN withTouches:touches andEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { - if (!self.skipForceTouch && [self hasForceTouch]) - { - UITouch * theTouch = (UITouch *)[touches anyObject]; - if (theTouch.force >= theTouch.maximumPossibleForce) - { - self.skipForceTouch = YES; - [self processMapClickAtPoint:[theTouch locationInView:self.view] longClick:YES]; - } - } - - m2::PointD const TempPt1 = m_Pt1; - m2::PointD const TempPt2 = m_Pt2; - - [self updatePointsFromEvent:event]; - - // Cancel long-touch timer - if (!m_touchDownPoint.EqualDxDy(m_Pt1, 9)) - [self cancelLongTap]; - - Framework & f = GetFramework(); - - if (f.GetGuiController()->OnTapMoved(m_Pt1)) - return; - - if (m_isSticking) - { - if ((TempPt1.Length(m_Pt1) > m_StickyThreshold) || (TempPt2.Length(m_Pt2) > m_StickyThreshold)) - { - m_isSticking = false; - } - else - { - // Still stickying. Restoring old points and return. - m_Pt1 = TempPt1; - m_Pt2 = TempPt2; - return; - } - } - - NSUInteger const touchesCount = [event allTouches].count; - switch (self.userTouchesAction) - { - case UserTouchesActionNone: - if (touchesCount == 1) - self.userTouchesAction = UserTouchesActionDrag; - else - self.userTouchesAction = UserTouchesActionScale; - break; - case UserTouchesActionDrag: - if (touchesCount == 1) - f.DoDrag(DragEvent(m_Pt1.x, m_Pt1.y)); - else - self.userTouchesAction = UserTouchesActionNone; - break; - case UserTouchesActionScale: - if (touchesCount == 2) - f.DoScale(ScaleEvent(m_Pt1.x, m_Pt1.y, m_Pt2.x, m_Pt2.y)); - else - self.userTouchesAction = UserTouchesActionNone; - break; - } + [self sendTouchType:df::TouchEvent::TOUCH_MOVE withTouches:nil andEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - [self updatePointsFromEvent:event]; - self.userTouchesAction = UserTouchesActionNone; - - UITouch * theTouch = (UITouch *)[touches anyObject]; - NSUInteger const tapCount = theTouch.tapCount; - NSUInteger const touchesCount = [event allTouches].count; - - Framework & f = GetFramework(); - - if (touchesCount == 1) - { - // Cancel long-touch timer - [self cancelLongTap]; - - // TapCount could be zero if it was a single long (or moving) tap. - if (tapCount < 2) - { - if (f.GetGuiController()->OnTapEnded(m_Pt1)) - return; - } - - if (tapCount == 1) - { - // Launch single tap timer - if (m_isSticking && !self.skipForceTouch) - [self performSingleTapSelector: [NSValue valueWithCGPoint:[theTouch locationInView:self.view]]]; - } - else if (tapCount == 2 && m_isSticking) - { - f.ScaleToPoint(ScaleToPointEvent(m_Pt1.x, m_Pt1.y, 2.0)); - } - } - - if (touchesCount == 2 && tapCount == 1 && m_isSticking) - { - f.Scale(0.5); - if (!m_touchDownPoint.EqualDxDy(m_Pt1, 9)) - { - [self cancelLongTap]; - [self cancelSingleTap]; - } - m_isSticking = NO; - } - self.skipForceTouch = NO; + [self sendTouchType:df::TouchEvent::TOUCH_UP withTouches:touches andEvent:event]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { - self.skipForceTouch = NO; - [self cancelLongTap]; - [self cancelSingleTap]; - - [self updatePointsFromEvent:event]; - self.userTouchesAction = UserTouchesActionNone; + [self sendTouchType:df::TouchEvent::TOUCH_CANCEL withTouches:touches andEvent:event]; } #pragma mark - ViewController lifecycle @@ -494,7 +347,6 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [self showPopover]; - [self invalidate]; } - (void)didReceiveMemoryWarning @@ -506,6 +358,7 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) - (void)onTerminate { GetFramework().SaveState(); + [(EAGLView *)self.view deallocateNative]; } - (void)onEnterBackground @@ -514,14 +367,12 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) Framework & f = GetFramework(); f.SaveState(); - f.SetUpdatesEnabled(false); f.EnterBackground(); } - (void)setMapStyle:(MapStyle)mapStyle { - EAGLView * v = (EAGLView *)self.view; - [v setMapStyle: mapStyle]; + GetFramework().SetMapStyle(mapStyle); } - (void)onEnterForeground @@ -531,7 +382,6 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) if (self.isViewLoaded && self.view.window) { - [self invalidate]; // only invalidate when map is displayed on the screen [self.controlsManager onEnterForeground]; } } @@ -540,18 +390,17 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; - [self invalidate]; self.controlsManager.menuState = self.menuRestoreState; [self refreshAd]; + + GetFramework().InvalidateRendering(); } - (void)viewDidLoad { [super viewDidLoad]; - EAGLView * v = (EAGLView *)self.view; - [v initRenderPolicy]; self.view.clipsToBounds = YES; [MTRGManager setMyCom:YES]; self.controlsManager = [[MWMMapViewControlsManager alloc] initWithParentController:self]; @@ -583,7 +432,6 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) { [super viewWillDisappear:animated]; self.menuRestoreState = self.controlsManager.menuState; - GetFramework().SetUpdatesEnabled(false); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; } @@ -635,38 +483,23 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) typedef void (*UserMarkActivatedFnT)(id, SEL, unique_ptr); typedef void (*PlacePageDismissedFnT)(id, SEL); - PinClickManager & manager = f.GetBalloonManager(); - SEL userMarkSelector = @selector(onUserMarkClicked:); UserMarkActivatedFnT userMarkFn = (UserMarkActivatedFnT)[self methodForSelector:userMarkSelector]; - manager.ConnectUserMarkListener(bind(userMarkFn, self, userMarkSelector, _1)); - - SEL dismissSelector = @selector(dismissPlacePage); - PlacePageDismissedFnT dismissFn = (PlacePageDismissedFnT)[self methodForSelector:dismissSelector]; - manager.ConnectDismissListener(bind(dismissFn, self, dismissSelector)); - - typedef void (*LocationStateModeFnT)(id, SEL, location::State::Mode); - SEL locationStateModeSelector = @selector(onLocationStateModeChanged:); - LocationStateModeFnT locationStateModeFn = (LocationStateModeFnT)[self methodForSelector:locationStateModeSelector]; - - f.GetLocationState()->AddStateModeListener(bind(locationStateModeFn, self, locationStateModeSelector, _1)); - + f.SetUserMarkActivationListener(bind(userMarkFn, self, userMarkSelector, _1)); m_predictor = [[LocationPredictor alloc] initWithObserver:self]; - m_StickyThreshold = 10; - self.forceRoutingStateChange = ForceRoutingStateChangeNone; self.userTouchesAction = UserTouchesActionNone; self.menuRestoreState = MWMBottomMenuStateInactive; - // restore previous screen position - if (!f.LoadState()) - f.SetMaxWorldRect(); - - f.Invalidate(); f.LoadBookmarks(); - f.GetCountryStatusDisplay()->SetDownloadCountryListener([self, &f](storage::TIndex const & idx, int opt) + using TLocationStateModeFn = void (*)(id, SEL, location::EMyPositionMode); + SEL locationStateModeSelector = @selector(onLocationStateModeChanged:); + TLocationStateModeFn locationStateModeFn = (TLocationStateModeFn)[self methodForSelector:locationStateModeSelector]; + f.SetMyPositionModeListener(bind(locationStateModeFn, self, locationStateModeSelector, _1)); + + f.SetDownloadCountryListener([self, &f](storage::TIndex const & idx, int opt) { ActiveMapsLayout & layout = f.GetCountryTree().GetActiveMapLayout(); if (opt == -1) @@ -706,51 +539,20 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) f.SetRouteBuildingListener([self, &f](routing::IRouter::ResultCode code, vector const & absentCountries, vector const & absentRoutes) { - switch (code) + vector countries = absentCountries; + vector routes = absentRoutes; + dispatch_async(dispatch_get_main_queue(), ^ { - case routing::IRouter::ResultCode::NoError: - { - f.GetBalloonManager().RemovePin(); - f.GetBalloonManager().Dismiss(); - self.controlsManager.routeBuildingProgress = 100.; - self.controlsManager.searchHidden = YES; - if (self.forceRoutingStateChange == ForceRoutingStateChangeStartFollowing) - [self.controlsManager routingNavigation]; - else - [self.controlsManager routingReady]; - [self updateRoutingInfo]; - self.forceRoutingStateChange = ForceRoutingStateChangeNone; - bool isDisclaimerApproved = false; - (void)Settings::Get("IsDisclaimerApproved", isDisclaimerApproved); - if (!isDisclaimerApproved) - { - [self presentRoutingDisclaimerAlert]; - Settings::Set("IsDisclaimerApproved", true); - } - break; - } - case routing::IRouter::RouteFileNotExist: - case routing::IRouter::InconsistentMWMandRoute: - case routing::IRouter::NeedMoreMaps: - case routing::IRouter::FileTooOld: - case routing::IRouter::RouteNotFound: - [self.controlsManager handleRoutingError]; - [self presentDownloaderAlert:code countries:absentCountries routes:absentRoutes]; - self.forceRoutingStateChange = ForceRoutingStateChangeNone; - break; - case routing::IRouter::Cancelled: - self.forceRoutingStateChange = ForceRoutingStateChangeNone; - break; - default: - [self.controlsManager handleRoutingError]; - [self presentDefaultAlert:code]; - self.forceRoutingStateChange = ForceRoutingStateChangeNone; - break; - } + [self processRoutingBuildingEvent:code countries:countries routes:routes]; + }); }); + f.SetRouteProgressListener([self](float progress) { - self.controlsManager.routeBuildingProgress = progress; + dispatch_async(dispatch_get_main_queue(), ^ + { + self.controlsManager.routeBuildingProgress = progress; + }); }); } @@ -758,6 +560,54 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) return self; } +- (void)processRoutingBuildingEvent:(routing::IRouter::ResultCode)code + countries:(vector const &)absentCountries + routes:(vector const &)absentRoutes +{ + Framework & f = GetFramework(); + switch (code) + { + case routing::IRouter::ResultCode::NoError: + { + self.controlsManager.routeBuildingProgress = 100.; + f.ActivateUserMark(nullptr, true); + self.controlsManager.routeBuildingProgress = 100.; + self.controlsManager.searchHidden = YES; + if (self.forceRoutingStateChange == ForceRoutingStateChangeStartFollowing) + [self.controlsManager routingNavigation]; + else + [self.controlsManager routingReady]; + [self updateRoutingInfo]; + self.forceRoutingStateChange = ForceRoutingStateChangeNone; + bool isDisclaimerApproved = false; + (void)Settings::Get("IsDisclaimerApproved", isDisclaimerApproved); + if (!isDisclaimerApproved) + { + [self presentRoutingDisclaimerAlert]; + Settings::Set("IsDisclaimerApproved", true); + } + break; + } + case routing::IRouter::RouteFileNotExist: + case routing::IRouter::InconsistentMWMandRoute: + case routing::IRouter::NeedMoreMaps: + case routing::IRouter::FileTooOld: + case routing::IRouter::RouteNotFound: + [self.controlsManager handleRoutingError]; + [self presentDownloaderAlert:code countries:absentCountries routes:absentRoutes]; + self.forceRoutingStateChange = ForceRoutingStateChangeNone; + break; + case routing::IRouter::Cancelled: + self.forceRoutingStateChange = ForceRoutingStateChangeNone; + break; + default: + [self.controlsManager handleRoutingError]; + [self presentDefaultAlert:code]; + self.forceRoutingStateChange = ForceRoutingStateChangeNone; + break; + } +} + - (void)openBookmarks { BOOL const oneCategory = (GetFramework().GetBmCategoriesCount() == 1); @@ -876,27 +726,8 @@ typedef NS_ENUM(NSUInteger, UserTouchesAction) return _alertController; } -#pragma mark - Public methods - -- (void)setupMeasurementSystem -{ - GetFramework().SetupMeasurementSystem(); -} - #pragma mark - Private methods -NSInteger compareAddress(id l, id r, void * context) -{ - return l < r; -} - -- (void)invalidate -{ - Framework & f = GetFramework(); - if (!f.SetUpdatesEnabled(true)) - f.Invalidate(); -} - - (void)destroyPopover { self.popoverVC = nil; @@ -904,12 +735,12 @@ NSInteger compareAddress(id l, id r, void * context) - (void)showPopover { + Framework & f = GetFramework(); if (self.popoverVC) - GetFramework().GetBalloonManager().Hide(); + f.ActivateUserMark(nullptr, true); double const sf = self.view.contentScaleFactor; - Framework & f = GetFramework(); m2::PointD tmp = m2::PointD(f.GtoP(m2::PointD(m_popoverPos.x, m_popoverPos.y))); [self.popoverVC presentPopoverFromRect:CGRectMake(tmp.x / sf, tmp.y / sf, 1, 1) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; @@ -919,7 +750,6 @@ NSInteger compareAddress(id l, id r, void * context) { [self.popoverVC dismissPopoverAnimated:YES]; [self destroyPopover]; - [self invalidate]; } - (void)setRestoreRouteDestination:(m2::PointD)restoreRouteDestination @@ -939,29 +769,6 @@ NSInteger compareAddress(id l, id r, void * context) [[MapsAppDelegate theApp] enableStandby]; } -- (void)setUserTouchesAction:(UserTouchesAction)userTouchesAction -{ - if (_userTouchesAction == userTouchesAction) - return; - Framework & f = GetFramework(); - switch (userTouchesAction) - { - case UserTouchesActionNone: - if (_userTouchesAction == UserTouchesActionDrag) - f.StopDrag(DragEvent(m_Pt1.x, m_Pt1.y)); - else if (_userTouchesAction == UserTouchesActionScale) - f.StopScale(ScaleEvent(m_Pt1.x, m_Pt1.y, m_Pt2.x, m_Pt2.y)); - break; - case UserTouchesActionDrag: - f.StartDrag(DragEvent(m_Pt1.x, m_Pt1.y)); - break; - case UserTouchesActionScale: - f.StartScale(ScaleEvent(m_Pt1.x, m_Pt1.y, m_Pt2.x, m_Pt2.y)); - break; - } - _userTouchesAction = userTouchesAction; -} - #pragma mark - Properties - (void)setAppWallAd:(MTRGNativeAppwallAd *)appWallAd diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm index da7c2e7f5f..f4781d9fee 100644 --- a/iphone/Maps/Classes/MapsAppDelegate.mm +++ b/iphone/Maps/Classes/MapsAppDelegate.mm @@ -216,7 +216,7 @@ void InitLocalizedStrings() Framework & f = GetFramework(); application.applicationIconBadgeNumber = f.GetCountryTree().GetActiveMapLayout().GetOutOfDateCount(); - f.GetLocationState()->InvalidatePosition(); + f.InvalidateMyPosition(); [self enableTTSForTheFirstTime]; [MWMTextToSpeech activateAudioSession]; diff --git a/iphone/Maps/Classes/Widgets/MWMMapWidgets.h b/iphone/Maps/Classes/Widgets/MWMMapWidgets.h new file mode 100644 index 0000000000..d1a462c3ed --- /dev/null +++ b/iphone/Maps/Classes/Widgets/MWMMapWidgets.h @@ -0,0 +1,12 @@ +#include "Framework.h" + +@interface MWMMapWidgets : NSObject + +@property (nonatomic) BOOL fullScreen; +@property (nonatomic) CGFloat leftBound; +@property (nonatomic) CGFloat bottomBound; + +- (void)setupWidgets:(Framework::DrapeCreationParams &)p; +- (void)resize:(CGSize)size; + +@end diff --git a/iphone/Maps/Classes/Widgets/MWMMapWidgets.mm b/iphone/Maps/Classes/Widgets/MWMMapWidgets.mm new file mode 100644 index 0000000000..68ef8eec23 --- /dev/null +++ b/iphone/Maps/Classes/Widgets/MWMMapWidgets.mm @@ -0,0 +1,89 @@ +#import "MWMMapWidgets.h" + +#include "drape_frontend/gui/skin.hpp" +#include "std/unique_ptr.hpp" + +@interface MWMMapWidgets () + +@property (nonatomic) float visualScale; + +@end + +@implementation MWMMapWidgets +{ + unique_ptr m_skin; +} + +- (void)setupWidgets:(Framework::DrapeCreationParams &)p +{ + self.visualScale = p.m_visualScale; + m_skin.reset(new gui::Skin(gui::ResolveGuiSkinFile("default"), p.m_visualScale)); + m_skin->Resize(p.m_surfaceWidth, p.m_surfaceHeight); + m_skin->ForEach([&p](gui::EWidget widget, gui::Position const & pos) + { + p.m_widgetsInitInfo[widget] = pos; + }); +#ifdef DEBUG + p.m_widgetsInitInfo[gui::WIDGET_SCALE_LABEL] = gui::Position(dp::LeftBottom); +#endif +} + +- (void)resize:(CGSize)size +{ + m_skin->Resize(size.width, size.height); + [self layoutWidgets]; +} + +- (void)layoutWidgets +{ + gui::TWidgetsLayoutInfo layout; + if (self.fullScreen) + { + layout[gui::WIDGET_RULER] = m_skin->ResolvePosition(gui::WIDGET_RULER).m_pixelPivot; + layout[gui::WIDGET_COMPASS] = m_skin->ResolvePosition(gui::WIDGET_COMPASS).m_pixelPivot; + } + else + { + m_skin->ForEach([&layout, &self](gui::EWidget w, gui::Position const & pos) + { + m2::PointF pivot = pos.m_pixelPivot; + switch (w) + { + case gui::WIDGET_RULER: + case gui::WIDGET_COPYRIGHT: + pivot -= m2::PointF(0.0, self.bottomBound * self.visualScale); + break; + case gui::WIDGET_COMPASS: + pivot += m2::PointF(self.leftBound, -self.bottomBound) * self.visualScale; + break; + case gui::WIDGET_SCALE_LABEL: + case gui::WIDGET_COUNTRY_STATUS: + break; + } + layout[w] = pivot; + }); + } + GetFramework().SetWidgetLayout(move(layout)); +} + +#pragma mark - Properties + +- (void)setFullScreen:(BOOL)fullScreen +{ + _fullScreen = fullScreen; + [self layoutWidgets]; +} + +- (void)setLeftBound:(CGFloat)leftBound +{ + _leftBound = MAX(leftBound, 0.0); + [self layoutWidgets]; +} + +- (void)setBottomBound:(CGFloat)bottomBound +{ + _bottomBound = bottomBound; + [self layoutWidgets]; +} + +@end diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index a83b338ed1..b4ad55507a 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -123,7 +123,12 @@ 34F45E8E1B96E88100AC93F8 /* MWMSearchTabButtonsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34F45E8D1B96E88100AC93F8 /* MWMSearchTabButtonsView.mm */; }; 34F45E901B96E8B100AC93F8 /* MWMSearchTabButtonsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34F45E8F1B96E8B100AC93F8 /* MWMSearchTabButtonsView.xib */; }; 34F8ADD91B97229A004184CC /* MWMSearchTableView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34F8ADD81B97229A004184CC /* MWMSearchTableView.mm */; }; + 34FE4C451BCC013500066718 /* MWMMapWidgets.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34FE4C441BCC013500066718 /* MWMMapWidgets.mm */; }; 45159BF91B0CA2D5009BFA85 /* resources-6plus in Resources */ = {isa = PBXBuildFile; fileRef = 45159BF81B0CA2D5009BFA85 /* resources-6plus */; }; + 4519503A1B7A3E070085DA05 /* patterns.txt in Resources */ = {isa = PBXBuildFile; fileRef = 451950391B7A3E070085DA05 /* patterns.txt */; }; + 4519503B1B7A3E390085DA05 /* patterns.txt in Resources */ = {isa = PBXBuildFile; fileRef = 451950391B7A3E070085DA05 /* patterns.txt */; }; + 452FCA3B1B6A3DF7007019AB /* colors.txt in Resources */ = {isa = PBXBuildFile; fileRef = 452FCA3A1B6A3DF7007019AB /* colors.txt */; }; + 452FCA3E1B6A3E83007019AB /* colors.txt in Resources */ = {isa = PBXBuildFile; fileRef = 452FCA3A1B6A3DF7007019AB /* colors.txt */; }; 454040621AD2D75E007A9B12 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46F26C7210F61FD600ECCA39 /* OpenGLES.framework */; }; 454040631AD2D83A007A9B12 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97C98655186C734000AF7E9E /* AVFoundation.framework */; }; 454040641AD2D862007A9B12 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; @@ -134,7 +139,6 @@ 4540406C1AD2D92D007A9B12 /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97C98651186C5EF000AF7E9E /* iAd.framework */; }; 4540406D1AD2D958007A9B12 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97ECD870183620CE00F77A46 /* AdSupport.framework */; }; 4540406F1AD2D9C5007A9B12 /* WatchKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4540406E1AD2D9C5007A9B12 /* WatchKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 454040701AD2DB30007A9B12 /* RenderContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = EE7F297E1219ECA300EB67A9 /* RenderContext.mm */; }; 454040761AD2DD73007A9B12 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 4579C8951AD2F98B001D6B90 /* synonyms.txt in Resources */ = {isa = PBXBuildFile; fileRef = FAAEA7D0161BD26600CCD661 /* synonyms.txt */; }; 4579C8961AD2F9A1001D6B90 /* categories.txt in Resources */ = {isa = PBXBuildFile; fileRef = FAAFD696139D9BE2000AE70C /* categories.txt */; }; @@ -153,7 +157,6 @@ 4579C8A41AD2FAB1001D6B90 /* 04_padauk.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E8134C4968003A9827 /* 04_padauk.ttf */; }; 4579C8A51AD2FAB1001D6B90 /* 05_khmeros.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E9134C4968003A9827 /* 05_khmeros.ttf */; }; 4579C8A61AD2FAB1001D6B90 /* 06_code2000.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EE164810135CEE49003B8A3E /* 06_code2000.ttf */; }; - 45FE96831AD315EF00CB7560 /* RenderBuffer.mm in Sources */ = {isa = PBXBuildFile; fileRef = EE7F297D1219ECA300EB67A9 /* RenderBuffer.mm */; }; 46F26C7310F61FD600ECCA39 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46F26C7210F61FD600ECCA39 /* OpenGLES.framework */; }; 46F26CD810F623BA00ECCA39 /* EAGLView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46F26CD710F623BA00ECCA39 /* EAGLView.mm */; }; 46F26D1F10F626CB00ECCA39 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46F26D1E10F626CB00ECCA39 /* QuartzCore.framework */; }; @@ -605,7 +608,9 @@ 9DF04B241B71010E00DACAF1 /* 02_droidsans-fallback.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9DF04B231B71010E00DACAF1 /* 02_droidsans-fallback.ttf */; }; A32B6D4C1A14980500E54A65 /* iosOGLContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = A32B6D491A14980500E54A65 /* iosOGLContext.mm */; }; A32B6D4D1A14980500E54A65 /* iosOGLContextFactory.mm in Sources */ = {isa = PBXBuildFile; fileRef = A32B6D4B1A14980500E54A65 /* iosOGLContextFactory.mm */; }; + A367C93B1B17334800E2B6E7 /* resources-default in Resources */ = {isa = PBXBuildFile; fileRef = A367C93A1B17334800E2B6E7 /* resources-default */; }; A3CC2CD41A1C723900B832E1 /* LocationPredictor.mm in Sources */ = {isa = PBXBuildFile; fileRef = A3CC2CD21A1C723900B832E1 /* LocationPredictor.mm */; }; + A3F402FB1B81F537008E5F65 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 454040681AD2D8D2007A9B12 /* CoreVideo.framework */; }; B00510FB1A11015900A61AA4 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 972CDCC51887F1B7006641CA /* CFNetwork.framework */; }; B00511021A1101E000A61AA4 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97C98655186C734000AF7E9E /* AVFoundation.framework */; }; B00511041A1101F600A61AA4 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B00511031A1101F600A61AA4 /* CoreData.framework */; }; @@ -616,14 +621,15 @@ B0DFE6311A1B78A200B6C35E /* LocalNotifications.plist in Resources */ = {isa = PBXBuildFile; fileRef = B0DFE62F1A1B78A200B6C35E /* LocalNotifications.plist */; }; B0FBFA271A515AFD0086819E /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = B0FBFA261A515AFD0086819E /* ViewController.mm */; }; B0FBFA2B1A515B4C0086819E /* TableViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = B0FBFA2A1A515B4C0086819E /* TableViewController.mm */; }; + BB3E6EDE1C0327F8007EF3F8 /* resources-hdpi in Resources */ = {isa = PBXBuildFile; fileRef = BB3E6ED21C03229C007EF3F8 /* resources-hdpi */; }; + BB3E6EDF1C0327FB007EF3F8 /* resources-hdpi_clear in Resources */ = {isa = PBXBuildFile; fileRef = BB3E6ED31C03229C007EF3F8 /* resources-hdpi_clear */; }; + BB3E6EE01C0327FE007EF3F8 /* resources-hdpi_dark in Resources */ = {isa = PBXBuildFile; fileRef = BB3E6ED41C03229C007EF3F8 /* resources-hdpi_dark */; }; CB252D6F16FF82C9001E41E9 /* Statistics.mm in Sources */ = {isa = PBXBuildFile; fileRef = CB252D6C16FF82C8001E41E9 /* Statistics.mm */; }; ED48BBB517C267F5003E7E92 /* ColorPickerView.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED48BBB417C267F5003E7E92 /* ColorPickerView.mm */; }; ED48BBBA17C2B1E2003E7E92 /* CircleView.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED48BBB917C2B1E2003E7E92 /* CircleView.mm */; }; EE026F0611D6AC0D00645242 /* classificator.txt in Resources */ = {isa = PBXBuildFile; fileRef = EE026F0511D6AC0D00645242 /* classificator.txt */; }; EE164811135CEE4A003B8A3E /* 06_code2000.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EE164810135CEE49003B8A3E /* 06_code2000.ttf */; }; EE583CBB12F773F00042CBE3 /* unicode_blocks.txt in Resources */ = {isa = PBXBuildFile; fileRef = EE583CBA12F773F00042CBE3 /* unicode_blocks.txt */; }; - EE7F29811219ECA300EB67A9 /* RenderBuffer.mm in Sources */ = {isa = PBXBuildFile; fileRef = EE7F297D1219ECA300EB67A9 /* RenderBuffer.mm */; }; - EE7F29821219ECA300EB67A9 /* RenderContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = EE7F297E1219ECA300EB67A9 /* RenderContext.mm */; }; EEA61601134C496A003A9827 /* 01_dejavusans.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E5134C4968003A9827 /* 01_dejavusans.ttf */; }; EEA61603134C496A003A9827 /* 03_jomolhari-id-a3d.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E7134C4968003A9827 /* 03_jomolhari-id-a3d.ttf */; }; EEA61604134C496A003A9827 /* 04_padauk.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEA615E8134C4968003A9827 /* 04_padauk.ttf */; }; @@ -1010,8 +1016,12 @@ 34F45E8F1B96E8B100AC93F8 /* MWMSearchTabButtonsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMSearchTabButtonsView.xib; sourceTree = ""; }; 34F8ADD71B97229A004184CC /* MWMSearchTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchTableView.h; sourceTree = ""; }; 34F8ADD81B97229A004184CC /* MWMSearchTableView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchTableView.mm; sourceTree = ""; }; + 34FE4C431BCC013500066718 /* MWMMapWidgets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapWidgets.h; sourceTree = ""; }; + 34FE4C441BCC013500066718 /* MWMMapWidgets.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapWidgets.mm; sourceTree = ""; }; 3D443C9C19E421EE0025C2FC /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; 45159BF81B0CA2D5009BFA85 /* resources-6plus */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-6plus"; path = "../../data/resources-6plus"; sourceTree = ""; }; + 451950391B7A3E070085DA05 /* patterns.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = patterns.txt; path = ../../data/patterns.txt; sourceTree = ""; }; + 452FCA3A1B6A3DF7007019AB /* colors.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = colors.txt; path = ../../data/colors.txt; sourceTree = ""; }; 454040681AD2D8D2007A9B12 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; 4540406E1AD2D9C5007A9B12 /* WatchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchKit.framework; path = System/Library/Frameworks/WatchKit.framework; sourceTree = SDKROOT; }; 458287C21AD3BE2000BA8940 /* DownloadIndicatorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DownloadIndicatorProtocol.h; sourceTree = ""; }; @@ -1149,6 +1159,7 @@ A32B6D491A14980500E54A65 /* iosOGLContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = iosOGLContext.mm; path = Platform/opengl/iosOGLContext.mm; sourceTree = ""; }; A32B6D4A1A14980500E54A65 /* iosOGLContextFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iosOGLContextFactory.h; path = Platform/opengl/iosOGLContextFactory.h; sourceTree = ""; }; A32B6D4B1A14980500E54A65 /* iosOGLContextFactory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = iosOGLContextFactory.mm; path = Platform/opengl/iosOGLContextFactory.mm; sourceTree = ""; }; + A367C93A1B17334800E2B6E7 /* resources-default */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-default"; path = "../../data/resources-default"; sourceTree = ""; }; A3CC2CD21A1C723900B832E1 /* LocationPredictor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LocationPredictor.mm; sourceTree = ""; }; A3CC2CD31A1C723900B832E1 /* LocationPredictor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocationPredictor.h; sourceTree = ""; }; B00511031A1101F600A61AA4 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; @@ -1160,6 +1171,9 @@ B0FBFA261A515AFD0086819E /* ViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ViewController.mm; path = ../ViewController.mm; sourceTree = ""; }; B0FBFA291A515B4C0086819E /* TableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TableViewController.h; path = ../TableViewController.h; sourceTree = ""; }; B0FBFA2A1A515B4C0086819E /* TableViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = TableViewController.mm; path = ../TableViewController.mm; sourceTree = ""; }; + BB3E6ED21C03229C007EF3F8 /* resources-hdpi */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-hdpi"; path = "../../data/resources-hdpi"; sourceTree = ""; }; + BB3E6ED31C03229C007EF3F8 /* resources-hdpi_clear */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-hdpi_clear"; path = "../../data/resources-hdpi_clear"; sourceTree = ""; }; + BB3E6ED41C03229C007EF3F8 /* resources-hdpi_dark */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-hdpi_dark"; path = "../../data/resources-hdpi_dark"; sourceTree = ""; }; CB252D6B16FF82C8001E41E9 /* Statistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Statistics.h; sourceTree = ""; }; CB252D6C16FF82C8001E41E9 /* Statistics.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Statistics.mm; sourceTree = ""; }; ED48BBB317C267F5003E7E92 /* ColorPickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorPickerView.h; sourceTree = ""; }; @@ -1167,12 +1181,8 @@ ED48BBB817C2B1E2003E7E92 /* CircleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CircleView.h; sourceTree = ""; }; ED48BBB917C2B1E2003E7E92 /* CircleView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CircleView.mm; sourceTree = ""; }; EE026F0511D6AC0D00645242 /* classificator.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = classificator.txt; path = ../../data/classificator.txt; sourceTree = SOURCE_ROOT; }; - EE16192B126E374500622BD0 /* RenderContext.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; name = RenderContext.hpp; path = Classes/RenderContext.hpp; sourceTree = SOURCE_ROOT; }; EE164810135CEE49003B8A3E /* 06_code2000.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = 06_code2000.ttf; path = ../../data/06_code2000.ttf; sourceTree = SOURCE_ROOT; }; EE583CBA12F773F00042CBE3 /* unicode_blocks.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = unicode_blocks.txt; path = ../../data/unicode_blocks.txt; sourceTree = ""; }; - EE7F297C1219ECA300EB67A9 /* RenderBuffer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; name = RenderBuffer.hpp; path = Classes/RenderBuffer.hpp; sourceTree = SOURCE_ROOT; }; - EE7F297D1219ECA300EB67A9 /* RenderBuffer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; name = RenderBuffer.mm; path = Classes/RenderBuffer.mm; sourceTree = SOURCE_ROOT; }; - EE7F297E1219ECA300EB67A9 /* RenderContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; name = RenderContext.mm; path = Classes/RenderContext.mm; sourceTree = SOURCE_ROOT; }; EEA615E5134C4968003A9827 /* 01_dejavusans.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = 01_dejavusans.ttf; path = ../../data/01_dejavusans.ttf; sourceTree = SOURCE_ROOT; }; EEA615E7134C4968003A9827 /* 03_jomolhari-id-a3d.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "03_jomolhari-id-a3d.ttf"; path = "../../data/03_jomolhari-id-a3d.ttf"; sourceTree = SOURCE_ROOT; }; EEA615E8134C4968003A9827 /* 04_padauk.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = 04_padauk.ttf; path = ../../data/04_padauk.ttf; sourceTree = SOURCE_ROOT; }; @@ -1575,6 +1585,7 @@ isa = PBXGroup; children = ( F607C18B1C047FCA00B53A87 /* Segue */, + 34FE4C421BCC013500066718 /* Widgets */, 346EDAD81B9F0E15004F8DB5 /* Components */, 340837101B7243B500B5C185 /* Share */, 340F24601B1490ED00F874CD /* RouteState */, @@ -1592,10 +1603,6 @@ B0FBFA2A1A515B4C0086819E /* TableViewController.mm */, 978F9251183BD530000D6C7C /* NavigationController.h */, 978F9252183BD530000D6C7C /* NavigationController.mm */, - EE7F297C1219ECA300EB67A9 /* RenderBuffer.hpp */, - EE7F297D1219ECA300EB67A9 /* RenderBuffer.mm */, - EE16192B126E374500622BD0 /* RenderContext.hpp */, - EE7F297E1219ECA300EB67A9 /* RenderContext.mm */, 46F26CD610F623BA00ECCA39 /* EAGLView.h */, 46F26CD710F623BA00ECCA39 /* EAGLView.mm */, 1D3623240D0F684500981E51 /* MapsAppDelegate.h */, @@ -1680,7 +1687,6 @@ 34921F691BFA0CDC00737D6E /* MyTargetSDKCorp.framework */, 6741AAA21BF356B9002C974C /* libagg.a */, 6741AAA31BF356B9002C974C /* libalohalitics.a */, - 6741AAA41BF356B9002C974C /* libanim.a */, 6741AAA51BF356B9002C974C /* libapi.a */, 6741AAA61BF356B9002C974C /* libbase.a */, 6741AAA71BF356B9002C974C /* libcoding.a */, @@ -1688,8 +1694,6 @@ 6741AAA91BF356B9002C974C /* libfreetype.a */, 6741AAAA1BF356B9002C974C /* libfribidi.a */, 6741AAAB1BF356B9002C974C /* libgeometry.a */, - 6741AAAC1BF356B9002C974C /* libgraphics.a */, - 6741AAAD1BF356B9002C974C /* libgui.a */, 6741AAAE1BF356B9002C974C /* libindexer.a */, 6741AAAF1BF356B9002C974C /* libjansson.a */, 6741AAB01BF356B9002C974C /* liblodepng.a */, @@ -1699,7 +1703,6 @@ 6741AAB41BF356B9002C974C /* libosrm.a */, 6741AAB51BF356B9002C974C /* libplatform.a */, 6741AAB61BF356BA002C974C /* libprotobuf.a */, - 6741AAB71BF356BA002C974C /* librender.a */, 6741AAB81BF356BA002C974C /* librouting.a */, 6741AAB91BF356BA002C974C /* libsearch.a */, 6741AABA1BF356BA002C974C /* libstorage.a */, @@ -2149,6 +2152,15 @@ path = RoutePreview; sourceTree = ""; }; + 34FE4C421BCC013500066718 /* Widgets */ = { + isa = PBXGroup; + children = ( + 34FE4C431BCC013500066718 /* MWMMapWidgets.h */, + 34FE4C441BCC013500066718 /* MWMMapWidgets.mm */, + ); + path = Widgets; + sourceTree = ""; + }; 560634EF1B787EBE00F3D670 /* Sound */ = { isa = PBXGroup; children = ( @@ -2727,6 +2739,7 @@ F607C1841C032A8800B53A87 /* resources-hdpi_dark */, 4A7D89C31B2EBF3B00AC843E /* resources-xhdpi_dark */, 4A7D89C41B2EBF3B00AC843E /* resources-xxhdpi_dark */, + A367C93A1B17334800E2B6E7 /* resources-default */, 45159BF81B0CA2D5009BFA85 /* resources-6plus */, 4A00DBDE1AB704C400113624 /* drules_proto_dark.bin */, 97A5967E19B9CD47007A963F /* copyright.html */, @@ -2739,6 +2752,8 @@ 97FC99DB19C1A2CD00C1CF98 /* resources-xxhdpi */, FAAFD696139D9BE2000AE70C /* categories.txt */, FA64D9A813F975AD00350ECF /* types.txt */, + 452FCA3A1B6A3DF7007019AB /* colors.txt */, + 451950391B7A3E070085DA05 /* patterns.txt */, FAF30A94173AB23900818BF6 /* 00_roboto_regular.ttf */, EEA615E5134C4968003A9827 /* 01_dejavusans.ttf */, 9DF04B231B71010E00DACAF1 /* 02_droidsans-fallback.ttf */, @@ -3037,7 +3052,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4519503A1B7A3E070085DA05 /* patterns.txt in Resources */, 5605022F1B6211E100169CAD /* sound-strings in Resources */, + 452FCA3B1B6A3DF7007019AB /* colors.txt in Resources */, F67BC26F1B254B2000FE1D7B /* MWMPlacePageDescriptionView.xib in Resources */, 342BB7AB1BC7CC5C00DF6443 /* PlacePageBookmarkCell.xib in Resources */, EE026F0611D6AC0D00645242 /* classificator.txt in Resources */, @@ -3064,6 +3081,7 @@ EEA61605134C496A003A9827 /* 05_khmeros.ttf in Resources */, 347274731B0F4EE000756B37 /* me.maps.entitlements in Resources */, 3476B8E01BFDD33A00874594 /* tts-how-to-set-up-voice-img in Resources */, + A367C93B1B17334800E2B6E7 /* resources-default in Resources */, EE164811135CEE4A003B8A3E /* 06_code2000.ttf in Resources */, FAAFD697139D9BE2000AE70C /* categories.txt in Resources */, FA64D9A913F975AD00350ECF /* types.txt in Resources */, @@ -3196,8 +3214,10 @@ 6741A9461BF340DE002C974C /* MWMSearchTabbedViewController.xib in Resources */, 6741A9471BF340DE002C974C /* MWMSearchCategoryCell.xib in Resources */, 6741A9481BF340DE002C974C /* MWMSearchTabbedCollectionViewCell.xib in Resources */, + BB3E6EDF1C0327FB007EF3F8 /* resources-hdpi_clear in Resources */, 6741A9491BF340DE002C974C /* countries.txt in Resources */, 6741A94A1BF340DE002C974C /* resources-6plus_clear in Resources */, + BB3E6EE01C0327FE007EF3F8 /* resources-hdpi_dark in Resources */, 6741A94B1BF340DE002C974C /* unicode_blocks.txt in Resources */, 6741A94C1BF340DE002C974C /* fonts_blacklist.txt in Resources */, 6741A94D1BF340DE002C974C /* resources-xxhdpi_clear in Resources */, @@ -3277,6 +3297,7 @@ 6741A9921BF340DE002C974C /* PlacePageActionBar.xib in Resources */, 6741A9931BF340DE002C974C /* MWMSearchTabButtonsView.xib in Resources */, 6741A9941BF340DE002C974C /* MWMPortraitNavigationDashboard.xib in Resources */, + BB3E6EDE1C0327F8007EF3F8 /* resources-hdpi in Resources */, 6741A9951BF340DE002C974C /* MWMDownloaderDialogCell.xib in Resources */, 6741A9961BF340DE002C974C /* MWMSearchTableViewController.xib in Resources */, 6741A9971BF340DE002C974C /* MWMBookmarkDescriptionViewController.xib in Resources */, @@ -3295,6 +3316,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 452FCA3E1B6A3E83007019AB /* colors.txt in Resources */, + 4519503B1B7A3E390085DA05 /* patterns.txt in Resources */, F6C7B7141BA8443C004233F4 /* drules_proto_clear.bin in Resources */, F6C7B7121BA840A4004233F4 /* resources-xhdpi_clear in Resources */, F6C7B7131BA840A4004233F4 /* resources-xhdpi_dark in Resources */, @@ -3401,11 +3424,11 @@ F61579341AC2CE9A0032D8E9 /* MWMRateAlert.mm in Sources */, F6BB6CC61BB18C0900DF1DF2 /* MWMRoutePointCell.m in Sources */, A3CC2CD41A1C723900B832E1 /* LocationPredictor.mm in Sources */, - EE7F29811219ECA300EB67A9 /* RenderBuffer.mm in Sources */, 6C93FAEC1AD8063900A2C4AE /* MWMWatchNotification.mm in Sources */, F62404FB1AAF3DB200B58DB6 /* UILabel+RuntimeAttributes.mm in Sources */, 34CC4C0E1B82069C00E44C1F /* MWMSearchTabbedCollectionViewCell.mm in Sources */, F6588E2C1B15C26700EE1E58 /* MWMTextView.mm in Sources */, + 34FE4C451BCC013500066718 /* MWMMapWidgets.mm in Sources */, F61B0F2C1B8B82DB00C08258 /* MWMNextTurnPanel.mm in Sources */, F6F722F81AE1572400DA3DA1 /* MWMiPhonePortraitPlacePage.mm in Sources */, F6CB21681AEFC6AA00FB8963 /* MWMPlacePageActionBar.mm in Sources */, @@ -3422,7 +3445,6 @@ 34CFFE8B1B7DE6FD009D0C9F /* MWMSearchManager.mm in Sources */, F6BBF2C61B4FFB72000CF8E2 /* MWMLocationAlert.mm in Sources */, F66A8FB01B09F268001B9C97 /* MWMPlacePage.mm in Sources */, - EE7F29821219ECA300EB67A9 /* RenderContext.mm in Sources */, F6ED13911B1EF96B0095C6DE /* MWMBookmarkDescriptionViewController.mm in Sources */, 349A35851B53E967009677EE /* MWMDownloadMapRequestView.mm in Sources */, F64F19991AB81A00006EAF7E /* MWMAlertViewController.mm in Sources */, @@ -3723,8 +3745,6 @@ F6C6FE201AD6BEA0009FDED7 /* MWMWatchLocationTracker.mm in Sources */, 34DF4D111AE77B9F0012702D /* MWMWKInterfaceController.mm in Sources */, 343F262E1AEFC4A300388A6D /* MWMFrameworkUtils.mm in Sources */, - 45FE96831AD315EF00CB7560 /* RenderBuffer.mm in Sources */, - 454040701AD2DB30007A9B12 /* RenderContext.mm in Sources */, 345C31791AE799B600EA0CC2 /* MWMSearchResultController.mm in Sources */, 345C31721AE798DD00EA0CC2 /* MWMCategoriesInterfaceController.mm in Sources */, ); @@ -3963,43 +3983,6 @@ }; name = Debug; }; - 6741A8E61BF3407C002C974C /* Drape Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_MODULES = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IBSC_MODULE = maps_me_beta_WatchKit_Extension; - INFOPLIST_FILE = "$(SRCROOT)/maps.me WatchKit App/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER).watchkitapp"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; - }; - name = "Drape Debug"; - }; 6741A8E71BF3407C002C974C /* AdHoc */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4075,43 +4058,6 @@ }; name = Release; }; - 6741A8E91BF3407C002C974C /* Drape Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_MODULES = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IBSC_MODULE = maps_me_beta_WatchKit_Extension; - INFOPLIST_FILE = "$(SRCROOT)/maps.me WatchKit App/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER).watchkitapp"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; - }; - name = "Drape Release"; - }; 6741A8EA1BF3407C002C974C /* Production Full */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4201,23 +4147,6 @@ }; name = Debug; }; - 6741A9361BF340D1002C974C /* Drape Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = "maps.me WatchKit Extension/Entitlements/me.maps.watchkitextension.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - INFOPLIST_FILE = "$(SRCROOT)/maps.me WatchKit Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - LIBRARY_SEARCH_PATHS = ""; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER).watchkitextension"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - }; - name = "Drape Debug"; - }; 6741A9371BF340D1002C974C /* AdHoc */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4253,23 +4182,6 @@ }; name = Release; }; - 6741A9391BF340D1002C974C /* Drape Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = "maps.me WatchKit Extension/Entitlements/me.maps.watchkitextension.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - INFOPLIST_FILE = "$(SRCROOT)/maps.me WatchKit Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - LIBRARY_SEARCH_PATHS = ""; - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER).watchkitextension"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - }; - name = "Drape Release"; - }; 6741A93A1BF340D1002C974C /* Production Full */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4383,38 +4295,6 @@ }; name = Debug; }; - 6741AA581BF340DE002C974C /* Drape Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_ENTITLEMENTS = Entitlements/me.maps.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/PushNotifications", - "$(PROJECT_DIR)/Statistics", - "$(PROJECT_DIR)", - ); - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = "$(SRCROOT)/MAPSME.plist"; - LIBRARY_SEARCH_PATHS = ( - "$(PROJECT_DIR)/MyTracker", - "$(PROJECT_DIR)/Statistics", - ); - OTHER_CFLAGS = ( - "-Wall", - "-Wno-unused-local-typedef", - "-Wimplicit-retain-self", - ); - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - }; - name = "Drape Debug"; - }; 6741AA591BF340DE002C974C /* AdHoc */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4479,38 +4359,6 @@ }; name = Release; }; - 6741AA5B1BF340DE002C974C /* Drape Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_ENTITLEMENTS = Entitlements/me.maps.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/PushNotifications", - "$(PROJECT_DIR)/Statistics", - "$(PROJECT_DIR)", - ); - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = "$(SRCROOT)/MAPSME.plist"; - LIBRARY_SEARCH_PATHS = ( - "$(PROJECT_DIR)/MyTracker", - "$(PROJECT_DIR)/Statistics", - ); - OTHER_CFLAGS = ( - "-Wall", - "-Wno-unused-local-typedef", - "-Wimplicit-retain-self", - ); - OTHER_LDFLAGS = ""; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - }; - name = "Drape Release"; - }; 6741AA5C1BF340DE002C974C /* Production Full */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4543,257 +4391,6 @@ }; name = "Production Full"; }; - A32B6D4E1A14A7B700E54A65 /* Drape Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_IDENTIFIER = com.mapswithme.full.release; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 5.2; - ENABLE_BITCODE = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Statistics"; - GCC_ENABLE_PASCAL_STRINGS = NO; - GCC_FAST_MATH = YES; - GCC_INLINES_ARE_PRIVATE_EXTERN = YES; - GCC_OPTIMIZATION_LEVEL = 3; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Maps_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ( - NDEBUG, - RELEASE, - _RELEASE, - TARGET_OS_IPHONE, - "NS_BLOCK_ASSERTIONS=1", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - GCC_UNROLL_LOOPS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../../3party/boost, - ../../, - ); - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - LIBRARY_SEARCH_PATHS = ( - "\"$(SRCROOT)/../../../omim-iphone-release-drape-$(CURRENT_ARCH)/out/release\"", - "$(PROJECT_DIR)/MyTracker", - "$(PROJECT_DIR)/Statistics", - ); - OTHER_CFLAGS = ( - "-Wall", - "-Wno-unused-local-typedef", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DUSE_DRAPE", - ); - OTHER_LDFLAGS = ( - "-lstats_client", - "-lmap", - "-lrender", - "-lsearch", - "-lgui", - "-ldrape_frontend", - "-ldrape", - "-lgraphics", - "-lstorage", - "-lrouting", - "-lindexer", - "-lanim", - "-lplatform", - "-lgeometry", - "-lcoding", - "-lbase", - "-lfreetype", - "-lfribidi", - "-lminizip", - "-ljansson", - "-ltomcrypt", - "-lexpat", - "-lprotobuf", - "-losrm", - "-lsuccinct", - "-ObjC", - "-lopening_hours", - ); - PRODUCT_NAME = "maps.me drape rel"; - SDKROOT = iphoneos; - STRIP_INSTALLED_PRODUCT = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Drape Release"; - }; - A32B6D4F1A14A7B700E54A65 /* Drape Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_ENTITLEMENTS = Entitlements/me.maps.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/PushNotifications", - "$(PROJECT_DIR)/Statistics", - "$(PROJECT_DIR)", - ); - INFOPLIST_FILE = MAPSME.plist; - OTHER_CFLAGS = ( - "-Wall", - "-Wno-unused-local-typedef", - "-Wimplicit-retain-self", - ); - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; - PROVISIONING_PROFILE = ""; - }; - name = "Drape Release"; - }; - A32B6D5F1A14C16500E54A65 /* Drape Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_IDENTIFIER = com.mapswithme.full.debug; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 5.2; - ENABLE_BITCODE = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Statistics"; - GCC_ENABLE_PASCAL_STRINGS = NO; - GCC_FAST_MATH = YES; - GCC_INLINES_ARE_PRIVATE_EXTERN = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Maps_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ( - DEBUG, - _DEBUG, - TARGET_OS_IPHONE, - ); - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../../3party/boost, - ../../, - ); - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - LIBRARY_SEARCH_PATHS = ( - "\"$(SRCROOT)/../../../omim-iphone-debug-drape-$(CURRENT_ARCH)/out/debug\"", - "$(PROJECT_DIR)/MyTracker", - "$(PROJECT_DIR)/Statistics", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "-Wall", - "-Wno-unused-local-typedef", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DUSE_DRAPE", - ); - OTHER_LDFLAGS = ( - "-lstats_client", - "-lmap", - "-lrender", - "-ldrape_frontend", - "-ldrape", - "-lsearch", - "-lgui", - "-lgraphics", - "-lstorage", - "-lrouting", - "-lindexer", - "-lanim", - "-lplatform", - "-lgeometry", - "-lcoding", - "-lbase", - "-lfreetype", - "-lfribidi", - "-lminizip", - "-ljansson", - "-ltomcrypt", - "-lexpat", - "-lprotobuf", - "-losrm", - "-lsuccinct", - "-ObjC", - "-lopening_hours", - ); - PRODUCT_NAME = "maps.me drape dbg"; - SDKROOT = iphoneos; - STRIP_INSTALLED_PRODUCT = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Drape Debug"; - }; - A32B6D601A14C16500E54A65 /* Drape Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_ENTITLEMENTS = Entitlements/me.maps.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/PushNotifications", - "$(PROJECT_DIR)/Statistics", - "$(PROJECT_DIR)", - ); - INFOPLIST_FILE = MAPSME.plist; - OTHER_CFLAGS = ( - "-Wall", - "-Wno-unused-local-typedef", - "-Wimplicit-retain-self", - ); - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; - PROVISIONING_PROFILE = ""; - }; - name = "Drape Debug"; - }; F6D434601AD2AB97007C7728 /* Simulator */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4839,21 +4436,6 @@ }; name = Debug; }; - F6D434631AD2AB97007C7728 /* Drape Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = "maps.me WatchKit Extension/Entitlements/me.maps.watchkitextension.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - INFOPLIST_FILE = "$(SRCROOT)/maps.me WatchKit Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER).watchkitextension"; - PRODUCT_NAME = "$(TARGET_NAME) WatchKit Extension"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - }; - name = "Drape Debug"; - }; F6D434641AD2AB97007C7728 /* AdHoc */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4884,21 +4466,6 @@ }; name = Release; }; - F6D434661AD2AB97007C7728 /* Drape Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = "maps.me WatchKit Extension/Entitlements/me.maps.watchkitextension.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - INFOPLIST_FILE = "$(SRCROOT)/maps.me WatchKit Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER).watchkitextension"; - PRODUCT_NAME = "$(TARGET_NAME) WatchKit Extension"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - }; - name = "Drape Release"; - }; F6D434671AD2AB97007C7728 /* Production Full */ = { isa = XCBuildConfiguration; buildSettings = { @@ -5030,42 +4597,6 @@ }; name = Debug; }; - F6D4346B1AD2AB97007C7728 /* Drape Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_MODULES = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IBSC_MODULE = maps_me_beta_WatchKit_Extension; - INFOPLIST_FILE = "$(SRCROOT)/maps.me WatchKit App/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}.watchkitapp"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; - }; - name = "Drape Debug"; - }; F6D4346C1AD2AB97007C7728 /* AdHoc */ = { isa = XCBuildConfiguration; buildSettings = { @@ -5138,42 +4669,6 @@ }; name = Release; }; - F6D4346E1AD2AB97007C7728 /* Drape Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_MODULES = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IBSC_MODULE = maps_me_beta_WatchKit_Extension; - INFOPLIST_FILE = "$(SRCROOT)/maps.me WatchKit App/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}.watchkitapp"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; - }; - name = "Drape Release"; - }; F6D4346F1AD2AB97007C7728 /* Production Full */ = { isa = XCBuildConfiguration; buildSettings = { @@ -5255,6 +4750,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../../3party/boost, + ../../3party/glm, ../../, ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -5271,14 +4767,12 @@ OTHER_LDFLAGS = ( "-lstats_client", "-lmap", - "-lrender", "-lsearch", - "-lgui", - "-lgraphics", + "-ldrape_frontend", + "-ldrape", "-lstorage", "-lrouting", "-lindexer", - "-lanim", "-lplatform", "-lgeometry", "-lcoding", @@ -5375,6 +4869,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../../3party/boost, + ../../3party/glm, ../../, ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -5392,14 +4887,12 @@ OTHER_LDFLAGS = ( "-lstats_client", "-lmap", - "-lrender", "-lsearch", - "-lgui", - "-lgraphics", + "-ldrape_frontend", + "-ldrape", "-lstorage", "-lrouting", "-lindexer", - "-lanim", "-lplatform", "-lgeometry", "-lcoding", @@ -5499,6 +4992,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../../3party/boost, + ../../3party/glm, ../../, ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -5515,14 +5009,12 @@ OTHER_LDFLAGS = ( "-lstats_client", "-lmap", - "-lrender", "-lsearch", - "-lgui", - "-lgraphics", + "-ldrape_frontend", + "-ldrape", "-lstorage", "-lrouting", "-lindexer", - "-lanim", "-lplatform", "-lgeometry", "-lcoding", @@ -5623,6 +5115,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../../3party/boost, + ../../3party/glm, ../../, ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -5639,14 +5132,12 @@ OTHER_LDFLAGS = ( "-lstats_client", "-lmap", - "-lrender", "-lsearch", - "-lgui", - "-lgraphics", + "-ldrape_frontend", + "-ldrape", "-lstorage", "-lrouting", "-lindexer", - "-lanim", "-lplatform", "-lgeometry", "-lcoding", @@ -5745,6 +5236,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../../3party/boost, + ../../3party/glm, ../../, ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -5762,14 +5254,12 @@ OTHER_LDFLAGS = ( "-lstats_client", "-lmap", - "-lrender", "-lsearch", - "-lgui", - "-lgraphics", + "-ldrape_frontend", + "-ldrape", "-lstorage", "-lrouting", "-lindexer", - "-lanim", "-lplatform", "-lgeometry", "-lcoding", @@ -5867,6 +5357,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../../3party/boost, + ../../3party/glm, ../../, ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -5883,14 +5374,12 @@ OTHER_LDFLAGS = ( "-lstats_client", "-lmap", - "-lrender", "-lsearch", - "-lgui", - "-lgraphics", + "-ldrape_frontend", + "-ldrape", "-lstorage", "-lrouting", "-lindexer", - "-lanim", "-lplatform", "-lgeometry", "-lcoding", @@ -5950,10 +5439,8 @@ FAAB411A149BA83500C245B1 /* Simulator */, FACFE54515F8F35600CE8B20 /* Simulator Release */, FAAB411C149BA84700C245B1 /* Debug */, - A32B6D601A14C16500E54A65 /* Drape Debug */, FAAB411E149BA85500C245B1 /* AdHoc */, FABB561F149CD957006969C0 /* Release */, - A32B6D4F1A14A7B700E54A65 /* Drape Release */, FAAB4120149BA86000C245B1 /* Production Full */, ); defaultConfigurationIsVisible = 0; @@ -5965,10 +5452,8 @@ 6741A8E31BF3407C002C974C /* Simulator */, 6741A8E41BF3407C002C974C /* Simulator Release */, 6741A8E51BF3407C002C974C /* Debug */, - 6741A8E61BF3407C002C974C /* Drape Debug */, 6741A8E71BF3407C002C974C /* AdHoc */, 6741A8E81BF3407C002C974C /* Release */, - 6741A8E91BF3407C002C974C /* Drape Release */, 6741A8EA1BF3407C002C974C /* Production Full */, ); defaultConfigurationIsVisible = 0; @@ -5980,10 +5465,8 @@ 6741A9331BF340D1002C974C /* Simulator */, 6741A9341BF340D1002C974C /* Simulator Release */, 6741A9351BF340D1002C974C /* Debug */, - 6741A9361BF340D1002C974C /* Drape Debug */, 6741A9371BF340D1002C974C /* AdHoc */, 6741A9381BF340D1002C974C /* Release */, - 6741A9391BF340D1002C974C /* Drape Release */, 6741A93A1BF340D1002C974C /* Production Full */, ); defaultConfigurationIsVisible = 0; @@ -5995,10 +5478,8 @@ 6741AA551BF340DE002C974C /* Simulator */, 6741AA561BF340DE002C974C /* Simulator Release */, 6741AA571BF340DE002C974C /* Debug */, - 6741AA581BF340DE002C974C /* Drape Debug */, 6741AA591BF340DE002C974C /* AdHoc */, 6741AA5A1BF340DE002C974C /* Release */, - 6741AA5B1BF340DE002C974C /* Drape Release */, 6741AA5C1BF340DE002C974C /* Production Full */, ); defaultConfigurationIsVisible = 0; @@ -6010,10 +5491,8 @@ FAAB4119149BA83500C245B1 /* Simulator */, FACFE54415F8F35600CE8B20 /* Simulator Release */, FAAB411B149BA84700C245B1 /* Debug */, - A32B6D5F1A14C16500E54A65 /* Drape Debug */, FAAB411D149BA85500C245B1 /* AdHoc */, FABB561E149CD957006969C0 /* Release */, - A32B6D4E1A14A7B700E54A65 /* Drape Release */, FAAB411F149BA86000C245B1 /* Production Full */, ); defaultConfigurationIsVisible = 0; @@ -6025,10 +5504,8 @@ F6D434681AD2AB97007C7728 /* Simulator */, F6D434691AD2AB97007C7728 /* Simulator Release */, F6D4346A1AD2AB97007C7728 /* Debug */, - F6D4346B1AD2AB97007C7728 /* Drape Debug */, F6D4346C1AD2AB97007C7728 /* AdHoc */, F6D4346D1AD2AB97007C7728 /* Release */, - F6D4346E1AD2AB97007C7728 /* Drape Release */, F6D4346F1AD2AB97007C7728 /* Production Full */, ); defaultConfigurationIsVisible = 0; @@ -6040,10 +5517,8 @@ F6D434601AD2AB97007C7728 /* Simulator */, F6D434611AD2AB97007C7728 /* Simulator Release */, F6D434621AD2AB97007C7728 /* Debug */, - F6D434631AD2AB97007C7728 /* Drape Debug */, F6D434641AD2AB97007C7728 /* AdHoc */, F6D434651AD2AB97007C7728 /* Release */, - F6D434661AD2AB97007C7728 /* Drape Release */, F6D434671AD2AB97007C7728 /* Production Full */, ); defaultConfigurationIsVisible = 0; diff --git a/iphone/Maps/Platform/opengl/iosOGLContext.h b/iphone/Maps/Platform/opengl/iosOGLContext.h index af7a43b6fa..24f905f551 100644 --- a/iphone/Maps/Platform/opengl/iosOGLContext.h +++ b/iphone/Maps/Platform/opengl/iosOGLContext.h @@ -1,6 +1,6 @@ #pragma once -#import "../../../../drape/oglcontext.hpp" +#import "drape/oglcontext.hpp" #import #import diff --git a/iphone/Maps/Platform/opengl/iosOGLContext.mm b/iphone/Maps/Platform/opengl/iosOGLContext.mm index bdbe7c7cdc..0ec7e221de 100644 --- a/iphone/Maps/Platform/opengl/iosOGLContext.mm +++ b/iphone/Maps/Platform/opengl/iosOGLContext.mm @@ -1,6 +1,8 @@ #import "iosOGLContext.h" -#import "../../../../base/assert.hpp" -#import "../../../../base/logging.cpp" +#import "base/assert.hpp" +#import "base/logging.cpp" + +#import "drape/glfunctions.hpp" iosOGLContext::iosOGLContext(CAEAGLLayer * layer, iosOGLContext * contextToShareWith, bool needBuffers) : m_layer(layer) @@ -39,8 +41,13 @@ void iosOGLContext::present() ASSERT(m_nativeContext != NULL, ()); ASSERT(m_renderBufferId, ()); + GLenum const discards[] = { GL_DEPTH_ATTACHMENT, GL_COLOR_ATTACHMENT0 }; + GLCHECK(glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards)); + glBindRenderbuffer(GL_RENDERBUFFER, m_renderBufferId); [m_nativeContext presentRenderbuffer: GL_RENDERBUFFER]; + + GLCHECK(glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards + 1)); } void iosOGLContext::setDefaultFramebuffer() @@ -49,10 +56,17 @@ void iosOGLContext::setDefaultFramebuffer() glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferId); } -void iosOGLContext::resize(int /*w*/, int /*h*/) +void iosOGLContext::resize(int w, int h) { if (m_needBuffers && m_hasBuffers) { + GLint width = 0; + GLint height = 0; + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width); + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height); + if (width == w && height == h) + return; + destroyBuffers(); initBuffers(); } diff --git a/iphone/Maps/Platform/opengl/iosOGLContextFactory.h b/iphone/Maps/Platform/opengl/iosOGLContextFactory.h index 2877f57aa3..928454ffcb 100644 --- a/iphone/Maps/Platform/opengl/iosOGLContextFactory.h +++ b/iphone/Maps/Platform/opengl/iosOGLContextFactory.h @@ -12,6 +12,9 @@ public: virtual dp::OGLContext * getDrawContext(); virtual dp::OGLContext * getResourcesUploadContext(); + virtual bool isDrawContextCreated() const; + virtual bool isUploadContextCreated() const; + private: CAEAGLLayer * m_layer; iosOGLContext * m_drawContext; diff --git a/iphone/Maps/Platform/opengl/iosOGLContextFactory.mm b/iphone/Maps/Platform/opengl/iosOGLContextFactory.mm index 17cdc38ed0..501f3c3ccf 100644 --- a/iphone/Maps/Platform/opengl/iosOGLContextFactory.mm +++ b/iphone/Maps/Platform/opengl/iosOGLContextFactory.mm @@ -12,7 +12,6 @@ iosOGLContextFactory::~iosOGLContextFactory() delete m_uploadContext; } - dp::OGLContext * iosOGLContextFactory::getDrawContext() { if (m_drawContext == NULL) @@ -26,3 +25,13 @@ dp::OGLContext * iosOGLContextFactory::getResourcesUploadContext() m_uploadContext = new iosOGLContext(m_layer, m_drawContext, false); return m_uploadContext; } + +bool iosOGLContextFactory::isDrawContextCreated() const +{ + return m_drawContext != nullptr; +} + +bool iosOGLContextFactory::isUploadContextCreated() const +{ + return m_uploadContext != nullptr; +} diff --git a/iphone/Maps/Settings/Preferences.mm b/iphone/Maps/Settings/Preferences.mm index d080b3402e..402962e9df 100644 --- a/iphone/Maps/Settings/Preferences.mm +++ b/iphone/Maps/Settings/Preferences.mm @@ -22,15 +22,14 @@ + (void)setup:(id)controller { Settings::Units u; - if (!Settings::Get("Units", u)) + if (!Settings::Get("Units", u)) { // get system locale preferences BOOL const isMetric = [[[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleUsesMetricSystem] boolValue]; if (isMetric) { u = Settings::Metric; - [controller setupMeasurementSystem]; - } + } else { u = Settings::Foot; @@ -38,11 +37,10 @@ PrefDelegate * d = [[PrefDelegate alloc] init]; d.m_controller = controller; } - + Settings::Set("Units", u); } - else - [controller setupMeasurementSystem]; + GetFramework().SetupMeasurementSystem(); } -@end +@end \ No newline at end of file diff --git a/iphone/Maps/Settings/SettingsViewController.mm b/iphone/Maps/Settings/SettingsViewController.mm index 7195f90460..dc6a28be37 100644 --- a/iphone/Maps/Settings/SettingsViewController.mm +++ b/iphone/Maps/Settings/SettingsViewController.mm @@ -62,7 +62,6 @@ typedef NS_ENUM(NSUInteger, Section) - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - GetFramework().Invalidate(true); } #pragma mark - Table view data source @@ -224,7 +223,7 @@ Settings::Units unitsForIndex(NSInteger index) withParameters:@{kStatValue : (units == Settings::Units::Metric ? kStatKilometers : kStatMiles)}]; Settings::Set("Units", units); [tableView reloadSections:[NSIndexSet indexSetWithIndex:SectionMetrics] withRowAnimation:UITableViewRowAnimationFade]; - [[MapsAppDelegate theApp].mapViewController setupMeasurementSystem]; + GetFramework().SetupMeasurementSystem(); } else if (section == SectionRouting && indexPath.row == 1) { diff --git a/iphone/Maps/ar.lproj/Localizable.strings b/iphone/Maps/ar.lproj/Localizable.strings index dfbf209220..ba41927a21 100644 --- a/iphone/Maps/ar.lproj/Localizable.strings +++ b/iphone/Maps/ar.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nقد تم إضاÙته الى ص٠الانتظار لعملية التنزيل"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "جاري التنزيل\n^\n^%"; +"country_status_downloading" = "جاري التنزيل\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "(^ ^)\nتحميل الخريطة"; diff --git a/iphone/Maps/cs.lproj/Localizable.strings b/iphone/Maps/cs.lproj/Localizable.strings index 6a3642f6bc..66873ab64d 100644 --- a/iphone/Maps/cs.lproj/Localizable.strings +++ b/iphone/Maps/cs.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\npÅ™idáno do fronty stahování"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Stahování\n^\n^%"; +"country_status_downloading" = "Stahování\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Stáhnout mapu\n(^ ^)"; diff --git a/iphone/Maps/da.lproj/Localizable.strings b/iphone/Maps/da.lproj/Localizable.strings index 1722520745..eafaf88b07 100644 --- a/iphone/Maps/da.lproj/Localizable.strings +++ b/iphone/Maps/da.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\ner tilføjet til download-køen"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Downloader\n^\n^%"; +"country_status_downloading" = "Downloader\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Download kort\n(^ ^)"; diff --git a/iphone/Maps/de.lproj/Localizable.strings b/iphone/Maps/de.lproj/Localizable.strings index 3056179fb0..774aa899e4 100644 --- a/iphone/Maps/de.lproj/Localizable.strings +++ b/iphone/Maps/de.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nwird zur Download-Warteschleife hinzugefügt"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Wird heruntergeladen\n^\n^%"; +"country_status_downloading" = "Wird heruntergeladen\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Karte herunterladen\n(^ ^)"; diff --git a/iphone/Maps/en.lproj/Localizable.strings b/iphone/Maps/en.lproj/Localizable.strings index 767d999433..5bd94bf0a9 100644 --- a/iphone/Maps/en.lproj/Localizable.strings +++ b/iphone/Maps/en.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nis added to the downloading queue."; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Downloading\n^\n^%"; +"country_status_downloading" = "Downloading\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Download Map\n(^ ^)"; diff --git a/iphone/Maps/es.lproj/Localizable.strings b/iphone/Maps/es.lproj/Localizable.strings index 6ee2262788..483d1eee22 100644 --- a/iphone/Maps/es.lproj/Localizable.strings +++ b/iphone/Maps/es.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nañadido a la cola de descarga"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Descargando\n^\n^%"; +"country_status_downloading" = "Descargando\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Descargar mapa\n(^ ^)"; diff --git a/iphone/Maps/fi.lproj/Localizable.strings b/iphone/Maps/fi.lproj/Localizable.strings index 4a8df45fc6..4068c70a0c 100644 --- a/iphone/Maps/fi.lproj/Localizable.strings +++ b/iphone/Maps/fi.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\non lisätty latausjonoon."; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Ladataan\n^\n^%"; +"country_status_downloading" = "Ladataan\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Lataa kartta\n(^ ^)"; diff --git a/iphone/Maps/fr.lproj/Localizable.strings b/iphone/Maps/fr.lproj/Localizable.strings index 19db4f19a8..5677bb3c3d 100644 --- a/iphone/Maps/fr.lproj/Localizable.strings +++ b/iphone/Maps/fr.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nest ajouté à la file de téléchargement"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Téléchargement de\n^\n^%"; +"country_status_downloading" = "Téléchargement de\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Téléchargez la carte\n(^ ^)"; diff --git a/iphone/Maps/hu.lproj/Localizable.strings b/iphone/Maps/hu.lproj/Localizable.strings index 13fa409f3d..f89d349007 100644 --- a/iphone/Maps/hu.lproj/Localizable.strings +++ b/iphone/Maps/hu.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\n-t hozzáadtuk a letöltési sorhoz"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "^\n^%\nletöltése folyamatban"; +"country_status_downloading" = "^\n^\nletöltése folyamatban"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Térkép letöltése\n(^ ^)"; diff --git a/iphone/Maps/id.lproj/Localizable.strings b/iphone/Maps/id.lproj/Localizable.strings index c93b748f7c..e38691e134 100644 --- a/iphone/Maps/id.lproj/Localizable.strings +++ b/iphone/Maps/id.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\ntelah ditambahkan ke antrean pengunduhan."; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Sedang mengunduh\n^\n^%"; +"country_status_downloading" = "Sedang mengunduh\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Unduh Peta\n(^ ^)"; diff --git a/iphone/Maps/it.lproj/Localizable.strings b/iphone/Maps/it.lproj/Localizable.strings index d506581337..74db5a9593 100644 --- a/iphone/Maps/it.lproj/Localizable.strings +++ b/iphone/Maps/it.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\naggiunto alla coda di download"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Sto scaricando\n^\n^%"; +"country_status_downloading" = "Sto scaricando\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Scarica Map\n(^ ^)"; diff --git a/iphone/Maps/ja.lproj/Localizable.strings b/iphone/Maps/ja.lproj/Localizable.strings index f188fc17ab..2f65e4b712 100644 --- a/iphone/Maps/ja.lproj/Localizable.strings +++ b/iphone/Maps/ja.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nをダウンロードキューã«è¿½åŠ ã—ã¾ã—ãŸ"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "^\n^%\nをダウンロード中"; +"country_status_downloading" = "^\n^\nをダウンロード中"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "地図をダウンロード\n(^ ^)"; diff --git a/iphone/Maps/ko.lproj/Localizable.strings b/iphone/Maps/ko.lproj/Localizable.strings index e3e10f8a6d..9d6d34a8d7 100644 --- a/iphone/Maps/ko.lproj/Localizable.strings +++ b/iphone/Maps/ko.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\n는 다운로드 대기열ì—추가ë©ë‹ˆë‹¤"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "다운로드 중\n^\n^%"; +"country_status_downloading" = "다운로드 중\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "ì§€ë„ ë‹¤ìš´ë¡œë“œ\n(^ ^)"; diff --git a/iphone/Maps/maps.me WatchKit Extension/Controllers/Map/MWMMapController.mm b/iphone/Maps/maps.me WatchKit Extension/Controllers/Map/MWMMapController.mm index 319ff9ba97..226b4b0150 100644 --- a/iphone/Maps/maps.me WatchKit Extension/Controllers/Map/MWMMapController.mm +++ b/iphone/Maps/maps.me WatchKit Extension/Controllers/Map/MWMMapController.mm @@ -114,7 +114,9 @@ static int const kZoomModifierDown = -2; return; self.needUpdateMap = NO; [self updateUIToDestination]; - UIImage * frame = [MWMFrameworkUtils getFrame:self.contentFrame.size withZoomModifier:self.zoomModifier]; + UIImage * frame = [MWMFrameworkUtils getFrame:self.contentFrame.size + withScreenScale:[WKInterfaceDevice currentDevice].screenScale + andZoomModifier:self.zoomModifier]; [self.mapGroup setBackgroundImage:frame]; } @@ -153,7 +155,7 @@ static int const kZoomModifierDown = -2; if (!initSoftwareRenderer && _initSoftwareRenderer) [MWMFrameworkUtils releaseSoftwareRenderer]; else if (initSoftwareRenderer && !_initSoftwareRenderer) - [MWMFrameworkUtils initSoftwareRenderer]; + [MWMFrameworkUtils initSoftwareRenderer:[WKInterfaceDevice currentDevice].screenScale]; _initSoftwareRenderer = initSoftwareRenderer; } diff --git a/iphone/Maps/maps.me WatchKit Extension/FrameworkUtils/MWMFrameworkUtils.h b/iphone/Maps/maps.me WatchKit Extension/FrameworkUtils/MWMFrameworkUtils.h index 2ea5749110..6eaa6c74e2 100644 --- a/iphone/Maps/maps.me WatchKit Extension/FrameworkUtils/MWMFrameworkUtils.h +++ b/iphone/Maps/maps.me WatchKit Extension/FrameworkUtils/MWMFrameworkUtils.h @@ -9,9 +9,9 @@ + (BOOL)hasMWM; + (NSString *)currentCountryName; -+ (void)initSoftwareRenderer; ++ (void)initSoftwareRenderer:(CGFloat)screenScale; + (void)releaseSoftwareRenderer; -+ (UIImage *)getFrame:(CGSize)frameSize withZoomModifier:(int)zoomModifier; ++ (UIImage *)getFrame:(CGSize)frameSize withScreenScale:(CGFloat)screenScale andZoomModifier:(int)zoomModifier; + (void)searchAroundCurrentLocation:(NSString *)query callback:(void(^)(NSMutableArray *result))reply; diff --git a/iphone/Maps/maps.me WatchKit Extension/FrameworkUtils/MWMFrameworkUtils.mm b/iphone/Maps/maps.me WatchKit Extension/FrameworkUtils/MWMFrameworkUtils.mm index 06a798062d..2a469c013a 100644 --- a/iphone/Maps/maps.me WatchKit Extension/FrameworkUtils/MWMFrameworkUtils.mm +++ b/iphone/Maps/maps.me WatchKit Extension/FrameworkUtils/MWMFrameworkUtils.mm @@ -2,11 +2,11 @@ #import "MWMWatchLocationTracker.h" #include "Framework.h" -#include "render/frame_image.hpp" - #include "indexer/scales.hpp" #include "indexer/mercator.hpp" +#include "drape_frontend/watch/frame_image.hpp" + #include "platform/location.hpp" extern NSString * const kSearchResultTitleKey; @@ -54,21 +54,19 @@ extern NSString * const kSearchResultPointKey; return @(countryName.c_str()); } -+ (void)initSoftwareRenderer ++ (void)initSoftwareRenderer:(CGFloat)screenScale { - // @TODO. It's a hard code of apple watch dpi. It should be gotten dynamicly. - int const iWatchDPI = 384; Framework & f = GetFramework(); - if (!f.IsSingleFrameRendererInited()) - f.InitSingleFrameRenderer(graphics::EDensityXHDPI, iWatchDPI); + if (!f.IsWatchFrameRendererInited()) + f.InitWatchFrameRenderer(screenScale); } + (void)releaseSoftwareRenderer { - GetFramework().ReleaseSingleFrameRenderer(); + GetFramework().ReleaseWatchFrameRenderer(); } -+ (UIImage *)getFrame:(CGSize)frameSize withZoomModifier:(int)zoomModifier ++ (UIImage *)getFrame:(CGSize)frameSize withScreenScale:(CGFloat)screenScale andZoomModifier:(int)zoomModifier { [MWMFrameworkUtils prepareFramework]; Framework & f = GetFramework(); @@ -78,7 +76,7 @@ extern NSString * const kSearchResultPointKey; m2::PointD const center = MercatorBounds::FromLatLon(coordinate.latitude, coordinate.longitude); uint32_t const pxWidth = 2 * (uint32_t)frameSize.width; uint32_t const pxHeight = 2 * (uint32_t)frameSize.height; - Framework::SingleFrameSymbols symbols; + df::watch::FrameSymbols symbols; if (tracker.hasDestination) { symbols.m_showSearchResult = true; @@ -88,9 +86,10 @@ extern NSString * const kSearchResultPointKey; else symbols.m_showSearchResult = false; - FrameImage image; - [MWMFrameworkUtils initSoftwareRenderer]; - f.DrawSingleFrame(center, zoomModifier, pxWidth, pxHeight, image, symbols); + + df::watch::FrameImage image; + [MWMFrameworkUtils initSoftwareRenderer:screenScale]; + f.DrawWatchFrame(center, zoomModifier, pxWidth, pxHeight, symbols, image); NSData * imadeData = [NSData dataWithBytes:image.m_data.data() length:image.m_data.size()]; return [UIImage imageWithData:imadeData]; } diff --git a/iphone/Maps/maps.me WatchKit Extension/Info.plist b/iphone/Maps/maps.me WatchKit Extension/Info.plist index 6d295c8875..3661adf7f5 100644 --- a/iphone/Maps/maps.me WatchKit Extension/Info.plist +++ b/iphone/Maps/maps.me WatchKit Extension/Info.plist @@ -34,5 +34,7 @@ RemoteInterfacePrincipalClass InterfaceController + WKWatchKitApp + diff --git a/iphone/Maps/nb.lproj/Localizable.strings b/iphone/Maps/nb.lproj/Localizable.strings index c315d4a99d..d3a5160c11 100644 --- a/iphone/Maps/nb.lproj/Localizable.strings +++ b/iphone/Maps/nb.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\ner lagt til i nedlastingskøen."; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Laster ned\n^\n^%"; +"country_status_downloading" = "Laster ned\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Last ned kart\n(^ ^)"; diff --git a/iphone/Maps/nl.lproj/Localizable.strings b/iphone/Maps/nl.lproj/Localizable.strings index 6aa03c150f..f22318b596 100644 --- a/iphone/Maps/nl.lproj/Localizable.strings +++ b/iphone/Maps/nl.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nis toegevoegd aan de download wachtrij"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "aan het downloaden\n^\n^%"; +"country_status_downloading" = "aan het downloaden\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Kaart downloaden\n(^ ^)"; diff --git a/iphone/Maps/pl.lproj/Localizable.strings b/iphone/Maps/pl.lproj/Localizable.strings index 0bf463499d..40976a0cfe 100644 --- a/iphone/Maps/pl.lproj/Localizable.strings +++ b/iphone/Maps/pl.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\ndodano do kolejki pobierania"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Pobieranie\n^\n^%"; +"country_status_downloading" = "Pobieranie\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Pobierz mapÄ™\n(^ ^)"; diff --git a/iphone/Maps/pt.lproj/Localizable.strings b/iphone/Maps/pt.lproj/Localizable.strings index 30bc40bcb1..db4325dc81 100644 --- a/iphone/Maps/pt.lproj/Localizable.strings +++ b/iphone/Maps/pt.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\né adicionado à fila de descargas"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "A descarregar\n^\n^%"; +"country_status_downloading" = "A descarregar\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Descarregar Mapa\n(^ ^)"; diff --git a/iphone/Maps/ro.lproj/Localizable.strings b/iphone/Maps/ro.lproj/Localizable.strings index 16e9fb0b64..98cc282847 100644 --- a/iphone/Maps/ro.lproj/Localizable.strings +++ b/iphone/Maps/ro.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\neste adăugată la coada de descărcare."; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Se descarcă\n^\n^%"; +"country_status_downloading" = "Se descarcă\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Descărcare hartă\n(^ ^)"; diff --git a/iphone/Maps/ru.lproj/Localizable.strings b/iphone/Maps/ru.lproj/Localizable.strings index fb2e003cb7..0392ff0f85 100644 --- a/iphone/Maps/ru.lproj/Localizable.strings +++ b/iphone/Maps/ru.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nдобавлено в очередь загрузки"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "ЗагружаетÑÑ\n^\n^%"; +"country_status_downloading" = "ЗагружаетÑÑ\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Загрузить карту\n(^ ^)"; diff --git a/iphone/Maps/sk.lproj/Localizable.strings b/iphone/Maps/sk.lproj/Localizable.strings index 0a7390ad96..0430762e69 100644 --- a/iphone/Maps/sk.lproj/Localizable.strings +++ b/iphone/Maps/sk.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\npridané do zoznamu sÅ¥ahovania"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "SÅ¥ahovanie\n^\n^%"; +"country_status_downloading" = "SÅ¥ahovanie\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Stiahnite si Mapu\n(^ ^)"; diff --git a/iphone/Maps/sv.lproj/Localizable.strings b/iphone/Maps/sv.lproj/Localizable.strings index 2009a028f3..af524884f6 100644 --- a/iphone/Maps/sv.lproj/Localizable.strings +++ b/iphone/Maps/sv.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\när tillagd till nedladdningskön"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Laddar ner\n^\n^%"; +"country_status_downloading" = "Laddar ner\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Ladda ner karta\n(^ ^)"; diff --git a/iphone/Maps/th.lproj/Localizable.strings b/iphone/Maps/th.lproj/Localizable.strings index a491edca50..29abcbd9c8 100644 --- a/iphone/Maps/th.lproj/Localizable.strings +++ b/iphone/Maps/th.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "มีà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡ ^\nไปยังลำดับà¸à¸²à¸£à¸”าวน์โหลดà¹à¸¥à¹‰à¸§"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด\n^\n^%"; +"country_status_downloading" = "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "ดาวน์โหลดà¹à¸œà¸™à¸—ี่\n(^ ^)"; diff --git a/iphone/Maps/tr.lproj/Localizable.strings b/iphone/Maps/tr.lproj/Localizable.strings index 61fa55786c..29438159ed 100644 --- a/iphone/Maps/tr.lproj/Localizable.strings +++ b/iphone/Maps/tr.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nindirme kuyruÄŸuna eklendi"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "^\n^%\nindiriliyor"; +"country_status_downloading" = "^\n^\nindiriliyor"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Haritayı Ä°ndir\n(^ ^)"; diff --git a/iphone/Maps/uk.lproj/Localizable.strings b/iphone/Maps/uk.lproj/Localizable.strings index f36c03b1f8..3dc8d26773 100644 --- a/iphone/Maps/uk.lproj/Localizable.strings +++ b/iphone/Maps/uk.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nдобавлено в чергу завантаженнÑ"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "ЗавантажуєтьÑÑ\n^\n^%"; +"country_status_downloading" = "ЗавантажуєтьÑÑ\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Завантажити мапу\n(^ ^)"; diff --git a/iphone/Maps/vi.lproj/Localizable.strings b/iphone/Maps/vi.lproj/Localizable.strings index eee140da38..42e631d35c 100644 --- a/iphone/Maps/vi.lproj/Localizable.strings +++ b/iphone/Maps/vi.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\nđã được thêm vào danh sách đợi tải xuống."; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "Äang tải xuống\n^\n^%"; +"country_status_downloading" = "Äang tải xuống\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "Tải xuống Bản đồ\n(^ ^)"; diff --git a/iphone/Maps/zh-Hans.lproj/Localizable.strings b/iphone/Maps/zh-Hans.lproj/Localizable.strings index 2d68594e5f..cc28491f49 100644 --- a/iphone/Maps/zh-Hans.lproj/Localizable.strings +++ b/iphone/Maps/zh-Hans.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\n添加至下载åºåˆ—"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "下载 \n^\n^%中"; +"country_status_downloading" = "下载 \n^\n^中"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "下载地图\n(^ ^)"; diff --git a/iphone/Maps/zh-Hant.lproj/Localizable.strings b/iphone/Maps/zh-Hant.lproj/Localizable.strings index 6c9f8b244b..449bc160f9 100644 --- a/iphone/Maps/zh-Hant.lproj/Localizable.strings +++ b/iphone/Maps/zh-Hant.lproj/Localizable.strings @@ -142,7 +142,7 @@ "country_status_added_to_queue" = "^\n已加入到下載佇列中"; /* Message to display at the center of the screen when the country is downloading */ -"country_status_downloading" = "下載中\n^\n^%"; +"country_status_downloading" = "下載中\n^\n^"; /* Button text for the button at the center of the screen when the country is not downloaded */ "country_status_download" = "下載地圖\n(^ ^)"; diff --git a/map/active_maps_layout.hpp b/map/active_maps_layout.hpp index 5d62bbc2fe..2bd088d223 100644 --- a/map/active_maps_layout.hpp +++ b/map/active_maps_layout.hpp @@ -35,6 +35,7 @@ public: class ActiveMapsListener { public: + virtual ~ActiveMapsListener(){} /// if some country been inserted than oldGroup == newGroup, and oldPosition == -1 /// if some country been deleted than oldGroup == newGroup, and newPosition == -1 /// if group of country been changed. than oldGroup != newGroup, oldPosition >= 0 and newPosition >= 0 @@ -82,7 +83,7 @@ public: void RetryDownloading(TGroup const & group, int position); void RetryDownloading(TIndex const & index); - ///@{ For CountryStatusDisplay only + ///@{ For CountryStatus only TIndex const & GetCoreIndex(TGroup const & group, int position) const; string const GetFormatedCountryName(TIndex const & index) const; ///@} @@ -95,15 +96,16 @@ public: void ShowMap(TGroup const & group, int position); + /// @param[in] Sorted vector of current .mwm files. + using TLocalFilePtr = shared_ptr; + void Init(vector const & files); + void Clear(); + private: friend class CountryTree; Storage const & GetStorage() const; Storage & GetStorage(); - using TLocalFilePtr = shared_ptr; - void Init(vector const & files); - void Clear(); - void ShowMap(TIndex const & index); void StatusChangedCallback(TIndex const & index); diff --git a/map/address_finder.cpp b/map/address_finder.cpp index 07c6950292..ce4cf1c41b 100644 --- a/map/address_finder.cpp +++ b/map/address_finder.cpp @@ -1,6 +1,7 @@ #include "map/framework.hpp" #include "search/result.hpp" +#include "drape_frontend/visual_params.hpp" #include "indexer/classificator.hpp" #include "indexer/feature_visibility.hpp" @@ -164,7 +165,7 @@ namespace void Framework::GetFeatureTypes(m2::PointD const & pxPoint, vector & types) const { m2::AnyRectD rect; - m_navigator.GetTouchRect(pxPoint, TOUCH_PIXEL_RADIUS * GetVisualScale(), rect); + m_currentMovelView.GetTouchRect(pxPoint, df::VisualParams::Instance().GetTouchRectRadius(), rect); // This scale should fit in geometry scales range. int const scale = min(GetDrawScale(), scales::GetUpperScale()); diff --git a/map/alfa_animation_task.cpp b/map/alfa_animation_task.cpp deleted file mode 100644 index 5a65277a7b..0000000000 --- a/map/alfa_animation_task.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "map/alfa_animation_task.hpp" -#include "map/framework.hpp" - - -AlfaAnimationTask::AlfaAnimationTask(double start, double end, - double timeInterval, double timeOffset, - Framework * f) - : m_start(start) - , m_end(end) - , m_current(start) - , m_timeInterval(timeInterval) - , m_timeOffset(timeOffset) - , m_f(f) -{ -} - -bool AlfaAnimationTask::IsHiding() const -{ - return m_start > m_end; -} - -float AlfaAnimationTask::GetCurrentAlfa() const -{ - return m_current; -} - -void AlfaAnimationTask::OnStart(double ts) -{ - m_timeStart = ts; - BaseT::OnStart(ts); - m_f->Invalidate(); -} - -void AlfaAnimationTask::OnStep(double ts) -{ - BaseT::OnStep(ts); - - double const elapsed = ts - (m_timeStart + m_timeOffset); - if (elapsed >= 0.0) - { - double const t = elapsed / m_timeInterval; - if (t > 1.0) - { - m_current = m_end; - End(); - } - else - m_current = m_start + t * (m_end - m_start); - } - - m_f->Invalidate(); -} diff --git a/map/alfa_animation_task.hpp b/map/alfa_animation_task.hpp deleted file mode 100644 index 6f1c5814a3..0000000000 --- a/map/alfa_animation_task.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "anim/task.hpp" - - -class Framework; - -class AlfaAnimationTask : public anim::Task -{ - typedef anim::Task BaseT; - -public: - AlfaAnimationTask(double start, double end, - double timeInterval, double timeOffset, - Framework * f); - - bool IsHiding() const; - float GetCurrentAlfa() const; - - virtual void OnStart(double ts); - virtual void OnStep(double ts); - -private: - double m_start; - double m_end; - double m_current; - double m_timeInterval; - double m_timeOffset; - double m_timeStart; - - Framework * m_f; -}; diff --git a/map/anim_phase_chain.cpp b/map/anim_phase_chain.cpp deleted file mode 100644 index 5915ce82cf..0000000000 --- a/map/anim_phase_chain.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "map/anim_phase_chain.hpp" - -#include "map/framework.hpp" - -AnimPhase::AnimPhase(double endScale, double timeInterval) - : m_endScale(endScale) - , m_timeInterval(timeInterval) -{ -} - -AnimPhaseChain::AnimPhaseChain(Framework & f, double & scale) - : m_f(f) - , m_scale(scale) -{ -} - -void AnimPhaseChain::AddAnimPhase(AnimPhase const & phase) -{ - m_animPhases.push_back(phase); -} - -void AnimPhaseChain::OnStart(double ts) -{ - m_startTime = ts; - m_startScale = m_scale; - m_phaseIndex = 0; -} - -void AnimPhaseChain::OnStep(double ts) -{ - ASSERT(m_phaseIndex < m_animPhases.size(), ()); - - AnimPhase const * phase = &m_animPhases[m_phaseIndex]; - double elapsedTime = ts - m_startTime; - if (elapsedTime > phase->m_timeInterval) - { - m_startTime = ts; - m_scale = phase->m_endScale; - m_startScale = m_scale; - m_phaseIndex++; - if (m_phaseIndex >= m_animPhases.size()) - { - End(); - return; - } - } - - elapsedTime = ts - m_startTime; - double t = elapsedTime / phase->m_timeInterval; - m_scale = m_startScale + t * (phase->m_endScale - m_startScale); - - m_f.Invalidate(); -} - -void InitDefaultPinAnim(AnimPhaseChain * chain) -{ - chain->AddAnimPhase(AnimPhase(1.2, 0.15)); - chain->AddAnimPhase(AnimPhase(0.8, 0.08)); - chain->AddAnimPhase(AnimPhase(1, 0.05)); -} - -shared_ptr CreateDefaultPinAnim(Framework & f, double & scale) -{ - shared_ptr anim = make_shared(f, scale); - InitDefaultPinAnim(anim.get()); - return anim; -} - diff --git a/map/anim_phase_chain.hpp b/map/anim_phase_chain.hpp deleted file mode 100644 index 781054abb1..0000000000 --- a/map/anim_phase_chain.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include "anim/task.hpp" - -#include "std/shared_ptr.hpp" - -class Framework; - -struct AnimPhase -{ - AnimPhase(double endScale, double timeInterval); - - double m_endScale; - double m_timeInterval; -}; - -class AnimPhaseChain : public anim::Task -{ -public: - AnimPhaseChain(Framework & f, double & scale); - - void AddAnimPhase(AnimPhase const & phase); - - virtual void OnStart(double ts); - virtual void OnStep(double ts); - -private: - Framework & m_f; - vector m_animPhases; - size_t m_phaseIndex; - double & m_scale; - double m_startTime; - double m_startScale; -}; - -void InitDefaultPinAnim(AnimPhaseChain * chain); -shared_ptr CreateDefaultPinAnim(Framework & f, double & scale); diff --git a/map/animator.cpp b/map/animator.cpp deleted file mode 100644 index e752ba9c9a..0000000000 --- a/map/animator.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include "map/animator.hpp" -#include "map/rotate_screen_task.hpp" -#include "map/change_viewport_task.hpp" -#include "map/move_screen_task.hpp" -#include "map/framework.hpp" - -#include "anim/controller.hpp" - -#include "geometry/angles.hpp" - -Animator::Animator(Framework * framework) - : m_framework(framework) -{} - -void Animator::StopAnimation(shared_ptr const & task) -{ - if (task) - { - task->Lock(); - - if (!task->IsEnded() - && !task->IsCancelled()) - task->Cancel(); - - task->Unlock(); - } -} - -void Animator::RotateScreen(double startAngle, double endAngle) -{ - if (m_rotateScreenTask) - m_rotateScreenTask->Lock(); - - bool const inProgress = - m_rotateScreenTask && - !m_rotateScreenTask->IsCancelled() && - !m_rotateScreenTask->IsEnded(); - - if (inProgress) - { - m_rotateScreenTask->SetEndAngle(endAngle); - } - else - { - double const eps = my::DegToRad(1.5); - - if (fabs(ang::GetShortestDistance(startAngle, endAngle)) > eps) - { - if (m_rotateScreenTask) - { - m_rotateScreenTask->Unlock(); - m_rotateScreenTask.reset(); - } - - m_rotateScreenTask.reset(new RotateScreenTask(m_framework, - startAngle, - endAngle, - GetRotationSpeed())); - - m_framework->GetAnimController()->AddTask(m_rotateScreenTask); - return; - } - } - - if (m_rotateScreenTask) - m_rotateScreenTask->Unlock(); -} - -void Animator::StopRotation() -{ - StopAnimation(m_rotateScreenTask); - m_rotateScreenTask.reset(); -} - -shared_ptr const & Animator::MoveScreen(m2::PointD const & startPt, - m2::PointD const & endPt, - double speed) -{ - StopMoveScreen(); - - m_moveScreenTask.reset(new MoveScreenTask(m_framework, - startPt, - endPt, - speed)); - - m_framework->GetAnimController()->AddTask(m_moveScreenTask); - - return m_moveScreenTask; -} - -void Animator::StopMoveScreen() -{ - StopAnimation(m_moveScreenTask); - m_moveScreenTask.reset(); -} - -shared_ptr const & Animator::ChangeViewport(m2::AnyRectD const & start, - m2::AnyRectD const & end, - double rotationSpeed) -{ - StopChangeViewport(); - - m_changeViewportTask.reset(new ChangeViewportTask(start, - end, - rotationSpeed, - m_framework)); - - m_framework->GetAnimController()->AddTask(m_changeViewportTask); - - return m_changeViewportTask; -} - -void Animator::StopChangeViewport() -{ - StopAnimation(m_changeViewportTask); - m_changeViewportTask.reset(); -} - -double Animator::GetRotationSpeed() const -{ - // making full circle in ~1 seconds. - return 6.0; -} diff --git a/map/animator.hpp b/map/animator.hpp deleted file mode 100644 index 9b070b5c57..0000000000 --- a/map/animator.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include "std/shared_ptr.hpp" - -#include "geometry/point2d.hpp" -#include "geometry/any_rect2d.hpp" -#include "anim/task.hpp" - -class Framework; -class RotateScreenTask; -class ChangeViewportTask; -class MoveScreenTask; -/// Class, which is responsible for -/// tracking all map animations. -class Animator -{ -private: - - Framework * m_framework; - - shared_ptr m_rotateScreenTask; - shared_ptr m_changeViewportTask; - shared_ptr m_moveScreenTask; - - void StopAnimation(shared_ptr const & task); - -public: - - /// constructor by Framework - Animator(Framework * framework); - /// rotate screen by shortest path. - void RotateScreen(double startAngle, - double endAngle); - /// stopping screen rotation - void StopRotation(); - /// move screen from one point to another - shared_ptr const & ChangeViewport(m2::AnyRectD const & start, - m2::AnyRectD const & endPt, - double rotationSpeed); - /// stop screen moving - void StopChangeViewport(); - /// get screen rotation speed - double GetRotationSpeed() const; - /// move screen from one point to another - shared_ptr const & MoveScreen(m2::PointD const & startPt, - m2::PointD const & endPt, - double speed); - /// stopping screen movement - void StopMoveScreen(); -}; diff --git a/map/api_mark_container.cpp b/map/api_mark_container.cpp index a1de15a524..b4d43d6bc0 100644 --- a/map/api_mark_container.cpp +++ b/map/api_mark_container.cpp @@ -4,15 +4,12 @@ #include "map/framework.hpp" ApiUserMarkContainer::ApiUserMarkContainer(double layerDepth, Framework & framework) - : UserMarkContainer(layerDepth, framework) + : UserMarkContainer(layerDepth, UserMarkType::API_MARK, framework) { } -string ApiUserMarkContainer::GetTypeName() const { return "api-result"; } - -string ApiUserMarkContainer::GetActiveTypeName() const { return "search-result-active"; } - UserMark * ApiUserMarkContainer::AllocateUserMark(const m2::PointD & ptOrg) { return new ApiMarkPoint(ptOrg, this); } + diff --git a/map/api_mark_container.hpp b/map/api_mark_container.hpp index 7984b7b6df..760f1c2434 100644 --- a/map/api_mark_container.hpp +++ b/map/api_mark_container.hpp @@ -1,6 +1,5 @@ #pragma once -#include "map/api_mark_point.hpp" #include "map/user_mark_container.hpp" class ApiUserMarkContainer : public UserMarkContainer @@ -8,12 +7,6 @@ class ApiUserMarkContainer : public UserMarkContainer public: ApiUserMarkContainer(double layerDepth, Framework & framework); - // UserMarkContainer overrides: - Type GetType() const override { return API_MARK; } - string GetActiveTypeName() const override; - protected: - // UserMarkContainer overrides: - string GetTypeName() const override; UserMark * AllocateUserMark(m2::PointD const & ptOrg) override; }; diff --git a/map/api_mark_point.hpp b/map/api_mark_point.hpp index 45ad891270..e46338e104 100644 --- a/map/api_mark_point.hpp +++ b/map/api_mark_point.hpp @@ -1,6 +1,5 @@ #pragma once -#include "map/user_mark.hpp" #include "map/styled_point.hpp" class ApiMarkPoint : public style::StyledPoint @@ -17,33 +16,35 @@ public: { } + string GetSymbolName() const override { return "api-result"; } + + UserMark::Type GetMarkType() const override { return UserMark::Type::API; } + string const & GetName() const { return m_name; } + void SetName(string const & name) { m_name = name; } string const & GetID() const { return m_id; } + void SetID(string const & id) { m_id = id; } + unique_ptr Copy() const override + { + return unique_ptr( + new UserMarkCopy(new ApiMarkPoint(m_name, m_id, m_style, m_ptOrg, m_container))); + } + + void FillLogEvent(UserMark::TEventContainer & details) const override + { + UserMark::FillLogEvent(details); + details.emplace("name", GetName()); + } + void SetStyle(string const & style) { m_style = style; } // StyledPoint overrides: string const & GetStyle() const override { return m_style; } - // UserMark overrides: - UserMark::Type GetMarkType() const override { return UserMark::Type::API; } - - unique_ptr Copy() const override - { - return make_unique( - new ApiMarkPoint(m_name, m_id, GetStyle(), m_ptOrg, m_container)); - } - - void FillLogEvent(TEventContainer & details) const override - { - UserMark::FillLogEvent(details); - details["markType"] = "API"; - details["name"] = GetName(); - } - private: string m_name; string m_id; diff --git a/map/bookmark.cpp b/map/bookmark.cpp index ca2395f4c9..d5c6d840b3 100644 --- a/map/bookmark.cpp +++ b/map/bookmark.cpp @@ -1,42 +1,73 @@ #include "map/bookmark.hpp" #include "map/track.hpp" -#include "map/anim_phase_chain.hpp" #include "map/framework.hpp" -#include "anim/controller.hpp" - #include "base/scope_guard.hpp" -#include "graphics/depth_constants.hpp" - #include "indexer/mercator.hpp" #include "coding/file_reader.hpp" -#include "../coding/parse_xml.hpp" // LoadFromKML +#include "coding/parse_xml.hpp" // LoadFromKML #include "coding/internal/file_data.hpp" #include "coding/hex.hpp" +#include "drape/drape_global.hpp" +#include "drape/color.hpp" + #include "platform/platform.hpp" #include "base/stl_add.hpp" #include "base/string_utils.hpp" -#include "std/fstream.hpp" #include "std/algorithm.hpp" #include "std/auto_ptr.hpp" +#include "std/fstream.hpp" +#include "std/iterator.hpp" + +Bookmark::Bookmark(m2::PointD const & ptOrg, UserMarkContainer * container) + : TBase(ptOrg, container) + , m_runCreationAnim(true) +{ +} + +Bookmark::Bookmark(BookmarkData const & data, m2::PointD const & ptOrg, UserMarkContainer * container) + : TBase(ptOrg, container) + , m_data(data) + , m_runCreationAnim(true) +{ +} + +void Bookmark::SetData(BookmarkData const & data) +{ + m_data = data; +} + +BookmarkData const & Bookmark::GetData() const +{ + return m_data; +} + +dp::Anchor Bookmark::GetAnchor() const +{ + return dp::Bottom; +} + +string Bookmark::GetSymbolName() const +{ + return GetType(); +} + +UserMark::Type Bookmark::GetMarkType() const +{ + return UserMark::Type::BOOKMARK; +} unique_ptr Bookmark::Copy() const { return unique_ptr(new UserMarkCopy(this, false)); } -shared_ptr Bookmark::CreateAnimTask(Framework & fm) -{ - m_animScaleFactor = 0.0; - return CreateDefaultPinAnim(fm, m_animScaleFactor); -} - void Bookmark::FillLogEvent(TEventContainer & details) const { UserMark::FillLogEvent(details); @@ -44,136 +75,125 @@ void Bookmark::FillLogEvent(TEventContainer & details) const details.emplace("name", GetData().GetName()); } -void BookmarkCategory::AddTrack(Track & track) +bool Bookmark::RunCreationAnim() const { - m_tracks.push_back(track.CreatePersistent()); + bool result = m_runCreationAnim; + m_runCreationAnim = false; + return result; +} + +string const & Bookmark::GetName() const +{ + return m_data.GetName(); +} + +void Bookmark::SetName(string const & name) +{ + m_data.SetName(name); +} + +string const & Bookmark::GetType() const +{ + return m_data.GetType(); +} + +void Bookmark::SetType(string const & type) +{ + m_data.SetType(type); +} + +m2::RectD Bookmark::GetViewport() const +{ + return m2::RectD(GetPivot(), GetPivot()); +} + +string const & Bookmark::GetDescription() const +{ + return m_data.GetDescription(); +} + +void Bookmark::SetDescription(string const & description) +{ + m_data.SetDescription(description); +} + +time_t Bookmark::GetTimeStamp() const +{ + return m_data.GetTimeStamp(); +} + +void Bookmark::SetTimeStamp(time_t timeStamp) +{ + m_data.SetTimeStamp(timeStamp); +} + +double Bookmark::GetScale() const +{ + return m_data.GetScale(); +} + +void Bookmark::SetScale(double scale) +{ + m_data.SetScale(scale); +} + +void BookmarkCategory::AddTrack(unique_ptr && track) +{ + SetDirty(); + m_tracks.push_back(move(track)); } Track const * BookmarkCategory::GetTrack(size_t index) const { - return (index < m_tracks.size() ? m_tracks[index] : 0); + return (index < m_tracks.size() ? m_tracks[index].get() : 0); } -Bookmark * BookmarkCategory::AddBookmark(m2::PointD const & ptOrg, BookmarkData const & bm) -{ - Bookmark * bookmark = static_cast(base_t::GetController().CreateUserMark(ptOrg)); - bookmark->SetData(bm); - return bookmark; -} - -void BookmarkCategory::ReplaceBookmark(size_t index, BookmarkData const & bm) -{ - Controller & c = base_t::GetController(); - ASSERT_LESS (index, c.GetUserMarkCount(), ()); - if (index < c.GetUserMarkCount()) - { - Bookmark * mark = static_cast(c.GetUserMarkForEdit(index)); - mark->SetData(bm); - } -} - -BookmarkCategory::BookmarkCategory(const string & name, Framework & framework) - : base_t(graphics::bookmarkDepth, framework) +BookmarkCategory::BookmarkCategory(string const & name, Framework & framework) + : TBase(0.0 /* bookmarkDepth */, UserMarkType::BOOKMARK_MARK, framework) , m_name(name) - , m_blockAnimation(false) { } BookmarkCategory::~BookmarkCategory() { - ClearBookmarks(); ClearTracks(); } -void BookmarkCategory::ClearBookmarks() +size_t BookmarkCategory::GetUserLineCount() const { - base_t::Clear(); + return m_tracks.size(); +} + +df::UserLineMark const * BookmarkCategory::GetUserLineMark(size_t index) const +{ + ASSERT_LESS(index, m_tracks.size(), ()); + return m_tracks[index].get(); } void BookmarkCategory::ClearTracks() { - for_each(m_tracks.begin(), m_tracks.end(), DeleteFunctor()); m_tracks.clear(); } -namespace -{ - -template void DeleteItem(vector & v, size_t i) -{ - if (i < v.size()) - { - delete v[i]; - v.erase(v.begin() + i); - } - else - { - LOG(LWARNING, ("Trying to delete non-existing item at index", i)); - } -} - -} - -void BookmarkCategory::DeleteBookmark(size_t index) -{ - base_t::Controller & c = base_t::GetController(); - ASSERT_LESS(index, c.GetUserMarkCount(), ()); - UserMark const * markForDelete = c.GetUserMark(index); - - size_t animIndex = 0; - for (; animIndex < m_anims.size(); ++animIndex) - { - TAnimNode const & anim = m_anims[animIndex]; - if (anim.first == markForDelete) - { - anim.second->Cancel(); - break; - } - } - - if (animIndex < m_anims.size()) - m_anims.erase(m_anims.begin() + animIndex); - - c.DeleteUserMark(index); -} - void BookmarkCategory::DeleteTrack(size_t index) { - DeleteItem(m_tracks, index); -} - -size_t BookmarkCategory::GetBookmarksCount() const -{ - return base_t::GetController().GetUserMarkCount(); -} - -Bookmark const * BookmarkCategory::GetBookmark(size_t index) const -{ - base_t::Controller const & c = base_t::GetController(); - return static_cast(index < c.GetUserMarkCount() ? c.GetUserMark(index) : nullptr); -} - -Bookmark * BookmarkCategory::GetBookmark(size_t index) -{ - base_t::Controller & c = base_t::GetController(); - return static_cast(index < c.GetUserMarkCount() ? c.GetUserMarkForEdit(index) : nullptr); -} - -size_t BookmarkCategory::FindBookmark(Bookmark const * bookmark) const -{ - return base_t::GetController().FindUserMark(bookmark); + RequestController(); + SetDirty(); + ASSERT_LESS(index, m_tracks.size(), ()); + m_tracks.erase(next(m_tracks.begin(), index)); + ReleaseController(); } namespace { -string const kPlacemark = "Placemark"; -string const kStyle = "Style"; -string const kDocument = "Document"; -string const kStyleMap = "StyleMap"; -string const kStyleUrl = "styleUrl"; -string const kPair = "Pair"; + string const kPlacemark = "Placemark"; + string const kStyle = "Style"; + string const kDocument = "Document"; + string const kStyleMap = "StyleMap"; + string const kStyleUrl = "styleUrl"; + string const kPair = "Pair"; -graphics::Color const kDefaultTrackColor = graphics::Color::fromARGB(0xFF33CCFF); + dp::Color const kDefaultTrackColor = dp::Extract(0xFF33CCFF); string PointToString(m2::PointD const & org) { @@ -206,16 +226,17 @@ graphics::Color const kDefaultTrackColor = graphics::Color::fromARGB(0xFF33CCFF) } BookmarkCategory & m_category; + UserMarksController & m_controller; vector m_tags; GeometryType m_geometryType; m2::PolylineD m_points; - graphics::Color m_trackColor; + dp::Color m_trackColor; string m_styleId; string m_mapStyleId; string m_styleUrlKey; - map m_styleUrl2Color; + map m_styleUrl2Color; map m_mapStyle2Style; string m_name; @@ -286,7 +307,10 @@ graphics::Color const kDefaultTrackColor = graphics::Color::fromARGB(0xFF33CCFF) { m2::PointD pt; if (ParsePoint(*cortegeIter, coordSeparator, pt)) - m_points.Add(pt); + { + if (m_points.GetSize() == 0 || !(pt - m_points.Back()).IsAlmostZero()) + m_points.Add(pt); + } ++cortegeIter; } } @@ -322,10 +346,10 @@ graphics::Color const kDefaultTrackColor = graphics::Color::fromARGB(0xFF33CCFF) string fromHex = FromHex(value); ASSERT(fromHex.size() == 4, ("Invalid color passed")); // Color positions in HEX – aabbggrr - m_trackColor = graphics::Color(fromHex[3], fromHex[2], fromHex[1], fromHex[0]); + m_trackColor = dp::Color(fromHex[3], fromHex[2], fromHex[1], fromHex[0]); } - bool GetColorForStyle(string const & styleUrl, graphics::Color & color) + bool GetColorForStyle(string const & styleUrl, dp::Color & color) { if (styleUrl.empty()) return false; @@ -341,11 +365,18 @@ graphics::Color const kDefaultTrackColor = graphics::Color::fromARGB(0xFF33CCFF) } public: - KMLParser(BookmarkCategory & cat) : m_category(cat) + KMLParser(BookmarkCategory & cat) + : m_category(cat) + , m_controller(m_category.RequestController()) { Reset(); } + ~KMLParser() + { + m_category.ReleaseController(); + } + bool Push(string const & name) { m_tags.push_back(name); @@ -383,17 +414,19 @@ graphics::Color const kDefaultTrackColor = graphics::Color::fromARGB(0xFF33CCFF) if (MakeValid()) { if (GEOMETRY_TYPE_POINT == m_geometryType) - m_category.AddBookmark(m_org, BookmarkData(m_name, m_type, m_description, m_scale, m_timeStamp)); + { + Bookmark * bm = static_cast(m_controller.CreateUserMark(m_org)); + bm->SetData(BookmarkData(m_name, m_type, m_description, m_scale, m_timeStamp)); + bm->RunCreationAnim(); + } else if (GEOMETRY_TYPE_LINE == m_geometryType) { - Track track(m_points); - track.SetName(m_name); - - Track::TrackOutline trackOutline { 5.0f, m_trackColor }; - track.AddOutline(&trackOutline, 1); + Track::Params params; + params.m_colors.push_back({ 5.0f, m_trackColor }); + params.m_name = m_name; /// @todo Add description, style, timestamp - m_category.AddTrack(track); + m_category.AddTrack(make_unique(m_points, params)); } } Reset(); @@ -429,7 +462,7 @@ graphics::Color const kDefaultTrackColor = graphics::Color::fromARGB(0xFF33CCFF) if (currTag == "name") m_category.SetName(value); else if (currTag == "visibility") - m_category.SetVisible(value == "0" ? false : true); + m_controller.SetIsVisible(value == "0" ? false : true); } else if (prevTag == kPlacemark) { @@ -541,31 +574,8 @@ string BookmarkCategory::GetDefaultType() return style::GetDefaultStyle(); } -namespace -{ - struct AnimBlockGuard - { - public: - AnimBlockGuard(bool & block) - : m_block(block) - { - m_block = true; - } - - ~AnimBlockGuard() - { - m_block = false; - } - - private: - bool & m_block; - }; -} - bool BookmarkCategory::LoadFromKML(ReaderPtr const & reader) { - AnimBlockGuard g(m_blockAnimation); - ReaderSource > src(reader); KMLParser parser(*this); if (ParseXML(src, parser, true)) @@ -701,10 +711,10 @@ void BookmarkCategory::SaveToKML(ostream & s) // processed during the iteration. That's why i is initially set to // GetBookmarksCount() - 1, i.e. to the last bookmark in the // bookmarks list. - for (size_t count = 0, i = GetBookmarksCount() - 1; - count < GetBookmarksCount(); ++count, --i) + for (size_t count = 0, i = GetUserMarkCount() - 1; + count < GetUserPointCount(); ++count, --i) { - Bookmark const * bm = GetBookmark(i); + Bookmark const * bm = static_cast(GetUserMark(i)); s << " \n"; s << " "; SaveStringWithCDATA(s, bm->GetName()); @@ -726,7 +736,7 @@ void BookmarkCategory::SaveToKML(ostream & s) } s << " #" << bm->GetType() << "\n" - << " " << PointToString(bm->GetOrg()) << "\n"; + << " " << PointToString(bm->GetPivot()) << "\n"; double const scale = bm->GetScale(); if (scale != -1.0) @@ -750,17 +760,19 @@ void BookmarkCategory::SaveToKML(ostream & s) SaveStringWithCDATA(s, track->GetName()); s << "\n"; + ASSERT_GREATER(track->GetLayerCount(), 0, ()); + s << "\n"; @@ -823,33 +835,9 @@ string BookmarkCategory::GenerateUniqueFileName(const string & path, string name return (path + name + suffix + kmlExt); } -void BookmarkCategory::ReleaseAnimations() -{ - vector tempAnims; - for (size_t i = 0; i < m_anims.size(); ++i) - { - TAnimNode const & anim = m_anims[i]; - if (!anim.second->IsEnded() && - !anim.second->IsCancelled()) - { - tempAnims.push_back(m_anims[i]); - } - } - - swap(m_anims, tempAnims); -} - UserMark * BookmarkCategory::AllocateUserMark(m2::PointD const & ptOrg) { - Bookmark * b = new Bookmark(ptOrg, this); - if (!m_blockAnimation) - { - shared_ptr animTask = b->CreateAnimTask(m_framework); - animTask->AddCallback(anim::Task::EEnded, bind(&BookmarkCategory::ReleaseAnimations, this)); - m_anims.push_back(make_pair((UserMark *)b, animTask)); - m_framework.GetAnimController()->AddTask(animTask); - } - return b; + return new Bookmark(ptOrg, this); } bool BookmarkCategory::SaveToKMLFile() diff --git a/map/bookmark.hpp b/map/bookmark.hpp index e5e08afb21..a1ddca705f 100644 --- a/map/bookmark.hpp +++ b/map/bookmark.hpp @@ -66,90 +66,92 @@ private: time_t m_timeStamp; }; -class Bookmark : public style::StyledPoint +class Bookmark : public UserMark { - BookmarkData m_data; - double m_animScaleFactor; - + using TBase = UserMark; public: - Bookmark(m2::PointD const & ptOrg, UserMarkContainer * container) - : StyledPoint(ptOrg, container), m_animScaleFactor(1.0) - { - } + Bookmark(m2::PointD const & ptOrg, UserMarkContainer * container); - Bookmark(BookmarkData const & data, m2::PointD const & ptOrg, UserMarkContainer * container) - : StyledPoint(ptOrg, container), m_data(data), m_animScaleFactor(1.0) - { - } + Bookmark(BookmarkData const & data, m2::PointD const & ptOrg, + UserMarkContainer * container); - void SetData(BookmarkData const & data) { m_data = data; } + void SetData(BookmarkData const & data); + BookmarkData const & GetData() const; - BookmarkData const & GetData() const { return m_data; } + dp::Anchor GetAnchor() const override; + string GetSymbolName() const override; - virtual Type GetMarkType() const override { return UserMark::Type::BOOKMARK; } - virtual void FillLogEvent(TEventContainer & details) const override; + Type GetMarkType() const override; + void FillLogEvent(TEventContainer & details) const override; + bool RunCreationAnim() const override; - string const & GetName() const { return m_data.GetName(); } - void SetName(string const & name) { m_data.SetName(name); } + string const & GetName() const; + void SetName(string const & name); /// @return Now its a bookmark color - name of icon file - string const & GetType() const { return m_data.GetType(); } + string const & GetType() const; + void SetType(string const & type); + m2::RectD GetViewport() const; - void SetType(string const & type) { m_data.SetType(type); } - - m2::RectD GetViewport() const { return m2::RectD(GetOrg(), GetOrg()); } - - string const & GetDescription() const { return m_data.GetDescription(); } - void SetDescription(string const & description) { m_data.SetDescription(description); } + string const & GetDescription() const; + void SetDescription(string const & description); /// @return my::INVALID_TIME_STAMP if bookmark has no timestamp - time_t GetTimeStamp() const { return m_data.GetTimeStamp(); } - void SetTimeStamp(time_t timeStamp) { m_data.SetTimeStamp(timeStamp); } + time_t GetTimeStamp() const; + void SetTimeStamp(time_t timeStamp); - double GetScale() const { return m_data.GetScale(); } - void SetScale(double scale) { m_data.SetScale(scale); } + double GetScale() const; + void SetScale(double scale); unique_ptr Copy() const override; - shared_ptr CreateAnimTask(Framework & fm); - - // StyledPoint overrides: - string const & GetStyle() const override { return m_data.GetType(); } +private: + BookmarkData m_data; + mutable bool m_runCreationAnim; }; class BookmarkCategory : public UserMarkContainer { - typedef UserMarkContainer base_t; - /// @name Data - //@{ - /// TODO move track into UserMarkContainer as a IDrawable custom data - vector m_tracks; - //@} + typedef UserMarkContainer TBase; + vector> m_tracks; string m_name; /// Stores file name from which category was loaded string m_file; public: + class Guard + { + public: + Guard(BookmarkCategory & cat) + : m_controller(cat.RequestController()) + , m_cat(cat) + { + } + + ~Guard() + { + m_cat.ReleaseController(); + } + + UserMarksController & m_controller; + + private: + BookmarkCategory & m_cat; + }; + BookmarkCategory(string const & name, Framework & framework); ~BookmarkCategory(); - virtual Type GetType() const { return BOOKMARK_MARK; } - - void ClearBookmarks(); - void ClearTracks(); + size_t GetUserLineCount() const override; + df::UserLineMark const * GetUserLineMark(size_t index) const override; static string GetDefaultType(); - /// @name Theese functions are called from Framework only. - //@{ - Bookmark* AddBookmark(m2::PointD const & ptOrg, BookmarkData const & bm); - void ReplaceBookmark(size_t index, BookmarkData const & bm); - //@} + void ClearTracks(); /// @name Tracks routine. //@{ - /// @note Move semantics is used here. - void AddTrack(Track & track); + void AddTrack(unique_ptr && track); Track const * GetTrack(size_t index) const; inline size_t GetTracksCount() const { return m_tracks.size(); } void DeleteTrack(size_t index); @@ -159,16 +161,6 @@ public: string const & GetName() const { return m_name; } string const & GetFileName() const { return m_file; } - size_t GetBookmarksCount() const; - - Bookmark const * GetBookmark(size_t index) const; - Bookmark * GetBookmark(size_t index); - void DeleteBookmark(size_t index); - - // Returns index of the bookmark if exists, otherwise returns - // total number of bookmarks. - size_t FindBookmark(Bookmark const * bookmark) const; - /// @name Theese fuctions are public for unit tests only. /// You don't need to call them from client code. //@{ @@ -189,17 +181,7 @@ public: //@} protected: - virtual string GetTypeName() const { return "search-result"; } - virtual string GetActiveTypeName() const { return "search-result-active"; } - virtual UserMark * AllocateUserMark(m2::PointD const & ptOrg); - -private: - void ReleaseAnimations(); - -private: - bool m_blockAnimation; - using TAnimNode = pair>; - vector m_anims; + UserMark * AllocateUserMark(m2::PointD const & ptOrg) override; }; /// diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 398198564f..9dc2a872ea 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -1,11 +1,8 @@ +#include "map/api_mark_container.hpp" #include "map/bookmark_manager.hpp" #include "map/framework.hpp" #include "map/user_mark.hpp" -#include "graphics/depth_constants.hpp" - -#include "render/route_renderer.hpp" - #include "platform/platform.hpp" #include "platform/settings.hpp" @@ -19,20 +16,14 @@ #include "std/target_os.hpp" #include "std/vector.hpp" - BookmarkManager::BookmarkManager(Framework & f) : m_framework(f) - , m_bmScreen(0) - , m_lastScale(1.0) - , m_cache(NULL) - , m_selection(f) - , m_routeRenderer(new rg::RouteRenderer()) { m_userMarkLayers.reserve(3); - m_userMarkLayers.push_back(new SearchUserMarkContainer(graphics::activePinDepth, m_framework)); - m_userMarkLayers.push_back(new ApiUserMarkContainer(graphics::activePinDepth, m_framework)); - m_userMarkLayers.push_back(new DebugUserMarkContainer(graphics::debugDepth, m_framework)); - UserMarkContainer::InitStaticMarks(FindUserMarksContainer(UserMarkContainer::SEARCH_MARK)); + m_userMarkLayers.push_back(new SearchUserMarkContainer(0.0 /* activePinDepth */, m_framework)); + m_userMarkLayers.push_back(new ApiUserMarkContainer(0.0 /* activePinDepth */, m_framework)); + m_userMarkLayers.push_back(new DebugUserMarkContainer(0.0 /* debugDepth */, m_framework)); + UserMarkContainer::InitStaticMarks(FindUserMarksContainer(UserMarkType::SEARCH_MARK)); } BookmarkManager::~BookmarkManager() @@ -41,7 +32,6 @@ BookmarkManager::~BookmarkManager() m_userMarkLayers.clear(); ClearItems(); - ResetScreen(); } namespace @@ -62,106 +52,6 @@ void BookmarkManager::LoadState() Settings::Get(BOOKMARK_TYPE, m_lastType); } -namespace -{ - -class LazyMatrixCalc -{ - ScreenBase const & m_screen; - double & m_lastScale; - - typedef ScreenBase::MatrixT MatrixT; - MatrixT m_matrix; - double m_resScale; - bool m_scaleChanged; - - void CalcScaleG2P() - { - // Check whether viewport scale changed since the last drawing. - m_scaleChanged = false; - double const d = m_lastScale / m_screen.GetScale(); - if (d >= 2.0 || d <= 0.5) - { - m_scaleChanged = true; - m_lastScale = m_screen.GetScale(); - } - - // GtoP matrix for scaling only (with change Y-axis direction). - m_resScale = 1.0 / m_lastScale; - m_matrix = math::Scale(math::Identity(), m_resScale, -m_resScale); - } - -public: - LazyMatrixCalc(ScreenBase const & screen, double & lastScale) - : m_screen(screen), m_lastScale(lastScale), m_resScale(0.0) - { - } - - bool IsScaleChanged() - { - if (m_resScale == 0.0) - CalcScaleG2P(); - return m_scaleChanged; - } - - MatrixT const & GetScaleG2P() - { - if (m_resScale == 0.0) - CalcScaleG2P(); - return m_matrix; - } - - MatrixT const & GetFinalG2P() - { - if (m_resScale == 0.0) - { - // Final GtoP matrix for drawing track's display lists. - m_resScale = m_lastScale / m_screen.GetScale(); - m_matrix = - math::Shift( - math::Scale( - math::Rotate(math::Identity(), m_screen.GetAngle()), - m_resScale, m_resScale), - m_screen.GtoP(m2::PointD(0.0, 0.0))); - } - return m_matrix; - } -}; - -} - -void BookmarkManager::PrepareToShutdown() -{ - m_routeRenderer->PrepareToShutdown(); -} - -void BookmarkManager::DrawCategory(BookmarkCategory const * cat, PaintOverlayEvent const & e) const -{ -#ifndef USE_DRAPE - /// TODO cutomize draw in UserMarkContainer for user Draw method - ASSERT(cat, ()); - if (!cat->IsVisible()) - return; - - Navigator const & navigator = m_framework.GetNavigator(); - ScreenBase const & screen = navigator.Screen(); - - graphics::Screen * pScreen = GPUDrawer::GetScreen(e.GetDrawer()); - - LazyMatrixCalc matrix(screen, m_lastScale); - - // Draw tracks. - for (size_t i = 0; i < cat->GetTracksCount(); ++i) - { - Track const * track = cat->GetTrack(i); - if (track->HasDisplayLists()) - track->Draw(pScreen, matrix.GetFinalG2P()); - } - - cat->Draw(e, m_cache); -#endif // USE_DRAPE -} - void BookmarkManager::ClearItems() { for_each(m_categories.begin(), m_categories.end(), DeleteFunctor()); @@ -189,42 +79,62 @@ void BookmarkManager::LoadBookmark(string const & filePath) m_categories.push_back(cat); } -size_t BookmarkManager::AddBookmark(size_t categoryIndex, const m2::PointD & ptOrg, BookmarkData & bm) +void BookmarkManager::InitBookmarks() +{ + for (auto it = m_categories.begin(); it != m_categories.end(); ++it) + { + BookmarkCategory * cat = *it; + BookmarkCategory::Guard guard(*cat); + guard.m_controller.Update(); + } +} + +size_t BookmarkManager::AddBookmark(size_t categoryIndex, m2::PointD const & ptOrg, BookmarkData & bm) { bm.SetTimeStamp(time(0)); bm.SetScale(m_framework.GetDrawScale()); BookmarkCategory * pCat = m_categories[categoryIndex]; - Bookmark * bookmark = pCat->AddBookmark(ptOrg, bm); - pCat->SetVisible(true); + + BookmarkCategory::Guard guard(*pCat); + static_cast(guard.m_controller.CreateUserMark(ptOrg))->SetData(bm); + guard.m_controller.SetIsVisible(true); pCat->SaveToKMLFile(); m_lastCategoryUrl = pCat->GetFileName(); m_lastType = bm.GetType(); SaveState(); - return pCat->FindBookmark(bookmark); + // Bookmark always is pushed front. + return 0; } size_t BookmarkManager::MoveBookmark(size_t bmIndex, size_t curCatIndex, size_t newCatIndex) { - BookmarkCategory * cat = m_framework.GetBmCategory(curCatIndex); + BookmarkData data; + m2::PointD ptOrg; + + // guard must be released before AddBookmark to prevent deadlock + { + BookmarkCategory * cat = m_framework.GetBmCategory(curCatIndex); + BookmarkCategory::Guard guard(*cat); + Bookmark const * bm = static_cast(guard.m_controller.GetUserMark(bmIndex)); + data = bm->GetData(); + ptOrg = bm->GetPivot(); - Bookmark * bm = cat->GetBookmark(bmIndex); - BookmarkData data = bm->GetData(); - m2::PointD ptOrg = bm->GetOrg(); + guard.m_controller.DeleteUserMark(bmIndex); + cat->SaveToKMLFile(); + } - cat->DeleteBookmark(bmIndex); - cat->SaveToKMLFile(); - - return m_framework.AddBookmark(newCatIndex, ptOrg, data); + return AddBookmark(newCatIndex, ptOrg, data); } void BookmarkManager::ReplaceBookmark(size_t catIndex, size_t bmIndex, BookmarkData const & bm) { - BookmarkCategory * pCat = m_categories[catIndex]; - pCat->ReplaceBookmark(bmIndex, bm); - pCat->SaveToKMLFile(); + BookmarkCategory * cat = m_categories[catIndex]; + BookmarkCategory::Guard guard(*cat); + static_cast(guard.m_controller.GetUserMarkForEdit(bmIndex))->SetData(bm); + cat->SaveToKMLFile(); m_lastType = bm.GetType(); SaveState(); @@ -260,82 +170,15 @@ size_t BookmarkManager::CreateBmCategory(string const & name) return (m_categories.size()-1); } -void BookmarkManager::DrawItems(Drawer * drawer) const -{ -#ifndef USE_DRAPE - ASSERT(m_cache != NULL, ()); - ASSERT(m_framework.GetLocationState(), ()); - - ScreenBase const & screen = m_framework.GetNavigator().Screen(); - m2::RectD const limitRect = screen.ClipRect(); - - LazyMatrixCalc matrix(screen, m_lastScale); - - double const drawScale = m_framework.GetDrawScale(); - double const visualScale = m_framework.GetVisualScale(); - location::RouteMatchingInfo const & matchingInfo = m_framework.GetLocationState()->GetRouteMatchingInfo(); - - auto trackUpdateFn = [&](Track const * track) - { - ASSERT(track, ()); - if (limitRect.IsIntersect(track->GetLimitRect())) - track->CreateDisplayList(m_bmScreen, matrix.GetScaleG2P(), matrix.IsScaleChanged(), drawScale, visualScale, matchingInfo); - else - track->CleanUp(); - }; - - auto dlUpdateFn = [&trackUpdateFn] (BookmarkCategory const * cat) - { - bool const isVisible = cat->IsVisible(); - for (size_t j = 0; j < cat->GetTracksCount(); ++j) - { - Track const * track = cat->GetTrack(j); - ASSERT(track, ()); - if (isVisible) - trackUpdateFn(track); - else - track->CleanUp(); - } - }; - - // Update track's display lists. - for (size_t i = 0; i < m_categories.size(); ++i) - { - BookmarkCategory const * cat = m_categories[i]; - ASSERT(cat, ()); - dlUpdateFn(cat); - } - - graphics::Screen * pScreen = GPUDrawer::GetScreen(drawer); - pScreen->beginFrame(); - - PaintOverlayEvent event(drawer, screen); - for (auto const & layer : m_userMarkLayers) - layer->Draw(event, m_cache); - for (auto const & category : m_categories) - DrawCategory(category, event); - m_routeRenderer->Render(pScreen, screen); - m_selection.Draw(event, m_cache); - - pScreen->endFrame(); -#endif // USE_DRAPE -} - void BookmarkManager::DeleteBmCategory(CategoryIter i) { BookmarkCategory * cat = *i; - if (m_selection.m_container == cat) - { - PinClickManager & clikManager = m_framework.GetBalloonManager(); - clikManager.RemovePin(); - clikManager.Dismiss(); - } - + m_categories.erase(i); + cat->DeleteLater(); FileWriter::DeleteFileX(cat->GetFileName()); - delete cat; - - m_categories.erase(i); + if (cat->CanBeDeleted()) + delete cat; } bool BookmarkManager::DeleteBmCategory(size_t index) @@ -349,25 +192,6 @@ bool BookmarkManager::DeleteBmCategory(size_t index) return false; } -void BookmarkManager::ActivateMark(UserMark const * mark, bool needAnim) -{ - m_selection.ActivateMark(mark, needAnim); -} - -bool BookmarkManager::UserMarkHasActive() const -{ - return m_selection.IsActive(); -} - -bool BookmarkManager::IsUserMarkActive(UserMark const * mark) const -{ - if (mark == nullptr) - return false; - - return (m_selection.m_container == mark->GetContainer() && - m_selection.m_ptOrg.EqualDxDy(mark->GetOrg(), 1.0E-4)); -} - namespace { class BestUserMarkFinder @@ -396,116 +220,61 @@ namespace UserMark const * BookmarkManager::FindNearestUserMark(m2::AnyRectD const & rect) const { - return FindNearestUserMark([&rect](UserMarkContainer::Type) -> m2::AnyRectD const & { return rect; }); + return FindNearestUserMark([&rect](UserMarkType) -> m2::AnyRectD const & { return rect; }); } UserMark const * BookmarkManager::FindNearestUserMark(TTouchRectHolder const & holder) const { BestUserMarkFinder finder(holder); for_each(m_categories.begin(), m_categories.end(), ref(finder)); - finder(FindUserMarksContainer(UserMarkContainer::API_MARK)); - finder(FindUserMarksContainer(UserMarkContainer::SEARCH_MARK)); + finder(FindUserMarksContainer(UserMarkType::API_MARK)); + finder(FindUserMarksContainer(UserMarkType::SEARCH_MARK)); return finder.GetFindedMark(); } -void BookmarkManager::UserMarksSetVisible(UserMarkContainer::Type type, bool isVisible) -{ - FindUserMarksContainer(type)->SetVisible(isVisible); -} - -bool BookmarkManager::UserMarksIsVisible(UserMarkContainer::Type type) const +bool BookmarkManager::UserMarksIsVisible(UserMarkType type) const { return FindUserMarksContainer(type)->IsVisible(); } -void BookmarkManager::UserMarksSetDrawable(UserMarkContainer::Type type, bool isDrawable) +UserMarksController & BookmarkManager::UserMarksRequestController(UserMarkType type) { - FindUserMarksContainer(type)->SetIsDrawable(isDrawable); + return FindUserMarksContainer(type)->RequestController(); } -void BookmarkManager::UserMarksIsDrawable(UserMarkContainer::Type type) +void BookmarkManager::UserMarksReleaseController(UserMarksController & controller) { - FindUserMarksContainer(type)->IsDrawable(); + FindUserMarksContainer(controller.GetType())->ReleaseController(); } -UserMark * BookmarkManager::UserMarksAddMark(UserMarkContainer::Type type, const m2::PointD & ptOrg) +UserMarkContainer const * BookmarkManager::FindUserMarksContainer(UserMarkType type) const { - return FindUserMarksContainer(type)->GetController().CreateUserMark(ptOrg); -} - -void BookmarkManager::UserMarksClear(UserMarkContainer::Type type, size_t skipCount/* = 0*/) -{ - FindUserMarksContainer(type)->Clear(skipCount); -} - -UserMarkContainer::Controller & BookmarkManager::UserMarksGetController(UserMarkContainer::Type type) -{ - return FindUserMarksContainer(type)->GetController(); -} - -void BookmarkManager::SetScreen(graphics::Screen * screen) -{ - ResetScreen(); - m_bmScreen = screen; - m_cache = new UserMarkDLCache(m_bmScreen); -} - -void BookmarkManager::ResetScreen() -{ - delete m_cache; - m_cache = NULL; - - auto dlDeleteFn = [] (BookmarkCategory const * cat) + auto const iter = find_if(m_userMarkLayers.begin(), m_userMarkLayers.end(), [&type](UserMarkContainer const * cont) { - for (size_t j = 0; j < cat->GetTracksCount(); ++j) - cat->GetTrack(j)->CleanUp(); - }; + return cont->GetType() == type; + }); + ASSERT(iter != m_userMarkLayers.end(), ()); + return *iter; +} - if (m_bmScreen) +UserMarkContainer * BookmarkManager::FindUserMarksContainer(UserMarkType type) +{ + auto iter = find_if(m_userMarkLayers.begin(), m_userMarkLayers.end(), [&type](UserMarkContainer * cont) { - // Delete display lists for all tracks - for_each(m_categories.begin(), m_categories.end(), dlDeleteFn); - m_bmScreen = 0; - } + return cont->GetType() == type; + }); + ASSERT(iter != m_userMarkLayers.end(), ()); + return *iter; } -void BookmarkManager::SetRouteTrack(m2::PolylineD const & routePolyline, vector const & turns, - graphics::Color const & color) +UserMarkControllerGuard::UserMarkControllerGuard(BookmarkManager & mng, UserMarkType type) + : m_mng(mng) + , m_controller(mng.UserMarksRequestController(type)) { - m_routeRenderer->Setup(routePolyline, turns, color); } -void BookmarkManager::ResetRouteTrack() +UserMarkControllerGuard::~UserMarkControllerGuard() { - m_routeRenderer->Clear(); -} - -void BookmarkManager::UpdateRouteDistanceFromBegin(double distance) -{ - m_routeRenderer->UpdateDistanceFromBegin(distance); -} - -void BookmarkManager::SetRouteStartPoint(m2::PointD const & pt, bool isValid) -{ - m_routeRenderer->SetRoutePoint(pt, true /* start */, isValid); -} - -void BookmarkManager::SetRouteFinishPoint(m2::PointD const & pt, bool isValid) -{ - m_routeRenderer->SetRoutePoint(pt, false /* start */, isValid); -} - -UserMarkContainer const * BookmarkManager::FindUserMarksContainer(UserMarkContainer::Type type) const -{ - ASSERT(type >= 0 && type < m_userMarkLayers.size(), ()); - ASSERT(m_userMarkLayers[(size_t)type]->GetType() == type, ()); - return m_userMarkLayers[(size_t)type]; -} - -UserMarkContainer * BookmarkManager::FindUserMarksContainer(UserMarkContainer::Type type) -{ - ASSERT(type >= 0 && type < m_userMarkLayers.size(), ()); - ASSERT(m_userMarkLayers[(size_t)type]->GetType() == type, ()); - return m_userMarkLayers[(size_t)type]; + m_mng.UserMarksReleaseController(m_controller); } diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 58fe372815..3a3f521d7c 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -1,8 +1,7 @@ #pragma once + #include "map/bookmark.hpp" -#include "map/route_track.hpp" #include "map/user_mark_container.hpp" -#include "map/user_mark_dl_cache.hpp" #include "std/function.hpp" #include "std/unique_ptr.hpp" @@ -10,8 +9,6 @@ class Framework; class PaintEvent; -namespace graphics { class Screen; } -namespace rg { class RouteRenderer; } class BookmarkManager : private noncopyable { @@ -21,15 +18,9 @@ class BookmarkManager : private noncopyable Framework & m_framework; - vector m_userMarkLayers; - - graphics::Screen * m_bmScreen; - mutable double m_lastScale; - + vector m_userMarkLayers; typedef vector::iterator CategoryIter; - void DrawCategory(BookmarkCategory const * cat, PaintOverlayEvent const & e) const; - void SaveState() const; void LoadState(); @@ -45,6 +36,8 @@ public: void LoadBookmarks(); void LoadBookmark(string const & filePath); + void InitBookmarks(); + /// Client should know where it adds bookmark size_t AddBookmark(size_t categoryIndex, m2::PointD const & ptOrg, BookmarkData & bm); /// Client should know where it moves bookmark @@ -60,48 +53,33 @@ public: BookmarkCategory * GetBmCategory(size_t index) const; size_t CreateBmCategory(string const & name); - void DrawItems(Drawer * drawer) const; /// @name Delete bookmarks category with all bookmarks. /// @return true if category was deleted void DeleteBmCategory(CategoryIter i); bool DeleteBmCategory(size_t index); - void ActivateMark(UserMark const * mark, bool needAnim); - bool UserMarkHasActive() const; - bool IsUserMarkActive(UserMark const * container) const; - - typedef function TTouchRectHolder; + typedef function TTouchRectHolder; UserMark const * FindNearestUserMark(m2::AnyRectD const & rect) const; UserMark const * FindNearestUserMark(TTouchRectHolder const & holder) const; /// Additional layer methods - void UserMarksSetVisible(UserMarkContainer::Type type, bool isVisible); - bool UserMarksIsVisible(UserMarkContainer::Type type) const; - void UserMarksSetDrawable(UserMarkContainer::Type type, bool isDrawable); - void UserMarksIsDrawable(UserMarkContainer::Type type); - UserMark * UserMarksAddMark(UserMarkContainer::Type type, m2::PointD const & ptOrg); - void UserMarksClear(UserMarkContainer::Type type, size_t skipCount = 0); - UserMarkContainer::Controller & UserMarksGetController(UserMarkContainer::Type type); - - void SetScreen(graphics::Screen * screen); - void ResetScreen(); - - void SetRouteTrack(m2::PolylineD const & routePolyline, vector const & turns, - graphics::Color const & color); - void ResetRouteTrack(); - void UpdateRouteDistanceFromBegin(double distance); - void SetRouteStartPoint(m2::PointD const & pt, bool isValid); - void SetRouteFinishPoint(m2::PointD const & pt, bool isValid); + bool UserMarksIsVisible(UserMarkType type) const; + UserMarksController & UserMarksRequestController(UserMarkType type); + void UserMarksReleaseController(UserMarksController & controller); private: - UserMarkContainer const * FindUserMarksContainer(UserMarkContainer::Type type) const; - UserMarkContainer * FindUserMarksContainer(UserMarkContainer::Type type); - - UserMarkDLCache * m_cache; - - SelectionContainer m_selection; - - unique_ptr m_routeRenderer; + UserMarkContainer const * FindUserMarksContainer(UserMarkType type) const; + UserMarkContainer * FindUserMarksContainer(UserMarkType type); +}; + +class UserMarkControllerGuard +{ +public: + UserMarkControllerGuard(BookmarkManager & mng, UserMarkType type); + ~UserMarkControllerGuard(); + + BookmarkManager & m_mng; + UserMarksController & m_controller; }; diff --git a/map/change_viewport_task.cpp b/map/change_viewport_task.cpp deleted file mode 100644 index bf045e6674..0000000000 --- a/map/change_viewport_task.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "map/change_viewport_task.hpp" -#include "map/framework.hpp" - -ChangeViewportTask::ChangeViewportTask(m2::AnyRectD const & startRect, - m2::AnyRectD const & endRect, - double rotationSpeed, - Framework * framework) - : BaseT(startRect, endRect, rotationSpeed, m_outRect), - m_framework(framework) -{ -} - -void ChangeViewportTask::OnStep(double ts) -{ - BaseT::OnStep(ts); - m_framework->ShowRectExVisibleScale(m_outRect.GetGlobalRect()); -} - -void ChangeViewportTask::OnEnd(double ts) -{ - BaseT::OnEnd(ts); - m_framework->ShowRectExVisibleScale(m_outRect.GetGlobalRect()); -} - -bool ChangeViewportTask::IsVisual() const -{ - return true; -} diff --git a/map/change_viewport_task.hpp b/map/change_viewport_task.hpp deleted file mode 100644 index 84eccea9b9..0000000000 --- a/map/change_viewport_task.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "anim/anyrect_interpolation.hpp" - -class Framework; - -class ChangeViewportTask : public anim::AnyRectInterpolation -{ - typedef anim::AnyRectInterpolation BaseT; - - Framework * m_framework; - m2::AnyRectD m_outRect; - -public: - - ChangeViewportTask(m2::AnyRectD const & startRect, - m2::AnyRectD const & endRect, - double rotationSpeed, - Framework * framework); - - void OnStep(double ts); - void OnEnd(double ts); - - bool IsVisual() const; -}; diff --git a/map/compass_arrow.cpp b/map/compass_arrow.cpp deleted file mode 100644 index d0beff1250..0000000000 --- a/map/compass_arrow.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include "map/compass_arrow.hpp" -#include "map/framework.hpp" -#include "map/alfa_animation_task.hpp" - -#include "anim/controller.hpp" - -#include "gui/controller.hpp" - -#include "geometry/transformations.hpp" - -#include "graphics/display_list.hpp" -#include "graphics/screen.hpp" - - -using namespace graphics; - -CompassArrow::Params::Params() - : m_framework(0) -{} - -CompassArrow::CompassArrow(Params const & p) - : BaseT(p), - m_pixelSize(-1, -1), - m_angle(0), - m_framework(p.m_framework) -{ -} - -void CompassArrow::AnimateShow() -{ - if (!isVisible()) - { - setIsVisible(true); - double startValue = m_animTask == nullptr ? 0.1 : GetCurrentAlfa(); - CreateAnim(startValue, 1.0, 0.2, 0.0, true); - } -} - -void CompassArrow::AnimateHide() -{ - if (isBaseVisible() && (m_animTask == NULL || !IsHidingAnim())) - CreateAnim(1.0, 0.0, 0.3, 0.0, false); -} - -void CompassArrow::SetAngle(double angle) -{ - m_angle = angle; -} - -m2::PointI CompassArrow::GetPixelSize() const -{ - if (m_pixelSize == m2::PointI(-1, -1)) - { - Resource const * res = GetCompassResource(); - m_pixelSize = m2::PointI(res->m_texRect.SizeX(), res->m_texRect.SizeY()); - } - return m_pixelSize; -} - -void CompassArrow::GetMiniBoundRects(RectsT & rects) const -{ - double const halfW = m_pixelSize.x / 2.0; - double const halfH = m_pixelSize.y / 2.0; - - rects.push_back(m2::AnyRectD(pivot(), -math::pi / 2 + m_angle, - m2::RectD(-halfW, -halfH, halfW, halfH))); -} - -void CompassArrow::draw(OverlayRenderer * r, - math::Matrix const & m) const -{ - if (isBaseVisible()) - { - checkDirtyLayout(); - - UniformsHolder holder; - holder.insertValue(ETransparency, GetCurrentAlfa()); - - math::Matrix drawM = math::Shift( - math::Rotate( - math::Identity(), - m_angle), - pivot()); - - r->drawDisplayList(m_dl.get(), drawM * m, &holder); - } -} - -bool CompassArrow::isVisible() const -{ - if (m_animTask != NULL && IsHidingAnim()) - return false; - - return isBaseVisible(); -} - -void CompassArrow::AlfaAnimEnded(bool isVisible) -{ - setIsVisible(isVisible); - m_animTask.reset(); -} - -bool CompassArrow::IsHidingAnim() const -{ - ASSERT(m_animTask != NULL, ()); - AlfaAnimationTask * a = static_cast(m_animTask.get()); - return a->IsHiding(); -} - -float CompassArrow::GetCurrentAlfa() const -{ - if (m_animTask) - { - AlfaAnimationTask * a = static_cast(m_animTask.get()); - return a->GetCurrentAlfa(); - } - - return 1.0; -} - -void CompassArrow::CreateAnim(double startAlfa, double endAlfa, double timeInterval, double timeOffset, bool isVisibleAtEnd) -{ - if (m_framework->GetAnimController() == NULL) - return; - - if (m_animTask) - m_animTask->Cancel(); - - m_animTask.reset(new AlfaAnimationTask(startAlfa, endAlfa, timeInterval, timeOffset, m_framework)); - m_animTask->AddCallback(anim::Task::EEnded, bind(&CompassArrow::AlfaAnimEnded, this, isVisibleAtEnd)); - m_framework->GetAnimController()->AddTask(m_animTask); -} - -const Resource * CompassArrow::GetCompassResource() const -{ - Screen * cacheScreen = m_controller->GetCacheScreen(); - Icon::Info icon("compass-image"); - Resource const * res = m_controller->GetCacheScreen()->fromID(cacheScreen->findInfo(icon)); - ASSERT(res, ("Commpass-image not founded")); - return res; -} - -void CompassArrow::cache() -{ - Screen * cacheScreen = m_controller->GetCacheScreen(); - - m_dl.reset(); - m_dl.reset(cacheScreen->createDisplayList()); - - cacheScreen->beginFrame(); - cacheScreen->setDisplayList(m_dl.get()); - cacheScreen->applyVarAlfaStates(); - - Resource const * res = GetCompassResource(); - shared_ptr texture = cacheScreen->pipeline(res->m_pipelineID).texture(); - m2::RectU rect = res->m_texRect; - double halfW = rect.SizeX() / 2.0; - double halfH = rect.SizeY() / 2.0; - - m2::PointD coords[] = - { - m2::PointD(-halfW, -halfH), - m2::PointD(-halfW, halfH), - m2::PointD(halfW, -halfH), - m2::PointD(halfW, halfH), - }; - - m2::PointF normal(0.0, 0.0); - m2::PointF texCoords[] = - { - texture->mapPixel(m2::PointF(rect.minX(), rect.minY())), - texture->mapPixel(m2::PointF(rect.minX(), rect.maxY())), - texture->mapPixel(m2::PointF(rect.maxX(), rect.minY())), - texture->mapPixel(m2::PointF(rect.maxX(), rect.maxY())), - }; - - cacheScreen->addTexturedStripStrided(coords, sizeof(m2::PointD), - &normal, 0, - texCoords, sizeof(m2::PointF), - 4, depth(), res->m_pipelineID); - - - cacheScreen->setDisplayList(0); - cacheScreen->endFrame(); -} - -void CompassArrow::purge() -{ - m_dl.reset(); -} - -bool CompassArrow::isBaseVisible() const -{ - return BaseT::isVisible(); -} - -bool CompassArrow::onTapEnded(m2::PointD const & pt) -{ - anim::Controller * animController = m_framework->GetAnimController(); - anim::Controller::Guard guard(animController); - - // switching off compass follow mode - m_framework->GetLocationState()->OnCompassTaped(); - m_framework->Invalidate(); - - return true; -} - -bool CompassArrow::hitTest(m2::PointD const & pt) const -{ - Resource const * res = GetCompassResource(); - double rad = 1.5 * max(res->m_texRect.SizeX() / 2.0, res->m_texRect.SizeY() / 2.0); - return pt.Length(pivot()) < rad * visualScale(); -} diff --git a/map/compass_arrow.hpp b/map/compass_arrow.hpp deleted file mode 100644 index fa9dd13adb..0000000000 --- a/map/compass_arrow.hpp +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once - -#include "gui/element.hpp" - -#include "std/shared_ptr.hpp" -#include "std/unique_ptr.hpp" - - -namespace anim -{ - class Task; -} - -namespace graphics -{ - class DisplayList; - struct Resource; -} - -class Framework; - -/// Compass Arrow, which shows up when the screen is rotated, -/// and rotates screen back to straight orientation when beeing pressed -class CompassArrow : public gui::Element -{ - typedef gui::Element BaseT; - - mutable m2::PointI m_pixelSize; - double m_angle; - - unique_ptr m_dl; - - shared_ptr m_animTask; - - void AlfaAnimEnded(bool isVisible); - bool IsHidingAnim() const; - float GetCurrentAlfa() const; - void CreateAnim(double startAlfa, double endAlfa, double timeInterval, double timeOffset, bool isVisibleAtEnd); - - Framework * m_framework; - graphics::Resource const * GetCompassResource() const; - - bool isBaseVisible() const; - -public: - struct Params : public BaseT::Params - { - Framework * m_framework; - Params(); - }; - - CompassArrow(Params const & p); - - void AnimateShow(); - void AnimateHide(); - - void SetAngle(double angle); - m2::PointI GetPixelSize() const; - - /// @name Override from graphics::Overlayelement and gui::Element. - //@{ - virtual void GetMiniBoundRects(RectsT & rects) const; - - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - bool isVisible() const; - bool hitTest(m2::PointD const & pt) const; - - void cache(); - void purge(); - - bool onTapEnded(m2::PointD const & pt); - //@} -}; diff --git a/map/country_status_display.cpp b/map/country_status_display.cpp deleted file mode 100644 index 040e0bf1a3..0000000000 --- a/map/country_status_display.cpp +++ /dev/null @@ -1,496 +0,0 @@ -#include "map/country_status_display.hpp" -#include "map/framework.hpp" - -#include "gui/controller.hpp" -#include "gui/button.hpp" -#include "gui/text_view.hpp" - -#include "graphics/overlay_renderer.hpp" -#include "graphics/display_list.hpp" - -#include "platform/platform.hpp" - -#include "base/thread.hpp" -#include "base/string_format.hpp" - -#include "3party/Alohalytics/src/alohalytics.h" - -#include "std/bind.hpp" -#include "std/sstream.hpp" - - -using namespace storage; - -CountryStatusDisplay::CountryStatusDisplay(Params const & p) - : gui::Element(p) - , m_activeMaps(p.m_activeMaps) -{ - m_activeMapsSlotID = m_activeMaps.AddListener(this); - gui::Button::Params bp; - - bp.m_depth = depth(); - bp.m_minWidth = 260; - bp.m_minHeight = 56; - bp.m_position = graphics::EPosCenter; - - auto createButtonFn = [this] (gui::Button::Params const & params, - graphics::Color const & activeButtonColor, graphics::Color const & pressedButtonColor) - { - gui::Button * result = new gui::Button(params); - result->setIsVisible(false); - result->setOnClickListener(bind(&CountryStatusDisplay::OnButtonClicked, this, _1)); - - result->setFont(EActive, graphics::FontDesc(15, graphics::Color(255, 255, 255, 255))); - result->setFont(EPressed, graphics::FontDesc(15, graphics::Color(255, 255, 255, 255))); - - result->setColor(EActive, activeButtonColor); - result->setColor(EPressed, pressedButtonColor); - - return result; - }; - - m_primaryButton.reset(createButtonFn(bp, graphics::Color(32, 152, 82, 255), - graphics::Color(24, 128, 68, 255))); - uint8_t constexpr activeAlpha = static_cast(0.44 * 255); - uint8_t constexpr pressedAlpha = static_cast(0.72 * 255); - m_secondaryButton.reset(createButtonFn(bp, graphics::Color(0, 0, 0, activeAlpha), - graphics::Color(0, 0, 0, pressedAlpha))); - - gui::TextView::Params tp; - tp.m_depth = depth(); - tp.m_position = graphics::EPosCenter; - - m_label.reset(new gui::TextView(tp)); - m_label->setIsVisible(false); - m_label->setFont(gui::Element::EActive, graphics::FontDesc(18)); - - setIsVisible(false); -} - -CountryStatusDisplay::~CountryStatusDisplay() -{ - m_activeMaps.RemoveListener(m_activeMapsSlotID); -} - -void CountryStatusDisplay::SetCountryIndex(TIndex const & idx) -{ - if (m_countryIdx != idx) - { - Lock(); - m_countryIdx = idx; - - if (m_countryIdx.IsValid()) - { - m_countryStatus = m_activeMaps.GetCountryStatus(m_countryIdx); - m_displayMapName = m_activeMaps.GetFormatedCountryName(m_countryIdx); - } - - Repaint(); - Unlock(); - } -} - -void CountryStatusDisplay::setIsVisible(bool isVisible) const -{ - if (isVisible && isVisible != TBase::isVisible()) - { - Lock(); - Repaint(); - Unlock(); - } - - TBase::setIsVisible(isVisible); -} - -void CountryStatusDisplay::setIsDirtyLayout(bool isDirty) const -{ - TBase::setIsDirtyLayout(isDirty); - m_label->setIsDirtyLayout(isDirty); - m_primaryButton->setIsDirtyLayout(isDirty); - m_secondaryButton->setIsDirtyLayout(isDirty); - - if (isDirty) - SetVisibilityForState(); -} - -void CountryStatusDisplay::draw(graphics::OverlayRenderer * r, - math::Matrix const & m) const -{ - if (isVisible()) - { - Lock(); - checkDirtyLayout(); - - m_label->draw(r, m); - m_primaryButton->draw(r, m); - m_secondaryButton->draw(r, m); - Unlock(); - } -} - -void CountryStatusDisplay::layout() -{ - if (!isVisible()) - return; - SetContentForState(); - - auto layoutFn = [] (gui::Element * e) - { - if (e->isVisible()) - e->layout(); - }; - - layoutFn(m_label.get()); - layoutFn(m_primaryButton.get()); - layoutFn(m_secondaryButton.get()); - - ComposeElementsForState(); - - // !!!! Hack !!!! - // ComposeElementsForState modify pivot point of elements. - // After setPivot all elements must be relayouted. - // For reduce "cache" operations we call layout secondary - layoutFn(m_label.get()); - layoutFn(m_primaryButton.get()); - layoutFn(m_secondaryButton.get()); -} - -void CountryStatusDisplay::purge() -{ - m_label->purge(); - m_primaryButton->purge(); - m_secondaryButton->purge(); -} - -void CountryStatusDisplay::cache() -{ - auto cacheFn = [] (gui::Element * e) - { - if (e->isVisible()) - e->cache(); - }; - - cacheFn(m_label.get()); - cacheFn(m_primaryButton.get()); - cacheFn(m_secondaryButton.get()); -} - -m2::RectD CountryStatusDisplay::GetBoundRect() const -{ - ASSERT(isVisible(), ()); - m2::RectD r(pivot(), pivot()); - - if (m_primaryButton->isVisible()) - r.Add(m_primaryButton->GetBoundRect()); - if (m_secondaryButton->isVisible()) - r.Add(m_secondaryButton->GetBoundRect()); - - return r; -} - -void CountryStatusDisplay::setController(gui::Controller * controller) -{ - Element::setController(controller); - m_label->setController(controller); - m_primaryButton->setController(controller); - m_secondaryButton->setController(controller); -} - -bool CountryStatusDisplay::onTapStarted(m2::PointD const & pt) -{ - return OnTapAction(bind(&gui::Button::onTapStarted, _1, _2), pt); -} - -bool CountryStatusDisplay::onTapMoved(m2::PointD const & pt) -{ - return OnTapAction(bind(&gui::Button::onTapMoved, _1, _2), pt); -} - -bool CountryStatusDisplay::onTapEnded(m2::PointD const & pt) -{ - return OnTapAction(bind(&gui::Button::onTapEnded, _1, _2), pt); -} - -bool CountryStatusDisplay::onTapCancelled(m2::PointD const & pt) -{ - return OnTapAction(bind(&gui::Button::onTapCancelled, _1, _2), pt); -} - -void CountryStatusDisplay::CountryStatusChanged(ActiveMapsLayout::TGroup const & group, int position, - TStatus const & /*oldStatus*/, TStatus const & newStatus) -{ - TIndex index = m_activeMaps.GetCoreIndex(group, position); - if (m_countryIdx == index) - { - Lock(); - m_countryStatus = newStatus; - if (m_countryStatus == TStatus::EDownloading) - m_progressSize = m_activeMaps.GetDownloadableCountrySize(m_countryIdx); - else - m_progressSize = LocalAndRemoteSizeT(0, 0); - Repaint(); - Unlock(); - } -} - -void CountryStatusDisplay::DownloadingProgressUpdate(ActiveMapsLayout::TGroup const & group, int position, LocalAndRemoteSizeT const & progress) -{ - TIndex index = m_activeMaps.GetCoreIndex(group, position); - if (m_countryIdx == index) - { - Lock(); - m_countryStatus = m_activeMaps.GetCountryStatus(index); - m_progressSize = progress; - Repaint(); - Unlock(); - } -} - -template -string CountryStatusDisplay::FormatStatusMessage(string const & msgID, T1 const * t1, T2 const * t2) -{ - string msg = m_controller->GetStringsBundle()->GetString(msgID); - if (t1) - { - if (t2) - msg = strings::Format(msg, *t1, *t2); - else - { - msg = strings::Format(msg, *t1); - - size_t const count = msg.size(); - if (count > 0) - { - if (msg[count-1] == '\n') - msg.erase(count-1, 1); - } - } - } - - return msg; -} - -void CountryStatusDisplay::SetVisibilityForState() const -{ - uint8_t visibilityFlags = 0; - uint8_t const labelVisibility = 0x1; - uint8_t const primeVisibility = 0x2; - uint8_t const secondaryVisibility = 0x4; - - if (m_countryIdx.IsValid()) - { - switch (m_countryStatus) - { - case TStatus::EDownloadFailed: - visibilityFlags |= labelVisibility; - visibilityFlags |= primeVisibility; - break; - case TStatus::EDownloading: - case TStatus::EInQueue: - visibilityFlags |= labelVisibility; - break; - case TStatus::ENotDownloaded: - visibilityFlags |= labelVisibility; - visibilityFlags |= primeVisibility; - visibilityFlags |= secondaryVisibility; - break; - default: - break; - } - } - - m_label->setIsVisible(visibilityFlags & labelVisibility); - m_primaryButton->setIsVisible(visibilityFlags & primeVisibility); - m_secondaryButton->setIsVisible(visibilityFlags & secondaryVisibility); - - TBase::setIsVisible(m_label->isVisible() || m_primaryButton->isVisible() || m_secondaryButton->isVisible()); -} - -void CountryStatusDisplay::SetContentForState() -{ - if (!isVisible()) - return; - - switch (m_countryStatus) - { - case TStatus::EDownloadFailed: - case TStatus::EOutOfMemFailed: - SetContentForError(); - break; - case TStatus::ENotDownloaded: - SetContentForDownloadPropose(); - break; - case TStatus::EDownloading: - SetContentForProgress(); - break; - case TStatus::EInQueue: - SetContentForInQueue(); - break; - default: - break; - } -} - -namespace -{ - void FormatMapSize(uint64_t sizeInBytes, string & units, uint64_t & sizeToDownload) - { - int const mbInBytes = 1024 * 1024; - int const kbInBytes = 1024; - if (sizeInBytes < mbInBytes) - { - sizeToDownload = (sizeInBytes + kbInBytes / 2) / kbInBytes; - units = "KB"; - } - else - { - sizeToDownload = (sizeInBytes + mbInBytes / 2) / mbInBytes; - units = "MB"; - } - } -} - -void CountryStatusDisplay::SetContentForDownloadPropose() -{ - ASSERT(m_label->isVisible(), ()); - ASSERT(m_primaryButton->isVisible(), ()); - ASSERT(m_secondaryButton->isVisible(), ()); - - LocalAndRemoteSizeT mapAndRoutingSize = m_activeMaps.GetRemoteCountrySizes(m_countryIdx); - - m_label->setText(m_displayMapName); - uint64_t sizeToDownload; - string units; - FormatMapSize(mapAndRoutingSize.first + mapAndRoutingSize.second, units, sizeToDownload); - m_primaryButton->setText(FormatStatusMessage("country_status_download", &sizeToDownload, &units)); - - FormatMapSize(mapAndRoutingSize.first, units, sizeToDownload); - m_secondaryButton->setText(FormatStatusMessage("country_status_download_without_routing", - &sizeToDownload, &units)); -} - -void CountryStatusDisplay::SetContentForProgress() -{ - ASSERT(m_label->isVisible(), ()); - int percent = 0; - if (m_progressSize.second != 0) - percent = static_cast(m_progressSize.first * 100 / m_progressSize.second); - m_label->setText(FormatStatusMessage("country_status_downloading", &m_displayMapName, &percent)); -} - -void CountryStatusDisplay::SetContentForInQueue() -{ - ASSERT(m_label->isVisible(), ()); - m_label->setText(FormatStatusMessage("country_status_added_to_queue", &m_displayMapName)); -} - -void CountryStatusDisplay::SetContentForError() -{ - ASSERT(m_label->isVisible(), ()); - ASSERT(m_primaryButton->isVisible(), ()); - - if (m_countryStatus == TStatus::EDownloadFailed) - m_label->setText(FormatStatusMessage("country_status_download_failed", &m_displayMapName)); - else - m_label->setText(FormatStatusMessage("not_enough_free_space_on_sdcard")); - - m_primaryButton->setText(m_controller->GetStringsBundle()->GetString("try_again")); -} - -void CountryStatusDisplay::ComposeElementsForState() -{ - ASSERT(isVisible(), ()); - int visibleCount = 0; - auto visibleCheckFn = [&visibleCount] (gui::Element const * e) - { - if (e->isVisible()) - ++visibleCount; - }; - - visibleCheckFn(m_label.get()); - visibleCheckFn(m_primaryButton.get()); - visibleCheckFn(m_secondaryButton.get()); - - ASSERT(visibleCount > 0, ()); - - m2::PointD const & pv = pivot(); - size_t const emptySpace = 16 * visualScale(); - if (visibleCount == 1) - m_label->setPivot(pv); - - else if (visibleCount == 2) - { - size_t const labelHeight = m_label->GetBoundRect().SizeY(); - size_t const buttonHeight = m_primaryButton->GetBoundRect().SizeY(); - size_t const commonHeight = buttonHeight + labelHeight + emptySpace; - - m_label->setPivot(m2::PointD(pv.x, pv.y - commonHeight / 2 + labelHeight / 2)); - m_primaryButton->setPivot(m2::PointD(pv.x, pv.y + commonHeight / 2 - buttonHeight / 2)); - } - else - { - size_t const labelHeight = m_label->GetBoundRect().SizeY(); - size_t const primButtonHeight = m_primaryButton->GetBoundRect().SizeY(); - size_t const secButtonHeight = m_secondaryButton->GetBoundRect().SizeY(); - - double const offsetFromCenter = (primButtonHeight / 2 + emptySpace); - - m_label->setPivot(m2::PointD(pv.x, pv.y - offsetFromCenter - labelHeight / 2)); - m_primaryButton->setPivot(pv); - m_secondaryButton->setPivot(m2::PointD(pv.x, pv.y + offsetFromCenter + secButtonHeight / 2.0)); - } -} - -bool CountryStatusDisplay::OnTapAction(TTapActionFn const & action, const m2::PointD & pt) -{ - bool result = false; - if (m_primaryButton->isVisible() && m_primaryButton->hitTest(pt)) - result |= action(m_primaryButton, pt); - else if (m_secondaryButton->isVisible() && m_secondaryButton->hitTest(pt)) - result |= action(m_secondaryButton, pt); - - return result; -} - -void CountryStatusDisplay::OnButtonClicked(gui::Element const * button) -{ - ASSERT(m_countryIdx.IsValid(), ()); - - MapOptions options = MapOptions::Map; - if (button == m_primaryButton.get()) - options = SetOptions(options, MapOptions::CarRouting); - - ASSERT(m_downloadCallback, ()); - int opt = static_cast(options); - if (IsStatusFailed()) - opt = -1; - - m_downloadCallback(m_countryIdx, opt); - - alohalytics::LogEvent("CountryStatusDisplay::OnButtonClicked", DebugPrint(options)); -} - -void CountryStatusDisplay::Repaint() const -{ - setIsDirtyLayout(true); - const_cast(this)->invalidate(); -} - -bool CountryStatusDisplay::IsStatusFailed() const -{ - return m_countryStatus == TStatus::EOutOfMemFailed || m_countryStatus == TStatus::EDownloadFailed; -} - -void CountryStatusDisplay::Lock() const -{ -#ifdef OMIM_OS_ANDROID - m_mutex.Lock(); -#endif -} - -void CountryStatusDisplay::Unlock() const -{ -#ifdef OMIM_OS_ANDROID - m_mutex.Unlock(); -#endif -} diff --git a/map/country_status_display.hpp b/map/country_status_display.hpp deleted file mode 100644 index 4047e9cc89..0000000000 --- a/map/country_status_display.hpp +++ /dev/null @@ -1,121 +0,0 @@ -#pragma once - -#include "map/active_maps_layout.hpp" - -#include "gui/element.hpp" -#include "platform/country_defines.hpp" - -#ifdef OMIM_OS_ANDROID - #include "../base/mutex.hpp" -#endif - -#include "std/unique_ptr.hpp" -#include "std/target_os.hpp" - -namespace gui -{ - class Button; - class TextView; -} - -class Framework; - -namespace storage { struct TIndex; } - -/// This class is a composite GUI element to display -/// an on-screen GUI for the country, which is not downloaded yet. -class CountryStatusDisplay : public gui::Element, - public storage::ActiveMapsLayout::ActiveMapsListener -{ - typedef gui::Element TBase; -public: - struct Params : public gui::Element::Params - { - Params(storage::ActiveMapsLayout & activeMaps) : m_activeMaps(activeMaps) {} - - storage::ActiveMapsLayout & m_activeMaps; - }; - - CountryStatusDisplay(Params const & p); - ~CountryStatusDisplay(); - - /// set current country name - void SetCountryIndex(storage::TIndex const & idx); - typedef function TDownloadCountryFn; - void SetDownloadCountryListener(TDownloadCountryFn const & fn) { m_downloadCallback = fn; } - - /// @name Override from graphics::OverlayElement and gui::Element. - //@{ - virtual void setIsVisible(bool isVisible) const; - virtual void setIsDirtyLayout(bool isDirty) const; - virtual m2::RectD GetBoundRect() const; - - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - - void cache(); - void purge(); - void layout(); - - void setController(gui::Controller * controller); - - bool onTapStarted(m2::PointD const & pt); - bool onTapMoved(m2::PointD const & pt); - bool onTapEnded(m2::PointD const & pt); - bool onTapCancelled(m2::PointD const & pt); - //@} - -private: - virtual void CountryGroupChanged(storage::ActiveMapsLayout::TGroup const & oldGroup, int oldPosition, - storage::ActiveMapsLayout::TGroup const & newGroup, int newPosition) {} - virtual void CountryStatusChanged(storage::ActiveMapsLayout::TGroup const & group, int position, - storage::TStatus const & oldStatus, storage::TStatus const & newStatus); - virtual void CountryOptionsChanged(storage::ActiveMapsLayout::TGroup const & group, int position, - MapOptions const & oldOpt, MapOptions const & newOpt) - { - } - virtual void DownloadingProgressUpdate(storage::ActiveMapsLayout::TGroup const & group, int position, - storage::LocalAndRemoteSizeT const & progress); - - template - string FormatStatusMessage(string const & msgID, T1 const * t1 = 0, T2 const * t2 = 0); - - void FormatDisplayName(string const & mapName, string const & groupName); - - void SetVisibilityForState() const; - void SetContentForState(); - void SetContentForDownloadPropose(); - void SetContentForProgress(); - void SetContentForInQueue(); - void SetContentForError(); - - void ComposeElementsForState(); - - typedef function const &, m2::PointD const &)> TTapActionFn; - bool OnTapAction(TTapActionFn const & action, m2::PointD const & pt); - void OnButtonClicked(Element const * button); - - void Repaint() const; - - bool IsStatusFailed() const; - -private: - storage::ActiveMapsLayout & m_activeMaps; - int m_activeMapsSlotID = 0; - - unique_ptr m_label; - unique_ptr m_primaryButton; - unique_ptr m_secondaryButton; - - string m_displayMapName; - mutable storage::TStatus m_countryStatus = storage::TStatus::EUnknown; - storage::TIndex m_countryIdx; - storage::LocalAndRemoteSizeT m_progressSize; - - TDownloadCountryFn m_downloadCallback; - - void Lock() const; - void Unlock() const; -#ifdef OMIM_OS_ANDROID - mutable threads::Mutex m_mutex; -#endif -}; diff --git a/map/country_tree.cpp b/map/country_tree.cpp index 40b062ef29..5f05e34707 100644 --- a/map/country_tree.cpp +++ b/map/country_tree.cpp @@ -40,9 +40,9 @@ inline TIndex GetIndexParent(TIndex const & index) return parent; } -CountryTree::CountryTree(Framework & framework) +CountryTree::CountryTree(shared_ptr activeMaps) { - m_layout.reset(new ActiveMapsLayout(framework)); + m_layout = activeMaps; ConnectToCoreStorage(); } @@ -65,19 +65,6 @@ CountryTree & CountryTree::operator=(CountryTree const & other) return *this; } -void CountryTree::Init(vector const & maps) -{ - ASSERT(IsValid(), ()); - m_layout->Init(maps); -} - -void CountryTree::Clear() -{ - ASSERT(IsValid(), ()); - ResetRoot(); - m_layout->Clear(); -} - ActiveMapsLayout & CountryTree::GetActiveMapLayout() { ASSERT(IsValid(), ()); diff --git a/map/country_tree.hpp b/map/country_tree.hpp index 58f82c318b..f8e3e28142 100644 --- a/map/country_tree.hpp +++ b/map/country_tree.hpp @@ -31,17 +31,13 @@ public: }; CountryTree() = default; - explicit CountryTree(Framework & framework); + explicit CountryTree(shared_ptr activeMaps); CountryTree(CountryTree const & other) = delete; ~CountryTree(); CountryTree & operator=(CountryTree const & other); - /// @param[in] Sorted vector of current .mwm files. - void Init(vector const & maps); - void Clear(); - ActiveMapsLayout & GetActiveMapLayout(); ActiveMapsLayout const & GetActiveMapLayout() const; @@ -96,7 +92,7 @@ private: private: int m_subscribeSlotID = 0; - mutable shared_ptr m_layout; + shared_ptr m_layout; buffer_vector m_levelItems; diff --git a/map/framework.cpp b/map/framework.cpp index 9582660e09..3516bd7327 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1,20 +1,8 @@ -#include "framework.hpp" -#include "benchmark_provider.hpp" -#include "benchmark_engine.hpp" -#include "geourl_process.hpp" -#include "navigator_utils.hpp" -#include "ge0_parser.hpp" +#include "map/framework.hpp" -#include "render/cpu_drawer.hpp" -#include "render/gpu_drawer.hpp" - -#ifndef USE_DRAPE - #include "render/feature_processor.hpp" - #include "render/drawer.hpp" - #include "render/proto_to_styles.hpp" -#else - #include "../drape_frontend/visual_params.hpp" -#endif // USE_DRAPE +#include "map/ge0_parser.hpp" +#include "map/geourl_process.hpp" +#include "map/storage_bridge.hpp" #include "defines.hpp" @@ -29,8 +17,14 @@ #include "search/search_engine.hpp" #include "search/search_query_factory.hpp" +#include "drape_frontend/gui/country_status_helper.hpp" +#include "drape_frontend/visual_params.hpp" +#include "drape_frontend/watch/cpu_drawer.hpp" +#include "drape_frontend/watch/feature_processor.hpp" + #include "indexer/categories_holder.hpp" #include "indexer/classificator_loader.hpp" +#include "indexer/drawing_rules.hpp" #include "indexer/feature.hpp" #include "indexer/map_style_reader.hpp" #include "indexer/scales.hpp" @@ -43,10 +37,6 @@ #include "storage/country_info_getter.hpp" -#include "anim/controller.hpp" - -#include "gui/controller.hpp" - #include "platform/local_country_file_utils.hpp" #include "platform/measurement_utils.hpp" #include "platform/mwm_version.hpp" @@ -63,13 +53,12 @@ #include "geometry/angles.hpp" #include "geometry/distance_on_sphere.hpp" -#include "graphics/depth_constants.hpp" - #include "base/math.hpp" #include "base/timer.hpp" #include "base/scope_guard.hpp" #include "std/algorithm.hpp" +#include "std/bind.hpp" #include "std/target_os.hpp" #include "std/vector.hpp" @@ -112,7 +101,10 @@ pair Framework::RegisterMap( return m_model.RegisterMap(localFile); } -void Framework::OnLocationError(TLocationError /*error*/) {} +void Framework::OnLocationError(TLocationError /*error*/) +{ + CallDrapeFunction(bind(&df::DrapeEngine::CancelMyPosition, _1)); +} void Framework::OnLocationUpdate(GpsInfo const & info) { @@ -139,17 +131,11 @@ void Framework::OnLocationUpdate(GpsInfo const & info) #endif location::RouteMatchingInfo routeMatchingInfo; CheckLocationForRouting(rInfo); - bool hasDistanceFromBegin = false; - double distanceFromBegin = 0.0; - MatchLocationToRoute(rInfo, routeMatchingInfo, hasDistanceFromBegin, distanceFromBegin); - shared_ptr const & state = GetLocationState(); - state->OnLocationUpdate(rInfo, m_routingSession.IsNavigable(), routeMatchingInfo); + MatchLocationToRoute(rInfo, routeMatchingInfo); - if (state->IsModeChangeViewport()) - UpdateUserViewportChanged(); - - m_bmManager.UpdateRouteDistanceFromBegin(hasDistanceFromBegin ? distanceFromBegin : 0.0); + CallDrapeFunction(bind(&df::DrapeEngine::SetGpsInfo, _1, rInfo, + m_routingSession.IsNavigable(), routeMatchingInfo)); } void Framework::OnCompassUpdate(CompassInfo const & info) @@ -161,70 +147,66 @@ void Framework::OnCompassUpdate(CompassInfo const & info) CompassInfo const & rInfo = info; #endif - GetLocationState()->OnCompassUpdate(rInfo); + CallDrapeFunction(bind(&df::DrapeEngine::SetCompassInfo, _1, rInfo)); +} + +void Framework::SwitchMyPositionNextMode() +{ + CallDrapeFunction(bind(&df::DrapeEngine::MyPositionNextMode, _1)); +} + +void Framework::InvalidateMyPosition() +{ + CallDrapeFunction(bind(&df::DrapeEngine::InvalidateMyPosition, _1)); +} + +void Framework::SetMyPositionModeListener(location::TMyPositionModeChanged const & fn) +{ + m_myPositionListener = fn; +} + +void Framework::OnUserPositionChanged(m2::PointD const & position) +{ + MyPositionMarkPoint * myPosition = UserMarkContainer::UserMarkForMyPostion(); + myPosition->SetUserPosition(position); + + if (IsRoutingActive()) + m_routingSession.SetUserCurrentPosition(position); +} + +void Framework::CallDrapeFunction(TDrapeFunction const & fn) +{ + if (m_drapeEngine) + fn(m_drapeEngine.get()); } void Framework::StopLocationFollow() { - GetLocationState()->StopLocationFollow(); -} - -InformationDisplay & Framework::GetInformationDisplay() -{ - return m_informationDisplay; -} - -CountryStatusDisplay * Framework::GetCountryStatusDisplay() const -{ - return m_informationDisplay.countryStatusDisplay().get(); -} - -void Framework::SetWidgetPivot(InformationDisplay::WidgetType widget, m2::PointD const & pivot) -{ - m_informationDisplay.SetWidgetPivot(widget, pivot); -} - -m2::PointD Framework::GetWidgetSize(InformationDisplay::WidgetType widget) const -{ - return m_informationDisplay.GetWidgetSize(widget); + CallDrapeFunction(bind(&df::DrapeEngine::StopLocationFollow, _1)); } Framework::Framework() - : m_navigator(m_scales), - m_animator(this), - m_queryMaxScaleMode(false), - m_width(0), - m_height(0), - m_countryTree(*this), - m_guiController(new gui::Controller), - m_animController(new anim::Controller), - m_informationDisplay(this), - m_benchmarkEngine(0), - m_bmManager(*this), - m_balloonManager(*this), - m_fixedSearchResults(0), - m_locationChangedSlotID(-1) + : m_bmManager(*this) + , m_fixedSearchResults(0) { + m_activeMaps.reset(new ActiveMapsLayout(*this)); + m_globalCntTree = storage::CountryTree(m_activeMaps); + m_storageBridge = make_unique_dp(m_activeMaps, bind(&Framework::UpdateCountryInfo, this, _1, false)); + // Restore map style before classificator loading int mapStyle = MapStyleLight; if (!Settings::Get(kMapStyleKey, mapStyle)) mapStyle = MapStyleClear; GetStyleReader().SetCurrentStyle(static_cast(mapStyle)); - // Checking whether we should enable benchmark. - bool isBenchmarkingEnabled = false; - (void)Settings::Get("IsBenchmarking", isBenchmarkingEnabled); - if (isBenchmarkingEnabled) - m_benchmarkEngine = new BenchmarkEngine(this); - - m_ParsedMapApi.SetController(&m_bmManager.UserMarksGetController(UserMarkContainer::API_MARK)); + m_ParsedMapApi.SetBookmarkManager(&m_bmManager); // Init strings bundle. // @TODO. There are hardcoded strings below which are defined in strings.txt as well. // It's better to use strings form strings.txt intead of hardcoding them here. m_stringsBundle.SetDefaultString("country_status_added_to_queue", "^\nis added to the downloading queue"); - m_stringsBundle.SetDefaultString("country_status_downloading", "Downloading\n^\n^%"); - m_stringsBundle.SetDefaultString("country_status_download", "Download map\n^ ^"); + m_stringsBundle.SetDefaultString("country_status_downloading", "Downloading\n^\n^"); + m_stringsBundle.SetDefaultString("country_status_download", "Download map\n(^ ^)"); m_stringsBundle.SetDefaultString("country_status_download_failed", "Downloading\n^\nhas failed"); m_stringsBundle.SetDefaultString("country_status_download_without_routing", "Download map\nwithout routing (^ ^)"); m_stringsBundle.SetDefaultString("try_again", "Try Again"); @@ -243,15 +225,6 @@ Framework::Framework() m_stringsBundle.SetDefaultString("routing_failed_route_not_found", "There is no route found between the selected origin and destination.Please select a different start or end point."); m_stringsBundle.SetDefaultString("routing_failed_internal_error", "Internal error occurred. Please try to delete and download the map again. If problem persist please contact us at support@maps.me."); - m_guiController->SetStringsBundle(&m_stringsBundle); - - // Init information display. - m_informationDisplay.setController(m_guiController.get()); - -#ifdef DRAW_TOUCH_POINTS - m_informationDisplay.enableDebugPoints(true); -#endif - m_model.InitClassificator(); m_model.SetOnMapDeregisteredCallback(bind(&Framework::OnMapDeregistered, this, _1)); LOG(LDEBUG, ("Classificator initialized")); @@ -276,18 +249,18 @@ Framework::Framework() { alohalytics::LogEvent("Routing_CalculatingRoute", statistics); }; -#ifdef DEBUG - auto const routingVisualizerFn = [this](m2::PointD const & pt) - { - GetPlatform().RunOnGuiThread([this,pt]() - { - m_bmManager.UserMarksGetController(UserMarkContainer::DEBUG_MARK).CreateUserMark(pt); - Invalidate(); - }); - }; -#else +//#ifdef DEBUG +// auto const routingVisualizerFn = [this](m2::PointD const & pt) +// { +// GetPlatform().RunOnGuiThread([this,pt]() +// { +// m_bmManager.UserMarksGetController(UserMarkContainer::DEBUG_MARK).CreateUserMark(pt); +// Invalidate(); +// }); +// }; +//#else routing::RouterDelegate::TPointCheckCallback const routingVisualizerFn = nullptr; -#endif +//#endif m_routingSession.Init(routingStatisticsFn, routingVisualizerFn); SetRouterImpl(RouterType::Vehicle); @@ -299,94 +272,78 @@ Framework::Framework() Framework::~Framework() { - delete m_benchmarkEngine; + m_drapeEngine.reset(); + + m_storageBridge.reset(); + m_activeMaps.reset(); m_model.SetOnMapDeregisteredCallback(nullptr); } -void Framework::DrawSingleFrame(m2::PointD const & center, int zoomModifier, - uint32_t pxWidth, uint32_t pxHeight, FrameImage & image, - SingleFrameSymbols const & symbols) +void Framework::DrawWatchFrame(m2::PointD const & center, int zoomModifier, + uint32_t pxWidth, uint32_t pxHeight, + df::watch::FrameSymbols const & symbols, + df::watch::FrameImage & image) { - ASSERT(IsSingleFrameRendererInited(), ()); - Navigator frameNavigator = m_navigator; - frameNavigator.OnSize(0, 0, pxWidth, pxHeight); - frameNavigator.SetAngle(0); + ASSERT(IsWatchFrameRendererInited(), ()); - m2::RectD rect = m_scales.GetRectForDrawScale(scales::GetUpperComfortScale() - 1, center); - if (symbols.m_showSearchResult && !rect.IsPointInside(symbols.m_searchResult)) - { - double const kScaleFactor = 1.3; - m2::PointD oldCenter = rect.Center(); - rect.Add(symbols.m_searchResult); - double const centersDiff = 2 * (rect.Center() - oldCenter).Length(); + int resultZoom = -1; + ScreenBase screen = m_cpuDrawer->CalculateScreen(center, zoomModifier, pxWidth, pxHeight, symbols, resultZoom); + ASSERT_GREATER(resultZoom, 0, ()); - m2::RectD resultRect; - resultRect.SetSizes(rect.SizeX() + centersDiff, rect.SizeY() + centersDiff); - resultRect.SetCenter(center); - resultRect.Scale(kScaleFactor); - rect = resultRect; - ASSERT(rect.IsPointInside(symbols.m_searchResult), ()); - } + uint32_t const bgColor = drule::rules().GetBgColor(resultZoom); + m_cpuDrawer->BeginFrame(pxWidth, pxHeight, dp::Extract(bgColor, 255 - (bgColor >> 24))); - int baseZoom = m_scales.GetDrawTileScale(rect); - int resultZoom = baseZoom + zoomModifier; - int const minZoom = symbols.m_bottomZoom == -1 ? resultZoom : symbols.m_bottomZoom; - resultZoom = my::clamp(resultZoom, minZoom, scales::GetUpperScale()); - rect = m_scales.GetRectForDrawScale(resultZoom, rect.Center()); + m2::RectD renderRect = m2::RectD(0, 0, pxWidth, pxHeight); + m2::RectD selectRect; + m2::RectD clipRect; + double const inflationSize = 24 * m_cpuDrawer->GetVisualScale(); + screen.PtoG(m2::Inflate(renderRect, inflationSize, inflationSize), clipRect); + screen.PtoG(renderRect, selectRect); - CheckMinGlobalRect(rect); - CheckMinMaxVisibleScale(rect); - frameNavigator.SetFromRect(m2::AnyRectD(rect)); + uint32_t const tileSize = static_cast(df::CalculateTileSize(pxWidth, pxHeight)); + int const drawScale = df::GetDrawTileScale(screen, tileSize, m_cpuDrawer->GetVisualScale()); + df::watch::FeatureProcessor doDraw(make_ref(m_cpuDrawer), clipRect, screen, drawScale); - m_cpuDrawer->BeginFrame(pxWidth, pxHeight, ConvertColor(drule::rules().GetBgColor(resultZoom))); - - ScreenBase const & s = frameNavigator.Screen(); - shared_ptr event = make_shared(m_cpuDrawer.get()); - DrawModel(event, s, m2::RectD(0, 0, pxWidth, pxHeight), m_scales.GetTileScaleBase(s), false); + int const upperScale = scales::GetUpperScale(); + m_model.ForEachFeature(selectRect, doDraw, min(upperScale, drawScale)); m_cpuDrawer->Flush(); - m_cpuDrawer->DrawMyPosition(frameNavigator.GtoP(center)); + m_cpuDrawer->DrawMyPosition(screen.GtoP(center)); if (symbols.m_showSearchResult) { - if (!frameNavigator.Screen().PixelRect().IsPointInside(frameNavigator.GtoP(symbols.m_searchResult))) - m_cpuDrawer->DrawSearchArrow(ang::AngleTo(rect.Center(), symbols.m_searchResult)); + if (!screen.PixelRect().IsPointInside(screen.GtoP(symbols.m_searchResult))) + m_cpuDrawer->DrawSearchArrow(ang::AngleTo(center, symbols.m_searchResult)); else - m_cpuDrawer->DrawSearchResult(frameNavigator.GtoP(symbols.m_searchResult)); + m_cpuDrawer->DrawSearchResult(screen.GtoP(symbols.m_searchResult)); } m_cpuDrawer->EndFrame(image); } -void Framework::InitSingleFrameRenderer(graphics::EDensity density, int exactDensityDPI) +void Framework::InitWatchFrameRenderer(float visualScale) { - ASSERT(!IsSingleFrameRendererInited(), ()); + using namespace df::watch; + + ASSERT(!IsWatchFrameRendererInited(), ()); if (m_cpuDrawer == nullptr) { - CPUDrawer::Params params(GetGlyphCacheParams(density, exactDensityDPI)); - params.m_visualScale = graphics::visualScaleExact(exactDensityDPI); - params.m_density = density; - - m_cpuDrawer.reset(new CPUDrawer(params)); + string resPostfix = df::VisualParams::GetResourcePostfix(visualScale); + m_cpuDrawer = make_unique_dp(CPUDrawer::Params(resPostfix, visualScale)); } } -void Framework::ReleaseSingleFrameRenderer() +void Framework::ReleaseWatchFrameRenderer() { - if (IsSingleFrameRendererInited()) + if (IsWatchFrameRendererInited()) m_cpuDrawer.reset(); } -bool Framework::IsSingleFrameRendererInited() const +bool Framework::IsWatchFrameRendererInited() const { return m_cpuDrawer != nullptr; } -double Framework::GetVisualScale() const -{ - return m_scales.GetVisualScale(); -} - void Framework::DeleteCountry(storage::TIndex const & index, MapOptions opt) { switch (opt) @@ -400,9 +357,11 @@ void Framework::DeleteCountry(storage::TIndex const & index, MapOptions opt) // m_model will notify us when latest map file will be deleted via // OnMapDeregistered call. if (m_model.DeregisterMap(countryFile)) - { - InvalidateRect(GetCountryBounds(countryFile.GetNameWithoutExt()), true /* doForceUpdate */); - } + InvalidateRect(GetCountryBounds(countryFile.GetNameWithoutExt())); + + // TODO (@ldragunov, @gorshenin): rewrite routing session to use MwmHandles. Thus, + // it won' be needed to reset it after maps update. + m_routingSession.Reset(); return; } case MapOptions::CarRouting: @@ -446,7 +405,7 @@ void Framework::ShowCountry(TIndex const & index) { StopLocationFollow(); - ShowRectEx(GetCountryBounds(index)); + ShowRect(GetCountryBounds(index)); } void Framework::UpdateLatestCountryFile(LocalCountryFile const & localFile) @@ -461,7 +420,7 @@ void Framework::UpdateLatestCountryFile(LocalCountryFile const & localFile) auto p = m_model.RegisterMap(localFile); MwmSet::MwmId const & id = p.first; if (id.IsAlive()) - InvalidateRect(id.GetInfo()->m_limitRect, true /* doForceUpdate */); + InvalidateRect(id.GetInfo()->m_limitRect); m_searchEngine->ClearViewportsCache(); } @@ -494,14 +453,14 @@ void Framework::RegisterAllMaps() minFormat = min(minFormat, static_cast(id.GetInfo()->m_version.format)); } - m_countryTree.Init(maps); + m_activeMaps->Init(maps); m_searchEngine->SupportOldFormat(minFormat < version::v3); } void Framework::DeregisterAllMaps() { - m_countryTree.Clear(); + m_activeMaps->Clear(); m_model.Clear(); m_storage.Clear(); } @@ -560,22 +519,25 @@ void Framework::ShowBookmark(BookmarkAndCategory const & bnc) StopLocationFollow(); // show ballon above - Bookmark const * bmk = m_bmManager.GetBmCategory(bnc.first)->GetBookmark(bnc.second); + Bookmark const * mark = static_cast(GetBmCategory(bnc.first)->GetUserMark(bnc.second)); - double scale = bmk->GetScale(); + double scale = mark->GetScale(); if (scale == -1.0) scale = scales::GetUpperComfortScale(); - ShowRectExVisibleScale(m_scales.GetRectForDrawScale(scale, bmk->GetOrg())); - Bookmark * mark = GetBmCategory(bnc.first)->GetBookmark(bnc.second); - ActivateUserMark(mark); - m_balloonManager.OnShowMark(mark); + CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewCenter, _1, mark->GetPivot(), scale, true)); + ActivateUserMark(mark, true); } void Framework::ShowTrack(Track const & track) { StopLocationFollow(); - ShowRectEx(track.GetLimitRect()); + ShowRect(track.GetLimitRect()); +} + +void Framework::ClearBookmarks() +{ + m_bmManager.ClearItems(); } namespace @@ -603,7 +565,7 @@ string const GenerateValidAndUniqueFilePathForKML(string const & fileName) return filePath; } -} +} // namespace bool Framework::AddBookmarksFile(string const & filePath) { @@ -656,181 +618,127 @@ bool Framework::AddBookmarksFile(string const & filePath) void Framework::PrepareToShutdown() { -#ifndef USE_DRAPE - SetRenderPolicy(0); -#else - m_drapeEngine.Destroy(); -#endif // USE_DRAPE -} - -void Framework::SetMaxWorldRect() -{ - m_navigator.SetFromRect(m2::AnyRectD(m_model.GetWorldRect())); -} - -bool Framework::NeedRedraw() const -{ - // Checking this here allows to avoid many dummy "IsInitialized" flags in client code. -#ifndef USE_DRAPE - return (m_renderPolicy && m_renderPolicy->NeedRedraw()); -#else - return false; -#endif // USE_DRAPE -} - -void Framework::SetNeedRedraw(bool flag) -{ -#ifndef USE_DRAPE - m_renderPolicy->GetWindowHandle()->setNeedRedraw(flag); - //if (!flag) - // m_doForceUpdate = false; -#endif // USE_DRAPE -} - -void Framework::Invalidate(bool doForceUpdate) -{ - InvalidateRect(MercatorBounds::FullRect(), doForceUpdate); -} - -void Framework::InvalidateRect(m2::RectD const & rect, bool doForceUpdate) -{ -#ifndef USE_DRAPE - if (m_renderPolicy) - { - ASSERT ( rect.IsValid(), () ); - m_renderPolicy->SetForceUpdate(doForceUpdate); - m_renderPolicy->SetInvalidRect(m2::AnyRectD(rect)); - m_renderPolicy->GetWindowHandle()->invalidate(); - } -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif // USE_DRAPE + DestroyDrapeEngine(); } void Framework::SaveState() { - Settings::Set("ScreenClipRect", m_navigator.Screen().GlobalRect()); + Settings::Set("ScreenClipRect", m_currentMovelView.GlobalRect()); } -bool Framework::LoadState() +void Framework::LoadState() { m2::AnyRectD rect; - if (!Settings::Get("ScreenClipRect", rect)) - return false; - - // additional check for valid rect - m2::RectD r = rect.GetGlobalRect(); - if (!m_scales.GetWorldRect().IsRectInside(r)) - return false; - - CheckMinMaxVisibleScale(r); - - double const dx = r.SizeX(); - double const dy = r.SizeY(); - - m2::AnyRectD safeRect(r.Center(), rect.Angle(), m2::RectD(-dx/2, -dy/2, dx/2, dy/2)); - m_navigator.SetFromRect(safeRect); - -#ifdef USE_DRAPE - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif - return true; + if (Settings::Get("ScreenClipRect", rect) && df::GetWorldRect().IsRectInside(rect.GetGlobalRect())) + CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewAnyRect, _1, rect, false)); + else + ShowAll(); } -//@} +void Framework::ShowAll() +{ + CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewAnyRect, _1, m2::AnyRectD(m_model.GetWorldRect()), false)); +} + +m2::PointD Framework::GetPixelCenter() const +{ + return m_currentMovelView.PixelRect().Center(); +} + +m2::PointD const & Framework::GetViewportCenter() const +{ + return m_currentMovelView.GetOrg(); +} + +void Framework::SetViewportCenter(m2::PointD const & pt) +{ + CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewCenter, _1, pt, -1, true)); +} + +m2::RectD Framework::GetCurrentViewport() const +{ + return m_currentMovelView.ClipRect(); +} + +void Framework::ShowRect(double lat, double lon, double zoom) +{ + m2::PointD center(MercatorBounds::FromLatLon(lat, lon)); + CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewCenter, _1, center, zoom, true)); +} + +void Framework::ShowRect(m2::RectD const & rect, int maxScale) +{ + CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewRect, _1, rect, true, maxScale, true)); +} + +void Framework::ShowRect(m2::AnyRectD const & rect) +{ + CallDrapeFunction(bind(&df::DrapeEngine::SetModelViewAnyRect, _1, rect, true)); +} + +void Framework::GetTouchRect(m2::PointD const & center, uint32_t pxRadius, m2::AnyRectD & rect) +{ + m_currentMovelView.GetTouchRect(center, static_cast(pxRadius), rect); +} + +int Framework::AddViewportListener(TViewportChanged const & fn) +{ + ASSERT(m_drapeEngine, ()); + return m_drapeEngine->AddModelViewListener(fn); +} + +void Framework::RemoveViewportListener(int slotID) +{ + ASSERT(m_drapeEngine, ()); + m_drapeEngine->RemoveModeViewListener(slotID); +} void Framework::OnSize(int w, int h) { - if (w < 2) w = 2; - if (h < 2) h = 2; - - m2::RectD oldPixelRect = m_navigator.Screen().PixelRect(); - -#ifndef USE_DRAPE - m_navigator.OnSize(0, 0, w, h); - if (m_renderPolicy) - { - // if gui controller not initialized, than we work in mode "Without gui" - // and no need to set gui layout. We will not render it. - if (m_guiController->GetCacheScreen()) - m_informationDisplay.SetWidgetPivotsByDefault(w, h); - m_renderPolicy->OnSize(w, h); - } -#else - if (!m_drapeEngine.IsNull()) - { - double vs = df::VisualParams::Instance().GetVisualScale(); - m_navigator.OnSize(0, 0, vs * w, vs * h); - //m_navigator.OnSize(0, 0, w, h); - m_drapeEngine->Resize(w, h); - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); - } -#endif // USE_DRAPE - - m_width = w; - m_height = h; - GetLocationState()->OnSize(oldPixelRect); + CallDrapeFunction(bind(&df::DrapeEngine::Resize, _1, max(w, 2), max(h, 2))); } -bool Framework::SetUpdatesEnabled(bool doEnable) +namespace { -#ifndef USE_DRAPE - if (m_renderPolicy) - return m_renderPolicy->GetWindowHandle()->setUpdatesEnabled(doEnable); - else -#endif // USE_DRAPE - return false; + +double ScaleModeToFactor(Framework::EScaleMode mode) +{ + double factors[] = { 2.0, 1.5, 0.5, 0.67 }; + return factors[mode]; +} + +} // namespace + +void Framework::Scale(EScaleMode mode, bool isAnim) +{ + Scale(ScaleModeToFactor(mode), isAnim); +} + +void Framework::Scale(Framework::EScaleMode mode, m2::PointD const & pxPoint, bool isAnim) +{ + Scale(ScaleModeToFactor(mode), pxPoint, isAnim); +} + +void Framework::Scale(double factor, bool isAnim) +{ + Scale(factor, m_currentMovelView.PixelRect().Center(), isAnim); +} + +void Framework::Scale(double factor, m2::PointD const & pxPoint, bool isAnim) +{ + CallDrapeFunction(bind(&df::DrapeEngine::Scale, _1, factor, pxPoint, isAnim)); +} + +void Framework::TouchEvent(df::TouchEvent const & touch) +{ + CallDrapeFunction(bind(&df::DrapeEngine::AddTouchEvent, _1, touch)); } int Framework::GetDrawScale() const { - return m_navigator.GetDrawScale(); + return df::GetDrawTileScale(m_currentMovelView); } -#ifndef USE_DRAPE -RenderPolicy::TRenderFn Framework::DrawModelFn() -{ - bool const isTiling = m_renderPolicy->IsTiling(); - return bind(&Framework::DrawModel, this, _1, _2, _3, _4, isTiling); -} - -void Framework::DrawModel(shared_ptr const & e, - ScreenBase const & screen, - m2::RectD const & renderRect, - int baseScale, bool isTilingQuery) -{ - m2::RectD selectRect; - m2::RectD clipRect; - - double const inflationSize = m_scales.GetClipRectInflation(); - screen.PtoG(m2::Inflate(m2::RectD(renderRect), inflationSize, inflationSize), clipRect); - screen.PtoG(m2::RectD(renderRect), selectRect); - - int drawScale = m_scales.GetDrawTileScale(baseScale); - fwork::FeatureProcessor doDraw(clipRect, screen, e, drawScale); - if (m_queryMaxScaleMode) - drawScale = scales::GetUpperScale(); - - try - { - int const upperScale = scales::GetUpperScale(); - if (isTilingQuery && drawScale <= upperScale) - m_model.ForEachFeature_TileDrawing(selectRect, doDraw, drawScale); - else - m_model.ForEachFeature(selectRect, doDraw, min(upperScale, drawScale)); - } - catch (redraw_operation_cancelled const &) - {} - - e->setIsEmptyDrawing(doDraw.IsEmptyDrawing()); - - if (m_navigator.Update(ElapsedSeconds())) - Invalidate(); -} -#endif // USE_DRAPE - bool Framework::IsCountryLoaded(m2::PointD const & pt) const { // TODO (@gorshenin, @govako): the method's name is quite @@ -844,154 +752,9 @@ bool Framework::IsCountryLoaded(m2::PointD const & pt) const return m_model.IsLoaded(fName); } -#ifndef USE_DRAPE -void Framework::BeginPaint(shared_ptr const & e) +void Framework::InvalidateRect(m2::RectD const & rect) { - if (m_renderPolicy) - m_renderPolicy->BeginFrame(e, m_navigator.Screen()); -} - -void Framework::EndPaint(shared_ptr const & e) -{ - if (m_renderPolicy) - m_renderPolicy->EndFrame(e, m_navigator.Screen()); -} - -void Framework::DrawAdditionalInfo(shared_ptr const & e) -{ - // m_informationDisplay is set and drawn after the m_renderPolicy - ASSERT ( m_renderPolicy, () ); - - graphics::Screen * pScreen = GPUDrawer::GetScreen(e->drawer()); - - pScreen->beginFrame(); - - int const drawScale = GetDrawScale(); - bool const isEmptyModel = m_renderPolicy->IsEmptyModel(); - - if (isEmptyModel) - m_informationDisplay.setEmptyCountryIndex(GetCountryIndex(GetViewportCenter())); - else - m_informationDisplay.setEmptyCountryIndex(storage::TIndex()); - - bool const isCompassEnabled = my::Abs(ang::GetShortestDistance(m_navigator.Screen().GetAngle(), 0.0)) > my::DegToRad(3.0); - bool const isCompasActionEnabled = m_informationDisplay.isCompassArrowEnabled() && m_navigator.InAction(); - - m_informationDisplay.enableCompassArrow(isCompassEnabled || isCompasActionEnabled); - m_informationDisplay.setCompassArrowAngle(m_navigator.Screen().GetAngle()); - - m_informationDisplay.enableRuler(!m_isFullScreenMode && (drawScale > 4 && !m_informationDisplay.isCopyrightActive())); - - m_informationDisplay.setDebugInfo(0, drawScale); - pScreen->endFrame(); - - m_bmManager.DrawItems(e->drawer()); - m_guiController->UpdateElements(); - m_guiController->DrawFrame(pScreen); -} - -void Framework::DoPaint(shared_ptr const & e) -{ - if (m_renderPolicy) - { - m_renderPolicy->DrawFrame(e, m_navigator.Screen()); - - // Don't render additional elements if guiController wasn't initialized. - if (m_guiController->GetCacheScreen() != NULL) - DrawAdditionalInfo(e); - } -} -#endif // USE_DRAPE - -m2::PointD const & Framework::GetViewportCenter() const -{ - return m_navigator.Screen().GetOrg(); -} - -void Framework::SetViewportCenter(m2::PointD const & pt) -{ - m_navigator.CenterViewport(pt); - Invalidate(); -} - -shared_ptr Framework::SetViewportCenterAnimated(m2::PointD const & endPt) -{ - anim::Controller::Guard guard(GetAnimController()); - m2::PointD const & startPt = GetViewportCenter(); - return m_animator.MoveScreen(startPt, endPt, m_navigator.ComputeMoveSpeed(startPt, endPt)); -} - -void Framework::CheckMinGlobalRect(m2::RectD & rect) const -{ - m2::RectD const minRect = m_scales.GetRectForDrawScale(scales::GetUpperStyleScale(), rect.Center()); - if (minRect.IsRectInside(rect)) - rect = minRect; -} - -void Framework::CheckMinMaxVisibleScale(m2::RectD & rect, int maxScale/* = -1*/) const -{ - CheckMinGlobalRect(rect); - - m2::PointD const c = rect.Center(); - int const worldS = scales::GetUpperWorldScale(); - - int scale = m_scales.GetDrawTileScale(rect); - if (scale > worldS && !IsCountryLoaded(c)) - { - // country is not loaded - limit on world scale - rect = m_scales.GetRectForDrawScale(worldS, c); - scale = worldS; - } - - if (maxScale != -1 && scale > maxScale) - { - // limit on passed maximal scale - rect = m_scales.GetRectForDrawScale(maxScale, c); - } -} - -void Framework::ShowRect(double lat, double lon, double zoom) -{ - m2::PointD center(MercatorBounds::FromLatLon(lat, lon)); - ShowRect(center, zoom); -} - -void Framework::ShowRect(m2::PointD const & pt, double zoom) -{ - ShowRectEx(m_scales.GetRectForDrawScale(zoom, pt)); -} - -void Framework::ShowRect(m2::RectD rect) -{ - CheckMinGlobalRect(rect); - - m_navigator.SetFromRect(m2::AnyRectD(rect)); - Invalidate(); -} - -void Framework::ShowRectEx(m2::RectD rect) -{ - CheckMinGlobalRect(rect); - - ShowRectFixed(rect); -} - -void Framework::ShowRectExVisibleScale(m2::RectD rect, int maxScale/* = -1*/) -{ - CheckMinMaxVisibleScale(rect, maxScale); - - ShowRectFixed(rect); -} - -void Framework::ShowRectFixed(m2::RectD const & rect) -{ - ShowRectFixedAR(navi::ToRotated(rect, m_navigator)); -} - -void Framework::ShowRectFixedAR(m2::AnyRectD const & rect) -{ - navi::SetRectFixedAR(rect, m_scales, m_navigator); - Invalidate(); + CallDrapeFunction(bind(&df::DrapeEngine::InvalidateRect, _1, rect)); } void Framework::StartInteractiveSearch(search::SearchParams const & params) @@ -1023,8 +786,18 @@ void Framework::UpdateUserViewportChanged() void Framework::UpdateSearchResults(search::Results const & results) { - FillSearchResultsMarks(results); - Invalidate(); + if (!results.IsEndMarker() && results.GetCount() > 0) + { + // Got here from search thread. Need to switch into GUI thread to modify search mark container. + // Do copy the results structure to pass into GUI thread. + GetPlatform().RunOnGuiThread(bind(&Framework::OnSearchResultsCallbackUI, this, results)); + } +} + +void Framework::OnSearchResultsCallbackUI(search::Results const & results) +{ + if (IsISActive()) + FillSearchResultsMarks(results); } void Framework::ClearAllCaches() @@ -1034,10 +807,83 @@ void Framework::ClearAllCaches() m_searchEngine->ClearAllCaches(); } +void Framework::SetDownloadCountryListener(TDownloadCountryListener const & listener) +{ + m_downloadCountryListener = listener; +} + +void Framework::OnDownloadMapCallback(storage::TIndex const & countryIndex) +{ + if (m_downloadCountryListener != nullptr) + m_downloadCountryListener(countryIndex, static_cast(MapOptions::Map)); + else + m_activeMaps->DownloadMap(countryIndex, MapOptions::Map); +} + +void Framework::OnDownloadMapRoutingCallback(storage::TIndex const & countryIndex) +{ + if (m_downloadCountryListener != nullptr) + m_downloadCountryListener(countryIndex, static_cast(MapOptions::MapWithCarRouting)); + else + m_activeMaps->DownloadMap(countryIndex, MapOptions::MapWithCarRouting); +} + +void Framework::OnDownloadRetryCallback(storage::TIndex const & countryIndex) +{ + if (m_downloadCountryListener != nullptr) + m_downloadCountryListener(countryIndex, -1); + else + m_activeMaps->RetryDownloading(countryIndex); +} + +void Framework::OnUpdateCountryIndex(storage::TIndex const & currentIndex, m2::PointF const & pt) +{ + storage::TIndex newCountryIndex = GetCountryIndex(m2::PointD(pt)); + if (!newCountryIndex.IsValid()) + { + m_drapeEngine->SetInvalidCountryInfo(); + return; + } + + if (currentIndex != newCountryIndex) + UpdateCountryInfo(newCountryIndex, true /* isCurrentCountry */); +} + +void Framework::UpdateCountryInfo(storage::TIndex const & countryIndex, bool isCurrentCountry) +{ + ASSERT(m_activeMaps != nullptr, ()); + + if (!m_drapeEngine) + return; + + string const & fileName = m_storage.CountryByIndex(countryIndex).GetFile().GetNameWithoutExt(); + if (m_model.IsLoaded(fileName)) + { + m_drapeEngine->SetInvalidCountryInfo(); + return; + } + + gui::CountryInfo countryInfo; + + countryInfo.m_countryIndex = countryIndex; + countryInfo.m_currentCountryName = m_activeMaps->GetFormatedCountryName(countryIndex); + countryInfo.m_mapSize = m_activeMaps->GetRemoteCountrySizes(countryIndex).first; + countryInfo.m_routingSize = m_activeMaps->GetRemoteCountrySizes(countryIndex).second; + countryInfo.m_countryStatus = m_activeMaps->GetCountryStatus(countryIndex); + if (countryInfo.m_countryStatus == storage::TStatus::EDownloading) + { + storage::LocalAndRemoteSizeT progress = m_activeMaps->GetDownloadableCountrySize(countryIndex); + countryInfo.m_downloadProgress = progress.first * 100 / progress.second; + } + + m_drapeEngine->SetCountryInfo(countryInfo, isCurrentCountry); +} + void Framework::MemoryWarning() { LOG(LINFO, ("MemoryWarning")); ClearAllCaches(); + SharedBufferManager::instance().clearReserved(); } void Framework::EnterBackground() @@ -1053,211 +899,20 @@ void Framework::EnterBackground() #ifndef OMIM_OS_ANDROID ClearAllCaches(); #endif + + if (m_drapeEngine != nullptr) + m_drapeEngine->SetRenderingEnabled(false); } void Framework::EnterForeground() { m_startForegroundTime = my::Timer::LocalTime(); + + // Drape can be not initialized here in case of the first launch + if (m_drapeEngine != nullptr) + m_drapeEngine->SetRenderingEnabled(true); } -void Framework::ShowAll() -{ - SetMaxWorldRect(); - Invalidate(); -} - -/// @name Drag implementation. -//@{ -m2::PointD Framework::GetPixelCenter() const -{ - return m_navigator.Screen().PixelRect().Center(); -} - -void Framework::StartDrag(DragEvent const & e) -{ - m_navigator.StartDrag(m_navigator.ShiftPoint(e.Pos()), ElapsedSeconds()); - m_informationDisplay.locationState()->DragStarted(); - -#ifndef USE_DRAPE - if (m_renderPolicy) - m_renderPolicy->StartDrag(); -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif // USE_DRAPE -} - -void Framework::DoDrag(DragEvent const & e) -{ - m_navigator.DoDrag(m_navigator.ShiftPoint(e.Pos()), ElapsedSeconds()); - -#ifndef USE_DRAPE - if (m_renderPolicy) - m_renderPolicy->DoDrag(); -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif // USE_DRAPE -} - -void Framework::StopDrag(DragEvent const & e) -{ - m_navigator.StopDrag(m_navigator.ShiftPoint(e.Pos()), ElapsedSeconds(), true); - m_informationDisplay.locationState()->DragEnded(); - -#ifndef USE_DRAPE - if (m_renderPolicy) - { - m_renderPolicy->StopDrag(); - UpdateUserViewportChanged(); - } -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif // USE_DRAPE -} - -void Framework::StartRotate(RotateEvent const & e) -{ - m_navigator.StartRotate(e.Angle(), ElapsedSeconds()); -#ifndef USE_DRAPE - m_renderPolicy->StartRotate(e.Angle(), ElapsedSeconds()); -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif // USE_DRAPE - GetLocationState()->ScaleStarted(); -} - -void Framework::DoRotate(RotateEvent const & e) -{ - m_navigator.DoRotate(e.Angle(), ElapsedSeconds()); -#ifndef USE_DRAPE - m_renderPolicy->DoRotate(e.Angle(), ElapsedSeconds()); -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif -} - -void Framework::StopRotate(RotateEvent const & e) -{ - m_navigator.StopRotate(e.Angle(), ElapsedSeconds()); - shared_ptr const & state = GetLocationState(); - state->Rotated(); - state->ScaleEnded(); -#ifndef USE_DRAPE - m_renderPolicy->StopRotate(e.Angle(), ElapsedSeconds()); -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif - UpdateUserViewportChanged(); -} - -void Framework::Move(double azDir, double factor) -{ - m_navigator.Move(azDir, factor); - - Invalidate(); -} -//@} - -/// @name Scaling. -//@{ -void Framework::ScaleToPoint(ScaleToPointEvent const & e, bool anim) -{ - m2::PointD pt = m_navigator.ShiftPoint(e.Pt()); - GetLocationState()->CorrectScalePoint(pt); - - if (anim) - m_animController->AddTask(m_navigator.ScaleToPointAnim(pt, e.ScaleFactor(), 0.25)); - else - m_navigator.ScaleToPoint(pt, e.ScaleFactor(), 0); - - Invalidate(); - UpdateUserViewportChanged(); -} - -void Framework::ScaleDefault(bool enlarge) -{ - Scale(enlarge ? 1.5 : 2.0/3.0); -} - -void Framework::Scale(double scale) -{ - m2::PointD center = GetPixelCenter(); - GetLocationState()->CorrectScalePoint(center); - m_animController->AddTask(m_navigator.ScaleToPointAnim(center, scale, 0.25)); - - Invalidate(); - UpdateUserViewportChanged(); -} - -void Framework::CalcScalePoints(ScaleEvent const & e, m2::PointD & pt1, m2::PointD & pt2) const -{ - pt1 = m_navigator.ShiftPoint(e.Pt1()); - pt2 = m_navigator.ShiftPoint(e.Pt2()); - - m_informationDisplay.locationState()->CorrectScalePoint(pt1, pt2); -} - -void Framework::StartScale(ScaleEvent const & e) -{ - m2::PointD pt1, pt2; - CalcScalePoints(e, pt1, pt2); - - GetLocationState()->ScaleStarted(); - m_navigator.StartScale(pt1, pt2, ElapsedSeconds()); -#ifndef USE_DRAPE - if (m_renderPolicy) - m_renderPolicy->StartScale(); -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif // USE_DRAPE -} - -void Framework::DoScale(ScaleEvent const & e) -{ - m2::PointD pt1, pt2; - CalcScalePoints(e, pt1, pt2); - - m_navigator.DoScale(pt1, pt2, ElapsedSeconds()); -#ifndef USE_DRAPE - if (m_renderPolicy) - m_renderPolicy->DoScale(); -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif // USE_DRAPE - - if (m_navigator.IsRotatingDuringScale()) - GetLocationState()->Rotated(); -} - -void Framework::StopScale(ScaleEvent const & e) -{ - m2::PointD pt1, pt2; - CalcScalePoints(e, pt1, pt2); - - m_navigator.StopScale(pt1, pt2, ElapsedSeconds()); - -#ifndef USE_DRAPE - if (m_renderPolicy) - { - m_renderPolicy->StopScale(); - UpdateUserViewportChanged(); - } -#else - if (!m_drapeEngine.IsNull()) - m_drapeEngine->UpdateCoverage(m_navigator.Screen()); -#endif // USE_DRAPE - - GetLocationState()->ScaleEnded(); -} -//@} - void Framework::InitCountryInfoGetter() { ASSERT(!m_infoGetter.get(), ("InitCountryInfoGetter() must be called only once.")); @@ -1333,17 +988,16 @@ bool Framework::Search(search::SearchParams const & params) bool Framework::GetCurrentPosition(double & lat, double & lon) const { - shared_ptr const & locationState = m_informationDisplay.locationState(); - - if (locationState->IsModeHasPosition()) - { - m2::PointD const pos = locationState->Position(); - lat = MercatorBounds::YToLat(pos.y); - lon = MercatorBounds::XToLon(pos.x); - return true; - } - else + m2::PointD pos; + MyPositionMarkPoint * myPosMark = UserMarkContainer::UserMarkForMyPostion(); + if (!myPosMark->HasPosition()) return false; + + pos = myPosMark->GetPivot(); + + lat = MercatorBounds::YToLat(pos.y); + lon = MercatorBounds::XToLon(pos.x); + return true; } void Framework::LoadSearchResultMetadata(search::Result & res) const @@ -1366,10 +1020,10 @@ void Framework::LoadSearchResultMetadata(search::Result & res) const void Framework::ShowSearchResult(search::Result const & res) { - UserMarkContainer::Type const type = UserMarkContainer::SEARCH_MARK; - m_bmManager.UserMarksSetVisible(type, true); - m_bmManager.UserMarksClear(type); - m_bmManager.UserMarksSetDrawable(type, false); + UserMarkControllerGuard guard(m_bmManager, UserMarkType::SEARCH_MARK); + guard.m_controller.SetIsDrawable(false); + guard.m_controller.Clear(); + guard.m_controller.SetIsVisible(true); m_lastSearch.Clear(); m_fixedSearchResults = 0; @@ -1406,15 +1060,15 @@ void Framework::ShowSearchResult(search::Result const & res) } StopLocationFollow(); - ShowRectExVisibleScale(m_scales.GetRectForDrawScale(scale, center)); + ShowRect(df::GetRectForDrawScale(scale, center)); search::AddressInfo info; info.MakeFrom(res); - SearchMarkPoint * mark = static_cast(m_bmManager.UserMarksAddMark(type, center)); + SearchMarkPoint * mark = static_cast(guard.m_controller.CreateUserMark(center)); mark->SetInfo(info); - m_balloonManager.OnShowMark(mark); + ActivateUserMark(mark, false); } size_t Framework::ShowAllSearchResults(search::Results const & results) @@ -1441,10 +1095,8 @@ size_t Framework::ShowAllSearchResults(search::Results const & results) FillSearchResultsMarks(results); m_fixedSearchResults = count; - shared_ptr state = GetLocationState(); - state->SetFixedZoom(); // Setup viewport according to results. - m2::AnyRectD viewport = m_navigator.Screen().GlobalRect(); + m2::AnyRectD viewport = m_currentMovelView.GlobalRect(); m2::PointD const center = viewport.Center(); double minDistance = numeric_limits::max(); @@ -1469,26 +1121,22 @@ size_t Framework::ShowAllSearchResults(search::Results const & results) if (!viewport.IsPointInside(pt)) { viewport.SetSizesToIncludePoint(pt); - - ShowRectFixedAR(viewport); - //StopLocationFollow(); + CallDrapeFunction(bind(&df::DrapeEngine::StopLocationFollow, _1)); } - else - minInd = -1; } - if (minInd == -1) - Invalidate(); + // Graphics engine can be recreated (on Android), so we always set up viewport here. + ShowRect(viewport); return count; } void Framework::FillSearchResultsMarks(search::Results const & results) { - UserMarkContainer::Type const type = UserMarkContainer::SEARCH_MARK; - m_bmManager.UserMarksSetVisible(type, true); - m_bmManager.UserMarksSetDrawable(type, true); - m_bmManager.UserMarksClear(type, m_fixedSearchResults); + UserMarkControllerGuard guard(m_bmManager, UserMarkType::SEARCH_MARK); + guard.m_controller.SetIsVisible(true); + guard.m_controller.SetIsDrawable(true); + guard.m_controller.Clear(m_fixedSearchResults); size_t const count = results.GetCount(); for (size_t i = 0; i < count; ++i) @@ -1502,7 +1150,7 @@ void Framework::FillSearchResultsMarks(search::Results const & results) info.MakeFrom(r); m2::PointD const pt = r.GetFeatureCenter(); - SearchMarkPoint * mark = static_cast(m_bmManager.UserMarksAddMark(type, pt)); + SearchMarkPoint * mark = static_cast(guard.m_controller.CreateUserMark(pt)); mark->SetInfo(info); } } @@ -1511,11 +1159,8 @@ void Framework::FillSearchResultsMarks(search::Results const & results) void Framework::CancelInteractiveSearch() { m_lastSearch.Clear(); - m_bmManager.UserMarksClear(UserMarkContainer::SEARCH_MARK); - + UserMarkControllerGuard(m_bmManager, UserMarkType::SEARCH_MARK).m_controller.Clear(); m_fixedSearchResults = 0; - - Invalidate(); } bool Framework::GetDistanceAndAzimut(m2::PointD const & point, @@ -1553,92 +1198,92 @@ bool Framework::GetDistanceAndAzimut(m2::PointD const & point, return (d < 25000.0); } -#ifndef USE_DRAPE -void Framework::SetRenderPolicy(RenderPolicy * renderPolicy) +void Framework::CreateDrapeEngine(ref_ptr contextFactory, DrapeCreationParams && params) { - if (renderPolicy == nullptr) - m_bmManager.PrepareToShutdown(); + using TReadIDsFn = df::MapDataProvider::TReadIDsFn; + using TReadFeaturesFn = df::MapDataProvider::TReadFeaturesFn; + using TUpdateCountryIndexFn = df::MapDataProvider::TUpdateCountryIndexFn; + using TIsCountryLoadedFn = df::MapDataProvider::TIsCountryLoadedFn; + using TDownloadFn = df::MapDataProvider::TDownloadFn; - m_bmManager.ResetScreen(); - m_guiController->ResetRenderParams(); - m_renderPolicy.reset(); - m_renderPolicy.reset(renderPolicy); - - if (m_renderPolicy) - { - m_renderPolicy->SetAnimController(m_animController.get()); - - m_renderPolicy->SetRenderFn(DrawModelFn()); - - m_scales.SetParams(m_renderPolicy->VisualScale(), m_renderPolicy->TileSize()); - - if (m_benchmarkEngine) - m_benchmarkEngine->Start(); - } -} - -void Framework::InitGuiSubsystem() -{ - if (m_renderPolicy) - { - gui::Controller::RenderParams rp(m_renderPolicy->Density(), - m_renderPolicy->DensityExactDPI(), - bind(&WindowHandle::invalidate, - m_renderPolicy->GetWindowHandle().get()), - m_renderPolicy->GetGlyphCache(), - m_renderPolicy->GetCacheScreen().get()); - - m_guiController->SetRenderParams(rp); - m_informationDisplay.setVisualScale(m_renderPolicy->VisualScale()); - m_balloonManager.RenderPolicyCreated(m_renderPolicy->Density()); - - if (m_width != 0 && m_height != 0) - OnSize(m_width, m_height); - - // init Bookmark manager - //@{ - graphics::Screen::Params pr; - pr.m_resourceManager = m_renderPolicy->GetResourceManager(); - pr.m_threadSlot = m_renderPolicy->GetResourceManager()->guiThreadSlot(); - pr.m_renderContext = m_renderPolicy->GetRenderContext(); - - pr.m_storageType = graphics::EMediumStorage; - pr.m_textureType = graphics::ESmallTexture; - - m_bmManager.SetScreen(m_renderPolicy->GetCacheScreen().get()); - //@} - - // Do full invalidate instead of any "pending" stuff. - Invalidate(); - } -} - -RenderPolicy * Framework::GetRenderPolicy() const -{ - return m_renderPolicy.get(); -} -#else -void Framework::CreateDrapeEngine(dp::RefPointer contextFactory, float vs, int w, int h) -{ - typedef df::MapDataProvider::TReadIDsFn TReadIDsFn; - typedef df::MapDataProvider::TReadFeaturesFn TReadFeaturesFn; - typedef df::MapDataProvider::TReadIdCallback TReadIdCallback; - typedef df::MapDataProvider::TReadFeatureCallback TReadFeatureCallback; - - TReadIDsFn idReadFn = [this](TReadIdCallback const & fn, m2::RectD const & r, int scale) + TReadIDsFn idReadFn = [this](df::MapDataProvider::TReadCallback const & fn, m2::RectD const & r, int scale) -> void { m_model.ForEachFeatureID(r, fn, scale); }; - TReadFeaturesFn featureReadFn = [this](TReadFeatureCallback const & fn, vector const & ids) + TReadFeaturesFn featureReadFn = [this](df::MapDataProvider::TReadCallback const & fn, vector const & ids) -> void { m_model.ReadFeatures(fn, ids); }; - m_drapeEngine.Reset(new df::DrapeEngine(contextFactory, df::Viewport(vs, 0, 0, w, h), df::MapDataProvider(idReadFn, featureReadFn))); - OnSize(w, h); + TUpdateCountryIndexFn updateCountryIndex = [this](storage::TIndex const & currentIndex, m2::PointF const & pt) + { + GetPlatform().RunOnGuiThread(bind(&Framework::OnUpdateCountryIndex, this, currentIndex, pt)); + }; + + TIsCountryLoadedFn isCountryLoadedFn = bind(&Framework::IsCountryLoaded, this, _1); + + TDownloadFn downloadMapFn = [this](storage::TIndex const & countryIndex) + { + GetPlatform().RunOnGuiThread(bind(&Framework::OnDownloadMapCallback, this, countryIndex)); + }; + + TDownloadFn downloadMapWithoutRoutingFn = [this](storage::TIndex const & countryIndex) + { + GetPlatform().RunOnGuiThread(bind(&Framework::OnDownloadMapRoutingCallback, this, countryIndex)); + }; + + TDownloadFn downloadRetryFn = [this](storage::TIndex const & countryIndex) + { + GetPlatform().RunOnGuiThread(bind(&Framework::OnDownloadRetryCallback, this, countryIndex)); + }; + + df::DrapeEngine::Params p(contextFactory, + make_ref(&m_stringsBundle), + df::Viewport(0, 0, params.m_surfaceWidth, params.m_surfaceHeight), + df::MapDataProvider(idReadFn, featureReadFn, updateCountryIndex, isCountryLoadedFn, + downloadMapFn, downloadMapWithoutRoutingFn, downloadRetryFn), + params.m_visualScale, + move(params.m_widgetsInitInfo), + make_pair(params.m_initialMyPositionState, params.m_hasMyPositionState)); + + m_drapeEngine = make_unique_dp(move(p)); + AddViewportListener([this](ScreenBase const & screen) + { + m_currentMovelView = screen; + }); + m_drapeEngine->SetTapEventInfoListener(bind(&Framework::OnTapEvent, this, _1, _2, _3, _4)); + m_drapeEngine->SetUserPositionListener(bind(&Framework::OnUserPositionChanged, this, _1)); + OnSize(params.m_surfaceWidth, params.m_surfaceHeight); + + m_drapeEngine->SetMyPositionModeListener(m_myPositionListener); + m_drapeEngine->InvalidateMyPosition(); + + InvalidateUserMarks(); + + // In case of the engine reinitialization simulate the last tap to show selection mark. + if (m_lastTapEvent != nullptr) + { + UserMark const * mark = OnTapEventImpl(m_lastTapEvent->m_pxPoint, m_lastTapEvent->m_isLong, + m_lastTapEvent->m_isMyPosition, m_lastTapEvent->m_feature); + if (mark != nullptr) + ActivateUserMark(mark, true); + } + + // In case of the engine reinitialization recover route. + if (m_routingSession.IsActive()) + InsertRoute(m_routingSession.GetRoute()); +} + +ref_ptr Framework::GetDrapeEngine() +{ + return make_ref(m_drapeEngine); +} + +void Framework::DestroyDrapeEngine() +{ + m_drapeEngine.reset(); } -#endif // USE_DRAPE void Framework::SetMapStyle(MapStyle mapStyle) { @@ -1647,6 +1292,10 @@ void Framework::SetMapStyle(MapStyle mapStyle) GetStyleReader().SetCurrentStyle(mapStyle); classificator::Load(); + drule::LoadRules(); + CallDrapeFunction(bind(&df::DrapeEngine::UpdateMapStyle, _1)); + + InvalidateUserMarks(); alohalytics::TStringMap details {{"mapStyle", strings::to_string(static_cast(mapStyle))}}; alohalytics::Stats::Instance().LogEvent("MapStyle_Changed", details); @@ -1659,12 +1308,24 @@ MapStyle Framework::GetMapStyle() const void Framework::SetupMeasurementSystem() { + GetPlatform().SetupMeasurementSystem(); + Settings::Units units = Settings::Metric; Settings::Get("Units", units); m_routingSession.SetTurnNotificationsUnits(units); - m_informationDisplay.measurementSystemChanged(); - Invalidate(); +} + +void Framework::SetWidgetLayout(gui::TWidgetsLayoutInfo && layout) +{ + ASSERT(m_drapeEngine != nullptr, ()); + m_drapeEngine->SetWidgetLayout(move(layout)); +} + +gui::TWidgetsSizeInfo const & Framework::GetWidgetSizes() +{ + ASSERT(m_drapeEngine != nullptr, ()); + return m_drapeEngine->GetWidgetSizes(); } string Framework::GetCountryCode(m2::PointD const & pt) const @@ -1674,16 +1335,6 @@ string Framework::GetCountryCode(m2::PointD const & pt) const return info.m_flag; } -gui::Controller * Framework::GetGuiController() const -{ - return m_guiController.get(); -} - -anim::Controller * Framework::GetAnimController() const -{ - return m_animController.get(); -} - bool Framework::ShowMapForURL(string const & url) { m2::PointD point; @@ -1694,9 +1345,6 @@ bool Framework::ShowMapForURL(string const & url) enum ResultT { FAILED, NEED_CLICK, NO_NEED_CLICK }; ResultT result = FAILED; - // always hide current balloon here - m_balloonManager.Hide(); - using namespace url_scheme; using namespace strings; @@ -1709,25 +1357,37 @@ bool Framework::ShowMapForURL(string const & url) if (parser.Parse(url, pt, zoom)) { point = MercatorBounds::FromLatLon(pt.m_lat, pt.m_lon); - rect = m_scales.GetRectForDrawScale(zoom, point); + rect = df::GetRectForDrawScale(zoom, point); name = pt.m_name; result = NEED_CLICK; } } else if (StartsWith(url, "mapswithme://") || StartsWith(url, "mwm://")) { - m_bmManager.UserMarksClear(UserMarkContainer::API_MARK); - if (m_ParsedMapApi.SetUriAndParse(url)) { - if (!m_ParsedMapApi.GetViewportRect(m_scales, rect)) - rect = ScalesProcessor::GetWorldRect(); + if (!m_ParsedMapApi.GetViewportRect(rect)) + rect = df::GetWorldRect(); + + // set up controller guard to show api marks + { + UserMarkControllerGuard guard(m_bmManager, UserMarkType::API_MARK); + guard.m_controller.Clear(); + guard.m_controller.SetIsVisible(true); + guard.m_controller.SetIsDrawable(true); + } if ((apiMark = m_ParsedMapApi.GetSinglePoint())) result = NEED_CLICK; else result = NO_NEED_CLICK; } + else + { + UserMarkControllerGuard guard(m_bmManager, UserMarkType::API_MARK); + guard.m_controller.Clear(); + guard.m_controller.SetIsVisible(false); + } } else // Actually, we can parse any geo url scheme with correct coordinates. { @@ -1736,16 +1396,19 @@ bool Framework::ShowMapForURL(string const & url) if (info.IsValid()) { point = MercatorBounds::FromLatLon(info.m_lat, info.m_lon); - rect = m_scales.GetRectForDrawScale(info.m_zoom, point); + rect = df::GetRectForDrawScale(info.m_zoom, point); result = NEED_CLICK; } } if (result != FAILED) { + // always hide current balloon here + DeactivateUserMark(); + // set viewport and stop follow mode if any StopLocationFollow(); - ShowRectExVisibleScale(rect); + ShowRect(rect); if (result != NO_NEED_CLICK) { @@ -1753,143 +1416,53 @@ bool Framework::ShowMapForURL(string const & url) { LOG(LINFO, ("Show API mark:", static_cast(apiMark)->GetName())); - m_balloonManager.OnShowMark(apiMark); + ActivateUserMark(apiMark, false); } else { PoiMarkPoint * mark = GetAddressMark(point); if (!name.empty()) mark->SetName(name); - m_balloonManager.OnShowMark(mark); + ActivateUserMark(mark, false); } } - else - { - m_balloonManager.RemovePin(); - m_balloonManager.Dismiss(); - } return true; } - else - return false; -} - -void Framework::SetViewPortASync(m2::RectD const & r) -{ - m2::AnyRectD const aRect(r); - m_animator.ChangeViewport(aRect, aRect, 0.0); -} - -void Framework::UpdateSelectedMyPosition(m2::PointD const & pt) -{ - MyPositionMarkPoint * myPositionMark = UserMarkContainer::UserMarkForMyPostion(); - myPositionMark->SetPtOrg(pt); - ActivateUserMark(myPositionMark, false); -} - -void Framework::DisconnectMyPositionUpdate() -{ - if (m_locationChangedSlotID != -1) - { - GetLocationState()->RemovePositionChangedListener(m_locationChangedSlotID); - m_locationChangedSlotID = -1; - } -} - -m2::RectD Framework::GetCurrentViewport() const -{ - return m_navigator.Screen().ClipRect(); -} - -bool Framework::IsBenchmarking() const -{ - return m_benchmarkEngine != 0; -} - -#ifndef USE_DRAPE -namespace -{ - -typedef shared_ptr OEPointerT; - -OEPointerT GetClosestToPivot(list const & l, m2::PointD const & pxPoint) -{ - double dist = numeric_limits::max(); - OEPointerT res; - - for (list::const_iterator it = l.begin(); it != l.end(); ++it) - { - double const curDist = pxPoint.SquareLength((*it)->pivot()); - if (curDist < dist) - { - dist = curDist; - res = *it; - } - } - - return res; -} - -} -#endif // USE_DRAPE - -bool Framework::GetVisiblePOI(m2::PointD const & pxPoint, m2::PointD & pxPivot, - search::AddressInfo & info, feature::Metadata & metadata) const -{ -#ifndef USE_DRAPE - ASSERT(m_renderPolicy, ()); - graphics::OverlayElement::UserInfo ui; - - { - // It seems like we don't need to lock frame here. - // Overlay locking and storing items as shared_ptr is enough here. - //m_renderPolicy->FrameLock(); - - m2::PointD const pt = m_navigator.ShiftPoint(pxPoint); - double const halfSize = TOUCH_PIXEL_RADIUS * GetVisualScale(); - - list candidates; - m2::RectD const rect(pt.x - halfSize, pt.y - halfSize, - pt.x + halfSize, pt.y + halfSize); - - graphics::Overlay * frameOverlay = m_renderPolicy->FrameOverlay(); - frameOverlay->lock(); - frameOverlay->selectOverlayElements(rect, candidates); - frameOverlay->unlock(); - - OEPointerT elem = GetClosestToPivot(candidates, pt); - - if (elem) - ui = elem->userInfo(); - - //m_renderPolicy->FrameUnlock(); - } - - if (ui.IsValid()) - { - Index::FeaturesLoaderGuard guard(m_model.GetIndex(), ui.m_featureID.m_mwmId); - - FeatureType ft; - guard.GetFeatureByIndex(ui.m_featureID.m_index, ft); - - ft.ParseMetadata(); - metadata = ft.GetMetadata(); - - // @TODO experiment with other pivots - ASSERT_NOT_EQUAL(ft.GetFeatureType(), feature::GEOM_LINE, ()); - m2::PointD const center = feature::GetCenter(ft); - - GetAddressInfo(ft, center, info); - - pxPivot = GtoP(center); - return true; - } -#endif // USE_DRAPE - + return false; } +bool Framework::GetVisiblePOI(m2::PointD const & glbPoint, search::AddressInfo & info, feature::Metadata & metadata) const +{ + ASSERT(m_drapeEngine != nullptr, ()); + FeatureID id = m_drapeEngine->GetVisiblePOI(glbPoint); + if (!id.IsValid()) + return false; + + GetVisiblePOI(id, info, metadata); + return true; +} + +m2::PointD Framework::GetVisiblePOI(FeatureID id, search::AddressInfo & info, feature::Metadata & metadata) const +{ + ASSERT(id.IsValid(), ()); + Index::FeaturesLoaderGuard guard(m_model.GetIndex(), id.m_mwmId); + + FeatureType ft; + guard.GetFeatureByIndex(id.m_index, ft); + + ft.ParseMetadata(); + metadata = ft.GetMetadata(); + + ASSERT_NOT_EQUAL(ft.GetFeatureType(), feature::GEOM_LINE, ()); + m2::PointD const center = feature::GetCenter(ft); + + GetAddressInfo(ft, center, info); + + return GtoP(center); +} + namespace { @@ -1948,117 +1521,6 @@ void Framework::FindClosestPOIMetadata(m2::PointD const & pt, feature::Metadata doFind.LoadMetadata(m_model, metadata); } -Animator & Framework::GetAnimator() -{ - return m_animator; -} - -Navigator & Framework::GetNavigator() -{ - return m_navigator; -} - -shared_ptr const & Framework::GetLocationState() const -{ - return m_informationDisplay.locationState(); -} - -void Framework::ActivateUserMark(UserMark const * mark, bool needAnim) -{ - if (mark != UserMarkContainer::UserMarkForMyPostion()) - DisconnectMyPositionUpdate(); - m_bmManager.ActivateMark(mark, needAnim); -} - -bool Framework::HasActiveUserMark() const -{ - return m_bmManager.UserMarkHasActive(); -} - -UserMark const * Framework::GetUserMark(m2::PointD const & pxPoint, bool isLongPress) -{ - // The main idea is to calculate POI rank based on the frequency users are clicking them. - UserMark const * mark = GetUserMarkWithoutLogging(pxPoint, isLongPress); - - alohalytics::TStringMap details {{"isLongPress", isLongPress ? "1" : "0"}}; - if (mark) - mark->FillLogEvent(details); - alohalytics::Stats::Instance().LogEvent("$GetUserMark", details); - - return mark; -} - -UserMark const * Framework::GetUserMarkWithoutLogging(m2::PointD const & pxPoint, bool isLongPress) -{ - DisconnectMyPositionUpdate(); - m2::AnyRectD rect; - m_navigator.GetTouchRect(pxPoint, TOUCH_PIXEL_RADIUS * GetVisualScale(), rect); - - shared_ptr const & locationState = GetLocationState(); - if (locationState->IsModeHasPosition()) - { - m2::PointD const & glPivot = locationState->Position(); - if (rect.IsPointInside(glPivot)) - { - search::AddressInfo info; - info.m_name = m_stringsBundle.GetString("my_position"); - MyPositionMarkPoint * myPostition = UserMarkContainer::UserMarkForMyPostion(); - m_locationChangedSlotID = locationState->AddPositionChangedListener(bind(&Framework::UpdateSelectedMyPosition, this, _1)); - myPostition->SetPtOrg(glPivot); - myPostition->SetInfo(info); - return myPostition; - } - } - - m2::AnyRectD bmSearchRect; - double const pxWidth = TOUCH_PIXEL_RADIUS * GetVisualScale(); - double const pxHeight = (TOUCH_PIXEL_RADIUS + BM_TOUCH_PIXEL_INCREASE) * GetVisualScale(); - m_navigator.GetTouchRect(pxPoint + m2::PointD(0, BM_TOUCH_PIXEL_INCREASE), pxWidth, pxHeight, bmSearchRect); - - UserMark const * mark = m_bmManager.FindNearestUserMark( - [&rect, &bmSearchRect](UserMarkContainer::Type type) -> m2::AnyRectD const & - { - return (type == UserMarkContainer::BOOKMARK_MARK ? bmSearchRect : rect); - }); - - if (mark == NULL) - { - bool needMark = false; - m2::PointD pxPivot; - search::AddressInfo info; - feature::Metadata metadata; - if (GetVisiblePOI(pxPoint, pxPivot, info, metadata)) - needMark = true; - else if (isLongPress) - { - GetAddressInfoForPixelPoint(pxPoint, info); - pxPivot = pxPoint; - needMark = true; - } - - if (needMark) - { - PoiMarkPoint * poiMark = UserMarkContainer::UserMarkForPoi(); - poiMark->SetPtOrg(m_navigator.PtoG(pxPivot)); - poiMark->SetInfo(info); - poiMark->SetMetadata(move(metadata)); - mark = poiMark; - } - } - - return mark; -} - -PoiMarkPoint * Framework::GetAddressMark(m2::PointD const & globalPoint) const -{ - search::AddressInfo info; - GetAddressInfoForGlobalPoint(globalPoint, info); - PoiMarkPoint * mark = UserMarkContainer::UserMarkForPoi(); - mark->SetPtOrg(globalPoint); - mark->SetInfo(info); - return mark; -} - BookmarkAndCategory Framework::FindBookmark(UserMark const * mark) const { BookmarkAndCategory empty = MakeEmptyBookmarkAndCategory(); @@ -2074,9 +1536,9 @@ BookmarkAndCategory Framework::FindBookmark(UserMark const * mark) const ASSERT(result.first != empty.first, ()); BookmarkCategory const * cat = GetBmCategory(result.first); - for (size_t i = 0; i < cat->GetBookmarksCount(); ++i) + for (size_t i = 0; i < cat->GetUserMarkCount(); ++i) { - if (mark == cat->GetBookmark(i)) + if (mark == cat->GetUserMark(i)) { result.second = i; break; @@ -2087,6 +1549,161 @@ BookmarkAndCategory Framework::FindBookmark(UserMark const * mark) const return result; } +PoiMarkPoint * Framework::GetAddressMark(m2::PointD const & globalPoint) const +{ + search::AddressInfo info; + GetAddressInfoForGlobalPoint(globalPoint, info); + PoiMarkPoint * mark = UserMarkContainer::UserMarkForPoi(); + mark->SetPtOrg(globalPoint); + mark->SetInfo(info); + return mark; +} + +void Framework::ActivateUserMark(UserMark const * mark, bool needAnim) +{ + if (!m_activateUserMarkFn) + return; + + if (mark) + { + m_activateUserMarkFn(mark->Copy()); + m2::PointD pt = mark->GetPivot(); + df::SelectionShape::ESelectedObject object = df::SelectionShape::OBJECT_USER_MARK; + UserMark::Type type = mark->GetMarkType(); + if (type == UserMark::Type::MY_POSITION) + object = df::SelectionShape::OBJECT_MY_POSITION; + else if (type == UserMark::Type::POI) + object = df::SelectionShape::OBJECT_POI; + + CallDrapeFunction(bind(&df::DrapeEngine::SelectObject, _1, object, pt, needAnim)); + } + else + { + m_activateUserMarkFn(nullptr); + CallDrapeFunction(bind(&df::DrapeEngine::DeselectObject, _1)); + } +} + +void Framework::DeactivateUserMark() +{ + CallDrapeFunction(bind(&df::DrapeEngine::DeselectObject, _1)); +} + +bool Framework::HasActiveUserMark() +{ + if (m_drapeEngine == nullptr) + return false; + + return m_drapeEngine->GetSelectedObject() != df::SelectionShape::OBJECT_EMPTY; +} + +void Framework::InvalidateUserMarks() +{ + m_bmManager.InitBookmarks(); + + vector const types = { UserMarkType::SEARCH_MARK, UserMarkType::API_MARK, UserMarkType::DEBUG_MARK }; + for (size_t typeIndex = 0; typeIndex < types.size(); typeIndex++) + { + UserMarkControllerGuard guard(m_bmManager, types[typeIndex]); + guard.m_controller.Update(); + } +} + +void Framework::OnTapEvent(m2::PointD pxPoint, bool isLong, bool isMyPosition, FeatureID feature) +{ + // Back up last tap event to recover selection in case of Drape reinitialization. + if (!m_lastTapEvent) + m_lastTapEvent = make_unique(); + m_lastTapEvent->m_pxPoint = pxPoint; + m_lastTapEvent->m_isLong = isLong; + m_lastTapEvent->m_isMyPosition = isMyPosition; + m_lastTapEvent->m_feature = feature; + + UserMark const * mark = OnTapEventImpl(pxPoint, isLong, isMyPosition, feature); + + { + alohalytics::TStringMap details {{"isLongPress", isLong ? "1" : "0"}}; + if (mark) + mark->FillLogEvent(details); + alohalytics::Stats::Instance().LogEvent("$GetUserMark", details); + } + + ActivateUserMark(mark, true); +} + +void Framework::ResetLastTapEvent() +{ + m_lastTapEvent.reset(); +} + +void Framework::InvalidateRendering() +{ + if (m_drapeEngine != nullptr) + m_drapeEngine->Invalidate(); +} + +UserMark const * Framework::OnTapEventImpl(m2::PointD pxPoint, bool isLong, bool isMyPosition, FeatureID feature) +{ + if (isMyPosition) + { + search::AddressInfo info; + info.m_name = m_stringsBundle.GetString("my_position"); + MyPositionMarkPoint * myPostition = UserMarkContainer::UserMarkForMyPostion(); + myPostition->SetInfo(info); + + return myPostition; + } + + df::VisualParams const & vp = df::VisualParams::Instance(); + + m2::AnyRectD rect; + uint32_t const touchRadius = vp.GetTouchRectRadius(); + m_currentMovelView.GetTouchRect(pxPoint, touchRadius, rect); + + m2::AnyRectD bmSearchRect; + double const bmAddition = BM_TOUCH_PIXEL_INCREASE * vp.GetVisualScale(); + double const pxWidth = touchRadius; + double const pxHeight = touchRadius + bmAddition; + m_currentMovelView.GetTouchRect(pxPoint + m2::PointD(0, bmAddition), + pxWidth, pxHeight, bmSearchRect); + UserMark const * mark = m_bmManager.FindNearestUserMark( + [&rect, &bmSearchRect](UserMarkType type) -> m2::AnyRectD const & + { + return (type == UserMarkType::BOOKMARK_MARK ? bmSearchRect : rect); + }); + + if (mark != nullptr) + return mark; + + bool needMark = false; + m2::PointD pxPivot; + search::AddressInfo info; + feature::Metadata metadata; + + if (feature.IsValid()) + { + pxPivot = GetVisiblePOI(feature, info, metadata); + needMark = true; + } + else if (isLong) + { + GetAddressInfoForPixelPoint(pxPoint, info); + pxPivot = pxPoint; + needMark = true; + } + + if (needMark) + { + PoiMarkPoint * poiMark = UserMarkContainer::UserMarkForPoi(); + poiMark->SetPtOrg(m_currentMovelView.PtoG(pxPivot)); + poiMark->SetInfo(info); + poiMark->SetMetadata(move(metadata)); + return poiMark; + } + + return nullptr; +} + void Framework::PredictLocation(double & lat, double & lon, double accuracy, double bearing, double speed, double elapsedSeconds) { @@ -2106,8 +1723,8 @@ StringsBundle const & Framework::GetStringsBundle() string Framework::CodeGe0url(Bookmark const * bmk, bool addName) { - double lat = MercatorBounds::YToLat(bmk->GetOrg().y); - double lon = MercatorBounds::XToLon(bmk->GetOrg().x); + double lat = MercatorBounds::YToLat(bmk->GetPivot().y); + double lon = MercatorBounds::XToLon(bmk->GetPivot().x); return CodeGe0url(lat, lon, bmk->GetScale(), addName ? bmk->GetName() : ""); } @@ -2156,50 +1773,83 @@ void Framework::UpdateSavedDataVersion() Settings::Set("DataVersion", m_storage.GetCurrentDataVersion()); } +void Framework::BuildRoute(m2::PointD const & finish, uint32_t timeoutSec) +{ + ASSERT_THREAD_CHECKER(m_threadChecker, ("BuildRoute")); + ASSERT(m_drapeEngine != nullptr, ()); + + m2::PointD start; + if (!m_drapeEngine->GetMyPosition(start)) + { + CallRouteBuilded(IRouter::NoCurrentPosition, vector(), vector()); + return; + } + + BuildRoute(start, finish, timeoutSec); +} + void Framework::BuildRoute(m2::PointD const & start, m2::PointD const & finish, uint32_t timeoutSec) { ASSERT_THREAD_CHECKER(m_threadChecker, ("BuildRoute")); + ASSERT(m_drapeEngine != nullptr, ()); if (IsRoutingActive()) CloseRouting(); SetLastUsedRouter(m_currentRouterType); + m_routingSession.SetUserCurrentPosition(start); - auto readyCallback = [this](Route const & route, IRouter::ResultCode code) + auto readyCallback = [this] (Route const & route, IRouter::ResultCode code) { - ASSERT_THREAD_CHECKER(m_threadChecker, ("BuildRoute_ReadyCallback")); - vector absentCountries; vector absentRoutingIndexes; if (code == IRouter::NoError) { + double const kRouteScaleMultiplier = 1.5; + InsertRoute(route); - GetLocationState()->RouteBuilded(); - ShowRectExVisibleScale(route.GetPoly().GetLimitRect()); + m2::RectD routeRect = route.GetPoly().GetLimitRect(); + routeRect.Scale(kRouteScaleMultiplier); + ShowRect(routeRect, -1); } else { for (string const & name : route.GetAbsentCountries()) { storage::TIndex fileIndex = m_storage.FindIndexByFile(name); - if (m_storage.GetLatestLocalFile(fileIndex) && code != IRouter::FileTooOld) + if (m_storage.GetLatestLocalFile(fileIndex)) absentRoutingIndexes.push_back(fileIndex); else absentCountries.push_back(fileIndex); } if (code != IRouter::NeedMoreMaps) - RemoveRoute(); + RemoveRoute(true /* deactivateFollowing */); } CallRouteBuilded(code, absentCountries, absentRoutingIndexes); }; - m_routingSession.BuildRoute(start, finish, - [readyCallback](Route const & route, IRouter::ResultCode code) - { - GetPlatform().RunOnGuiThread(bind(readyCallback, route, code)); - }, - m_progressCallback, timeoutSec); + m_routingSession.BuildRoute(start, finish, readyCallback, m_progressCallback, timeoutSec); +} + +void Framework::FollowRoute() +{ + ASSERT(m_drapeEngine != nullptr, ()); + + int const scale = (m_currentRouterType == RouterType::Pedestrian) ? + scales::GetUpperComfortScale() : + scales::GetNavigationScale(); + + m_drapeEngine->FollowRoute(scale); +} + +bool Framework::DisableFollowMode() +{ + bool const disabled = m_routingSession.DisableFollowMode(); + if (disabled && m_drapeEngine != nullptr) + m_drapeEngine->DeactivateRouteFollowing(); + + return disabled; } void Framework::SetRouter(RouterType type) @@ -2249,43 +1899,22 @@ void Framework::SetRouterImpl(RouterType type) m_currentRouterType = type; } -void Framework::RemoveRoute() +void Framework::RemoveRoute(bool deactivateFollowing) { - ASSERT_THREAD_CHECKER(m_threadChecker, ("RemoveRoute")); - - m_bmManager.UserMarksClear(UserMarkContainer::DEBUG_MARK); - - m_bmManager.ResetRouteTrack(); -} - -bool Framework::DisableFollowMode() -{ - GetLocationState()->SetRoutingNotFollow(); - return m_routingSession.DisableFollowMode(); -} - -void Framework::FollowRoute() -{ - int const scale = (m_currentRouterType == RouterType::Pedestrian) ? - scales::GetPedestrianNavigationScale() : - scales::GetNavigationScale(); - - GetLocationState()->StartRouteFollow(scale); + if (m_drapeEngine != nullptr) + m_drapeEngine->RemoveRoute(deactivateFollowing); } void Framework::CloseRouting() { - ASSERT_THREAD_CHECKER(m_threadChecker, ("CloseRouting")); - - GetLocationState()->StopRoutingMode(); m_routingSession.Reset(); - RemoveRoute(); - Invalidate(); + RemoveRoute(true /* deactivateFollowing */); } void Framework::InsertRoute(Route const & route) { - ASSERT_THREAD_CHECKER(m_threadChecker, ("InsertRoute")); + if (m_drapeEngine == nullptr) + return; if (route.GetPoly().GetSize() < 2) { @@ -2293,23 +1922,17 @@ void Framework::InsertRoute(Route const & route) return; } - vector turnsDistances; + vector turns; if (m_currentRouterType == RouterType::Vehicle) - { - route.GetTurnsDistances(turnsDistances); - } + route.GetTurnsDistances(turns); - /// @todo Consider a style parameter for the route color. - graphics::Color routeColor; + dp::Color routeColor; if (m_currentRouterType == RouterType::Pedestrian) - routeColor = graphics::Color(5, 105, 175, 204); + routeColor = dp::Color(5, 105, 175, 204); else - routeColor = graphics::Color(30, 150, 240, 204); + routeColor = dp::Color(30, 150, 240, 204); - m_bmManager.SetRouteTrack(route.GetPoly(), turnsDistances, routeColor); - - m_informationDisplay.ResetRouteMatchingInfo(); - Invalidate(); + m_drapeEngine->AddRoute(route.GetPoly(), turns, routeColor); } void Framework::CheckLocationForRouting(GpsInfo const & info) @@ -2317,13 +1940,16 @@ void Framework::CheckLocationForRouting(GpsInfo const & info) if (!IsRoutingActive()) return; - m2::PointD const & position = GetLocationState()->Position(); - if (m_routingSession.OnLocationPositionChanged(position, info, m_model.GetIndex()) == RoutingSession::RouteNeedRebuild) + RoutingSession::State state = m_routingSession.OnLocationPositionChanged(info, m_model.GetIndex()); + if (state == RoutingSession::RouteNeedRebuild) { - auto readyCallback = [this](Route const & route, IRouter::ResultCode code) + auto readyCallback = [this] (Route const & route, IRouter::ResultCode code) { if (code == IRouter::NoError) - GetPlatform().RunOnGuiThread(bind(&Framework::InsertRoute, this, route)); + { + RemoveRoute(false /* deactivateFollowing */); + InsertRoute(route); + } }; m_routingSession.RebuildRoute(MercatorBounds::FromLatLon(info.m_latitude, info.m_longitude), @@ -2331,13 +1957,12 @@ void Framework::CheckLocationForRouting(GpsInfo const & info) } } -void Framework::MatchLocationToRoute(location::GpsInfo & location, location::RouteMatchingInfo & routeMatchingInfo, - bool & hasDistanceFromBegin, double & distanceFromBegin) const +void Framework::MatchLocationToRoute(location::GpsInfo & location, location::RouteMatchingInfo & routeMatchingInfo) const { if (!IsRoutingActive()) return; + m_routingSession.MatchLocationToRoute(location, routeMatchingInfo); - hasDistanceFromBegin = m_routingSession.GetMercatorDistanceFromBegin(distanceFromBegin); } void Framework::CallRouteBuilded(IRouter::ResultCode code, vector const & absentCountries, vector const & absentRoutingFiles) @@ -2416,10 +2041,12 @@ void Framework::SetLastUsedRouter(RouterType type) void Framework::SetRouteStartPoint(m2::PointD const & pt, bool isValid) { - m_bmManager.SetRouteStartPoint(pt, isValid); + if (m_drapeEngine != nullptr) + m_drapeEngine->SetRoutePoint(pt, true /* isStart */, isValid); } void Framework::SetRouteFinishPoint(m2::PointD const & pt, bool isValid) { - m_bmManager.SetRouteFinishPoint(pt, isValid); + if (m_drapeEngine != nullptr) + m_drapeEngine->SetRoutePoint(pt, false /* isStart */, isValid); } diff --git a/map/framework.hpp b/map/framework.hpp index 3f0c957413..d5da42e6dd 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -1,33 +1,20 @@ #pragma once -#include "map/feature_vec_model.hpp" -#include "map/information_display.hpp" -#include "map/location_state.hpp" -#include "map/navigator.hpp" -#include "map/animator.hpp" - -#include "map/api_mark_container.hpp" +#include "map/active_maps_layout.hpp" #include "map/api_mark_point.hpp" #include "map/bookmark.hpp" #include "map/bookmark_manager.hpp" -#include "map/pin_click_manager.hpp" - -#include "map/mwm_url.hpp" -#include "map/move_screen_task.hpp" -#include "map/track.hpp" #include "map/country_tree.hpp" +#include "map/feature_vec_model.hpp" +#include "map/mwm_url.hpp" +#include "map/track.hpp" -#include "routing/routing_session.hpp" +#include "drape_frontend/gui/skin.hpp" +#include "drape_frontend/drape_engine.hpp" +#include "drape_frontend/user_event_stream.hpp" +#include "drape_frontend/watch/frame_image.hpp" -#include "render/events.hpp" -#include "render/scales_processor.hpp" -#ifndef USE_DRAPE - #include "render/render_policy.hpp" - #include "render/window_handle.hpp" -#else - #include "drape/oglcontextfactory.hpp" - #include "drape_frontend/drape_engine.hpp" -#endif // USE_DRAPE +#include "drape/oglcontextfactory.hpp" #include "indexer/data_header.hpp" #include "indexer/map_style.hpp" @@ -40,11 +27,8 @@ #include "platform/country_defines.hpp" #include "platform/location.hpp" -#ifndef USE_DRAPE - #include "graphics/defines.hpp" - #include "graphics/screen.hpp" - #include "graphics/color.hpp" -#endif // USE_DRAPE +#include "routing/router.hpp" +#include "routing/routing_session.hpp" #include "geometry/rect2d.hpp" #include "geometry/screenbase.hpp" @@ -71,14 +55,17 @@ namespace storage class CountryInfoGetter; } -namespace gui { class Controller; } -namespace anim { class Controller; } namespace routing { namespace turns{ class Settings; } } -class CountryStatusDisplay; -class BenchmarkEngine; -struct FrameImage; -class CPUDrawer; +class StorageBridge; + +namespace df +{ + namespace watch + { + class CPUDrawer; + } +} /// Uncomment line to make fixed position settings and /// build version for screenshots. @@ -108,7 +95,8 @@ class Framework #endif protected: - friend class BenchmarkEngine; + using TDrapeFunction = function; + using TDownloadCountryListener = function; StringsBundle m_stringsBundle; @@ -119,39 +107,25 @@ protected: search::QuerySaver m_searchQuerySaver; model::FeaturesFetcher m_model; - ScalesProcessor m_scales; - Navigator m_navigator; - Animator m_animator; + ScreenBase m_currentMovelView; routing::RoutingSession m_routingSession; - typedef vector::iterator CategoryIter; - -#ifndef USE_DRAPE - unique_ptr m_renderPolicy; -#else - dp::MasterPointer m_drapeEngine; -#endif - - unique_ptr m_cpuDrawer; + drape_ptr m_storageBridge; + drape_ptr m_drapeEngine; + drape_ptr m_cpuDrawer; double m_startForegroundTime; - bool m_queryMaxScaleMode; - - int m_width; - int m_height; - - void StopLocationFollow(); + TDownloadCountryListener m_downloadCountryListener; storage::Storage m_storage; - storage::CountryTree m_countryTree; - unique_ptr m_guiController; - unique_ptr m_animController; - InformationDisplay m_informationDisplay; + shared_ptr m_activeMaps; + storage::CountryTree m_globalCntTree; - /// How many pixels around touch point are used to get bookmark or POI - static const int TOUCH_PIXEL_RADIUS = 20; + location::TMyPositionModeChanged m_myPositionListener; + + BookmarkManager m_bmManager; /// This function is called by m_storage when latest local files /// were changed. @@ -160,37 +134,19 @@ protected: /// This function is called by m_model when the map file is deregistered. void OnMapDeregistered(platform::LocalCountryFile const & localFile); - //my::Timer m_timer; - inline double ElapsedSeconds() const - { - //return m_timer.ElapsedSeconds(); - return 0.0; - } -#ifndef USE_DRAPE - void DrawAdditionalInfo(shared_ptr const & e); -#endif // USE_DRAPE - - BenchmarkEngine * m_benchmarkEngine; - - BookmarkManager m_bmManager; - PinClickManager m_balloonManager; - void ClearAllCaches(); + void StopLocationFollow(); + + void CallDrapeFunction(TDrapeFunction const & fn); + public: Framework(); virtual ~Framework(); - struct SingleFrameSymbols - { - m2::PointD m_searchResult; - bool m_showSearchResult = false; - int m_bottomZoom = -1; - }; + void InitWatchFrameRenderer(float visualScale); - /// @param density - for Retina Display you must use EDensityXHDPI - void InitSingleFrameRenderer(graphics::EDensity density, int exactDensityDPI); - /// @param center - map center in ercator + /// @param center - map center in Mercator /// @param zoomModifier - result zoom calculate like "base zoom" + zoomModifier /// if we are have search result "base zoom" calculate that my position and search result /// will be see with some bottom clamp. @@ -199,12 +155,14 @@ public: /// It must be equal render buffer width. For retina it's equal 2.0 * displayWidth /// @param pxHeight - result image height. /// It must be equal render buffer height. For retina it's equal 2.0 * displayHeight + /// @param symbols - configuration for symbols on the frame /// @param image [out] - result image - void DrawSingleFrame(m2::PointD const & center, int zoomModifier, - uint32_t pxWidth, uint32_t pxHeight, FrameImage & image, - SingleFrameSymbols const & symbols); - void ReleaseSingleFrameRenderer(); - bool IsSingleFrameRendererInited() const; + void DrawWatchFrame(m2::PointD const & center, int zoomModifier, + uint32_t pxWidth, uint32_t pxHeight, + df::watch::FrameSymbols const & symbols, + df::watch::FrameImage & image); + void ReleaseWatchFrameRenderer(); + bool IsWatchFrameRendererInited() const; /// Registers all local map files in internal indexes. void RegisterAllMaps(); @@ -226,6 +184,8 @@ public: /// options - flags that signal about parts of map that must be downloaded void DownloadCountry(storage::TIndex const & index, MapOptions opt); + void SetDownloadCountryListener(TDownloadCountryListener const & listener); + storage::TStatus GetCountryStatus(storage::TIndex const & index) const; string GetCountryName(storage::TIndex const & index) const; @@ -235,8 +195,32 @@ public: m2::RectD GetCountryBounds(storage::TIndex const & index) const; void ShowCountry(storage::TIndex const & index); + + /// Checks, whether the country which contains + /// the specified point is loaded + bool IsCountryLoaded(m2::PointD const & pt) const; //@} + void InvalidateRect(m2::RectD const & rect); + + /// @name Get any country info by point. + //@{ + storage::TIndex GetCountryIndex(m2::PointD const & pt) const; + + string GetCountryName(m2::PointD const & pt) const; + /// @param[in] id Country file name without an extension. + string GetCountryName(string const & id) const; + + /// @return country code in ISO 3166-1 alpha-2 format (two small letters) or empty string + string GetCountryCode(m2::PointD const & pt) const; + //@} + + storage::Storage & Storage() { return m_storage; } + shared_ptr & GetActiveMaps() { return m_activeMaps; } + storage::CountryTree & GetCountryTree() { return m_globalCntTree; } + + /// @name Bookmarks, Tracks and other UserMarks + //@{ /// Scans and loads all kml files with bookmarks in WritableDir. void LoadBookmarks(); @@ -262,72 +246,82 @@ public: void ShowBookmark(BookmarkAndCategory const & bnc); void ShowTrack(Track const & track); + void ClearBookmarks(); + bool AddBookmarksFile(string const & filePath); - inline m2::PointD PtoG(m2::PointD const & p) const { return m_navigator.PtoG(p); } - inline m2::PointD GtoP(m2::PointD const & p) const { return m_navigator.GtoP(p); } + BookmarkAndCategory FindBookmark(UserMark const * mark) const; + BookmarkManager & GetBookmarkManager() { return m_bmManager; } - storage::Storage & Storage() { return m_storage; } - storage::CountryTree & GetCountryTree() { return m_countryTree; } + void ActivateUserMark(UserMark const * mark, bool needAnim); + void DeactivateUserMark(); + bool HasActiveUserMark(); + void InvalidateUserMarks(); + PoiMarkPoint * GetAddressMark(m2::PointD const & globalPoint) const; + + using TActivateCallbackFn = function mark)>; + void SetUserMarkActivationListener(TActivateCallbackFn const & fn) { m_activateUserMarkFn = fn; } + + void ResetLastTapEvent(); + + void InvalidateRendering(); + +private: + struct TapEventData + { + m2::PointD m_pxPoint; + bool m_isLong; + bool m_isMyPosition; + FeatureID m_feature; + }; + unique_ptr m_lastTapEvent; + + void OnTapEvent(m2::PointD pxPoint, bool isLong, bool isMyPosition, FeatureID feature); + UserMark const * OnTapEventImpl(m2::PointD pxPoint, bool isLong, bool isMyPosition, FeatureID feature); + //@} + + TActivateCallbackFn m_activateUserMarkFn; + +public: /// @name GPS location updates routine. //@{ void OnLocationError(location::TLocationError error); void OnLocationUpdate(location::GpsInfo const & info); void OnCompassUpdate(location::CompassInfo const & info); + void SwitchMyPositionNextMode(); + void InvalidateMyPosition(); + void SetMyPositionModeListener(location::TMyPositionModeChanged const & fn); + +private: + void OnUserPositionChanged(m2::PointD const & position); //@} -#ifndef USE_DRAPE - void SetRenderPolicy(RenderPolicy * renderPolicy); - void InitGuiSubsystem(); - RenderPolicy * GetRenderPolicy() const; -#else - void CreateDrapeEngine(dp::RefPointer contextFactory, float vs, int w, int h); -#endif // USE_DRAPE +public: + struct DrapeCreationParams + { + float m_visualScale = 1.0f; + int m_surfaceWidth = 0; + int m_surfaceHeight = 0; + gui::TWidgetsInitInfo m_widgetsInitInfo; + + bool m_hasMyPositionState = false; + location::EMyPositionMode m_initialMyPositionState = location::MODE_UNKNOWN_POSITION; + }; + + void CreateDrapeEngine(ref_ptr contextFactory, DrapeCreationParams && params); + ref_ptr GetDrapeEngine(); + void DestroyDrapeEngine(); void SetMapStyle(MapStyle mapStyle); MapStyle GetMapStyle() const; - InformationDisplay & GetInformationDisplay(); - CountryStatusDisplay * GetCountryStatusDisplay() const; - ScalesProcessor & GetScalesProcessor() { return m_scales; } - - /*! - * \brief SetWidgetPivot() places widgets on the screen. - * \param widget is a widget ID. - * \param pivot is a pivot point of a widget in framebuffer coordinates. - * That means pivot points are measured in pixels. - * \note The default pivot points of the widgets on the map are set by - * InformationDisplay::SetWidgetPivotsByDefault() method. If you decide - * to change the default behavior by calling the method - * you should take into account that SetWidgetPivot() shall be called: - * - on the start of the program; - * - when the screen orientation is changed; - * - when the screen size is changed; - * A caller of Framework::OnSize() is a good place for it. - * \note SetWidgetPivot() shall be called only after RenderPolicy is created - * and set to the Framework. - */ - void SetWidgetPivot(InformationDisplay::WidgetType widget, m2::PointD const & pivot); - m2::PointD GetWidgetSize(InformationDisplay::WidgetType widget) const; - - /// Safe function to get current visual scale. - /// Call it when you need do calculate pixel rect (not matter if m_renderPolicy == 0). - /// @return 1.0 if m_renderPolicy == 0 (possible for Android). - double GetVisualScale() const; - - void PrepareToShutdown(); - void SetupMeasurementSystem(); -#ifndef USE_DRAPE - RenderPolicy::TRenderFn DrawModelFn(); + void SetWidgetLayout(gui::TWidgetsLayoutInfo && layout); + const gui::TWidgetsSizeInfo & GetWidgetSizes(); - void DrawModel(shared_ptr const & e, - ScreenBase const & screen, - m2::RectD const & renderRect, - int baseScale, bool isTilingQuery); -#endif // USE_DRAPE + void PrepareToShutdown(); private: void InitCountryInfoGetter(); @@ -336,13 +330,20 @@ private: search::SearchParams m_lastSearch; uint8_t m_fixedSearchResults; + void OnSearchResultsCallback(search::Results const & results); + void OnSearchResultsCallbackUI(search::Results const & results); void FillSearchResultsMarks(search::Results const & results); + void OnDownloadMapCallback(storage::TIndex const & countryIndex); + void OnDownloadMapRoutingCallback(storage::TIndex const & countryIndex); + void OnDownloadRetryCallback(storage::TIndex const & countryIndex); + + void OnUpdateCountryIndex(storage::TIndex const & currentIndex, m2::PointF const & pt); + void UpdateCountryInfo(storage::TIndex const & countryIndex, bool isCurrentCountry); + public: using TSearchRequest = search::QuerySaver::TSearchRequest; - m2::RectD GetCurrentViewport() const; - void UpdateUserViewportChanged(); /// Call this function before entering search GUI. @@ -375,55 +376,60 @@ public: double lat, double lon, double north, string & distance, double & azimut); - /// @name Get any country info by point. + /// @name Manipulating with model view //@{ - storage::TIndex GetCountryIndex(m2::PointD const & pt) const; - - string GetCountryName(m2::PointD const & pt) const; - /// @param[in] id Country file name without an extension. - string GetCountryName(string const & id) const; - - /// @return country code in ISO 3166-1 alpha-2 format (two small letters) or empty string - string GetCountryCode(m2::PointD const & pt) const; - //@} - - void SetMaxWorldRect(); - - void Invalidate(bool doForceUpdate = false); - void InvalidateRect(m2::RectD const & rect, bool doForceUpdate = false); + inline m2::PointD PtoG(m2::PointD const & p) const { return m_currentMovelView.PtoG(p); } + inline m2::PointD GtoP(m2::PointD const & p) const { return m_currentMovelView.GtoP(p); } void SaveState(); - bool LoadState(); + void LoadState(); - /// Resize event from window. - virtual void OnSize(int w, int h); + /// Show all model by it's world rect. + void ShowAll(); - bool SetUpdatesEnabled(bool doEnable); - - int GetDrawScale() const; + m2::PointD GetPixelCenter() const; m2::PointD const & GetViewportCenter() const; void SetViewportCenter(m2::PointD const & pt); - shared_ptr SetViewportCenterAnimated(m2::PointD const & endPt); + + m2::RectD GetCurrentViewport() const; + + /// Show rect for point and needed draw scale. + void ShowRect(double lat, double lon, double zoom); + /// - Check minimal visible scale according to downloaded countries. + void ShowRect(m2::RectD const & rect, int maxScale = -1); + void ShowRect(m2::AnyRectD const & rect); + + void GetTouchRect(m2::PointD const & center, uint32_t pxRadius, m2::AnyRectD & rect); + + using TViewportChanged = df::DrapeEngine::TModelViewListenerFn; + int AddViewportListener(TViewportChanged const & fn); + void RemoveViewportListener(int slotID); + + /// Resize event from window. + void OnSize(int w, int h); + + enum EScaleMode + { + SCALE_MAG, + SCALE_MAG_LIGHT, + SCALE_MIN, + SCALE_MIN_LIGHT + }; + + void Scale(EScaleMode mode, bool isAnim); + void Scale(EScaleMode mode, m2::PointD const & pxPoint, bool isAnim); + void Scale(double factor, bool isAnim); + void Scale(double factor, m2::PointD const & pxPoint, bool isAnim); + + void TouchEvent(df::TouchEvent const & touch); + //@} + + int GetDrawScale() const; /// Set correct viewport, parse API, show balloon. bool ShowMapForURL(string const & url); - bool NeedRedraw() const; - void SetNeedRedraw(bool flag); - - inline void XorQueryMaxScaleMode() - { - m_queryMaxScaleMode = !m_queryMaxScaleMode; - Invalidate(true); - } - - inline void SetQueryMaxScaleMode(bool mode) - { - m_queryMaxScaleMode = mode; - Invalidate(true); - } - /// Get classificator types for nearest features. /// @param[in] pxPoint Current touch point in device pixel coordinates. void GetFeatureTypes(m2::PointD const & pxPoint, vector & types) const; @@ -440,110 +446,22 @@ private: void GetLocality(m2::PointD const & pt, search::AddressInfo & info) const; public: - bool GetVisiblePOI(m2::PointD const & pxPoint, m2::PointD & pxPivot, search::AddressInfo & info, feature::Metadata & metadata) const; + bool GetVisiblePOI(m2::PointD const & glbPoint, search::AddressInfo & info, feature::Metadata & metadata) const; + m2::PointD GetVisiblePOI(FeatureID id, search::AddressInfo & info, feature::Metadata & metadata) const; void FindClosestPOIMetadata(m2::PointD const & pt, feature::Metadata & metadata) const; -#ifndef USE_DRAPE - virtual void BeginPaint(shared_ptr const & e); - /// Function for calling from platform dependent-paint function. - virtual void DoPaint(shared_ptr const & e); - - virtual void EndPaint(shared_ptr const & e); -#endif // USE_DRAPE - -private: - /// Always check rect in public function for minimal draw scale. - void CheckMinGlobalRect(m2::RectD & rect) const; - /// Check for minimal draw scale and maximal logical scale (country is not loaded). - void CheckMinMaxVisibleScale(m2::RectD & rect, int maxScale = -1) const; - - void ShowRectFixed(m2::RectD const & rect); - void ShowRectFixedAR(m2::AnyRectD const & rect); - -public: - /// Show rect for point and needed draw scale. - void ShowRect(double lat, double lon, double zoom); - void ShowRect(m2::PointD const & pt, double zoom); - - /// Set navigator viewport by rect as-is (rect should be in screen viewport). - void ShowRect(m2::RectD rect); - - /// - Use navigator rotate angle. - /// - Check for fixed scales (rect scale matched on draw tile scale). - void ShowRectEx(m2::RectD rect); - /// - Check minimal visible scale according to downloaded countries. - void ShowRectExVisibleScale(m2::RectD rect, int maxScale = -1); - void MemoryWarning(); void EnterBackground(); void EnterForeground(); - /// Show all model by it's world rect. - void ShowAll(); - - /// @name Drag implementation. - //@{ -public: - m2::PointD GetPixelCenter() const; - - void StartDrag(DragEvent const & e); - void DoDrag(DragEvent const & e); - void StopDrag(DragEvent const & e); - void Move(double azDir, double factor); - //@} - - /// @name Rotation implementation - //@{ - void StartRotate(RotateEvent const & e); - void DoRotate(RotateEvent const & e); - void StopRotate(RotateEvent const & e); - //@} - - /// @name Scaling. - //@{ - void ScaleToPoint(ScaleToPointEvent const & e, bool anim = true); - void ScaleDefault(bool enlarge); - void Scale(double scale); - -private: - void CalcScalePoints(ScaleEvent const & e, m2::PointD & pt1, m2::PointD & pt2) const; - -public: - void StartScale(ScaleEvent const & e); - void DoScale(ScaleEvent const & e); - void StopScale(ScaleEvent const & e); - //@} - - gui::Controller * GetGuiController() const; - anim::Controller * GetAnimController() const; - - Animator & GetAnimator(); - Navigator & GetNavigator(); - /// Set the localized strings bundle inline void AddString(string const & name, string const & value) { m_stringsBundle.SetString(name, value); } - bool IsBenchmarking() const; - StringsBundle const & GetStringsBundle(); - PinClickManager & GetBalloonManager() { return m_balloonManager; } - - /// Checks, whether the country which contains - /// the specified point is loaded - bool IsCountryLoaded(m2::PointD const & pt) const; - - shared_ptr const & GetLocationState() const; - void ActivateUserMark(UserMark const * mark, bool needAnim = true); - bool HasActiveUserMark() const; - UserMark const * GetUserMarkWithoutLogging(m2::PointD const & pxPoint, bool isLongPress); - UserMark const * GetUserMark(m2::PointD const & pxPoint, bool isLongPress); - PoiMarkPoint * GetAddressMark(m2::PointD const & globalPoint) const; - BookmarkAndCategory FindBookmark(UserMark const * mark) const; - /// [in] lat, lon - last known location /// [out] lat, lon - predicted location static void PredictLocation(double & lat, double & lon, double accuracy, @@ -560,11 +478,6 @@ public: private: url_scheme::ParsedMapApi m_ParsedMapApi; - void SetViewPortASync(m2::RectD const & rect); - - void UpdateSelectedMyPosition(m2::PointD const & pt); - void DisconnectMyPositionUpdate(); - int m_locationChangedSlotID; public: //@} @@ -575,8 +488,6 @@ public: void UpdateSavedDataVersion(); //@} - BookmarkManager & GetBookmarkManager() { return m_bmManager; } - public: using TRouteBuildingCallback = function const &, @@ -592,6 +503,7 @@ public: bool IsRouteBuilding() const { return m_routingSession.IsBuilding(); } bool IsOnRoute() const { return m_routingSession.IsOnRoute(); } bool IsRouteNavigable() const { return m_routingSession.IsNavigable(); } + void BuildRoute(m2::PointD const & finish, uint32_t timeoutSec); void BuildRoute(m2::PointD const & start, m2::PointD const & finish, uint32_t timeoutSec); // FollowRoute has a bug where the router follows the route even if the method hads't been called. // This method was added because we do not want to break the behaviour that is familiar to our users. @@ -636,14 +548,14 @@ public: private: void SetRouterImpl(routing::RouterType type); - void RemoveRoute(); + void RemoveRoute(bool deactivateFollowing); + void InsertRoute(routing::Route const & route); void CheckLocationForRouting(location::GpsInfo const & info); - void MatchLocationToRoute(location::GpsInfo & info, location::RouteMatchingInfo & routeMatchingInfo, - bool & hasDistanceFromBegin, double & distanceFromBegin) const; void CallRouteBuilded(routing::IRouter::ResultCode code, vector const & absentCountries, vector const & absentRoutingFiles); + void MatchLocationToRoute(location::GpsInfo & info, location::RouteMatchingInfo & routeMatchingInfo) const; string GetRoutingErrorMessage(routing::IRouter::ResultCode code); TRouteBuildingCallback m_routingCallback; @@ -651,13 +563,5 @@ private: routing::RouterType m_currentRouterType; //@} -public: - /// @name Full screen mode - //@{ - void SetFullScreenMode(bool enable) { m_isFullScreenMode = enable; } -private: - bool m_isFullScreenMode = false; - //@} - DECLARE_THREAD_CHECKER(m_threadChecker); }; diff --git a/map/information_display.cpp b/map/information_display.cpp deleted file mode 100644 index 33290a17b8..0000000000 --- a/map/information_display.cpp +++ /dev/null @@ -1,337 +0,0 @@ -#include "map/information_display.hpp" -#include "map/country_status_display.hpp" -#include "map/compass_arrow.hpp" -#include "map/framework.hpp" -#include "map/ruler.hpp" -#include "map/alfa_animation_task.hpp" - -#include "render/drawer.hpp" - -#include "anim/task.hpp" -#include "anim/controller.hpp" - -#include "gui/controller.hpp" -#include "gui/button.hpp" -#include "gui/cached_text_view.hpp" - -#include "graphics/defines.hpp" -#include "graphics/depth_constants.hpp" -#include "graphics/display_list.hpp" - -#include "platform/platform.hpp" - -#include "geometry/transformations.hpp" - - -using namespace graphics; - -namespace -{ - static int const RULLER_X_OFFSET = 6; - static int const RULLER_Y_OFFSET = 42; - static int const FONT_SIZE = 14; - static int const COMPASS_X_OFFSET = 8; - static int const COMPASS_Y_OFFSET = 65; -#ifdef OMIM_OS_ANDROID - static double const RULLER_X_OFFSET_L = 70.4; - static double const RULLER_Y_OFFSET_L = 10.5; - static int const COMPASS_X_OFFSET_L = 18; - static double const COMPASS_Y_OFFSET_L = 11.4; -#endif -} - -InformationDisplay::InformationDisplay(Framework * fw) - : m_framework(fw) -{ - m_fontDesc.m_color = Color(0x4D, 0x4D, 0x4D, 0xCC); - - InitRuler(fw); - InitCountryStatusDisplay(fw); - InitCompassArrow(fw); - InitLocationState(fw); - InitDebugLabel(); - InitCopyright(fw); - -#ifndef DEBUG - enableDebugInfo(false); -#endif - - setVisualScale(1); -} - -void InformationDisplay::InitRuler(Framework * fw) -{ - Ruler::Params p; - - p.m_depth = rulerDepth; - p.m_position = EPosAboveLeft; - p.m_framework = fw; - - m_ruler.reset(new Ruler(p)); - m_ruler->setIsVisible(false); -} - -void InformationDisplay::InitCountryStatusDisplay(Framework * fw) -{ - CountryStatusDisplay::Params p(fw->GetCountryTree().GetActiveMapLayout()); - - p.m_pivot = m2::PointD(0, 0); - p.m_position = EPosCenter; - p.m_depth = countryStatusDepth; - - m_countryStatusDisplay.reset(new CountryStatusDisplay(p)); -} - -void InformationDisplay::InitCopyright(Framework * fw) -{ - gui::CachedTextView::Params p; - - p.m_depth = rulerDepth; - p.m_position = EPosAboveLeft; - p.m_pivot = m2::PointD(0, 0); - p.m_text = "Map data © OpenStreetMap"; - - m_copyrightLabel.reset(new gui::CachedTextView(p)); -} - -void InformationDisplay::InitCompassArrow(Framework * fw) -{ - CompassArrow::Params p; - - p.m_position = EPosCenter; - p.m_depth = compassDepth; - p.m_pivot = m2::PointD(0, 0); - p.m_framework = fw; - - m_compassArrow.reset(new CompassArrow(p)); - m_compassArrow->setIsVisible(false); -} - -void InformationDisplay::InitLocationState(Framework * fw) -{ - location::State::Params p; - - p.m_position = EPosCenter; - p.m_depth = locationDepth; - p.m_pivot = m2::PointD(0, 0); - p.m_locationAreaColor = Color(30, 150, 240, 20); - p.m_framework = fw; - - m_locationState.reset(new location::State(p)); -} - -void InformationDisplay::InitDebugLabel() -{ - gui::CachedTextView::Params p; - - p.m_depth = debugDepth; - p.m_position = EPosAboveRight; - p.m_pivot = m2::PointD(0, 0); - - m_debugLabel.reset(new gui::CachedTextView(p)); -} - -void InformationDisplay::setController(gui::Controller * controller) -{ - m_controller = controller; - m_controller->AddElement(m_countryStatusDisplay); - m_controller->AddElement(m_compassArrow); - m_controller->AddElement(m_locationState); - m_controller->AddElement(m_ruler); - m_controller->AddElement(m_debugLabel); - - m_controller->AddElement(m_copyrightLabel); - shared_ptr task(new AlfaAnimationTask(1.0, 0.0, 0.15, 3.0, m_framework)); - task->AddCallback(anim::Task::EEnded, [this] () - { - m_controller->RemoveElement(m_copyrightLabel); - m_copyrightLabel.reset(); - }); - - m_copyrightLabel->setAnimated([task] () - { - AlfaAnimationTask * t = static_cast(task.get()); - return t->GetCurrentAlfa(); - }); - - m_framework->GetAnimController()->AddTask(task); -} - -void InformationDisplay::SetWidgetPivotsByDefault(int screenWidth, int screenHeight) -{ - double rulerOffsX = RULLER_X_OFFSET; - double rulerOffsY = RULLER_Y_OFFSET; - double compassOffsX = COMPASS_X_OFFSET; - double compassOffsY = COMPASS_Y_OFFSET; - m2::RectI const rect = m2::RectI(0, 0, screenWidth, screenHeight); - -#ifdef OMIM_OS_ANDROID - if (GetPlatform().IsTablet()) - { - rulerOffsX = RULLER_X_OFFSET_L; - rulerOffsY = RULLER_Y_OFFSET_L; - compassOffsX = COMPASS_X_OFFSET_L; - compassOffsY = COMPASS_Y_OFFSET_L; - } -#endif - - double const vs = m_framework->GetVisualScale(); - m_countryStatusDisplay->setPivot(m2::PointD(rect.Center())); - - m2::PointD const size = m_compassArrow->GetPixelSize(); - m_compassArrow->setPivot(m2::PointD(compassOffsX * vs + size.x / 2.0, - rect.maxY() - compassOffsY * vs - size.y / 2.0)); - - m_ruler->setPivot(m2::PointD(rect.maxX() - rulerOffsX * vs, - rect.maxY() - rulerOffsY * vs)); - - if (m_copyrightLabel) - { - m_copyrightLabel->setPivot(m2::PointD(rect.maxX() - rulerOffsX * vs, - rect.maxY() - rulerOffsY * vs)); - } - - m_debugLabel->setPivot(m2::PointD(rect.minX() + 10, - rect.minY() + 50 + 5 * vs)); -} - -bool InformationDisplay::isCopyrightActive() const -{ - return m_copyrightLabel != nullptr; -} - -void InformationDisplay::enableCopyright(bool doEnable) -{ - if (m_copyrightLabel != nullptr) - m_copyrightLabel->setIsVisible(doEnable); -} - -void InformationDisplay::enableRuler(bool doEnable) -{ - if (doEnable) - m_ruler->AnimateShow(); - else - m_ruler->AnimateHide(); -} - -bool InformationDisplay::isRulerEnabled() const -{ - return m_ruler->isVisible(); -} - -void InformationDisplay::setVisualScale(double visualScale) -{ - m_fontDesc.m_size = static_cast(FONT_SIZE * visualScale); - - m_ruler->setFont(gui::Element::EActive, m_fontDesc); - m_debugLabel->setFont(gui::Element::EActive, m_fontDesc); - if (m_copyrightLabel) - m_copyrightLabel->setFont(gui::Element::EActive, m_fontDesc); -} - -void InformationDisplay::enableDebugInfo(bool doEnable) -{ - m_debugLabel->setIsVisible(doEnable); -} - -void InformationDisplay::setDebugInfo(double frameDuration, int currentScale) -{ - ostringstream out; - out << "Scale : " << currentScale; - - m_debugLabel->setText(out.str()); -} - -void InformationDisplay::enableCompassArrow(bool doEnable) -{ - if (doEnable) - m_compassArrow->AnimateShow(); - else - m_compassArrow->AnimateHide(); -} - -bool InformationDisplay::isCompassArrowEnabled() const -{ - return m_compassArrow->isVisible(); -} - -void InformationDisplay::setCompassArrowAngle(double angle) -{ - m_compassArrow->SetAngle(angle); -} - -void InformationDisplay::setEmptyCountryIndex(storage::TIndex const & idx) -{ - m_countryStatusDisplay->SetCountryIndex(idx); -} - -shared_ptr const & InformationDisplay::countryStatusDisplay() const -{ - return m_countryStatusDisplay; -} - -shared_ptr const & InformationDisplay::locationState() const -{ - return m_locationState; -} - -void InformationDisplay::measurementSystemChanged() -{ - m_ruler->setIsDirtyLayout(true); -} - -void InformationDisplay::ResetRouteMatchingInfo() -{ - m_locationState->ResetRouteMatchingInfo(); -} - -void InformationDisplay::SetWidgetPivot(WidgetType widget, m2::PointD const & pivot) -{ - auto const setPivotFn = [](shared_ptr e, m2::PointD const & point) - { - if (e) - e->setPivot(point); - }; - - switch(widget) - { - case WidgetType::Ruler: - setPivotFn(m_ruler, pivot); - return; - case WidgetType::CopyrightLabel: - setPivotFn(m_copyrightLabel, pivot); - return; - case WidgetType::CountryStatusDisplay: - setPivotFn(m_countryStatusDisplay, pivot); - return; - case WidgetType::CompassArrow: - setPivotFn(m_compassArrow, pivot); - return; - case WidgetType::DebugLabel: - setPivotFn(m_debugLabel, pivot); - return; - default: - ASSERT(false, ()); - } -} - -m2::PointD InformationDisplay::GetWidgetSize(WidgetType widget) const -{ - m2::RectD boundRect; - switch(widget) - { - case WidgetType::Ruler: - if (m_ruler) - boundRect = m_ruler->GetBoundRect(); - break; - case WidgetType::CompassArrow: - if (m_compassArrow) - return m_compassArrow->GetPixelSize(); - case WidgetType::DebugLabel: - case WidgetType::CountryStatusDisplay: - case WidgetType::CopyrightLabel: - default: - ASSERT(false, ()); - } - return m2::PointD(boundRect.SizeX(), boundRect.SizeY()); -} diff --git a/map/information_display.hpp b/map/information_display.hpp deleted file mode 100644 index da35f58fe3..0000000000 --- a/map/information_display.hpp +++ /dev/null @@ -1,105 +0,0 @@ -#pragma once - -#include "gui/button.hpp" - -#include "graphics/font_desc.hpp" - -#include "storage/index.hpp" - -#include "geometry/point2d.hpp" -#include "geometry/rect2d.hpp" - -#include "base/timer.hpp" - -#include "std/shared_ptr.hpp" - - -namespace location -{ - class State; -} - -class Drawer; - -namespace gui -{ - class Button; - class Controller; - class CachedTextView; -} - -class Framework; -class CountryStatusDisplay; -class CompassArrow; -class Ruler; - -/// Class, which displays additional information on the primary layer like: -/// rules, coordinates, GPS position and heading, compass, Download button, etc. -class InformationDisplay -{ - Framework * m_framework; - graphics::FontDesc m_fontDesc; - - shared_ptr m_ruler; - gui::Controller * m_controller; - - shared_ptr m_countryStatusDisplay; - shared_ptr m_compassArrow; - shared_ptr m_locationState; - shared_ptr m_debugLabel; - shared_ptr m_copyrightLabel; - - void InitRuler(Framework * fw); - void InitDebugLabel(); - void InitLocationState(Framework * fw); - void InitCompassArrow(Framework * fw); - void InitCountryStatusDisplay(Framework * fw); - - void InitCopyright(Framework * fw); - -public: - enum class WidgetType { - Ruler = 0, - CopyrightLabel, - CountryStatusDisplay, - CompassArrow, - DebugLabel - }; - - InformationDisplay(Framework * framework); - - void setController(gui::Controller * controller); - /*! - * \brief SetWidgetPivotsByDefault sets the default pivot points for all the widgets on the map. - * The pivot points can be overridden by a call of SetWidgetPivot() - * after Framework::OnSize() call. - */ - void SetWidgetPivotsByDefault(int screenWidth, int screenHeight); - void setVisualScale(double visualScale); - - bool isCopyrightActive() const; - void enableCopyright(bool doEnable); - - void enableRuler(bool doEnable); - bool isRulerEnabled() const; - - void enableDebugInfo(bool doEnable); - void setDebugInfo(double frameDuration, int currentScale); - - void measurementSystemChanged(); - - void enableCompassArrow(bool doEnable); - bool isCompassArrowEnabled() const; - void setCompassArrowAngle(double angle); - - shared_ptr const & locationState() const; - - void setEmptyCountryIndex(storage::TIndex const & idx); - - shared_ptr const & countryStatusDisplay() const; - - void ResetRouteMatchingInfo(); - - void SetWidgetPivot(WidgetType widget, m2::PointD const & pivot); - m2::PointD GetWidgetSize(WidgetType widget) const; -}; diff --git a/map/location_state.cpp b/map/location_state.cpp deleted file mode 100644 index 00f7e333d3..0000000000 --- a/map/location_state.cpp +++ /dev/null @@ -1,961 +0,0 @@ -#include "map/location_state.hpp" -#include "map/navigator.hpp" -#include "map/framework.hpp" -#include "map/move_screen_task.hpp" - -#ifndef USE_DRAPE -#include "graphics/display_list.hpp" -#include "graphics/icon.hpp" -#include "graphics/depth_constants.hpp" -#endif // USE_DRAPE - -#include "anim/controller.hpp" -#include "anim/task.hpp" -#include "anim/angle_interpolation.hpp" -#include "anim/segment_interpolation.hpp" - -#include "gui/controller.hpp" - -#include "indexer/mercator.hpp" -#include "indexer/scales.hpp" - -#include "platform/location.hpp" -#include "platform/settings.hpp" - -#include "geometry/rect2d.hpp" -#include "geometry/transformations.hpp" -#include "3party/Alohalytics/src/alohalytics.h" - - -namespace location -{ - -namespace -{ - -static const int POSITION_Y_OFFSET = 75; -static const double POSITION_TOLERANCE = 1.0E-6; // much less than coordinates coding error -static const double ANGLE_TOLERANCE = my::DegToRad(3.0); -static const double GPS_BEARING_LIFETIME_S = 5.0; - - -uint16_t IncludeModeBit(uint16_t mode, uint16_t bit) -{ - return mode | bit; -} - -uint16_t ExcludeModeBit(uint16_t mode, uint16_t bit) -{ - return mode & (~bit); -} - -State::Mode ExcludeAllBits(uint16_t mode) -{ - return (State::Mode)(mode & 0xF); -} - -uint16_t ChangeMode(uint16_t mode, State::Mode newMode) -{ - return (mode & 0xF0) | newMode; -} - -bool TestModeBit(uint16_t mode, uint16_t bit) -{ - return (mode & bit) != 0; -} - -class RotateAndFollowAnim : public anim::Task -{ -public: - RotateAndFollowAnim(Framework * fw, m2::PointD const & srcPos, - double srcAngle, - m2::PointD const & srcPixelBinding, - m2::PointD const & dstPixelbinding) - : m_fw(fw) - , m_hasPendingAnimation(false) - { - m_angleAnim.reset(new anim::SafeAngleInterpolation(srcAngle, srcAngle, 1.0)); - m_posAnim.reset(new anim::SafeSegmentInterpolation(srcPos, srcPos, 1.0)); - m2::PointD const srcInverted = InvertPxBinding(srcPixelBinding); - m2::PointD const dstInverted = InvertPxBinding(dstPixelbinding); - m_pxBindingAnim.reset(new anim::SafeSegmentInterpolation(srcInverted, dstInverted, - m_fw->GetNavigator().ComputeMoveSpeed(srcInverted, dstInverted))); - } - - void SetDestinationParams(m2::PointD const & dstPos, double dstAngle) - { - ASSERT(m_angleAnim != nullptr, ()); - ASSERT(m_posAnim != nullptr, ()); - - if (IsVisual() || m_idleFrames > 0) - { - //Store new params even if animation is active but don't interrupt the current one. - //New animation to the pending params will be made after all. - m_hasPendingAnimation = true; - m_pendingDstPos = dstPos; - m_pendingAngle = dstAngle; - } - else - SetParams(dstPos, dstAngle); - } - - void Update() - { - if (!IsVisual() && m_hasPendingAnimation && m_idleFrames == 0) - { - m_hasPendingAnimation = false; - SetParams(m_pendingDstPos, m_pendingAngle); - m_fw->Invalidate(); - } - else if (m_idleFrames > 0) - { - --m_idleFrames; - m_fw->Invalidate(); - } - } - - m2::PointD const & GetPositionForDraw() - { - return m_posAnim->GetCurrentValue(); - } - - virtual void OnStep(double ts) - { - if (m_idleFrames > 0) - return; - - ASSERT(m_angleAnim != nullptr, ()); - ASSERT(m_posAnim != nullptr, ()); - ASSERT(m_pxBindingAnim != nullptr, ()); - - bool updateViewPort = false; - updateViewPort |= OnStep(m_angleAnim.get(), ts); - updateViewPort |= OnStep(m_posAnim.get(), ts); - updateViewPort |= OnStep(m_pxBindingAnim.get(), ts); - - if (updateViewPort) - { - UpdateViewport(); - if (!IsVisual()) - m_idleFrames = 5; - } - } - - virtual bool IsVisual() const - { - ASSERT(m_posAnim != nullptr, ()); - ASSERT(m_angleAnim != nullptr, ()); - ASSERT(m_pxBindingAnim != nullptr, ()); - - return m_posAnim->IsRunning() || - m_angleAnim->IsRunning() || - m_pxBindingAnim->IsRunning(); - } - -private: - void UpdateViewport() - { - ASSERT(m_posAnim != nullptr, ()); - ASSERT(m_angleAnim != nullptr, ()); - ASSERT(m_pxBindingAnim != nullptr, ()); - - m2::PointD const & pxBinding = m_pxBindingAnim->GetCurrentValue(); - m2::PointD const & currentPosition = m_posAnim->GetCurrentValue(); - double currentAngle = m_angleAnim->GetCurrentValue(); - - //@{ pixel coord system - m2::PointD const pxCenter = GetPixelRect().Center(); - m2::PointD vectorToCenter = pxCenter - pxBinding; - if (!vectorToCenter.IsAlmostZero()) - vectorToCenter = vectorToCenter.Normalize(); - m2::PointD const vectorToTop = m2::PointD(0.0, 1.0); - double sign = m2::CrossProduct(vectorToTop, vectorToCenter) > 0 ? 1 : -1; - double angle = sign * acos(m2::DotProduct(vectorToTop, vectorToCenter)); - //@} - - //@{ global coord system - double offset = (m_fw->PtoG(pxCenter) - m_fw->PtoG(pxBinding)).Length(); - m2::PointD const viewPoint = currentPosition.Move(1.0, currentAngle + my::DegToRad(90.0)); - m2::PointD const viewVector = viewPoint - currentPosition; - m2::PointD rotateVector = viewVector; - rotateVector.Rotate(angle); - rotateVector.Normalize(); - rotateVector *= offset; - //@} - - m_fw->SetViewportCenter(currentPosition + rotateVector); - m_fw->GetNavigator().SetAngle(currentAngle); - m_fw->Invalidate(); - } - - void SetParams(m2::PointD const & dstPos, double dstAngle) - { - double const angleDist = fabs(ang::GetShortestDistance(m_angleAnim->GetCurrentValue(), dstAngle)); - if (dstPos.EqualDxDy(m_posAnim->GetCurrentValue(), POSITION_TOLERANCE) && angleDist < ANGLE_TOLERANCE) - return; - - double const posSpeed = 2 * m_fw->GetNavigator().ComputeMoveSpeed(m_posAnim->GetCurrentValue(), dstPos); - double const angleSpeed = angleDist < 1.0 ? 1.5 : m_fw->GetAnimator().GetRotationSpeed(); - m_angleAnim->ResetDestParams(dstAngle, angleSpeed); - m_posAnim->ResetDestParams(dstPos, posSpeed); - } - - bool OnStep(anim::Task * task, double ts) - { - if (!task->IsReady() && !task->IsRunning()) - return false; - - if (task->IsReady()) - { - task->Start(); - task->OnStart(ts); - } - - if (task->IsRunning()) - task->OnStep(ts); - - if (task->IsEnded()) - task->OnEnd(ts); - - return true; - } - -private: - m2::PointD InvertPxBinding(m2::PointD const & px) const - { - return m2::PointD(px.x, GetPixelRect().maxY() - px.y); - } - - m2::RectD const & GetPixelRect() const - { - return m_fw->GetNavigator().Screen().PixelRect(); - } - -private: - Framework * m_fw; - - unique_ptr m_angleAnim; - unique_ptr m_posAnim; - unique_ptr m_pxBindingAnim; - - bool m_hasPendingAnimation; - m2::PointD m_pendingDstPos; - double m_pendingAngle; - // When map has active animation, backgroung rendering pausing - // By this beetwen animations we wait some frames to release background rendering - int m_idleFrames = 0; -}; - -string const LocationStateMode = "LastLocationStateMode"; - -} - -State::Params::Params() - : m_locationAreaColor(0, 0, 0, 0), - m_framework(0) -{} - -State::State(Params const & p) - : TBase(p), - m_modeInfo(Follow), - m_errorRadius(0), - m_position(0, 0), - m_drawDirection(0.0), - m_lastGPSBearing(false), - m_afterPendingMode(Follow), - m_routeMatchingInfo(), - m_currentSlotID(0) -{ - m_locationAreaColor = p.m_locationAreaColor; - m_framework = p.m_framework; - - int mode = 0; - if (Settings::Get(LocationStateMode, mode)) - m_modeInfo = mode; - - bool isBench = false; - if (Settings::Get("IsBenchmarking", isBench) && isBench) - m_modeInfo = UnknownPosition; - - setIsVisible(false); -} - -m2::PointD const & State::Position() const -{ - return m_position; -} - -double State::GetErrorRadius() const -{ - return m_errorRadius; -} - -State::Mode State::GetMode() const -{ - return ExcludeAllBits(m_modeInfo); -} - -bool State::IsModeChangeViewport() const -{ - return GetMode() >= Follow; -} - -bool State::IsModeHasPosition() const -{ - return GetMode() >= NotFollow; -} - -void State::SwitchToNextMode() -{ - string const kAlohalyticsClickEvent = "$onClick"; - Mode currentMode = GetMode(); - Mode newMode = currentMode; - - if (!IsInRouting() || IsRoutingFollowingDisabled()) - { - switch (currentMode) - { - case UnknownPosition: - alohalytics::LogEvent(kAlohalyticsClickEvent, "@UnknownPosition"); - newMode = PendingPosition; - break; - case PendingPosition: - alohalytics::LogEvent(kAlohalyticsClickEvent, "@PendingPosition"); - newMode = UnknownPosition; - m_afterPendingMode = Follow; - break; - case NotFollow: - alohalytics::LogEvent(kAlohalyticsClickEvent, "@NotFollow"); - newMode = Follow; - break; - case Follow: - alohalytics::LogEvent(kAlohalyticsClickEvent, "@Follow"); - if (IsRotationActive()) - newMode = RotateAndFollow; - else - { - newMode = UnknownPosition; - m_afterPendingMode = Follow; - } - break; - case RotateAndFollow: - alohalytics::LogEvent(kAlohalyticsClickEvent, "@RotateAndFollow"); - newMode = UnknownPosition; - m_afterPendingMode = Follow; - break; - } - } - else - newMode = IsRotationActive() ? RotateAndFollow : Follow; - - SetModeInfo(ChangeMode(m_modeInfo, newMode)); -} - -void State::RouteBuilded() -{ - StopAllAnimations(); - SetModeInfo(IncludeModeBit(m_modeInfo, RoutingSessionBit)); - - Mode const mode = GetMode(); - if (mode > NotFollow) - SetModeInfo(ChangeMode(m_modeInfo, NotFollow)); - else if (mode == UnknownPosition) - m_afterPendingMode = NotFollow; -} - -void State::StartRouteFollow(int scale) -{ - ASSERT(IsInRouting(), ()); - ASSERT(IsModeHasPosition(), ()); - - m2::PointD const size(m_errorRadius, m_errorRadius); - m_framework->ShowRectExVisibleScale(m2::RectD(m_position - size, m_position + size), scale); - - SetModeInfo(ChangeMode(m_modeInfo, NotFollow)); - SetModeInfo(ChangeMode(m_modeInfo, IsRotationActive() ? RotateAndFollow : Follow)); -} - -void State::StopRoutingMode() -{ - if (IsInRouting()) - { - bool const isNotFollow = IsRoutingFollowingDisabled(); - m_modeInfo = ExcludeModeBit(m_modeInfo, RoutingNotFollowBit | RoutingSessionBit); - if (isNotFollow) - return; - SetModeInfo(ChangeMode(m_modeInfo, GetMode() == RotateAndFollow ? Follow : NotFollow)); - RotateOnNorth(); - AnimateFollow(); - } -} - -void State::TurnOff() -{ - StopLocationFollow(); - SetModeInfo(UnknownPosition); - setIsVisible(false); - invalidate(); -} - -void State::OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, location::RouteMatchingInfo const & routeMatchingInfo) -{ - Assign(info, isNavigable); - m_routeMatchingInfo = routeMatchingInfo; - - setIsVisible(true); - - if (GetMode() == PendingPosition) - { - SetModeInfo(ChangeMode(m_modeInfo, m_afterPendingMode)); - m_afterPendingMode = Follow; - } - else - AnimateFollow(); - - CallPositionChangedListeners(m_position); - invalidate(); -} - -void State::OnCompassUpdate(location::CompassInfo const & info) -{ - if (Assign(info)) - { - AnimateFollow(); - invalidate(); - } -} - -void State::CallStateModeListeners() -{ - Mode const currentMode = GetMode(); - for (auto it : m_modeListeners) - it.second(currentMode); -} - -int State::AddStateModeListener(TStateModeListener const & l) -{ - int const slotID = m_currentSlotID++; - m_modeListeners[slotID] = l; - return slotID; -} - -void State::RemoveStateModeListener(int slotID) -{ - m_modeListeners.erase(slotID); -} - -void State::CallPositionChangedListeners(m2::PointD const & pt) -{ - for (auto it : m_positionListeners) - it.second(pt); -} - -int State::AddPositionChangedListener(State::TPositionListener const & func) -{ - int const slotID = m_currentSlotID++; - m_positionListeners[slotID] = func; - return slotID; -} - -void State::RemovePositionChangedListener(int slotID) -{ - m_positionListeners.erase(slotID); -} - -void State::InvalidatePosition() -{ - Mode currentMode = GetMode(); - if (currentMode > PendingPosition) - { - SetModeInfo(ChangeMode(m_modeInfo, UnknownPosition)); - SetModeInfo(ChangeMode(m_modeInfo, PendingPosition)); - m_afterPendingMode = currentMode; - setIsVisible(true); - } - else if (currentMode == UnknownPosition) - { - m_afterPendingMode = Follow; - setIsVisible(false); - } - - invalidate(); -} - -void State::cache() -{ -#ifndef USE_DRAPE - CachePositionArrow(); - CacheRoutingArrow(); - CacheLocationMark(); - - m_controller->GetCacheScreen()->completeCommands(); -#endif // USE_DRAPE -} - -void State::purge() -{ -#ifndef USE_DRAPE - m_positionArrow.reset(); - m_locationMarkDL.reset(); - m_positionMarkDL.reset(); - m_routingArrow.reset(); -#endif // USE_DRAPE -} - -void State::update() -{ - if (isVisible() && IsModeHasPosition()) - { - m2::PointD const pxPosition = m_framework->GetNavigator().GtoP(Position()); - setPivot(pxPosition, false); - - if (m_animTask) - static_cast(m_animTask.get())->Update(); - } -} - -void State::draw(graphics::OverlayRenderer * r, - math::Matrix const & m) const -{ -#ifndef USE_DRAPE - if (!IsModeHasPosition() || !isVisible()) - return; - - checkDirtyLayout(); - - m2::PointD const pxPosition = m_framework->GetNavigator().GtoP(Position()); - double const pxErrorRadius = pxPosition.Length( - m_framework->GetNavigator().GtoP(Position() + m2::PointD(m_errorRadius, 0.0))); - - double const drawScale = pxErrorRadius / s_cacheRadius; - m2::PointD const & pivotPosition = GetPositionForDraw(); - - math::Matrix locationDrawM = math::Shift( - math::Scale( - math::Identity(), - drawScale, - drawScale), - pivotPosition); - - math::Matrix const drawM = locationDrawM * m; - // draw error sector - r->drawDisplayList(m_locationMarkDL.get(), drawM); - - // if we know look direction than we draw arrow - if (IsDirectionKnown()) - { - double rotateAngle = m_drawDirection + GetModelView().GetAngle(); - - math::Matrix compassDrawM = math::Shift( - math::Rotate( - math::Identity(), - rotateAngle), - pivotPosition); - - if (!IsInRouting()) - r->drawDisplayList(m_positionArrow.get(), compassDrawM * m); - else - r->drawDisplayList(m_routingArrow.get(), compassDrawM * m); - } - else - r->drawDisplayList(m_positionMarkDL.get(), drawM); -#endif // USE_DRAPE -} - -#ifndef USE_DRAPE -void State::CachePositionArrow() -{ - m_positionArrow.reset(); - m_positionArrow.reset(m_controller->GetCacheScreen()->createDisplayList()); - CacheArrow(m_positionArrow.get(), "current-position-compas"); -} - -void State::CacheRoutingArrow() -{ - m_routingArrow.reset(); - m_routingArrow.reset(m_controller->GetCacheScreen()->createDisplayList()); - CacheArrow(m_routingArrow.get(), "current-routing-compas"); -} - -void State::CacheLocationMark() -{ - graphics::Screen * cacheScreen = m_controller->GetCacheScreen(); - - m_locationMarkDL.reset(); - m_locationMarkDL.reset(cacheScreen->createDisplayList()); - - m_positionMarkDL.reset(); - m_positionMarkDL.reset(cacheScreen->createDisplayList()); - - cacheScreen->beginFrame(); - cacheScreen->setDisplayList(m_locationMarkDL.get()); - - cacheScreen->fillSector(m2::PointD(0, 0), - 0, 2.0 * math::pi, - s_cacheRadius, - m_locationAreaColor, - graphics::locationFaultDepth); - - cacheScreen->setDisplayList(m_positionMarkDL.get()); - cacheScreen->drawSymbol(m2::PointD(0, 0), - "current-position", - graphics::EPosCenter, - graphics::locationDepth); - - cacheScreen->setDisplayList(0); - - cacheScreen->endFrame(); -} - -void State::CacheArrow(graphics::DisplayList * dl, const string & iconName) -{ - graphics::Screen * cacheScreen = m_controller->GetCacheScreen(); - graphics::Icon::Info info(iconName); - - graphics::Resource const * res = cacheScreen->fromID(cacheScreen->findInfo(info)); - m2::RectU const rect = res->m_texRect; - m2::PointD const halfArrowSize(rect.SizeX() / 2.0, rect.SizeY() / 2.0); - - cacheScreen->beginFrame(); - cacheScreen->setDisplayList(dl); - - m2::PointD coords[4] = - { - m2::PointD(-halfArrowSize.x, -halfArrowSize.y), - m2::PointD(-halfArrowSize.x, halfArrowSize.y), - m2::PointD( halfArrowSize.x, -halfArrowSize.y), - m2::PointD( halfArrowSize.x, halfArrowSize.y) - }; - - m2::PointF const normal(0.0, 0.0); - shared_ptr texture = cacheScreen->pipeline(res->m_pipelineID).texture(); - - m2::PointF texCoords[4] = - { - texture->mapPixel(m2::PointF(rect.minX(), rect.minY())), - texture->mapPixel(m2::PointF(rect.minX(), rect.maxY())), - texture->mapPixel(m2::PointF(rect.maxX(), rect.minY())), - texture->mapPixel(m2::PointF(rect.maxX(), rect.maxY())) - }; - - cacheScreen->addTexturedStripStrided(coords, sizeof(m2::PointD), - &normal, 0, - texCoords, sizeof(m2::PointF), - 4, graphics::locationDepth, res->m_pipelineID); - cacheScreen->setDisplayList(0); - cacheScreen->endFrame(); -} - -#endif // USE_DRAPE - -bool State::IsRotationActive() const -{ - return IsDirectionKnown(); -} - -bool State::IsDirectionKnown() const -{ - return TestModeBit(m_modeInfo, KnownDirectionBit); -} - -bool State::IsInRouting() const -{ - return TestModeBit(m_modeInfo, RoutingSessionBit); -} - -bool State::IsRoutingFollowingDisabled() const -{ - return TestModeBit(m_modeInfo, RoutingNotFollowBit); -} - -m2::PointD const State::GetModeDefaultPixelBinding(State::Mode mode) const -{ - switch (mode) - { - case Follow: return m_framework->GetPixelCenter(); - case RotateAndFollow: return GetRaFModeDefaultPxBind(); - default: return m2::PointD(0.0, 0.0); - } -} - -bool State::FollowCompass() -{ - if (!IsRotationActive() || GetMode() != RotateAndFollow || m_animTask == nullptr) - return false; - - RotateAndFollowAnim * task = static_cast(m_animTask.get()); - task->SetDestinationParams(Position(), -m_drawDirection); - return true; -} - -void State::CreateAnimTask() -{ - CreateAnimTask(m_framework->GtoP(Position()), - GetModeDefaultPixelBinding(GetMode())); -} - -void State::CreateAnimTask(const m2::PointD & srcPx, const m2::PointD & dstPx) -{ - EndAnimation(); - m_animTask.reset(new RotateAndFollowAnim(m_framework, Position(), - GetModelView().GetAngle(), - srcPx, dstPx)); - m_framework->GetAnimController()->AddTask(m_animTask); -} - -void State::EndAnimation() -{ - if (m_animTask != nullptr) - { - m_animTask->End(); - m_animTask.reset(); - } -} - -void State::SetModeInfo(uint16_t modeInfo, bool callListeners) -{ - Mode const newMode = ExcludeAllBits(modeInfo); - Mode const oldMode = GetMode(); - m_modeInfo = modeInfo; - if (newMode != oldMode) - { - Settings::Set(LocationStateMode, static_cast(GetMode())); - - if (callListeners) - CallStateModeListeners(); - - AnimateStateTransition(oldMode, newMode); - invalidate(); - } -} - -void State::StopAllAnimations() -{ - EndAnimation(); - Animator & animator = m_framework->GetAnimator(); - animator.StopRotation(); - animator.StopChangeViewport(); - animator.StopMoveScreen(); -} - -ScreenBase const & State::GetModelView() const -{ - return m_framework->GetNavigator().Screen(); -} - -m2::PointD const State::GetRaFModeDefaultPxBind() const -{ - m2::RectD const & pixelRect = GetModelView().PixelRect(); - return m2::PointD(pixelRect.Center().x, - pixelRect.maxY() - POSITION_Y_OFFSET * visualScale()); -} - -void State::StopCompassFollowing() -{ - if (GetMode() != RotateAndFollow) - return; - - StopAllAnimations(); - SetModeInfo(ChangeMode(m_modeInfo, Follow)); -} - -void State::StopLocationFollow(bool callListeners) -{ - Mode const currentMode = GetMode(); - if (currentMode > NotFollow) - { - StopAllAnimations(); - SetModeInfo(ChangeMode(m_modeInfo, NotFollow), callListeners); - } - else if (currentMode == PendingPosition) - { - StopAllAnimations(); - m_afterPendingMode = NotFollow; - } -} - -void State::SetFixedZoom() -{ - SetModeInfo(IncludeModeBit(m_modeInfo, FixedZoomBit)); -} - -void State::SetRoutingNotFollow() -{ - SetModeInfo(IncludeModeBit(m_modeInfo, RoutingNotFollowBit)); -} - -void State::DragStarted() -{ - m_dragModeInfo = m_modeInfo; - m_afterPendingMode = Follow; - StopLocationFollow(false); -} - -void State::DragEnded() -{ - Mode const currentMode = ExcludeAllBits(m_dragModeInfo); - if (currentMode > NotFollow) - { - // reset GPS centering mode if we have dragged far from the current location - ScreenBase const & s = GetModelView(); - m2::PointD const defaultPxBinding = GetModeDefaultPixelBinding(currentMode); - m2::PointD const pxPosition = s.GtoP(Position()); - - if (defaultPxBinding.Length(pxPosition) < s.GetMinPixelRectSize() / 5.0) - SetModeInfo(m_dragModeInfo, false); - else - CallStateModeListeners(); - } - - m_dragModeInfo = 0; -} - -void State::ScaleStarted() -{ - m_scaleModeInfo = m_modeInfo; -} - -void State::CorrectScalePoint(m2::PointD & pt) const -{ - if (IsModeChangeViewport() || ExcludeAllBits(m_scaleModeInfo) > NotFollow) - pt = m_framework->GtoP(Position()); -} - -void State::CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const -{ - if (IsModeChangeViewport() || ExcludeAllBits(m_scaleModeInfo) > NotFollow) - { - m2::PointD const ptDiff = m_framework->GtoP(Position()) - (pt1 + pt2) / 2; - pt1 += ptDiff; - pt2 += ptDiff; - } -} - -void State::ScaleEnded() -{ - m_scaleModeInfo = 0; -} - -void State::Rotated() -{ - m_afterPendingMode = NotFollow; - EndAnimation(); - if (GetMode() == RotateAndFollow) - SetModeInfo(ChangeMode(m_modeInfo, NotFollow)); -} - -void State::OnCompassTaped() -{ - StopCompassFollowing(); - RotateOnNorth(); - AnimateFollow(); -} - -void State::OnSize(m2::RectD const & /*oldPixelRect*/) -{ - if (GetMode() == RotateAndFollow) - { - EndAnimation(); - CreateAnimTask(m_framework->GtoP(Position()), GetModeDefaultPixelBinding(GetMode())); - } -} - -void State::AnimateStateTransition(Mode oldMode, Mode newMode) -{ - StopAllAnimations(); - - if (oldMode == PendingPosition && newMode == Follow) - { - if (!TestModeBit(m_modeInfo, FixedZoomBit)) - { - m2::PointD const size(m_errorRadius, m_errorRadius); - m_framework->ShowRectExVisibleScale(m2::RectD(m_position - size, m_position + size), - scales::GetUpperComfortScale()); - } - } - else if (newMode == RotateAndFollow) - { - CreateAnimTask(); - } - else if (oldMode == RotateAndFollow && newMode == UnknownPosition) - { - RotateOnNorth(); - } - else if (oldMode == NotFollow && newMode == Follow) - { - m2::AnyRectD screenRect = GetModelView().GlobalRect(); - m2::RectD const & clipRect = GetModelView().ClipRect(); - screenRect.Inflate(clipRect.SizeX() / 2.0, clipRect.SizeY() / 2.0); - if (!screenRect.IsPointInside(m_position)) - m_framework->SetViewportCenter(m_position); - } - - AnimateFollow(); -} - -void State::AnimateFollow() -{ - if (!IsModeChangeViewport()) - return; - - SetModeInfo(ExcludeModeBit(m_modeInfo, FixedZoomBit)); - - if (!FollowCompass()) - { - if (!m_position.EqualDxDy(m_framework->GetViewportCenter(), POSITION_TOLERANCE)) - m_framework->SetViewportCenterAnimated(m_position); - } -} - -void State::RotateOnNorth() -{ - m_framework->GetAnimator().RotateScreen(GetModelView().GetAngle(), 0.0); -} - -void State::Assign(location::GpsInfo const & info, bool isNavigable) -{ - m2::RectD rect = MercatorBounds::MetresToXY(info.m_longitude, - info.m_latitude, - info.m_horizontalAccuracy); - m_position = rect.Center(); - m_errorRadius = rect.SizeX() / 2; - - bool const hasBearing = info.HasBearing(); - if ((isNavigable && hasBearing) - || (!isNavigable && hasBearing && info.HasSpeed() && info.m_speed > 1.0)) - { - SetDirection(my::DegToRad(info.m_bearing)); - m_lastGPSBearing.Reset(); - } -} - -bool State::Assign(location::CompassInfo const & info) -{ - if ((IsInRouting() && GetMode() >= Follow) || - (m_lastGPSBearing.ElapsedSeconds() < GPS_BEARING_LIFETIME_S)) - return false; - - SetDirection(info.m_bearing); - return true; -} - -void State::SetDirection(double bearing) -{ - m_drawDirection = bearing; - SetModeInfo(IncludeModeBit(m_modeInfo, KnownDirectionBit)); -} - -void State::ResetDirection() -{ - SetModeInfo(ExcludeModeBit(m_modeInfo, KnownDirectionBit)); -} - -m2::PointD const State::GetPositionForDraw() const -{ - if (m_animTask != nullptr) - return m_framework->GtoP(static_cast(m_animTask.get())->GetPositionForDraw()); - - return pivot(); -} - -} diff --git a/map/location_state.hpp b/map/location_state.hpp deleted file mode 100644 index 631acbf7b1..0000000000 --- a/map/location_state.hpp +++ /dev/null @@ -1,213 +0,0 @@ -#pragma once - -#include "gui/element.hpp" - -#include "geometry/point2d.hpp" - -#include "base/timer.hpp" - -#include "routing/turns.hpp" - -#include "platform/location.hpp" - -#include "std/function.hpp" -#include "std/shared_ptr.hpp" -#include "std/unique_ptr.hpp" -#include "std/map.hpp" - - -class Framework; -class ScreenBase; - -namespace graphics { class DisplayList; } -namespace anim { class Task;} - -namespace location -{ - class GpsInfo; - class CompassInfo; - - // Class, that handles position and compass updates, - // centers, scales and rotates map according to this updates - // and draws location and compass marks. - class State : public gui::Element - { - typedef gui::Element TBase; - - public: - struct Params : TBase::Params - { - graphics::Color m_locationAreaColor; - Framework * m_framework; - Params(); - }; - - // Do not change the order and values - enum Mode - { - UnknownPosition = 0x0, - PendingPosition = 0x1, - NotFollow = 0x2, - Follow = 0x3, - RotateAndFollow = 0x4, - }; - - typedef function TStateModeListener; - typedef function TPositionListener; - - State(Params const & p); - - /// @return GPS center point in mercator - m2::PointD const & Position() const; - double GetErrorRadius() const; - double GetDirection() const { return m_drawDirection; } - bool IsDirectionKnown() const; - - Mode GetMode() const; - bool IsModeChangeViewport() const; - bool IsModeHasPosition() const; - void SwitchToNextMode(); - - void RouteBuilded(); - void StartRouteFollow(int scale); - void StopRoutingMode(); - - int AddStateModeListener(TStateModeListener const & l); - void RemoveStateModeListener(int slotID); - - int AddPositionChangedListener(TPositionListener const & func); - void RemovePositionChangedListener(int slotID); - - void InvalidatePosition(); - void TurnOff(); - void StopCompassFollowing(); - void StopLocationFollow(bool callListeners = true); - void SetFixedZoom(); - void SetRoutingNotFollow(); - - /// @name User input notification block - //@{ - void DragStarted(); - void DragEnded(); - - void ScaleStarted(); - void CorrectScalePoint(m2::PointD & pt) const; - void CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const; - void ScaleEnded(); - - void Rotated(); - //@} - - void OnCompassTaped(); - - void OnSize(m2::RectD const & oldPixelRect); - - /// @name GPS location updates routine. - //@{ - void OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, location::RouteMatchingInfo const & routeMatchingInfo); - void OnCompassUpdate(location::CompassInfo const & info); - //@} - - RouteMatchingInfo const & GetRouteMatchingInfo() const { return m_routeMatchingInfo; } - void ResetRouteMatchingInfo() { m_routeMatchingInfo.Reset(); } - void ResetDirection(); - - /// @name Override from graphics::OverlayElement and gui::Element. - //@{ - virtual m2::RectD GetBoundRect() const { return m2::RectD(); } - - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - bool hitTest(m2::PointD const & /*pt*/) const { return false; } - - void cache(); - void purge(); - void update(); - //@} - - private: - void AnimateStateTransition(Mode oldMode, Mode newMode); - void AnimateFollow(); - - void RotateOnNorth(); - - void CallPositionChangedListeners(m2::PointD const & pt); - void CallStateModeListeners(); - -#ifndef USE_DRAPE - void CachePositionArrow(); - void CacheRoutingArrow(); - void CacheLocationMark(); - - void CacheArrow(graphics::DisplayList * dl, string const & iconName); -#endif // USE_DRAPE - - bool IsRotationActive() const; - bool IsInRouting() const; - bool IsRoutingFollowingDisabled() const; - - m2::PointD const GetModeDefaultPixelBinding(Mode mode) const; - m2::PointD const GetRaFModeDefaultPxBind() const; - - void SetModeInfo(uint16_t modeInfo, bool callListeners = true); - - void StopAllAnimations(); - - ScreenBase const & GetModelView() const; - - void Assign(location::GpsInfo const & info, bool isNavigable); - bool Assign(location::CompassInfo const & info); - void SetDirection(double bearing); - const m2::PointD GetPositionForDraw() const; - - private: - - enum ExternalMode - { - RoutingNotFollowBit = 0x10, - FixedZoomBit = 0x20, - RoutingSessionBit = 0x40, - KnownDirectionBit = 0x80 - }; - static uint16_t const s_cacheRadius = 500.0f; - - uint16_t m_modeInfo; // combination of Mode enum and "Mode bits" - uint16_t m_dragModeInfo = 0; - uint16_t m_scaleModeInfo = 0; - Framework * m_framework; - - double m_errorRadius; //< error radius in mercator - m2::PointD m_position; //< position in mercator - double m_drawDirection; - my::Timer m_lastGPSBearing; - Mode m_afterPendingMode; - - RouteMatchingInfo m_routeMatchingInfo; - - typedef map TModeListeners; - typedef map TPositionListeners; - - TModeListeners m_modeListeners; - TPositionListeners m_positionListeners; - int m_currentSlotID; - - /// @name Compass Rendering Parameters - //@{ -#ifndef USE_DRAPE - unique_ptr m_positionArrow; - unique_ptr m_locationMarkDL; - unique_ptr m_positionMarkDL; - unique_ptr m_routingArrow; -#endif // USE_DRAPE - graphics::Color m_locationAreaColor; - //@} - - /// @name Rotation mode animation - //@{ - shared_ptr m_animTask; - bool FollowCompass(); - void CreateAnimTask(); - void CreateAnimTask(m2::PointD const & srcPx, m2::PointD const & dstPx); - void EndAnimation(); - //@} - }; -} diff --git a/map/map.pro b/map/map.pro index e2d32a04c1..c96935f8f7 100644 --- a/map/map.pro +++ b/map/map.pro @@ -12,74 +12,41 @@ include($$ROOT_DIR/common.pri) HEADERS += \ active_maps_layout.hpp \ - alfa_animation_task.hpp \ - anim_phase_chain.hpp \ - animator.hpp \ api_mark_container.hpp \ api_mark_point.hpp \ - benchmark_engine.hpp \ - benchmark_provider.hpp \ bookmark.hpp \ bookmark_manager.hpp \ - change_viewport_task.hpp \ - compass_arrow.hpp \ - country_status_display.hpp \ country_tree.hpp \ feature_vec_model.hpp \ framework.hpp \ ge0_parser.hpp \ geourl_process.hpp \ - information_display.hpp \ - location_state.hpp \ - move_screen_task.hpp \ mwm_url.hpp \ - navigator.hpp \ - navigator_utils.hpp \ - pin_click_manager.hpp \ - rotate_screen_task.hpp \ - ruler.hpp \ + storage_bridge.hpp \ styled_point.hpp \ track.hpp \ user_mark.hpp \ user_mark_container.hpp \ - user_mark_dl_cache.hpp \ SOURCES += \ ../api/src/c/api-client.c \ active_maps_layout.cpp \ address_finder.cpp \ - alfa_animation_task.cpp \ - anim_phase_chain.cpp \ - animator.cpp \ api_mark_container.cpp \ - benchmark_engine.cpp \ - benchmark_provider.cpp \ bookmark.cpp \ bookmark_manager.cpp \ - change_viewport_task.cpp \ - compass_arrow.cpp \ - country_status_display.cpp \ country_tree.cpp \ feature_vec_model.cpp \ framework.cpp \ ge0_parser.cpp \ geourl_process.cpp \ - information_display.cpp \ - location_state.cpp \ - move_screen_task.cpp \ mwm_url.cpp \ - navigator.cpp \ - navigator_utils.cpp \ - pin_click_manager.cpp \ - rotate_screen_task.cpp \ - ruler.cpp \ + storage_bridge.cpp \ styled_point.cpp \ track.cpp \ + user_mark.cpp \ user_mark_container.cpp \ - user_mark_dl_cache.cpp \ !iphone*:!tizen*:!android* { - HEADERS += qgl_render_context.hpp - SOURCES += qgl_render_context.cpp QT += opengl } diff --git a/map/map_tests/bookmarks_test.cpp b/map/map_tests/bookmarks_test.cpp index 38184fe6ac..635547f6d3 100644 --- a/map/map_tests/bookmarks_test.cpp +++ b/map/map_tests/bookmarks_test.cpp @@ -1,5 +1,7 @@ #include "testing/testing.hpp" +#include "drape_frontend/visual_params.hpp" + #include "indexer/data_header.hpp" #include "map/framework.hpp" @@ -9,8 +11,6 @@ #include "platform/platform.hpp" #include "platform/preferred_languages.hpp" -#include "graphics/color.hpp" - #include "coding/internal/file_data.hpp" #include "std/fstream.hpp" @@ -120,22 +120,22 @@ char const * kmlString = void CheckBookmarks(BookmarkCategory const & cat) { - TEST_EQUAL(cat.GetBookmarksCount(), 4, ()); + TEST_EQUAL(cat.GetUserMarkCount(), 4, ()); - Bookmark const * bm = cat.GetBookmark(3); + Bookmark const * bm = static_cast(cat.GetUserMark(3)); TEST_EQUAL(bm->GetName(), "Nebraska", ()); TEST_EQUAL(bm->GetType(), "placemark-red", ()); TEST_EQUAL(bm->GetDescription(), "", ()); TEST_EQUAL(bm->GetTimeStamp(), my::INVALID_TIME_STAMP, ()); - bm = cat.GetBookmark(2); + bm = static_cast(cat.GetUserMark(2)); TEST_EQUAL(bm->GetName(), "Monongahela National Forest", ()); TEST_EQUAL(bm->GetType(), "placemark-pink", ()); TEST_EQUAL(bm->GetDescription(), "Huttonsville, WV 26273
", ()); TEST_EQUAL(bm->GetTimeStamp(), 524214643, ()); - bm = cat.GetBookmark(1); - m2::PointD org = bm->GetOrg(); + bm = static_cast(cat.GetUserMark(1)); + m2::PointD org = bm->GetPivot(); TEST_ALMOST_EQUAL_ULPS(MercatorBounds::XToLon(org.x), 27.566765, ()); TEST_ALMOST_EQUAL_ULPS(MercatorBounds::YToLat(org.y), 53.900047, ()); TEST_EQUAL(bm->GetName(), "From: МинÑк, МинÑÐºÐ°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ, БеларуÑÑŒ", ()); @@ -143,8 +143,8 @@ char const * kmlString = TEST_EQUAL(bm->GetDescription(), "", ()); TEST_EQUAL(bm->GetTimeStamp(), 888888888, ()); - bm = cat.GetBookmark(0); - org = bm->GetOrg(); + bm = static_cast(cat.GetUserMark(0)); + org = bm->GetPivot(); TEST_ALMOST_EQUAL_ULPS(MercatorBounds::XToLon(org.x), 27.551532, ()); TEST_ALMOST_EQUAL_ULPS(MercatorBounds::YToLat(org.y), 53.89306, ()); TEST_EQUAL(bm->GetName(), "", ()); @@ -156,6 +156,8 @@ char const * kmlString = UNIT_TEST(Bookmarks_ImportKML) { Framework framework; + df::VisualParams::Init(1.0, 1024); + BookmarkCategory cat("Default", framework); TEST(cat.LoadFromKML(new MemReader(kmlString, strlen(kmlString))), ()); @@ -171,22 +173,30 @@ UNIT_TEST(Bookmarks_ExportKML) char const * BOOKMARKS_FILE_NAME = "UnitTestBookmarks.kml"; Framework framework; + df::VisualParams::Init(1.0, 1024); + BookmarkCategory cat("Default", framework); TEST(cat.LoadFromKML(new MemReader(kmlString, strlen(kmlString))), ()); CheckBookmarks(cat); - TEST_EQUAL(cat.IsVisible(), false, ()); - // Change visibility - cat.SetVisible(true); - TEST_EQUAL(cat.IsVisible(), true, ()); + { + BookmarkCategory::Guard guard(cat); + TEST_EQUAL(cat.IsVisible(), false, ()); + // Change visibility + guard.m_controller.SetIsVisible(true); + TEST_EQUAL(cat.IsVisible(), true, ()); + } { ofstream of(BOOKMARKS_FILE_NAME); cat.SaveToKML(of); } - cat.ClearBookmarks(); - TEST_EQUAL(cat.GetBookmarksCount(), 0, ()); + { + BookmarkCategory::Guard guard(cat); + guard.m_controller.Clear(); + TEST_EQUAL(guard.m_controller.GetUserMarkCount(), 0, ()); + } TEST(cat.LoadFromKML(new FileReader(BOOKMARKS_FILE_NAME)), ()); CheckBookmarks(cat); @@ -219,7 +229,7 @@ namespace UserMark const * GetMark(Framework & fm, m2::PointD const & pt) { m2::AnyRectD rect; - fm.GetNavigator().GetTouchRect(fm.GtoP(pt), 20, rect); + fm.GetTouchRect(fm.GtoP(pt), 20, rect); return fm.GetBookmarkManager().FindNearestUserMark(rect); } @@ -229,7 +239,7 @@ namespace UserMark const * mark = GetMark(fm, pt); ASSERT(mark != NULL, ()); ASSERT(mark->GetContainer() != NULL, ()); - ASSERT(mark->GetContainer()->GetType() == UserMarkContainer::BOOKMARK_MARK, ()); + ASSERT(mark->GetContainer()->GetType() == UserMarkType::BOOKMARK_MARK, ()); return static_cast(mark); } @@ -241,7 +251,7 @@ namespace BookmarkCategory const * GetCategory(Bookmark const * bm) { ASSERT(bm->GetContainer() != NULL, ()); - ASSERT(bm->GetContainer()->GetType() == UserMarkContainer::BOOKMARK_MARK, ()); + ASSERT(bm->GetContainer()->GetType() == UserMarkType::BOOKMARK_MARK, ()); return static_cast(bm->GetContainer()); } @@ -251,7 +261,7 @@ namespace if (mark == NULL) return false; - if (mark->GetContainer()->GetType() != UserMarkContainer::BOOKMARK_MARK) + if (mark->GetContainer()->GetType() != UserMarkType::BOOKMARK_MARK) return false; return true; @@ -261,6 +271,8 @@ namespace UNIT_TEST(Bookmarks_Timestamp) { Framework fm; + df::VisualParams::Init(1.0, 1024); + m2::PointD const orgPoint(10, 10); char const * arrCat[] = { "cat", "cat1" }; @@ -279,19 +291,25 @@ UNIT_TEST(Bookmarks_Timestamp) TEST_EQUAL(fm.AddBookmark(1, orgPoint, b3), 0, ()); // Check bookmarks order here. First added should be in the bottom of the list. - TEST_EQUAL(fm.GetBmCategory(0)->GetBookmark(1), pBm, ()); + TEST_EQUAL(fm.GetBmCategory(0)->GetUserMark(1), pBm, ()); - TEST_EQUAL(fm.GetBmCategory(0)->GetBookmark(1)->GetName(), "name", ()); - TEST_EQUAL(fm.GetBmCategory(0)->GetBookmark(1)->GetType(), "type", ()); + Bookmark const * bm01 = static_cast(fm.GetBmCategory(0)->GetUserMark(1)); - TEST_EQUAL(fm.GetBmCategory(0)->GetBookmark(0)->GetName(), "newName", ()); - TEST_EQUAL(fm.GetBmCategory(0)->GetBookmark(0)->GetType(), "newType", ()); + TEST_EQUAL(bm01->GetName(), "name", ()); + TEST_EQUAL(bm01->GetType(), "type", ()); - TEST_EQUAL(fm.GetBmCategory(1)->GetBookmark(0)->GetName(), "newName", ()); - TEST_EQUAL(fm.GetBmCategory(1)->GetBookmark(0)->GetType(), "newType", ()); + Bookmark const * bm00 = static_cast(fm.GetBmCategory(0)->GetUserMark(0)); - TEST_EQUAL(fm.GetBmCategory(0)->GetBookmarksCount(), 2, ()); - TEST_EQUAL(fm.GetBmCategory(1)->GetBookmarksCount(), 1, ()); + TEST_EQUAL(bm00->GetName(), "newName", ()); + TEST_EQUAL(bm00->GetType(), "newType", ()); + + Bookmark const * bm10 = static_cast(fm.GetBmCategory(1)->GetUserMark(0)); + + TEST_EQUAL(bm10->GetName(), "newName", ()); + TEST_EQUAL(bm10->GetType(), "newType", ()); + + TEST_EQUAL(fm.GetBmCategory(0)->GetUserMarkCount(), 2, ()); + TEST_EQUAL(fm.GetBmCategory(1)->GetUserMarkCount(), 1, ()); DeleteCategoryFiles(arrCat); } @@ -299,6 +317,7 @@ UNIT_TEST(Bookmarks_Timestamp) UNIT_TEST(Bookmarks_Getting) { Framework fm; + df::VisualParams::Init(1.0, 1024); fm.OnSize(800, 400); fm.ShowRect(m2::RectD(0, 0, 80, 40)); @@ -354,10 +373,11 @@ UNIT_TEST(Bookmarks_Getting) TEST_EQUAL(mark->GetName(), "4", ()); TEST_EQUAL(mark->GetType(), "placemark-blue", ()); - TEST_EQUAL(cat->GetBookmarksCount(), 2, ()); + TEST_EQUAL(cat->GetUserMarkCount(), 2, ()); - fm.GetBmCategory(2)->DeleteBookmark(0); - TEST_EQUAL(cat->GetBookmarksCount(), 1, ()); + BookmarkCategory::Guard guard(*fm.GetBmCategory(2)); + guard.m_controller.DeleteUserMark(0); + TEST_EQUAL(cat->GetUserMarkCount(), 1, ()); DeleteCategoryFiles(arrCat); } @@ -509,7 +529,7 @@ UNIT_TEST(Bookmarks_AddingMoving) mark = GetBookmarkPxPoint(fm, pixelPoint); cat = GetCategory(mark); TEST_EQUAL(cat->GetName(), arrCat[0], ()); - TEST_EQUAL(fm.GetBmCategory(0)->GetBookmarksCount(), 2, + TEST_EQUAL(fm.GetBmCategory(0)->GetUserMarkCount(), 2, ("Bookmark wasn't moved from one category to another")); TEST_EQUAL(mark->GetName(), "name2", ()); TEST_EQUAL(mark->GetType(), "placemark-blue", ()); @@ -552,14 +572,17 @@ UNIT_TEST(Bookmarks_InnerFolder) BookmarkCategory cat("Default", framework); TEST(cat.LoadFromKML(new MemReader(kmlString2, strlen(kmlString2))), ()); - TEST_EQUAL(cat.GetBookmarksCount(), 1, ()); + TEST_EQUAL(cat.GetUserMarkCount(), 1, ()); } UNIT_TEST(BookmarkCategory_EmptyName) { Framework framework; unique_ptr pCat(new BookmarkCategory("", framework)); - TEST(pCat->AddBookmark(m2::PointD(0, 0), BookmarkData("", "placemark-red")), ()); + { + BookmarkCategory::Guard guard(*pCat); + static_cast(guard.m_controller.CreateUserMark(m2::PointD(0, 0)))->SetData(BookmarkData("", "placemark-red")); + } TEST(pCat->SaveToKMLFile(), ()); pCat->SetName("xxx"); @@ -595,7 +618,7 @@ char const * kmlString3 = return false; if (b1.GetType() != b2.GetType()) return false; - if (!m2::AlmostEqualULPs(b1.GetOrg(), b2.GetOrg())) + if (!m2::AlmostEqualULPs(b1.GetPivot(), b2.GetPivot())) return false; if (!my::AlmostEqualULPs(b1.GetScale(), b2.GetScale())) return false; @@ -611,18 +634,20 @@ UNIT_TEST(Bookmarks_SpecialXMLNames) BookmarkCategory cat1("", framework); TEST(cat1.LoadFromKML(new MemReader(kmlString3, strlen(kmlString3))), ()); - TEST_EQUAL(cat1.GetBookmarksCount(), 1, ()); + TEST_EQUAL(cat1.GetUserMarkCount(), 1, ()); TEST(cat1.SaveToKMLFile(), ()); unique_ptr const cat2(BookmarkCategory::CreateFromKMLFile(cat1.GetFileName(), framework)); TEST(cat2.get(), ()); - TEST_EQUAL(cat2->GetBookmarksCount(), 1, ()); + TEST_EQUAL(cat2->GetUserMarkCount(), 1, ()); TEST_EQUAL(cat1.GetName(), "3663 and M & J Seafood Branches", ()); TEST_EQUAL(cat1.GetName(), cat2->GetName(), ()); TEST_EQUAL(cat1.GetFileName(), cat2->GetFileName(), ()); - TEST(EqualBookmarks(*cat1.GetBookmark(0), *cat2->GetBookmark(0)), ()); - TEST_EQUAL(cat1.GetBookmark(0)->GetName(), "![X1]{X2}(X3)", ()); + Bookmark const * bm1 = static_cast(cat1.GetUserMark(0)); + Bookmark const * bm2 = static_cast(cat2->GetUserMark(0)); + TEST(EqualBookmarks(*bm1, *bm2), ()); + TEST_EQUAL(bm1->GetName(), "![X1]{X2}(X3)", ()); TEST(my::DeleteFileX(cat1.GetFileName()), ()); } @@ -637,10 +662,10 @@ UNIT_TEST(TrackParsingTest_1) TEST_EQUAL(cat->GetTracksCount(), 4, ()); string names[4] = { "Option1", "Pakkred1", "Pakkred2", "Pakkred3"}; - graphics::Color col[4] = {graphics::Color(230, 0, 0, 255), - graphics::Color(171, 230, 0, 255), - graphics::Color(0, 230, 117, 255), - graphics::Color(0, 59, 230, 255)}; + dp::Color col[4] = {dp::Color(230, 0, 0, 255), + dp::Color(171, 230, 0, 255), + dp::Color(0, 230, 117, 255), + dp::Color(0, 59, 230, 255)}; double length[4] = {3525.46839061, 27174.11393166, 27046.0456586, 23967.35765800}; for (size_t i = 0; i < ARRAY_SIZE(names); ++i) @@ -648,7 +673,8 @@ UNIT_TEST(TrackParsingTest_1) Track const * track = cat->GetTrack(i); TEST_EQUAL(names[i], track->GetName(), ()); TEST(fabs(track->GetLengthMeters() - length[i]) < 1.0E-6, (track->GetLengthMeters(), length[i])); - TEST_EQUAL(col[i], track->GetMainColor(), ()); + TEST_GREATER(track->GetLayerCount(), 0, ()); + TEST_EQUAL(col[i], track->GetColor(0), ()); } } @@ -662,6 +688,7 @@ UNIT_TEST(TrackParsingTest_2) TEST_EQUAL(cat->GetTracksCount(), 1, ()); Track const * track = cat->GetTrack(0); TEST_EQUAL(track->GetName(), "XY", ()); - TEST_EQUAL(track->GetMainColor(), graphics::Color(57, 255, 32, 255), ()); + TEST_GREATER(track->GetLayerCount(), 0, ()); + TEST_EQUAL(track->GetColor(0), dp::Color(57, 255, 32, 255), ()); } diff --git a/map/map_tests/kmz_unarchive_test.cpp b/map/map_tests/kmz_unarchive_test.cpp index 07cdf70be0..3cc6b0eac9 100644 --- a/map/map_tests/kmz_unarchive_test.cpp +++ b/map/map_tests/kmz_unarchive_test.cpp @@ -41,22 +41,22 @@ UNIT_TEST(KMZ_UnzipTest) TEST_EQUAL(files.size(), 6, ("KMZ file wrong number of files")); - TEST_EQUAL(cat.GetBookmarksCount(), 6, ("Category wrong number of bookmarks")); + TEST_EQUAL(cat.GetUserMarkCount(), 6, ("Category wrong number of bookmarks")); { - Bookmark const * bm = cat.GetBookmark(5); + Bookmark const * bm = static_cast(cat.GetUserMark(5)); TEST_EQUAL(bm->GetName(), ("Lahaina Breakwall"), ("KML wrong name!")); TEST_EQUAL(bm->GetType(), "placemark-red", ("KML wrong type!")); - TEST_ALMOST_EQUAL_ULPS(bm->GetOrg().x, -156.6777046791284, ("KML wrong org x!")); - TEST_ALMOST_EQUAL_ULPS(bm->GetOrg().y, 21.34256685860084, ("KML wrong org y!")); + TEST_ALMOST_EQUAL_ULPS(bm->GetPivot().x, -156.6777046791284, ("KML wrong org x!")); + TEST_ALMOST_EQUAL_ULPS(bm->GetPivot().y, 21.34256685860084, ("KML wrong org y!")); TEST_EQUAL(bm->GetScale(), -1, ("KML wrong scale!")); } { - Bookmark const * bm = cat.GetBookmark(4); + Bookmark const * bm = static_cast(cat.GetUserMark(4)); TEST_EQUAL(bm->GetName(), ("Seven Sacred Pools, Kipahulu"), ("KML wrong name!")); TEST_EQUAL(bm->GetType(), "placemark-red", ("KML wrong type!")); - TEST_ALMOST_EQUAL_ULPS(bm->GetOrg().x, -156.0405130750025, ("KML wrong org x!")); - TEST_ALMOST_EQUAL_ULPS(bm->GetOrg().y, 21.12480639056074, ("KML wrong org y!")); + TEST_ALMOST_EQUAL_ULPS(bm->GetPivot().x, -156.0405130750025, ("KML wrong org x!")); + TEST_ALMOST_EQUAL_ULPS(bm->GetPivot().y, 21.12480639056074, ("KML wrong org y!")); TEST_EQUAL(bm->GetScale(), -1, ("KML wrong scale!")); } } diff --git a/map/map_tests/map_tests.pro b/map/map_tests/map_tests.pro index 57c4972ff2..68f7ac6658 100644 --- a/map/map_tests/map_tests.pro +++ b/map/map_tests/map_tests.pro @@ -6,7 +6,7 @@ CONFIG -= app_bundle TEMPLATE = app ROOT_DIR = ../.. -DEPENDENCIES = map render gui routing search storage graphics indexer platform anim geometry coding base \ +DEPENDENCIES = map drape_frontend routing search storage drape indexer platform geometry coding base \ freetype fribidi expat protobuf tomcrypt jansson osrm stats_client minizip succinct DEPENDENCIES *= opening_hours @@ -33,8 +33,6 @@ SOURCES += \ geourl_test.cpp \ kmz_unarchive_test.cpp \ mwm_url_tests.cpp \ - navigator_test.cpp \ - mwm_set_test.cpp \ !linux* { SOURCES += working_time_tests.cpp \ diff --git a/map/map_tests/mwm_url_tests.cpp b/map/map_tests/mwm_url_tests.cpp index 8f295fded1..08d758aa79 100644 --- a/map/map_tests/mwm_url_tests.cpp +++ b/map/map_tests/mwm_url_tests.cpp @@ -3,6 +3,8 @@ #include "map/framework.hpp" #include "map/mwm_url.hpp" +#include "drape_frontend/visual_params.hpp" + #include "coding/uri.hpp" #include "base/string_format.hpp" @@ -19,31 +21,31 @@ namespace lat = MercatorBounds::YToLat(MercatorBounds::LatToY(lat)); } - const UserMarkContainer::Type type = UserMarkContainer::API_MARK; + UserMarkType const type = UserMarkType::API_MARK; + class ApiTest { public: ApiTest(string const & uriString) { m_m = &m_fm.GetBookmarkManager(); - m_c = &m_m->UserMarksGetController(type); - m_api.SetController(m_c); - m_api.SetUriAndParse(uriString); + m_api.SetBookmarkManager(m_m); + + if (m_api.SetUriAndParse(uriString)) + { + if (!m_api.GetViewportRect(m_viewportRect)) + m_viewportRect = df::GetWorldRect(); + } } bool IsValid() const { return m_api.IsValid(); } - m2::RectD GetViewport() - { - m2::RectD rect; - ScalesProcessor scales; - m_api.GetViewportRect(scales, rect); - return rect; - } - string const & GetAppTitle() { return m_api.GetAppTitle(); } - bool GoBackOnBalloonClick() { return m_api.GoBackOnBalloonClick(); } - int GetPointCount() { return m_c->GetUserMarkCount(); } - string const & GetGlobalBackUrl() { return m_api.GetGlobalBackUrl(); } - int GetApiVersion() { return m_api.GetApiVersion(); } + m2::RectD GetViewport() const { return m_viewportRect; } + + string const & GetAppTitle() const { return m_api.GetAppTitle(); } + bool GoBackOnBalloonClick() const { return m_api.GoBackOnBalloonClick(); } + int GetPointCount() const { return UserMarkControllerGuard(*m_m, type).m_controller.GetUserMarkCount(); } + string const & GetGlobalBackUrl() const { return m_api.GetGlobalBackUrl(); } + int GetApiVersion() const { return m_api.GetApiVersion(); } bool TestLatLon(int index, double lat, double lon) const { double tLat, tLon; @@ -51,12 +53,12 @@ namespace return my::AlmostEqualULPs(tLat, lat) && my::AlmostEqualULPs(tLon, lon); } - bool TestName(int index, string const & name) + bool TestName(int index, string const & name) const { return GetMark(index)->GetName() == name; } - bool TestID(int index, string const & id) + bool TestID(int index, string const & id) const { return GetMark(index)->GetID() == id; } @@ -64,26 +66,32 @@ namespace private: ApiMarkPoint const * GetMark(int index) const { - TEST_LESS(index, m_c->GetUserMarkCount(), ()); - return static_cast(m_c->GetUserMark(index)); + UserMarkControllerGuard guard(*m_m, type); + TEST_LESS(index, guard.m_controller.GetUserMarkCount(), ()); + return static_cast(guard.m_controller.GetUserMark(index)); } private: Framework m_fm; ParsedMapApi m_api; - UserMarkContainer::Controller * m_c; + m2::RectD m_viewportRect; BookmarkManager * m_m; }; - bool IsValid(Framework & fm, string const & uriStrig) + bool IsValid(Framework & fm, string const & uriString) { ParsedMapApi api; - UserMarkContainer::Type type = UserMarkContainer::API_MARK; - api.SetController(&fm.GetBookmarkManager().UserMarksGetController(type)); - api.SetUriAndParse(uriStrig); - bool res = api.IsValid(); - fm.GetBookmarkManager().UserMarksClear(type); - return res; + bool isValid = false; + { + api.SetBookmarkManager(&fm.GetBookmarkManager()); + if (api.SetUriAndParse(uriString)) + isValid = api.IsValid(); + + UserMarkControllerGuard guard(fm.GetBookmarkManager(), UserMarkType::API_MARK); + guard.m_controller.Clear(); + } + + return isValid; } } diff --git a/map/map_tests/screen_coverage_test.cpp b/map/map_tests/screen_coverage_test.cpp deleted file mode 100644 index 564503f1d3..0000000000 --- a/map/map_tests/screen_coverage_test.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#include "testing/testing.hpp" - -#include "map/screen_coverage.hpp" - -#include "map/coverage_generator.hpp" -#include "map/tile_renderer.hpp" -#include "yg/rendercontext.hpp" -#include "std/bind.hpp" -#include "platform/platform.hpp" -#include "yg/internal/opengl.hpp" - -class RenderContextMock : public yg::gl::RenderContext -{ -public: - - void makeCurrent() - {} - - shared_ptr createShared() - { - return shared_ptr(new RenderContextMock()); - } - - void endThreadDrawing() - {} -}; - -class TileRendererMock : public TileRenderer -{ -public: - TileRendererMock(string const & skinName, - unsigned scaleEtalonSize, - unsigned maxTilesCount, - unsigned tasksCount, - yg::Color const & bgColor, - RenderPolicy::TRenderFn const & renderFn) - : TileRenderer(skinName, scaleEtalonSize, maxTilesCount, tasksCount, bgColor, renderFn) - {} - - void DrawTile(core::CommandsQueue::Environment const & env, - Tiler::RectInfo const & rectInfo, - int sequenceID) - { - shared_ptr tileTarget = m_resourceManager->renderTargets().Front(true); - - shared_ptr layer(new yg::InfoLayer()); - - ScreenBase frameScreen; - - unsigned tileWidth = m_resourceManager->tileTextureWidth(); - unsigned tileHeight = m_resourceManager->tileTextureHeight(); - - m2::RectI renderRect(1, 1, tileWidth - 1, tileHeight - 1); - - frameScreen.OnSize(renderRect); - frameScreen.SetFromRect(rectInfo.m_rect); - - LOG(LINFO, ("drawTile : ", rectInfo.m_y, rectInfo.m_x, rectInfo.m_tileScale, rectInfo.m_drawScale, ", id=", rectInfo.toUInt64Cell())); - - if (sequenceID < m_sequenceID) - return; - - if (HasTile(rectInfo)) - return; - - threads::Sleep(500); - - AddTile(rectInfo, Tile(tileTarget, layer, frameScreen, rectInfo, 0)); - } -}; - -class WindowHandleMock : public WindowHandle -{ -public: - void invalidateImpl() - {} -}; - -void foo() -{} - -void ScreenCoverageTestImpl(int executorsNum) -{ - yg::gl::g_doFakeOpenGLCalls = true; - - shared_ptr windowHandle(new WindowHandleMock()); - shared_ptr primaryContext(new RenderContextMock()); - shared_ptr resourceManager = make_shared_ptr(new yg::ResourceManager( - 30000 * sizeof(yg::gl::Vertex), - 50000 * sizeof(unsigned short), - 20, - 3000 * sizeof(yg::gl::Vertex), - 5000 * sizeof(unsigned short), - 100, - 10 * sizeof(yg::gl::AuxVertex), - 10 * sizeof(unsigned short), - 30, - 512, 256, 10, - 512, 256, 5, - 512, 512, 20, - "unicode_blocks.txt", - "fonts_whitelist.txt", - "fonts_blacklist.txt", - 2 * 1024 * 1024, - GetPlatform().CpuCores() + 1, - yg::Rt8Bpp, - false)); - - TileRendererMock tileRenderer("basic.skn", 512 + 256, 10, executorsNum, yg::Color(), bind(&foo)); - - CoverageGenerator gen( - GetPlatform().TileSize(), - GetPlatform().ScaleEtalonSize(), - &tileRenderer, - windowHandle - ); - - gen.Initialize(); - tileRenderer.Initialize(primaryContext, resourceManager, 1); - - ScreenBase screen0(m2::RectI(0, 0, 347, 653), m2::RectD(14.672034256593292412, 56.763875246806442476, 16.337299222955756761, 59.897644765638396791)); - ScreenBase screen1(m2::RectI(0, 0, 347, 653), m2::RectD(13.539462118087413955, 56.759076212321247112, 15.204727084449878305, 59.892845731153201427)); - ScreenBase screen2(m2::RectI(0, 0, 347, 653), m2::RectD(16.154935912518372021, 56.749478143350856385, 17.82020087888083637, 59.8832476621828107)); - ScreenBase screen3(m2::RectI(0, 0, 347, 653), m2::RectD(17.335498395876193456, 56.725482970924879567, 19.000763362238657805, 59.859252489756833882)); - - gen.AddCoverScreenTask(screen0); - - /// waiting for CoverScreen processed - gen.WaitForEmptyAndFinished(); - /// waiting for the tiles to be rendered... - tileRenderer.WaitForEmptyAndFinished(); - /// ...and merged - gen.WaitForEmptyAndFinished(); - - gen.AddCoverScreenTask(screen1); - - gen.WaitForEmptyAndFinished(); - tileRenderer.WaitForEmptyAndFinished(); - gen.WaitForEmptyAndFinished(); - - gen.AddCoverScreenTask(screen0); - - gen.WaitForEmptyAndFinished(); - tileRenderer.WaitForEmptyAndFinished(); - gen.WaitForEmptyAndFinished(); - - /// checking that erased tiles are completely unlocked - - TileCache * tileCache = &tileRenderer.GetTileCache(); - - vector erasedRects; - - erasedRects.push_back(Tiler::RectInfo(8, 8, 9, 40)); - erasedRects.push_back(Tiler::RectInfo(8, 8, 9, 41)); - erasedRects.push_back(Tiler::RectInfo(8, 8, 9, 42)); - - for (unsigned i = 0; i < erasedRects.size(); ++i) - CHECK(tileCache->lockCount(erasedRects[i]) == 0, ()); - - /// checking, that tiles in coverage are present and locked - - vector coveredRects; - - coveredRects.push_back(Tiler::RectInfo(8, 8, 10, 40)); - coveredRects.push_back(Tiler::RectInfo(8, 8, 10, 41)); - coveredRects.push_back(Tiler::RectInfo(8, 8, 10, 42)); - - for (unsigned i = 0; i < coveredRects.size(); ++i) - CHECK(tileCache->lockCount(coveredRects[i]) > 0, (coveredRects[i].m_x, coveredRects[i].m_y, coveredRects[i].m_tileScale, coveredRects[i].m_drawScale, coveredRects[i].toUInt64Cell())); - - gen.AddCoverScreenTask(screen2); - gen.WaitForEmptyAndFinished(); - tileRenderer.WaitForEmptyAndFinished(); - gen.WaitForEmptyAndFinished(); - - for (unsigned i = 0; i < coveredRects.size(); ++i) - CHECK(tileCache->lockCount(coveredRects[i]) == 0, (coveredRects[i].m_x, coveredRects[i].m_y, coveredRects[i].m_tileScale, coveredRects[i].m_drawScale, coveredRects[i].toUInt64Cell())); - - coveredRects.clear(); - - coveredRects.push_back(Tiler::RectInfo(8, 8, 11, 40)); - coveredRects.push_back(Tiler::RectInfo(8, 8, 11, 41)); - coveredRects.push_back(Tiler::RectInfo(8, 8, 11, 42)); - - for (unsigned i = 0; i < coveredRects.size(); ++i) - CHECK(tileCache->lockCount(coveredRects[i]) == 0, (coveredRects[i].m_x, coveredRects[i].m_y, coveredRects[i].m_tileScale, coveredRects[i].m_drawScale, coveredRects[i].toUInt64Cell())); - - gen.AddCoverScreenTask(screen3); - gen.WaitForEmptyAndFinished(); - tileRenderer.WaitForEmptyAndFinished(); - gen.WaitForEmptyAndFinished(); - - gen.Cancel(); -} - -UNIT_TEST(ScreenCoverageTest) -{ - ScreenCoverageTestImpl(2); -// ScreenCoverageTestImpl(2); -} - diff --git a/map/move_screen_task.cpp b/map/move_screen_task.cpp deleted file mode 100644 index 3fdd243ab6..0000000000 --- a/map/move_screen_task.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "map/move_screen_task.hpp" - -#include "map/framework.hpp" - -MoveScreenTask::MoveScreenTask(Framework * framework, - m2::PointD const & startPt, - m2::PointD const & endPt, - double interval) - : anim::SegmentInterpolation(startPt, - endPt, - interval, - m_outPt), - m_framework(framework) -{} - -void MoveScreenTask::OnStep(double ts) -{ - m2::PointD oldPt = m_outPt; - anim::SegmentInterpolation::OnStep(ts); - Navigator & nav = m_framework->GetNavigator(); - nav.SetOrg(nav.Screen().GetOrg() + m_outPt - oldPt); -} - -void MoveScreenTask::OnEnd(double ts) -{ - anim::SegmentInterpolation::OnEnd(ts); - Navigator & nav = m_framework->GetNavigator(); - nav.SetOrg(m_outPt); - m_framework->UpdateUserViewportChanged(); -} - -bool MoveScreenTask::IsVisual() const -{ - return true; -} diff --git a/map/move_screen_task.hpp b/map/move_screen_task.hpp deleted file mode 100644 index cbcc24fe10..0000000000 --- a/map/move_screen_task.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "anim/segment_interpolation.hpp" - -class Framework; - -class MoveScreenTask : public anim::SegmentInterpolation -{ -private: - - Framework * m_framework; - m2::PointD m_outPt; - -public: - - MoveScreenTask(Framework * framework, - m2::PointD const & startPt, - m2::PointD const & endPt, - double interval); - - void OnStep(double ts); - void OnEnd(double ts); - - bool IsVisual() const; -}; diff --git a/map/mwm_tests/mwm_tests.pro b/map/mwm_tests/mwm_tests.pro index 526adea8dd..4fd5902a4e 100644 --- a/map/mwm_tests/mwm_tests.pro +++ b/map/mwm_tests/mwm_tests.pro @@ -6,7 +6,7 @@ CONFIG -= app_bundle TEMPLATE = app ROOT_DIR = ../.. -DEPENDENCIES = map gui search storage graphics indexer platform anim geometry coding base \ +DEPENDENCIES = map search storage indexer platform geometry coding base \ freetype fribidi expat protobuf tomcrypt jansson include($$ROOT_DIR/common.pri) diff --git a/map/mwm_url.cpp b/map/mwm_url.cpp index 8b2bc68f57..6ba57150c4 100644 --- a/map/mwm_url.cpp +++ b/map/mwm_url.cpp @@ -1,10 +1,13 @@ #include "mwm_url.hpp" -#include "render/scales_processor.hpp" +#include "map/api_mark_point.hpp" +#include "map/bookmark_manager.hpp" #include "indexer/mercator.hpp" #include "indexer/scales.hpp" +#include "drape_frontend/visual_params.hpp" + #include "coding/uri.hpp" #include "base/logging.hpp" @@ -27,16 +30,16 @@ bool IsInvalidApiPoint(ApiPoint const & p) { return p.m_lat == INVALID_LAT_VALUE } // unnames namespace ParsedMapApi::ParsedMapApi() - : m_controller(NULL) + : m_bmManager(nullptr) , m_version(0) , m_zoomLevel(0.0) , m_goBackOnBalloonClick(false) { } -void ParsedMapApi::SetController(UserMarkContainer::Controller * controller) +void ParsedMapApi::SetBookmarkManager(BookmarkManager * manager) { - m_controller = controller; + m_bmManager = manager; } bool ParsedMapApi::SetUriAndParse(string const & url) @@ -47,18 +50,20 @@ bool ParsedMapApi::SetUriAndParse(string const & url) bool ParsedMapApi::IsValid() const { - ASSERT(m_controller != NULL, ()); - return m_controller->GetUserMarkCount() > 0; + ASSERT(m_bmManager != nullptr, ()); + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::API_MARK); + return guard.m_controller.GetUserMarkCount() > 0; } bool ParsedMapApi::Parse(Uri const & uri) { - ASSERT(m_controller != NULL, ()); - string const & scheme = uri.GetScheme(); if ((scheme != "mapswithme" && scheme != "mwm") || uri.GetPath() != "map") return false; + ASSERT(m_bmManager != nullptr, ()); + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::API_MARK); + vector points; uri.ForEachKeyValue(bind(&ParsedMapApi::AddKeyValue, this, _1, _2, ref(points))); points.erase(remove_if(points.begin(), points.end(), &IsInvalidApiPoint), points.end()); @@ -67,7 +72,7 @@ bool ParsedMapApi::Parse(Uri const & uri) { ApiPoint const & p = points[i]; m2::PointD glPoint(MercatorBounds::FromLatLon(p.m_lat, p.m_lon)); - ApiMarkPoint * mark = static_cast(m_controller->CreateUserMark(glPoint)); + ApiMarkPoint * mark = static_cast(guard.m_controller.CreateUserMark(glPoint)); mark->SetName(p.m_name); mark->SetID(p.m_id); mark->SetStyle(style::GetSupportedStyle(p.m_style, p.m_name, "")); @@ -174,21 +179,23 @@ void ParsedMapApi::Reset() m_goBackOnBalloonClick = false; } -bool ParsedMapApi::GetViewportRect(ScalesProcessor const & scales, m2::RectD & rect) const +bool ParsedMapApi::GetViewportRect(m2::RectD & rect) const { - ASSERT(m_controller != NULL, ()); - size_t markCount = m_controller->GetUserMarkCount(); + ASSERT(m_bmManager != nullptr, ()); + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::API_MARK); + + size_t markCount = guard.m_controller.GetUserMarkCount(); if (markCount == 1 && m_zoomLevel >= 1) { double zoom = min(static_cast(scales::GetUpperComfortScale()), m_zoomLevel); - rect = scales.GetRectForDrawScale(zoom, m_controller->GetUserMark(0)->GetOrg()); + rect = df::GetRectForDrawScale(zoom, guard.m_controller.GetUserMark(0)->GetPivot()); return true; } else { m2::RectD result; - for (size_t i = 0; i < m_controller->GetUserMarkCount(); ++i) - result.Add(m_controller->GetUserMark(i)->GetOrg()); + for (size_t i = 0; i < guard.m_controller.GetUserMarkCount(); ++i) + result.Add(guard.m_controller.GetUserMark(i)->GetPivot()); if (result.IsValid()) { @@ -202,11 +209,13 @@ bool ParsedMapApi::GetViewportRect(ScalesProcessor const & scales, m2::RectD & r UserMark const * ParsedMapApi::GetSinglePoint() const { - ASSERT(m_controller != NULL, ()); - if (m_controller->GetUserMarkCount() != 1) - return 0; + ASSERT(m_bmManager != nullptr, ()); + UserMarkControllerGuard guard(*m_bmManager, UserMarkType::API_MARK); - return m_controller->GetUserMark(0); + if (guard.m_controller.GetUserMarkCount() != 1) + return nullptr; + + return guard.m_controller.GetUserMark(0); } } diff --git a/map/mwm_url.hpp b/map/mwm_url.hpp index a0e71ee9dd..edd6e00adb 100644 --- a/map/mwm_url.hpp +++ b/map/mwm_url.hpp @@ -1,12 +1,13 @@ #pragma once -#include "api_mark_container.hpp" +#include "map/user_mark.hpp" #include "geometry/rect2d.hpp" #include "std/string.hpp" class ScalesProcessor; +class BookmarkManager; namespace url_scheme { @@ -28,7 +29,7 @@ class ParsedMapApi public: ParsedMapApi(); - void SetController(UserMarkContainer::Controller * controller); + void SetBookmarkManager(BookmarkManager * manager); bool SetUriAndParse(string const & url); bool IsValid() const; @@ -39,14 +40,14 @@ public: bool GoBackOnBalloonClick() const { return m_goBackOnBalloonClick; } /// @name Used in settings map viewport after invoking API. - bool GetViewportRect(ScalesProcessor const & scales, m2::RectD & rect) const; + bool GetViewportRect(m2::RectD & rect) const; UserMark const * GetSinglePoint() const; private: bool Parse(Uri const & uri); void AddKeyValue(string key, string const & value, vector & points); - UserMarkContainer::Controller * m_controller; + BookmarkManager * m_bmManager; string m_globalBackUrl; string m_appTitle; int m_version; diff --git a/map/navigator.hpp b/map/navigator.hpp deleted file mode 100644 index 7739c771c6..0000000000 --- a/map/navigator.hpp +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once -#include "render/scales_processor.hpp" - -#include "anim/task.hpp" - -#include "geometry/screenbase.hpp" - -#include "base/matrix.hpp" - -#include "std/shared_ptr.hpp" - - -/// Calculates screen parameters in navigation (dragging, scaling, etc.). -class Navigator -{ -public: - Navigator(ScalesProcessor const & scales); - - void SetFromRect(m2::AnyRectD const & r); - void CenterViewport(m2::PointD const & p); - void SetFromRects(m2::AnyRectD const & glbRect, m2::RectD const & pxRect); - - double ComputeMoveSpeed(m2::PointD const & p0, m2::PointD const & p1) const; - - void OnSize(int x0, int y0, int w, int h); - - ScreenBase const & Screen() const { return m_Screen; } - ScreenBase const & StartScreen() const { return m_StartScreen; } - - m2::PointD GtoP(m2::PointD const & pt) const; - m2::PointD PtoG(m2::PointD const & pt) const; - - void GetTouchRect(m2::PointD const & pixPoint, double pixRadius, m2::AnyRectD & glbRect) const; - void GetTouchRect(const m2::PointD & pixPoint, - double pxWidth, double pxHeight, - m2::AnyRectD & glbRect) const; - - void StartDrag(m2::PointD const & pt, double timeInSec); - void DoDrag(m2::PointD const & pt, double timeInSec); - void StopDrag(m2::PointD const & pt, double timeInSec, bool animate); - - void StartRotate(double Angle, double timeInSec); - void DoRotate(double Angle, double timeInSec); - void StopRotate(double Angle, double timeInSec); - - void StartScale(m2::PointD const & pt1, m2::PointD const & pt2, double timeInSec); - void DoScale(m2::PointD const & org, m2::PointD const & p1, m2::PointD const & p2); - void DoScale(m2::PointD const & pt1, m2::PointD const & pt2, double timeInSec); - void StopScale(m2::PointD const & pt1, m2::PointD const & pt2, double timeInSec); - bool IsRotatingDuringScale() const; - - void ScaleToPoint(m2::PointD const & pt, double factor, double timeInSec); - shared_ptr ScaleToPointAnim(m2::PointD const & pt, double factor, double timeInSec); - - void Scale(double scale); - shared_ptr ScaleAnim(double scale); - void Rotate(double angle); - void SetAngle(double angle); - void SetOrg(m2::PointD const & org); - - void Move(double azDir, double factor); - - // Returns true if another update is necessary, i.e. animation is not finished. - bool Update(double timeInSec); - - bool InAction() const; - - /// Our surface is a square which is bigger than visible screen area on the device, - /// so we should take it into an account - m2::PointD ShiftPoint(m2::PointD const & pt) const; - - int GetDrawScale() const; - -private: - ScalesProcessor const & m_scales; - - bool CheckMinScale(ScreenBase const & screen) const; - bool CheckMaxScale(ScreenBase const & screen) const; - bool CheckBorders(ScreenBase const & screen) const; - - static bool CanShrinkInto(ScreenBase const & screen, m2::RectD const & boundRect); - static ScreenBase const ShrinkInto(ScreenBase const & screen, m2::RectD boundRect); - - static bool CanRotateInto(ScreenBase const & screen, m2::RectD const & boundRect); - static ScreenBase const RotateInto(ScreenBase const & screen, m2::RectD const & boundRect); - - static ScreenBase const ScaleInto(ScreenBase const & screen, m2::RectD boundRect); - static ScreenBase const ShrinkAndScaleInto(ScreenBase const & screen, m2::RectD boundRect); - - // Internal screen corresponding to the state when navigation began with StartDrag or StartScale. - ScreenBase m_StartScreen; - // Internal screen to do GtoP() and PtoG() calculations. It is always up to date with navigation. - ScreenBase m_Screen; - // Intial point for dragging and scaling. - m2::PointD m_StartPt1; - // Last point for dragging and scaling. - m2::PointD m_LastPt1; - // Second initial point for scaling. - m2::PointD m_StartPt2; - // Second Last point for scaling. - m2::PointD m_LastPt2; - // Start value of rotation angle - double m_StartAngle; - // Current screen speed in post-dragging animation. - double m_DragAnimationSpeed; - // Move direction of the screen in post-dragging animation. - double m_DragAnimationDirection; - // Last update time. - double m_LastUpdateTimeInSec; - // Delta matrix which stores transformation between m_StartScreen and m_Screen. - math::Matrix m_DeltaMatrix; - // Flag, which indicates, whether we are in the middle of some action. - bool m_InAction; - // Should we check for threshold while scaling by two fingers. - bool m_DoCheckRotationThreshold; - // Do screen rotates during the two fingers scaling. - bool m_IsRotatingDuringScale; - // Used in DoScale and ScaleByPoint - bool ScaleImpl(m2::PointD const & newPt1, - m2::PointD const & newPt2, - m2::PointD const & oldPt1, - m2::PointD const & oldPt2, - bool skipMinScaleAndBordersCheck, - bool doRotateScreen); -}; diff --git a/map/navigator_utils.cpp b/map/navigator_utils.cpp deleted file mode 100644 index 7bdb8c70ee..0000000000 --- a/map/navigator_utils.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "navigator_utils.hpp" - -namespace navi -{ - -m2::AnyRectD ToRotated(m2::RectD const & rect, Navigator const & navigator) -{ - double const dx = rect.SizeX(); - double const dy = rect.SizeY(); - - return m2::AnyRectD(rect.Center(), - navigator.Screen().GetAngle(), - m2::RectD(-dx/2, -dy/2, dx/2, dy/2)); -} - -void SetRectFixedAR(m2::AnyRectD const & rect, const ScalesProcessor & scales, Navigator & navigator) -{ - double const halfSize = scales.GetTileSize() / 2.0; - m2::RectD etalonRect(-halfSize, -halfSize, halfSize, halfSize); - - m2::PointD const pxCenter = navigator.Screen().PixelRect().Center(); - etalonRect.Offset(pxCenter); - - navigator.SetFromRects(rect, etalonRect); -} - -} // namespace navi diff --git a/map/navigator_utils.hpp b/map/navigator_utils.hpp deleted file mode 100644 index 4e76113499..0000000000 --- a/map/navigator_utils.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "navigator.hpp" - -#include "render/scales_processor.hpp" - -#include "geometry/any_rect2d.hpp" - -namespace navi -{ - -m2::AnyRectD ToRotated(m2::RectD const & rect, Navigator const & navigator); -void SetRectFixedAR(m2::AnyRectD const & rect, ScalesProcessor const & scales, Navigator & navigator); - -} // namespace navi diff --git a/map/pin_click_manager.cpp b/map/pin_click_manager.cpp deleted file mode 100644 index 3bf184df56..0000000000 --- a/map/pin_click_manager.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "map/pin_click_manager.hpp" -#include "map/framework.hpp" - -#include "search/result.hpp" - -#include "anim/task.hpp" -#include "anim/controller.hpp" - -#include "graphics/depth_constants.hpp" -#include "graphics/opengl/base_texture.hpp" -#include "graphics/display_list.hpp" -#include "graphics/icon.hpp" - -#include "geometry/transformations.hpp" - -#include "gui/controller.hpp" - - -PinClickManager::PinClickManager(Framework & f) - : m_f(f) -{} - -void PinClickManager::Hide() -{ - m_f.Invalidate(); -} - -void PinClickManager::OnShowMark(UserMark const * mark) -{ - if (mark != nullptr && m_userMarkListener != nullptr) - m_userMarkListener(mark->Copy()); - SetBalloonVisible(mark != nullptr); -} - -void PinClickManager::SetBalloonVisible(bool isVisible) -{ - if (!isVisible && m_f.HasActiveUserMark()) - OnDismiss(); - - m_f.Invalidate(); -} - -void PinClickManager::RemovePin() -{ - m_f.ActivateUserMark(NULL); - m_f.Invalidate(); -} - -void PinClickManager::Dismiss() -{ - OnDismiss(); -} - -void PinClickManager::ClearListeners() -{ - m_userMarkListener = TUserMarkListener(); - m_dismissListener = TDismissListener(); -} - -void PinClickManager::OnDismiss() -{ - // Can be called before the listeners will be attached (clearing on activity start). - if (m_dismissListener) - m_dismissListener(); -} diff --git a/map/pin_click_manager.hpp b/map/pin_click_manager.hpp deleted file mode 100644 index 2750432607..0000000000 --- a/map/pin_click_manager.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once -#include "map/bookmark.hpp" - -#include "graphics/defines.hpp" - -#include "geometry/point2d.hpp" - -#include "std/function.hpp" -#include "std/shared_ptr.hpp" -#include "std/unique_ptr.hpp" - - -class Framework; -class PaintEvent; -namespace location { class GpsInfo; } -namespace gui { class Element; } -namespace url_scheme { struct ApiPoint; } - -class PinClickManager -{ - Framework & m_f; - - void OnDismiss(); - - void SetBalloonVisible(bool isVisible); - -public: - PinClickManager(Framework & f); - - void RenderPolicyCreated(graphics::EDensity density) {} - void LocationChanged(location::GpsInfo const & info) {} - - void OnShowMark(UserMark const * mark); - - void Hide(); - - void RemovePin(); - void Dismiss(); - -private: - /// @name Platform dependent listeners to show special activities. - //@{ - // You must delete UserMarkCopy obtained by this callback - typedef function)> TUserMarkListener; - TUserMarkListener m_userMarkListener; - typedef function TDismissListener; - TDismissListener m_dismissListener; - -public: - template void ConnectUserMarkListener(T const & t) { m_userMarkListener = t; } - template void ConnectDismissListener(T const & t) { m_dismissListener = t; } - - void ClearListeners(); - //@} -}; diff --git a/map/qgl_render_context.cpp b/map/qgl_render_context.cpp deleted file mode 100644 index 9a2b008f25..0000000000 --- a/map/qgl_render_context.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "base/SRC_FIRST.hpp" - -#include "map/qgl_render_context.hpp" - -#include "base/assert.hpp" -#include "base/logging.hpp" - -#include -#include -#include - - -namespace qt -{ - namespace gl - { - struct null_deleter - { - template void operator()(T*) {} - }; - - /// Create compatible render context - RenderContext::RenderContext(QGLWidget * widget) - { - /// Dirty hack, but we'll use it with caution, I promise. - m_context = shared_ptr(const_cast(widget->context()), null_deleter()); - } - - void RenderContext::makeCurrent() - { - m_context->makeCurrent(); - } - - graphics::RenderContext * RenderContext::createShared() - { - graphics::gl::RenderContext * res = new RenderContext(this); - res->setResourceManager(resourceManager()); - return res; - } - - void RenderContext::endThreadDrawing(unsigned threadSlot) - { - m_context.reset(); - graphics::gl::RenderContext::endThreadDrawing(threadSlot); - } - - RenderContext::RenderContext(RenderContext * renderContext) - { - QGLFormat const format = renderContext->context()->format(); - m_parent = make_shared(); - m_context = make_shared(format, m_parent.get()); - bool sharedContextCreated = m_context->create(renderContext->context().get()); - bool isSharing = m_context->isSharing(); - ASSERT(sharedContextCreated && isSharing, ("cannot create shared opengl context")); - if (!sharedContextCreated || !isSharing) - m_context.reset(); - } - - RenderContext::~RenderContext() - { - m_context.reset(); - m_parent.reset(); - } - - shared_ptr RenderContext::context() const - { - return m_context; - } - } -} diff --git a/map/qgl_render_context.hpp b/map/qgl_render_context.hpp deleted file mode 100644 index bb628e1c4a..0000000000 --- a/map/qgl_render_context.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "graphics/opengl/gl_render_context.hpp" - -#include "std/shared_ptr.hpp" - -class QWidget; -class QGLContext; -class QGLWidget; - -namespace qt -{ - namespace gl - { - class RenderContext : public graphics::gl::RenderContext - { - private: - shared_ptr m_context; - shared_ptr m_parent; - - /// Creates a rendering context, which shares - /// data(textures, display lists e.t.c) with renderContext. - /// Used in rendering thread. - RenderContext(RenderContext * renderContext); - - public: - RenderContext(QGLWidget * widget); - ~RenderContext(); - - /// Make this rendering context current - void makeCurrent(); - - graphics::RenderContext * createShared(); - - /// Leave previous logic, but fix thread widget deletion error. - void endThreadDrawing(unsigned threadSlot); - - shared_ptr context() const; - }; - } -} diff --git a/map/rotate_screen_task.cpp b/map/rotate_screen_task.cpp deleted file mode 100644 index 3a8cb49ff8..0000000000 --- a/map/rotate_screen_task.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "map/rotate_screen_task.hpp" -#include "map/framework.hpp" - -RotateScreenTask::RotateScreenTask(Framework * framework, - double startAngle, - double endAngle, - double speed) - : anim::AngleInterpolation(startAngle, - endAngle, - speed, - m_outAngle), - m_framework(framework) -{ -} - -void RotateScreenTask::OnStep(double ts) -{ - double prevAngle = m_outAngle; - anim::AngleInterpolation::OnStep(ts); - Navigator & nav = m_framework->GetNavigator(); - nav.SetAngle(nav.Screen().GetAngle() + m_outAngle - prevAngle); - m_framework->Invalidate(); -} - -void RotateScreenTask::OnEnd(double ts) -{ - anim::AngleInterpolation::OnEnd(ts); - Navigator & nav = m_framework->GetNavigator(); - nav.SetAngle(m_outAngle); - m_framework->Invalidate(); -} - -bool RotateScreenTask::IsVisual() const -{ - return true; -} diff --git a/map/rotate_screen_task.hpp b/map/rotate_screen_task.hpp deleted file mode 100644 index 48ab30ec10..0000000000 --- a/map/rotate_screen_task.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "anim/angle_interpolation.hpp" - -class Framework; - -class RotateScreenTask : public anim::AngleInterpolation -{ -private: - - Framework * m_framework; - double m_outAngle; - -public: - - RotateScreenTask(Framework * framework, - double startAngle, - double endAngle, - double speed); - - void OnStep(double ts); - void OnEnd(double ts); - - bool IsVisual() const; -}; diff --git a/map/route_track.cpp b/map/route_track.cpp deleted file mode 100644 index b34f670ac8..0000000000 --- a/map/route_track.cpp +++ /dev/null @@ -1,361 +0,0 @@ -#include "map/route_track.hpp" - -#include "graphics/screen.hpp" -#include "graphics/display_list.hpp" -#include "graphics/depth_constants.hpp" -#include "graphics/pen.hpp" - -#include "indexer/scales.hpp" - -#include "std/array.hpp" - -namespace -{ - pair ShiftArrow(pair const & arrowDirection) - { - return pair(arrowDirection.first - (arrowDirection.second - arrowDirection.first), - arrowDirection.first); - } - - void DrawArrowTriangle(graphics::Screen * dlScreen, pair const & arrowDirection, - double arrowWidth, double arrowLength, graphics::Color arrowColor, double arrowDepth) - { - ASSERT(dlScreen, ()); - - array arrow; - m2::GetArrowPoints(arrowDirection.first, arrowDirection.second, arrowWidth, arrowLength, arrow); - dlScreen->drawConvexPolygon(&arrow[0], arrow.size(), arrowColor, arrowDepth); - } -} - -bool ClipArrowBodyAndGetArrowDirection(vector & ptsTurn, pair & arrowDirection, - size_t turnIndex, double beforeTurn, double afterTurn, double arrowLength) -{ - size_t const ptsTurnSz = ptsTurn.size(); - ASSERT_LESS(turnIndex, ptsTurnSz, ()); - ASSERT_GREATER(ptsTurnSz, 1, ()); - - /// Clipping after turnIndex - size_t i = turnIndex; - double len = 0, vLen = 0; - while (len < afterTurn) - { - if (i > ptsTurnSz - 2) - return false; - vLen = ptsTurn[i + 1].Length(ptsTurn[i]); - len += vLen; - i += 1; - } - if (my::AlmostEqualULPs(vLen, 0.)) - return false; - - double lenForArrow = len - afterTurn; - double vLenForArrow = lenForArrow; - size_t j = i; - while (lenForArrow < arrowLength) - { - if (j > ptsTurnSz - 2) - return false; - vLenForArrow = ptsTurn[j + 1].Length(ptsTurn[j]); - lenForArrow += vLenForArrow; - j += 1; - } - ASSERT_GREATER(j, 0, ()); - if (m2::AlmostEqualULPs(ptsTurn[j - 1], ptsTurn[j])) - return false; - m2::PointD arrowEnd = m2::PointAtSegment(ptsTurn[j - 1], ptsTurn[j], vLenForArrow - (lenForArrow - arrowLength)); - - if (my::AlmostEqualULPs(len, afterTurn)) - ptsTurn.resize(i + 1); - else - { - if (!m2::AlmostEqualULPs(ptsTurn[i], ptsTurn[i - 1])) - { - m2::PointD const p = m2::PointAtSegment(ptsTurn[i - 1], ptsTurn[i], vLen - (len - afterTurn)); - ptsTurn[i] = p; - ptsTurn.resize(i + 1); - } - else - ptsTurn.resize(i); - } - - // Calculating arrow direction - arrowDirection.first = ptsTurn.back(); - arrowDirection.second = arrowEnd; - arrowDirection = ShiftArrow(arrowDirection); - - /// Clipping before turnIndex - i = turnIndex; - len = 0; - while (len < beforeTurn) - { - if (i < 1) - return false; - vLen = ptsTurn[i - 1].Length(ptsTurn[i]); - len += vLen; - i -= 1; - } - if (my::AlmostEqualULPs(vLen, 0.)) - return false; - - if (my::AlmostEqualULPs(len, beforeTurn)) - { - if (i != 0) - { - ptsTurn.erase(ptsTurn.begin(), ptsTurn.begin() + i); - return true; - } - } - else - { - if (!m2::AlmostEqualULPs(ptsTurn[i], ptsTurn[i + 1])) - { - m2::PointD const p = m2::PointAtSegment(ptsTurn[i + 1], ptsTurn[i], vLen - (len - beforeTurn)); - ptsTurn[i] = p; - if (i != 0) - { - ptsTurn.erase(ptsTurn.begin(), ptsTurn.begin() + i); - return true; - } - } - else - { - ptsTurn.erase(ptsTurn.begin(), ptsTurn.begin() + i); - return true; - } - } - return true; -} - -bool MergeArrows(vector & ptsCurrentTurn, vector const & ptsNextTurn, double bodyLen, double arrowLen) -{ - ASSERT_GREATER_OR_EQUAL(ptsCurrentTurn.size(), 2, ()); - ASSERT_GREATER_OR_EQUAL(ptsNextTurn.size(), 2, ()); - ASSERT_GREATER(bodyLen, 0, ()); - ASSERT_GREATER(arrowLen, 0, ()); - ASSERT_GREATER(bodyLen, arrowLen, ()); - - double const distBetweenBodies = ptsCurrentTurn.back().Length(ptsNextTurn.front()); - /// The most likely the function returns here because the arrows are usually far to each other - if (distBetweenBodies > bodyLen) - return false; - - /// The arrows are close to each other or intersected - double const distBetweenBodies2 = ptsCurrentTurn[ptsCurrentTurn.size() - 2].Length(ptsNextTurn[1]); - if (distBetweenBodies < distBetweenBodies2) - { - /// The arrows bodies are not intersected - if (distBetweenBodies > arrowLen) - return false; - else - { - ptsCurrentTurn.push_back(ptsNextTurn.front()); - return true; - } - } - else - { - /// The arrows bodies are intersected. Make ptsCurrentTurn shorter if possible to prevent double rendering. - /// ptsNextTurn[0] is not a point of route network graph. It is generated while clipping. - /// The first point of route network graph is ptsNextTurn[1]. The same with the end of ptsCurrentTurn - m2::PointD const pivotPnt = ptsNextTurn[1]; - auto const currentTurnBeforeEnd = ptsCurrentTurn.end() - 1; - for (auto t = ptsCurrentTurn.begin() + 1; t != currentTurnBeforeEnd; ++t) - { - if (m2::AlmostEqualULPs(*t, pivotPnt)) - { - ptsCurrentTurn.erase(t + 1, ptsCurrentTurn.end()); - return true; - } - } - return true; - } -} - -RouteTrack::~RouteTrack() -{ - DeleteClosestSegmentDisplayList(); -} - -void RouteTrack::CreateDisplayListArrows(graphics::Screen * dlScreen, MatrixT const & matrix, double visualScale) const -{ - double const beforeTurn = 13. * visualScale; - double const afterTurn = 13. * visualScale; - double const arrowWidth = 10. * visualScale; - double const arrowLength = 19. * visualScale; - double const arrowBodyWidth = 8. * visualScale; - double const arrowDepth = graphics::arrowDepth; - - pair arrowDirection; - vector ptsTurn, ptsNextTurn; - - ptsTurn.reserve(m_turnsGeom.size()); - bool drawArrowHead = true; - auto turnsGeomEnd = m_turnsGeom.rend(); - for (auto t = m_turnsGeom.rbegin(); t != turnsGeomEnd; ++t) - { - if (t->m_indexInRoute < m_relevantMatchedInfo.GetIndexInRoute()) - continue; - ptsTurn.clear(); - if (t->m_points.empty()) - continue; - transform(t->m_points.begin(), t->m_points.end(), back_inserter(ptsTurn), DoLeftProduct(matrix)); - - if (!ClipArrowBodyAndGetArrowDirection(ptsTurn, arrowDirection, t->m_turnIndex, beforeTurn, afterTurn, arrowLength)) - continue; - if (ptsTurn.size() < 2) - continue; - - if (!ptsNextTurn.empty()) - drawArrowHead = !MergeArrows(ptsTurn, ptsNextTurn, beforeTurn + afterTurn, arrowLength); - - graphics::Pen::Info const outlineInfo(m_arrowColor, arrowBodyWidth); - uint32_t const outlineId = dlScreen->mapInfo(outlineInfo); - dlScreen->drawPath(&ptsTurn[0], ptsTurn.size(), 0, outlineId, arrowDepth); - - if (drawArrowHead) - DrawArrowTriangle(dlScreen, arrowDirection, arrowWidth, arrowLength, m_arrowColor, arrowDepth); - ptsNextTurn = ptsTurn; - } -} -/// @todo there are some ways to optimize the code bellow. -/// 1. Call CreateDisplayListArrows only after passing the next arrow while driving -/// 2. Use several closest segments intead of one to recreate Display List for the most part of the track -/// -void RouteTrack::CreateDisplayList(graphics::Screen * dlScreen, MatrixT const & matrix, bool isScaleChanged, - int drawScale, double visualScale, - location::RouteMatchingInfo const & matchingInfo) const -{ - if (HasDisplayLists() && !isScaleChanged && - m_relevantMatchedInfo.GetPosition() == matchingInfo.GetPosition()) - return; - - PolylineD const & fullPoly = GetPolyline(); - size_t const formerIndex = m_relevantMatchedInfo.GetIndexInRoute(); - - if (matchingInfo.IsMatched()) - m_relevantMatchedInfo = matchingInfo; - size_t const currentIndex = m_relevantMatchedInfo.GetIndexInRoute(); - - size_t const fullPolySz = fullPoly.GetSize(); - if (currentIndex + 2 >= fullPolySz || fullPolySz < 2) - { - DeleteDisplayList(); - DeleteClosestSegmentDisplayList(); - return; - } - DeleteClosestSegmentDisplayList(); - auto const curSegIter = fullPoly.Begin() + currentIndex; - - //the most part of the route and symbols - if (formerIndex != currentIndex || - !HasDisplayLists() || isScaleChanged) - { - DeleteDisplayList(); - dlScreen->beginFrame(); - - graphics::DisplayList * dList = dlScreen->createDisplayList(); - dlScreen->setDisplayList(dList); - SetDisplayList(dList); - - PolylineD mostPartPoly(curSegIter + 1, fullPoly.End()); - PointContainerT ptsMostPart; - ptsMostPart.reserve(mostPartPoly.GetSize()); - TransformAndSymplifyPolyline(mostPartPoly, matrix, GetMainWidth(), ptsMostPart); - CreateDisplayListPolyline(dlScreen, ptsMostPart); - - PolylineD sym(vector({fullPoly.Front(), fullPoly.Back()})); - PointContainerT ptsSym; - TransformPolyline(sym, matrix, ptsSym); - CreateDisplayListSymbols(dlScreen, ptsSym); - - //arrows on the route - if (drawScale >= scales::GetNavigationScale()) - CreateDisplayListArrows(dlScreen, matrix, visualScale); - } - else - dlScreen->beginFrame(); - - //closest route segment - m_closestSegmentDL = dlScreen->createDisplayList(); - dlScreen->setDisplayList(m_closestSegmentDL); - PolylineD closestPoly(m_relevantMatchedInfo.IsMatched() ? - vector({m_relevantMatchedInfo.GetPosition(), fullPoly.GetPoint(currentIndex + 1)}) : - vector({fullPoly.GetPoint(currentIndex), fullPoly.GetPoint(currentIndex + 1)})); - PointContainerT pts; - pts.reserve(closestPoly.GetSize()); - TransformPolyline(closestPoly, matrix, pts); - CreateDisplayListPolyline(dlScreen, pts); - - dlScreen->setDisplayList(0); - dlScreen->endFrame(); -} - -RouteTrack * RouteTrack::CreatePersistent() -{ - RouteTrack * p = new RouteTrack(); - Swap(*p); - return p; -} - -void RouteTrack::DeleteClosestSegmentDisplayList() const -{ - delete m_closestSegmentDL; - m_closestSegmentDL = nullptr; -} - -void RouteTrack::Draw(graphics::Screen * pScreen, MatrixT const & matrix) const -{ - Track::Draw(pScreen, matrix); - pScreen->drawDisplayList(m_closestSegmentDL, matrix); -} - -void RouteTrack::AddClosingSymbol(bool isBeginSymbol, string const & symbolName, graphics::EPosition pos, double depth) -{ - if (isBeginSymbol) - m_beginSymbols.push_back(ClosingSymbol(symbolName, pos, depth)); - else - m_endSymbols.push_back(ClosingSymbol(symbolName, pos, depth)); -} - -void RouteTrack::CreateDisplayListSymbols(graphics::Screen * dlScreen, PointContainerT const & pts) const -{ - ASSERT(!pts.empty(), ()); - if (!m_beginSymbols.empty() || !m_endSymbols.empty()) - { - m2::PointD pivot = pts.front(); - auto symDrawer = [&dlScreen, &pivot] (ClosingSymbol const & symbol) - { - dlScreen->drawSymbol(pivot, symbol.m_iconName, symbol.m_position, symbol.m_depth); - }; - - for_each(m_beginSymbols.begin(), m_beginSymbols.end(), symDrawer); - - pivot = pts.back(); - for_each(m_endSymbols.begin(), m_endSymbols.end(), symDrawer); - } -} - -void RouteTrack::Swap(RouteTrack & rhs) -{ - Track::Swap(rhs); - swap(m_beginSymbols, rhs.m_beginSymbols); - swap(m_endSymbols, rhs.m_endSymbols); - m_turnsGeom.swap(rhs.m_turnsGeom); - - rhs.m_relevantMatchedInfo.Reset(); - m_relevantMatchedInfo.Reset(); - - swap(m_arrowColor, rhs.m_arrowColor); -} - -void RouteTrack::CleanUp() const -{ - Track::CleanUp(); - DeleteClosestSegmentDisplayList(); -} - -bool RouteTrack::HasDisplayLists() const -{ - return Track::HasDisplayLists() && m_closestSegmentDL != nullptr; -} diff --git a/map/route_track.hpp b/map/route_track.hpp deleted file mode 100644 index e7301992bc..0000000000 --- a/map/route_track.hpp +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "map/track.hpp" - -#include "routing/turns.hpp" - -#include "platform/location.hpp" - -class RouteTrack : public Track -{ - RouteTrack & operator=(RouteTrack const &) = delete; - RouteTrack(RouteTrack const &) = delete; -public: - RouteTrack() {} - explicit RouteTrack(PolylineD const & polyline) : Track(polyline) {} - virtual ~RouteTrack(); - virtual void CreateDisplayList(graphics::Screen * dlScreen, MatrixT const & matrix, bool isScaleChanged, - int drawScale, double visualScale, - location::RouteMatchingInfo const & matchingInfo) const; - virtual void Draw(graphics::Screen * pScreen, MatrixT const & matrix) const; - virtual RouteTrack * CreatePersistent(); - virtual void CleanUp() const; - virtual bool HasDisplayLists() const; - - void AddClosingSymbol(bool isBeginSymbol, string const & symbolName, - graphics::EPosition pos, double depth); - - void SetArrowColor(graphics::Color color) { m_arrowColor = color; } - -private: - void CreateDisplayListSymbols(graphics::Screen * dlScreen, PointContainerT const & pts) const; - - void CreateDisplayListArrows(graphics::Screen * dlScreen, MatrixT const & matrix, double visualScale) const; - void DeleteClosestSegmentDisplayList() const; - bool HasClosestSegmentDisplayList() const { return m_closestSegmentDL != nullptr; } - void SetClosestSegmentDisplayList(graphics::DisplayList * dl) const { m_closestSegmentDL = dl; } - void Swap(RouteTrack & rhs); - - struct ClosingSymbol - { - ClosingSymbol(string const & iconName, graphics::EPosition pos, double depth) - : m_iconName(iconName), m_position(pos), m_depth(depth) {} - string m_iconName; - graphics::EPosition m_position; - double m_depth; - }; - - vector m_beginSymbols; - vector m_endSymbols; - - mutable location::RouteMatchingInfo m_relevantMatchedInfo; - mutable graphics::DisplayList * m_closestSegmentDL = nullptr; - - graphics::Color m_arrowColor; -}; - -bool ClipArrowBodyAndGetArrowDirection(vector & ptsTurn, pair & arrowDirection, - size_t turnIndex, double beforeTurn, double afterTurn, double arrowLength); -bool MergeArrows(vector & ptsCurrentTurn, vector const & ptsNextTurn, double bodyLen, double arrowLen); diff --git a/map/ruler.cpp b/map/ruler.cpp deleted file mode 100644 index 7704db5a25..0000000000 --- a/map/ruler.cpp +++ /dev/null @@ -1,619 +0,0 @@ -#include "map/ruler.hpp" -#include "map/framework.hpp" -#include "map/alfa_animation_task.hpp" - -#include "anim/controller.hpp" - -#include "platform/measurement_utils.hpp" -#include "platform/settings.hpp" - -#include "gui/controller.hpp" - -#include "graphics/glyph.hpp" -#include "graphics/brush.hpp" -#include "graphics/screen.hpp" -#include "graphics/display_list.hpp" -#include "graphics/uniforms_holder.hpp" - -#include "indexer/mercator.hpp" - -#include "geometry/transformations.hpp" - -#include "base/string_utils.hpp" - - -using namespace graphics; - -namespace -{ - static const int RulerHeight = 2; - static const int MinPixelWidth = 60; - static const int MinMetersWidth = 10; - static const int MaxMetersWidth = 1000000; - static const int CacheLength = 500; - - static const int MinUnitValue = -1; - static const int MaxUnitValue = numeric_limits::max() - 1; - static const int InvalidUnitValue = MaxUnitValue + 1; - - static const int TextOffsetFromRuler = 3; - - struct UnitValue - { - char const * m_s; - int m_i; - }; - - UnitValue g_arrFeets[] = { - { "10 ft", 10 }, - { "20 ft", 20 }, - { "50 ft", 50 }, - { "100 ft", 100 }, - { "200 ft", 200 }, - { "0.1 mi", 528 }, - { "0.2 mi", 528 * 2 }, - { "0.5 mi", 528 * 5 }, - { "1 mi", 5280 }, - { "2 mi", 2 * 5280 }, - { "5 mi", 5 * 5280 }, - { "10 mi", 10 * 5280 }, - { "20 mi", 20 * 5280 }, - { "50 mi", 50 * 5280 }, - { "100 mi", 100 * 5280 }, - { "200 mi", 200 * 5280 }, - { "500 mi", 500 * 5280 } - }; - - UnitValue g_arrMetres[] = { - { "1 m", 1 }, - { "2 m", 2 }, - { "5 m", 5 }, - { "10 m", 10 }, - { "20 m", 20 }, - { "50 m", 50 }, - { "100 m", 100 }, - { "200 m", 200 }, - { "500 m", 500 }, - { "1 km", 1000 }, - { "2 km", 2000 }, - { "5 km", 5000 }, - { "10 km", 10000 }, - { "20 km", 20000 }, - { "50 km", 50000 }, - { "100 km", 100000 }, - { "200 km", 200000 }, - { "500 km", 500000 }, - { "1000 km", 1000000 } - }; - - double identity(double val) - { - return val; - } -} - -// ========================================================= // -Ruler::RulerFrame::RulerFrame(Framework & f, const Ruler::RulerFrame::frame_end_fn & fn, double depth) - : m_f(f) - , m_textLengthInPx(0) - , m_scale(0.0) - , m_depth(depth) - , m_callback(fn) -{ -} - - -Ruler::RulerFrame::RulerFrame(const Ruler::RulerFrame & other, const Ruler::RulerFrame::frame_end_fn & fn) - : m_f(other.m_f), m_dl(other.m_dl), m_textDL(other.m_textDL) -{ - m_textLengthInPx = other.m_textLengthInPx; - m_scale = other.m_scale; - m_depth = other.m_depth; - m_orgPt = other.m_orgPt; - m_callback = fn; - - HideAnimate(false); -} - -Ruler::RulerFrame::~RulerFrame() -{ - if (m_frameAnim) - { - m_frameAnim->Cancel(); - m_frameAnim.reset(); - } - - Purge(); -} - -bool Ruler::RulerFrame::IsValid() const -{ - return m_dl != NULL && m_textDL != NULL; -} - -void Ruler::RulerFrame::Cache(const string & text, FontDesc const & f) -{ - gui::Controller * controller = m_f.GetGuiController(); - Screen * cs = controller->GetCacheScreen(); - double const k = m_f.GetVisualScale(); - - // Create solid line DL. - if (m_dl == NULL) - { - m_dl.reset(cs->createDisplayList()); - - cs->beginFrame(); - cs->setDisplayList(m_dl.get()); - cs->applyVarAlfaStates(); - - m2::PointD coords[] = - { - /* 3*/ m2::PointD(0.0, -RulerHeight * k), - /* 4*/ m2::PointD(0.0, 0.0), - /*14*/ m2::PointD(CacheLength, -RulerHeight * k), - /*15*/ m2::PointD(CacheLength, 0.0 * k), - }; - - Brush::Info const brushInfo(f.m_color); - Resource const * brushRes = cs->fromID(cs->mapInfo(brushInfo)); - m2::PointF const brushCenter = cs->pipeline(brushRes->m_pipelineID).texture()->mapPixel(brushRes->m_texRect.Center()); - - m2::PointF normal(0.0, 0.0); - cs->addTexturedStripStrided(coords , sizeof(m2::PointD), - &normal, 0, - &brushCenter, 0, ARRAY_SIZE(coords), - m_depth, brushRes->m_pipelineID); - - cs->setDisplayList(0); - cs->applyStates(); - cs->endFrame(); - } - - // Create text DL. - - ASSERT(!text.empty(), ()); - - { - m_textDL.reset(); - m_textDL.reset(cs->createDisplayList()); - - cs->beginFrame(); - cs->setDisplayList(m_textDL.get()); - cs->applyVarAlfaStates(); - - strings::UniString uniString = strings::MakeUniString(text); - size_t length = uniString.size(); - buffer_vector infos(length, Glyph::Info()); - buffer_vector resInfos(length, NULL); - buffer_vector ids(length, 0); - buffer_vector glyphRes(length, NULL); - - for (size_t i = 0; i < uniString.size(); ++i) - { - infos[i] = Glyph::Info(GlyphKey(uniString[i], f.m_size, false, f.m_color), - controller->GetGlyphCache()); - - resInfos[i] = &infos[i]; - } - - if (cs->mapInfo(resInfos.data(), ids.data(), infos.size())) - { - for (size_t i = 0; i < ids.size(); ++i) - { - Resource const * res = cs->fromID(ids[i]); - glyphRes[i] = res; - } - - int32_t pipelineID = glyphRes[0]->m_pipelineID; - shared_ptr texture = cs->pipeline(pipelineID).texture(); - double lengthFromStart = 0.0; - - buffer_vector coords; - buffer_vector normals; - buffer_vector texCoords; - - for (size_t i = 0; i < uniString.size(); ++i) - { - double baseX = lengthFromStart; - coords.push_back(m2::PointD(baseX, 0.0)); - coords.push_back(m2::PointD(baseX, 0.0)); - coords.push_back(m2::PointD(baseX, 0.0)); - - coords.push_back(m2::PointD(baseX, 0.0)); - coords.push_back(m2::PointD(baseX, 0.0)); - coords.push_back(m2::PointD(baseX, 0.0)); - - m2::RectI resourceRect(glyphRes[i]->m_texRect); - resourceRect.Inflate(-1, -1); - double w = resourceRect.SizeX(); - double h = resourceRect.SizeY(); - lengthFromStart += infos[i].m_metrics.m_xAdvance; - - normals.push_back(m2::PointF(0.0, 0.0)); - normals.push_back(m2::PointF(0.0, -h)); - normals.push_back(m2::PointF(w , 0.0)); - - normals.push_back(m2::PointF(w , 0.0)); - normals.push_back(m2::PointF(0.0, -h)); - normals.push_back(m2::PointF(w , -h)); - - texCoords.push_back(texture->mapPixel(m2::PointF(resourceRect.minX(), resourceRect.maxY()))); - texCoords.push_back(texture->mapPixel(m2::PointF(resourceRect.minX(), resourceRect.minY()))); - texCoords.push_back(texture->mapPixel(m2::PointF(resourceRect.maxX(), resourceRect.maxY()))); - - texCoords.push_back(texture->mapPixel(m2::PointF(resourceRect.maxX(), resourceRect.maxY()))); - texCoords.push_back(texture->mapPixel(m2::PointF(resourceRect.minX(), resourceRect.minY()))); - texCoords.push_back(texture->mapPixel(m2::PointF(resourceRect.maxX(), resourceRect.minY()))); - } - - m_textLengthInPx = lengthFromStart; - cs->addTexturedListStrided(coords.data(), sizeof(m2::PointF), - normals.data(), sizeof(m2::PointF), - texCoords.data(), sizeof(m2::PointF), - coords.size(), m_depth, pipelineID); - } - - cs->setDisplayList(0); - cs->endFrame(); - } -} - -void Ruler::RulerFrame::Purge() -{ - m_dl.reset(); - m_textDL.reset(); -} - -bool Ruler::RulerFrame::IsHidingAnim() const -{ - ASSERT(m_frameAnim != NULL, ()); - AlfaAnimationTask * a = static_cast(m_frameAnim.get()); - return a->IsHiding(); -} - -bool Ruler::RulerFrame::IsAnimActive() const -{ - return m_frameAnim != NULL; -} - -void Ruler::RulerFrame::SetScale(double scale) -{ - m_scale = scale; -} - -double Ruler::RulerFrame::GetScale() const -{ - return m_scale; -} - -void Ruler::RulerFrame::SetOrgPoint(const m2::PointD & org) -{ - m_orgPt = org; -} - -const m2::PointD &Ruler::RulerFrame::GetOrgPoint() const -{ - return m_orgPt; -} - -void Ruler::RulerFrame::ShowAnimate(bool needPause) -{ - double offset = (needPause == true) ? 0.07 : 0.0; - CreateAnim(IsAnimActive() ? GetCurrentAlfa() : 0.1, 1.0, 0.2, offset, true); -} - -void Ruler::RulerFrame::HideAnimate(bool needPause) -{ - double offset = (needPause == true) ? 1.0 : 0.0; - double timeInterval = (needPause == true) ? 0.3 : 0.15; - CreateAnim(1.0, 0.0, timeInterval, offset, false); -} - -void Ruler::RulerFrame::Draw(OverlayRenderer * r, const math::Matrix & m) -{ - ASSERT(m_dl, ()); - ASSERT(m_textDL, ()); - - UniformsHolder holder; - holder.insertValue(ETransparency, GetCurrentAlfa()); - - r->drawDisplayList(m_dl.get(), math::Shift( - math::Scale(m, m2::PointD(m_scale, 1.0)), - m_orgPt), &holder); - - double const yOffset = -(2 + TextOffsetFromRuler * m_f.GetVisualScale()); - r->drawDisplayList(m_textDL.get(), - math::Shift(m, m_orgPt + m2::PointF(CacheLength * m_scale - m_textLengthInPx, yOffset)), - &holder); -} - -void Ruler::RulerFrame::CreateAnim(double startAlfa, double endAlfa, double timeInterval, double timeOffset, bool isVisibleAtEnd) -{ - anim::Controller * animController = m_f.GetAnimController(); - if (animController == NULL) - return; - - if (m_frameAnim) - m_frameAnim->Cancel(); - - m_frameAnim.reset(new AlfaAnimationTask(startAlfa, endAlfa, timeInterval, timeOffset, &m_f)); - m_frameAnim->AddCallback(anim::Task::EEnded, bind(&RulerFrame::AnimEnded, this, isVisibleAtEnd)); - animController->AddTask(m_frameAnim); -} - -float Ruler::RulerFrame::GetCurrentAlfa() -{ - if (m_frameAnim) - { - AlfaAnimationTask * a = static_cast(m_frameAnim.get()); - return a->GetCurrentAlfa(); - } - - return 1.0; -} - -void Ruler::RulerFrame::AnimEnded(bool isVisible) -{ - if (m_frameAnim != NULL) - { - m_frameAnim.reset(); - m_callback(isVisible, this); - } -} -// ========================================================= // - -double Ruler::CalcMetresDiff(double value) -{ - UnitValue * arrU = g_arrMetres; - int count = ARRAY_SIZE(g_arrMetres); - - typedef double (*ConversionFn)(double); - ConversionFn conversionFn = &identity; - - switch (m_currSystem) - { - default: - ASSERT_EQUAL ( m_currSystem, 0, () ); - break; - - case 1: - arrU = g_arrFeets; - count = ARRAY_SIZE(g_arrFeets); - conversionFn = &MeasurementUtils::MetersToFeet; - break; - } - - int prevUnitRange = m_currentRangeIndex; - string s; - double result = 0.0; - double v = conversionFn(value); - if (arrU[0].m_i > v) - { - m_currentRangeIndex = MinUnitValue; - s = string("< ") + arrU[0].m_s; - result = MinMetersWidth - 1.0; - } - else if (arrU[count-1].m_i <= v) - { - m_currentRangeIndex = MaxUnitValue; - s = string("> ") + arrU[count-1].m_s; - result = MaxMetersWidth + 1.0; - } - else - for (int i = 0; i < count; ++i) - { - if (arrU[i].m_i > v) - { - m_currentRangeIndex = i; - result = arrU[i].m_i / conversionFn(1.0); - s = arrU[i].m_s; - break; - } - } - - if (m_currentRangeIndex != prevUnitRange) - UpdateText(s); - return result; -} - -Ruler::Params::Params() - : m_framework(0) -{} - -Ruler::Ruler(Params const & p) - : BaseT(p), - m_currentRangeIndex(InvalidUnitValue), - m_currSystem(0), - m_framework(p.m_framework) -{ - setIsVisible(false); -} - -void Ruler::AnimateShow() -{ - RulerFrame * frame = GetMainFrame(); - if (!isVisible() && (!frame->IsAnimActive() || frame->IsHidingAnim())) - { - setIsVisible(true); - frame->ShowAnimate(false); - m_framework->Invalidate(); - } - else if (isVisible() && (frame->IsAnimActive() && frame->IsHidingAnim())) - { - frame->ShowAnimate(false); - m_framework->Invalidate(); - } -} - -void Ruler::AnimateHide() -{ - RulerFrame * frame = GetMainFrame(); - if (isVisible() && (!frame->IsAnimActive() || !frame->IsHidingAnim())) - { - frame->HideAnimate(true); - m_framework->Invalidate(); - } -} - -void Ruler::layout() -{ - Settings::Units units = Settings::Metric; - Settings::Get("Units", units); - - int prevCurrSystem = m_currSystem; - switch (units) - { - default: - ASSERT_EQUAL ( units, Settings::Metric, () ); - m_currSystem = 0; - break; - case Settings::Foot: - m_currSystem = 1; - break; - } - - if (prevCurrSystem != m_currSystem) - m_currentRangeIndex = InvalidUnitValue; - - update(); -} - -void Ruler::UpdateText(const string & text) -{ - RulerFrame * frame = GetMainFrame(); - if (frame->IsAnimActive() && frame->IsHidingAnim()) - return; - - if (frame->IsValid()) - m_animFrame.reset(new RulerFrame(*frame, bind(&Ruler::AnimFrameAnimEnded, this, _1, _2))); - - frame->Cache(text, font(EActive)); - if (isVisible()) - frame->ShowAnimate(true); -} - -void Ruler::MainFrameAnimEnded(bool isVisible, RulerFrame * frame) -{ - setIsVisible(isVisible); - ASSERT(GetMainFrame() == frame, ()); -} - -void Ruler::AnimFrameAnimEnded(bool /*isVisible*/, RulerFrame * frame) -{ - ASSERT_EQUAL(m_animFrame.get(), frame, ()); - m_animFrame.reset(); -} - -Ruler::RulerFrame * Ruler::GetMainFrame() -{ - if (!m_mainFrame) - m_mainFrame.reset(new RulerFrame(*m_framework, bind(&Ruler::MainFrameAnimEnded, this, _1, _2), depth())); - return m_mainFrame.get(); -} - -Ruler::RulerFrame * Ruler::GetMainFrame() const -{ - ASSERT(m_mainFrame, ()); - return m_mainFrame.get(); -} - -void Ruler::purge() -{ - m_currentRangeIndex = InvalidUnitValue; - - m_mainFrame.reset(); - m_animFrame.reset(); - - setIsVisible(false); -} - -void Ruler::update() -{ - double const k = visualScale(); - - ScreenBase const & screen = m_framework->GetNavigator().Screen(); - - int const rulerHeight = my::rounds(RulerHeight * k); - int const minPxWidth = my::rounds(MinPixelWidth * k); - - // pivot() here is the down right point of the ruler. - // Get global points of ruler and distance according to minPxWidth. - - m2::PointD pt1 = screen.PtoG(pivot()); - m2::PointD pt0 = screen.PtoG(pivot() - m2::PointD(minPxWidth, 0)); - - double const distanceInMetres = MercatorBounds::DistanceOnEarth(pt0, pt1); - - // convert metres to units for calculating m_metresDiff - double metersDiff = CalcMetresDiff(distanceInMetres); - - bool const higherThanMax = metersDiff > MaxMetersWidth; - bool const lessThanMin = metersDiff < MinMetersWidth; - - // Calculate width of the ruler in pixels. - double scalerWidthInPx = minPxWidth; - - if (higherThanMax) - scalerWidthInPx = minPxWidth * 3 / 2; - else if (!lessThanMin) - { - // Here we need to convert metres to pixels according to angle - // (in global coordinates) of the ruler. - - double const a = ang::AngleTo(pt1, pt0); - pt0 = MercatorBounds::GetSmPoint(pt1, cos(a) * metersDiff, sin(a) * metersDiff); - - scalerWidthInPx = my::rounds(pivot().Length(screen.GtoP(pt0))); - } - - m2::PointD orgPt = pivot() + m2::PointD(-scalerWidthInPx / 2, rulerHeight / 2); - - if (position() & EPosLeft) - orgPt.x -= scalerWidthInPx / 2; - - if (position() & EPosRight) - orgPt.x += scalerWidthInPx / 2; - - if (position() & EPosAbove) - orgPt.y -= rulerHeight / 2; - - if (position() & EPosUnder) - orgPt.y += rulerHeight / 2; - - RulerFrame * frame = GetMainFrame(); - frame->SetScale(scalerWidthInPx / CacheLength); - frame->SetOrgPoint(orgPt); -} - -m2::RectD Ruler::GetBoundRect() const -{ - FontDesc const & f = font(EActive); - RulerFrame * frame = GetMainFrame(); - m2::PointD const org = frame->GetOrgPoint(); - m2::PointD const size = m2::PointD(CacheLength * frame->GetScale(), f.m_size * 2); - return m2::RectD(org - m2::PointD(size.x, 0.0), org + m2::PointD(0.0, size.y)); -} - -void Ruler::cache() -{ - (void)GetMainFrame(); - update(); -} - -void Ruler::draw(OverlayRenderer * s, math::Matrix const & m) const -{ - if (isVisible()) - { - checkDirtyLayout(); - - RulerFrame * frame = GetMainFrame(); - frame->Draw(s, m); - if (m_animFrame) - m_animFrame->Draw(s, m); - } -} - -int Ruler::GetTextOffsetFromLine() const -{ - return TextOffsetFromRuler; -} diff --git a/map/ruler.hpp b/map/ruler.hpp deleted file mode 100644 index 41e9fdc7fc..0000000000 --- a/map/ruler.hpp +++ /dev/null @@ -1,124 +0,0 @@ -#pragma once - -#include "gui/element.hpp" - -#include "std/shared_ptr.hpp" -#include "std/unique_ptr.hpp" -#include "std/function.hpp" - - -namespace anim -{ - class Task; -} - -namespace graphics -{ - class DisplayList; - - namespace gl - { - class OverlayRenderer; - } -} - -class Framework; - - -class Ruler : public gui::Element -{ - typedef gui::Element BaseT; - - class RulerFrame - { - public: - typedef function frame_end_fn; - - RulerFrame(Framework & f, - frame_end_fn const & fn, - double depth); - - RulerFrame(RulerFrame const & other, const frame_end_fn & fn); - ~RulerFrame(); - - bool IsValid() const; - - void Cache(const string & text, const graphics::FontDesc & f); - void Purge(); - bool IsHidingAnim() const; - bool IsAnimActive() const; - void SetScale(double scale); - double GetScale() const; - void SetOrgPoint(m2::PointD const & org); - m2::PointD const & GetOrgPoint() const; - - void ShowAnimate(bool needPause); - void HideAnimate(bool needPause); - void Draw(graphics::OverlayRenderer * r, math::Matrix const & m); - - private: - void CreateAnim(double startAlfa, double endAlfa, - double timeInterval, double timeOffset, - bool isVisibleAtEnd); - float GetCurrentAlfa(); - void AnimEnded(bool isVisible); - - private: - Framework & m_f; - - shared_ptr m_dl; - shared_ptr m_textDL; - - int m_textLengthInPx; - double m_scale; - double m_depth; - m2::PointD m_orgPt; - frame_end_fn m_callback; - - shared_ptr m_frameAnim; - }; - -private: - int m_currentRangeIndex; - int m_currSystem; - double CalcMetresDiff(double value); - void UpdateText(const string & text); - - void MainFrameAnimEnded(bool isVisible, RulerFrame * frame); - void AnimFrameAnimEnded(bool isVisible, RulerFrame * frame); - - RulerFrame * GetMainFrame(); - RulerFrame * GetMainFrame() const; - - unique_ptr m_mainFrame; - unique_ptr m_animFrame; - - Framework * m_framework; - -public: - - struct Params : public Element::Params - { - Framework * m_framework; - Params(); - }; - - Ruler(Params const & p); - - void AnimateShow(); - void AnimateHide(); - - /// @name Override from graphics::OverlayElement and gui::Element. - //@{ - virtual m2::RectD GetBoundRect() const; - - void draw(graphics::OverlayRenderer * r, math::Matrix const & m) const; - - void update(); - void layout(); - void cache(); - void purge(); - //@} - - int GetTextOffsetFromLine() const; -}; diff --git a/map/storage_bridge.cpp b/map/storage_bridge.cpp new file mode 100644 index 0000000000..e47d117564 --- /dev/null +++ b/map/storage_bridge.cpp @@ -0,0 +1,62 @@ +#include "storage_bridge.hpp" + +#include "platform/platform.hpp" + +#include "base/assert.hpp" +#include "base/macros.hpp" + +using namespace storage; + +StorageBridge::StorageBridge(shared_ptr activeMaps, TOnChangedHandler const & handler) + : m_activeMaps(activeMaps) + , m_handler(handler) +{ + ASSERT(m_activeMaps != nullptr, ()); + m_slot = m_activeMaps->AddListener(this); +} + +StorageBridge::~StorageBridge() +{ + m_activeMaps->RemoveListener(m_slot); +} + +void StorageBridge::CountryGroupChanged(ActiveMapsLayout::TGroup const & oldGroup, int oldPosition, + ActiveMapsLayout::TGroup const & newGroup, int newPosition) +{ + UNUSED_VALUE(oldGroup); + UNUSED_VALUE(oldPosition); + UNUSED_VALUE(newGroup); + UNUSED_VALUE(newPosition); +} + +void StorageBridge::CountryStatusChanged(ActiveMapsLayout::TGroup const & group, int position, + TStatus const & oldStatus, TStatus const & newStatus) +{ + UNUSED_VALUE(oldStatus); + UNUSED_VALUE(newStatus); + ReportChanges(group, position); +} + +void StorageBridge::CountryOptionsChanged(ActiveMapsLayout::TGroup const & group, int position, + MapOptions const & oldOpt, MapOptions const & newOpt) +{ + UNUSED_VALUE(group); + UNUSED_VALUE(position); + UNUSED_VALUE(oldOpt); + UNUSED_VALUE(newOpt); +} + +void StorageBridge::DownloadingProgressUpdate(ActiveMapsLayout::TGroup const & group, int position, + LocalAndRemoteSizeT const & progress) +{ + UNUSED_VALUE(progress); + ReportChanges(group, position); +} + +void StorageBridge::ReportChanges(ActiveMapsLayout::TGroup const & group, int position) +{ + storage::TIndex countryIndex = m_activeMaps->GetCoreIndex(group, position); + + if (m_handler != nullptr) + GetPlatform().RunOnGuiThread(bind(m_handler, countryIndex)); +} diff --git a/map/storage_bridge.hpp b/map/storage_bridge.hpp new file mode 100644 index 0000000000..052dcc4e47 --- /dev/null +++ b/map/storage_bridge.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "active_maps_layout.hpp" + +#include "storage/index.hpp" +#include "storage/storage_defines.hpp" + +#include "std/shared_ptr.hpp" + +class StorageBridge : public storage::ActiveMapsLayout::ActiveMapsListener +{ +public: + using TOnChangedHandler = function; + + StorageBridge(shared_ptr activeMaps, TOnChangedHandler const & handler); + ~StorageBridge() override; + + void CountryGroupChanged(storage::ActiveMapsLayout::TGroup const & oldGroup, int oldPosition, + storage::ActiveMapsLayout::TGroup const & newGroup, int newPosition) override; + void CountryStatusChanged(storage::ActiveMapsLayout::TGroup const & group, int position, + storage::TStatus const & oldStatus, storage::TStatus const & newStatus) override; + void CountryOptionsChanged(storage::ActiveMapsLayout::TGroup const & group, int position, + MapOptions const & oldOpt, MapOptions const & newOpt) override; + void DownloadingProgressUpdate(storage::ActiveMapsLayout::TGroup const & group, int position, + storage::LocalAndRemoteSizeT const & progress) override; + +private: + shared_ptr m_activeMaps; + TOnChangedHandler m_handler; + int m_slot; + + void ReportChanges(storage::ActiveMapsLayout::TGroup const & group, int position); +}; + diff --git a/map/style_tests/style_symbols_consistency_test.cpp b/map/style_tests/style_symbols_consistency_test.cpp index 3f8871ae07..3baad03e17 100644 --- a/map/style_tests/style_symbols_consistency_test.cpp +++ b/map/style_tests/style_symbols_consistency_test.cpp @@ -5,8 +5,6 @@ #include "indexer/drules_include.hpp" #include "indexer/map_style_reader.hpp" -#include "graphics/defines.hpp" - #include "base/logging.hpp" #include "coding/parse_xml.hpp" @@ -15,6 +13,7 @@ #include "std/algorithm.hpp" #include "std/set.hpp" #include "std/string.hpp" +#include "std/vector.hpp" namespace { @@ -69,6 +68,8 @@ UNIT_TEST(Test_SymbolsConsistency) bool res = true; + vector densities = { "ldpi", "mdpi", "hdpi", "xhdpi", "xxhdpi", "6plus" }; + for (size_t s = 0; s < MapStyleCount; ++s) { MapStyle const mapStyle = static_cast(s); @@ -78,11 +79,9 @@ UNIT_TEST(Test_SymbolsConsistency) set const drawingRuleSymbols = GetSymbolsSetFromDrawingRule(); - for (size_t d = 0; d < graphics::EDensityCount; ++d) + for (size_t d = 0; d < densities.size(); ++d) { - string const density = graphics::convert(static_cast(d)); - - set const resourceStyles = GetSymbolsSetFromResourcesFile(density); + set const resourceStyles = GetSymbolsSetFromResourcesFile(densities[d]); vector missed; set_difference(drawingRuleSymbols.begin(), drawingRuleSymbols.end(), @@ -93,7 +92,7 @@ UNIT_TEST(Test_SymbolsConsistency) { // We are interested in all set of bugs, therefore we do not stop test here but // continue it just keeping in res that test failed. - LOG(LINFO, ("Symbols mismatch: style", mapStyle, ", density", density, ", missed", missed)); + LOG(LINFO, ("Symbols mismatch: style", mapStyle, ", density", densities[d], ", missed", missed)); res = false; } } diff --git a/map/style_tests/style_tests.pro b/map/style_tests/style_tests.pro index 4199a4376d..25763f9b5b 100644 --- a/map/style_tests/style_tests.pro +++ b/map/style_tests/style_tests.pro @@ -6,7 +6,7 @@ TEMPLATE = app INCLUDEPATH += ../../3party/protobuf/src ROOT_DIR = ../.. -DEPENDENCIES = map indexer graphics platform geometry coding base expat protobuf +DEPENDENCIES = map indexer platform geometry coding base expat protobuf macx-*: LIBS *= "-framework IOKit" diff --git a/map/styled_point.cpp b/map/styled_point.cpp index f5fbecdb6f..fdd6466ab4 100644 --- a/map/styled_point.cpp +++ b/map/styled_point.cpp @@ -1,5 +1,7 @@ #include "map/styled_point.hpp" +#include "base/logging.hpp" + namespace { char const * kSupportedColors[] = {"placemark-red", "placemark-blue", "placemark-purple", @@ -9,22 +11,10 @@ char const * kSupportedColors[] = {"placemark-red", "placemark-blue", "place namespace style { -graphics::DisplayList * StyledPoint::GetDisplayList(UserMarkDLCache * cache) const -{ - UserMarkContainer const * container = GetContainer(); - UserMarkDLCache::Key const key = - GetStyle().empty() - ? container->GetDefaultKey() - : UserMarkDLCache::Key(GetStyle(), graphics::EPosAbove, container->GetDepth()); - return cache->FindUserMark(key); -} -double StyledPoint::GetAnimScaleFactor() const +StyledPoint::StyledPoint(m2::PointD const & ptOrg, UserMarkContainer * container) + : UserMark(ptOrg, container) { - // Matches the behaviour for non-custom drawables. The only caller - // of ::DrawUserMark is UserMarkContainer::Draw and it always passes - // this value. - return 1.0; } m2::PointD const & StyledPoint::GetPixelOffset() const diff --git a/map/styled_point.hpp b/map/styled_point.hpp index 684a14ea0a..64f2155349 100644 --- a/map/styled_point.hpp +++ b/map/styled_point.hpp @@ -20,17 +20,11 @@ string GetSupportedStyle(string const & s, string const & context, string const // Default icon. string GetDefaultStyle(); -class StyledPoint : public ICustomDrawable +class StyledPoint : public UserMark { public: - StyledPoint(m2::PointD const & ptOrg, UserMarkContainer * container) - : ICustomDrawable(ptOrg, container) - { - } + StyledPoint(m2::PointD const & ptOrg, UserMarkContainer * container); - // ICustomDrawable overrides: - graphics::DisplayList * GetDisplayList(UserMarkDLCache * cache) const override; - double GetAnimScaleFactor() const override; m2::PointD const & GetPixelOffset() const override; /// @return name of icon, or empty string for plain circle. diff --git a/map/track.cpp b/map/track.cpp index 6eadcdbac6..9b509935ca 100644 --- a/map/track.cpp +++ b/map/track.cpp @@ -2,98 +2,25 @@ #include "indexer/mercator.hpp" -#include "graphics/screen.hpp" -#include "graphics/pen.hpp" -#include "graphics/depth_constants.hpp" -#include "graphics/display_list.hpp" -#include "graphics/defines.hpp" +#include "drape/color.hpp" -#include "geometry/distance.hpp" -#include "geometry/simplification.hpp" #include "geometry/distance_on_sphere.hpp" -#include "base/timer.hpp" -#include "base/logging.hpp" - -#include "platform/location.hpp" - - -Track::~Track() +Track::Track(Track::PolylineD const & polyline, Track::Params const & p) + : m_polyline(polyline) + , m_params(p) { - DeleteDisplayList(); + ASSERT_GREATER(m_polyline.GetSize(), 1, ()); } -Track * Track::CreatePersistent() +string const & Track::GetName() const { - Track * p = new Track(); - Swap(*p); - return p; + return m_params.m_name; } -float Track::GetMainWidth() const +m2::RectD Track::GetLimitRect() const { - ASSERT(!m_outlines.empty(), ()); - return m_outlines.back().m_lineWidth; -} - -const graphics::Color & Track::GetMainColor() const -{ - ASSERT(!m_outlines.empty(), ()); - return m_outlines.back().m_color; -} - -void Track::DeleteDisplayList() const -{ - delete m_dList; - m_dList = nullptr; -} - -void Track::AddOutline(TrackOutline const * outline, size_t arraySize) -{ - m_outlines.reserve(m_outlines.size() + arraySize); - for_each(outline, outline + arraySize, MakeBackInsertFunctor(m_outlines)); - sort(m_outlines.begin(), m_outlines.end(), [] (TrackOutline const & l, TrackOutline const & r) - { - return l.m_lineWidth > r.m_lineWidth; - }); -} - -void Track::Draw(graphics::Screen * pScreen, MatrixT const & matrix) const -{ - pScreen->drawDisplayList(m_dList, matrix); -} - -void Track::CreateDisplayListPolyline(graphics::Screen * dlScreen, PointContainerT const & pts) const -{ - double baseDepthTrack = graphics::tracksDepth - 10 * m_outlines.size(); - for (TrackOutline const & outline : m_outlines) - { - graphics::Pen::Info const outlineInfo(outline.m_color, outline.m_lineWidth); - uint32_t const outlineId = dlScreen->mapInfo(outlineInfo); - dlScreen->drawPath(pts.data(), pts.size(), 0, outlineId, baseDepthTrack); - baseDepthTrack += 10; - } -} - -void Track::CreateDisplayList(graphics::Screen * dlScreen, MatrixT const & matrix, bool isScaleChanged, - int, double, location::RouteMatchingInfo const &) const -{ - if (HasDisplayLists() && !isScaleChanged) - return; - - DeleteDisplayList(); - - m_dList = dlScreen->createDisplayList(); - dlScreen->beginFrame(); - dlScreen->setDisplayList(m_dList); - - PointContainerT pts; - pts.reserve(m_polyline.GetSize()); - TransformAndSymplifyPolyline(m_polyline, matrix, GetMainWidth(), pts); - CreateDisplayListPolyline(dlScreen, pts); - - dlScreen->setDisplayList(0); - dlScreen->endFrame(); + return m_polyline.GetLimitRect(); } double Track::GetLengthMeters() const @@ -115,39 +42,32 @@ double Track::GetLengthMeters() const return res; } -void Track::Swap(Track & rhs) +size_t Track::GetLayerCount() const { - swap(m_rect, rhs.m_rect); - swap(m_outlines, rhs.m_outlines); - m_name.swap(rhs.m_name); - m_polyline.Swap(rhs.m_polyline); - - DeleteDisplayList(); - rhs.DeleteDisplayList(); + return m_params.m_colors.size(); } -void Track::CleanUp() const +dp::Color const & Track::GetColor(size_t layerIndex) const { - DeleteDisplayList(); + return m_params.m_colors[layerIndex].m_color; } -bool Track::HasDisplayLists() const +float Track::GetWidth(size_t layerIndex) const { - return m_dList != nullptr; + return m_params.m_colors[layerIndex].m_lineWidth; } -void TransformPolyline(Track::PolylineD const & polyline, MatrixT const & matrix, PointContainerT & pts) +float Track::GetLayerDepth(size_t layerIndex) const { - pts.resize(polyline.GetSize()); - transform(polyline.Begin(), polyline.End(), pts.begin(), DoLeftProduct(matrix)); + return 0 + layerIndex * 10; } -void TransformAndSymplifyPolyline(Track::PolylineD const & polyline, MatrixT const & matrix, double width, PointContainerT & pts) +size_t Track::GetPointCount() const { - PointContainerT pts1(polyline.GetSize()); - TransformPolyline(polyline, matrix, pts1); - SimplifyDP(pts1.begin(), pts1.end(), width, - m2::DistanceToLineSquare(), MakeBackInsertFunctor(pts)); + return m_polyline.GetSize(); } - +m2::PointD const & Track::GetPoint(size_t pointIndex) const +{ + return m_polyline.GetPoint(pointIndex); +} diff --git a/map/track.hpp b/map/track.hpp index a13dcb9c93..d3ac8ef85c 100644 --- a/map/track.hpp +++ b/map/track.hpp @@ -1,101 +1,54 @@ #pragma once +#include "drape_frontend/user_marks_provider.hpp" +#include "drape/color.hpp" + #include "geometry/polyline2d.hpp" -#include "geometry/screenbase.hpp" - -#include "graphics/color.hpp" -#include "graphics/defines.hpp" - -#include "std/noncopyable.hpp" #include "base/buffer_vector.hpp" +#include "base/macros.hpp" - -class Navigator; -namespace graphics -{ - class Screen; - class DisplayList; -} namespace location { class RouteMatchingInfo; } -template class DoLeftProduct +class Track : public df::UserLineMark { - T const & m_t; + DISALLOW_COPY_AND_MOVE(Track); + public: - DoLeftProduct(T const & t) : m_t(t) {} - template X operator() (X const & x) const { return x * m_t; } -}; - -typedef math::Matrix MatrixT; -typedef buffer_vector PointContainerT; - -class Track : private noncopyable -{ -public: - typedef m2::PolylineD PolylineD; - - Track() {} - virtual ~Track(); - - explicit Track(PolylineD const & polyline) - : m_polyline(polyline) - { - ASSERT_GREATER(polyline.GetSize(), 1, ()); - - m_rect = m_polyline.GetLimitRect(); - } - - /// @note Move semantics is used here. - virtual Track * CreatePersistent(); - float GetMainWidth() const; - graphics::Color const & GetMainColor() const; - - virtual void Draw(graphics::Screen * pScreen, MatrixT const & matrix) const; - virtual void CreateDisplayList(graphics::Screen * dlScreen, MatrixT const & matrix, bool isScaleChanged, - int, double, location::RouteMatchingInfo const &) const; - virtual void CleanUp() const; - virtual bool HasDisplayLists() const; - - /// @name Simple Getters-Setter - //@{ + using PolylineD = m2::PolylineD; struct TrackOutline { float m_lineWidth; - graphics::Color m_color; + dp::Color m_color; }; - void AddOutline(TrackOutline const * outline, size_t arraySize); + struct Params + { + buffer_vector m_colors; + string m_name; + }; - string const & GetName() const { return m_name; } - void SetName(string const & name) { m_name = name; } + explicit Track(PolylineD const & polyline, Params const & p); + string const & GetName() const; PolylineD const & GetPolyline() const { return m_polyline; } - m2::RectD const & GetLimitRect() const { return m_rect; } - //@} + m2::RectD GetLimitRect() const; double GetLengthMeters() const; -protected: - graphics::DisplayList * GetDisplayList() const { return m_dList; } - void SetDisplayList(graphics::DisplayList * dl) const { m_dList = dl; } - void CreateDisplayListPolyline(graphics::Screen * dlScreen, PointContainerT const & pts2) const; - void Swap(Track & rhs); - void DeleteDisplayList() const; + size_t GetLayerCount() const override; + dp::Color const & GetColor(size_t layerIndex) const override; + float GetWidth(size_t layerIndex) const override; + float GetLayerDepth(size_t layerIndex) const override; + + /// Line geometry enumeration + size_t GetPointCount() const override; + m2::PointD const & GetPoint(size_t pointIndex) const override; private: - string m_name; - - vector m_outlines; PolylineD m_polyline; - m2::RectD m_rect; - - mutable graphics::DisplayList * m_dList = nullptr; + Params m_params; }; - -void TransformPolyline(Track::PolylineD const & polyline, MatrixT const & matrix, PointContainerT & pts); -void TransformAndSymplifyPolyline(Track::PolylineD const & polyline, MatrixT const & matrix, - double width, PointContainerT & pts); diff --git a/map/user_mark.cpp b/map/user_mark.cpp new file mode 100644 index 0000000000..d1f935eb6a --- /dev/null +++ b/map/user_mark.cpp @@ -0,0 +1,192 @@ +#include "user_mark.hpp" +#include "user_mark_container.hpp" + +namespace +{ + +string ToString(UserMark::Type t) +{ + switch (t) + { + case UserMark::Type::BOOKMARK: return "BOOKMARK"; + case UserMark::Type::API: return "API"; + case UserMark::Type::MY_POSITION: return "MY_POSITION"; + case UserMark::Type::POI: return "POI"; + case UserMark::Type::SEARCH: return "SEARCH"; + case UserMark::Type::DEBUG_MARK: return "DEBUG"; + } +} + +} + +UserMark::UserMark(m2::PointD const & ptOrg, UserMarkContainer * container) + : m_ptOrg(ptOrg), m_container(container) +{ +} + +m2::PointD const & UserMark::GetPivot() const +{ + return m_ptOrg; +} + +m2::PointD const & UserMark::GetPixelOffset() const +{ + static m2::PointD const s_centre(0.0, 0.0); + return s_centre; +} + +dp::Anchor UserMark::GetAnchor() const +{ + return dp::Center; +} + +float UserMark::GetDepth() const +{ + return GetContainer()->GetPointDepth(); +} + +bool UserMark::RunCreationAnim() const +{ + return false; +} + +UserMarkContainer const * UserMark::GetContainer() const +{ + ASSERT(m_container != nullptr, ()); + return m_container; +} + +void UserMark::GetLatLon(double & lat, double & lon) const +{ + lon = MercatorBounds::XToLon(m_ptOrg.x); + lat = MercatorBounds::YToLat(m_ptOrg.y); +} + +void UserMark::FillLogEvent(UserMark::TEventContainer & details) const +{ + double lat, lon; + GetLatLon(lat, lon); + details.emplace("lat", strings::to_string(lat)); + details.emplace("lon", strings::to_string(lon)); + details.emplace("markType", ToString(GetMarkType())); +} + +UserMarkCopy::UserMarkCopy(UserMark const * srcMark, bool needDestroy) + : m_srcMark(srcMark) + , m_needDestroy(needDestroy) +{ +} + +UserMarkCopy::~UserMarkCopy() +{ + if (m_needDestroy) + delete m_srcMark; +} + +UserMark const * UserMarkCopy::GetUserMark() const +{ + return m_srcMark; +} + +SearchMarkPoint::SearchMarkPoint(search::AddressInfo const & info, m2::PointD const & ptOrg, + UserMarkContainer * container) + : UserMark(ptOrg, container) + , m_info(info) +{ +} + +SearchMarkPoint::SearchMarkPoint(m2::PointD const & ptOrg, UserMarkContainer * container) + : UserMark(ptOrg, container) +{ +} + +string SearchMarkPoint::GetSymbolName() const +{ + return "search-result"; +} + +UserMark::Type SearchMarkPoint::GetMarkType() const +{ + return UserMark::Type::SEARCH; +} + +search::AddressInfo const & SearchMarkPoint::GetInfo() const +{ + return m_info; +} + +void SearchMarkPoint::SetInfo(search::AddressInfo const & info) +{ + m_info = info; +} + +feature::Metadata const & SearchMarkPoint::GetMetadata() const +{ + return m_metadata; +} + +void SearchMarkPoint::SetMetadata(feature::Metadata && metadata) +{ + m_metadata = metadata; +} + +unique_ptr SearchMarkPoint::Copy() const +{ + return unique_ptr( + new UserMarkCopy(new SearchMarkPoint(m_info, m_ptOrg, m_container))); +} + +void SearchMarkPoint::FillLogEvent(UserMark::TEventContainer & details) const +{ + UserMark::FillLogEvent(details); + details.emplace("name", m_info.GetPinName()); + details.emplace("type", m_info.GetPinType()); + details.emplace("metaData", m_metadata.Empty() ? "0" : "1"); +} + +PoiMarkPoint::PoiMarkPoint(UserMarkContainer * container) + : SearchMarkPoint(m2::PointD(0.0, 0.0), container) {} + +UserMark::Type PoiMarkPoint::GetMarkType() const +{ + return UserMark::Type::POI; +} + +unique_ptr PoiMarkPoint::Copy() const +{ + return unique_ptr(new UserMarkCopy(this, false)); +} +void PoiMarkPoint::SetPtOrg(m2::PointD const & ptOrg) +{ + m_ptOrg = ptOrg; +} + +void PoiMarkPoint::SetName(string const & name) +{ + m_info.m_name = name; +} + +MyPositionMarkPoint::MyPositionMarkPoint(UserMarkContainer * container) + : PoiMarkPoint(container) +{ +} + +UserMark::Type MyPositionMarkPoint::GetMarkType() const +{ + return UserMark::Type::MY_POSITION; +} + +DebugMarkPoint::DebugMarkPoint(const m2::PointD & ptOrg, UserMarkContainer * container) + : UserMark(ptOrg, container) +{ +} + +string DebugMarkPoint::GetSymbolName() const +{ + return "api-result"; +} + +unique_ptr DebugMarkPoint::Copy() const +{ + return unique_ptr(new UserMarkCopy(new DebugMarkPoint(m_ptOrg, m_container))); +} diff --git a/map/user_mark.hpp b/map/user_mark.hpp index 73420bc00d..d9948a0703 100644 --- a/map/user_mark.hpp +++ b/map/user_mark.hpp @@ -2,31 +2,25 @@ #include "search/result.hpp" +#include "drape_frontend/user_marks_provider.hpp" + #include "indexer/feature.hpp" #include "geometry/point2d.hpp" +#include "base/macros.hpp" + #include "std/string.hpp" #include "std/unique_ptr.hpp" #include "std/utility.hpp" class UserMarkContainer; -class PaintOverlayEvent; -class UserMarkDLCache; - -namespace graphics -{ - class DisplayList; -} - class UserMarkCopy; -class UserMark +class UserMark : public df::UserPointMark { - UserMark(UserMark const &) = delete; - UserMark& operator=(UserMark const &) = delete; - + DISALLOW_COPY_AND_MOVE(UserMark); public: enum class Type { @@ -38,32 +32,26 @@ public: DEBUG_MARK }; - UserMark(m2::PointD const & ptOrg, UserMarkContainer * container) - : m_ptOrg(ptOrg), m_container(container) - { - } + UserMark(m2::PointD const & ptOrg, UserMarkContainer * container); virtual ~UserMark() {} - UserMarkContainer const * GetContainer() const { return m_container; } - m2::PointD const & GetOrg() const { return m_ptOrg; } - void GetLatLon(double & lat, double & lon) const - { - lon = MercatorBounds::XToLon(m_ptOrg.x); - lat = MercatorBounds::YToLat(m_ptOrg.y); - } - virtual bool IsCustomDrawable() const { return false;} + /////////////////////////////////////////////////////// + /// df::UserPointMark + m2::PointD const & GetPivot() const override; + m2::PointD const & GetPixelOffset() const override; + dp::Anchor GetAnchor() const override; + float GetDepth() const override; + bool RunCreationAnim() const override; + /////////////////////////////////////////////////////// + + UserMarkContainer const * GetContainer() const; + void GetLatLon(double & lat, double & lon) const; virtual Type GetMarkType() const = 0; virtual unique_ptr Copy() const = 0; // Need it to calculate POI rank from all taps to features via statistics. - typedef map TEventContainer; - virtual void FillLogEvent(TEventContainer & details) const - { - double lat, lon; - GetLatLon(lat, lon); - details["lat"] = strings::to_string(lat); - details["lon"] = strings::to_string(lon); - } + using TEventContainer = map; + virtual void FillLogEvent(TEventContainer & details) const; protected: m2::PointD m_ptOrg; @@ -73,85 +61,37 @@ protected: class UserMarkCopy { public: - UserMarkCopy(UserMark const * srcMark, bool needDestroy = true) - : m_srcMark(srcMark) - , m_needDestroy(needDestroy) - { - } + UserMarkCopy(UserMark const * srcMark, bool needDestroy = true); + ~UserMarkCopy(); - ~UserMarkCopy() - { - if (m_needDestroy) - delete m_srcMark; - } - - UserMark const * GetUserMark() const { return m_srcMark; } + UserMark const * GetUserMark() const; private: UserMark const * m_srcMark; bool m_needDestroy; }; -class DebugMarkPoint : public UserMark -{ -public: - DebugMarkPoint(m2::PointD const & ptOrg, UserMarkContainer * container) - : UserMark(ptOrg, container) - { - } - - UserMark::Type GetMarkType() const override { return UserMark::Type::DEBUG_MARK; } - - unique_ptr Copy() const override - { - return unique_ptr(new UserMarkCopy(new DebugMarkPoint(m_ptOrg, m_container))); - } - - virtual void FillLogEvent(TEventContainer & details) const override - { - UserMark::FillLogEvent(details); - details["markType"] = "DEBUG"; - } -}; - class SearchMarkPoint : public UserMark { public: SearchMarkPoint(search::AddressInfo const & info, m2::PointD const & ptOrg, - UserMarkContainer * container) - : UserMark(ptOrg, container) - , m_info(info) - { - } + UserMarkContainer * container); - SearchMarkPoint(m2::PointD const & ptOrg, UserMarkContainer * container) - : UserMark(ptOrg, container) - { - } + SearchMarkPoint(m2::PointD const & ptOrg, UserMarkContainer * container); - UserMark::Type GetMarkType() const override { return UserMark::Type::SEARCH; } + string GetSymbolName() const override; + UserMark::Type GetMarkType() const override; - search::AddressInfo const & GetInfo() const { return m_info; } - void SetInfo(search::AddressInfo const & info) { m_info = info; } + search::AddressInfo const & GetInfo() const; + void SetInfo(search::AddressInfo const & info); - feature::Metadata const & GetMetadata() const { return m_metadata; } - void SetMetadata(feature::Metadata && metadata) { m_metadata = move(metadata); } + feature::Metadata const & GetMetadata() const; + void SetMetadata(feature::Metadata && metadata); - unique_ptr Copy() const override - { - return unique_ptr( - new UserMarkCopy(new SearchMarkPoint(m_info, m_ptOrg, m_container))); - } + unique_ptr Copy() const override; - virtual void FillLogEvent(TEventContainer & details) const override - { - UserMark::FillLogEvent(details); - details["markType"] = "SEARCH"; - details["name"] = m_info.GetPinName(); - details["type"] = m_info.GetPinType(); - details["metaData"] = m_metadata.Empty() ? "0" : "1"; - } + virtual void FillLogEvent(TEventContainer & details) const override; protected: search::AddressInfo m_info; @@ -161,43 +101,39 @@ protected: class PoiMarkPoint : public SearchMarkPoint { public: - PoiMarkPoint(UserMarkContainer * container) - : SearchMarkPoint(m2::PointD(0.0, 0.0), container) {} + PoiMarkPoint(UserMarkContainer * container); + UserMark::Type GetMarkType() const override; + unique_ptr Copy() const override; - UserMark::Type GetMarkType() const override { return UserMark::Type::POI; } - unique_ptr Copy() const override - { - return unique_ptr(new UserMarkCopy(this, false)); - } - virtual void FillLogEvent(TEventContainer & details) const override - { - SearchMarkPoint::FillLogEvent(details); - details["markType"] = "POI"; - } - - void SetPtOrg(m2::PointD const & ptOrg) { m_ptOrg = ptOrg; } - void SetName(string const & name) { m_info.m_name = name; } + void SetPtOrg(m2::PointD const & ptOrg); + void SetName(string const & name); }; class MyPositionMarkPoint : public PoiMarkPoint { public: - MyPositionMarkPoint(UserMarkContainer * container) : PoiMarkPoint(container) {} + MyPositionMarkPoint(UserMarkContainer * container); - UserMark::Type GetMarkType() const override { return UserMark::Type::MY_POSITION; } - virtual void FillLogEvent(TEventContainer & details) const override + UserMark::Type GetMarkType() const override; + + void SetUserPosition(m2::PointD const & pt) { - PoiMarkPoint::FillLogEvent(details); - details["markType"] = "MY_POSITION"; + SetPtOrg(pt); + m_hasPosition = true; } + bool HasPosition() const { return m_hasPosition; } + +private: + bool m_hasPosition = false; }; -class ICustomDrawable : public UserMark +class DebugMarkPoint : public UserMark { public: - ICustomDrawable(m2::PointD const & ptOrg, UserMarkContainer * container) : UserMark(ptOrg, container) {} - bool IsCustomDrawable() const { return true; } - virtual graphics::DisplayList * GetDisplayList(UserMarkDLCache * cache) const = 0; - virtual double GetAnimScaleFactor() const = 0; - virtual m2::PointD const & GetPixelOffset() const = 0; + DebugMarkPoint(m2::PointD const & ptOrg, UserMarkContainer * container); + + string GetSymbolName() const override; + + Type GetMarkType() const override { return UserMark::Type::DEBUG_MARK; } + unique_ptr Copy() const override; }; diff --git a/map/user_mark_container.cpp b/map/user_mark_container.cpp index fac33745d5..43ef1c4486 100644 --- a/map/user_mark_container.cpp +++ b/map/user_mark_container.cpp @@ -1,46 +1,18 @@ -#include "user_mark_container.hpp" -#include "framework.hpp" -#include "anim_phase_chain.hpp" +#include "map/framework.hpp" +#include "map/user_mark_container.hpp" -#include "render/drawer.hpp" - -#include "graphics/display_list.hpp" -#include "graphics/screen.hpp" -#include "graphics/depth_constants.hpp" - -#include "geometry/transformations.hpp" - -#include "anim/task.hpp" -#include "anim/controller.hpp" +#include "drape_frontend/drape_engine.hpp" +#include "drape_frontend/tile_key.hpp" +#include "drape_frontend/user_mark_shapes.hpp" +#include "base/scope_guard.hpp" #include "base/macros.hpp" #include "base/stl_add.hpp" #include "std/algorithm.hpp" -//////////////////////////////////////////////////////////////////////// - namespace { - class PinAnimation : public AnimPhaseChain - { - public: - PinAnimation(Framework & f) - : AnimPhaseChain(f, m_scale) - , m_scale(0.0) - { - InitDefaultPinAnim(this); - } - - double GetScale() const - { - return m_scale; - } - - private: - double m_scale; - }; - class FindMarkFunctor { public: @@ -54,7 +26,7 @@ namespace void operator()(UserMark * mark) { - m2::PointD const & org = mark->GetOrg(); + m2::PointD const & org = mark->GetPivot(); if (m_rect.IsPointInside(org)) { double minDCandidate = m_globalCenter.SquareLength(org); @@ -72,116 +44,63 @@ namespace m2::PointD m_globalCenter; }; - void DrawUserMarkByPoint(double scale, - double visualScale, - m2::PointD const & pixelOfsset, - PaintOverlayEvent const & event, - graphics::DisplayList * dl, - m2::PointD const & ptOrg) + df::TileKey CreateTileKey(UserMarkContainer const * cont) { -#ifndef USE_DRAPE - ScreenBase const & modelView = event.GetModelView(); - graphics::Screen * screen = GPUDrawer::GetScreen(event.GetDrawer()); - m2::PointD pxPoint = modelView.GtoP(ptOrg); - pxPoint += (pixelOfsset * visualScale); - math::Matrix m = math::Shift(math::Scale(math::Identity(), - scale, scale), - pxPoint.x, pxPoint.y); - dl->draw(screen, m); -#endif // USE_DRAPE - } - - void DrawUserMarkImpl(double scale, - double visualScale, - m2::PointD const & pixelOfsset, - PaintOverlayEvent const & event, - graphics::DisplayList * dl, - UserMark const * mark) - { - DrawUserMarkByPoint(scale, visualScale, pixelOfsset, event, dl, mark->GetOrg()); - } - - void DrawUserMark(double scale, - double visualScale, - PaintOverlayEvent const & event, - UserMarkDLCache * cache, - UserMarkDLCache::Key const & defaultKey, - UserMark const * mark) - { - if (mark->IsCustomDrawable()) + switch (cont->GetType()) { - ICustomDrawable const * drawable = static_cast(mark); - DrawUserMarkImpl(drawable->GetAnimScaleFactor(), visualScale, drawable->GetPixelOffset(), event, drawable->GetDisplayList(cache), mark); + case UserMarkType::API_MARK: + return df::GetApiTileKey(); + case UserMarkType::SEARCH_MARK: + return df::GetSearchTileKey(); + case UserMarkType::BOOKMARK_MARK: + return df::GetBookmarkTileKey(reinterpret_cast(cont)); + case UserMarkType::DEBUG_MARK: + return df::GetDebugTileKey(); } - else - DrawUserMarkImpl(scale, visualScale, m2::PointD(0.0, 0.0), event, cache->FindUserMark(defaultKey), mark); + + ASSERT(false, ()); + return df::TileKey(); } + + size_t const VisibleFlag = 0; + size_t const DrawableFlag = 1; } -UserMarkContainer::UserMarkContainer(double layerDepth, Framework & fm) +UserMarkContainer::UserMarkContainer(double layerDepth, UserMarkType type, Framework & fm) : m_framework(fm) - , m_controller(this) - , m_isVisible(true) - , m_isDrawable(true) , m_layerDepth(layerDepth) + , m_type(type) { + m_flags.set(); } UserMarkContainer::~UserMarkContainer() { - Clear(); -} - -template -void UserMarkContainer::ForEachInRect(m2::RectD const & rect, ToDo toDo) const -{ - for (size_t i = 0; i < m_userMarks.size(); ++i) - if (rect.IsPointInside(m_userMarks[i]->GetOrg())) - toDo(m_userMarks[i].get()); + RequestController().Clear(); + ReleaseController(); } UserMark const * UserMarkContainer::FindMarkInRect(m2::AnyRectD const & rect, double & d) const { - UserMark * mark = NULL; + UserMark * mark = nullptr; if (IsVisible()) { FindMarkFunctor f(&mark, d, rect); - ForEachInRect(rect.GetGlobalRect(), f); + for (size_t i = 0; i < m_userMarks.size(); ++i) + { + if (rect.IsPointInside(m_userMarks[i]->GetPivot())) + f(m_userMarks[i].get()); + } } return mark; } -void UserMarkContainer::Draw(PaintOverlayEvent const & e, UserMarkDLCache * cache) const -{ -#ifndef USE_DRAPE - if (IsVisible() && IsDrawable()) - { - UserMarkDLCache::Key defaultKey(GetTypeName(), graphics::EPosCenter, m_layerDepth); - ForEachInRect(e.GetClipRect(), bind(&DrawUserMark, 1.0, m_framework.GetVisualScale(), - e, cache, defaultKey, _1)); - } -#endif // USE_DRAPE -} - -void UserMarkContainer::Clear(size_t skipCount/* = 0*/) -{ - // Recently added marks stored in the head of list - // (@see CreateUserMark). Leave tail here. - if (skipCount < m_userMarks.size()) - m_userMarks.erase(m_userMarks.begin(), m_userMarks.end() - skipCount); -} - namespace { unique_ptr g_selectionUserMark; unique_ptr g_myPosition; } -UserMarkDLCache::Key UserMarkContainer::GetDefaultKey() const -{ - return UserMarkDLCache::Key(GetTypeName(), graphics::EPosCenter, GetDepth()); -} - void UserMarkContainer::InitStaticMarks(UserMarkContainer * container) { if (g_selectionUserMark == NULL) @@ -203,16 +122,79 @@ MyPositionMarkPoint * UserMarkContainer::UserMarkForMyPostion() return g_myPosition.get(); } +UserMarksController & UserMarkContainer::RequestController() +{ + BeginWrite(); + return *this; +} + +void UserMarkContainer::ReleaseController() +{ + MY_SCOPE_GUARD(endWriteGuard, [this]{ EndWrite(); }); + ref_ptr engine = m_framework.GetDrapeEngine(); + if (engine == nullptr) + return; + + df::TileKey key = CreateTileKey(this); + engine->ChangeVisibilityUserMarksLayer(key, IsVisible() && IsDrawable()); + + if (IsDirty()) + { + if (GetUserPointCount() == 0 && GetUserLineCount() == 0) + engine->ClearUserMarksLayer(key); + else + engine->UpdateUserMarksLayer(key, this); + } +} + +size_t UserMarkContainer::GetUserPointCount() const +{ + return m_userMarks.size(); +} + +df::UserPointMark const * UserMarkContainer::GetUserPointMark(size_t index) const +{ + return GetUserMark(index); +} + +size_t UserMarkContainer::GetUserLineCount() const +{ + return 0; +} + +df::UserLineMark const * UserMarkContainer::GetUserLineMark(size_t index) const +{ + UNUSED_VALUE(index); + ASSERT(false, ()); + return nullptr; +} + +float UserMarkContainer::GetPointDepth() const +{ + return m_layerDepth; +} + +bool UserMarkContainer::IsVisible() const +{ + return m_flags[VisibleFlag]; +} + +bool UserMarkContainer::IsDrawable() const +{ + return m_flags[DrawableFlag]; +} + UserMark * UserMarkContainer::CreateUserMark(m2::PointD const & ptOrg) { - // Push new marks to the head of list. + // Push front an user mark. + SetDirty(); m_userMarks.push_front(unique_ptr(AllocateUserMark(ptOrg))); return m_userMarks.front().get(); } size_t UserMarkContainer::GetUserMarkCount() const { - return m_userMarks.size(); + return GetUserPointCount(); } UserMark const * UserMarkContainer::GetUserMark(size_t index) const @@ -221,14 +203,63 @@ UserMark const * UserMarkContainer::GetUserMark(size_t index) const return m_userMarks[index].get(); } -UserMark * UserMarkContainer::GetUserMark(size_t index) +UserMarkType UserMarkContainer::GetType() const { + return m_type; +} + +UserMark * UserMarkContainer::GetUserMarkForEdit(size_t index) +{ + SetDirty(); ASSERT_LESS(index, m_userMarks.size(), ()); return m_userMarks[index].get(); } +void UserMarkContainer::Clear(size_t skipCount/* = 0*/) +{ + SetDirty(); + if (skipCount < m_userMarks.size()) + m_userMarks.erase(m_userMarks.begin() + skipCount, m_userMarks.end()); +} + +void UserMarkContainer::SetIsDrawable(bool isDrawable) +{ + if (IsDrawable() != isDrawable) + m_flags[DrawableFlag] = isDrawable; +} + +void UserMarkContainer::SetIsVisible(bool isVisible) +{ + if (IsVisible() != isVisible) + m_flags[VisibleFlag] = isVisible; +} + +void UserMarkContainer::Update() +{ + SetDirty(); +} + +namespace +{ + +template void DeleteItem(vector & v, size_t i) +{ + if (i < v.size()) + { + delete v[i]; + v.erase(v.begin() + i); + } + else + { + LOG(LWARNING, ("Trying to delete non-existing item at index", i)); + } +} + +} + void UserMarkContainer::DeleteUserMark(size_t index) { + SetDirty(); ASSERT_LESS(index, m_userMarks.size(), ()); if (index < m_userMarks.size()) m_userMarks.erase(m_userMarks.begin() + index); @@ -236,126 +267,22 @@ void UserMarkContainer::DeleteUserMark(size_t index) LOG(LWARNING, ("Trying to delete non-existing item at index", index)); } -void UserMarkContainer::DeleteUserMark(UserMark const * mark) -{ - size_t index = FindUserMark(mark); - if (index != m_userMarks.size()) - DeleteUserMark(index); -} - -size_t UserMarkContainer::FindUserMark(UserMark const * mark) -{ - auto it = find_if(m_userMarks.begin(), m_userMarks.end(), [&mark](unique_ptr const & p) - { - return p.get() == mark; - }); - return distance(m_userMarks.begin(), it); -} - SearchUserMarkContainer::SearchUserMarkContainer(double layerDepth, Framework & framework) - : UserMarkContainer(layerDepth, framework) + : UserMarkContainer(layerDepth, UserMarkType::SEARCH_MARK, framework) { } -string SearchUserMarkContainer::GetTypeName() const -{ - return "search-result"; -} - -string SearchUserMarkContainer::GetActiveTypeName() const -{ - return "search-result-active"; -} - UserMark * SearchUserMarkContainer::AllocateUserMark(const m2::PointD & ptOrg) { return new SearchMarkPoint(ptOrg, this); } DebugUserMarkContainer::DebugUserMarkContainer(double layerDepth, Framework & framework) - : UserMarkContainer(layerDepth, framework) + : UserMarkContainer(layerDepth, UserMarkType::DEBUG_MARK, framework) { } -string DebugUserMarkContainer::GetTypeName() const -{ - // api-result.png is reused for debug markers - return "api-result"; -} - -string DebugUserMarkContainer::GetActiveTypeName() const -{ - // api-result.png is reused for debug markers - return "api-result"; -} - UserMark * DebugUserMarkContainer::AllocateUserMark(const m2::PointD & ptOrg) { return new DebugMarkPoint(ptOrg, this); } - - -SelectionContainer::SelectionContainer(Framework & fm) - : m_container(NULL) - , m_fm(fm) -{ -} - -void SelectionContainer::ActivateMark(UserMark const * userMark, bool needAnim) -{ - if (needAnim) - KillActivationAnim(); - if (userMark != NULL) - { - m_ptOrg = userMark->GetOrg(); - m_container = userMark->GetContainer(); - if (needAnim) - StartActivationAnim(); - } - else - m_container = NULL; -} - -void SelectionContainer::Draw(const PaintOverlayEvent & e, UserMarkDLCache * cache) const -{ - if (m_container != NULL) - { - UserMarkDLCache::Key defaultKey(m_container->GetActiveTypeName(), - graphics::EPosCenter, - graphics::activePinDepth); - - DrawUserMarkByPoint(GetActiveMarkScale(), - m_fm.GetVisualScale(), - m2::PointD(0, 0), - e, cache->FindUserMark(defaultKey), - m_ptOrg); - } -} - -bool SelectionContainer::IsActive() const -{ - return m_container != NULL; -} - -void SelectionContainer::StartActivationAnim() -{ - m_animTask.reset(new PinAnimation(m_fm)); - m_fm.GetAnimController()->AddTask(m_animTask); - m_fm.Invalidate(); -} - -void SelectionContainer::KillActivationAnim() -{ - m_animTask.reset(); -} - -double SelectionContainer::GetActiveMarkScale() const -{ - if (m_animTask != NULL) - { - PinAnimation * a = static_cast(m_animTask.get()); - return a->GetScale(); - } - - return 1.0; -} diff --git a/map/user_mark_container.hpp b/map/user_mark_container.hpp index 79b11aff09..bc94fa1ed0 100644 --- a/map/user_mark_container.hpp +++ b/map/user_mark_container.hpp @@ -1,125 +1,102 @@ #pragma once -#include "user_mark.hpp" -#include "user_mark_dl_cache.hpp" +#include "map/user_mark.hpp" -#include "render/events.hpp" +#include "drape_frontend/user_marks_provider.hpp" #include "geometry/point2d.hpp" #include "geometry/rect2d.hpp" +#include "geometry/any_rect2d.hpp" #include "std/deque.hpp" +#include "std/bitset.hpp" + #include "std/noncopyable.hpp" #include "std/unique_ptr.hpp" class Framework; -namespace anim +enum class UserMarkType { - class Task; -} + SEARCH_MARK, + API_MARK, + DEBUG_MARK, + BOOKMARK_MARK +}; -namespace graphics -{ - class DisplayList; - class Screen; -} - -class UserMarkContainer : private noncopyable +class UserMarksController { public: - using UserMarksListT = deque>; + virtual size_t GetUserMarkCount() const = 0; + virtual UserMarkType GetType() const = 0; + virtual void SetIsDrawable(bool isDrawable) = 0; + virtual void SetIsVisible(bool isVisible) = 0; - class Controller - { - public: - Controller(UserMarkContainer * container) - : m_container(container) {} + virtual UserMark * CreateUserMark(m2::PointD const & ptOrg) = 0; + virtual UserMark const * GetUserMark(size_t index) const = 0; + virtual UserMark * GetUserMarkForEdit(size_t index) = 0; + virtual void DeleteUserMark(size_t index) = 0; + virtual void Clear(size_t skipCount = 0) = 0; + virtual void Update() = 0; +}; - UserMark * CreateUserMark(m2::PointD const & ptOrg) { return m_container->CreateUserMark(ptOrg); } - size_t GetUserMarkCount() const { return m_container->GetUserMarkCount(); } - UserMark const * GetUserMark(size_t index) const { return m_container->GetUserMark(index); } - UserMark * GetUserMarkForEdit(size_t index) { return m_container->GetUserMark(index); } - void DeleteUserMark(size_t index) { m_container->DeleteUserMark(index); } - void DeleteUserMark(UserMark const * mark) { m_container->DeleteUserMark(mark); } +class UserMarkContainer : public df::UserMarksProvider + , protected UserMarksController + , private noncopyable +{ +public: + using TUserMarksList = deque>; - // Returns index of the mark if exists, otherwise returns - // number of user marks. - size_t FindUserMark(UserMark const * mark) const { return m_container->FindUserMark(mark); } - - private: - UserMarkContainer * m_container; - }; - - enum Type - { - SEARCH_MARK, - API_MARK, - DEBUG_MARK, - BOOKMARK_MARK - }; - - UserMarkContainer(double layerDepth, Framework & fm); + UserMarkContainer(double layerDepth, UserMarkType type, Framework & fm); virtual ~UserMarkContainer(); - void SetScreen(graphics::Screen * cacheScreen); - virtual Type GetType() const = 0; - - bool IsVisible() const { return m_isVisible; } - void SetVisible(bool isVisible) { m_isVisible = isVisible; } - - bool IsDrawable() const { return m_isDrawable; } - void SetIsDrawable(bool isDrawable) { m_isDrawable = isDrawable; } - - // If not found mark on rect result is NULL + // If not found mark on rect result is nullptr // If mark is found in "d" return distance from rect center // In multiple select choose mark with min(d) UserMark const * FindMarkInRect(m2::AnyRectD const & rect, double & d) const; - void Draw(PaintOverlayEvent const & e, UserMarkDLCache * cache) const; - void ActivateMark(UserMark const * mark); - void DiactivateMark(); - - void Clear(size_t skipCount = 0); - - double GetDepth() const { return m_layerDepth; } - - virtual UserMarkDLCache::Key GetDefaultKey() const; - static void InitStaticMarks(UserMarkContainer * container); static PoiMarkPoint * UserMarkForPoi(); static MyPositionMarkPoint * UserMarkForMyPostion(); - Controller const & GetController() const { return m_controller; } - Controller & GetController() { return m_controller; } + /// never save reference on UserMarksController + UserMarksController & RequestController(); + void ReleaseController(); - virtual string GetActiveTypeName() const = 0; + /// Render info + size_t GetUserPointCount() const override; + df::UserPointMark const * GetUserPointMark(size_t index) const override; + + size_t GetUserLineCount() const override; + df::UserLineMark const * GetUserLineMark(size_t index) const override; + + float GetPointDepth() const; + + bool IsVisible() const; + bool IsDrawable() const override; + size_t GetUserMarkCount() const override; + UserMark const * GetUserMark(size_t index) const override; + UserMarkType GetType() const override final; protected: - virtual string GetTypeName() const = 0; + /// UserMarksController implementation + UserMark * CreateUserMark(m2::PointD const & ptOrg) override; + UserMark * GetUserMarkForEdit(size_t index) override; + void DeleteUserMark(size_t index) override; + void Clear(size_t skipCount = 0) override; + void SetIsDrawable(bool isDrawable) override; + void SetIsVisible(bool isVisible) override; + void Update() override; + virtual UserMark * AllocateUserMark(m2::PointD const & ptOrg) = 0; -private: - friend class Controller; - UserMark * CreateUserMark(m2::PointD const & ptOrg); - size_t GetUserMarkCount() const; - UserMark const * GetUserMark(size_t index) const; - UserMark * GetUserMark(size_t index); - void DeleteUserMark(size_t index); - void DeleteUserMark(UserMark const * mark); - size_t FindUserMark(UserMark const * mark); - - template void ForEachInRect(m2::RectD const & rect, ToDo toDo) const; - -protected: Framework & m_framework; private: - Controller m_controller; - bool m_isVisible; - bool m_isDrawable; + bitset<4> m_flags; double m_layerDepth; - UserMarksListT m_userMarks; + TUserMarksList m_userMarks; + UserMarkType m_type; }; class SearchUserMarkContainer : public UserMarkContainer @@ -127,12 +104,8 @@ class SearchUserMarkContainer : public UserMarkContainer public: SearchUserMarkContainer(double layerDepth, Framework & framework); - virtual Type GetType() const { return SEARCH_MARK; } - - virtual string GetActiveTypeName() const; protected: - virtual string GetTypeName() const; - virtual UserMark * AllocateUserMark(m2::PointD const & ptOrg); + UserMark * AllocateUserMark(m2::PointD const & ptOrg) override; }; class DebugUserMarkContainer : public UserMarkContainer @@ -140,34 +113,6 @@ class DebugUserMarkContainer : public UserMarkContainer public: DebugUserMarkContainer(double layerDepth, Framework & framework); - virtual Type GetType() const { return DEBUG_MARK; } - - virtual string GetActiveTypeName() const; protected: - virtual string GetTypeName() const; - virtual UserMark * AllocateUserMark(m2::PointD const & ptOrg); -}; - -class SelectionContainer -{ -public: - SelectionContainer(Framework & fm); - - void ActivateMark(UserMark const * userMark, bool needAnim); - void Draw(PaintOverlayEvent const & e, UserMarkDLCache * cache) const; - bool IsActive() const; - -private: - /// animation support - void StartActivationAnim(); - void KillActivationAnim(); - double GetActiveMarkScale() const; - - shared_ptr m_animTask; - -private: - friend class BookmarkManager; - UserMarkContainer const * m_container; - m2::PointD m_ptOrg; - Framework & m_fm; + UserMark * AllocateUserMark(m2::PointD const & ptOrg) override; }; diff --git a/map/user_mark_dl_cache.cpp b/map/user_mark_dl_cache.cpp deleted file mode 100644 index c58f443f25..0000000000 --- a/map/user_mark_dl_cache.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include "map/user_mark_dl_cache.hpp" - -#include "base/stl_add.hpp" - -#include "graphics/display_list.hpp" -#include "graphics/screen.hpp" - -namespace -{ - struct Deleter - { - void operator()(pair const & node) - { - delete node.second; - } - }; -} - -UserMarkDLCache::UserMarkDLCache(graphics::Screen * cacheScreen) - : m_cacheScreen(cacheScreen) -{ -} - -UserMarkDLCache::~UserMarkDLCache() -{ - DeleteRange(m_dls, Deleter()); - m_cacheScreen = NULL; -} - -graphics::DisplayList * UserMarkDLCache::FindUserMark(UserMarkDLCache::Key const & key) -{ - node_t node = m_dls.find(key); - if (node != m_dls.end()) - return node->second; - - return CreateDL(key); -} - -namespace -{ - m2::RectD CalcCoords(double const & halfSizeX, double const & halfSizeY, graphics::EPosition anchor) - { - m2::RectD result(-halfSizeX, -halfSizeY, halfSizeX, halfSizeY); - - if (anchor & graphics::EPosAbove) - result.Offset(0.0, -halfSizeY); - else if (anchor & graphics::EPosUnder) - result.Offset(0.0, halfSizeY); - - if (anchor & graphics::EPosLeft) - result.Offset(halfSizeX, 0.0); - else if (anchor & graphics::EPosRight) - result.Offset(-halfSizeX, 0.0); - - return result; - } -} - -graphics::DisplayList * UserMarkDLCache::CreateDL(UserMarkDLCache::Key const & key) -{ - using namespace graphics; - - graphics::DisplayList * dl = m_cacheScreen->createDisplayList(); - m_cacheScreen->beginFrame(); - m_cacheScreen->setDisplayList(dl); - - Icon::Info infoKey(key.m_name); - Resource const * res = m_cacheScreen->fromID(m_cacheScreen->findInfo(infoKey)); - shared_ptr texture = m_cacheScreen->pipeline(res->m_pipelineID).texture(); - - m2::RectU texRect = res->m_texRect; - m2::RectD coord = CalcCoords(texRect.SizeX() / 2.0, texRect.SizeY() / 2.0, key.m_anchor); - - m2::PointD coords[] = - { - coord.LeftBottom(), - coord.LeftTop(), - coord.RightBottom(), - coord.RightTop() - }; - m2::PointF normal(0.0, 0.0); - - m2::PointF texCoords[] = - { - texture->mapPixel(m2::PointF(texRect.minX(), texRect.minY())), - texture->mapPixel(m2::PointF(texRect.minX(), texRect.maxY())), - texture->mapPixel(m2::PointF(texRect.maxX(), texRect.minY())), - texture->mapPixel(m2::PointF(texRect.maxX(), texRect.maxY())) - }; - - m_cacheScreen->addTexturedStripStrided(coords, sizeof(m2::PointD), - &normal, 0, - texCoords, sizeof(m2::PointF), - 4, key.m_depthLayer, res->m_pipelineID); - - m_cacheScreen->setDisplayList(NULL); - m_cacheScreen->endFrame(); - - m_dls.insert(make_pair(key, dl)); - - return dl; -} diff --git a/map/user_mark_dl_cache.hpp b/map/user_mark_dl_cache.hpp deleted file mode 100644 index 8994f8c907..0000000000 --- a/map/user_mark_dl_cache.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include "base/math.hpp" -#include "graphics/defines.hpp" - -#include "std/map.hpp" - -namespace graphics -{ - class Screen; - class DisplayList; -} - -class UserMarkDLCache -{ -public: - struct Key - { - Key(string const & name, graphics::EPosition anchor, double depthLayer) - : m_name(name), m_anchor(anchor), m_depthLayer(depthLayer) {} - - string m_name; - graphics::EPosition m_anchor; - double m_depthLayer; - - bool operator < (Key const & other) const - { - if (m_name != other.m_name) - return m_name < other.m_name; - if (!my::AlmostEqualULPs(m_depthLayer, other.m_depthLayer)) - return m_depthLayer < other.m_depthLayer; - - return m_anchor < other.m_anchor; - } - }; - - UserMarkDLCache(graphics::Screen * cacheScreen); - ~UserMarkDLCache(); - - graphics::DisplayList * FindUserMark(Key const & key); - -private: - graphics::DisplayList * CreateDL(Key const & key); - -private: - graphics::Screen * m_cacheScreen; - typedef map cache_t; - typedef cache_t::iterator node_t; - cache_t m_dls; -}; diff --git a/mapshot/mapshot.cpp b/mapshot/mapshot.cpp new file mode 100644 index 0000000000..5a3a29d6bd --- /dev/null +++ b/mapshot/mapshot.cpp @@ -0,0 +1,134 @@ +#include "map/framework.hpp" + +#include "indexer/mercator.hpp" + +#include "base/string_utils.hpp" + +#include "std/fstream.hpp" +#include "std/iostream.hpp" +#include "std/string.hpp" + +#include "3party/gflags/src/gflags/gflags.h" + +#pragma mark Define options +//---------------------------------------------------------------------------------------- +DEFINE_bool(c, false, "Read places from stdin"); +DEFINE_string(place, "", "Define place in format \"lat;lon;zoom\""); +DEFINE_string(outpath, "./", "Path for output files"); +DEFINE_string(datapath, "", "Path to data directory"); +DEFINE_string(mwmpath, "", "Path to mwm files"); +DEFINE_int32(width, 480, "Resulting image width"); +DEFINE_int32(height, 640, "Resulting image height"); +//---------------------------------------------------------------------------------------- + +namespace +{ +struct Place +{ + double lat; + double lon; + int zoom; + int width; + int height; +}; + +Place ParsePlace(string const & src) +{ + Place p; + try + { + strings::SimpleTokenizer token(src, ";"); + p.lat = stod(*token); + p.lon = stod(*(++token)); + p.zoom = static_cast(stoi(*(++token))); + } + catch (exception & e) + { + cerr << "Error in [" << src << "]: " << e.what() << endl; + exit(1); + } + return p; +} + +void RenderPlace(Framework & framework, Place const & place, string const & filename) +{ + df::watch::FrameImage frame; + df::watch::FrameSymbols sym; + sym.m_showSearchResult = false; + + // If you are interested why, look at CPUDrawer::CalculateScreen. + // It is almost UpperComfortScale but there is some magic involved. + int constexpr kMagicBaseScale = 17; + + framework.DrawWatchFrame(MercatorBounds::FromLatLon(place.lat, place.lon), place.zoom - kMagicBaseScale, + place.width, place.height, sym, frame); + + ofstream file(filename.c_str()); + file.write(reinterpret_cast(frame.m_data.data()), frame.m_data.size()); + file.close(); +} + +string FilenameSeq(string const & path) +{ + static size_t counter = 0; + stringstream filename; + filename << path << "mapshot" << setw(6) << setfill('0') << counter++ << ".png"; + return filename.str(); +} +} // namespace + +int main(int argc, char * argv[]) +{ + google::SetUsageMessage( + "Generate screenshots of MAPS.ME maps in chosen places, specified by coordinates and zoom."); + google::ParseCommandLineFlags(&argc, &argv, true); + + if (!FLAGS_c && FLAGS_place.empty()) + { + cerr << "Either -c or -place must be set" << endl; + return 1; + } + + if (!FLAGS_datapath.empty()) + GetPlatform().SetResourceDir(FLAGS_datapath); + + if (!FLAGS_mwmpath.empty()) + GetPlatform().SetWritableDirForTests(FLAGS_mwmpath); + + try + { + Framework f; + + auto processPlace = [&](string const & place) + { + Place p = ParsePlace(place); + p.width = FLAGS_width; + p.height = FLAGS_height; + string const & filename = FilenameSeq(FLAGS_outpath); + RenderPlace(f, p, filename); + cout << "Rendering " << place << " into " << filename << " is finished." << endl; + }; + + // This magic constant was determined in several attempts. + // It is a scale level, basically, dpi factor. 1 means 90 or 96, it seems, + // and with 1.1 the map looks subjectively better. + f.InitWatchFrameRenderer(1.1 /* visualScale */); + + if (!FLAGS_place.empty()) + processPlace(FLAGS_place); + + if (FLAGS_c) + { + for (string line; getline(cin, line);) + processPlace(line); + } + + f.ReleaseWatchFrameRenderer(); + return 0; + } + catch (exception & e) + { + cerr << e.what() << endl; + } + return 1; +} diff --git a/mapshot/mapshot.pro b/mapshot/mapshot.pro new file mode 100644 index 0000000000..c6c9af8e6c --- /dev/null +++ b/mapshot/mapshot.pro @@ -0,0 +1,23 @@ +# mapshot binary + +ROOT_DIR = .. +DEPENDENCIES = map drape_frontend routing search storage indexer drape platform geometry coding base \ + freetype expat fribidi tomcrypt gflags jansson protobuf osrm stats_client minizip succinct + +include($$ROOT_DIR/common.pri) + +INCLUDEPATH *= $$ROOT_DIR/3party/gflags/src + +CONFIG += console warn_on +CONFIG -= app_bundle +TEMPLATE = app + +# needed for Platform::WorkingDir() and unicode combining +QT *= core + +LIBS *= "-framework IOKit" "-framework SystemConfiguration" + +SOURCES += \ + mapshot.cpp \ + +HEADERS += \ diff --git a/omim.pro b/omim.pro index 58ecaa9533..1add248ca7 100644 --- a/omim.pro +++ b/omim.pro @@ -4,7 +4,6 @@ # gtool: build only generator_tool # map_designer: enable designer-related flags # no-tests: do not build tests for desktop -# drape: include drape libraries # # There are no supported options in CONFIG for mobile platforms. # Please use XCode or gradle/Android Studio. @@ -20,11 +19,6 @@ TEMPLATE = subdirs HEADERS += defines.hpp -# TODO(AlexZ): Why is it here? Drape should build on win32 too. -win32:CONFIG(drape) { - CONFIG -= drape -} - !iphone*:!tizen*:!android* { CONFIG *= desktop } @@ -54,24 +48,22 @@ SUBDIRS = 3party base coding geometry indexer routing } !CONFIG(gtool):!CONFIG(osrm) { - SUBDIRS *= anim graphics gui render search map + SUBDIRS *= drape drape_frontend search map CONFIG(map_designer):CONFIG(desktop) { SUBDIRS *= skin_generator } - CONFIG(drape) { - SUBDIRS *= drape drape_frontend - CONFIG(desktop) { - drape_head.depends = $$SUBDIRS - SUBDIRS *= drape_head - } + + CONFIG(desktop) { + drape_head.depends = $$SUBDIRS + SUBDIRS *= drape_head } CONFIG(desktop) { benchmark_tool.subdir = map/benchmark_tool benchmark_tool.depends = 3party base coding geometry platform indexer map - SUBDIRS *= benchmark_tool + SUBDIRS *= benchmark_tool mapshot qt.depends = $$SUBDIRS SUBDIRS *= qt @@ -116,7 +108,7 @@ SUBDIRS = 3party base coding geometry indexer routing SUBDIRS *= search_tests MapDepLibs = 3party base coding geometry platform storage indexer search map \ - routing anim render gui graphics + routing drape drape_frontend map_tests.subdir = map/map_tests map_tests.depends = $$MapDepLibs @@ -158,21 +150,14 @@ SUBDIRS = 3party base coding geometry indexer routing generator_tests.depends = $$MapDepLibs routing generator generator_tests_support SUBDIRS *= generator_tests - # TODO(AlexZ): Do we really need them? - #SUBDIRS += render/render_tests - #SUBDIRS += graphics/graphics_tests - #SUBDIRS += gui/gui_tests + SUBDIRS *= qt_tstfrm - CONFIG(drape) { - SUBDIRS *= qt_tstfrm + drape_tests.subdir = drape/drape_tests + drape_tests.depends = 3party base coding platform qt_tstfrm + SUBDIRS *= drape_tests - drape_tests.subdir = drape/drape_tests - drape_tests.depends = 3party base coding platform qt_tstfrm - SUBDIRS *= drape_tests - - drape_frontend_tests.subdir = drape_frontend/drape_frontend_tests - drape_frontend_tests.depends = 3party base coding platform drape drape_frontend - SUBDIRS *= drape_frontend_tests - } + drape_frontend_tests.subdir = drape_frontend/drape_frontend_tests + drape_frontend_tests.depends = 3party base coding platform drape drape_frontend + SUBDIRS *= drape_frontend_tests } # !no-tests } # !gtool diff --git a/platform/http_thread_apple.h b/platform/http_thread_apple.h index f0a1ccd3b6..19cc40e0ea 100644 --- a/platform/http_thread_apple.h +++ b/platform/http_thread_apple.h @@ -2,8 +2,8 @@ #import -#include "../std/string.hpp" -#include "../std/target_os.hpp" +#include "std/string.hpp" +#include "std/target_os.hpp" namespace downloader { class IHttpThreadCallback; } diff --git a/platform/location.hpp b/platform/location.hpp index d57dbd083b..c9a0c6ff69 100644 --- a/platform/location.hpp +++ b/platform/location.hpp @@ -1,5 +1,7 @@ #pragma once +#include "geometry/point2d.hpp" + #include "base/base.hpp" #include "geometry/latlon.hpp" @@ -8,6 +10,7 @@ #include "routing/turns_sound_settings.hpp" #include "std/cmath.hpp" +#include "std/function.hpp" #include "std/string.hpp" #include "std/vector.hpp" @@ -175,18 +178,46 @@ namespace location m2::PointD m_matchedPosition; size_t m_indexInRoute; bool m_isPositionMatched; + bool m_hasDistanceFromBegin; + double m_distanceFromBegin; public: - RouteMatchingInfo() : m_matchedPosition(0., 0.), m_indexInRoute(0), m_isPositionMatched(false) {} - void Set(m2::PointD const & matchedPosition, size_t indexInRoute) + RouteMatchingInfo() + : m_matchedPosition(0., 0.) + , m_indexInRoute(0) + , m_isPositionMatched(false) + , m_hasDistanceFromBegin(false) + , m_distanceFromBegin(0.0) + {} + + void Set(m2::PointD const & matchedPosition, size_t indexInRoute, double distanceFromBegin) { m_matchedPosition = matchedPosition; m_indexInRoute = indexInRoute; m_isPositionMatched = true; + + m_distanceFromBegin = distanceFromBegin; + m_hasDistanceFromBegin = true; } + void Reset() { m_isPositionMatched = false; } bool IsMatched() const { return m_isPositionMatched; } size_t GetIndexInRoute() const { return m_indexInRoute; } m2::PointD GetPosition() const { return m_matchedPosition; } + bool HasDistanceFromBegin() const { return m_hasDistanceFromBegin; } + double GetDistanceFromBegin() const { return m_distanceFromBegin; } }; + + // Do not change the order and values + enum EMyPositionMode + { + MODE_UNKNOWN_POSITION = 0x0, + MODE_PENDING_POSITION = 0x1, + MODE_NOT_FOLLOW = 0x2, + MODE_FOLLOW = 0x3, + MODE_ROTATE_AND_FOLLOW = 0x4, + }; + + using TMyPositionModeChanged = function; + } // namespace location diff --git a/platform/platform.pro b/platform/platform.pro index 71be1f2ba2..b3e4954d45 100644 --- a/platform/platform.pro +++ b/platform/platform.pro @@ -29,23 +29,19 @@ INCLUDEPATH += $$ROOT_DIR/3party/jansson/src wifi_info_windows.cpp } else:macx-* { OBJECTIVE_SOURCES += platform_mac.mm \ - apple_video_timer.mm \ apple_location_service.mm } else:linux* { SOURCES += platform_linux.cpp } } else:iphone* { - OBJECTIVE_SOURCES += ios_video_timer.mm \ - platform_ios.mm + OBJECTIVE_SOURCES += platform_ios.mm } else:android* { SOURCES += platform_android.cpp \ - pthread_video_timer.cpp } else:tizen* { HEADERS += tizen_utils.hpp \ http_thread_tizen.hpp SOURCES += platform_tizen.cpp \ tizen_utils.cpp \ - pthread_video_timer.cpp \ http_thread_tizen.cpp \ } @@ -79,7 +75,6 @@ HEADERS += \ preferred_languages.hpp \ servers_list.hpp \ settings.hpp \ - video_timer.hpp \ SOURCES += \ chunks_download_strategy.cpp \ @@ -96,4 +91,3 @@ SOURCES += \ preferred_languages.cpp \ servers_list.cpp \ settings.cpp \ - video_timer.cpp \ diff --git a/platform/platform_tests/platform_test.cpp b/platform/platform_tests/platform_test.cpp index 14789475e6..1823530ac8 100644 --- a/platform/platform_tests/platform_test.cpp +++ b/platform/platform_tests/platform_test.cpp @@ -63,7 +63,7 @@ UNIT_TEST(GetReader) { char const * NON_EXISTING_FILE = "mgbwuerhsnmbui45efhdbn34.tmp"; char const * arr[] = { - "resources-ldpi/basic.skn", + "resources-ldpi/symbols.sdf", "classificator.txt", "minsk-pass.mwm" }; diff --git a/platform/platform_tests/platform_tests.pro b/platform/platform_tests/platform_tests.pro index 405d130bcc..2047466119 100644 --- a/platform/platform_tests/platform_tests.pro +++ b/platform/platform_tests/platform_tests.pro @@ -33,4 +33,3 @@ SOURCES += \ location_test.cpp \ measurement_tests.cpp \ platform_test.cpp \ - video_timer_test.cpp \ diff --git a/platform/preferred_languages.cpp b/platform/preferred_languages.cpp index c931a98cc9..7cae56ece0 100644 --- a/platform/preferred_languages.cpp +++ b/platform/preferred_languages.cpp @@ -12,12 +12,12 @@ #include #elif defined(OMIM_OS_WINDOWS) - #include "../std/windows.hpp" + #include "std/windows.hpp" // for XP it's not defined #define MUI_LANGUAGE_NAME 0x8 #elif defined(OMIM_OS_LINUX) - #include "../std/cstdlib.hpp" + #include "std/cstdlib.hpp" #elif defined(OMIM_OS_ANDROID) /// Body for this function is inside android/jni sources diff --git a/platform/settings.cpp b/platform/settings.cpp index 646ee6af62..3cbf97ca72 100644 --- a/platform/settings.cpp +++ b/platform/settings.cpp @@ -2,6 +2,7 @@ #include "platform.hpp" #include "defines.hpp" +#include "location.hpp" #include "coding/reader_streambuf.hpp" #include "coding/file_writer.hpp" @@ -336,6 +337,37 @@ namespace Settings return true; } + template <> string ToString(location::EMyPositionMode const & v) + { + switch (v) + { + case location::MODE_UNKNOWN_POSITION: return "Unknown"; + case location::MODE_PENDING_POSITION: return "Pending"; + case location::MODE_NOT_FOLLOW: return "NotFollow"; + case location::MODE_FOLLOW: return "Follow"; + case location::MODE_ROTATE_AND_FOLLOW: return "RotateAndFollow"; + default: return "Unknown"; + } + } + + template <> bool FromString(string const & s, location::EMyPositionMode & v) + { + if (s == "Unknown") + v = location::MODE_UNKNOWN_POSITION; + else if (s == "Pending") + v = location::MODE_PENDING_POSITION; + else if (s == "NotFollow") + v = location::MODE_NOT_FOLLOW; + else if (s == "Follow") + v = location::MODE_FOLLOW; + else if (s == "RotateAndFollow") + v = location::MODE_ROTATE_AND_FOLLOW; + else + return false; + + return true; + } + bool IsFirstLaunchForDate(int date) { int savedDate; diff --git a/qt/draw_widget.cpp b/qt/draw_widget.cpp index 364e088df4..4c85678124 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -1,702 +1,548 @@ #include "qt/draw_widget.hpp" #include "qt/slider_ctrl.hpp" +#include "qt/qtoglcontext.hpp" -#include "map/country_status_display.hpp" - -#include "render/render_policy.hpp" -#include "render/frame_image.hpp" +#include "drape_frontend/visual_params.hpp" #include "search/result.hpp" -#include "gui/controller.hpp" - -#include "graphics/opengl/opengl.hpp" -#include "graphics/depth_constants.hpp" - +#include "platform/settings.hpp" #include "platform/platform.hpp" #include "platform/settings.hpp" -#include "std/chrono.hpp" - -#include -#include #include +#include +#include +#include +#include +#include -#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) - #include - #include - #include -#else - #include - #include - #include -#endif +#include +#include +#include + +#include +#include +#include +#include namespace qt { - const unsigned LONG_TOUCH_MS = 1000; - const unsigned SHORT_TOUCH_MS = 250; - QtVideoTimer::QtVideoTimer(TFrameFn frameFn) - : ::VideoTimer(frameFn) - {} +namespace +{ - void QtVideoTimer::start() +bool IsLeftButton(Qt::MouseButtons buttons) +{ + return buttons & Qt::LeftButton; +} + +bool IsLeftButton(QMouseEvent * e) +{ + return IsLeftButton(e->button()) || IsLeftButton(e->buttons()); +} + +bool IsRightButton(Qt::MouseButtons buttons) +{ + return buttons & Qt::RightButton; +} + +bool IsRightButton(QMouseEvent * e) +{ + return IsRightButton(e->button()) || IsRightButton(e->buttons()); +} + +bool IsRotation(QMouseEvent * e) +{ + return e->modifiers() & Qt::ControlModifier; +} + +bool IsRouting(QMouseEvent * e) +{ + return e->modifiers() & Qt::ShiftModifier; +} + +bool IsLocationEmulation(QMouseEvent * e) +{ + return e->modifiers() & Qt::AltModifier; +} + +} // namespace + +DrawWidget::DrawWidget(QWidget * parent) + : TBase(parent), + m_contextFactory(nullptr), + m_framework(new Framework()), + m_ratio(1.0), + m_pScale(nullptr), + m_enableScaleUpdate(true), + m_emulatingLocation(false) +{ + m_framework->SetUserMarkActivationListener([](unique_ptr mark) { - m_timer = new QTimer(); - QObject::connect(m_timer, SIGNAL(timeout()), this, SLOT(TimerElapsed())); - resume(); - } + }); - void QtVideoTimer::pause() + m_framework->SetRouteBuildingListener([](routing::IRouter::ResultCode, + vector const &, + vector const &) { - m_timer->stop(); - m_state = EPaused; - } + }); - void QtVideoTimer::resume() + QTimer * timer = new QTimer(this); + VERIFY(connect(timer, SIGNAL(timeout()), this, SLOT(update())), ()); + timer->setSingleShot(false); + timer->start(30); +} + +DrawWidget::~DrawWidget() +{ + m_framework.reset(); +} + +void DrawWidget::SetScaleControl(QScaleSlider * pScale) +{ + m_pScale = pScale; + + connect(m_pScale, SIGNAL(actionTriggered(int)), this, SLOT(ScaleChanged(int))); + connect(m_pScale, SIGNAL(sliderPressed()), this, SLOT(SliderPressed())); + connect(m_pScale, SIGNAL(sliderReleased()), this, SLOT(SliderReleased())); +} + +void DrawWidget::PrepareShutdown() +{ +} + +void DrawWidget::UpdateAfterSettingsChanged() +{ + m_framework->EnterForeground(); +} + +void DrawWidget::LoadState() +{ + m_framework->LoadState(); + m_framework->LoadBookmarks(); +} + +void DrawWidget::SaveState() +{ + m_framework->SaveState(); +} + +void DrawWidget::ScalePlus() +{ + m_framework->Scale(Framework::SCALE_MAG, true); +} + +void DrawWidget::ScaleMinus() +{ + m_framework->Scale(Framework::SCALE_MIN, true); +} + +void DrawWidget::ScalePlusLight() +{ + m_framework->Scale(Framework::SCALE_MAG_LIGHT, true); +} + +void DrawWidget::ScaleMinusLight() +{ + m_framework->Scale(Framework::SCALE_MIN_LIGHT, true); +} + +void DrawWidget::ShowAll() +{ + m_framework->ShowAll(); +} + +void DrawWidget::ScaleChanged(int action) +{ + if (action != QAbstractSlider::SliderNoAction) { - m_timer->start(1000 / 60); - m_state = ERunning; - } - - void QtVideoTimer::stop() - { - pause(); - delete m_timer; - m_timer = 0; - m_state = EStopped; - } - - void QtVideoTimer::TimerElapsed() - { - m_frameFn(); - } - - void DummyDismiss() {} - - DrawWidget::DrawWidget(QWidget * pParent) - : QGLWidget(pParent), - m_isInitialized(false), - m_isTimerStarted(false), - m_framework(new Framework()), - m_isDrag(false), - m_isRotate(false), - //m_redrawInterval(100), - m_ratio(1.0), - m_pScale(0), - m_emulatingLocation(false) - { - // Initialize with some stubs for test. - PinClickManager & manager = GetBalloonManager(); - manager.ConnectUserMarkListener(bind(&DrawWidget::OnActivateMark, this, _1)); - manager.ConnectDismissListener(&DummyDismiss); - - m_framework->GetCountryStatusDisplay()->SetDownloadCountryListener([this] (storage::TIndex const & idx, int opt) - { - storage::ActiveMapsLayout & layout = m_framework->GetCountryTree().GetActiveMapLayout(); - if (opt == -1) - layout.RetryDownloading(idx); - else - layout.DownloadMap(idx, static_cast(opt)); - }); - - m_framework->SetRouteBuildingListener([] (routing::IRouter::ResultCode, vector const &, vector const &) - { - }); - } - - DrawWidget::~DrawWidget() - { - m_framework.reset(); - } - - void DrawWidget::PrepareShutdown() - { - KillPressTask(); - - ASSERT(isValid(), ()); - makeCurrent(); - - m_framework->PrepareToShutdown(); - - m_videoTimer.reset(); - } - - void DrawWidget::SetScaleControl(QScaleSlider * pScale) - { - m_pScale = pScale; - - connect(m_pScale, SIGNAL(actionTriggered(int)), this, SLOT(ScaleChanged(int))); - } - - void DrawWidget::UpdateNow() - { - update(); - } - - void DrawWidget::UpdateAfterSettingsChanged() - { - m_framework->SetupMeasurementSystem(); - } - - void DrawWidget::LoadState() - { - m_framework->LoadBookmarks(); - - if (!m_framework->LoadState()) - ShowAll(); - else - { - UpdateNow(); - UpdateScaleControl(); - } - } - - void DrawWidget::SaveState() - { - m_framework->SaveState(); - } - - void DrawWidget::MoveLeft() - { - m_framework->Move(math::pi, 0.5); - } - - void DrawWidget::MoveRight() - { - m_framework->Move(0.0, 0.5); - } - - void DrawWidget::MoveUp() - { - m_framework->Move(math::pi/2.0, 0.5); - } - - void DrawWidget::MoveDown() - { - m_framework->Move(-math::pi/2.0, 0.5); - } - - void DrawWidget::ScalePlus() - { - m_framework->Scale(2.0); - UpdateScaleControl(); - } - - void DrawWidget::ScaleMinus() - { - m_framework->Scale(0.5); - UpdateScaleControl(); - } - - void DrawWidget::ScalePlusLight() - { - m_framework->Scale(1.5); - UpdateScaleControl(); - } - - void DrawWidget::ScaleMinusLight() - { - m_framework->Scale(2.0/3.0); - UpdateScaleControl(); - } - - void DrawWidget::ShowAll() - { - m_framework->ShowAll(); - UpdateScaleControl(); - } - - void DrawWidget::Repaint() - { - m_framework->Invalidate(); - } - - VideoTimer * DrawWidget::CreateVideoTimer() - { -//#ifdef OMIM_OS_MAC -// return CreateAppleVideoTimer(bind(&DrawWidget::DrawFrame, this)); -//#else - /// Using timer, which doesn't use the separate thread - /// for performing an action. This avoids race conditions in Framework. - /// see issue #717 - return new QtVideoTimer(bind(&DrawWidget::DrawFrame, this)); -//#endif - } - - void DrawWidget::ScaleChanged(int action) - { - if (action != QAbstractSlider::SliderNoAction) - { - double const factor = m_pScale->GetScaleFactor(); - if (factor != 1.0) - m_framework->Scale(factor); - } - } - - void DrawWidget::initializeGL() - { - // we'll perform swap by ourselves, see issue #333 - setAutoBufferSwap(false); - - if (!m_isInitialized) - { -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - m_ratio = dynamic_cast(qApp)->devicePixelRatio(); -#endif - -#ifndef USE_DRAPE - m_videoTimer.reset(CreateVideoTimer()); - - InitRenderPolicy(); -#endif - - m_isInitialized = true; - } - } - - void DrawWidget::InitRenderPolicy() - { -#ifndef USE_DRAPE - shared_ptr primaryRC(new qt::gl::RenderContext(this)); - - graphics::ResourceManager::Params rmParams; - rmParams.m_texFormat = graphics::Data8Bpp; - rmParams.m_texRtFormat = graphics::Data4Bpp; - rmParams.m_videoMemoryLimit = GetPlatform().VideoMemoryLimit(); - - RenderPolicy::Params rpParams; - - QRect const & geometry = QApplication::desktop()->geometry(); - rpParams.m_screenWidth = L2D(geometry.width()); - rpParams.m_screenHeight = L2D(geometry.height()); - - if (m_ratio >= 1.5 || QApplication::desktop()->physicalDpiX() >= 180) - { - rpParams.m_density = graphics::EDensityXHDPI; - rpParams.m_exactDensityDPI = 320.; - } - else - { - rpParams.m_density = graphics::EDensityMDPI; - rpParams.m_exactDensityDPI = 160.; - } - rmParams.m_exactDensityDPI = rpParams.m_exactDensityDPI; - - rpParams.m_videoTimer = m_videoTimer.get(); - rpParams.m_useDefaultFB = true; - rpParams.m_rmParams = rmParams; - rpParams.m_primaryRC = primaryRC; - rpParams.m_skinName = "basic.skn"; - - try - { - m_framework->SetRenderPolicy(CreateRenderPolicy(rpParams)); - m_framework->InitGuiSubsystem(); - } - catch (graphics::gl::platform_unsupported const & e) - { - LOG(LERROR, ("OpenGL platform is unsupported, reason: ", e.what())); - /// @todo Show "Please Update Drivers" dialog and close the program. - } -#endif // USE_DRAPE - } - - void DrawWidget::resizeGL(int w, int h) - { - m_framework->OnSize(w, h); - m_framework->Invalidate(); - - if (m_isInitialized && m_isTimerStarted) - DrawFrame(); - - UpdateScaleControl(); - } - - void DrawWidget::paintGL() - { - if (m_isInitialized && !m_isTimerStarted) - { - // timer should be started upon the first repaint request to fully initialized GLWidget. - m_isTimerStarted = true; - (void)m_framework->SetUpdatesEnabled(true); - } - - m_framework->Invalidate(); - } - - void DrawWidget::DrawFrame() - { -#ifndef USE_DRAPE - if (m_framework->NeedRedraw()) - { - makeCurrent(); - m_framework->SetNeedRedraw(false); - - shared_ptr paintEvent(new PaintEvent(m_framework->GetRenderPolicy()->GetDrawer().get())); - - m_framework->BeginPaint(paintEvent); - m_framework->DoPaint(paintEvent); - - // swapping buffers before ending the frame, see issue #333 - swapBuffers(); - - m_framework->EndPaint(paintEvent); - doneCurrent(); - } -#endif // USE_DRAPE - } - - void DrawWidget::StartPressTask(m2::PointD const & pt, unsigned ms) - { - KillPressTask(); - m_deferredTask.reset( - new DeferredTask(bind(&DrawWidget::OnPressTaskEvent, this, pt, ms), milliseconds(ms))); - } - - void DrawWidget::KillPressTask() { m_deferredTask.reset(); } - - void DrawWidget::OnPressTaskEvent(m2::PointD const & pt, unsigned ms) - { - m_wasLongClick = (ms == LONG_TOUCH_MS); - GetBalloonManager().OnShowMark(m_framework->GetUserMark(pt, m_wasLongClick)); - } - - void DrawWidget::OnActivateMark(unique_ptr pCopy) - { - UserMark const * pMark = pCopy->GetUserMark(); - m_framework->ActivateUserMark(pMark); - } - - m2::PointD DrawWidget::GetDevicePoint(QMouseEvent * e) const - { - return m2::PointD(L2D(e->x()), L2D(e->y())); - } - - DragEvent DrawWidget::GetDragEvent(QMouseEvent * e) const - { - return DragEvent(L2D(e->x()), L2D(e->y())); - } - - RotateEvent DrawWidget::GetRotateEvent(QPoint const & pt) const - { - QPoint const center = rect().center(); - return RotateEvent(L2D(center.x()), L2D(center.y()), - L2D(pt.x()), L2D(pt.y())); - } - - namespace - { - void add_string(QMenu & menu, string const & s) - { - (void)menu.addAction(QString::fromUtf8(s.c_str())); - } - } - - void DrawWidget::mousePressEvent(QMouseEvent * e) - { - QGLWidget::mousePressEvent(e); - - KillPressTask(); - - m2::PointD const pt = GetDevicePoint(e); - - if (e->button() == Qt::LeftButton) - { - if (m_framework->GetGuiController()->OnTapStarted(pt)) - return; - - if (e->modifiers() & Qt::ControlModifier) - { - // starting rotation - m_framework->StartRotate(GetRotateEvent(e->pos())); - - setCursor(Qt::CrossCursor); - m_isRotate = true; - } - else if (e->modifiers() & Qt::ShiftModifier) - { - if (m_framework->IsRoutingActive()) - m_framework->CloseRouting(); - else - { - auto const & state = m_framework->GetLocationState(); - if (state->IsModeHasPosition()) - m_framework->BuildRoute(state->Position(), m_framework->PtoG(pt), 0 /* timeoutSec */); - else - return; - } - } - if (e->modifiers() & Qt::AltModifier) - { - m_emulatingLocation = true; - m2::PointD const point = m_framework->PtoG(pt); - - location::GpsInfo info; - info.m_latitude = MercatorBounds::YToLat(point.y); - info.m_longitude = MercatorBounds::XToLon(point.x); - info.m_horizontalAccuracy = 10.0; - info.m_timestamp = QDateTime::currentMSecsSinceEpoch() / 1000.0; - - m_framework->OnLocationUpdate(info); - - if (m_framework->IsRoutingActive()) - { - location::FollowingInfo loc; - m_framework->GetRouteFollowingInfo(loc); - LOG(LDEBUG, ("Distance:", loc.m_distToTarget, loc.m_targetUnitsSuffix, "Time:", loc.m_time, - "Turn:", routing::turns::GetTurnString(loc.m_turn), "(", loc.m_distToTurn, loc.m_turnUnitsSuffix, - ") Roundabout exit number:", loc.m_exitNum)); - } - } - else - { - // init press task params - m_taskPoint = pt; - m_wasLongClick = false; - m_isCleanSingleClick = true; - - StartPressTask(pt, LONG_TOUCH_MS); - - // starting drag - m_framework->StartDrag(GetDragEvent(e)); - - setCursor(Qt::CrossCursor); - m_isDrag = true; - } - } - else if (e->button() == Qt::RightButton) - { - // show feature types - QMenu menu; - - // Get POI under cursor or nearest address by point. - m2::PointD dummy; - search::AddressInfo info; - feature::Metadata metadata; - if (m_framework->GetVisiblePOI(pt, dummy, info, metadata)) - add_string(menu, "POI"); - else - m_framework->GetAddressInfoForPixelPoint(pt, info); - - // Get feature types under cursor. - vector types; - m_framework->GetFeatureTypes(pt, types); - for (size_t i = 0; i < types.size(); ++i) - add_string(menu, types[i]); - - (void)menu.addSeparator(); - - // Format address and types. - if (!info.m_name.empty()) - add_string(menu, info.m_name); - add_string(menu, info.FormatAddress()); - add_string(menu, info.FormatTypes()); - - menu.exec(e->pos()); - } - } - - void DrawWidget::mouseDoubleClickEvent(QMouseEvent * e) - { - QGLWidget::mouseDoubleClickEvent(e); - - KillPressTask(); - m_isCleanSingleClick = false; - - if (e->button() == Qt::LeftButton) - { - StopDragging(e); - - m_framework->ScaleToPoint(ScaleToPointEvent(L2D(e->x()), L2D(e->y()), 1.5)); - - UpdateScaleControl(); - } - } - - void DrawWidget::mouseMoveEvent(QMouseEvent * e) - { - QGLWidget::mouseMoveEvent(e); - - m2::PointD const pt = GetDevicePoint(e); - if (!pt.EqualDxDy(m_taskPoint, m_framework->GetVisualScale() * 10.0)) - { - // moved far from start point - do not show balloon - m_isCleanSingleClick = false; - KillPressTask(); - } - - if (m_framework->GetGuiController()->OnTapMoved(pt)) - return; - - if (m_isDrag) - m_framework->DoDrag(GetDragEvent(e)); - - if (m_isRotate) - m_framework->DoRotate(GetRotateEvent(e->pos())); - } - - void DrawWidget::mouseReleaseEvent(QMouseEvent * e) - { - QGLWidget::mouseReleaseEvent(e); - - m2::PointD const pt = GetDevicePoint(e); - if (m_framework->GetGuiController()->OnTapEnded(pt)) - return; - - if (!m_wasLongClick && m_isCleanSingleClick) - { - m_framework->GetBalloonManager().RemovePin(); - - StartPressTask(pt, SHORT_TOUCH_MS); - } - else - m_wasLongClick = false; - - StopDragging(e); - StopRotating(e); - } - - void DrawWidget::keyReleaseEvent(QKeyEvent * e) - { - QGLWidget::keyReleaseEvent(e); - - StopRotating(e); - - if (e->key() == Qt::Key_Alt) - m_emulatingLocation = false; - } - - void DrawWidget::StopRotating(QMouseEvent * e) - { - if (m_isRotate && (e->button() == Qt::LeftButton)) - { - m_framework->StopRotate(GetRotateEvent(e->pos())); - - setCursor(Qt::ArrowCursor); - m_isRotate = false; - } - } - - void DrawWidget::StopRotating(QKeyEvent * e) - { - if (m_isRotate && (e->key() == Qt::Key_Control)) - m_framework->StopRotate(GetRotateEvent(mapFromGlobal(QCursor::pos()))); - } - - void DrawWidget::StopDragging(QMouseEvent * e) - { - if (m_isDrag && e->button() == Qt::LeftButton) - { - m_framework->StopDrag(GetDragEvent(e)); - - setCursor(Qt::ArrowCursor); - m_isDrag = false; - } - } - - //void DrawWidget::ScaleTimerElapsed() - //{ - // m_timer->stop(); - //} - - void DrawWidget::wheelEvent(QWheelEvent * e) - { - if (!m_isDrag && !m_isRotate) - { - m_framework->ScaleToPoint(ScaleToPointEvent(L2D(e->x()), L2D(e->y()), exp(e->delta() / 360.0))); - - UpdateScaleControl(); - } - } - - void DrawWidget::UpdateScaleControl() - { - if (m_pScale) - { - // don't send ScaleChanged - m_pScale->SetPosWithBlockedSignals(m_framework->GetDrawScale()); - } - } - - bool DrawWidget::Search(search::SearchParams params) - { - double lat, lon; - if (m_framework->GetCurrentPosition(lat, lon)) - params.SetPosition(lat, lon); - - // This stuff always returns system language (not keyboard input language). - /* - QInputMethod const * pIM = QApplication::inputMethod(); - if (pIM) - { - string const lang = pIM->locale().name().toStdString(); - LOG(LDEBUG, ("QT input language", lang)); - params.SetInputLanguage(lang); - } - */ - - return m_framework->Search(params); - } - - string DrawWidget::GetDistance(search::Result const & res) const - { - string dist; - double lat, lon; - if (m_framework->GetCurrentPosition(lat, lon)) - { - double dummy; - (void) m_framework->GetDistanceAndAzimut(res.GetFeatureCenter(), lat, lon, -1.0, dist, dummy); - } - return dist; - } - - void DrawWidget::ShowSearchResult(search::Result const & res) - { - m_framework->ShowSearchResult(res); - - UpdateScaleControl(); - } - - void DrawWidget::CloseSearch() - { - setFocus(); - } - - void DrawWidget::OnLocationUpdate(location::GpsInfo const & info) - { - if (!m_emulatingLocation) - m_framework->OnLocationUpdate(info); - } - - void DrawWidget::QueryMaxScaleMode() - { - m_framework->XorQueryMaxScaleMode(); - } - - void DrawWidget::SetMapStyle(MapStyle mapStyle) - { -#ifndef USE_DRAPE - if (m_framework->GetMapStyle() == mapStyle) - return; - - makeCurrent(); - - m_framework->SetRenderPolicy(nullptr); - - m_framework->SetMapStyle(mapStyle); - - // init new render policy - InitRenderPolicy(); - - m_framework->SetUpdatesEnabled(true); -#endif - } - - void DrawWidget::SetRouter(routing::RouterType routerType) - { - m_framework->SetRouter(routerType); + double const factor = m_pScale->GetScaleFactor(); + if (factor != 1.0) + m_framework->Scale(factor, false); } } + +void DrawWidget::SliderPressed() +{ + m_enableScaleUpdate = false; +} + +void DrawWidget::SliderReleased() +{ + m_enableScaleUpdate = true; +} + +void DrawWidget::CreateEngine() +{ + Framework::DrapeCreationParams p; + p.m_surfaceWidth = m_ratio * width(); + p.m_surfaceHeight = m_ratio * height(); + p.m_visualScale = m_ratio; + + m_skin.reset(new gui::Skin(gui::ResolveGuiSkinFile("default"), m_ratio)); + m_skin->Resize(p.m_surfaceWidth, p.m_surfaceHeight); + m_skin->ForEach([&p](gui::EWidget widget, gui::Position const & pos) + { + p.m_widgetsInitInfo[widget] = pos; + }); + + p.m_widgetsInitInfo[gui::WIDGET_SCALE_LABEL] = gui::Position(dp::LeftBottom); + + m_framework->CreateDrapeEngine(make_ref(m_contextFactory), std::move(p)); + m_framework->AddViewportListener(bind(&DrawWidget::OnViewportChanged, this, _1)); +} + +void DrawWidget::initializeGL() +{ + ASSERT(m_contextFactory == nullptr, ()); + m_ratio = devicePixelRatio(); + m_contextFactory.reset(new QtOGLContextFactory(context())); + + emit BeforeEngineCreation(); + CreateEngine(); + LoadState(); +} + +void DrawWidget::paintGL() +{ + static QOpenGLShaderProgram * program = nullptr; + if (program == nullptr) + { + const char * vertexSrc = "\ + attribute vec2 a_position; \ + attribute vec2 a_texCoord; \ + uniform mat4 u_projection; \ + varying vec2 v_texCoord; \ + \ + void main(void) \ + { \ + gl_Position = u_projection * vec4(a_position, 0.0, 1.0);\ + v_texCoord = a_texCoord; \ + }"; + + const char * fragmentSrc = "\ + uniform sampler2D u_sampler; \ + varying vec2 v_texCoord; \ + \ + void main(void) \ + { \ + gl_FragColor = vec4(texture2D(u_sampler, v_texCoord).rgb, 1.0); \ + }"; + + program = new QOpenGLShaderProgram(this); + program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexSrc); + program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentSrc); + program->link(); + } + + if (m_contextFactory->LockFrame()) + { + QOpenGLFunctions * funcs = context()->functions(); + funcs->glActiveTexture(GL_TEXTURE0); + GLuint image = m_contextFactory->GetTextureHandle(); + funcs->glBindTexture(GL_TEXTURE_2D, image); + + int projectionLocation = program->uniformLocation("u_projection"); + int samplerLocation = program->uniformLocation("u_sampler"); + + QMatrix4x4 projection; + QRect r = rect(); + r.setWidth(m_ratio * r.width()); + r.setHeight(m_ratio * r.height()); + projection.ortho(r); + + program->bind(); + program->setUniformValue(projectionLocation, projection); + program->setUniformValue(samplerLocation, 0); + + float const w = m_ratio * width(); + float h = m_ratio * height(); + + QVector2D positions[4] = + { + QVector2D(0.0, 0.0), + QVector2D(w, 0.0), + QVector2D(0.0, h), + QVector2D(w, h) + }; + + QRectF const & texRect = m_contextFactory->GetTexRect(); + QVector2D texCoords[4] = + { + QVector2D(texRect.bottomLeft()), + QVector2D(texRect.bottomRight()), + QVector2D(texRect.topLeft()), + QVector2D(texRect.topRight()) + }; + + program->enableAttributeArray("a_position"); + program->enableAttributeArray("a_texCoord"); + program->setAttributeArray("a_position", positions, 0); + program->setAttributeArray("a_texCoord", texCoords, 0); + + funcs->glClearColor(0.0, 0.0, 0.0, 1.0); + funcs->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + funcs->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + m_contextFactory->UnlockFrame(); + } + +} + +void DrawWidget::resizeGL(int width, int height) +{ + float w = m_ratio * width; + float h = m_ratio * height; + m_framework->OnSize(w, h); + if (m_skin) + { + m_skin->Resize(w, h); + + gui::TWidgetsLayoutInfo layout; + m_skin->ForEach([&layout](gui::EWidget w, gui::Position const & pos) + { + layout[w] = pos.m_pixelPivot; + }); + + m_framework->SetWidgetLayout(std::move(layout)); + } +} + +void DrawWidget::mousePressEvent(QMouseEvent * e) +{ + TBase::mousePressEvent(e); + + m2::PointD const pt = GetDevicePoint(e); + + if (IsLeftButton(e)) + { + if (IsRouting(e)) + SubmitRoutingPoint(pt); + else if (IsLocationEmulation(e)) + SubmitFakeLocationPoint(pt); + else + { + m_framework->TouchEvent(GetTouchEvent(e, df::TouchEvent::TOUCH_DOWN)); + setCursor(Qt::CrossCursor); + } + } + else if (IsRightButton(e)) + ShowInfoPopup(pt); +} + +void DrawWidget::mouseDoubleClickEvent(QMouseEvent * e) +{ + TBase::mouseDoubleClickEvent(e); + if (IsLeftButton(e)) + m_framework->Scale(Framework::SCALE_MAG_LIGHT, GetDevicePoint(e), true); +} + +void DrawWidget::mouseMoveEvent(QMouseEvent * e) +{ + TBase::mouseMoveEvent(e); + if (IsLeftButton(e) && !IsLocationEmulation(e)) + m_framework->TouchEvent(GetTouchEvent(e, df::TouchEvent::TOUCH_MOVE)); +} + +void DrawWidget::mouseReleaseEvent(QMouseEvent * e) +{ + TBase::mouseReleaseEvent(e); + if (IsLeftButton(e) && !IsLocationEmulation(e)) + m_framework->TouchEvent(GetTouchEvent(e, df::TouchEvent::TOUCH_UP)); +} + +void DrawWidget::keyPressEvent(QKeyEvent * e) +{ + TBase::keyPressEvent(e); + if (IsLeftButton(QGuiApplication::mouseButtons()) && + e->key() == Qt::Key_Control) + { + df::TouchEvent event; + event.m_type = df::TouchEvent::TOUCH_DOWN; + event.m_touches[0].m_id = 0; + event.m_touches[0].m_location = m2::PointD(L2D(QCursor::pos().x()), L2D(QCursor::pos().y())); + event.m_touches[1] = GetSymmetrical(event.m_touches[0]); + + m_framework->TouchEvent(event); + } +} + +void DrawWidget::keyReleaseEvent(QKeyEvent * e) +{ + TBase::keyReleaseEvent(e); + + if (IsLeftButton(QGuiApplication::mouseButtons()) && + e->key() == Qt::Key_Control) + { + df::TouchEvent event; + event.m_type = df::TouchEvent::TOUCH_UP; + event.m_touches[0].m_id = 0; + event.m_touches[0].m_location = m2::PointD(L2D(QCursor::pos().x()), L2D(QCursor::pos().y())); + event.m_touches[1] = GetSymmetrical(event.m_touches[0]); + + m_framework->TouchEvent(event); + } + else if (e->key() == Qt::Key_Alt) + m_emulatingLocation = false; +} + +void DrawWidget::wheelEvent(QWheelEvent * e) +{ + m_framework->Scale(exp(e->delta() / 360.0), m2::PointD(L2D(e->x()), L2D(e->y())), false); +} + +bool DrawWidget::Search(search::SearchParams params) +{ + double lat, lon; + if (m_framework->GetCurrentPosition(lat, lon)) + params.SetPosition(lat, lon); + + return m_framework->Search(params); +} + +string DrawWidget::GetDistance(search::Result const & res) const +{ + string dist; + double lat, lon; + if (m_framework->GetCurrentPosition(lat, lon)) + { + double dummy; + (void) m_framework->GetDistanceAndAzimut(res.GetFeatureCenter(), lat, lon, -1.0, dist, dummy); + } + return dist; +} + +void DrawWidget::ShowSearchResult(search::Result const & res) +{ + m_framework->ShowSearchResult(res); +} + +void DrawWidget::OnLocationUpdate(location::GpsInfo const & info) +{ + if (!m_emulatingLocation) + m_framework->OnLocationUpdate(info); +} + +void DrawWidget::SetMapStyle(MapStyle mapStyle) +{ + m_framework->SetMapStyle(mapStyle); +} + +void DrawWidget::SubmitFakeLocationPoint(m2::PointD const & pt) +{ + m_emulatingLocation = true; + m2::PointD const point = m_framework->PtoG(pt); + + location::GpsInfo info; + info.m_latitude = MercatorBounds::YToLat(point.y); + info.m_longitude = MercatorBounds::XToLon(point.x); + info.m_horizontalAccuracy = 10; + info.m_timestamp = QDateTime::currentMSecsSinceEpoch() / 1000.0; + + m_framework->OnLocationUpdate(info); + + if (m_framework->IsRoutingActive()) + { + location::FollowingInfo loc; + m_framework->GetRouteFollowingInfo(loc); + LOG(LDEBUG, ("Distance:", loc.m_distToTarget, loc.m_targetUnitsSuffix, "Time:", loc.m_time, + "Turn:", routing::turns::GetTurnString(loc.m_turn), "(", loc.m_distToTurn, loc.m_turnUnitsSuffix, + ") Roundabout exit number:", loc.m_exitNum)); + } +} + +void DrawWidget::SubmitRoutingPoint(m2::PointD const & pt) +{ + if (m_framework->IsRoutingActive()) + m_framework->CloseRouting(); + else + m_framework->BuildRoute(m_framework->PtoG(pt), 0 /* timeoutSec */); +} + +void DrawWidget::ShowInfoPopup(m2::PointD const & pt) +{ + // show feature types + QMenu menu; + auto const addStringFn = [&menu](string const & s) + { + menu.addAction(QString::fromUtf8(s.c_str())); + }; + + search::AddressInfo info; + m_framework->GetAddressInfoForPixelPoint(pt, info); + + // Get feature types under cursor. + vector types; + m_framework->GetFeatureTypes(pt, types); + for (size_t i = 0; i < types.size(); ++i) + addStringFn(types[i]); + + menu.addSeparator(); + + // Format address and types. + if (!info.m_name.empty()) + addStringFn(info.m_name); + addStringFn(info.FormatAddress()); + addStringFn(info.FormatTypes()); + + menu.exec(); +} + +void DrawWidget::OnViewportChanged(ScreenBase const & screen) +{ + UpdateScaleControl(); +} + +void DrawWidget::UpdateScaleControl() +{ + if (m_pScale && m_enableScaleUpdate) + { + // don't send ScaleChanged + m_pScale->SetPosWithBlockedSignals(m_framework->GetDrawScale()); + } +} + +df::Touch DrawWidget::GetTouch(QMouseEvent * e) +{ + df::Touch touch; + touch.m_id = 0; + touch.m_location = GetDevicePoint(e); + return touch; +} + +df::Touch DrawWidget::GetSymmetrical(df::Touch const & touch) +{ + m2::PointD pixelCenter = m_framework->GetPixelCenter(); + m2::PointD symmetricalLocation = pixelCenter + (pixelCenter - touch.m_location); + + df::Touch result; + result.m_id = touch.m_id + 1; + result.m_location = symmetricalLocation; + + return result; +} + +df::TouchEvent DrawWidget::GetTouchEvent(QMouseEvent * e, df::TouchEvent::ETouchType type) +{ + df::TouchEvent event; + event.m_type = type; + event.m_touches[0] = GetTouch(e); + if (IsRotation(e)) + event.m_touches[1] = GetSymmetrical(event.m_touches[0]); + + return event; +} + +m2::PointD DrawWidget::GetDevicePoint(QMouseEvent * e) const +{ + return m2::PointD(L2D(e->x()), L2D(e->y())); +} + +void DrawWidget::SetRouter(routing::RouterType routerType) +{ + m_framework->SetRouter(routerType); +} + +} diff --git a/qt/draw_widget.hpp b/qt/draw_widget.hpp index f4d3a4890a..70c07b134f 100644 --- a/qt/draw_widget.hpp +++ b/qt/draw_widget.hpp @@ -1,90 +1,49 @@ #pragma once +#include "qt/qtoglcontextfactory.hpp" + #include "map/framework.hpp" -#include "map/navigator.hpp" -#include "map/qgl_render_context.hpp" -#include "render/window_handle.hpp" +#include "drape_frontend/gui/skin.hpp" -#include "platform/video_timer.hpp" - -#include "base/deferred_task.hpp" +#include "drape_frontend/drape_engine.hpp" #include "std/unique_ptr.hpp" +#include "std/mutex.hpp" +#include "std/condition_variable.hpp" -#include -#include +#include +class QQuickWindow; namespace qt { class QScaleSlider; - class DrawWidget; - - class QtVideoTimer : public QObject, public ::VideoTimer + class DrawWidget : public QOpenGLWidget { - Q_OBJECT - private: - QTimer * m_timer; - - public: - QtVideoTimer(::VideoTimer::TFrameFn frameFn); - - void resume(); - void pause(); - - void start(); - void stop(); - - protected: - Q_SLOT void TimerElapsed(); - }; - - class DrawWidget : public QGLWidget - { - bool m_isInitialized; - bool m_isTimerStarted; + using TBase = QOpenGLWidget; + drape_ptr m_contextFactory; unique_ptr m_framework; - unique_ptr m_videoTimer; - - bool m_isDrag; - bool m_isRotate; - - //QTimer * m_timer; - //QTimer * m_animTimer; - //size_t m_redrawInterval; qreal m_ratio; - inline int L2D(int px) const { return px * m_ratio; } - inline m2::PointD GetDevicePoint(QMouseEvent * e) const; - DragEvent GetDragEvent(QMouseEvent * e) const; - RotateEvent GetRotateEvent(QPoint const & pt) const; - Q_OBJECT public Q_SLOTS: - void MoveLeft(); - void MoveRight(); - void MoveUp(); - void MoveDown(); - void ScalePlus(); void ScaleMinus(); void ScalePlusLight(); void ScaleMinusLight(); void ShowAll(); - void Repaint(); void ScaleChanged(int action); - //void ScaleTimerElapsed(); - - void QueryMaxScaleMode(); + void SliderPressed(); + void SliderReleased(); public: - DrawWidget(QWidget * pParent); + DrawWidget(QWidget * parent); ~DrawWidget(); void SetScaleControl(QScaleSlider * pScale); @@ -92,14 +51,12 @@ namespace qt bool Search(search::SearchParams params); string GetDistance(search::Result const & res) const; void ShowSearchResult(search::Result const & res); - void CloseSearch(); void OnLocationUpdate(location::GpsInfo const & info); void SaveState(); void LoadState(); - void UpdateNow(); void UpdateAfterSettingsChanged(); void PrepareShutdown(); @@ -109,52 +66,46 @@ namespace qt void SetMapStyle(MapStyle mapStyle); void SetRouter(routing::RouterType routerType); + Q_SIGNAL void BeforeEngineCreation(); + + void CreateEngine(); protected: - VideoTimer * CreateVideoTimer(); - - protected: - void StartPressTask(m2::PointD const & pt, unsigned ms); - void KillPressTask(); - void OnPressTaskEvent(m2::PointD const & pt, unsigned ms); - void OnActivateMark(unique_ptr pCopy); - - protected: - /// @name Overriden from base_type. + void initializeGL() override; + void paintGL() override; + void resizeGL(int width, int height) override; + /// @name Overriden from QOpenGLWindow. //@{ - virtual void initializeGL(); - virtual void resizeGL(int w, int h); - virtual void paintGL(); - //@} - - void DrawFrame(); - - /// @name Overriden from QWidget. - //@{ - virtual void mousePressEvent(QMouseEvent * e); - virtual void mouseDoubleClickEvent(QMouseEvent * e); - virtual void mouseMoveEvent(QMouseEvent * e); - virtual void mouseReleaseEvent(QMouseEvent * e); - virtual void wheelEvent(QWheelEvent * e); - virtual void keyReleaseEvent(QKeyEvent * e); + void mousePressEvent(QMouseEvent * e) override; + void mouseDoubleClickEvent(QMouseEvent * e) override; + void mouseMoveEvent(QMouseEvent * e) override; + void mouseReleaseEvent(QMouseEvent * e) override; + void wheelEvent(QWheelEvent * e) override; + void keyPressEvent(QKeyEvent * e) override; + void keyReleaseEvent(QKeyEvent * e) override; //@} private: + void SubmitFakeLocationPoint(m2::PointD const & pt); + void SubmitRoutingPoint(m2::PointD const & pt); + void ShowInfoPopup(m2::PointD const & pt); + + void OnViewportChanged(ScreenBase const & screen); void UpdateScaleControl(); - void StopDragging(QMouseEvent * e); - void StopRotating(QMouseEvent * e); - void StopRotating(QKeyEvent * e); + df::Touch GetTouch(QMouseEvent * e); + df::Touch GetSymmetrical(const df::Touch & touch); + df::TouchEvent GetTouchEvent(QMouseEvent * e, df::TouchEvent::ETouchType type); + + inline int L2D(int px) const { return px * m_ratio; } + m2::PointD GetDevicePoint(QMouseEvent * e) const; QScaleSlider * m_pScale; - - unique_ptr m_deferredTask; - m2::PointD m_taskPoint; - bool m_wasLongClick, m_isCleanSingleClick; + bool m_enableScaleUpdate; bool m_emulatingLocation; - PinClickManager & GetBalloonManager() { return m_framework->GetBalloonManager(); } - void InitRenderPolicy(); + + unique_ptr m_skin; }; } diff --git a/qt/mainwindow.cpp b/qt/mainwindow.cpp index 7661b6caf4..1a830914b8 100644 --- a/qt/mainwindow.cpp +++ b/qt/mainwindow.cpp @@ -1,11 +1,6 @@ #include "qt/mainwindow.hpp" -#ifndef USE_DRAPE #include "qt/draw_widget.hpp" -#else -#include "qt/drape_surface.hpp" -#endif - #include "qt/slider_ctrl.hpp" #include "qt/about.hpp" #include "qt/preferences_dialog.hpp" @@ -22,12 +17,14 @@ #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #include + #include #include #include #include #include #else #include + #include #include #include #include @@ -54,24 +51,33 @@ namespace qt MainWindow::MainWindow() : m_locationService(CreateDesktopLocationService(*this)) { -#ifndef USE_DRAPE - m_pDrawWidget = new DrawWidget(this); - setCentralWidget(m_pDrawWidget); -#else - m_pDrawWidget = new DrapeSurface(); - QSurfaceFormat format = m_pDrawWidget->requestedFormat(); - format.setDepthBufferSize(16); - m_pDrawWidget->setFormat(format); - QWidget * w = QWidget::createWindowContainer(m_pDrawWidget, this); - w->setMouseTracking(true); - setCentralWidget(w); -#endif // USE_DRAPE + // Always runs on the first desktop + QDesktopWidget const * desktop(QApplication::desktop()); + setGeometry(desktop->screenGeometry(desktop->primaryScreen())); - shared_ptr locState = m_pDrawWidget->GetFramework().GetLocationState(); - locState->AddStateModeListener([this] (location::State::Mode mode) - { - LocationStateModeChanged(mode); - }); + m_pDrawWidget = new DrawWidget(this); + QSurfaceFormat format = m_pDrawWidget->format(); + + format.setMajorVersion(2); + format.setMinorVersion(1); + + format.setAlphaBufferSize(8); + format.setBlueBufferSize(8); + format.setGreenBufferSize(8); + format.setRedBufferSize(8); + format.setStencilBufferSize(0); + format.setSamples(0); + format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); + format.setSwapInterval(1); + format.setDepthBufferSize(16); + + format.setProfile(QSurfaceFormat::CompatibilityProfile); + //format.setOption(QSurfaceFormat::DebugContext); + m_pDrawWidget->setFormat(format); + m_pDrawWidget->setMouseTracking(true); + setCentralWidget(m_pDrawWidget); + + QObject::connect(m_pDrawWidget, SIGNAL(BeforeEngineCreation()), this, SLOT(OnBeforeEngineCreation())); CreateNavigationBar(); CreateSearchBarAndPanel(); @@ -141,10 +147,7 @@ MainWindow::MainWindow() : m_locationService(CreateDesktopLocationService(*this) } #endif // NO_DOWNLOADER -#ifndef USE_DRAPE m_pDrawWidget->UpdateAfterSettingsChanged(); -#endif // USE_DRAPE - locState->InvalidatePosition(); } #if defined(Q_WS_WIN) @@ -187,12 +190,11 @@ void MainWindow::LoadState() { // do always show on full screen showMaximized(); - m_pDrawWidget->LoadState(); } -void MainWindow::LocationStateModeChanged(location::State::Mode mode) +void MainWindow::LocationStateModeChanged(location::EMyPositionMode mode) { - if (mode == location::State::PendingPosition) + if (mode == location::MODE_PENDING_POSITION) { m_locationService->Start(); m_pMyPositionAction->setIcon(QIcon(":/navig64/location-search.png")); @@ -200,7 +202,7 @@ void MainWindow::LocationStateModeChanged(location::State::Mode mode) return; } - if (mode == location::State::UnknownPosition) + if (mode == location::MODE_UNKNOWN_POSITION) m_locationService->Stop(); m_pMyPositionAction->setIcon(QIcon(":/navig64/location.png")); @@ -240,20 +242,14 @@ void MainWindow::CreateNavigationBar() pToolBar->setOrientation(Qt::Vertical); pToolBar->setIconSize(QSize(32, 32)); -#ifndef USE_DRAPE { // add navigation hot keys hotkey_t arr[] = { - { Qt::Key_Left, SLOT(MoveLeft()) }, - { Qt::Key_Right, SLOT(MoveRight()) }, - { Qt::Key_Up, SLOT(MoveUp()) }, - { Qt::Key_Down, SLOT(MoveDown()) }, { Qt::Key_Equal, SLOT(ScalePlus()) }, { Qt::Key_Minus, SLOT(ScaleMinus()) }, { Qt::ALT + Qt::Key_Equal, SLOT(ScalePlusLight()) }, { Qt::ALT + Qt::Key_Minus, SLOT(ScaleMinusLight()) }, - { Qt::Key_A, SLOT(ShowAll()) }, - { Qt::Key_S, SLOT(QueryMaxScaleMode()) } + { Qt::Key_A, SLOT(ShowAll()) } }; for (size_t i = 0; i < ARRAY_SIZE(arr); ++i) @@ -264,7 +260,6 @@ void MainWindow::CreateNavigationBar() addAction(pAct); } } -#endif // USE_DRAPE { // add search button with "checked" behavior @@ -289,7 +284,6 @@ void MainWindow::CreateNavigationBar() m_pMyPositionAction->setToolTip(tr("My Position")); // #endif -#ifndef USE_DRAPE // add view actions 1 button_t arr[] = { { QString(), 0, 0 }, @@ -297,10 +291,8 @@ void MainWindow::CreateNavigationBar() { tr("Scale +"), ":/navig64/plus.png", SLOT(ScalePlus()) } }; add_buttons(pToolBar, arr, ARRAY_SIZE(arr), m_pDrawWidget); -#endif // USE_DRAPE } -#ifndef USE_DRAPE // add scale slider QScaleSlider * pScale = new QScaleSlider(Qt::Vertical, this, 20); pScale->SetRange(2, scales::GetUpperScale()); @@ -316,7 +308,6 @@ void MainWindow::CreateNavigationBar() }; add_buttons(pToolBar, arr, ARRAY_SIZE(arr), m_pDrawWidget); } -#endif // USE_DRAPE #ifndef NO_DOWNLOADER { @@ -362,7 +353,7 @@ void MainWindow::OnLocationUpdated(location::GpsInfo const & info) void MainWindow::OnMyPosition() { if (m_pMyPositionAction->isEnabled()) - m_pDrawWidget->GetFramework().GetLocationState()->SwitchToNextMode(); + m_pDrawWidget->GetFramework().SwitchMyPositionNextMode(); } void MainWindow::OnSearchButtonClicked() @@ -379,12 +370,21 @@ void MainWindow::OnSearchButtonClicked() } } +void MainWindow::OnBeforeEngineCreation() +{ + m_pDrawWidget->GetFramework().SetMyPositionModeListener([this](location::EMyPositionMode mode) + { + LocationStateModeChanged(mode); + }); +} + void MainWindow::OnPreferences() { PreferencesDialog dlg(this); dlg.exec(); m_pDrawWidget->GetFramework().SetupMeasurementSystem(); + m_pDrawWidget->GetFramework().EnterForeground(); } #ifndef NO_DOWNLOADER @@ -398,12 +398,10 @@ void MainWindow::ShowUpdateDialog() void MainWindow::CreateSearchBarAndPanel() { -#ifndef USE_DRAPE CreatePanelImpl(0, Qt::RightDockWidgetArea, tr("Search"), QKeySequence(), 0); SearchPanel * panel = new SearchPanel(m_pDrawWidget, m_Docks[0]); m_Docks[0]->setWidget(panel); -#endif // USE_DRAPE } void MainWindow::CreatePanelImpl(size_t i, Qt::DockWidgetArea area, QString const & name, @@ -429,11 +427,7 @@ void MainWindow::CreatePanelImpl(size_t i, Qt::DockWidgetArea area, QString cons void MainWindow::closeEvent(QCloseEvent * e) { -#ifndef USE_DRAPE m_pDrawWidget->PrepareShutdown(); -#else - m_pDrawWidget->GetFramework().PrepareToShutdown(); -#endif // USE_DRAPE e->accept(); } diff --git a/qt/mainwindow.hpp b/qt/mainwindow.hpp index ce3cad23cb..2b8e4f5161 100644 --- a/qt/mainwindow.hpp +++ b/qt/mainwindow.hpp @@ -1,6 +1,6 @@ #pragma once -#include "map/location_state.hpp" +#include "platform/location.hpp" #include "platform/location_service.hpp" #include "std/unique_ptr.hpp" @@ -12,29 +12,19 @@ #include #endif - - class QDockWidget; namespace search { class Result; } namespace qt { -#ifndef USE_DRAPE class DrawWidget; -#else - class DrapeSurface; -#endif // USE_DRAPE class MainWindow : public QMainWindow, location::LocationObserver { QAction * m_pMyPositionAction; QAction * m_pSearchAction; -#ifndef USE_DRAPE DrawWidget * m_pDrawWidget; -#else - DrapeSurface * m_pDrawWidget; -#endif // USE_DRAPE QDockWidget * m_Docks[1]; @@ -54,7 +44,7 @@ namespace qt void SaveState(); void LoadState(); - void LocationStateModeChanged(location::State::Mode mode); + void LocationStateModeChanged(location::EMyPositionMode mode); protected: void CreatePanelImpl(size_t i, Qt::DockWidgetArea area, QString const & name, @@ -78,5 +68,7 @@ namespace qt void OnAbout(); void OnMyPosition(); void OnSearchButtonClicked(); + + void OnBeforeEngineCreation(); }; } diff --git a/qt/qt.pro b/qt/qt.pro index 239ee0ca96..58d2f09ca7 100644 --- a/qt/qt.pro +++ b/qt/qt.pro @@ -1,15 +1,11 @@ # Main application in qt. ROOT_DIR = .. -DEPENDENCIES = map render gui routing search storage indexer graphics platform anim geometry coding base \ +DEPENDENCIES = map drape_frontend routing search storage indexer drape platform geometry coding base \ freetype expat fribidi tomcrypt jansson protobuf osrm stats_client minizip succinct DEPENDENCIES += opening_hours \ -drape { - DEPENDENCIES *= drape_frontend drape -} - include($$ROOT_DIR/common.pri) TARGET = MAPS.ME @@ -68,10 +64,12 @@ CLASSIFICATOR_RES.path = $$DATADIR CLASSIFICATOR_RES.files = ../data/classificator.txt \ ../data/types.txt \ ../data/drules_proto.bin +DEFAULT_SKIN_RES.path = $$DATADIR/resources-default +DEFAULT_SKIN_RES.files = ../resources-default/default.ui MDPI_SKIN_RES.path = $$DATADIR/resources-mdpi -MDPI_SKIN_RES.files = ../data/resources-mdpi/basic.skn ../data/resources-mdpi/symbols.png +MDPI_SKIN_RES.files = ../data/resources-mdpi/symbols.sdf ../data/resources-mdpi/symbols.png XHDPI_SKIN_RES.path = $$DATADIR/resources-xhdpi -XHDPI_SKIN_RES.files = ../data/resources-xhdpi/basic.skn ../data/resources-xhdpi/symbols.png +XHDPI_SKIN_RES.files = ../data/resources-xhdpi/symbols.sdf ../data/resources-xhdpi/symbols.png FONT_RES.path = $$FONTSDIR FONT_RES.files = ../data/00_roboto_regular.ttf \ @@ -90,6 +88,7 @@ MWM_RES.path = $$DATADIR MWM_RES.files = ../data/World.mwm ../data/WorldCoasts.mwm ALL_RESOURCES = OTHER_RES CLASSIFICATOR_RES MDPI_SKIN_RES XHDPI_SKIN_RES FONT_RES MWM_RES +#ALL_RESOURCES += DEFAULT_SKIN_RES linux* { INSTALLS += $$ALL_RESOURCES @@ -110,17 +109,11 @@ SOURCES += \ preferences_dialog.cpp \ search_panel.cpp \ update_dialog.cpp \ - -CONFIG(drape){ - SOURCES += \ - drape_surface.cpp \ qtoglcontext.cpp \ qtoglcontextfactory.cpp \ -} HEADERS += \ mainwindow.hpp \ - widgets.hpp \ draw_widget.hpp \ proxystyle.hpp \ slider_ctrl.hpp \ @@ -129,12 +122,7 @@ HEADERS += \ preferences_dialog.hpp \ search_panel.hpp \ update_dialog.hpp \ - -CONFIG(drape){ - HEADERS += \ - drape_surface.hpp \ qtoglcontext.hpp \ qtoglcontextfactory.hpp \ -} RESOURCES += res/resources.qrc diff --git a/qt/qtoglcontext.cpp b/qt/qtoglcontext.cpp index 0ae989938e..3d7ac83df4 100644 --- a/qt/qtoglcontext.cpp +++ b/qt/qtoglcontext.cpp @@ -2,48 +2,127 @@ #include "base/assert.hpp" #include "base/logging.hpp" +#include "base/macros.hpp" +#include "base/math.hpp" #include "drape/glfunctions.hpp" -QtOGLContext::QtOGLContext(QWindow * surface, QtOGLContext * contextToShareWith) +QtRenderOGLContext::QtRenderOGLContext(QOpenGLContext * rootContext, QOffscreenSurface * surface) + : m_surface(surface) { - m_isContextCreated = false; - m_surface = surface; - m_nativeContext = new QOpenGLContext(); - - if (contextToShareWith != NULL) - m_nativeContext->setShareContext(contextToShareWith->m_nativeContext); - - m_nativeContext->setFormat(m_surface->requestedFormat()); - ASSERT(m_surface->isExposed(), ()); - VERIFY(m_nativeContext->create(), ()); + m_ctx = new QOpenGLContext(); + m_ctx->setFormat(rootContext->format()); + m_ctx->setShareContext(rootContext); + m_ctx->create(); + ASSERT(m_ctx->isValid(), ()); } -QtOGLContext::~QtOGLContext() +QtRenderOGLContext::~QtRenderOGLContext() { - delete m_nativeContext; + delete m_frontFrame; + delete m_backFrame; + delete m_ctx; } -void QtOGLContext::makeCurrent() +void QtRenderOGLContext::present() { - ASSERT(m_nativeContext->isValid(), ()); - m_nativeContext->makeCurrent(m_surface); + if (!m_resizeLock) + lockFrame(); -#ifdef DEBUG - LOG(LDEBUG, ("Current context : ", m_nativeContext)); - QList list = QOpenGLContextGroup::currentContextGroup()->shares(); - for (int i = 0; i < list.size(); ++i) - LOG(LDEBUG, ("Share context : ", list[i])); -#endif + m_resizeLock = false; + GLFunctions::glFinish(); + + swap(m_frontFrame, m_backFrame); + unlockFrame(); } -void QtOGLContext::present() +void QtRenderOGLContext::makeCurrent() { - m_nativeContext->makeCurrent(m_surface); - m_nativeContext->swapBuffers(m_surface); + VERIFY(m_ctx->makeCurrent(m_surface), ()); } -void QtOGLContext::setDefaultFramebuffer() +void QtRenderOGLContext::doneCurrent() { - GLFunctions::glBindFramebuffer(GL_FRAMEBUFFER, 0); + m_ctx->doneCurrent(); +} + +void QtRenderOGLContext::setDefaultFramebuffer() +{ + if (m_backFrame == nullptr) + return; + + m_backFrame->bind(); +} + +void QtRenderOGLContext::resize(int w, int h) +{ + lockFrame(); + m_resizeLock = true; + + delete m_frontFrame; + delete m_backFrame; + + QSize size(my::NextPowOf2(w), my::NextPowOf2(h)); + m_texRect = QRectF(0.0, 0.0, w / (float)size.width(), h / (float)size.height()); + + m_frontFrame = new QOpenGLFramebufferObject(size, QOpenGLFramebufferObject::Depth); + m_backFrame = new QOpenGLFramebufferObject(size, QOpenGLFramebufferObject::Depth); +} + +void QtRenderOGLContext::lockFrame() +{ + m_lock.lock(); +} + +QRectF const & QtRenderOGLContext::getTexRect() const +{ + return m_texRect; +} + +GLuint QtRenderOGLContext::getTextureHandle() const +{ + if (m_frontFrame == nullptr) + return 0; + + return m_frontFrame->texture(); +} + +void QtRenderOGLContext::unlockFrame() +{ + m_lock.unlock(); +} + +QtUploadOGLContext::QtUploadOGLContext(QOpenGLContext * rootContext, QOffscreenSurface * surface) + : m_surface(surface) +{ + m_ctx = new QOpenGLContext(); + m_ctx->setFormat(rootContext->format()); + m_ctx->setShareContext(rootContext); + m_ctx->create(); + ASSERT(m_ctx->isValid(), ()); +} + +QtUploadOGLContext::~QtUploadOGLContext() +{ + delete m_ctx; +} + +void QtUploadOGLContext::makeCurrent() +{ + m_ctx->makeCurrent(m_surface); +} + +void QtUploadOGLContext::doneCurrent() +{ + m_ctx->doneCurrent(); +} + +void QtUploadOGLContext::present() +{ + ASSERT(false, ()); +} + +void QtUploadOGLContext::setDefaultFramebuffer() +{ + ASSERT(false, ()); } diff --git a/qt/qtoglcontext.hpp b/qt/qtoglcontext.hpp index 2bc7000de3..1e4ac1dab4 100644 --- a/qt/qtoglcontext.hpp +++ b/qt/qtoglcontext.hpp @@ -1,22 +1,53 @@ #pragma once #include "drape/oglcontext.hpp" +#include "std/mutex.hpp" -#include +#include +#include #include -class QtOGLContext: public dp::OGLContext +class QtRenderOGLContext : public dp::OGLContext { public: - QtOGLContext(QWindow * surface, QtOGLContext * contextToShareWith); - ~QtOGLContext(); + QtRenderOGLContext(QOpenGLContext * rootContext, QOffscreenSurface * surface); + ~QtRenderOGLContext(); - virtual void present(); - virtual void makeCurrent(); - virtual void setDefaultFramebuffer(); + void present() override; + void makeCurrent() override; + void doneCurrent() override; + void setDefaultFramebuffer() override; + void resize(int w, int h) override; + + void lockFrame(); + GLuint getTextureHandle() const; + QRectF const & getTexRect() const; + void unlockFrame(); private: - QOpenGLContext * m_nativeContext; - QWindow * m_surface; - bool m_isContextCreated; + QOffscreenSurface * m_surface = nullptr; + QOpenGLContext * m_ctx = nullptr; + + QOpenGLFramebufferObject * m_frontFrame = nullptr; + QOpenGLFramebufferObject * m_backFrame = nullptr; + QRectF m_texRect = QRectF(0.0, 0.0, 0.0, 0.0); + + mutex m_lock; + bool m_resizeLock = false; +}; + +class QtUploadOGLContext: public dp::OGLContext +{ +public: + QtUploadOGLContext(QOpenGLContext * rootContext, QOffscreenSurface * surface); + ~QtUploadOGLContext(); + + void present() override; + void makeCurrent() override; + void doneCurrent() override; + void setDefaultFramebuffer() override; + +private: + QOpenGLContext * m_ctx = nullptr; + QOffscreenSurface * m_surface = nullptr; }; diff --git a/qt/qtoglcontextfactory.cpp b/qt/qtoglcontextfactory.cpp index 21f0224f2e..2d8093da53 100644 --- a/qt/qtoglcontextfactory.cpp +++ b/qt/qtoglcontextfactory.cpp @@ -2,30 +2,77 @@ #include "base/assert.hpp" -QtOGLContextFactory::QtOGLContextFactory(QWindow * surface) - : m_surface(surface) - , m_drawContext(NULL) - , m_uploadContext(NULL) -{} +QtOGLContextFactory::QtOGLContextFactory(QOpenGLContext * rootContext) + : m_rootContext(rootContext) + , m_drawContext(nullptr) + , m_uploadContext(nullptr) +{ + m_uploadSurface = createSurface(); + m_drawSurface = createSurface(); +} QtOGLContextFactory::~QtOGLContextFactory() { delete m_drawContext; delete m_uploadContext; + + m_drawSurface->destroy(); + m_uploadSurface->destroy(); + + delete m_drawSurface; + delete m_uploadSurface; +} + +bool QtOGLContextFactory::LockFrame() +{ + if (m_drawContext == nullptr) + return false; + + m_drawContext->lockFrame(); + return true; +} + +QRectF const & QtOGLContextFactory::GetTexRect() const +{ + ASSERT(m_drawContext != nullptr, ()); + return m_drawContext->getTexRect(); +} + +GLuint QtOGLContextFactory::GetTextureHandle() const +{ + ASSERT(m_drawContext != nullptr, ()); + return m_drawContext->getTextureHandle(); +} + +void QtOGLContextFactory::UnlockFrame() +{ + ASSERT(m_drawContext != nullptr, ()); + m_drawContext->unlockFrame(); } dp::OGLContext * QtOGLContextFactory::getDrawContext() { - if (m_drawContext == NULL) - m_drawContext = new QtOGLContext(m_surface, m_uploadContext); + if (m_drawContext == nullptr) + m_drawContext = new QtRenderOGLContext(m_rootContext, m_drawSurface); return m_drawContext; } dp::OGLContext * QtOGLContextFactory::getResourcesUploadContext() { - if (m_uploadContext == NULL) - m_uploadContext = new QtOGLContext(m_surface, m_drawContext); + if (m_uploadContext == nullptr) + m_uploadContext = new QtUploadOGLContext(m_rootContext, m_uploadSurface); return m_uploadContext; } + +QOffscreenSurface * QtOGLContextFactory::createSurface() +{ + QSurfaceFormat format = m_rootContext->format(); + QOffscreenSurface * result = new QOffscreenSurface(m_rootContext->screen()); + result->setFormat(format); + result->create(); + ASSERT(result->isValid(), ()); + + return result; +} diff --git a/qt/qtoglcontextfactory.hpp b/qt/qtoglcontextfactory.hpp index 8ddb667244..16bb0c7362 100644 --- a/qt/qtoglcontextfactory.hpp +++ b/qt/qtoglcontextfactory.hpp @@ -3,19 +3,33 @@ #include "drape/oglcontextfactory.hpp" #include "qt/qtoglcontext.hpp" -#include +#include +#include class QtOGLContextFactory : public dp::OGLContextFactory { public: - QtOGLContextFactory(QWindow * surface); + QtOGLContextFactory(QOpenGLContext * rootContext); ~QtOGLContextFactory(); + bool LockFrame(); + GLuint GetTextureHandle() const; + QRectF const & GetTexRect() const; + void UnlockFrame(); + virtual dp::OGLContext * getDrawContext(); virtual dp::OGLContext * getResourcesUploadContext(); +protected: + virtual bool isDrawContextCreated() const { return m_drawContext != nullptr; } + virtual bool isUploadContextCreated() const { return m_uploadContext != nullptr; } + + QOffscreenSurface * createSurface(); + private: - QWindow * m_surface; - QtOGLContext * m_drawContext; - QtOGLContext * m_uploadContext; + QOpenGLContext * m_rootContext; + QtRenderOGLContext * m_drawContext; + QOffscreenSurface * m_drawSurface; + QtUploadOGLContext * m_uploadContext; + QOffscreenSurface * m_uploadSurface; }; diff --git a/qt/search_panel.cpp b/qt/search_panel.cpp index f41150ec14..1888b00033 100644 --- a/qt/search_panel.cpp +++ b/qt/search_panel.cpp @@ -247,7 +247,6 @@ void SearchPanel::OnSearchPanelItemClicked(int row, int) void SearchPanel::hideEvent(QHideEvent *) { m_pDrawWidget->GetFramework().CancelInteractiveSearch(); - m_pDrawWidget->CloseSearch(); } void SearchPanel::OnAnimationTimer() diff --git a/qt_tstfrm/gl_test_widget.hpp b/qt_tstfrm/gl_test_widget.hpp deleted file mode 100644 index 459ce880ee..0000000000 --- a/qt_tstfrm/gl_test_widget.hpp +++ /dev/null @@ -1,217 +0,0 @@ -#pragma once - -#include "tstwidgets.hpp" - -#include "testing/testing.hpp" - -#include "map/qgl_render_context.hpp" - -#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) - #include -#else - #include -#endif - -template -struct key_event_fn_bind -{ - typedef T type; -}; - -template -struct mouse_event_fn_bind -{ - typedef T type; -}; - -template -struct void_fn_bind -{ - typedef T type; -}; - -template )> -struct init_with_context_fn_bind -{ - typedef T type; -}; - -template -struct has_on_keypress -{ - static const bool value = false; -}; - -template -struct has_on_keypress::type> -{ - static const bool value = true; -}; - -template -struct has_on_mousemove -{ - static const bool value = false; -}; - -template -struct has_on_mousemove::type > -{ - static const bool value = true; -}; - -template -struct has_on_mousepress -{ - static bool const value = false; -}; - -template -struct has_on_mousepress::type > -{ - static const bool value = true; -}; - -template -struct has_init -{ - static bool const value = false; -}; - -template -struct has_init::type > -{ - static const bool value = true; -}; - -template -struct has_init_with_context -{ - static bool const value = false; -}; - -template -struct has_init_with_context::type, RC > -{ - static const bool value = true; -}; - -template -struct bool_tag{}; - -template -class GLTestWidget : public tst::GLDrawWidget -{ -public: - - TTest test; - - typedef tst::GLDrawWidget base_type; - - virtual void DoDraw(shared_ptr const & p) - { - p->beginFrame(); - p->clear(graphics::Color(182, 182, 182, 255)); - test.DoDraw(p); - p->endFrame(); - } - - virtual void DoResize(int, int) - { - } - - bool keyPressEventImpl(QKeyEvent * ev, bool_tag const &) - { - return test.OnKeyPress(ev); - } - - bool keyPressEventImpl(QKeyEvent *, bool_tag const & ) - { - return false; - } - - virtual void keyPressEvent(QKeyEvent * ev) - { - if (keyPressEventImpl(ev, bool_tag::value >())) - repaint(); - } - - bool mousePressEventImpl(QMouseEvent * ev, bool_tag const &) - { - return test.OnMousePress(ev); - } - - bool mousePressEventImpl(QMouseEvent *, bool_tag const &) - { - return false; - } - - virtual void mousePressEvent(QMouseEvent * ev) - { - if (mousePressEventImpl(ev, bool_tag::value >())) - repaint(); - } - - bool mouseMoveEventImpl(QMouseEvent * ev, bool_tag const &) - { - return test.OnMouseMove(ev); - } - - bool mouseMoveEventImpl(QMouseEvent *, bool_tag const &) - { - return false; - } - - void mouseMoveEvent(QMouseEvent * ev) - { - if (mouseMoveEventImpl(ev, bool_tag::value >())) - repaint(); - } - - void InitImpl(bool_tag const & ) - { - test.Init(); - } - - void InitImpl(bool_tag const & ) - {} - - void Init() - { - InitImpl(bool_tag::value >()); - } - - void InitWithContextImpl(bool_tag const &) - { - test.Init(shared_ptr(new qt::gl::RenderContext(this))); - } - - void InitWithContextImpl(bool_tag const &) - {} - - void initializeGL() - { - tst::GLDrawWidget::initializeGL(); - InitWithContextImpl(bool_tag::value>()); - } -}; - -template QWidget * create_widget() -{ - GLTestWidget * w = new GLTestWidget(); - w->Init(); - return w; -} - -#define UNIT_TEST_GL(name)\ - void UnitTestGL_##name();\ - TestRegister g_TestRegister_##name("Test::"#name, __FILE__, &UnitTestGL_##name);\ - void UnitTestGL_##name()\ - {\ - char * argv[] = { const_cast(#name) };\ - int argc = 1;\ - QApplication app(argc, argv);\ - QWidget * w = create_widget();\ - w->show();\ - app.exec();\ - } diff --git a/qt_tstfrm/gui_test_widget.hpp b/qt_tstfrm/gui_test_widget.hpp deleted file mode 100644 index 6596c8a91d..0000000000 --- a/qt_tstfrm/gui_test_widget.hpp +++ /dev/null @@ -1,157 +0,0 @@ -#pragma once - -#include "gl_test_widget.hpp" -#include "gui/controller.hpp" -#include "base/strings_bundle.hpp" -#include -#include -#include - -template -struct init_with_controller_fn_bind -{ - typedef T type; -}; - -template -struct has_init_with_controller -{ - static bool const value = false; -}; - -template -struct has_init_with_controller::type> -{ - static bool const value = true; -}; - -template -class GUITestWidget : public GLTestWidget -{ -private: - - typedef GLTestWidget base_t; - - shared_ptr m_controller; - shared_ptr m_cacheScreen; - shared_ptr m_stringBundle; - - shared_ptr m_timerObj; - int m_timerID; - -public: - - void invalidate() - { - base_t::updateGL(); - } - - void initializeGL() - { - m_timerObj.reset(new QObject()); - m_timerObj->installEventFilter(this); - m_timerID = m_timerObj->startTimer(1000 / 60); - - base_t::initializeGL(); - - m_controller.reset(new gui::Controller()); - - gui::Controller::RenderParams rp; - - graphics::Screen::Params cp; - - cp.m_threadSlot = 0; - cp.m_storageType = graphics::ETinyStorage; - cp.m_textureType = graphics::ESmallTexture; - cp.m_resourceManager = base_t::m_resourceManager; - cp.m_renderContext = base_t::m_primaryContext; - - m_cacheScreen.reset(new graphics::Screen(cp)); - - rp.m_CacheScreen = m_cacheScreen.get(); - rp.m_GlyphCache = base_t::m_resourceManager->glyphCache(0); - rp.m_InvalidateFn = bind(&GUITestWidget::invalidate, this); - rp.m_Density = graphics::EDensityMDPI; - - m_stringBundle.reset(new StringsBundle()); - m_stringBundle->SetDefaultString("country_status_download", "Download^"); - - m_controller->SetStringsBundle(m_stringBundle.get()); - - InitImpl(m_controller, bool_tag::value >()); - - m_controller->SetRenderParams(rp); - } - - void InitImpl(shared_ptr const & c, bool_tag const &) - { - base_t::test.Init(c.get()); - } - - void InitImpl(shared_ptr const & c, bool_tag const &) - {} - - void DoDraw(shared_ptr const & s) - { - base_t::DoDraw(s); - m_controller->UpdateElements(); - m_controller->DrawFrame(s.get()); - } - - void mousePressEvent(QMouseEvent * e) - { - base_t::mousePressEvent(e); - - if (e->button() == Qt::LeftButton) - m_controller->OnTapStarted(m2::PointU(e->pos().x(), e->pos().y())); - } - - void mouseReleaseEvent(QMouseEvent * e) - { - base_t::mouseReleaseEvent(e); - - if (e->button() == Qt::LeftButton) - m_controller->OnTapEnded(m2::PointU(e->pos().x(), e->pos().y())); - } - - void mouseMoveEvent(QMouseEvent * e) - { - base_t::mouseMoveEvent(e); - - m_controller->OnTapMoved(m2::PointU(e->pos().x(), e->pos().y())); - } - - bool eventFilter(QObject * obj, QEvent *event) - { - if (obj == m_timerObj.get() && event->type() == QEvent::Timer) - { - if (((QTimerEvent *)event)->timerId() == m_timerID) - { - invalidate(); - return true; - } - } - - return false; - } -}; - -template QWidget * create_gui_test_widget() -{ - GUITestWidget * w = new GUITestWidget(); - w->Init(); - return w; -} - -#define UNIT_TEST_GUI(name)\ - void UnitTestGUI_##name();\ - TestRegister g_TestRegisterGUI_##name("Test::"#name, __FILE__, &UnitTestGUI_##name);\ - void UnitTestGUI_##name()\ - {\ - char * argv[] = { const_cast(#name) };\ - int argc = 1;\ - QApplication app(argc, argv);\ - QWidget * w = create_gui_test_widget();\ - w->show();\ - app.exec();\ - } diff --git a/qt_tstfrm/macros.hpp b/qt_tstfrm/macros.hpp deleted file mode 100644 index 23b349daf9..0000000000 --- a/qt_tstfrm/macros.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "qt_tstfrm/gl_test_widget.hpp" diff --git a/qt_tstfrm/qt_tstfrm.pro b/qt_tstfrm/qt_tstfrm.pro index f55ba065ee..9525500b23 100644 --- a/qt_tstfrm/qt_tstfrm.pro +++ b/qt_tstfrm/qt_tstfrm.pro @@ -9,14 +9,9 @@ include($$ROOT_DIR/common.pri) QT *= core gui widgets opengl HEADERS += \ - tstwidgets.hpp \ - macros.hpp \ - gl_test_widget.hpp \ - gui_test_widget.hpp \ test_main_loop.hpp \ SOURCES += \ - tstwidgets.cpp \ test_main_loop.cpp \ diff --git a/qt_tstfrm/tstwidgets.cpp b/qt_tstfrm/tstwidgets.cpp deleted file mode 100644 index 3932f4d15e..0000000000 --- a/qt_tstfrm/tstwidgets.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "qt_tstfrm/tstwidgets.hpp" - -#include "render/render_policy.hpp" - -#include "graphics/screen.hpp" -#include "graphics/resource_manager.hpp" - -#include "graphics/opengl/utils.hpp" -#include "graphics/opengl/framebuffer.hpp" -#include "graphics/opengl/renderbuffer.hpp" -#include "graphics/opengl/opengl.hpp" - -#include "platform/platform.hpp" - -namespace tst -{ - void GLDrawWidget::initializeGL() - { - try - { - graphics::gl::InitExtensions(); - graphics::gl::CheckExtensionSupport(); - } - catch (graphics::gl::platform_unsupported & e) - { - /// TODO: Show "Please Update Drivers" dialog and close the program. - } - - m_primaryContext.reset(new qt::gl::RenderContext(this)); - - graphics::ResourceManager::Params rmp; - rmp.m_texFormat = graphics::Data8Bpp; - - rmp.m_videoMemoryLimit = 20 * 1024 * 1024; - - graphics::ResourceManager::StoragePoolParams spp; - graphics::ResourceManager::TexturePoolParams tpp; - - spp = graphics::ResourceManager::StoragePoolParams(30000 * sizeof(graphics::gl::Vertex), - sizeof(graphics::gl::Vertex), - 50000 * sizeof(unsigned short), - sizeof(unsigned short), - 1, - graphics::ELargeStorage, - true); - - rmp.m_storageParams[graphics::ELargeStorage] = spp; - - spp = graphics::ResourceManager::StoragePoolParams(3000 * sizeof(graphics::gl::Vertex), - sizeof(graphics::gl::Vertex), - 5000 * sizeof(unsigned short), - sizeof(unsigned short), - 1, - graphics::EMediumStorage, - true); - - rmp.m_storageParams[graphics::EMediumStorage] = spp; - - spp = graphics::ResourceManager::StoragePoolParams(500 * sizeof(graphics::gl::Vertex), - sizeof(graphics::gl::Vertex), - 500 * sizeof(unsigned short), - sizeof(unsigned short), - 1, - graphics::ESmallStorage, - true); - - rmp.m_storageParams[graphics::ESmallStorage] = spp; - - spp = graphics::ResourceManager::StoragePoolParams(100 * sizeof(graphics::gl::Vertex), - sizeof(graphics::gl::Vertex), - 200 * sizeof(unsigned short), - sizeof(unsigned short), - 1, - graphics::ETinyStorage, - true); - - rmp.m_storageParams[graphics::ETinyStorage] = spp; - - - tpp = graphics::ResourceManager::TexturePoolParams(512, - 512, - 1, - rmp.m_texFormat, - graphics::ELargeTexture, - true); - - rmp.m_textureParams[graphics::ELargeTexture] = tpp; - - tpp = graphics::ResourceManager::TexturePoolParams(256, - 256, - 1, - rmp.m_texFormat, - graphics::EMediumTexture, - true); - - rmp.m_textureParams[graphics::EMediumTexture] = tpp; - - tpp = graphics::ResourceManager::TexturePoolParams(128, - 128, - 1, - rmp.m_texFormat, - graphics::ESmallTexture, - true); - - rmp.m_textureParams[graphics::ESmallTexture] = tpp; - - - rmp.m_glyphCacheParams = GetResourceGlyphCacheParams(graphics::EDensityMDPI); - - rmp.m_threadSlotsCount = 1; - rmp.m_renderThreadsCount = 0; - - rmp.m_useSingleThreadedOGL = false; - - m_resourceManager.reset(new graphics::ResourceManager(rmp, "basic.skn", graphics::EDensityMDPI)); - - m_primaryContext->setResourceManager(m_resourceManager); - m_primaryContext->startThreadDrawing(0); - - Platform::FilesList fonts; - GetPlatform().GetFontNames(fonts); - m_resourceManager->addFonts(fonts); - - graphics::Screen::Params params; - - m_primaryFrameBuffer.reset(new graphics::gl::FrameBuffer(true)); - - params.m_frameBuffer = m_primaryFrameBuffer; - params.m_resourceManager = m_resourceManager; - params.m_threadSlot = m_resourceManager->guiThreadSlot(); - params.m_renderContext = m_primaryContext; - - m_primaryScreen.reset(new graphics::Screen(params)); - } - - void GLDrawWidget::resizeGL(int w, int h) - { - m_primaryScreen->onSize(w, h); - m_primaryFrameBuffer->onSize(w, h); - } - - void GLDrawWidget::paintGL() - { - DoDraw(m_primaryScreen); - } -} diff --git a/qt_tstfrm/tstwidgets.hpp b/qt_tstfrm/tstwidgets.hpp deleted file mode 100644 index a02ab3fa47..0000000000 --- a/qt_tstfrm/tstwidgets.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include "graphics/opengl/texture.hpp" -#include "graphics/opengl/renderbuffer.hpp" -#include "graphics/opengl/framebuffer.hpp" - -#include "graphics/screen.hpp" - -#include "graphics/resource_manager.hpp" - -#include "map/qgl_render_context.hpp" - -#include "std/shared_ptr.hpp" - -#include - -namespace graphics -{ - namespace gl - { - class Screen; - } -} - -namespace tst -{ - class GLDrawWidget : public QGLWidget - { - public: - - shared_ptr m_resourceManager; - - shared_ptr m_primaryFrameBuffer; - shared_ptr m_primaryContext; - shared_ptr m_primaryScreen; - - virtual void initializeGL(); - virtual void resizeGL(int w, int h); - virtual void paintGL(); - - public: - - virtual void DoDraw(shared_ptr const & screen) = 0; - }; -} diff --git a/render/area_info.hpp b/render/area_info.hpp deleted file mode 100644 index f6f4c9bc17..0000000000 --- a/render/area_info.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include "geometry/point2d.hpp" - -#include "std/vector.hpp" -#include "std/algorithm.hpp" - -namespace di -{ - class AreaInfo - { - m2::PointD m_center; - - public: - vector m_path; - - void reserve(size_t ptsCount) - { - m_path.reserve(ptsCount); - } - - void swap(AreaInfo & r) - { - m_path.swap(r.m_path); - std::swap(m_center, r.m_center); - } - - void push_back(m2::PointD const & pt) - { - m_path.push_back(pt); - } - - size_t size() const { return m_path.size(); } - - void SetCenter(m2::PointD const & p) { m_center = p; } - m2::PointD GetCenter() const { return m_center; } - }; -} - -inline void swap(di::AreaInfo & p1, di::AreaInfo & p2) -{ - p1.swap(p2); -} diff --git a/render/basic_tiling_render_policy.cpp b/render/basic_tiling_render_policy.cpp deleted file mode 100644 index 094a45c110..0000000000 --- a/render/basic_tiling_render_policy.cpp +++ /dev/null @@ -1,230 +0,0 @@ -#include "basic_tiling_render_policy.hpp" -#include "tile_renderer.hpp" -#include "coverage_generator.hpp" -#include "queued_renderer.hpp" -#include "scales_processor.hpp" - -#include "platform/platform.hpp" - -#include "indexer/scales.hpp" - - -BasicTilingRenderPolicy::BasicTilingRenderPolicy(Params const & p, - bool doUseQueuedRenderer) - : RenderPolicy(p, m_cpuCoresCount + 2), - m_IsEmptyModel(false), - m_IsNavigating(false), - m_WasAnimatingLastFrame(false), - m_DoRecreateCoverage(false) -{ - m_TileSize = ScalesProcessor::CalculateTileSize(p.m_screenWidth, p.m_screenHeight); - - LOG(LDEBUG, ("ScreenSize=", p.m_screenWidth, "x", p.m_screenHeight, ", TileSize=", m_TileSize)); - - if (doUseQueuedRenderer) - m_QueuedRenderer.reset(new QueuedRenderer(m_cpuCoresCount + 1, p.m_primaryRC)); -} - -void BasicTilingRenderPolicy::BeginFrame(shared_ptr const & e, ScreenBase const & s) -{ - RenderPolicy::BeginFrame(e, s); - - if (m_QueuedRenderer) - m_QueuedRenderer->BeginFrame(); -} - -void BasicTilingRenderPolicy::CheckAnimationTransition() -{ - // transition from non-animating to animating, - // should stop all background work - if (!m_WasAnimatingLastFrame && IsAnimating()) - PauseBackgroundRendering(); - - // transition from animating to non-animating - // should resume all background work - if (m_WasAnimatingLastFrame && !IsAnimating()) - ResumeBackgroundRendering(); - - m_WasAnimatingLastFrame = IsAnimating(); -} - -void BasicTilingRenderPolicy::DrawFrame(shared_ptr const & e, ScreenBase const & s) -{ -#ifndef USE_DRAPE - if (m_QueuedRenderer) - { - m_QueuedRenderer->DrawFrame(); - m_resourceManager->updatePoolState(); - } - - CheckAnimationTransition(); - - /// checking, whether we should add the CoverScreen command - - bool doForceUpdate = DoForceUpdate(); - bool doIntersectInvalidRect = GetInvalidRect().IsIntersect(s.GlobalRect()); - - bool doForceUpdateFromGenerator = m_CoverageGenerator->DoForceUpdate(); - - if (doForceUpdate) - m_CoverageGenerator->InvalidateTiles(GetInvalidRect(), scales::GetUpperWorldScale() + 1); - - if (!m_IsNavigating && (!IsAnimating())) - m_CoverageGenerator->CoverScreen(s, - doForceUpdateFromGenerator - || m_DoRecreateCoverage - || (doForceUpdate && doIntersectInvalidRect)); - - SetForceUpdate(false); - m_DoRecreateCoverage = false; - - /// rendering current coverage - - graphics::Screen * pScreen = GPUDrawer::GetScreen(e->drawer()); - - ScalesProcessor scales; - scales.SetParams(VisualScale(), m_TileSize); - int const drawingScale = scales.GetDrawTileScale(s); - ASSERT(0 <= drawingScale && drawingScale < m_bgColors.size(), ()); - - pScreen->beginFrame(); - pScreen->clear(m_bgColors[drawingScale]); - - FrameLock(); - - m_CoverageGenerator->Draw(pScreen, s); - - m_IsEmptyModel = m_CoverageGenerator->IsEmptyDrawing(); - - pScreen->endFrame(); -#endif // USE_DRAPE -} - -void BasicTilingRenderPolicy::EndFrame(shared_ptr const & e, ScreenBase const & s) -{ - FrameUnlock(); - - if (m_QueuedRenderer) - m_QueuedRenderer->EndFrame(); - - RenderPolicy::EndFrame(e, s); -} - -TileRenderer & BasicTilingRenderPolicy::GetTileRenderer() -{ - return *m_TileRenderer.get(); -} - -void BasicTilingRenderPolicy::PauseBackgroundRendering() -{ - m_TileRenderer->SetIsPaused(true); - m_TileRenderer->CancelCommands(); - m_CoverageGenerator->Pause(); - if (m_QueuedRenderer) - m_QueuedRenderer->SetPartialExecution(m_cpuCoresCount, true); -} - -void BasicTilingRenderPolicy::ResumeBackgroundRendering() -{ - m_TileRenderer->SetIsPaused(false); - m_CoverageGenerator->Resume(); - m_DoRecreateCoverage = true; - if (m_QueuedRenderer) - m_QueuedRenderer->SetPartialExecution(m_cpuCoresCount, false); -} - -void BasicTilingRenderPolicy::StartNavigation() -{ - m_IsNavigating = true; - PauseBackgroundRendering(); -} - -void BasicTilingRenderPolicy::StopNavigation() -{ - m_IsNavigating = false; - ResumeBackgroundRendering(); -} - -void BasicTilingRenderPolicy::StartScale() -{ - StartNavigation(); -} - -void BasicTilingRenderPolicy::StopScale() -{ - StopNavigation(); - RenderPolicy::StopScale(); -} - -void BasicTilingRenderPolicy::StartDrag() -{ - StartNavigation(); -} - -void BasicTilingRenderPolicy::StopDrag() -{ - StopNavigation(); - RenderPolicy::StopDrag(); -} - -void BasicTilingRenderPolicy::StartRotate(double a, double timeInSec) -{ - StartNavigation(); -} - -void BasicTilingRenderPolicy::StopRotate(double a, double timeInSec) -{ - StopNavigation(); - RenderPolicy::StopRotate(a, timeInSec); -} - -bool BasicTilingRenderPolicy::IsTiling() const -{ - return true; -} - -bool BasicTilingRenderPolicy::IsEmptyModel() const -{ - return m_IsEmptyModel; -} - -bool BasicTilingRenderPolicy::NeedRedraw() const -{ - if (RenderPolicy::NeedRedraw()) - return true; - - if (m_QueuedRenderer && m_QueuedRenderer->NeedRedraw()) - return true; - - return false; -} - -size_t BasicTilingRenderPolicy::TileSize() const -{ - return m_TileSize; -} - -void BasicTilingRenderPolicy::FrameLock() -{ - m_CoverageGenerator->Lock(); -} - -void BasicTilingRenderPolicy::FrameUnlock() -{ - m_CoverageGenerator->Unlock(); -} - -graphics::Overlay * BasicTilingRenderPolicy::FrameOverlay() const -{ - return m_CoverageGenerator->GetOverlay(); -} - -int BasicTilingRenderPolicy::InsertBenchmarkFence() -{ - return m_CoverageGenerator->InsertBenchmarkFence(); -} - -void BasicTilingRenderPolicy::JoinBenchmarkFence(int fenceID) -{ - return m_CoverageGenerator->JoinBenchmarkFence(fenceID); -} diff --git a/render/basic_tiling_render_policy.hpp b/render/basic_tiling_render_policy.hpp deleted file mode 100644 index 54bb875329..0000000000 --- a/render/basic_tiling_render_policy.hpp +++ /dev/null @@ -1,84 +0,0 @@ -#pragma once - -#include "render_policy.hpp" - -#include "graphics/overlay.hpp" - -#include "geometry/screenbase.hpp" - -#include "std/shared_ptr.hpp" - - -class TileRenderer; -class CoverageGenerator; -class QueuedRenderer; - -/// This is a base class for a single-threaded and multi-threaded versions of render policies -/// which uses tiles to present a scene. -/// This policies use ScreenCoverage objects to hold all the information, need to render the model -/// at the specified ScreenBase(tiles, texts, symbols, e.t.c) -/// At any moment of time there are a currentCoverage that are drawn in DrawFrame method. -/// There are threads that are responsible for composing new ScreenCoverage from already drawn tiles, -/// and drawing tiles if needed. -/// Once the more recent ScreenCoverage are composed it became a currentCoverage. -class BasicTilingRenderPolicy : public RenderPolicyCpuCountHolder, public RenderPolicy -{ -private: - - size_t CalculateTileSize(size_t screenWidth, size_t screenHeight); - -protected: - - shared_ptr m_QueuedRenderer; - shared_ptr m_TileRenderer; - shared_ptr m_CoverageGenerator; - - ScreenBase m_CurrentScreen; - bool m_IsEmptyModel; - bool m_IsNavigating; - bool m_WasAnimatingLastFrame; - size_t m_TileSize; - bool m_DoRecreateCoverage; - -protected: - - TileRenderer & GetTileRenderer(); - - void StartNavigation(); - void StopNavigation(); - - void PauseBackgroundRendering(); - void ResumeBackgroundRendering(); - void CheckAnimationTransition(); - -public: - - BasicTilingRenderPolicy(Params const & p, - bool doUseQueuedRenderer); - - void BeginFrame(shared_ptr const & ev, ScreenBase const & s); - void DrawFrame(shared_ptr const & ev, ScreenBase const & s); - void EndFrame(shared_ptr const & ev, ScreenBase const & s); - - virtual void StartScale(); - virtual void StopScale(); - - virtual void StartDrag(); - virtual void StopDrag(); - - virtual void StartRotate(double a, double timeInSec); - virtual void StopRotate(double a, double timeInSec); - - bool NeedRedraw() const; - bool IsTiling() const; - bool IsEmptyModel() const; - size_t TileSize() const; - - void FrameLock(); - void FrameUnlock(); - graphics::Overlay * FrameOverlay() const; - - /// benchmarking protocol - int InsertBenchmarkFence(); - void JoinBenchmarkFence(int fenceID); -}; diff --git a/render/coverage_generator.cpp b/render/coverage_generator.cpp deleted file mode 100644 index 924cbce7ad..0000000000 --- a/render/coverage_generator.cpp +++ /dev/null @@ -1,714 +0,0 @@ -#include "coverage_generator.hpp" -#include "tile_renderer.hpp" -#include "tile_set.hpp" - -#include "platform/settings.hpp" -#include "platform/platform.hpp" - -#include "graphics/opengl/gl_render_context.hpp" -#include "graphics/display_list.hpp" - -#include "base/logging.hpp" - -#include "std/bind.hpp" - - -CoverageGenerator::CoverageGenerator(TileRenderer * tileRenderer, - shared_ptr const & windowHandle, - shared_ptr const & primaryRC, - shared_ptr const & rm, - graphics::PacketsQueue * glQueue) - : m_coverageInfo(tileRenderer) - , m_queue(1) - , m_windowHandle(windowHandle) -{ - shared_ptr renderContext; - if (!glQueue) - renderContext.reset(primaryRC->createShared()); - - m_queue.AddInitCommand(bind(&CoverageGenerator::InitializeThreadGL, this, renderContext, rm, glQueue)); - m_queue.AddFinCommand(bind(&CoverageGenerator::FinalizeThreadGL, this, renderContext, rm)); - - m_queue.Start(); - - Settings::Get("IsBenchmarking", m_benchmarkInfo.m_isBenchmarking); - - m_currentCoverage = new CachedCoverageInfo(); - m_backCoverage = new CachedCoverageInfo(); -} - -CoverageGenerator::~CoverageGenerator() -{ - LOG(LDEBUG, ("cancelling coverage thread")); - ClearCoverage(); -} - -void CoverageGenerator::Shutdown() -{ - LOG(LDEBUG, ("shutdown resources")); - m_stateInfo.SetSequenceID(numeric_limits::max()); - m_queue.CancelCommands(); - m_queue.Cancel(); -} - -void CoverageGenerator::InitializeThreadGL(shared_ptr context, - shared_ptr resourceManager, - graphics::PacketsQueue * glQueue) -{ - threads::MutexGuard g(m_stateInfo.m_mutex); - - LOG(LDEBUG, ("initializing CoverageGenerator on it's own thread.")); - - if (context) - { - context->makeCurrent(); - context->startThreadDrawing(resourceManager->cacheThreadSlot()); - } - - graphics::Screen::Params params; - - params.m_resourceManager = resourceManager; - params.m_renderQueue = glQueue; - - params.m_threadSlot = resourceManager->cacheThreadSlot(); - params.m_renderContext = context; - params.m_storageType = graphics::EMediumStorage; - params.m_textureType = graphics::EMediumTexture; - - m_cacheScreen.reset(new graphics::Screen(params)); -} - -void CoverageGenerator::FinalizeThreadGL(shared_ptr context, - shared_ptr resourceManager) -{ - if (context) - context->endThreadDrawing(resourceManager->cacheThreadSlot()); -} - -void CoverageGenerator::Pause() -{ - m_stateInfo.Pause(); - m_queue.CancelCommands(); -} - -void CoverageGenerator::Resume() -{ - m_stateInfo.Resume(); -} - -void CoverageGenerator::InvalidateTiles(m2::AnyRectD const & r, int startScale) -{ - if (m_stateInfo.m_sequenceID == numeric_limits::max()) - return; - - /// this automatically will skip the previous CoverScreen commands - /// and MergeTiles commands from previously generated ScreenCoverages - ++m_stateInfo.m_sequenceID; - - m_queue.AddCommand(bind(&CoverageGenerator::InvalidateTilesImpl, this, r, startScale)); -} - -void CoverageGenerator::CoverScreen(ScreenBase const & screen, bool doForce) -{ - if (screen == m_stateInfo.m_currentScreen && !doForce) - return; - - if (m_stateInfo.m_sequenceID == numeric_limits::max()) - return; - - m_stateInfo.m_currentScreen = screen; - - ++m_stateInfo.m_sequenceID; - - m_queue.AddCommand(bind(&CoverageGenerator::CoverScreenImpl, this, _1, screen, m_stateInfo.m_sequenceID)); -} - -void CoverageGenerator::MergeTile(Tiler::RectInfo const & rectInfo, - int sequenceID) -{ - m_queue.AddCommand(bind(&CoverageGenerator::MergeTileImpl, this, _1, rectInfo, sequenceID)); -} - -void CoverageGenerator::FinishSequenceIfNeeded() -{ - m_queue.AddCommand(bind(&CoverageGenerator::BenchmarkInfo::TryFinishSequence, &m_benchmarkInfo)); -} - -void CoverageGenerator::Lock() -{ - m_stateInfo.m_mutex.Lock(); -} - -void CoverageGenerator::Unlock() -{ - m_stateInfo.m_mutex.Unlock(); -} - -void CoverageGenerator::Draw(graphics::Screen * s, ScreenBase const & screen) -{ - math::Matrix m = m_currentCoverage->m_screen.PtoGMatrix() * screen.GtoPMatrix(); - - ASSERT(m_currentCoverage, ()); - if (m_currentCoverage->m_mainElements) - s->drawDisplayList(m_currentCoverage->m_mainElements, m); - if (m_currentCoverage->m_sharpElements) - s->drawDisplayList(m_currentCoverage->m_sharpElements, m); - - if (m_benchmarkInfo.m_isBenchmarking) - FinishSequenceIfNeeded(); -} - -graphics::Overlay * CoverageGenerator::GetOverlay() const -{ - return m_coverageInfo.m_overlay; -} - -bool CoverageGenerator::IsEmptyDrawing() const -{ - return (m_currentCoverage->m_renderLeafTilesCount <= 0) && m_currentCoverage->m_isEmptyDrawing; -} - -bool CoverageGenerator::IsBackEmptyDrawing() const -{ - return (m_backCoverage->m_renderLeafTilesCount <= 0) && m_backCoverage->m_isEmptyDrawing; -} - -bool CoverageGenerator::DoForceUpdate() const -{ - return m_stateInfo.m_needForceUpdate; -} - -//////////////////////////////////////////////////// -/// Benchmark support -//////////////////////////////////////////////////// -int CoverageGenerator::InsertBenchmarkFence() -{ - return m_benchmarkInfo.InsertBenchmarkFence(); -} - -void CoverageGenerator::JoinBenchmarkFence(int fenceID) -{ - m_benchmarkInfo.JoinBenchmarkFence(fenceID); -} - -//////////////////////////////////////////////////// -/// On Coverage generator thread methods -//////////////////////////////////////////////////// -void CoverageGenerator::CoverScreenImpl(core::CommandsQueue::Environment const & env, - ScreenBase const & screen, - int sequenceID) -{ - if (sequenceID < m_stateInfo.m_sequenceID) - return; - - m_stateInfo.m_currentScreen = screen; - m_backCoverage->m_screen = screen; - m_coverageInfo.m_tiler.seed(screen, screen.GlobalRect().GlobalCenter(), m_coverageInfo.m_tileRenderer->TileSize()); - - ComputeCoverTasks(); - - bool const shouldSwap = !m_stateInfo.m_isPause && CacheCoverage(env); - if (shouldSwap) - { - { - threads::MutexGuard g(m_stateInfo.m_mutex); - swap(m_currentCoverage, m_backCoverage); - } - - m_backCoverage->ResetDL(); - } - else - { - // we should skip all the following MergeTile commands - ++m_stateInfo.m_sequenceID; - } - - m_stateInfo.SetForceUpdate(!shouldSwap); - - m_windowHandle->invalidate(); -} - -void CoverageGenerator::MergeTileImpl(core::CommandsQueue::Environment const & env, - Tiler::RectInfo const & rectInfo, - int sequenceID) -{ - if (sequenceID < m_stateInfo.m_sequenceID) - { - m_coverageInfo.m_tileRenderer->RemoveActiveTile(rectInfo, sequenceID); - return; - } - - m_backCoverage->m_screen = m_stateInfo.m_currentScreen; - m_backCoverage->m_isEmptyDrawing = m_currentCoverage->m_isEmptyDrawing; - m_backCoverage->m_renderLeafTilesCount = m_currentCoverage->m_renderLeafTilesCount; - MergeSingleTile(rectInfo); - - bool const shouldSwap = !m_stateInfo.m_isPause && CacheCoverage(env); - if (shouldSwap) - { - { - threads::MutexGuard g(m_stateInfo.m_mutex); - swap(m_currentCoverage, m_backCoverage); - } - m_backCoverage->ResetDL(); - } - - m_benchmarkInfo.DecrementTileCount(sequenceID); - - m_stateInfo.SetForceUpdate(!shouldSwap); - - m_windowHandle->invalidate(); -} - -void CoverageGenerator::InvalidateTilesImpl(m2::AnyRectD const & r, int startScale) -{ - TileCache & tileCache = m_coverageInfo.m_tileRenderer->GetTileCache(); - tileCache.Lock(); - - { - threads::MutexGuard g(m_stateInfo.m_mutex); - - typedef buffer_vector vector8_t; - vector8_t toRemove; - - for (CoverageInfo::TTileSet::const_iterator it = m_coverageInfo.m_tiles.begin(); - it != m_coverageInfo.m_tiles.end(); - ++it) - { - Tiler::RectInfo const & ri = (*it)->m_rectInfo; - - if (r.IsIntersect(m2::AnyRectD(ri.m_rect)) && (ri.m_tileScale >= startScale)) - { - toRemove.push_back(*it); - tileCache.UnlockTile(ri); - } - } - - for (vector8_t::const_iterator it = toRemove.begin(); - it != toRemove.end(); - ++it) - { - m_coverageInfo.m_tiles.erase(*it); - } - } - - /// here we should copy elements as we've delete some of them later - set k = tileCache.Keys(); - - for (set::const_iterator it = k.begin(); it != k.end(); ++it) - { - Tiler::RectInfo const & ri = *it; - if ((ri.m_tileScale >= startScale) && r.IsIntersect(m2::AnyRectD(ri.m_rect))) - { - ASSERT(tileCache.LockCount(ri) == 0, ()); - tileCache.Remove(ri); - } - } - - tileCache.Unlock(); - - MergeOverlay(); -} - -//////////////////////////////////////////////////////////// -/// Support methods -//////////////////////////////////////////////////////////// -void CoverageGenerator::ComputeCoverTasks() -{ - m_backCoverage->m_isEmptyDrawing = false; - m_backCoverage->m_renderLeafTilesCount = 0; - - vector allRects; - allRects.reserve(16); - buffer_vector newRects; - m_coverageInfo.m_tiler.tiles(allRects, GetPlatform().PreCachingDepth()); - - TileCache & tileCache = m_coverageInfo.m_tileRenderer->GetTileCache(); - tileCache.Lock(); - - int const step = GetPlatform().PreCachingDepth() - 1; - - bool isEmptyDrawingBuf = true; - CoverageInfo::TTileSet tiles; - for (size_t i = 0; i < allRects.size(); ++i) - { - Tiler::RectInfo const & ri = allRects[i]; - - if (!((ri.m_tileScale == m_coverageInfo.m_tiler.tileScale() - step) || - (ri.m_tileScale == m_coverageInfo.m_tiler.tileScale() ))) - { - continue; - } - - if (tileCache.HasTile(ri)) - { - tileCache.TouchTile(ri); - Tile const * tile = &tileCache.GetTile(ri); - ASSERT(tiles.find(tile) == tiles.end(), ()); - - if (m_coverageInfo.m_tiler.isLeaf(ri)) - isEmptyDrawingBuf &= tile->m_isEmptyDrawing; - - tiles.insert(tile); - } - else - { - newRects.push_back(ri); - if (m_coverageInfo.m_tiler.isLeaf(ri)) - ++m_backCoverage->m_renderLeafTilesCount; - } - } - - m_backCoverage->m_isEmptyDrawing = isEmptyDrawingBuf; - - /// computing difference between current and previous coverage - /// tiles, that aren't in current coverage are unlocked to allow their deletion from TileCache - /// tiles, that are new to the current coverage are added into m_tiles and locked in TileCache - - size_t firstTileForAdd = 0; - buffer_vector diff_tiles; - diff_tiles.reserve(m_coverageInfo.m_tiles.size() + tiles.size()); -#ifdef _MSC_VER - vs_bug:: -#endif - set_difference(m_coverageInfo.m_tiles.begin(), m_coverageInfo.m_tiles.end(), - tiles.begin(), tiles.end(), - back_inserter(diff_tiles), tiles.key_comp()); - - firstTileForAdd = diff_tiles.size(); -#ifdef _MSC_VER - vs_bug:: -#endif - set_difference(tiles.begin(), tiles.end(), - m_coverageInfo.m_tiles.begin(), m_coverageInfo.m_tiles.end(), - back_inserter(diff_tiles), tiles.key_comp()); - - for (size_t i = 0; i < firstTileForAdd; ++i) - tileCache.UnlockTile(diff_tiles[i]->m_rectInfo); - - for (size_t i = firstTileForAdd; i < diff_tiles.size(); ++i) - tileCache.LockTile(diff_tiles[i]->m_rectInfo); - - tileCache.Unlock(); - - m_coverageInfo.m_tiles = tiles; - MergeOverlay(); - - /// clearing all old commands - m_coverageInfo.m_tileRenderer->ClearCommands(); - /// setting new sequenceID - m_coverageInfo.m_tileRenderer->SetSequenceID(m_stateInfo.m_sequenceID); - /// @todo After ClearCommands i think we have no commands to cancel. - m_coverageInfo.m_tileRenderer->CancelCommands(); - - m_benchmarkInfo.m_tilesCount = newRects.size(); - m_benchmarkInfo.m_benchmarkSequenceID = m_stateInfo.m_sequenceID; - - for (size_t i = 0; i < newRects.size(); ++i) - { - Tiler::RectInfo const & ri = newRects[i]; - - core::CommandsQueue::Chain chain; - - chain.addCommand(bind(&CoverageGenerator::MergeTile, - this, ri, m_stateInfo.m_sequenceID)); - - m_coverageInfo.m_tileRenderer->AddCommand(ri, m_stateInfo.m_sequenceID, chain); - } -} - -void CoverageGenerator::MergeOverlay() -{ - m_coverageInfo.m_overlay->lock(); - m_coverageInfo.m_overlay->clear(); - - for (Tile const * tile : m_coverageInfo.m_tiles) - { - Tiler::RectInfo const & ri = tile->m_rectInfo; - if (m_coverageInfo.m_tiler.isLeaf(ri)) - m_coverageInfo.m_overlay->merge(tile->m_overlay, - tile->m_tileScreen.PtoGMatrix() * m_stateInfo.m_currentScreen.GtoPMatrix()); - } - - m_coverageInfo.m_overlay->unlock(); -} - -void CoverageGenerator::MergeSingleTile(Tiler::RectInfo const & rectInfo) -{ - m_coverageInfo.m_tileRenderer->CacheActiveTile(rectInfo); - TileCache & tileCache = m_coverageInfo.m_tileRenderer->GetTileCache(); - tileCache.Lock(); - - Tile const * tile = NULL; - if (tileCache.HasTile(rectInfo)) - { - tileCache.LockTile(rectInfo); - tile = &tileCache.GetTile(rectInfo); - } - - if (tile != NULL) - { - m_coverageInfo.m_tiles.insert(tile); - - if (m_coverageInfo.m_tiler.isLeaf(rectInfo)) - { - m_backCoverage->m_isEmptyDrawing &= tile->m_isEmptyDrawing; - m_backCoverage->m_renderLeafTilesCount--; - } - } - - tileCache.Unlock(); - - if (tile != NULL && m_coverageInfo.m_tiler.isLeaf(rectInfo)) - { - m_coverageInfo.m_overlay->lock(); - m_coverageInfo.m_overlay->merge(tile->m_overlay, - tile->m_tileScreen.PtoGMatrix() * m_stateInfo.m_currentScreen.GtoPMatrix()); - m_coverageInfo.m_overlay->unlock(); - } -} - -namespace -{ - bool SharpnessComparator(shared_ptr const & e1, - shared_ptr const & e2) - { - return e1->hasSharpGeometry() && (!e2->hasSharpGeometry()); - } -} - -bool CoverageGenerator::CacheCoverage(core::CommandsQueue::Environment const & env) -{ - if (m_cacheScreen->isCancelled()) - return false; - - ASSERT(m_backCoverage->m_mainElements == nullptr, ()); - ASSERT(m_backCoverage->m_sharpElements == nullptr, ()); - - m_backCoverage->m_mainElements = m_cacheScreen->createDisplayList(); - m_backCoverage->m_sharpElements = m_cacheScreen->createDisplayList(); - - m_cacheScreen->setEnvironment(&env); - - m_cacheScreen->beginFrame(); - m_cacheScreen->setDisplayList(m_backCoverage->m_mainElements); - - vector infos; - infos.reserve(m_coverageInfo.m_tiles.size()); - - for (Tile const * tile : m_coverageInfo.m_tiles) - { - size_t tileWidth = tile->m_renderTarget->width(); - size_t tileHeight = tile->m_renderTarget->height(); - - graphics::BlitInfo bi; - - bi.m_matrix = tile->m_tileScreen.PtoGMatrix() * m_stateInfo.m_currentScreen.GtoPMatrix(); - bi.m_srcRect = m2::RectI(0, 0, tileWidth - 2, tileHeight - 2); - bi.m_texRect = m2::RectU(1, 1, tileWidth - 1, tileHeight - 1); - bi.m_srcSurface = tile->m_renderTarget; - bi.m_depth = tile->m_rectInfo.m_tileScale * 100; - - infos.push_back(bi); - } - - if (!infos.empty()) - m_cacheScreen->blit(infos.data(), infos.size(), true); - - m_cacheScreen->clear(graphics::Color(), false); - - math::Matrix idM = math::Identity(); - - m_coverageInfo.m_overlay->lock(); - - vector > overlayElements; - overlayElements.reserve(m_coverageInfo.m_overlay->getElementsCount()); - m_coverageInfo.m_overlay->forEach(MakeBackInsertFunctor(overlayElements)); - sort(overlayElements.begin(), overlayElements.end(), SharpnessComparator); - - unsigned currentElement = 0; - - for (; currentElement < overlayElements.size(); ++currentElement) - { - shared_ptr const & elem = overlayElements[currentElement]; - if (elem->hasSharpGeometry()) - break; - - elem->draw(m_cacheScreen.get(), idM); - } - - m_cacheScreen->applySharpStates(); - m_cacheScreen->setDisplayList(m_backCoverage->m_sharpElements); - - for (; currentElement < overlayElements.size(); ++currentElement) - overlayElements[currentElement]->draw(m_cacheScreen.get(), idM); - - m_coverageInfo.m_overlay->unlock(); - - m_cacheScreen->setDisplayList(0); - m_cacheScreen->applyStates(); - - m_cacheScreen->endFrame(); - - /// completing commands that was immediately executed - /// while recording of displayList(for example UnlockStorage) - - m_cacheScreen->completeCommands(); - - m_cacheScreen->setEnvironment(0); - - return true; -} - -void CoverageGenerator::ClearCoverage() -{ - { - m_coverageInfo.m_overlay->lock(); - m_coverageInfo.m_overlay->clear(); - m_coverageInfo.m_overlay->unlock(); - } - - TileCache & tileCache = m_coverageInfo.m_tileRenderer->GetTileCache(); - - tileCache.Lock(); - - for (CoverageInfo::TTileSet::const_iterator it = m_coverageInfo.m_tiles.begin(); - it != m_coverageInfo.m_tiles.end(); - ++it) - { - Tiler::RectInfo const & ri = (*it)->m_rectInfo; - tileCache.UnlockTile(ri); - } - - tileCache.Unlock(); - - m_coverageInfo.m_tiles.clear(); - - delete m_currentCoverage; - m_currentCoverage = 0; - delete m_backCoverage; - m_backCoverage = 0; -} - -//////////////////////////////////////////////////////////// -/// BenchmarkInfo -//////////////////////////////////////////////////////////// - -CoverageGenerator::BenchmarkInfo::BenchmarkInfo() - : m_benchmarkSequenceID(numeric_limits::max()) - , m_tilesCount(-1) - , m_fenceManager(2) - , m_currentFenceID(-1) - , m_isBenchmarking(false) -{ -} - -void CoverageGenerator::BenchmarkInfo::DecrementTileCount(int sequenceID) -{ - if (!m_isBenchmarking) - return; - - if (sequenceID < m_benchmarkSequenceID) - { - m_tilesCount = -1; - return; - } - m_tilesCount -= 1; -} - -int CoverageGenerator::BenchmarkInfo::InsertBenchmarkFence() -{ - ASSERT(m_isBenchmarking, ("Only for benchmark mode")); - m_currentFenceID = m_fenceManager.insertFence(); - return m_currentFenceID; -} - -void CoverageGenerator::BenchmarkInfo::JoinBenchmarkFence(int fenceID) -{ - ASSERT(m_isBenchmarking, ("Only for benchmark mode")); - CHECK(fenceID == m_currentFenceID, ("InsertBenchmarkFence without corresponding SignalBenchmarkFence detected")); - m_fenceManager.joinFence(fenceID); -} - -void CoverageGenerator::BenchmarkInfo::SignalBenchmarkFence() -{ - ASSERT(m_isBenchmarking, ("Only for benchmark mode")); - if (m_currentFenceID != -1) - m_fenceManager.signalFence(m_currentFenceID); -} - -void CoverageGenerator::BenchmarkInfo::TryFinishSequence() -{ - if (m_tilesCount == 0) - { - m_tilesCount = -1; - SignalBenchmarkFence(); - } -} - -//////////////////////////////////////////////////////////// -/// StateInfo -//////////////////////////////////////////////////////////// -CoverageGenerator::StateInfo::StateInfo() - : m_isPause(false) - , m_needForceUpdate(false) - , m_sequenceID(0) -{ -} - -void CoverageGenerator::StateInfo::SetSequenceID(int sequenceID) -{ - m_sequenceID = sequenceID; -} - -void CoverageGenerator::StateInfo::SetForceUpdate(bool needForceUpdate) -{ - m_needForceUpdate = needForceUpdate; -} - -void CoverageGenerator::StateInfo::Pause() -{ - m_isPause = true; -} - -void CoverageGenerator::StateInfo::Resume() -{ - m_isPause = false; - m_needForceUpdate = true; -} - -//////////////////////////////////////////////////////////// -/// CoverageGenerator -//////////////////////////////////////////////////////////// -CoverageGenerator::CoverageInfo::CoverageInfo(TileRenderer *tileRenderer) - : m_tileRenderer(tileRenderer) - , m_overlay(new graphics::Overlay()) -{ -} - -CoverageGenerator::CoverageInfo::~CoverageInfo() -{ - delete m_overlay; -} - -CoverageGenerator::CachedCoverageInfo::CachedCoverageInfo() - : m_mainElements(nullptr) - , m_sharpElements(nullptr) - , m_renderLeafTilesCount(0) - , m_isEmptyDrawing(false) -{ -} - -CoverageGenerator::CachedCoverageInfo::~CachedCoverageInfo() -{ - delete m_mainElements; - delete m_sharpElements; -} - -void CoverageGenerator::CachedCoverageInfo::ResetDL() -{ - delete m_mainElements; - m_mainElements = nullptr; - delete m_sharpElements; - m_sharpElements = nullptr; -} diff --git a/render/coverage_generator.hpp b/render/coverage_generator.hpp deleted file mode 100644 index 4def88c41d..0000000000 --- a/render/coverage_generator.hpp +++ /dev/null @@ -1,184 +0,0 @@ -#pragma once - -#include "render_policy.hpp" -#include "tiler.hpp" -#include "tile.hpp" -#include "window_handle.hpp" - -#include "geometry/screenbase.hpp" - -#include "graphics/overlay.hpp" - -#include "base/thread.hpp" -#include "base/threaded_list.hpp" -#include "base/mutex.hpp" -#include "base/commands_queue.hpp" - -#include "std/vector.hpp" -#include "std/shared_ptr.hpp" - -class TileRenderer; -class TileCache; -class ScreenCoverage; - -namespace graphics -{ - class Skin; - - namespace gl - { - class Screen; - } - class ResourceStyleCache; -} - -/// Control class for TilingRenderPolicy. It processes request from the RenderPolicy -/// to draw a specific ScreenBase by splitting it in tiles that is not rendered now and -/// feeding them into TileRenderer. Each command to render a tile is enqueued with -/// a small command, which is feeding the CoverageGenerator with the command to process -/// newly rendered tile(p.e. merge it into current ScreenCoverage). -class CoverageGenerator -{ -public: - - CoverageGenerator(TileRenderer * tileRenderer, - shared_ptr const & windowHandle, - shared_ptr const & primaryRC, - shared_ptr const & rm, - graphics::PacketsQueue * glQueue); - - ~CoverageGenerator(); - - void Shutdown(); - - //@{ Add task to run on CoverageGenerator thread - void InvalidateTiles(m2::AnyRectD const & rect, int startScale); - void CoverScreen(ScreenBase const & screen, bool doForce); - //}@ - - //@{ Benchmark support - int InsertBenchmarkFence(); - void JoinBenchmarkFence(int fenceID); - //}@ - - void Draw(graphics::Screen * s, ScreenBase const & screen); - - //@{ Frame lock - void Lock(); - void Unlock(); - //}@ - - void Pause(); - void Resume(); - - graphics::Overlay * GetOverlay() const; - - bool IsEmptyDrawing() const; - bool DoForceUpdate() const; - -private: - //@{ Called only on android, with Single thread policy - void InitializeThreadGL(shared_ptr context, - shared_ptr resourceManager, - graphics::PacketsQueue * glQueue); - void FinalizeThreadGL(shared_ptr context, - shared_ptr resourceManager); - //@} - - void MergeTile(Tiler::RectInfo const & rectInfo, int sequenceID); - -private: - void CoverScreenImpl(core::CommandsQueue::Environment const & env, - ScreenBase const & screen, - int sequenceID); - - void MergeTileImpl(core::CommandsQueue::Environment const & env, - Tiler::RectInfo const & rectInfo, - int sequenceID); - - void InvalidateTilesImpl(m2::AnyRectD const & rect, int startScale); - - bool IsBackEmptyDrawing() const; - -private: - void FinishSequenceIfNeeded(); - void ComputeCoverTasks(); - void MergeOverlay(); - void MergeSingleTile(Tiler::RectInfo const & rectInfo); - bool CacheCoverage(core::CommandsQueue::Environment const & env); - - void ClearCoverage(); - -private: - struct BenchmarkInfo - { - int m_benchmarkSequenceID; - int m_tilesCount; - - FenceManager m_fenceManager; - int m_currentFenceID; - - bool m_isBenchmarking; - - BenchmarkInfo(); - - void DecrementTileCount(int sequenceID); - - int InsertBenchmarkFence(); - void JoinBenchmarkFence(int fenceID); - void SignalBenchmarkFence(); - void TryFinishSequence(); - } m_benchmarkInfo; - - struct StateInfo - { - bool m_isPause; - bool m_needForceUpdate; - int m_sequenceID; - ScreenBase m_currentScreen; - threads::Mutex m_mutex; - - StateInfo(); - - void SetSequenceID(int sequenceID); - void SetForceUpdate(bool needForceUpdate); - - void Pause(); - void Resume(); - } m_stateInfo; - - struct CoverageInfo - { - CoverageInfo(TileRenderer * tileRenderer); - ~CoverageInfo(); - - Tiler m_tiler; - TileRenderer * m_tileRenderer; - - typedef set TTileSet; - TTileSet m_tiles; - - graphics::Overlay * m_overlay; - } m_coverageInfo; - - struct CachedCoverageInfo - { - CachedCoverageInfo(); - ~CachedCoverageInfo(); - - void ResetDL(); - - graphics::DisplayList * m_mainElements; - graphics::DisplayList * m_sharpElements; - ScreenBase m_screen; - int m_renderLeafTilesCount; - bool m_isEmptyDrawing; - }; - - CachedCoverageInfo * m_currentCoverage; - CachedCoverageInfo * m_backCoverage; - - core::CommandsQueue m_queue; - shared_ptr m_windowHandle; - shared_ptr m_cacheScreen; -}; diff --git a/render/cpu_drawer.hpp b/render/cpu_drawer.hpp deleted file mode 100644 index 34fb5be0fc..0000000000 --- a/render/cpu_drawer.hpp +++ /dev/null @@ -1,190 +0,0 @@ -#pragma once - -#include "drawer.hpp" -#include "feature_styler.hpp" -#include "software_renderer.hpp" - -#include "std/list.hpp" -#include "std/unique_ptr.hpp" - -class CPUDrawer : public Drawer -{ - using TBase = Drawer; - -public: - struct Params : Drawer::Params - { - Params(graphics::GlyphCache::Params const & p) - : m_glyphCacheParams(p) - { - } - - graphics::GlyphCache::Params m_glyphCacheParams; - graphics::EDensity m_density; - }; - - CPUDrawer(Params const & params); - - void BeginFrame(uint32_t width, uint32_t height, graphics::Color const & bgColor); - void Flush(); - void DrawMyPosition(m2::PointD const & myPxPotision); - void DrawSearchResult(m2::PointD const & pxPosition); - void DrawSearchArrow(double azimut); - void EndFrame(FrameImage & image); - - graphics::GlyphCache * GetGlyphCache() override { return m_renderer->GetGlyphCache(); } - -protected: - void DrawSymbol(m2::PointD const & pt, graphics::EPosition pos, di::DrawRule const & rule) override; - void DrawCircle(m2::PointD const & pt, graphics::EPosition pos, di::DrawRule const & rule) override; - void DrawCircledSymbol(m2::PointD const & pt, graphics::EPosition pos, - di::DrawRule const & symbolRule, di::DrawRule const & circleRule) override; - void DrawPath(di::PathInfo const & path, di::DrawRule const * rules, size_t count) override; - void DrawArea(di::AreaInfo const & area, di::DrawRule const & rule) override; - void DrawText(m2::PointD const & pt, graphics::EPosition pos, - di::FeatureStyler const & fs, di::DrawRule const & rule) override; - void DrawPathText(di::PathInfo const & info, di::FeatureStyler const & fs, di::DrawRule const & rule) override; - void DrawPathNumber(di::PathInfo const & path, di::FeatureStyler const & fs, di::DrawRule const & rule) override; - - int GetGeneration() { return m_generationCounter++; } - - FeatureID const & Insert(di::PathInfo const & info); - FeatureID const & Insert(di::AreaInfo const & info); - FeatureID const & Insert(di::FeatureStyler const & styler); - FeatureID const & Insert(string const & text); - -private: - void Render(); - -private: - unique_ptr m_renderer; - int m_generationCounter; - - enum EShapeType - { - TYPE_INVALID, - TYPE_SYMBOL, - TYPE_CIRCLE, - TYPE_AREA, - TYPE_PATH, - TYPE_PATH_TEXT, - TYPE_TEXT, - TYPE_ROAD_NUMBER - }; - - struct BaseShape - { - BaseShape(di::DrawRule const & rule, int generation, EShapeType type) - : m_drawRule(rule) - , m_generation(generation) - , m_type(type) - { - } - - di::DrawRule m_drawRule; - int m_generation = 0; - EShapeType m_type = TYPE_INVALID; - }; - - struct PointShape : BaseShape - { - PointShape(m2::PointD const & pt, graphics::EPosition anchor, EShapeType type, - di::DrawRule const & rule, int generation) - : BaseShape(rule, generation, type) - , m_position(pt) - , m_anchor(anchor) - { - ASSERT(type == TYPE_SYMBOL || type == TYPE_CIRCLE, ()); - } - - m2::PointD m_position = m2::PointD::Zero(); - graphics::EPosition m_anchor = graphics::EPosCenter; - }; - - struct ComplexShape : BaseShape - { - ComplexShape(FeatureID geomID, di::DrawRule const & rule, int generation, EShapeType type) - : BaseShape(rule, generation, type) - , m_geomID(geomID) - { - ASSERT(type == TYPE_AREA || - type == TYPE_PATH || - type == TYPE_PATH_TEXT || - type == TYPE_TEXT || - type == TYPE_ROAD_NUMBER, ()); - - ASSERT(type == TYPE_ROAD_NUMBER || m_drawRule.m_rule != nullptr, ()); - } - - FeatureID m_geomID; - }; - - struct TextShape : ComplexShape - { - TextShape(m2::PointD const & pt, graphics::EPosition anchor, FeatureID const & id, - di::DrawRule const & rule, int generation, EShapeType type) - : ComplexShape(id, rule, generation, type) - , m_position(pt) - , m_anchor(anchor) - { - } - - m2::PointD m_position = m2::PointD::Zero(); - graphics::EPosition m_anchor = graphics::EPosCenter; - }; - - void DrawSymbol(PointShape const * shape); - void DrawCircle(PointShape const * shape); - void DrawPath(ComplexShape const * shape); - void DrawArea(ComplexShape const * shape); - void DrawPathText(ComplexShape const * shape); - void DrawRoadNumber(TextShape const * shape); - void DrawText(TextShape const * shape); - - class CPUOverlayTree; - struct OverlayWrapper - { - OverlayWrapper(BaseShape const ** rules, size_t count) - : m_ruleCount(count) - { - ASSERT(count > 0 && count < 3, ()); - m_rules[0] = rules[0]; - if (m_ruleCount == 2) - m_rules[1] = rules[1]; - } - - BaseShape const * m_rules[2]; - size_t m_ruleCount; - vector m_rects; - m2::RectD m_boundRect; - }; - - OverlayWrapper & AddOverlay(BaseShape const * shape1, BaseShape const * shape2 = nullptr); - - using TTextRendererCall = function; - void CallTextRendererFn(TextShape const * shape, TTextRendererCall const & fn); - - using TRoadNumberRendererCall = function; - void CallTextRendererFn(TextShape const * shape, TRoadNumberRendererCall const & fn); - - using TPathTextRendererCall = function; - void CallTextRendererFn(ComplexShape const * shape, TPathTextRendererCall const & fn); - - list m_areaPathShapes; - - // overlay part - list m_pointShapes; - list m_pathTextShapes; - list m_textShapes; - list m_overlayList; - - map m_stylers; - map m_areasGeometry; - map m_pathGeometry; - map m_roadNames; - graphics::FontDesc m_roadNumberFont; -}; diff --git a/render/drawer.cpp b/render/drawer.cpp deleted file mode 100644 index ef380ff017..0000000000 --- a/render/drawer.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#include "drawer.hpp" -#include "feature_info.hpp" - -#include "indexer/drules_include.hpp" -#include "indexer/feature_decl.hpp" - -#include "base/buffer_vector.hpp" -#include "base/macros.hpp" - -Drawer::Params::Params() - : m_visualScale(1) -{ -} - -Drawer::Drawer(Params const & params) - : m_visualScale(params.m_visualScale) -{ -} - -double Drawer::VisualScale() const -{ - return m_visualScale; -} - -void Drawer::SetScale(int level) -{ - m_level = level; -} - -void Drawer::DrawFeatureStart(FeatureID const & id) -{ - m_currentFeatureID = id; -} - -void Drawer::DrawFeatureEnd(FeatureID const & id) -{ - ASSERT_EQUAL(m_currentFeatureID, id, ()); - UNUSED_VALUE(id); - m_currentFeatureID = FeatureID(); -} - -FeatureID const & Drawer::GetCurrentFeatureID() const -{ - ASSERT(m_currentFeatureID.IsValid(), ()); - return m_currentFeatureID; -} - -void Drawer::GenerateRoadNumbers(di::PathInfo const & path, graphics::FontDesc const & font, di::FeatureStyler const & fs, - TRoadNumberCallbackFn const & fn) -{ - double const length = path.GetFullLength(); - if (length >= (fs.m_refText.size() + 2) * font.m_size) - { - size_t const count = size_t(length / 1000.0) + 2; - - m2::PointD pt; - for (size_t j = 1; j < count; ++j) - { - if (path.GetSmPoint(double(j) / double(count), pt)) - fn(pt, font, fs.m_refText); - } - } -} - -void Drawer::Draw(di::FeatureInfo const & fi) -{ - DrawFeatureStart(fi.m_id); - - buffer_vector const & rules = fi.m_styler.m_rules; - buffer_vector pathRules; - - bool const isPath = !fi.m_pathes.empty(); - bool const isArea = !fi.m_areas.empty(); - bool isCircleAndSymbol = false; - drule::BaseRule const * pCircleRule = NULL; - double circleDepth = graphics::minDepth; - drule::BaseRule const * pSymbolRule = NULL; - double symbolDepth = graphics::minDepth; - drule::BaseRule const * pShieldRule = nullptr; - double shieldDepth = graphics::minDepth; - - // separating path rules from other - for (size_t i = 0; i < rules.size(); ++i) - { - drule::BaseRule const * pRule = rules[i].m_rule; - - bool const isSymbol = pRule->GetSymbol() != 0; - bool const isCaption = pRule->GetCaption(0) != 0; - bool const isCircle = pRule->GetCircle() != 0; - - if (pSymbolRule == NULL && isSymbol) - { - pSymbolRule = pRule; - symbolDepth = rules[i].m_depth; - } - - if (pCircleRule == NULL && isCircle) - { - pCircleRule = pRule; - circleDepth = rules[i].m_depth; - } - - if (pShieldRule == nullptr && pRule->GetShield() != nullptr) - { - pShieldRule = pRule; - shieldDepth = rules[i].m_depth; - } - - if (!isCaption && isPath && !isSymbol && (pRule->GetLine() != 0)) - pathRules.push_back(rules[i]); - } - - isCircleAndSymbol = (pSymbolRule != NULL) && (pCircleRule != NULL); - - if (!pathRules.empty()) - { - for (list::const_iterator i = fi.m_pathes.begin(); i != fi.m_pathes.end(); ++i) - DrawPath(*i, pathRules.data(), pathRules.size()); - } - - for (size_t i = 0; i < rules.size(); ++i) - { - drule::BaseRule const * pRule = rules[i].m_rule; - double const depth = rules[i].m_depth; - - bool const isCaption = pRule->GetCaption(0) != 0; - bool const isSymbol = pRule->GetSymbol() != 0; - bool const isCircle = pRule->GetCircle() != 0; - - if (!isCaption) - { - // draw area - if (isArea) - { - bool const isFill = pRule->GetArea() != 0; - - for (list::const_iterator i = fi.m_areas.begin(); i != fi.m_areas.end(); ++i) - { - if (isFill) - DrawArea(*i, di::DrawRule(pRule, depth)); - else if (isCircleAndSymbol && isCircle) - { - DrawCircledSymbol(i->GetCenter(), - graphics::EPosCenter, - di::DrawRule(pSymbolRule, symbolDepth), - di::DrawRule(pCircleRule, circleDepth)); - } - else if (isSymbol) - DrawSymbol(i->GetCenter(), graphics::EPosCenter, di::DrawRule(pRule, depth)); - else if (isCircle) - DrawCircle(i->GetCenter(), graphics::EPosCenter, di::DrawRule(pRule, depth)); - } - } - - // draw point symbol - if (!isPath && !isArea && ((pRule->GetType() & drule::node) != 0)) - { - if (isCircleAndSymbol) - { - DrawCircledSymbol(fi.m_point, - graphics::EPosCenter, - di::DrawRule(pSymbolRule, symbolDepth), - di::DrawRule(pCircleRule, circleDepth)); - } - else if (isSymbol) - DrawSymbol(fi.m_point, graphics::EPosCenter, di::DrawRule(pRule, depth)); - else if (isCircle) - DrawCircle(fi.m_point, graphics::EPosCenter, di::DrawRule(pRule, depth)); - } - } - else - { - if (!fi.m_styler.m_primaryText.empty() && (pRule->GetCaption(0) != 0)) - { - bool isN = ((pRule->GetType() & drule::way) != 0); - - graphics::EPosition textPosition = graphics::EPosCenter; - if (pRule->GetCaption(0)->has_offset_y()) - { - if (pRule->GetCaption(0)->offset_y() > 0) - textPosition = graphics::EPosUnder; - else - textPosition = graphics::EPosAbove; - } - if (pRule->GetCaption(0)->has_offset_x()) - { - if (pRule->GetCaption(0)->offset_x() > 0) - textPosition = graphics::EPosRight; - else - textPosition = graphics::EPosLeft; - } - - // draw area text - if (isArea/* && isN*/) - { - for (list::const_iterator i = fi.m_areas.begin(); i != fi.m_areas.end(); ++i) - DrawText(i->GetCenter(), textPosition, fi.m_styler, di::DrawRule(pRule, depth)); - } - - // draw way name - if (isPath && !isArea && isN && !fi.m_styler.FilterTextSize(pRule)) - { - for (list::const_iterator i = fi.m_pathes.begin(); i != fi.m_pathes.end(); ++i) - DrawPathText(*i, fi.m_styler, di::DrawRule(pRule, depth)); - } - - // draw point text - isN = ((pRule->GetType() & drule::node) != 0); - if (!isPath && !isArea && isN) - DrawText(fi.m_point, textPosition, fi.m_styler, di::DrawRule(pRule, depth)); - } - } - } - - // draw road numbers - if (isPath && !fi.m_styler.m_refText.empty() && pShieldRule != nullptr) - for (auto n : fi.m_pathes) - DrawPathNumber(n, fi.m_styler, di::DrawRule(pShieldRule, shieldDepth)); - - DrawFeatureEnd(fi.m_id); -} diff --git a/render/drawer.hpp b/render/drawer.hpp deleted file mode 100644 index b4a7673797..0000000000 --- a/render/drawer.hpp +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once - -#include "graphics/defines.hpp" -#include "graphics/font_desc.hpp" - -#include "indexer/feature_decl.hpp" - -#include "geometry/point2d.hpp" - -#include "std/function.hpp" - -namespace di -{ - struct DrawRule; - class PathInfo; - class AreaInfo; - struct FeatureStyler; - struct FeatureInfo; -} - -namespace graphics { class GlyphCache; } - -class Drawer -{ - double m_visualScale; - int m_level; - FeatureID m_currentFeatureID; - -protected: - - virtual void DrawSymbol(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & rule) = 0; - - virtual void DrawCircle(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & rule) = 0; - - virtual void DrawCircledSymbol(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & symbolRule, - di::DrawRule const & circleRule) = 0; - - virtual void DrawPath(di::PathInfo const & path, - di::DrawRule const * rules, - size_t count) = 0; - - virtual void DrawArea(di::AreaInfo const & area, - di::DrawRule const & rule) = 0; - - virtual void DrawText(m2::PointD const & pt, - graphics::EPosition pos, - di::FeatureStyler const & fs, - di::DrawRule const & rule) = 0; - - virtual void DrawPathText(di::PathInfo const & info, - di::FeatureStyler const & fs, - di::DrawRule const & rule) = 0; - - virtual void DrawPathNumber(di::PathInfo const & path, - di::FeatureStyler const & fs, - di::DrawRule const & rule) = 0; - - void DrawFeatureStart(FeatureID const & id); - void DrawFeatureEnd(FeatureID const & id); - FeatureID const & GetCurrentFeatureID() const; - - using TRoadNumberCallbackFn = function; - void GenerateRoadNumbers(di::PathInfo const & path, graphics::FontDesc const & font, di::FeatureStyler const & fs, - TRoadNumberCallbackFn const & fn); - -public: - - struct Params - { - double m_visualScale; - Params(); - }; - - Drawer(Params const & params = Params()); - virtual ~Drawer() {} - - double VisualScale() const; - void SetScale(int level); - - virtual graphics::GlyphCache * GetGlyphCache() = 0; - - void Draw(di::FeatureInfo const & fi); -}; diff --git a/render/events.cpp b/render/events.cpp deleted file mode 100644 index 1730ceeb8c..0000000000 --- a/render/events.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "events.hpp" - -#ifndef USE_DRAPE -PaintEvent::PaintEvent(Drawer * drawer, - core::CommandsQueue::Environment const * env) - : m_drawer(drawer), - m_env(env), - m_isCancelled(false), - m_isEmptyDrawing(true) -{} - -Drawer * PaintEvent::drawer() const -{ - return m_drawer; -} - -void PaintEvent::cancel() -{ - ASSERT(m_env == 0, ()); - m_isCancelled = true; -} - -bool PaintEvent::isCancelled() const -{ - if (m_env) - return m_env->IsCancelled(); - else - return m_isCancelled; -} - -bool PaintEvent::isEmptyDrawing() const -{ - return m_isEmptyDrawing; -} - -void PaintEvent::setIsEmptyDrawing(bool flag) -{ - m_isEmptyDrawing = flag; -} -#endif // USE_DRAPE diff --git a/render/events.hpp b/render/events.hpp deleted file mode 100644 index 81756179c0..0000000000 --- a/render/events.hpp +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -#include "geometry/screenbase.hpp" -#include "geometry/point2d.hpp" - -#include "base/commands_queue.hpp" - - -class DragEvent -{ - m2::PointD m_pt; -public: - DragEvent(double x, double y) : m_pt(x, y) {} - inline m2::PointD const & Pos() const { return m_pt; } -}; - -class RotateEvent -{ - double m_Angle; -public: - RotateEvent(double x1, double y1, double x2, double y2) - { - m_Angle = atan2(y2 - y1, x2 - x1); - } - - inline double Angle() const { return m_Angle; } -}; - -class ScaleEvent -{ - m2::PointD m_Pt1, m_Pt2; -public: - ScaleEvent(double x1, double y1, double x2, double y2) : m_Pt1(x1, y1), m_Pt2(x2, y2) {} - inline m2::PointD const & Pt1() const { return m_Pt1; } - inline m2::PointD const & Pt2() const { return m_Pt2; } -}; - -class ScaleToPointEvent -{ - m2::PointD m_Pt1; - double m_factor; -public: - ScaleToPointEvent(double x1, double y1, double factor) : m_Pt1(x1, y1), m_factor(factor) {} - inline m2::PointD const & Pt() const { return m_Pt1; } - inline double ScaleFactor() const { return m_factor; } -}; - -#ifndef USE_DRAPE -class Drawer; - -class PaintEvent -{ - Drawer * m_drawer; - core::CommandsQueue::Environment const * m_env; - bool m_isCancelled; - bool m_isEmptyDrawing; - -public: - PaintEvent(Drawer * drawer, core::CommandsQueue::Environment const * env = 0); - - Drawer * drawer() const; - void cancel(); - bool isCancelled() const; - bool isEmptyDrawing() const; - void setIsEmptyDrawing(bool flag); -}; - -class PaintOverlayEvent -{ -public: - PaintOverlayEvent(Drawer * drawer, ScreenBase const & modelView) - : m_drawer(drawer), m_modelView(modelView) {} - - ScreenBase const & GetModelView() const { return m_modelView; } - Drawer * GetDrawer() const { return m_drawer; } - m2::RectD const & GetClipRect() const { return m_modelView.ClipRect(); } - -private: - Drawer * m_drawer; - ScreenBase m_modelView; -}; -#endif // USE_DRAPE diff --git a/render/feature_info.cpp b/render/feature_info.cpp deleted file mode 100644 index e7d6115a96..0000000000 --- a/render/feature_info.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "feature_info.hpp" - -#include "indexer/feature.hpp" - - -namespace di -{ - FeatureInfo::FeatureInfo(FeatureType const & f, - int const zoom, - double const visualScale, - graphics::GlyphCache * glyphCache, - ScreenBase const * convertor, - m2::RectD const * rect) - : m_styler(f, zoom, visualScale, glyphCache, convertor, rect), - m_id(f.GetID()) - {} -} diff --git a/render/feature_info.hpp b/render/feature_info.hpp deleted file mode 100644 index 2cd9a6b7c5..0000000000 --- a/render/feature_info.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "feature_styler.hpp" -#include "path_info.hpp" -#include "area_info.hpp" - -#include "indexer/feature_decl.hpp" - -#include "geometry/point2d.hpp" - -#include "std/list.hpp" - - -namespace graphics { class GlyphCache; } -class FeatureType; -class ScreenBase; - -namespace di -{ - struct FeatureInfo - { - FeatureStyler m_styler; - FeatureID m_id; - - list m_pathes; - list m_areas; - m2::PointD m_point; - - FeatureInfo(FeatureType const & f, - int const zoom, - double const visualScale, - graphics::GlyphCache * glyphCache, - ScreenBase const * convertor, - m2::RectD const * rect); - }; -} diff --git a/render/feature_processor.cpp b/render/feature_processor.cpp deleted file mode 100644 index 15fa4f33e4..0000000000 --- a/render/feature_processor.cpp +++ /dev/null @@ -1,185 +0,0 @@ -#include "feature_processor.hpp" -#include "geometry_processors.hpp" -#include "feature_info.hpp" - -#ifndef USE_DRAPE -#include "drawer.hpp" -#endif // USE_DRAPE - -#include "indexer/feature_impl.hpp" -#include "indexer/feature_algo.hpp" - - -namespace fwork -{ -#ifndef USE_DRAPE - namespace - { - template void assign_point(di::FeatureInfo & p, TSrc & src) - { - p.m_point = src.m_point; - } - - template void assign_path(di::FeatureInfo & p, TSrc & src) - { - p.m_pathes.swap(src.m_points); - } - - template void assign_area(di::FeatureInfo & p, TSrc & src) - { - p.m_areas.swap(src.m_points); - - ASSERT ( !p.m_areas.empty(), () ); - p.m_areas.back().SetCenter(src.GetCenter()); - } - } - - FeatureProcessor::FeatureProcessor(m2::RectD const & r, - ScreenBase const & convertor, - shared_ptr const & e, - int scaleLevel) - : m_rect(r), - m_convertor(convertor), - m_paintEvent(e), - m_zoom(scaleLevel), - m_hasNonCoast(false), - m_glyphCache(e->drawer()->GetGlyphCache()) - { - GetDrawer()->SetScale(m_zoom); - } - - bool FeatureProcessor::operator() (FeatureType const & f) - { - if (m_paintEvent->isCancelled()) - throw redraw_operation_cancelled(); - - Drawer * pDrawer = GetDrawer(); - di::FeatureInfo fi(f, m_zoom, pDrawer->VisualScale(), m_glyphCache, &m_convertor, &m_rect); - - if (fi.m_styler.IsEmpty()) - return true; - - // Draw coastlines features only once. - if (fi.m_styler.m_isCoastline) - { - if (!m_coasts.insert(fi.m_styler.m_primaryText).second) - return true; - } - else - m_hasNonCoast = true; - - using namespace gp; - - bool isExist = false; - - switch (fi.m_styler.m_geometryType) - { - case feature::GEOM_POINT: - { - typedef gp::one_point functor_t; - - functor_t::params p; - p.m_convertor = &m_convertor; - p.m_rect = &m_rect; - - functor_t fun(p); - f.ForEachPointRef(fun, m_zoom); - if (fun.IsExist()) - { - isExist = true; - assign_point(fi, fun); - } - - break; - } - - case feature::GEOM_AREA: - { - typedef filter_screenpts_adapter functor_t; - - functor_t::params p; - p.m_convertor = &m_convertor; - p.m_rect = &m_rect; - - functor_t fun(p); - f.ForEachTriangleExRef(fun, m_zoom); - - if (fi.m_styler.m_hasPointStyles) - fun.SetCenter(feature::GetCenter(f, m_zoom)); - - if (fun.IsExist()) - { - isExist = true; - assign_area(fi, fun); - } - - // continue rendering as line if feature has linear styles too - if (!fi.m_styler.m_hasLineStyles) - break; - } - - case feature::GEOM_LINE: - { - if (fi.m_styler.m_hasPathText) - { - typedef filter_screenpts_adapter functor_t; - - functor_t::params p; - - p.m_convertor = &m_convertor; - p.m_rect = &m_rect; - p.m_intervals = &fi.m_styler.m_intervals; - - functor_t fun(p); - - f.ForEachPointRef(fun, m_zoom); - if (fun.IsExist()) - { - isExist = true; - assign_path(fi, fun); - -#ifdef DEBUG - if (fi.m_pathes.size() == 1) - { - double const offset = fi.m_pathes.front().GetOffset(); - for (size_t i = 0; i < fi.m_styler.m_offsets.size(); ++i) - ASSERT_LESS_OR_EQUAL(offset, fi.m_styler.m_offsets[i], ()); - } -#endif - } - } - else - { - typedef filter_screenpts_adapter functor_t; - - functor_t::params p; - - p.m_convertor = &m_convertor; - p.m_rect = &m_rect; - - functor_t fun(p); - - f.ForEachPointRef(fun, m_zoom); - - if (fun.IsExist()) - { - isExist = true; - assign_path(fi, fun); - } - } - break; - } - } - - if (isExist) - pDrawer->Draw(fi); - - return true; - } - - bool FeatureProcessor::IsEmptyDrawing() const - { - return (m_zoom >= feature::g_arrCountryScales[0] && !m_hasNonCoast); - } -#endif // USE_DRAPE -} diff --git a/render/feature_processor.hpp b/render/feature_processor.hpp deleted file mode 100644 index fca491913d..0000000000 --- a/render/feature_processor.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include "events.hpp" - -#include "indexer/drawing_rule_def.hpp" -#include "indexer/feature.hpp" -#include "indexer/data_header.hpp" -#include "indexer/feature_data.hpp" - -#include "geometry/rect2d.hpp" - -#include "graphics/glyph_cache.hpp" - -class ScreenBase; - -class redraw_operation_cancelled {}; - -namespace fwork -{ -#ifndef USE_DRAPE - class FeatureProcessor - { - m2::RectD m_rect; - - set m_coasts; - - ScreenBase const & m_convertor; - - shared_ptr m_paintEvent; - - int m_zoom; - bool m_hasNonCoast; - bool m_hasAnyFeature; - - graphics::GlyphCache * m_glyphCache; - - inline Drawer * GetDrawer() const { return m_paintEvent->drawer(); } - - void PreProcessKeys(vector & keys) const; - - public: - - FeatureProcessor(m2::RectD const & r, - ScreenBase const & convertor, - shared_ptr const & paintEvent, - int scaleLevel); - - bool operator() (FeatureType const & f); - - bool IsEmptyDrawing() const; - }; -#endif //USE_DRAPE -} diff --git a/render/feature_styler.cpp b/render/feature_styler.cpp deleted file mode 100644 index 041be2abde..0000000000 --- a/render/feature_styler.cpp +++ /dev/null @@ -1,426 +0,0 @@ -#include "feature_styler.hpp" -#include "geometry_processors.hpp" -#include "proto_to_styles.hpp" - -#include "indexer/classificator.hpp" -#include "indexer/drawing_rules.hpp" -#include "indexer/feature.hpp" -#include "indexer/feature_visibility.hpp" -#include "indexer/ftypes_matcher.hpp" -#include "indexer/scales.hpp" -#include "indexer/drules_include.hpp" - -#include "geometry/screenbase.hpp" - -#include "graphics/glyph_cache.hpp" -#include "graphics/depth_constants.hpp" - -#include "base/stl_add.hpp" -#include "base/logging.hpp" - -#include "std/iterator_facade.hpp" - - -namespace -{ - struct less_depth - { - bool operator() (di::DrawRule const & r1, di::DrawRule const & r2) const - { - return (r1.m_depth < r2.m_depth); - } - }; - - void FilterRulesByRuntimeSelector(FeatureType const & ft, int zoom, drule::KeysT & keys) - { - keys.erase_if([&ft, zoom](drule::Key const & key)->bool - { - drule::BaseRule const * const rule = drule::rules().Find(key); - ASSERT(rule != nullptr, ()); - return !rule->TestFeature(ft, zoom); - }); - } -} - -namespace di -{ - DrawRule::DrawRule(drule::BaseRule const * p, double depth) - : m_rule(p), m_depth(my::clamp(depth, graphics::minDepth, graphics::maxDepth)) - { - } - - uint32_t DrawRule::GetID(size_t threadSlot) const - { - return m_rule->GetID(threadSlot); - } - - void DrawRule::SetID(size_t threadSlot, uint32_t id) const - { - m_rule->SetID(threadSlot, id); - } - - FeatureStyler::FeatureStyler(FeatureType const & f, - int const zoom, - double const visualScale, - graphics::GlyphCache * glyphCache, - ScreenBase const * convertor, - m2::RectD const * rect) - : m_hasPathText(false), - m_visualScale(visualScale), - m_glyphCache(glyphCache), - m_convertor(convertor), - m_rect(rect) - { - drule::KeysT keys; - pair type = feature::GetDrawRule(f, zoom, keys); - - FilterRulesByRuntimeSelector(f, zoom, keys); - - // don't try to do anything to invisible feature - if (keys.empty()) - return; - - m_hasLineStyles = false; - m_hasPointStyles = false; - - m_geometryType = type.first; - m_isCoastline = type.second; - - f.GetPreferredNames(m_primaryText, m_secondaryText); - - // Draw only one text for features on the World zoom level in user's native language. - if (zoom <= scales::GetUpperWorldScale() && !m_secondaryText.empty()) - { - m_primaryText.swap(m_secondaryText); - m_secondaryText.clear(); - } - - // Low zoom heuristics - don't show superlong names on World map. - //if (zoom <= 5) - //{ - // if (strings::MakeUniString(m_primaryText).size() > 50) - // m_primaryText.clear(); - //} - - bool const isBuilding = ftypes::IsBuildingChecker::Instance()(f); - - bool const hasName = !m_primaryText.empty() || isBuilding; - - m_refText = f.GetRoadNumber(); - - uint32_t const population = ftypes::GetPopulation(f); - - double area = 0.0; - if (m_geometryType != feature::GEOM_POINT) - { - m2::RectD const bbox = f.GetLimitRect(zoom); - area = bbox.SizeX() * bbox.SizeY(); - } - - double priorityModifier; - if (area != 0) - { - // making area larger so it's not lost on double conversions - priorityModifier = min(1.0, area * 10000.0); - } - else - { - // dividing by planet population to get priorityModifier < 1 - priorityModifier = static_cast(population) / 7E9; - } - - drule::MakeUnique(keys); - - int layer = f.GetLayer(); - if (layer == feature::LAYER_TRANSPARENT_TUNNEL) - layer = 0; - - bool hasIcon = false; - bool hasCaptionWithoutOffset = false; - - m_fontSize = 0; - - size_t const count = keys.size(); - m_rules.resize(count); - - bool hasSecondaryText = false; - - drule::text_type_t textType = drule::text_type_name; - - for (size_t i = 0; i < count; ++i) - { - double depth = keys[i].m_priority; - - if (layer != 0 && depth < 19000) - { - if (keys[i].m_type == drule::line || keys[i].m_type == drule::waymarker) - depth = (layer * drule::layer_base_priority) + fmod(depth, drule::layer_base_priority); - else if (keys[i].m_type == drule::area) - { - // Use raw depth adding in area feature layers - // (avoid overlap linear objects in case of "fmod"). - depth += layer * drule::layer_base_priority; - } - } - - if (keys[i].m_type == drule::symbol || keys[i].m_type == drule::circle) - hasIcon = true; - - if ((keys[i].m_type == drule::caption && hasName) - || (keys[i].m_type == drule::symbol) - || (keys[i].m_type == drule::circle)) - m_hasPointStyles = true; - - if (keys[i].m_type == drule::caption - || keys[i].m_type == drule::symbol - || keys[i].m_type == drule::circle - || keys[i].m_type == drule::pathtext) - { - // show labels of larger objects first - depth += priorityModifier; - // show labels of nodes first - if (m_geometryType == feature::GEOM_POINT) - ++depth; - } - else if (keys[i].m_type == drule::area) - { - // show smaller polygons on top - depth -= priorityModifier; - } - - if (!m_hasLineStyles && (keys[i].m_type == drule::line)) - m_hasLineStyles = true; - - m_rules[i] = di::DrawRule(drule::rules().Find(keys[i]), depth); - - if (m_rules[i].m_rule->GetCaption(1) != 0) - hasSecondaryText = true; - - CaptionDefProto const * pCap0 = m_rules[i].m_rule->GetCaption(0); - if (pCap0) - { - textType = m_rules[i].m_rule->GetCaptionTextType(0); - - if (!m_hasPathText && hasName && (m_geometryType == feature::GEOM_LINE)) - { - m_hasPathText = true; - - if (!FilterTextSize(m_rules[i].m_rule)) - m_fontSize = max(m_fontSize, GetTextFontSize(m_rules[i].m_rule)); - } - - if (keys[i].m_type == drule::caption) - hasCaptionWithoutOffset = !(pCap0->has_offset_y() || pCap0->has_offset_x()); - } - } - - // User's language name is better if we don't have secondary text draw rule. - if (!hasSecondaryText && !m_secondaryText.empty() && (m_geometryType != feature::GEOM_LINE)) - { - f.GetReadableName(m_primaryText); - if (m_primaryText == m_secondaryText) - m_secondaryText.clear(); - } - - if (isBuilding) - { - string houseNumber = f.GetHouseNumber(); - // Mark houses without names/numbers so user can select them by single tap. - if (houseNumber.empty() && m_primaryText.empty()) - houseNumber = "·"; - - if (textType == drule::text_type_housenumber) - { - m_primaryText = move(houseNumber); - } - else if (textType == drule::text_type_name) - { - // Get or concat house number if feature has one. - if (!houseNumber.empty()) - { - if (m_primaryText.empty() || houseNumber.find(m_primaryText) != string::npos) - m_primaryText = move(houseNumber); - else - m_primaryText = m_primaryText + " (" + houseNumber + ")"; - } - } - } - - // placing a text on the path - if (m_hasPathText && (m_fontSize != 0)) - { - typedef gp::filter_screenpts_adapter functor_t; - - functor_t::params p; - - p.m_convertor = m_convertor; - p.m_rect = m_rect; - p.m_intervals = &m_intervals; - - functor_t fun(p); - f.ForEachPointRef(fun, zoom); - - LayoutTexts(fun.m_length); - } - - if (hasIcon && hasCaptionWithoutOffset) - { - // we need to delete symbol style and circle style - for (size_t i = 0; i < m_rules.size();) - { - if (keys[i].m_type == drule::symbol || keys[i].m_type == drule::circle) - { - m_rules[i] = m_rules[m_rules.size() - 1]; - m_rules.pop_back(); - keys[i] = keys[keys.size() - 1]; - keys.pop_back(); - } - else - ++i; - } - } - - sort(m_rules.begin(), m_rules.end(), less_depth()); - } - - typedef pair RangeT; - template class RangeIterT : - public iterator_facade, RangeT, forward_traversal_tag, RangeT> - { - IterT m_iter; - public: - RangeIterT(IterT iter) : m_iter(iter) {} - - RangeT dereference() const - { - IterT next = m_iter; - ++next; - return RangeT(*m_iter, *next); - } - bool equal(RangeIterT const & r) const { return (m_iter == r.m_iter); } - void increment() - { - ++m_iter; ++m_iter; - } - }; - - template class RangeInserter - { - ContT & m_cont; - public: - RangeInserter(ContT & cont) : m_cont(cont) {} - - RangeInserter & operator*() { return *this; } - RangeInserter & operator++(int) { return *this; } - RangeInserter & operator=(RangeT const & r) - { - m_cont.push_back(r.first); - m_cont.push_back(r.second); - return *this; - } - }; - - void FeatureStyler::LayoutTexts(double pathLength) - { - double const textLength = m_glyphCache->getTextLength(m_fontSize, GetPathName()); - /// @todo Choose best constant for minimal space. - double const emptySize = max(200 * m_visualScale, textLength); - // multiply on factor because tiles will be rendered in smaller scales - double const minPeriodSize = 1.5 * (emptySize + textLength); - - size_t textCnt = 0; - double firstTextOffset = 0; - - if (pathLength > textLength) - { - textCnt = ceil((pathLength - textLength) / minPeriodSize); - firstTextOffset = 0.5 * (pathLength - (textCnt * textLength + (textCnt - 1) * emptySize)); - } - - if (textCnt != 0 && !m_intervals.empty()) - { - buffer_vector deadZones; - - for (size_t i = 0; i < textCnt; ++i) - { - double const deadZoneStart = firstTextOffset + minPeriodSize * i; - double const deadZoneEnd = deadZoneStart + textLength; - - if (deadZoneStart > m_intervals.back()) - break; - - deadZones.push_back(make_pair(deadZoneStart, deadZoneEnd)); - } - - if (!deadZones.empty()) - { - buffer_vector res; - - // accumulate text layout intervals with cliping intervals - typedef RangeIterT IterT; - AccumulateIntervals1With2(IterT(m_intervals.begin()), IterT(m_intervals.end()), - deadZones.begin(), deadZones.end(), - RangeInserter(res)); - - m_intervals = res; - ASSERT_EQUAL(m_intervals.size() % 2, 0, ()); - - // get final text offsets (belongs to final clipping intervals) - size_t i = 0; - size_t j = 0; - while (i != deadZones.size() && j != m_intervals.size()) - { - ASSERT_LESS(deadZones[i].first, deadZones[i].second, ()); - ASSERT_LESS(m_intervals[j], m_intervals[j+1], ()); - - if (deadZones[i].first < m_intervals[j]) - { - ++i; - continue; - } - if (m_intervals[j+1] <= deadZones[i].first) - { - j += 2; - continue; - } - - ASSERT_LESS_OR_EQUAL(m_intervals[j], deadZones[i].first, ()); - ASSERT_LESS_OR_EQUAL(deadZones[i].second, m_intervals[j+1], ()); - - m_offsets.push_back(deadZones[i].first); - ++i; - } - } - } - } - - string const FeatureStyler::GetPathName() const - { - // Always concat names for linear features because we process only one draw rule now. - if (m_secondaryText.empty()) - return m_primaryText; - else - return m_primaryText + " " + m_secondaryText; - } - - bool FeatureStyler::IsEmpty() const - { - return m_rules.empty(); - } - - uint8_t FeatureStyler::GetTextFontSize(drule::BaseRule const * pRule) const - { - return pRule->GetCaption(0)->height() * m_visualScale; - } - - bool FeatureStyler::FilterTextSize(drule::BaseRule const * pRule) const - { - if (pRule->GetCaption(0)) - return (GetFontSize(pRule->GetCaption(0)) < 3); - else - { - // this rule is not a caption at all - return true; - } - } -} diff --git a/render/feature_styler.hpp b/render/feature_styler.hpp deleted file mode 100644 index 842b014746..0000000000 --- a/render/feature_styler.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include "indexer/drawing_rules.hpp" - -#include "geometry/rect2d.hpp" - -#include "std/vector.hpp" - - -class FeatureType; -class ScreenBase; -namespace graphics { class GlyphCache; } - -namespace di -{ - struct DrawRule - { - drule::BaseRule const * m_rule; - double m_depth; - - DrawRule() : m_rule(0), m_depth(0.0) {} - DrawRule(drule::BaseRule const * p, double depth); - - uint32_t GetID(size_t threadSlot) const; - void SetID(size_t threadSlot, uint32_t id) const; - }; - - struct FeatureStyler - { - FeatureStyler() = default; - FeatureStyler(FeatureType const & f, - int const zoom, - double const visualScale, - graphics::GlyphCache * glyphCache, - ScreenBase const * convertor, - m2::RectD const * rect); - - typedef buffer_vector StylesContainerT; - StylesContainerT m_rules; - - bool m_isCoastline; - bool m_hasLineStyles; - bool m_hasPointStyles; - bool m_hasPathText; - int m_geometryType; - - double m_visualScale; - - string m_primaryText; - string m_secondaryText; - string m_refText; - - typedef buffer_vector ClipIntervalsT; - ClipIntervalsT m_intervals; - - typedef buffer_vector TextOffsetsT; - TextOffsetsT m_offsets; - - uint8_t m_fontSize; - - graphics::GlyphCache * m_glyphCache; - ScreenBase const * m_convertor; - m2::RectD const * m_rect; - - bool IsEmpty() const; - - string const GetPathName() const; - - bool FilterTextSize(drule::BaseRule const * pRule) const; - - private: - uint8_t GetTextFontSize(drule::BaseRule const * pRule) const; - void LayoutTexts(double pathLength); - }; -} diff --git a/render/geometry_processors.cpp b/render/geometry_processors.cpp deleted file mode 100644 index d2559ec7c2..0000000000 --- a/render/geometry_processors.cpp +++ /dev/null @@ -1,276 +0,0 @@ -#include "geometry_processors.hpp" - -#include "std/bind.hpp" - -namespace gp -{ - using namespace di; - - base_screen::base_screen(params const & p) - : base(p) - { - m_convertor->GtoP(*p.m_rect, m_rect); - } - - void one_point::operator() (m2::PointD const & pt) - { - ASSERT ( !m_exist, ("point feature should have only one point") ); - - if (m_rect->IsPointInside(pt)) - { - m_exist = true; - m_point = convert_point(pt); - } - else - m_exist = false; - } - - interval_params::interval_params(params const & p) - : base_t(p), - m_intervals(p.m_intervals), - m_length(0.0), - m_hasPrevPt(false) - { - } - - void get_path_intervals::operator()(m2::PointD const & pt) - { - if (m_hasPrevPt) - { - m2::PointD prev = m_prev; - m2::PointD cur = pt; - - double const segLen = cur.Length(prev); - - if (m2::Intersect(base_t::m_rect, prev, cur)) - { - double clipStart = prev.Length(m_prev) + m_length; - double clipEnd = cur.Length(m_prev) + m_length; - - if (m_intervals->empty()) - { - m_intervals->push_back(clipStart); - m_intervals->push_back(clipEnd); - } - else - { - if (my::AlmostEqualULPs(m_intervals->back(), clipStart)) - m_intervals->back() = clipEnd; - else - { - m_intervals->push_back(clipStart); - m_intervals->push_back(clipEnd); - } - } - } - - m_prev = pt; - m_length += segLen; - } - else - { - m_prev = pt; - m_hasPrevPt = true; - } - } - - bool get_path_intervals::IsExist() const - { - return !m_intervals->empty(); - } - - void cut_path_intervals::operator()(m2::PointD const & pt) - { - if (m_hasPrevPt) - { - double const segLen = pt.Length(m_prev); - - for (; m_pos != m_intervals->size(); m_pos += 2) - { - double const start = (*m_intervals)[m_pos]; - if (start >= m_length + segLen) - break; - - m2::PointD const dir = (pt - m_prev) / segLen; - - if (start >= m_length) - { - m_points.push_back(PathInfo(start)); - push_point(m_prev + dir * (start - m_length)); - } - - double const end = (*m_intervals)[m_pos+1]; - if (end >= m_length + segLen) - { - push_point(pt); - break; - } - - if (end < m_length + segLen) - { - push_point(m_prev + dir * (end - m_length)); -#ifdef DEBUG - double const len = m_points.back().GetLength(); - ASSERT_LESS_OR_EQUAL ( fabs(len - (end - start)), 1.0E-4, (len, end - start) ); -#endif - } - } - - m_prev = pt; - m_length += segLen; - } - else - { - m_hasPrevPt = true; - m_prev = pt; - } - } - - bool cut_path_intervals::IsExist() - { - // finally, assign whole length to every cutted path - for_each(m_points.begin(), m_points.end(), - bind(&di::PathInfo::SetFullLength, _1, m_length)); - - return !m_points.empty(); - } - - void path_points::StartPL(m2::PointD const & pt) - { - EndPL(); - - m_points.push_back(PathInfo(m_length + m_prev.Length(pt))); - push_point(pt); - - m_newPL = false; - } - - void path_points::EndPL() - { - if (!m_points.empty() && m_points.back().size() < 2) - m_points.pop_back(); - } - - void path_points::simple_filtration(m2::PointD const & pt) - { - if (m_hasPrevPt) - { - if (!m2::RectD(m_prev, pt).IsIntersect(m_rect)) - m_newPL = true; - else - { - if (m_newPL) - StartPL(m_prev); - - push_point(pt); - } - - m_length += m_prev.Length(pt); - } - else - { - m_hasPrevPt = true; - m_length = 0.0; - } - - m_prev = pt; - } - - void path_points::best_filtration(m2::PointD const & pt) - { - if (m_hasPrevPt) - { - m2::PointD prev = m_prev; - m2::PointD curr = pt; - - double const segLen = curr.Length(prev); - - if ((m_startLength != 0) && (m_endLength != 0)) - { - if ((m_startLength >= m_length) && (m_startLength < m_length + segLen)) - m_startLength = m_length; - - if ((m_endLength > m_length) && (m_endLength <= m_length + segLen)) - m_endLength = m_length + segLen; - } - - if ((m_length >= m_startLength) && (m_endLength >= m_length + segLen)) - { - /// we're in the dead zone. add without clipping - if (m_newPL) - StartPL(prev); - - push_point(curr); - } - else - { - if (!m2::Intersect(m_rect, prev, curr)) - m_newPL = true; - else - { - if (!equal_glb_pts(prev, m_prev)) - m_newPL = true; - - if (m_newPL) - StartPL(prev); - - push_point(curr); - - if (!equal_glb_pts(curr, pt)) - m_newPL = true; - } - } - - m_length += segLen; - } - else - { - m_hasPrevPt = true; - m_length = 0.0; - } - - m_prev = pt; - } - - void path_points::operator() (m2::PointD const & p) - { - // Choose simple (fast) or best (slow) filtration - - //simple_filtration(p); - best_filtration(p); - } - - bool path_points::IsExist() - { - // finally, assign whole length to every cutted path - for_each(m_points.begin(), m_points.end(), - bind(&di::PathInfo::SetFullLength, _1, m_length)); - - EndPL(); - return base_type::IsExist(); - } - - void area_tess_points::StartPrimitive(size_t ptsCount) - { - m_points.push_back(AreaInfo()); - m_points.back().reserve(ptsCount); - } - - void area_tess_points::operator() (m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3) - { - push_point(p1); - push_point(p2); - push_point(p3); - } - - void area_tess_points::EndPrimitive() - { - if (m_points.back().size() < 3) - m_points.pop_back(); - } - - bool area_tess_points::IsExist() const - { - return !m_points.empty(); - } -} diff --git a/render/geometry_processors.hpp b/render/geometry_processors.hpp deleted file mode 100644 index 8bb419a312..0000000000 --- a/render/geometry_processors.hpp +++ /dev/null @@ -1,341 +0,0 @@ -#pragma once - -#include "area_info.hpp" -#include "path_info.hpp" - -#include "../indexer/cell_id.hpp" // CoordPointT - -#include "geometry/point2d.hpp" -#include "geometry/rect2d.hpp" -#include "geometry/rect_intersect.hpp" -#include "geometry/screenbase.hpp" - -#include "std/list.hpp" -#include "std/limits.hpp" - -#include "base/buffer_vector.hpp" - -class ScreenBase; - -namespace gp -{ - /// @name Base class policies (use by inheritance) for points processing. - /// Containt next functions:\n - /// - make_point - convert from Feature point to Screen point - /// - convert_point - convert point to screen coordinates;\n - /// - m_rect - clip rect;\n - - //@{ - struct base - { - struct params - { - ScreenBase const * m_convertor; - params() : m_convertor() - {} - }; - - base(params const & p) - : m_convertor(p.m_convertor) - { - } - - ScreenBase const * m_convertor; - - m2::PointD g2p(m2::PointD const & pt) const - { - return m_convertor->GtoP(pt); - } - }; - - /// in global coordinates - struct base_global : public base - { - m2::RectD const * m_rect; - - m2::PointD convert_point(m2::PointD const & pt) const - { - return g2p(pt); - } - - struct params : base::params - { - m2::RectD const * m_rect; - params() : m_rect(0){} - }; - - base_global(params const & p) - : base(p), m_rect(p.m_rect) - { - } - }; - - /// in screen coordinates - struct base_screen : public base - { - m2::RectD m_rect; - - struct params : base::params - { - m2::RectD const * m_rect; - params() : m_rect(0) - {} - }; - - base_screen(params const & p); - - m2::PointD convert_point(m2::PointD const & pt) const - { - return pt; - } - }; - - //@} - - template - struct calc_length : public TBase - { - bool m_exist; - m2::PointD m_prevPt; - double m_length; - - typedef typename TBase::params params; - - calc_length(params const & p) : - TBase(p), m_exist(false), m_length(0) - {} - - void operator() (m2::PointD const & p) - { - m2::PointD const pt(this->convert_point(p)); - - if (m_exist) - m_length += pt.Length(m_prevPt); - - m_exist = true; - m_prevPt = pt; - } - - bool IsExist() const - { - return m_exist; - } - }; - - struct one_point : public base_global - { - bool m_exist; - m2::PointD m_point; - - typedef base_global::params params; - - one_point(params const & p) - : base_global(p), m_exist(false) - { - } - - void operator() (m2::PointD const & pt); - - bool IsExist() const - { - return m_exist; - } - }; - - template - struct geometry_base : public TBase - { - public: - list m_points; - - typedef typename TBase::params params; - - geometry_base(params const & p) - : TBase(p) - { - } - - bool IsExist() const - { - return !m_points.empty(); - } - - void push_point(m2::PointD const & pt) - { - /// @todo Filter for equal points. - m_points.back().push_back(this->convert_point(pt)); - } - }; - - struct interval_params : public geometry_base - { - typedef geometry_base base_t; - - buffer_vector * m_intervals; - - m2::PointD m_prev; - double m_length; - bool m_hasPrevPt; - - struct params : base_t::params - { - buffer_vector * m_intervals; - params() : m_intervals(0) {} - }; - - interval_params(params const & p); - }; - - struct get_path_intervals : public interval_params - { - get_path_intervals(params const & p) : interval_params(p) {} - - void operator() (m2::PointD const & pt); - - bool IsExist() const; - }; - - struct cut_path_intervals : public interval_params - { - size_t m_pos; - - cut_path_intervals(params const & p) : interval_params(p), m_pos(0) {} - - void operator() (m2::PointD const & p); - - bool IsExist(); - }; - - class path_points : public geometry_base - { - typedef geometry_base base_type; - - bool m_newPL, m_hasPrevPt; - m2::PointD m_prev; - - double m_length; - double m_startLength; - double m_endLength; - - void StartPL(m2::PointD const & pt); - void EndPL(); - - static bool equal_glb_pts(m2::PointD const & p1, m2::PointD const & p2) - { - return p1.EqualDxDy(p2, 1.0E-12); - } - - void simple_filtration(m2::PointD const & p); - void best_filtration(m2::PointD const & p); - - public: - - struct params : base_type::params - { - double m_startLength; - double m_endLength; - params() : m_startLength(0), m_endLength(0) - {} - }; - - path_points(params const & p) - : base_type(p), - m_newPL(true), - m_hasPrevPt(false), - m_length(0.0), - m_startLength(p.m_startLength), - m_endLength(p.m_endLength) - { - } - - void operator() (m2::PointD const & p); - - bool IsExist(); - }; - - /// @name Policies for filling area. - //@{ - class area_base : public geometry_base - { - typedef geometry_base base_type; - - public: - - typedef base_type::params params; - - area_base(params const & p) - : base_type(p) - { - } - }; - - /// Used for triangle draw policy. - class area_tess_points : public area_base - { - public: - typedef area_base::params params; - - area_tess_points(params const & p) - : area_base(p) - { - } - - void StartPrimitive(size_t ptsCount); - void operator() (m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3); - void EndPrimitive(); - - bool IsExist() const; - }; - //@} - - /// Adapter for points filtering, before they will go for processing - template class filter_screenpts_adapter : public TBase - { - m2::PointD m_prev, m_center; - - static bool equal_scr_pts(m2::PointD const & p1, m2::PointD const & p2) - { - return p1.EqualDxDy(p2, 0.5); - } - static bool empty_scr_rect(m2::RectD const & r) - { - double const eps = 1.0; - return (r.SizeX() < eps && r.SizeY() < eps); - } - - public: - - typedef typename TBase::params params; - - filter_screenpts_adapter(params const & p) - : TBase(p), - m_prev(numeric_limits::min(), numeric_limits::min()), m_center(0, 0) - { - } - - void operator() (m2::PointD const & p) - { - m2::PointD const pt = this->g2p(p); - if (!equal_scr_pts(m_prev, pt)) - { - TBase::operator()(pt); - m_prev = pt; - } - } - - void operator() (m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3) - { - m2::PointD arr[] = { this->g2p(p1), this->g2p(p2), this->g2p(p3) }; - - m2::RectD r; - for (int i = 0; i < 3; ++i) - r.Add(arr[i]); - - if (!empty_scr_rect(r) && r.IsIntersect(this->m_rect)) - TBase::operator()(arr[0], arr[1], arr[2]); - } - - m2::PointD GetCenter() const { return m_center; } - void SetCenter(m2::PointD const & p) { m_center = this->g2p(p); } - }; -} diff --git a/render/gpu_drawer.cpp b/render/gpu_drawer.cpp deleted file mode 100644 index 9e3efec2b4..0000000000 --- a/render/gpu_drawer.cpp +++ /dev/null @@ -1,290 +0,0 @@ -#include "gpu_drawer.hpp" -#include "feature_styler.hpp" -#include "proto_to_styles.hpp" -#include "path_info.hpp" -#include "area_info.hpp" - -#include "indexer/drawing_rules.hpp" -#include "indexer/feature_decl.hpp" - -#include "graphics/screen.hpp" - -namespace -{ - graphics::OverlayElement::UserInfo ToUserInfo(FeatureID const & id) - { - graphics::OverlayElement::UserInfo info; - info.m_featureID = id; - return info; - } -} - -GPUDrawer::GPUDrawer(Params const & params) - : TBase(params) - , m_pScreen(new graphics::Screen(params.m_screenParams)) -{ - for (unsigned i = 0; i < m_pScreen->pipelinesCount(); ++i) - m_pScreen->addClearPageFn(i, bind(&GPUDrawer::ClearResourceCache, ThreadSlot(), i), 0); -} - -graphics::Screen * GPUDrawer::Screen() const -{ - return m_pScreen.get(); -} - -void GPUDrawer::BeginFrame() -{ - m_pScreen->beginFrame(); -} - -void GPUDrawer::EndFrame() -{ - m_pScreen->endFrame(); -} - -void GPUDrawer::OnSize(int w, int h) -{ - m_pScreen->onSize(w, h); -} - -graphics::GlyphCache * GPUDrawer::GetGlyphCache() -{ - return Screen()->glyphCache(); -} - -int GPUDrawer::ThreadSlot() const -{ - return m_pScreen->threadSlot(); -} - -void GPUDrawer::DrawCircle(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & rule) -{ - graphics::Circle::Info ci; - ConvertStyle(rule.m_rule->GetCircle(), VisualScale(), ci); - - graphics::CircleElement::Params params; - - params.m_depth = rule.m_depth; - params.m_position = pos; - params.m_pivot = pt; - params.m_ci = ci; - params.m_userInfo = ToUserInfo(GetCurrentFeatureID()); - - m_pScreen->drawCircle(params); -} - -void GPUDrawer::DrawSymbol(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & rule) -{ - graphics::Icon::Info info; - ConvertStyle(rule.m_rule->GetSymbol(), info); - - graphics::SymbolElement::Params params; - params.m_depth = rule.m_depth; - params.m_position = pos; - params.m_pivot = pt; - params.m_info = info; - params.m_renderer = m_pScreen.get(); - params.m_userInfo = ToUserInfo(GetCurrentFeatureID()); - - m_pScreen->drawSymbol(params); -} - -void GPUDrawer::DrawCircledSymbol(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & symbolRule, - di::DrawRule const & circleRule) -{ - graphics::Icon::Info info; - ConvertStyle(symbolRule.m_rule->GetSymbol(), info); - - graphics::Circle::Info ci; - ConvertStyle(circleRule.m_rule->GetCircle(), VisualScale(), ci); - - graphics::SymbolElement::Params symParams; - symParams.m_depth = symbolRule.m_depth; - symParams.m_position = pos; - symParams.m_pivot = pt; - symParams.m_info = info; - symParams.m_renderer = m_pScreen.get(); - symParams.m_userInfo = ToUserInfo(GetCurrentFeatureID()); - - graphics::CircleElement::Params circleParams; - circleParams.m_depth = circleRule.m_depth; - circleParams.m_position = pos; - circleParams.m_pivot = pt; - circleParams.m_ci = ci; - circleParams.m_userInfo = ToUserInfo(GetCurrentFeatureID()); - - m_pScreen->drawCircledSymbol(symParams, circleParams); -} - -void GPUDrawer::DrawPath(di::PathInfo const & path, di::DrawRule const * rules, size_t count) -{ - // if any rule needs caching - cache as a whole vector - bool flag = false; - for (size_t i = 0; i < count; ++i) - { - if (rules[i].GetID(m_pScreen->threadSlot()) == drule::BaseRule::empty_id) - { - flag = true; - break; - } - } - - buffer_vector penInfos(count); - buffer_vector infos(count); - buffer_vector resIDs(count); - - if (flag) - { - // collect graphics::PenInfo into array and pack them as a whole - for (size_t i = 0; i < count; ++i) - { - ConvertStyle(rules[i].m_rule->GetLine(), VisualScale(), penInfos[i]); - - infos[i] = &penInfos[i]; - - resIDs[i] = m_pScreen->invalidHandle(); - } - - // map array of pens - if (m_pScreen->mapInfo(&infos[0], &resIDs[0], count)) - { - for (size_t i = 0; i < count; ++i) - rules[i].SetID(ThreadSlot(), resIDs[i]); - } - else - { - buffer_vector rects; - for (unsigned i = 0; i < count; ++i) - rects.push_back(infos[i]->resourceSize()); - LOG(LERROR, ("couldn't successfully pack a sequence of path styles as a whole:" , rects)); - - return; - } - } - - // draw path with array of rules - for (size_t i = 0; i < count; ++i) - m_pScreen->drawPath(&path.m_path[0], - path.m_path.size(), - -path.GetOffset(), - rules[i].GetID(ThreadSlot()), - rules[i].m_depth); -} - -void GPUDrawer::DrawArea(di::AreaInfo const & area, di::DrawRule const & rule) -{ - // DO NOT cache 'id' in pRule, because one rule can use in drawPath and drawArea. - // Leave CBaseRule::m_id for drawPath. mapColor working fast enough. - - graphics::Brush::Info info; - ConvertStyle(rule.m_rule->GetArea(), info); - - uint32_t const id = m_pScreen->mapInfo(info); - ASSERT ( id != -1, () ); - - m_pScreen->drawTrianglesList(&area.m_path[0], area.m_path.size(), id, rule.m_depth); -} - -void GPUDrawer::DrawText(m2::PointD const & pt, - graphics::EPosition pos, - di::FeatureStyler const & fs, - di::DrawRule const & rule) -{ - graphics::FontDesc primaryFont; - m2::PointD primaryOffset; - ConvertStyle(rule.m_rule->GetCaption(0), VisualScale(), primaryFont, primaryOffset); - - graphics::FontDesc secondaryFont; - m2::PointD secondaryOffset; - if (rule.m_rule->GetCaption(1)) - ConvertStyle(rule.m_rule->GetCaption(1), VisualScale(), secondaryFont, secondaryOffset); - - graphics::StraightTextElement::Params params; - params.m_depth = rule.m_depth; - params.m_fontDesc = primaryFont; - params.m_auxFontDesc = secondaryFont; - params.m_offset = primaryOffset; - params.m_log2vis = true; - params.m_pivot = pt; - params.m_position = pos; - params.m_logText = strings::MakeUniString(fs.m_primaryText); - params.m_auxLogText = strings::MakeUniString(fs.m_secondaryText); - params.m_doSplit = true; - params.m_useAllParts = false; - params.m_userInfo = ToUserInfo(GetCurrentFeatureID()); - - m_pScreen->drawTextEx(params); -} - -void GPUDrawer::DrawPathText(di::PathInfo const & path, - di::FeatureStyler const & fs, - di::DrawRule const & rule) -{ - graphics::FontDesc font; - m2::PointD offset; - ConvertStyle(rule.m_rule->GetCaption(0), VisualScale(), font, offset); - - if (fs.m_offsets.empty()) - return; - - m_pScreen->drawPathText(font, - &path.m_path[0], - path.m_path.size(), - fs.GetPathName(), - path.GetFullLength(), - path.GetOffset(), - &fs.m_offsets[0], - fs.m_offsets.size(), - rule.m_depth); -} - -void GPUDrawer::DrawPathNumber(di::PathInfo const & path, - di::FeatureStyler const & fs, - di::DrawRule const & rule) -{ - graphics::FontDesc font; - ConvertStyle(rule.m_rule->GetShield(), VisualScale(), font); - - GenerateRoadNumbers(path, font, fs, [this](m2::PointD const & pt, graphics::FontDesc const & font, string const & text) - { - m_pScreen->drawText(font, pt, graphics::EPosCenter, text, 0, true /*log2vis*/); - }); -} - -namespace -{ - struct DoMakeInvalidRule - { - size_t m_threadSlot; - uint32_t m_pipelineIDMask; - - DoMakeInvalidRule(size_t threadSlot, uint8_t pipelineID) - : m_threadSlot(threadSlot), m_pipelineIDMask(pipelineID << 24) - {} - - void operator() (int, int, int, drule::BaseRule * p) - { - if ((p->GetID(m_threadSlot) & 0xFF000000) == m_pipelineIDMask) - p->MakeEmptyID(m_threadSlot); - } - }; -} - - -void GPUDrawer::ClearResourceCache(size_t threadSlot, uint8_t pipelineID) -{ - drule::rules().ForEachRule(DoMakeInvalidRule(threadSlot, pipelineID)); -} - - -graphics::Screen * GPUDrawer::GetScreen(Drawer * drawer) -{ - ASSERT(dynamic_cast(drawer) != nullptr, ()); - return static_cast(drawer)->Screen(); -} diff --git a/render/gpu_drawer.hpp b/render/gpu_drawer.hpp deleted file mode 100644 index d45cd2b4e8..0000000000 --- a/render/gpu_drawer.hpp +++ /dev/null @@ -1,91 +0,0 @@ -#pragma once - -#include "drawer.hpp" - -#include "graphics/screen.hpp" - -#include "std/unique_ptr.hpp" - -class ScreenBase; - -namespace drule -{ - class BaseRule; -} - -namespace graphics -{ - namespace gl - { - class FrameBuffer; - class BaseTexture; - } - - class ResourceManager; -} - -class GPUDrawer : public Drawer -{ - using TBase = Drawer; - -public: - struct Params : Drawer::Params - { - graphics::Screen::Params m_screenParams; - }; - - GPUDrawer(Params const & params); - - graphics::Screen * Screen() const; - - void BeginFrame(); - void EndFrame(); - void OnSize(int w, int h); - graphics::GlyphCache * GetGlyphCache() override; - - static graphics::Screen * GetScreen(Drawer * drawer); - -protected: - typedef shared_ptr texture_t; - typedef shared_ptr frame_buffer_t; - - int ThreadSlot() const; - - void DrawSymbol(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & rule) override; - - void DrawCircle(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & rule) override; - - void DrawCircledSymbol(m2::PointD const & pt, - graphics::EPosition pos, - di::DrawRule const & symbolRule, - di::DrawRule const & circleRule) override; - - void DrawPath(di::PathInfo const & path, - di::DrawRule const * rules, - size_t count) override; - - void DrawArea(di::AreaInfo const & area, - di::DrawRule const & rule) override; - - void DrawText(m2::PointD const & pt, - graphics::EPosition pos, - di::FeatureStyler const & fs, - di::DrawRule const & rule) override; - - void DrawPathText(di::PathInfo const & info, - di::FeatureStyler const & fs, - di::DrawRule const & rule) override; - - void DrawPathNumber(di::PathInfo const & path, - di::FeatureStyler const & fs, - di::DrawRule const & rule) override; - -private: - static void ClearResourceCache(size_t threadSlot, uint8_t pipelineID); - - unique_ptr const m_pScreen; -}; diff --git a/render/path_info.hpp b/render/path_info.hpp deleted file mode 100644 index 70679ee655..0000000000 --- a/render/path_info.hpp +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once - -#include "geometry/point2d.hpp" -#include "geometry/rect2d.hpp" - -#include "std/vector.hpp" -#include "std/algorithm.hpp" - -namespace di -{ - class PathInfo - { - double m_fullL; - double m_offset; - - public: - vector m_path; - - // -1.0 means "not" initialized - PathInfo(double offset = -1.0) : m_fullL(-1.0), m_offset(offset) {} - - void swap(PathInfo & r) - { - m_path.swap(r.m_path); - std::swap(m_fullL, r.m_fullL); - std::swap(m_offset, r.m_offset); - } - - void push_back(m2::PointD const & p) - { - m_path.push_back(p); - } - - size_t size() const { return m_path.size(); } - - void SetFullLength(double len) { m_fullL = len; } - double GetFullLength() const - { - ASSERT ( m_fullL > 0.0, (m_fullL) ); - return m_fullL; - } - - double GetLength() const - { - double sum = 0.0; - for (size_t i = 1; i < m_path.size(); ++i) - { - double const l = m_path[i-1].Length(m_path[i]); - sum += l; - } - return sum; - } - - double GetOffset() const - { - ASSERT ( m_offset >= 0.0, (m_offset) ); - return m_offset; - } - - bool GetSmPoint(double part, m2::PointD & pt) const - { - double sum = -GetFullLength() * part + m_offset; - if (sum > 0.0) return false; - - for (size_t i = 1; i < m_path.size(); ++i) - { - double const l = m_path[i-1].Length(m_path[i]); - sum += l; - if (sum >= 0.0) - { - double const factor = (l - sum) / l; - ASSERT_GREATER_OR_EQUAL ( factor, 0.0, () ); - - pt.x = factor * (m_path[i].x - m_path[i-1].x) + m_path[i-1].x; - pt.y = factor * (m_path[i].y - m_path[i-1].y) + m_path[i-1].y; - return true; - } - } - - return false; - } - - m2::RectD GetLimitRect() const - { - m2::RectD rect; - for (size_t i = 0; i < m_path.size(); ++i) - rect.Add(m_path[i]); - return rect; - } - }; -} - -inline void swap(di::PathInfo & p1, di::PathInfo & p2) -{ - p1.swap(p2); -} diff --git a/render/proto_to_styles.hpp b/render/proto_to_styles.hpp deleted file mode 100644 index ca1c2b9489..0000000000 --- a/render/proto_to_styles.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "graphics/pen.hpp" -#include "graphics/brush.hpp" -#include "graphics/icon.hpp" -#include "graphics/circle.hpp" -#include "graphics/font_desc.hpp" - -class LineDefProto; -class AreaRuleProto; -class SymbolRuleProto; -class CaptionDefProto; -class CircleRuleProto; -class ShieldRuleProto; - -graphics::Color ConvertColor(uint32_t c); - -void ConvertStyle(LineDefProto const * pSrc, double scale, graphics::Pen::Info & dest); -void ConvertStyle(AreaRuleProto const * pSrc, graphics::Brush::Info & dest); -void ConvertStyle(SymbolRuleProto const * pSrc, graphics::Icon::Info & dest); -void ConvertStyle(CircleRuleProto const * pSrc, double scale, graphics::Circle::Info & dest); -void ConvertStyle(CaptionDefProto const * pSrc, double scale, graphics::FontDesc & dest, m2::PointD & offset); -void ConvertStyle(ShieldRuleProto const * pSrc, double scale, graphics::FontDesc & dest); - -uint8_t GetFontSize(CaptionDefProto const * pSrc); diff --git a/render/queued_renderer.cpp b/render/queued_renderer.cpp deleted file mode 100644 index 92f8c660a2..0000000000 --- a/render/queued_renderer.cpp +++ /dev/null @@ -1,212 +0,0 @@ -#include "queued_renderer.hpp" - -#include "graphics/opengl/opengl.hpp" - -QueuedRenderer::QueuedRenderer(int pipelinesCount, - shared_ptr const & rc) -{ - m_Pipelines = new PacketsPipeline[pipelinesCount]; - for (int i = 0; i < pipelinesCount; ++i) - m_Pipelines[i].m_CouldExecutePartially = false; - m_PipelinesCount = pipelinesCount; - m_CurrentPipeline = 0; - m_RenderContext = rc; -} - -QueuedRenderer::~QueuedRenderer() -{ -/* for (unsigned i = 0; i < m_PipelinesCount; ++i) - CancelQueuedCommands(i);*/ - - delete [] m_Pipelines; - - LOG(LDEBUG, ("deleted QueuedRenderPolicy")); -} - -bool QueuedRenderer::NeedRedraw() const -{ - for (unsigned i = 0; i < m_PipelinesCount; ++i) - { - if (!m_Pipelines[i].m_Queue.empty()) - return true; - if (!m_Pipelines[i].m_FrameCommands.empty()) - return true; - } - - return false; -} - -void QueuedRenderer::SetPartialExecution(int pipelineNum, bool flag) -{ - m_Pipelines[pipelineNum].m_CouldExecutePartially = flag; -} - -void QueuedRenderer::BeginFrame() -{ - m_IsDebugging = false; -} - -void QueuedRenderer::EndFrame() -{ -} - -void QueuedRenderer::DrawFrame() -{ - /// cyclically checking pipelines starting from m_CurrentPipeline - for (unsigned i = 0; i < m_PipelinesCount; ++i) - { - int num = (m_CurrentPipeline + i) % m_PipelinesCount; - - if (RenderQueuedCommands(num)) - { - /// next DrawFrame should start from another pipeline - m_CurrentPipeline = (num + 1) % m_PipelinesCount; - } - } -} - -bool QueuedRenderer::RenderQueuedCommands(int pipelineNum) -{ - /// logging only calls that is made while rendering tiles. -// if ((pipelineNum == 0) && (m_IsDebugging)) -// graphics::gl::g_doLogOGLCalls = true; - - unsigned cmdProcessed = 0; - - /// FrameCommands could contain commands from the previous frame if - /// the processed pipeline is allowed to be executed partially. - PacketsPipeline & ppl = m_Pipelines[pipelineNum]; - if (ppl.m_FrameCommands.empty()) - ppl.m_Queue.processList([&ppl] (list & queueData) { ppl.FillFrameCommands(queueData, 1); }); - - cmdProcessed = ppl.m_FrameCommands.size(); - - list::iterator it; - - bool res = !ppl.m_FrameCommands.empty(); - bool partialExecution = ppl.m_CouldExecutePartially; - - graphics::Packet::EType bucketType = ppl.m_Type; - - while (!ppl.m_FrameCommands.empty()) - { - it = ppl.m_FrameCommands.begin(); - if (it->m_command) - { - it->m_command->setRenderContext(m_RenderContext.get()); - it->m_command->setIsDebugging(m_IsDebugging); - } - - if (bucketType == graphics::Packet::ECancelPoint) - { - if (it->m_command) - it->m_command->cancel(); - } - else - { - ASSERT(bucketType == graphics::Packet::EFramePoint, ()); - - if (it->m_command) - it->m_command->perform(); - } - - bool isCheckpoint = (it->m_type == graphics::Packet::ECheckPoint); - - ppl.m_FrameCommands.pop_front(); - - /// if we found a checkpoint instead of frameboundary and this - /// pipeline is allowed to be partially executed we are - /// breaking from processing cycle. - if (isCheckpoint && partialExecution) - break; - } - - return res; - -// if ((pipelineNum == 0) && (m_IsDebugging)) -// graphics::gl::g_doLogOGLCalls = false; -} - -void QueuedRenderer::PacketsPipeline::FillFrameCommands(list & renderQueue, int maxFrames) -{ - ASSERT(m_FrameCommands.empty(), ()); - - /// searching for "delimiter" markers - - list::iterator first = renderQueue.begin(); - list::iterator last = renderQueue.begin(); - - /// checking whether there are a CancelPoint packet in the queue. - /// In this case - fill m_FrameCommands till this packet - - for (list::iterator it = renderQueue.begin(); - it != renderQueue.end(); - ++it) - { - graphics::Packet p = *it; - if (p.m_type == graphics::Packet::ECancelPoint) - { - copy(first, ++it, back_inserter(m_FrameCommands)); - renderQueue.erase(first, it); - m_Type = p.m_type; - return; - } - } - - /// we know, that there are no CancelPoint packets in the queue. - /// so fill up the m_FrameCommands up to maxFrames frames. - - int packetsLeft = 100000; - int framesLeft = maxFrames; - - while ((framesLeft != 0) && (packetsLeft != 0) && (last != renderQueue.end())) - { - graphics::Packet p = *last; - - if (p.m_type == graphics::Packet::EFramePoint) - { - /// found frame boundary, copying - copy(first, ++last, back_inserter(m_FrameCommands)); - /// erasing from the main queue - renderQueue.erase(first, last); - first = renderQueue.begin(); - last = renderQueue.begin(); - --framesLeft; - m_Type = p.m_type; - } - else - ++last; - - --packetsLeft; - } -} - -void QueuedRenderer::CopyQueuedCommands(list & l, list & r) -{ - swap(l, r); -} - -void QueuedRenderer::CancelQueuedCommands(int pipelineNum) -{ - m_Pipelines[pipelineNum].m_Queue.cancel(); - - list r; - - m_Pipelines[pipelineNum].m_Queue.processList([this, &r] (list & l) { CopyQueuedCommands(l, r); }); - - for (graphics::Packet const & p : r) - { - if (p.m_command) - p.m_command->cancel(); - } -} - -graphics::PacketsQueue * QueuedRenderer::GetPacketsQueue(int pipelineNum) -{ - return &m_Pipelines[pipelineNum].m_Queue; -} - -void QueuedRenderer::PrepareQueueCancellation(int pipelineNum) -{ - m_Pipelines[pipelineNum].m_Queue.cancelFences(); -} diff --git a/render/queued_renderer.hpp b/render/queued_renderer.hpp deleted file mode 100644 index fb570d468c..0000000000 --- a/render/queued_renderer.hpp +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include "base/threaded_list.hpp" -#include "graphics/opengl/renderer.hpp" - -namespace graphics -{ - class RenderContext; -} - -/// Mixture-class for rendering policies, used on the -/// devices that do not support OpenGL context sharing -class QueuedRenderer -{ -private: - - /// separate pipeline for packets, collected on the single thread. - /// although it's possible to collect all the packet from all threads - /// into single queue it's better to separate them for finer optimization - /// of "heavy" commands. - struct PacketsPipeline - { - graphics::PacketsQueue m_Queue; //< all enqueued commands - list m_FrameCommands; //< list of commands to execute on current frame - graphics::Packet::EType m_Type; //< type of the actions to perform with FrameCommands - - bool m_CouldExecutePartially; - - /// - this function is passed to ThreadedList::ProcessQueue to fill up - /// the FrameCommands from the QueueData, taking at maximum maxCheckPoints chunks, - /// skipping empty frames. - /// - if there are a CancelPoint in the QueueData than the packets are copied up to - /// CancelPoint packet ignoring maxCheckPoints param - void FillFrameCommands(list & QueueData, int maxCheckPoints); - }; - - /// couldn't use vector here as PacketsPipeline holds non-copyable graphics::PacketsQueue - PacketsPipeline * m_Pipelines; - int m_PipelinesCount; - - /// DrawFrame process only one pipeline at a frame to provide a - /// consistent and smooth GUI experience, so to avoid a non-primary - /// pipeline starvation we should select them in a cyclic manner - int m_CurrentPipeline; - - bool m_IsDebugging; - - shared_ptr m_RenderContext; - -public: - - QueuedRenderer(int pipelinesCount, shared_ptr const & rc); - ~QueuedRenderer(); - - void CopyQueuedCommands(list & l, list & r); - - bool RenderQueuedCommands(int pipelineNum); - void CancelQueuedCommands(int pipelineNum); - void PrepareQueueCancellation(int pipelineNum); - void SetPartialExecution(int pipelineNum, bool flag); - - void BeginFrame(); - void DrawFrame(); - void EndFrame(); - - bool NeedRedraw() const; - - graphics::PacketsQueue * GetPacketsQueue(int pipelineNum); -}; diff --git a/render/render.pro b/render/render.pro deleted file mode 100644 index 5d1a37e8c4..0000000000 --- a/render/render.pro +++ /dev/null @@ -1,77 +0,0 @@ -TARGET = render -TEMPLATE = lib -CONFIG += staticlib warn_on - -ROOT_DIR = .. - -include($$ROOT_DIR/common.pri) - -INCLUDEPATH *= $$ROOT_DIR/3party/protobuf/src $$ROOT_DIR/3party/freetype/include - -SOURCES += \ - $$ROOT_DIR/3party/agg/agg_curves.cpp \ - software_renderer.cpp \ - gpu_drawer.cpp \ - cpu_drawer.cpp \ - drawer.cpp \ - feature_info.cpp \ - feature_styler.cpp \ - geometry_processors.cpp \ - proto_to_styles.cpp \ - text_engine.cpp \ - default_font.cpp \ - window_handle.cpp \ - render_policy.cpp \ - route_renderer.cpp \ - route_shape.cpp \ - tiling_render_policy_st.cpp \ - tiling_render_policy_mt.cpp \ - simple_render_policy.cpp \ - queued_renderer.cpp \ - basic_tiling_render_policy.cpp \ - tiler.cpp \ - tile.cpp \ - tile_cache.cpp \ - tile_set.cpp \ - tile_renderer.cpp \ - feature_processor.cpp \ - events.cpp \ - coverage_generator.cpp \ - scales_processor.cpp \ - yopme_render_policy.cpp \ - - -HEADERS += \ - software_renderer.hpp \ - gpu_drawer.hpp \ - cpu_drawer.hpp \ - frame_image.hpp \ - drawer.hpp \ - feature_info.hpp \ - feature_styler.hpp \ - path_info.hpp \ - area_info.hpp \ - geometry_processors.hpp \ - proto_to_styles.hpp \ - text_engine.h \ - point.h \ - rect.h \ - route_renderer.hpp \ - route_shape.hpp \ - window_handle.hpp \ - render_policy.hpp \ - tiling_render_policy_st.hpp \ - tiling_render_policy_mt.hpp \ - simple_render_policy.hpp \ - queued_renderer.hpp \ - basic_tiling_render_policy.hpp \ - tiler.hpp \ - tile.hpp \ - tile_cache.hpp \ - tile_set.hpp \ - tile_renderer.hpp \ - feature_processor.hpp \ - events.hpp \ - coverage_generator.hpp \ - scales_processor.hpp \ - yopme_render_policy.hpp \ diff --git a/render/render_policy.cpp b/render/render_policy.cpp deleted file mode 100644 index 0a1d59fc6a..0000000000 --- a/render/render_policy.cpp +++ /dev/null @@ -1,365 +0,0 @@ -#include "render_policy.hpp" -#include "window_handle.hpp" -#include "tiling_render_policy_st.hpp" -#include "tiling_render_policy_mt.hpp" -#include "proto_to_styles.hpp" - -#include "anim/controller.hpp" -#include "anim/task.hpp" - -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/gl_render_context.hpp" - -#include "indexer/scales.hpp" -#include "indexer/drawing_rules.hpp" - -#include "platform/video_timer.hpp" -#include "platform/settings.hpp" -#include "platform/platform.hpp" - -#define UNICODE_BLOCK_FILE "unicode_blocks.txt" -#define WHITE_LIST_FILE "fonts_whitelist.txt" -#define BLACK_LIST_FILE "fonts_blacklist.txt" - -RenderPolicyCpuCountHolder::RenderPolicyCpuCountHolder() - : m_cpuCoresCount(GetPlatform().CpuCores()) -{ -} - -RenderPolicy::~RenderPolicy() -{ - LOG(LDEBUG, ("clearing cached drawing rules")); - drule::rules().ClearCaches(); - if (m_primaryRC && m_resourceManager) - m_primaryRC->endThreadDrawing(m_resourceManager->guiThreadSlot()); -} - -RenderPolicy::RenderPolicy(Params const & p, - size_t idCacheSize) - : m_primaryRC(p.m_primaryRC), - m_doForceUpdate(false), - m_density(p.m_density), - m_exactDensityDPI(p.m_exactDensityDPI), - m_visualScale(graphics::visualScaleExact(p.m_exactDensityDPI)), - m_skinName(p.m_skinName) -{ - m_bgColors.resize(scales::UPPER_STYLE_SCALE+1); - for (int scale = 0; scale <= scales::UPPER_STYLE_SCALE; ++scale) - m_bgColors[scale] = ConvertColor(drule::rules().GetBgColor(scale)); - - LOG(LDEBUG, ("each BaseRule will hold up to", idCacheSize, "cached values")); - drule::rules().ResizeCaches(idCacheSize); - - graphics::gl::InitExtensions(); - graphics::gl::CheckExtensionSupport(); -} - -void RenderPolicy::InitCacheScreen() -{ - graphics::Screen::Params cp; - - cp.m_threadSlot = m_resourceManager->guiThreadSlot(); - cp.m_storageType = graphics::ETinyStorage; - cp.m_textureType = graphics::ESmallTexture; - cp.m_resourceManager = m_resourceManager; - cp.m_renderContext = m_primaryRC; - - m_cacheScreen.reset(CreateScreenWithParams(cp)); -} - -graphics::Screen * RenderPolicy::CreateScreenWithParams(graphics::Screen::Params const & params) const -{ - return new graphics::Screen(params); -} - -void RenderPolicy::OnSize(int w, int h) -{ - if (m_cacheScreen) - m_cacheScreen->onSize(w, h); - m_drawer->OnSize(w, h); -} - -void RenderPolicy::StartDrag() -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::DoDrag() -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::StopDrag() -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::StartScale() -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::DoScale() -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::StopScale() -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::StartRotate(double a, double) -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::DoRotate(double a, double) -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::StopRotate(double a, double) -{ - m_windowHandle->invalidate(); -} - -void RenderPolicy::BeginFrame(shared_ptr const & e, ScreenBase const & s) -{ - /// processing animations at the beginning of the frame. - /// it's crucial as in this function could happen transition from - /// animating to non-animating state which should be properly handled - /// in the following RenderPolicy::DrawFrame call. - m_controller->PerformStep(); -} - -void RenderPolicy::EndFrame(shared_ptr const & e, ScreenBase const & s) -{ -} - -bool RenderPolicy::NeedRedraw() const -{ - return m_windowHandle->needRedraw() - || IsAnimating(); -} - -bool RenderPolicy::IsAnimating() const -{ - return (m_controller->HasVisualTasks() - || (m_controller->LockCount() > 0)); -} - -bool RenderPolicy::IsTiling() const -{ - return false; -} - -shared_ptr const & RenderPolicy::GetDrawer() const -{ - return m_drawer; -} - -shared_ptr const & RenderPolicy::GetWindowHandle() const -{ - return m_windowHandle; -} - -graphics::GlyphCache * RenderPolicy::GetGlyphCache() const -{ - return m_resourceManager->glyphCache(m_resourceManager->guiThreadSlot()); -} - -void RenderPolicy::SetRenderFn(TRenderFn const & renderFn) -{ - m_renderFn = renderFn; -} - -bool RenderPolicy::DoForceUpdate() const -{ - return m_doForceUpdate; -} - -void RenderPolicy::SetForceUpdate(bool flag) -{ - m_doForceUpdate = flag; -} - -void RenderPolicy::SetInvalidRect(m2::AnyRectD const & glbRect) -{ - m_invalidRect = glbRect; -} - -m2::AnyRectD const & RenderPolicy::GetInvalidRect() const -{ - return m_invalidRect; -} - -bool RenderPolicy::IsEmptyModel() const -{ - return false; -} - -double RenderPolicy::VisualScale() const -{ - return m_visualScale; -} - -graphics::EDensity RenderPolicy::Density() const -{ - return m_density; -} - -int RenderPolicy::DensityExactDPI() const -{ - return m_exactDensityDPI; -} - -string const & RenderPolicy::SkinName() const -{ - return m_skinName; -} - -int RenderPolicy::InsertBenchmarkFence() -{ - return 0; -} - -void RenderPolicy::JoinBenchmarkFence(int fenceID) -{ -} - -void RenderPolicy::SetAnimController(anim::Controller * controller) -{ - m_controller = controller; -} - -void RenderPolicy::FrameLock() -{ - LOG(LDEBUG/*LWARNING*/, ("unimplemented method called.")); -} - -void RenderPolicy::FrameUnlock() -{ - LOG(LDEBUG/*LWARNING*/, ("unimplemented method called")); -} - -graphics::Overlay * RenderPolicy::FrameOverlay() const -{ - LOG(LDEBUG/*LWARNING*/, ("unimplemented method called")); - return NULL; -} - -shared_ptr const & RenderPolicy::GetCacheScreen() const -{ - return m_cacheScreen; -} - -void RenderPolicy::InitWindowsHandle(VideoTimer * timer, shared_ptr context) -{ - m_windowHandle.reset(new WindowHandle()); - m_windowHandle->setRenderPolicy(this); - m_windowHandle->setUpdatesEnabled(false); - m_windowHandle->setVideoTimer(timer); - m_windowHandle->setRenderContext(context); -} - -GPUDrawer * RenderPolicy::CreateDrawer(bool isDefaultFB, - shared_ptr context, - graphics::EStorageType storageType, - graphics::ETextureType textureType) -{ - GPUDrawer::Params dp; - - dp.m_visualScale = VisualScale(); - dp.m_screenParams.m_frameBuffer = make_shared(isDefaultFB); - dp.m_screenParams.m_resourceManager = m_resourceManager; - dp.m_screenParams.m_threadSlot = m_resourceManager->guiThreadSlot(); - dp.m_screenParams.m_storageType = storageType; - dp.m_screenParams.m_textureType = textureType; - dp.m_screenParams.m_renderContext = context; - - return new GPUDrawer(dp); -} - -size_t RenderPolicy::GetLargeTextureSize(bool useNpot) -{ - UNUSED_VALUE(useNpot); - return 512; -} - -size_t RenderPolicy::GetMediumTextureSize(bool useNpot) -{ - uint32_t size = 256 * VisualScale(); - if (useNpot) - return size; - - return my::NextPowOf2(size); -} - -size_t RenderPolicy::GetSmallTextureSize(bool useNpot) -{ - uint32_t size = 128 * VisualScale(); - if (useNpot) - return size; - - return my::NextPowOf2(size); -} - -graphics::ResourceManager::StoragePoolParams RenderPolicy::GetStorageParam(size_t vertexCount, - size_t indexCount, - size_t batchSize, - graphics::EStorageType type) -{ - return graphics::ResourceManager::StoragePoolParams(vertexCount * sizeof(graphics::gl::Vertex), - sizeof(graphics::gl::Vertex), - indexCount * sizeof(unsigned short), - sizeof(unsigned short), - batchSize, type, false); -} - -graphics::ResourceManager::TexturePoolParams RenderPolicy::GetTextureParam(size_t size, - size_t initCount, - graphics::DataFormat format, - graphics::ETextureType type) -{ - LOG(LDEBUG, ("Texture creating size = ", size)); - return graphics::ResourceManager::TexturePoolParams(size, size, initCount, format, type, false); -} - -RenderPolicy * CreateRenderPolicy(RenderPolicy::Params const & params) -{ - // @TODO!!! Check which policy is better for TIZEN -#if defined(OMIM_OS_ANDROID) || defined(OMIM_OS_TIZEN) - return new TilingRenderPolicyST(params); -#endif -#ifdef OMIM_OS_IPHONE - return new TilingRenderPolicyMT(params); -#endif -#ifdef OMIM_OS_DESKTOP - return new TilingRenderPolicyST(params); -#endif -} - - -graphics::GlyphCache::Params GetGlyphCacheParams(graphics::EDensity density, - int exactDensityDPI, - size_t cacheMaxSize) -{ - return graphics::GlyphCache::Params(UNICODE_BLOCK_FILE, - WHITE_LIST_FILE, - BLACK_LIST_FILE, - cacheMaxSize, - density, - exactDensityDPI, - false); -} - - -graphics::ResourceManager::GlyphCacheParams GetResourceGlyphCacheParams(graphics::EDensity density, size_t cacheMaxSize) -{ - return graphics::ResourceManager::GlyphCacheParams(UNICODE_BLOCK_FILE, - WHITE_LIST_FILE, - BLACK_LIST_FILE, - cacheMaxSize, - density); -} diff --git a/render/render_policy.hpp b/render/render_policy.hpp deleted file mode 100644 index 77d45ba0b4..0000000000 --- a/render/render_policy.hpp +++ /dev/null @@ -1,206 +0,0 @@ -#pragma once - -#include "gpu_drawer.hpp" - -#include "graphics/color.hpp" -#include "graphics/resource_manager.hpp" -#include "graphics/screen.hpp" - -#include "geometry/rect2d.hpp" - -#include "std/function.hpp" -#include "std/shared_ptr.hpp" -#include "std/vector.hpp" - - -class PaintEvent; -class ScreenBase; -class VideoTimer; - -namespace anim -{ - class Controller; -} - -namespace graphics -{ - class RenderContext; - - class Skin; - class GlyphCache; - class ResourceManager; - class Overlay; -} - -namespace anim -{ - class Controller; - class Task; -} - -class WindowHandle; - -// Base class for temporary CpuCount initialization work-around. -// m_cpuCoresCount should be initialized before RenderPolicy() constructor is called. -// New graphics library (Drape) does not have this issue. -class RenderPolicyCpuCountHolder -{ -protected: - RenderPolicyCpuCountHolder(); - // Cache this value as it can change dynamically at runtime. - unsigned const m_cpuCoresCount; -}; - -class RenderPolicy -{ -public: - - typedef function, - ScreenBase const &, - m2::RectD const &, - int)> TRenderFn; - -protected: - - vector m_bgColors; - shared_ptr m_resourceManager; - shared_ptr m_skin; - shared_ptr m_cacheScreen; - shared_ptr m_primaryRC; - shared_ptr m_windowHandle; - shared_ptr m_drawer; - TRenderFn m_renderFn; - bool m_doForceUpdate; - m2::AnyRectD m_invalidRect; - graphics::EDensity m_density; - int m_exactDensityDPI; - double m_visualScale; - string m_skinName; - anim::Controller * m_controller; - - void InitCacheScreen(); - -public: - - struct Params - { - VideoTimer * m_videoTimer; - bool m_useDefaultFB; - graphics::ResourceManager::Params m_rmParams; - shared_ptr m_primaryRC; - graphics::EDensity m_density; - string m_skinName; - size_t m_screenWidth; - size_t m_screenHeight; - int m_exactDensityDPI; - }; - - /// constructor - RenderPolicy(Params const & p, - size_t idCacheSize); - /// destructor - virtual ~RenderPolicy(); - /// starting frame - virtual void BeginFrame(shared_ptr const & e, ScreenBase const & s); - /// drawing single frame - virtual void DrawFrame(shared_ptr const & e, ScreenBase const & s) = 0; - /// ending frame - virtual void EndFrame(shared_ptr const & e, ScreenBase const & s); - - /// processing resize request - virtual void OnSize(int w, int h); - - /// reacting on navigation actions - /// @{ - virtual void StartDrag(); - virtual void DoDrag(); - virtual void StopDrag(); - - virtual void StartScale(); - virtual void DoScale(); - virtual void StopScale(); - - virtual void StartRotate(double a, double timeInSec); - virtual void DoRotate(double a, double timeInSec); - virtual void StopRotate(double a, double timeInSec); - /// @} - - /// the start point of rendering in renderpolicy. - virtual void SetRenderFn(TRenderFn const & renderFn); - - void SetAnimController(anim::Controller * controller); - - virtual bool IsTiling() const; - - virtual bool NeedRedraw() const; - virtual bool IsEmptyModel() const; - - bool DoForceUpdate() const; - void SetForceUpdate(bool flag); - - bool IsAnimating() const; - - void SetInvalidRect(m2::AnyRectD const & glbRect); - m2::AnyRectD const & GetInvalidRect() const; - - shared_ptr const & GetDrawer() const; - shared_ptr const & GetWindowHandle() const; - graphics::GlyphCache * GetGlyphCache() const; - - double VisualScale() const; - virtual size_t TileSize() const { return 256; } - graphics::EDensity Density() const; - int DensityExactDPI() const; - string const & SkinName() const; - - /// This function is used when we need to prevent race - /// conditions on some resources, which could be modified - /// from another threads. - /// One example of such resource is a current graphics::Overlay - /// object - /// @{ - virtual void FrameLock(); - virtual void FrameUnlock(); - /// @} - - /// Get current graphics::Overlay object. - /// Access to this resource should be synchronized using - /// FrameLock/FrameUnlock methods - virtual graphics::Overlay * FrameOverlay() const; - - /// Benchmarking protocol - virtual int InsertBenchmarkFence(); - virtual void JoinBenchmarkFence(int fenceID); - - shared_ptr const & GetCacheScreen() const; - shared_ptr const & GetResourceManager() const { return m_resourceManager; } - shared_ptr const & GetRenderContext() const { return m_primaryRC; } - - graphics::Screen * CreateScreenWithParams(graphics::Screen::Params const & params) const; - -protected: - void InitWindowsHandle(VideoTimer * timer, shared_ptr context); - GPUDrawer * CreateDrawer(bool isDefaultFB, - shared_ptr context, - graphics::EStorageType storageType, - graphics::ETextureType textureType); - - size_t GetLargeTextureSize(bool useNpot); - size_t GetMediumTextureSize(bool useNpot); - size_t GetSmallTextureSize(bool useNpot); - - graphics::ResourceManager::StoragePoolParams GetStorageParam(size_t vertexCount, - size_t indexCount, - size_t batchSize, - graphics::EStorageType type); - graphics::ResourceManager::TexturePoolParams GetTextureParam(size_t size, - size_t initCount, - graphics::DataFormat format, - graphics::ETextureType type); -}; - -RenderPolicy * CreateRenderPolicy(RenderPolicy::Params const & params); - -graphics::GlyphCache::Params GetGlyphCacheParams(graphics::EDensity density, - int exactDensityDPI, size_t cacheMaxSize = 2 * 1024 * 1024); -graphics::ResourceManager::GlyphCacheParams GetResourceGlyphCacheParams(graphics::EDensity density, size_t cacheMaxSize = 2 * 1024 * 1024); diff --git a/render/render_tests/feature_processor_test.cpp b/render/render_tests/feature_processor_test.cpp deleted file mode 100644 index 96921d0992..0000000000 --- a/render/render_tests/feature_processor_test.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "testing/testing.hpp" - -#include "render/feature_processor.hpp" -#include "render/geometry_processors.hpp" - -#include "geometry/screenbase.hpp" - -#include "base/logging.hpp" - - - -UNIT_TEST(PathPoints_ClipAsIntervals) -{ - m2::PointD pts[] = - { - m2::PointD(0, 0), - m2::PointD(10, 0), - m2::PointD(10, 10), - m2::PointD(20, 10), - m2::PointD(20, 0), - m2::PointD(30, 0), - m2::PointD(30, 20), - m2::PointD(80, 20), - m2::PointD(80, 0), - m2::PointD(90, 0) - }; - - m2::RectD r(5, -5, 25, 15); - - ScreenBase s; - s.OnSize(r.minX(), r.minY(), r.SizeX(), r.SizeY()); - s.SetFromRect(m2::AnyRectD(r)); - m2::RectD r1 = s.ClipRect(); - - buffer_vector intervals; - - typedef gp::get_path_intervals functor_t; - - functor_t::params p; - - p.m_convertor = &s; - p.m_rect = &r1; - p.m_intervals = &intervals; - - functor_t fun(p); - - for (size_t i = 0; i < ARRAY_SIZE(pts); ++i) - fun(pts[i]); - - TEST(fun.IsExist(), ()); - - double res[] = { 5, 45 }; - TEST(equal(intervals.begin(), intervals.end(), res), ()); - - typedef gp::filter_screenpts_adapter cut_functor_t; - - cut_functor_t::params cp; - - cp.m_convertor = &s; - cp.m_rect = &r1; - cp.m_intervals = fun.m_intervals; - - cut_functor_t cut_fun(cp); - - for (size_t i = 0; i < ARRAY_SIZE(pts); ++i) - cut_fun(pts[i]); - - m2::PointD res1[] = { - m2::PointD(5, 10), - m2::PointD(10, 10), - m2::PointD(10, 0), - m2::PointD(20, 0), - m2::PointD(20, 10), - m2::PointD(25, 10) - }; - - TEST(equal(res1, res1 + ARRAY_SIZE(res1), cut_fun.m_points.back().m_path.begin()), ()); -} - -UNIT_TEST(PathPoints_DeadZoneClipping) -{ - m2::PointD pts[] = - { - m2::PointD(0, 0), - m2::PointD(10, 0), - m2::PointD(10, 10), - m2::PointD(20, 10), - m2::PointD(20, 0), - m2::PointD(30, 0), - m2::PointD(30, 20), - m2::PointD(80, 20), - m2::PointD(80, 0), - m2::PointD(90, 0) - }; - - ScreenBase s; - s.OnSize(45 - 640, 0, 640, 480); - - m2::RectD r = s.ClipRect(); - - gp::path_points::params p; - p.m_startLength = 80; - p.m_endLength = 90; - p.m_convertor = &s; - p.m_rect = &r; - gp::path_points fun(p); - - for (size_t i = 0; i < ARRAY_SIZE(pts); ++i) - fun(pts[i]); - - TEST(fun.IsExist(), ()); - - //LOG(LINFO, (fun.m_points.front().m_path)); -} diff --git a/render/render_tests/render_tests.pro b/render/render_tests/render_tests.pro deleted file mode 100644 index 37cbaaff38..0000000000 --- a/render/render_tests/render_tests.pro +++ /dev/null @@ -1,16 +0,0 @@ -TARGET = render_tests -CONFIG += console warn_on -CONFIG -= app_bundle -TEMPLATE = app - -ROOT_DIR = ../.. - -DEPENDENCIES = render indexer platform geometry coding base - - -include($$ROOT_DIR/common.pri) - - -SOURCES += \ - ../../testing/testingmain.cpp \ - feature_processor_test.cpp \ diff --git a/render/route_renderer.cpp b/render/route_renderer.cpp deleted file mode 100644 index 707572bdb2..0000000000 --- a/render/route_renderer.cpp +++ /dev/null @@ -1,690 +0,0 @@ -#include "render/route_renderer.hpp" -#include "render/route_shape.hpp" -#include "render/gpu_drawer.hpp" - -#include "graphics/depth_constants.hpp" -#include "graphics/geometry_pipeline.hpp" -#include "graphics/resource.hpp" -#include "graphics/opengl/texture.hpp" - -#include "indexer/scales.hpp" - -#include "base/logging.hpp" - -namespace rg -{ - -namespace -{ - -float const kHalfWidthInPixel[] = -{ - // 1 2 3 4 5 6 7 8 9 10 - 2.0f, 2.0f, 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f, 5.0f, 5.0f, - //11 12 13 14 15 16 17 18 19 20 - 6.0f, 6.0f, 7.0f, 7.0f, 7.0f, 7.0f, 8.0f, 10.0f, 24.0f, 36.0f -}; - -uint8_t const kAlphaValue[] = -{ - //1 2 3 4 5 6 7 8 9 10 - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - //11 12 13 14 15 16 17 18 19 20 - 204, 204, 204, 204, 190, 180, 170, 160, 140, 120 -}; - -int const kArrowAppearingZoomLevel = 14; - -enum SegmentStatus -{ - OK = -1, - NoSegment = -2 -}; - -int const kInvalidGroup = -1; - -// Checks for route segments for intersection with the distance [start; end]. -int CheckForIntersection(double start, double end, vector const & segments) -{ - for (size_t i = 0; i < segments.size(); i++) - { - if (segments[i].m_isAvailable) - continue; - - if (start <= segments[i].m_end && end >= segments[i].m_start) - return i; - } - return SegmentStatus::OK; -} - -// Finds the nearest appropriate route segment to the distance [start; end]. -int FindNearestAvailableSegment(double start, double end, vector const & segments) -{ - double const kThreshold = 0.8; - - // check if distance intersects unavailable segment - int index = CheckForIntersection(start, end, segments); - if (index == SegmentStatus::OK) - return SegmentStatus::OK; - - // find nearest available segment if necessary - double const len = end - start; - for (size_t i = index; i < segments.size(); i++) - { - double const factor = (segments[i].m_end - segments[i].m_start) / len; - if (segments[i].m_isAvailable && factor > kThreshold) - return static_cast(i); - } - return SegmentStatus::NoSegment; -} - -void ClipBorders(vector & borders) -{ - auto invalidBorders = [](ArrowBorders const & borders) - { - return borders.m_groupIndex == kInvalidGroup; - }; - borders.erase(remove_if(borders.begin(), borders.end(), invalidBorders), borders.end()); -} - -void MergeAndClipBorders(vector & borders) -{ - // initial clipping - ClipBorders(borders); - - if (borders.empty()) - return; - - // mark groups - for (size_t i = 0; i + 1 < borders.size(); i++) - { - if (borders[i].m_endDistance >= borders[i + 1].m_startDistance) - borders[i + 1].m_groupIndex = borders[i].m_groupIndex; - } - - // merge groups - int lastGroup = borders[0].m_groupIndex; - size_t lastGroupIndex = 0; - for (size_t i = 1; i < borders.size(); i++) - { - if (borders[i].m_groupIndex != lastGroup) - { - borders[lastGroupIndex].m_endDistance = borders[i - 1].m_endDistance; - lastGroupIndex = i; - lastGroup = borders[i].m_groupIndex; - } - else - { - borders[i].m_groupIndex = kInvalidGroup; - } - } - borders[lastGroupIndex].m_endDistance = borders.back().m_endDistance; - - // clip groups - ClipBorders(borders); -} - -double CalculateLength(vector const & points) -{ - ASSERT_LESS(0, points.size(), ()); - double len = 0; - for (size_t i = 0; i + 1 < points.size(); i++) - len += (points[i + 1] - points[i]).Length(); - return len; -} - -vector AddPoints(double offset, vector const & points, bool isTail) -{ - vector result; - result.reserve(points.size() + 1); - double len = 0; - for (size_t i = 0; i + 1 < points.size(); i++) - { - double dist = (points[i + 1] - points[i]).Length(); - double l = len + dist; - if (offset >= len && offset <= l) - { - double k = (offset - len) / dist; - if (isTail) - { - result.push_back(points.front()); - result.push_back(points[i] + (points[i + 1] - points[i]) * k); - result.insert(result.end(), points.begin() + i + 1, points.end()); - } - else - { - result.insert(result.begin(), points.begin(), points.begin() + i + 1); - result.push_back(points[i] + (points[i + 1] - points[i]) * k); - result.push_back(points.back()); - } - break; - } - len = l; - } - return result; -} - -vector CalculatePoints(m2::PolylineD const & polyline, double start, double end, - double headSize, double tailSize) -{ - vector result; - result.reserve(polyline.GetSize() / 4); - - auto addIfNotExist = [&result](m2::PointD const & pnt) - { - if (result.empty() || result.back() != pnt) - result.push_back(pnt); - }; - - vector const & path = polyline.GetPoints(); - double len = 0; - bool started = false; - for (size_t i = 0; i + 1 < path.size(); i++) - { - double dist = (path[i + 1] - path[i]).Length(); - if (fabs(dist) < 1e-5) - continue; - - double l = len + dist; - if (!started && start >= len && start <= l) - { - double k = (start - len) / dist; - addIfNotExist(path[i] + (path[i + 1] - path[i]) * k); - started = true; - } - if (!started) - { - len = l; - continue; - } - - if (end >= len && end <= l) - { - double k = (end - len) / dist; - addIfNotExist(path[i] + (path[i + 1] - path[i]) * k); - break; - } - else - { - addIfNotExist(path[i + 1]); - } - len = l; - } - if (result.empty()) - return result; - - result = AddPoints(tailSize, result, true /* isTail */); - if (result.empty()) - return result; - - return AddPoints(CalculateLength(result) - headSize, result, false /* isTail */); -} - -float NormColor(uint8_t value) -{ - return static_cast(value) / numeric_limits::max(); -} - -} - -RouteRenderer::RouteRenderer() - : m_arrowDisplayList(nullptr) - , m_distanceFromBegin(0.0) - , m_needClearGraphics(false) - , m_needClearData(false) - , m_waitForConstruction(false) -{ -} - -RouteRenderer::~RouteRenderer() -{ - ASSERT(m_routeGraphics.empty(), ()); - ASSERT(m_startRoutePoint.m_displayList == nullptr, ()); - ASSERT(m_finishRoutePoint.m_displayList == nullptr, ()); - ASSERT(m_arrowDisplayList == nullptr, ()); -} - -void RouteRenderer::SetRoutePoint(m2::PointD const & pt, bool start, bool isValid) -{ - RoutePoint & pnt = start ? m_startRoutePoint : m_finishRoutePoint; - pnt.m_point = pt; - pnt.m_isValid = isValid; - pnt.m_needUpdate = true; -} - -void RouteRenderer::Setup(m2::PolylineD const & routePolyline, vector const & turns, graphics::Color const & color) -{ - if (!m_routeData.m_geometry.empty()) - m_needClearGraphics = true; - - RouteShape::PrepareGeometry(routePolyline, m_routeData); - - m_turns = turns; - m_color = color; - m_distanceFromBegin = 0.0; - m_polyline = routePolyline; - - if (!m_startRoutePoint.IsVisible()) - SetRoutePoint(m_polyline.Front(), true /* start */, true /* isValid */); - - if (!m_finishRoutePoint.IsVisible()) - SetRoutePoint(m_polyline.Back(), false /* start */, true /* isValid */); - - m_waitForConstruction = true; -} - -void RouteRenderer::ConstructRoute(graphics::Screen * dlScreen) -{ - ASSERT(m_routeGraphics.empty(), ()); - - // texture - uint32_t resID = dlScreen->findInfo(graphics::Icon::Info("route-arrow")); - graphics::Resource const * res = dlScreen->fromID(resID); - ASSERT(res != nullptr, ()); - shared_ptr texture = dlScreen->pipeline(res->m_pipelineID).texture(); - float w = static_cast(texture->width()); - float h = static_cast(texture->height()); - m_arrowTextureRect = m2::RectF(res->m_texRect.minX() / w, res->m_texRect.minY() / h, - res->m_texRect.maxX() / w, res->m_texRect.maxY() / h); - - // storages - for (auto & geometry : m_routeData.m_geometry) - { - m_routeGraphics.emplace_back(RouteGraphics()); - RouteGraphics & graphics = m_routeGraphics.back(); - - size_t vbSize = geometry.first.size() * sizeof(graphics::gl::RouteVertex); - size_t ibSize = geometry.second.size() * sizeof(unsigned short); - ASSERT_NOT_EQUAL(vbSize, 0, ()); - ASSERT_NOT_EQUAL(ibSize, 0, ()); - - graphics.m_storage = graphics::gl::Storage(vbSize, ibSize); - void * vbPtr = graphics.m_storage.m_vertices->lock(); - memcpy(vbPtr, geometry.first.data(), vbSize); - graphics.m_storage.m_vertices->unlock(); - - void * ibPtr = graphics.m_storage.m_indices->lock(); - memcpy(ibPtr, geometry.second.data(), ibSize); - graphics.m_storage.m_indices->unlock(); - } - - size_t const arrowBufferSize = m_turns.size() * 500; - m_arrowsStorage = graphics::gl::Storage(arrowBufferSize * sizeof(graphics::gl::RouteVertex), - arrowBufferSize * sizeof(unsigned short)); - - // display lists - for (auto & graphics : m_routeGraphics) - { - graphics.m_displayList = dlScreen->createDisplayList(); - dlScreen->setDisplayList(graphics.m_displayList); - dlScreen->drawRouteGeometry(texture, graphics.m_storage); - } - - m_arrowDisplayList = dlScreen->createDisplayList(); - dlScreen->setDisplayList(m_arrowDisplayList); - dlScreen->drawRouteGeometry(texture, m_arrowsStorage); - - dlScreen->setDisplayList(nullptr); - - m_waitForConstruction = false; -} - -void RouteRenderer::ClearRouteGraphics(graphics::Screen * dlScreen) -{ - for (RouteGraphics & graphics : m_routeGraphics) - { - dlScreen->discardStorage(graphics.m_storage); - graphics.m_storage = graphics::gl::Storage(); - } - - dlScreen->discardStorage(m_arrowsStorage); - m_arrowsStorage = graphics::gl::Storage(); - - dlScreen->clearRouteGeometry(); - - DestroyDisplayLists(); - - m_arrowBorders.clear(); - m_routeSegments.clear(); - m_arrowBuffer.Clear(); - - m_needClearGraphics = false; -} - -void RouteRenderer::ClearRouteData() -{ - m_routeData.Clear(); - m_needClearData = false; -} - -void RouteRenderer::PrepareToShutdown() -{ - DestroyDisplayLists(); - - m_arrowBorders.clear(); - m_routeSegments.clear(); - - if (!m_routeData.m_geometry.empty()) - m_waitForConstruction = true; -} - -void RouteRenderer::DestroyDisplayLists() -{ - m_routeGraphics.clear(); - - DestroyRoutePointGraphics(true /* start */); - DestroyRoutePointGraphics(false /* start */); - - if (m_arrowDisplayList != nullptr) - { - delete m_arrowDisplayList; - m_arrowDisplayList = nullptr; - } -} - -void RouteRenderer::CreateRoutePointGraphics(graphics::Screen * dlScreen, bool start) -{ - RoutePoint & pnt = start ? m_startRoutePoint : m_finishRoutePoint; - if (pnt.m_needUpdate) - { - DestroyRoutePointGraphics(start); - if (pnt.m_isValid) - { - pnt.m_displayList = dlScreen->createDisplayList(); - dlScreen->setDisplayList(pnt.m_displayList); - dlScreen->drawSymbol(pnt.m_point, start ? "route_from" : "route_to", graphics::EPosCenter, graphics::routingFinishDepth); - dlScreen->setDisplayList(nullptr); - } - pnt.m_needUpdate = false; - } -} - -void RouteRenderer::DestroyRoutePointGraphics(bool start) -{ - if (start) - m_startRoutePoint.Reset(); - else - m_finishRoutePoint.Reset(); -} - -void RouteRenderer::InterpolateByZoom(ScreenBase const & screen, float & halfWidth, float & alpha, double & zoom) const -{ - double const zoomLevel = my::clamp(fabs(log(screen.GetScale()) / log(2.0)), 1.0, scales::UPPER_STYLE_SCALE + 1.0); - zoom = trunc(zoomLevel); - int const index = zoom - 1.0; - float const lerpCoef = zoomLevel - zoom; - - if (index < scales::UPPER_STYLE_SCALE) - { - halfWidth = kHalfWidthInPixel[index] + lerpCoef * (kHalfWidthInPixel[index + 1] - kHalfWidthInPixel[index]); - - float const alpha1 = NormColor(kAlphaValue[index]); - float const alpha2 = NormColor(kAlphaValue[index + 1]); - alpha = alpha1 + lerpCoef * NormColor(alpha2 - alpha1); - } - else - { - halfWidth = kHalfWidthInPixel[scales::UPPER_STYLE_SCALE]; - alpha = NormColor(kAlphaValue[scales::UPPER_STYLE_SCALE]); - } -} - -void RouteRenderer::Render(graphics::Screen * dlScreen, ScreenBase const & screen) -{ - // clearing - if (m_needClearData) - ClearRouteData(); - - if (m_needClearGraphics) - ClearRouteGraphics(dlScreen); - - // construction - if (m_waitForConstruction) - ConstructRoute(dlScreen); - - // route points - CreateRoutePointGraphics(dlScreen, true /* start */); - CreateRoutePointGraphics(dlScreen, false /* start */); - - if (!m_routeGraphics.empty()) - { - ASSERT_EQUAL(m_routeGraphics.size(), m_routeData.m_geometry.size(), ()); - - // rendering - dlScreen->clear(graphics::Color(), false, 1.0f, true); - - // interpolate values by zoom level - double zoom = 0.0; - float halfWidth = 0.0; - float alpha = 0.0; - InterpolateByZoom(screen, halfWidth, alpha, zoom); - - // set up uniforms - graphics::UniformsHolder uniforms; - uniforms.insertValue(graphics::ERouteColor, NormColor(m_color.r), NormColor(m_color.g), NormColor(m_color.b), alpha); - uniforms.insertValue(graphics::ERouteHalfWidth, halfWidth, halfWidth * screen.GetScale()); - uniforms.insertValue(graphics::ERouteClipLength, m_distanceFromBegin); - - // render routes - dlScreen->applyRouteStates(); - for (size_t i = 0; i < m_routeGraphics.size(); ++i) - { - RouteGraphics & graphics = m_routeGraphics[i]; - if (!screen.ClipRect().IsIntersect(m_routeData.m_boundingBoxes[i])) - continue; - - size_t const indicesCount = graphics.m_storage.m_indices->size() / sizeof(unsigned short); - dlScreen->drawDisplayList(graphics.m_displayList, screen.GtoPMatrix(), &uniforms, indicesCount); - } - - // render arrows - if (zoom >= kArrowAppearingZoomLevel) - RenderArrow(dlScreen, halfWidth, screen); - } - - dlScreen->applyStates(); - if (m_startRoutePoint.IsVisible()) - dlScreen->drawDisplayList(m_startRoutePoint.m_displayList, screen.GtoPMatrix()); - - if (m_finishRoutePoint.IsVisible()) - dlScreen->drawDisplayList(m_finishRoutePoint.m_displayList, screen.GtoPMatrix()); -} - -void RouteRenderer::RenderArrow(graphics::Screen * dlScreen, float halfWidth, ScreenBase const & screen) -{ - double const arrowHalfWidth = halfWidth * arrowHeightFactor; - double const glbArrowHalfWidth = arrowHalfWidth * screen.GetScale(); - double const arrowSize = 0.001; - double const textureWidth = 2.0 * arrowHalfWidth * arrowAspect; - - // calculate arrows - vector arrowBorders; - arrowBorders.reserve(m_arrowBorders.size()); - CalculateArrowBorders(screen.ClipRect(), arrowSize, screen.GetScale(), - textureWidth, glbArrowHalfWidth, arrowBorders); - if (!arrowBorders.empty()) - { - bool needRender = true; - if (m_arrowBorders != arrowBorders) - { - m_arrowBorders.swap(arrowBorders); - needRender = RecacheArrows(); - } - - if (needRender) - { - dlScreen->clear(graphics::Color(), false, 1.0f, true); - dlScreen->applyRouteArrowStates(); - - graphics::UniformsHolder uniforms; - uniforms.insertValue(graphics::ERouteHalfWidth, arrowHalfWidth, glbArrowHalfWidth); - uniforms.insertValue(graphics::ERouteTextureRect, m_arrowTextureRect.minX(), m_arrowTextureRect.minY(), - m_arrowTextureRect.maxX(), m_arrowTextureRect.maxY()); - - dlScreen->drawDisplayList(m_arrowDisplayList, screen.GtoPMatrix(), &uniforms, m_arrowBuffer.m_indices.size()); - } - } -} - -bool RouteRenderer::RecacheArrows() -{ - m_arrowBuffer.Clear(); - for (size_t i = 0; i < m_arrowBorders.size(); i++) - { - RouteShape::PrepareArrowGeometry(m_arrowBorders[i].m_points, - m_arrowBorders[i].m_startDistance, m_arrowBorders[i].m_endDistance, - m_arrowBuffer); - } - - size_t const vbSize = m_arrowBuffer.m_geometry.size() * sizeof(m_arrowBuffer.m_geometry[0]); - size_t const ibSize = m_arrowBuffer.m_indices.size() * sizeof(m_arrowBuffer.m_indices[0]); - if (vbSize == 0 && ibSize == 0) - return false; - - if (m_arrowsStorage.m_vertices->size() < vbSize || m_arrowsStorage.m_indices->size() < ibSize) - { - LOG(LWARNING, ("Arrows VB/IB has insufficient size")); - return false; - } - - void * vbPtr = m_arrowsStorage.m_vertices->lock(); - memcpy(vbPtr, m_arrowBuffer.m_geometry.data(), vbSize); - m_arrowsStorage.m_vertices->unlock(); - - void * ibPtr = m_arrowsStorage.m_indices->lock(); - memcpy(ibPtr, m_arrowBuffer.m_indices.data(), ibSize); - m_arrowsStorage.m_indices->unlock(); - - return true; -} - -void RouteRenderer::Clear() -{ - m_needClearGraphics = true; - m_needClearData = true; - m_distanceFromBegin = 0.0; -} - -void RouteRenderer::UpdateDistanceFromBegin(double distanceFromBegin) -{ - m_distanceFromBegin = distanceFromBegin; -} - -void RouteRenderer::ApplyJoinsBounds(double joinsBoundsScalar, double glbHeadLength, - vector & arrowBorders) -{ - m_routeSegments.clear(); - m_routeSegments.reserve(2 * m_routeData.m_joinsBounds.size() + 1); - - // construct route's segments - m_routeSegments.emplace_back(0.0, 0.0, true /* m_isAvailable */); - for (size_t i = 0; i < m_routeData.m_joinsBounds.size(); i++) - { - double const start = m_routeData.m_joinsBounds[i].m_offset + - m_routeData.m_joinsBounds[i].m_start * joinsBoundsScalar; - double const end = m_routeData.m_joinsBounds[i].m_offset + - m_routeData.m_joinsBounds[i].m_end * joinsBoundsScalar; - - m_routeSegments.back().m_end = start; - m_routeSegments.emplace_back(start, end, false /* m_isAvailable */); - - m_routeSegments.emplace_back(end, 0.0, true /* m_isAvailable */); - } - m_routeSegments.back().m_end = m_routeData.m_length; - - // shift head of arrow if necessary - bool needMerge = false; - for (size_t i = 0; i < arrowBorders.size(); i++) - { - int headIndex = FindNearestAvailableSegment(arrowBorders[i].m_endDistance - glbHeadLength, - arrowBorders[i].m_endDistance, m_routeSegments); - if (headIndex != SegmentStatus::OK) - { - if (headIndex != SegmentStatus::NoSegment) - { - ASSERT_GREATER_OR_EQUAL(headIndex, 0, ()); - double const restDist = m_routeData.m_length - m_routeSegments[headIndex].m_start; - if (restDist >= glbHeadLength) - arrowBorders[i].m_endDistance = min(m_routeData.m_length, m_routeSegments[headIndex].m_start + glbHeadLength); - else - arrowBorders[i].m_groupIndex = kInvalidGroup; - } - else - { - arrowBorders[i].m_groupIndex = kInvalidGroup; - } - needMerge = true; - } - } - - // merge intersected borders - if (needMerge) - MergeAndClipBorders(arrowBorders); -} - -void RouteRenderer::CalculateArrowBorders(m2::RectD const & clipRect, double arrowLength, double scale, - double arrowTextureWidth, double joinsBoundsScalar, - vector & arrowBorders) -{ - if (m_turns.empty()) - return; - - double halfLen = 0.5 * arrowLength; - double const glbTextureWidth = arrowTextureWidth * scale; - double const glbTailLength = arrowTailSize * glbTextureWidth; - double const glbHeadLength = arrowHeadSize * glbTextureWidth; - - double const halfTextureWidth = 0.5 * glbTextureWidth; - if (halfLen < halfTextureWidth) - halfLen = halfTextureWidth; - - // initial filling - for (size_t i = 0; i < m_turns.size(); i++) - { - ArrowBorders borders; - borders.m_groupIndex = static_cast(i); - borders.m_startDistance = max(0.0, m_turns[i] - halfLen * 0.8); - borders.m_endDistance = min(m_routeData.m_length, m_turns[i] + halfLen * 1.2); - borders.m_headSize = glbHeadLength; - borders.m_tailSize = glbTailLength; - - if (borders.m_startDistance < m_distanceFromBegin) - continue; - - arrowBorders.push_back(borders); - } - - // merge intersected borders and clip them - MergeAndClipBorders(arrowBorders); - - // apply joins bounds to prevent draw arrow's head on a join - ApplyJoinsBounds(joinsBoundsScalar, glbHeadLength, arrowBorders); - - // check if arrow is outside clip rect - for (size_t i = 0; i < arrowBorders.size(); i++) - { - arrowBorders[i].m_points = CalculatePoints(m_polyline, - arrowBorders[i].m_startDistance, - arrowBorders[i].m_endDistance, - arrowBorders[i].m_headSize, - arrowBorders[i].m_tailSize); - bool outside = true; - for (size_t j = 0; j < arrowBorders[i].m_points.size(); j++) - { - if (clipRect.IsPointInside(arrowBorders[i].m_points[j])) - { - outside = false; - break; - } - } - if (outside || arrowBorders[i].m_points.size() < 2) - { - arrowBorders[i].m_groupIndex = -1; - continue; - } - } - ClipBorders(arrowBorders); -} - -} // namespace rg - diff --git a/render/route_renderer.hpp b/render/route_renderer.hpp deleted file mode 100644 index 408b0169cb..0000000000 --- a/render/route_renderer.hpp +++ /dev/null @@ -1,158 +0,0 @@ -#pragma once - -#include "render/route_shape.hpp" -#include "render/events.hpp" - -#include "graphics/color.hpp" -#include "graphics/display_list.hpp" -#include "graphics/defines.hpp" -#include "graphics/screen.hpp" -#include "graphics/opengl/storage.hpp" - -#include "geometry/polyline2d.hpp" -#include "geometry/screenbase.hpp" - -#include "platform/location.hpp" - -#include "std/vector.hpp" - -namespace rg -{ - -struct ArrowBorders -{ - double m_startDistance = 0; - double m_endDistance = 0; - double m_headSize = 0; - double m_tailSize = 0; - - int m_groupIndex = 0; - vector m_points; - - bool operator==(ArrowBorders const & rhs) const - { - double const eps = 1e-7; - return fabs(m_startDistance - rhs.m_startDistance) < eps && - fabs(m_endDistance - rhs.m_endDistance) < eps && - fabs(m_headSize - rhs.m_headSize) < eps && - fabs(m_tailSize - rhs.m_tailSize) < eps; - } - - bool operator!=(ArrowBorders const & rhs) const - { - return !operator==(rhs); - } -}; - -struct RouteSegment -{ - double m_start; - double m_end; - bool m_isAvailable; - - RouteSegment(double start, double end, bool isAvailable) - : m_start(start) - , m_end(end) - , m_isAvailable(isAvailable) - {} -}; - -class RouteRenderer final -{ -public: - RouteRenderer(); - ~RouteRenderer(); - - void PrepareToShutdown(); - - void Setup(m2::PolylineD const & routePolyline, vector const & turns, graphics::Color const & color); - void Clear(); - void Render(graphics::Screen * dlScreen, ScreenBase const & screen); - - void SetRoutePoint(m2::PointD const & pt, bool start, bool isValid); - - void UpdateDistanceFromBegin(double distanceFromBegin); - -private: - void ConstructRoute(graphics::Screen * dlScreen); - void ClearRouteGraphics(graphics::Screen * dlScreen); - void ClearRouteData(); - void InterpolateByZoom(ScreenBase const & screen, float & halfWidth, float & alpha, double & zoom) const; - void CalculateArrowBorders(m2::RectD const & clipRect, double arrowLength, double scale, - double arrowTextureWidth, double joinsBoundsScalar, - vector & arrowBorders); - void ApplyJoinsBounds(double joinsBoundsScalar, double glbHeadLength, - vector & arrowBorders); - void RenderArrow(graphics::Screen * dlScreen, float halfWidth, ScreenBase const & screen); - bool RecacheArrows(); - void DestroyDisplayLists(); - - void CreateRoutePointGraphics(graphics::Screen * dlScreen, bool start); - void DestroyRoutePointGraphics(bool start); - - struct RouteGraphics - { - graphics::DisplayList * m_displayList; - graphics::gl::Storage m_storage; - - RouteGraphics() : m_displayList(nullptr) {} - ~RouteGraphics() - { - if (m_displayList != nullptr) - { - delete m_displayList; - m_displayList = nullptr; - } - } - }; - - struct RoutePoint - { - graphics::DisplayList * m_displayList; - m2::PointD m_point; - bool m_needUpdate; - bool m_isValid; - - bool IsVisible() const { return m_displayList != nullptr; } - - void Reset() - { - if (m_displayList != nullptr) - { - delete m_displayList; - m_displayList = nullptr; - } - } - - RoutePoint() : m_displayList(nullptr), m_needUpdate(false), m_isValid(false) {} - ~RoutePoint() - { - Reset(); - } - }; - - vector m_routeGraphics; - RoutePoint m_startRoutePoint; - RoutePoint m_finishRoutePoint; - graphics::DisplayList * m_arrowDisplayList; - graphics::gl::Storage m_arrowsStorage; - - double m_distanceFromBegin; - RouteData m_routeData; - m2::RectF m_arrowTextureRect; - graphics::Color m_color; - vector m_turns; - - m2::PolylineD m_polyline; - ArrowsBuffer m_arrowBuffer; - - vector m_arrowBorders; - vector m_routeSegments; - - bool m_needClearGraphics; - bool m_needClearData; - bool m_waitForConstruction; -}; - -} // namespace rg - diff --git a/render/route_shape.cpp b/render/route_shape.cpp deleted file mode 100644 index 87bebba22b..0000000000 --- a/render/route_shape.cpp +++ /dev/null @@ -1,492 +0,0 @@ -#include "render/route_shape.hpp" - -#include "base/logging.hpp" - -namespace rg -{ - -namespace -{ - -float const kLeftSide = 1.0; -float const kCenter = 0.0; -float const kRightSide = -1.0; - -uint32_t const kMaxIndices = 15000; - -enum EPointType -{ - StartPoint = 0, - EndPoint = 1, - PointsCount = 2 -}; - -enum ENormalType -{ - StartNormal = 0, - EndNormal = 1, - BaseNormal = 2 -}; - -struct LineSegment -{ - m2::PointF m_points[PointsCount]; - m2::PointF m_tangent; - m2::PointF m_leftBaseNormal; - m2::PointF m_leftNormals[PointsCount]; - m2::PointF m_rightBaseNormal; - m2::PointF m_rightNormals[PointsCount]; - m2::PointF m_leftWidthScalar[PointsCount]; - m2::PointF m_rightWidthScalar[PointsCount]; - bool m_hasLeftJoin[PointsCount]; - bool m_generateJoin; - - LineSegment(m2::PointF const & p1, m2::PointF const & p2) - { - m_points[StartPoint] = p1; - m_points[EndPoint] = p2; - m_leftWidthScalar[StartPoint] = m_leftWidthScalar[EndPoint] = m2::PointF(1.0f, 0.0f); - m_rightWidthScalar[StartPoint] = m_rightWidthScalar[EndPoint] = m2::PointF(1.0f, 0.0f); - m_hasLeftJoin[StartPoint] = m_hasLeftJoin[EndPoint] = true; - m_generateJoin = true; - } -}; - -class RouteDataHolder -{ -public: - explicit RouteDataHolder(RouteData & data) - : m_data(data), m_currentBuffer(0), m_indexCounter(0) - { - m_data.m_joinsBounds.clear(); - m_data.m_geometry.clear(); - m_data.m_boundingBoxes.clear(); - - m_data.m_geometry.resize(1); - m_data.m_boundingBoxes.resize(1); - } - - void Check() - { - if (m_indexCounter > kMaxIndices) - { - m_data.m_geometry.emplace_back(pair()); - m_data.m_boundingBoxes.emplace_back(m2::RectD()); - - m_indexCounter = 0; - m_currentBuffer++; - } - } - - uint16_t GetIndexCounter() const { return m_indexCounter; } - void IncrementIndexCounter(uint16_t value) { m_indexCounter += value; } - - void AddVertex(TRV && vertex) - { - m2::PointF p = vertex.pt + vertex.normal * vertex.length.x; - m_data.m_boundingBoxes[m_currentBuffer].Add(m2::PointD(p.x, p.y)); - - m_data.m_geometry[m_currentBuffer].first.push_back(move(vertex)); - } - - void AddIndex(uint16_t index) - { - m_data.m_geometry[m_currentBuffer].second.push_back(index); - } - - void AddJoinBounds(RouteJoinBounds && bounds) - { - m_data.m_joinsBounds.push_back(move(bounds)); - } - -private: - RouteData & m_data; - uint32_t m_currentBuffer; - uint16_t m_indexCounter; - m2::RectD m_boundingBox; -}; - -class ArrowDataHolder -{ -public: - explicit ArrowDataHolder(ArrowsBuffer & data) : m_data(data) {} - - void Check(){} - uint16_t GetIndexCounter() const { return m_data.m_indexCounter; } - void IncrementIndexCounter(uint16_t value) { m_data.m_indexCounter += value; } - - void AddVertex(TRV && vertex) - { - m_data.m_geometry.push_back(move(vertex)); - } - - void AddIndex(uint16_t index) - { - m_data.m_indices.push_back(index); - } - - void AddJoinBounds(RouteJoinBounds && bounds) {} - -private: - ArrowsBuffer & m_data; -}; - -void UpdateNormalBetweenSegments(LineSegment * segment1, LineSegment * segment2) -{ - ASSERT(segment1 != nullptr, ()); - ASSERT(segment2 != nullptr, ()); - - float const dotProduct = m2::DotProduct(segment1->m_leftNormals[EndPoint], - segment2->m_leftNormals[StartPoint]); - float const absDotProduct = fabs(dotProduct); - float const kEps = 1e-5; - - if (fabs(absDotProduct - 1.0f) < kEps) - { - // change nothing - return; - } - - float const kMaxScalar = 5; - float const crossProduct = m2::CrossProduct(segment1->m_tangent, segment2->m_tangent); - if (crossProduct < 0) - { - segment1->m_hasLeftJoin[EndPoint] = true; - segment2->m_hasLeftJoin[StartPoint] = true; - - // change right-side normals - m2::PointF averageNormal = (segment1->m_rightNormals[EndPoint] + segment2->m_rightNormals[StartPoint]).Normalize(); - float const cosAngle = m2::DotProduct(segment1->m_tangent, averageNormal); - float const widthScalar = 1.0f / sqrt(1.0f - cosAngle * cosAngle); - if (widthScalar < kMaxScalar) - { - segment1->m_rightNormals[EndPoint] = averageNormal; - segment2->m_rightNormals[StartPoint] = averageNormal; - segment1->m_rightWidthScalar[EndPoint].x = widthScalar; - segment1->m_rightWidthScalar[EndPoint].y = widthScalar * cosAngle; - segment2->m_rightWidthScalar[StartPoint] = segment1->m_rightWidthScalar[EndPoint]; - } - else - { - segment1->m_generateJoin = false; - } - } - else - { - segment1->m_hasLeftJoin[EndPoint] = false; - segment2->m_hasLeftJoin[StartPoint] = false; - - // change left-side normals - m2::PointF averageNormal = (segment1->m_leftNormals[EndPoint] + segment2->m_leftNormals[StartPoint]).Normalize(); - float const cosAngle = m2::DotProduct(segment1->m_tangent, averageNormal); - float const widthScalar = 1.0f / sqrt(1.0f - cosAngle * cosAngle); - if (widthScalar < kMaxScalar) - { - segment1->m_leftNormals[EndPoint] = averageNormal; - segment2->m_leftNormals[StartPoint] = averageNormal; - segment1->m_leftWidthScalar[EndPoint].x = widthScalar; - segment1->m_leftWidthScalar[EndPoint].y = widthScalar * cosAngle; - segment2->m_leftWidthScalar[StartPoint] = segment1->m_leftWidthScalar[EndPoint]; - } - else - { - segment1->m_generateJoin = false; - } - } -} - -void CalculateTangentAndNormals(m2::PointF const & pt0, m2::PointF const & pt1, - m2::PointF & tangent, m2::PointF & leftNormal, - m2::PointF & rightNormal) -{ - tangent = (pt1 - pt0).Normalize(); - leftNormal = m2::PointF(-tangent.y, tangent.x); - rightNormal = -leftNormal; -} - -void ConstructLineSegments(vector const & path, vector & segments) -{ - ASSERT_LESS(1, path.size(), ()); - - m2::PointD prevPoint = path[0]; - for (size_t i = 1; i < path.size(); ++i) - { - m2::PointF const p1 = m2::PointF(prevPoint.x, prevPoint.y); - m2::PointF const p2 = m2::PointF(path[i].x, path[i].y); - if (p1.EqualDxDy(p2, 1.0E-5)) - continue; - - // Important! Do emplace_back first and fill parameters later. - // Fill parameters first and push_back later will cause ugly bug in clang 3.6 -O3 optimization. - segments.emplace_back(p1, p2); - LineSegment & segment = segments.back(); - - CalculateTangentAndNormals(p1, p2, segment.m_tangent, - segment.m_leftBaseNormal, - segment.m_rightBaseNormal); - - segment.m_leftNormals[StartPoint] = segment.m_leftNormals[EndPoint] = segment.m_leftBaseNormal; - segment.m_rightNormals[StartPoint] = segment.m_rightNormals[EndPoint] = segment.m_rightBaseNormal; - - prevPoint = path[i]; - } -} - -void UpdateNormals(LineSegment * segment, LineSegment * prevSegment, LineSegment * nextSegment) -{ - ASSERT(segment != nullptr, ()); - - if (prevSegment != nullptr) - UpdateNormalBetweenSegments(prevSegment, segment); - - if (nextSegment != nullptr) - UpdateNormalBetweenSegments(segment, nextSegment); -} - -void GenerateJoinNormals(m2::PointF const & normal1, m2::PointF const & normal2, - bool isLeft, vector & normals) -{ - float const eps = 1e-5; - float const dotProduct = m2::DotProduct(normal1, normal2); - if (fabs(dotProduct - 1.0f) < eps) - return; - - float const segmentAngle = math::pi / 8.0; - float const fullAngle = acos(dotProduct); - int segmentsCount = max(static_cast(fullAngle / segmentAngle), 1); - - float const angle = fullAngle / segmentsCount * (isLeft ? -1.0 : 1.0); - m2::PointF const startNormal = normal1.Normalize(); - - for (int i = 0; i < segmentsCount; i++) - { - m2::PointF n1 = m2::Rotate(startNormal, i * angle); - m2::PointF n2 = m2::Rotate(startNormal, (i + 1) * angle); - - normals.push_back(m2::PointF::Zero()); - normals.push_back(isLeft ? n1 : n2); - normals.push_back(isLeft ? n2 : n1); - } -} - -void GenerateCapNormals(m2::PointF const & normal, bool isStart, vector & normals) -{ - int const segmentsCount = 8; - float const segmentSize = static_cast(math::pi) / segmentsCount * (isStart ? -1.0 : 1.0); - m2::PointF const startNormal = normal.Normalize(); - - for (int i = 0; i < segmentsCount; i++) - { - m2::PointF n1 = m2::Rotate(startNormal, i * segmentSize); - m2::PointF n2 = m2::Rotate(startNormal, (i + 1) * segmentSize); - - normals.push_back(m2::PointF::Zero()); - normals.push_back(isStart ? n1 : n2); - normals.push_back(isStart ? n2 : n1); - } -} - -m2::PointF GetNormal(LineSegment const & segment, bool isLeft, ENormalType normalType) -{ - if (normalType == BaseNormal) - return isLeft ? segment.m_leftBaseNormal : segment.m_rightBaseNormal; - - int const index = (normalType == StartNormal) ? StartPoint : EndPoint; - return isLeft ? segment.m_leftNormals[index] * segment.m_leftWidthScalar[index].x: - segment.m_rightNormals[index] * segment.m_rightWidthScalar[index].x; -} - -template -double GenerateGeometry(vector const & points, bool isRoute, double lengthScalar, - TRouteDataHolder & routeDataHolder) -{ - float depth = 0.0f; - - auto const generateTriangles = [&routeDataHolder, &depth](m2::PointF const & pivot, vector const & normals, - m2::PointF const & length, bool isLeft) - { - float const eps = 1e-5; - size_t const trianglesCount = normals.size() / 3; - float const side = isLeft ? kLeftSide : kRightSide; - for (int j = 0; j < trianglesCount; j++) - { - float const lenZ1 = normals[3 * j].Length() < eps ? kCenter : side; - float const lenZ2 = normals[3 * j + 1].Length() < eps ? kCenter : side; - float const lenZ3 = normals[3 * j + 2].Length() < eps ? kCenter : side; - - routeDataHolder.Check(); - - routeDataHolder.AddVertex(TRV(pivot, depth, normals[3 * j], length, lenZ1)); - routeDataHolder.AddVertex(TRV(pivot, depth, normals[3 * j + 1], length, lenZ2)); - routeDataHolder.AddVertex(TRV(pivot, depth, normals[3 * j + 2], length, lenZ3)); - - uint16_t indexCounter = routeDataHolder.GetIndexCounter(); - routeDataHolder.AddIndex(indexCounter); - routeDataHolder.AddIndex(indexCounter + 1); - routeDataHolder.AddIndex(indexCounter + 2); - routeDataHolder.IncrementIndexCounter(3); - } - }; - - auto const generateIndices = [&routeDataHolder]() - { - uint16_t indexCounter = routeDataHolder.GetIndexCounter(); - routeDataHolder.AddIndex(indexCounter); - routeDataHolder.AddIndex(indexCounter + 1); - routeDataHolder.AddIndex(indexCounter + 3); - routeDataHolder.AddIndex(indexCounter + 3); - routeDataHolder.AddIndex(indexCounter + 2); - routeDataHolder.AddIndex(indexCounter); - routeDataHolder.IncrementIndexCounter(4); - }; - - // constuct segments - vector segments; - segments.reserve(points.size() - 1); - ConstructLineSegments(points, segments); - - // build geometry - float length = 0; - vector normals; - normals.reserve(24); - for (size_t i = 0; i < segments.size(); i++) - { - UpdateNormals(&segments[i], (i > 0) ? &segments[i - 1] : nullptr, - (i < segments.size() - 1) ? &segments[i + 1] : nullptr); - - // generate main geometry - m2::PointF const startPivot = segments[i].m_points[StartPoint]; - m2::PointF const endPivot = segments[i].m_points[EndPoint]; - - float const endLength = length + (endPivot - startPivot).Length(); - - m2::PointF const leftNormalStart = GetNormal(segments[i], true /* isLeft */, StartNormal); - m2::PointF const rightNormalStart = GetNormal(segments[i], false /* isLeft */, StartNormal); - m2::PointF const leftNormalEnd = GetNormal(segments[i], true /* isLeft */, EndNormal); - m2::PointF const rightNormalEnd = GetNormal(segments[i], false /* isLeft */, EndNormal); - - float projLeftStart = 0.0; - float projLeftEnd = 0.0; - float projRightStart = 0.0; - float projRightEnd = 0.0; - float scaledLength = length / lengthScalar; - float scaledEndLength = endLength / lengthScalar; - if (isRoute) - { - projLeftStart = -segments[i].m_leftWidthScalar[StartPoint].y / lengthScalar; - projLeftEnd = segments[i].m_leftWidthScalar[EndPoint].y / lengthScalar; - projRightStart = -segments[i].m_rightWidthScalar[StartPoint].y / lengthScalar; - projRightEnd = segments[i].m_rightWidthScalar[EndPoint].y / lengthScalar; - } - else - { - float const arrowTailEndCoord = arrowTailSize; - float const arrowHeadStartCoord = 1.0 - arrowHeadSize; - if (i == 0) - { - scaledLength = 0.0f; - scaledEndLength = arrowTailEndCoord; - } - else if (i == segments.size() - 1) - { - scaledLength = arrowHeadStartCoord; - scaledEndLength = 1.0f; - } - else - { - scaledLength = arrowTailEndCoord + arrowTailSize; - scaledEndLength = arrowTailEndCoord + arrowTailSize * 2; - } - } - - routeDataHolder.Check(); - - routeDataHolder.AddVertex(TRV(startPivot, depth, m2::PointF::Zero(), m2::PointF(scaledLength, 0), kCenter)); - routeDataHolder.AddVertex(TRV(startPivot, depth, leftNormalStart, m2::PointF(scaledLength, projLeftStart), kLeftSide)); - routeDataHolder.AddVertex(TRV(endPivot, depth, m2::PointF::Zero(), m2::PointF(scaledEndLength, 0), kCenter)); - routeDataHolder.AddVertex(TRV(endPivot, depth, leftNormalEnd, m2::PointF(scaledEndLength, projLeftEnd), kLeftSide)); - generateIndices(); - - routeDataHolder.AddVertex(TRV(startPivot, depth, rightNormalStart, m2::PointF(scaledLength, projRightStart), kRightSide)); - routeDataHolder.AddVertex(TRV(startPivot, depth, m2::PointF::Zero(), m2::PointF(scaledLength, 0), kCenter)); - routeDataHolder.AddVertex(TRV(endPivot, depth, rightNormalEnd, m2::PointF(scaledEndLength, projRightEnd), kRightSide)); - routeDataHolder.AddVertex(TRV(endPivot, depth, m2::PointF::Zero(), m2::PointF(scaledEndLength, 0), kCenter)); - generateIndices(); - - // generate joins - if (segments[i].m_generateJoin && i < segments.size() - 1) - { - normals.clear(); - m2::PointF n1 = segments[i].m_hasLeftJoin[EndPoint] ? segments[i].m_leftNormals[EndPoint] : - segments[i].m_rightNormals[EndPoint]; - m2::PointF n2 = segments[i + 1].m_hasLeftJoin[StartPoint] ? segments[i + 1].m_leftNormals[StartPoint] : - segments[i + 1].m_rightNormals[StartPoint]; - GenerateJoinNormals(n1, n2, segments[i].m_hasLeftJoin[EndPoint], normals); - generateTriangles(endPivot, normals, m2::PointF(scaledEndLength, 0), segments[i].m_hasLeftJoin[EndPoint]); - } - - // generate caps - if (isRoute && i == 0) - { - normals.clear(); - GenerateCapNormals(segments[i].m_rightNormals[StartPoint], true /* isStart */, normals); - generateTriangles(startPivot, normals, m2::PointF(scaledLength, 0), true); - } - - if (isRoute && i == segments.size() - 1) - { - normals.clear(); - GenerateCapNormals(segments[i].m_rightNormals[EndPoint], false /* isStart */, normals); - generateTriangles(endPivot, normals, m2::PointF(scaledEndLength, 0), true); - } - - length = endLength; - } - - // calculate joins bounds - if (isRoute) - { - float const eps = 1e-5; - double len = 0; - for (size_t i = 0; i + 1 < segments.size(); i++) - { - len += (segments[i].m_points[EndPoint] - segments[i].m_points[StartPoint]).Length(); - - RouteJoinBounds bounds; - bounds.m_start = min(segments[i].m_leftWidthScalar[EndPoint].y, - segments[i].m_rightWidthScalar[EndPoint].y); - bounds.m_end = max(-segments[i + 1].m_leftWidthScalar[StartPoint].y, - -segments[i + 1].m_rightWidthScalar[StartPoint].y); - - if (fabs(bounds.m_end - bounds.m_start) < eps) - continue; - - bounds.m_offset = len; - routeDataHolder.AddJoinBounds(move(bounds)); - } - } - - return length; -} - -} - -void RouteShape::PrepareGeometry(m2::PolylineD const & polyline, RouteData & output) -{ - vector const & path = polyline.GetPoints(); - ASSERT_LESS(1, path.size(), ()); - - RouteDataHolder holder(output); - output.m_length = GenerateGeometry(path, true /* isRoute */, 1.0 /* lengthScalar */, holder); - ASSERT_EQUAL(output.m_geometry.size(), output.m_boundingBoxes.size(), ()); -} - -void RouteShape::PrepareArrowGeometry(vector const & points, - double start, double end, ArrowsBuffer & output) -{ - ArrowDataHolder holder(output); - GenerateGeometry(points, false /* isRoute */, end - start, holder); -} - -} // namespace rg - diff --git a/render/route_shape.hpp b/render/route_shape.hpp deleted file mode 100644 index 4152210848..0000000000 --- a/render/route_shape.hpp +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once - -#include "graphics/color.hpp" -#include "graphics/opengl/route_vertex.hpp" - -#include "geometry/polyline2d.hpp" - -#include "base/buffer_vector.hpp" - -#include "std/vector.hpp" - -namespace rg -{ - -using TRV = graphics::gl::RouteVertex; -using TGeometryBuffer = buffer_vector; -using TIndexBuffer = buffer_vector; - -double const arrowHeightFactor = 96.0 / 36.0; -double const arrowAspect = 400.0 / 192.0; -double const arrowTailSize = 20.0 / 400.0; -double const arrowHeadSize = 124.0 / 400.0; - -struct RouteJoinBounds -{ - double m_start = 0; - double m_end = 0; - double m_offset = 0; -}; - -struct RouteData -{ - double m_length; - vector> m_geometry; - vector m_boundingBoxes; - vector m_joinsBounds; - - RouteData() : m_length(0) {} - - void Clear() - { - m_geometry.clear(); - m_boundingBoxes.clear(); - m_joinsBounds.clear(); - } -}; - -struct ArrowsBuffer -{ - TGeometryBuffer m_geometry; - TIndexBuffer m_indices; - uint16_t m_indexCounter; - - ArrowsBuffer() : m_indexCounter(0) {} - void Clear() - { - m_geometry.clear(); - m_indices.clear(); - m_indexCounter = 0; - } -}; - -class RouteShape -{ -public: - static void PrepareGeometry(m2::PolylineD const & polyline, RouteData & output); - static void PrepareArrowGeometry(vector const & points, - double start, double end, ArrowsBuffer & output); -}; - -} // namespace rg - diff --git a/render/scales_processor.cpp b/render/scales_processor.cpp deleted file mode 100644 index 72054a2857..0000000000 --- a/render/scales_processor.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "scales_processor.hpp" - -#include "geometry/screenbase.hpp" - -#include "indexer/mercator.hpp" -#include "indexer/scales.hpp" - - -/// Note! Default tile size value should be equal with -/// the default value in RenderPolicy::TileSize(). -ScalesProcessor::ScalesProcessor() - : m_tileSize(256), m_visualScale(1.0) -{ -} - -ScalesProcessor::ScalesProcessor(int tileSize) - : m_tileSize(tileSize), m_visualScale(1.0) -{ -} - -void ScalesProcessor::SetParams(double visualScale, int tileSize) -{ - m_tileSize = tileSize; - m_visualScale = visualScale; -} - -m2::RectD const & ScalesProcessor::GetWorldRect() -{ - static m2::RectD const worldRect = MercatorBounds::FullRect(); - return worldRect; -} - -int ScalesProcessor::GetTileScaleBase(ScreenBase const & s) const -{ - ScreenBase tmpS = s; - tmpS.Rotate(-tmpS.GetAngle()); - - // slightly smaller than original to produce "antialiasing" effect using bilinear filtration. - int const halfSize = static_cast(m_tileSize / 1.05 / 2.0); - - m2::RectD glbRect; - m2::PointD const pxCenter = tmpS.PixelRect().Center(); - tmpS.PtoG(m2::RectD(pxCenter - m2::PointD(halfSize, halfSize), - pxCenter + m2::PointD(halfSize, halfSize)), - glbRect); - - return GetTileScaleBase(glbRect); -} - -int ScalesProcessor::GetTileScaleBase(m2::RectD const & r) const -{ - double const sz = max(r.SizeX(), r.SizeY()); - return max(1, my::rounds(log((MercatorBounds::maxX - MercatorBounds::minX) / sz) / log(2.0))); -} - -int ScalesProcessor::GetTileScaleIncrement() const -{ - return log(m_tileSize / 256.0 / m_visualScale) / log(2.0); -} - -int ScalesProcessor::CalculateTileSize(int screenWidth, int screenHeight) -{ - int const maxSz = max(screenWidth, screenHeight); - - // we're calculating the tileSize based on (maxSz > 1024 ? rounded : ceiled) - // to the nearest power of two value of the maxSz - - int const ceiledSz = 1 << static_cast(ceil(log(double(maxSz + 1)) / log(2.0))); - int res = 0; - - if (maxSz < 1024) - res = ceiledSz; - else - { - int const flooredSz = ceiledSz / 2; - // rounding to the nearest power of two. - if (ceiledSz - maxSz < maxSz - flooredSz) - res = ceiledSz; - else - res = flooredSz; - } - - return min(max(res / 2, 256), 1024); -} - -m2::RectD ScalesProcessor::GetRectForDrawScale(int drawScale, m2::PointD const & center) const -{ - // +1 - we will calculate half length for each side - double const factor = 1 << (max(1, drawScale - GetTileScaleIncrement()) + 1); - - double const len = (MercatorBounds::maxX - MercatorBounds::minX) / factor; - - return m2::RectD(MercatorBounds::ClampX(center.x - len), - MercatorBounds::ClampY(center.y - len), - MercatorBounds::ClampX(center.x + len), - MercatorBounds::ClampY(center.y + len)); -} - -double ScalesProcessor::GetClipRectInflation() const -{ - /// @todo Why 24? Probably better to get some part of m_tileSize? - return 24 * m_visualScale; -} diff --git a/render/scales_processor.hpp b/render/scales_processor.hpp deleted file mode 100644 index 493b4a51b8..0000000000 --- a/render/scales_processor.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#include "geometry/rect2d.hpp" - - -class ScreenBase; - -class ScalesProcessor -{ - int m_tileSize; - double m_visualScale; - -public: - ScalesProcessor(); - explicit ScalesProcessor(int tileSize); - - void SetParams(double visualScale, int tileSize); - - static m2::RectD const & GetWorldRect(); - inline int GetTileSize() const { return m_tileSize; } - inline double GetVisualScale() const { return m_visualScale; } - - int GetTileScaleBase(ScreenBase const & s) const; - int GetTileScaleBase(m2::RectD const & r) const; - - /// @return Adjusting base tile scale to look the same across devices with different - /// tile size and visual scale values. - int GetTileScaleIncrement() const; - - inline int GetDrawTileScale(int baseScale) const - { - return max(1, baseScale + GetTileScaleIncrement()); - } - inline int GetDrawTileScale(ScreenBase const & s) const - { - return GetDrawTileScale(GetTileScaleBase(s)); - } - inline int GetDrawTileScale(m2::RectD const & r) const - { - return GetDrawTileScale(GetTileScaleBase(r)); - } - - m2::RectD GetRectForDrawScale(int drawScale, m2::PointD const & center) const; - inline m2::RectD GetRectForDrawScale(double drawScale, m2::PointD const & center) const - { - return GetRectForDrawScale(my::rounds(drawScale), center); - } - - static int CalculateTileSize(int screenWidth, int screenHeight); - - double GetClipRectInflation() const; -}; diff --git a/render/simple_render_policy.cpp b/render/simple_render_policy.cpp deleted file mode 100644 index 44beb2add0..0000000000 --- a/render/simple_render_policy.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "simple_render_policy.hpp" -#include "events.hpp" -#include "window_handle.hpp" -#include "scales_processor.hpp" - -#include "render/drawer.hpp" - -#include "graphics/overlay.hpp" -#include "graphics/opengl/opengl.hpp" -#include "graphics/render_context.hpp" - -#include "geometry/screenbase.hpp" - -#include "platform/platform.hpp" - - -using namespace graphics; - -SimpleRenderPolicy::SimpleRenderPolicy(Params const & p) - : RenderPolicy(p, 1) -{ - graphics::ResourceManager::Params rmp = p.m_rmParams; - - rmp.checkDeviceCaps(); - bool useNpot = rmp.canUseNPOTextures(); - - rmp.m_textureParams[ELargeTexture] = GetTextureParam(GetLargeTextureSize(useNpot), 10, rmp.m_texFormat, ELargeTexture); - rmp.m_textureParams[EMediumTexture] = GetTextureParam(GetMediumTextureSize(useNpot), 5, rmp.m_texFormat, EMediumTexture); - rmp.m_textureParams[ESmallTexture] = GetTextureParam(GetSmallTextureSize(useNpot), 4, rmp.m_texFormat, ESmallTexture); - - rmp.m_storageParams[ELargeStorage] = GetStorageParam(50000, 100000, 15, ELargeStorage); - rmp.m_storageParams[EMediumStorage] = GetStorageParam(5000, 10000, 100, EMediumStorage); - rmp.m_storageParams[ESmallStorage] = GetStorageParam(2000, 6000, 10, ESmallStorage); - rmp.m_storageParams[ETinyStorage] = GetStorageParam(100, 200, 1, ETinyStorage); - - rmp.m_glyphCacheParams = GetResourceGlyphCacheParams(Density()); - - rmp.m_renderThreadsCount = 0; - rmp.m_threadSlotsCount = 1; - - rmp.m_useSingleThreadedOGL = false; - - m_resourceManager.reset(new graphics::ResourceManager(rmp, SkinName(), Density())); - - m_primaryRC->setResourceManager(m_resourceManager); - m_primaryRC->startThreadDrawing(m_resourceManager->guiThreadSlot()); - - Platform::FilesList fonts; - GetPlatform().GetFontNames(fonts); - m_resourceManager->addFonts(fonts); - - m_drawer.reset(CreateDrawer(p.m_useDefaultFB, p.m_primaryRC, ELargeStorage, ELargeTexture)); - InitCacheScreen(); - InitWindowsHandle(p.m_videoTimer, p.m_primaryRC); - - m_overlay.reset(new graphics::Overlay()); -} - -void SimpleRenderPolicy::DrawFrame(shared_ptr const & e, - ScreenBase const & s) -{ -#ifndef USE_DRAPE - shared_ptr storage(new graphics::OverlayStorage()); - - graphics::Screen * pScreen = GPUDrawer::GetScreen(e->drawer()); - - pScreen->setOverlay(storage); - pScreen->beginFrame(); - pScreen->clear(m_bgColors[0]); - - m_renderFn(e, s, s.PixelRect(), ScalesProcessor().GetTileScaleBase(s)); - - pScreen->resetOverlay(); - pScreen->clear(graphics::Color::White(), false, 1.0, true); - - m_overlay->merge(storage); - - math::Matrix const m = math::Identity(); - m_overlay->forEach([&pScreen, &m](shared_ptr const & e) - { - e->draw(pScreen, m); - }); - - pScreen->endFrame(); -#endif // USE_DRAPE -} - -graphics::Overlay * SimpleRenderPolicy::FrameOverlay() const -{ - return m_overlay.get(); -} diff --git a/render/simple_render_policy.hpp b/render/simple_render_policy.hpp deleted file mode 100644 index 95b3e40a5a..0000000000 --- a/render/simple_render_policy.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "render_policy.hpp" - -class SimpleRenderPolicy : public RenderPolicy -{ -private: - shared_ptr m_overlay; - -public: - SimpleRenderPolicy(Params const & p); - - void DrawFrame(shared_ptr const & paintEvent, - ScreenBase const & screenBase); - graphics::Overlay * FrameOverlay() const; -}; diff --git a/render/software_renderer.hpp b/render/software_renderer.hpp deleted file mode 100644 index 6d91c16f72..0000000000 --- a/render/software_renderer.hpp +++ /dev/null @@ -1,171 +0,0 @@ -#pragma once - -#include "path_info.hpp" -#include "area_info.hpp" -#include "frame_image.hpp" -#include "text_engine.h" - -#include "geometry/point2d.hpp" - -#include "graphics/icon.hpp" -#include "graphics/circle.hpp" -#include "graphics/glyph_cache.hpp" -#include "graphics/pen.hpp" -#include "graphics/brush.hpp" -#include "graphics/font_desc.hpp" - -#include "base/string_utils.hpp" - -#include "3party/agg/agg_rendering_buffer.h" -#include "3party/agg/agg_pixfmt_rgba.h" -#include "3party/agg/agg_renderer_scanline.h" -#include "3party/agg/agg_renderer_primitives.h" -#include "3party/agg/agg_path_storage.h" - -#include "std/cstdint.hpp" -#include "std/unique_ptr.hpp" - - -class PathWrapper; - -class SoftwareRenderer -{ -public: - SoftwareRenderer(graphics::GlyphCache::Params const & glyphCacheParams, graphics::EDensity density); - - void BeginFrame(uint32_t width, uint32_t height, graphics::Color const & bgColor); - - void DrawSymbol(m2::PointD const & pt, graphics::EPosition anchor, - graphics::Icon::Info const & info); - void DrawCircle(m2::PointD const & pt, graphics::EPosition anchor, - graphics::Circle::Info const & info); - void DrawPath(di::PathInfo const & geometry, graphics::Pen::Info const & info); - void DrawPath(PathWrapper & path, math::Matrix const & m); - void DrawArea(di::AreaInfo const & geometry, graphics::Brush::Info const & info); - void DrawText(m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & primFont, strings::UniString const & primText); - void DrawText(m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & primFont, graphics::FontDesc const & secFont, - strings::UniString const & primText, strings::UniString const & secText); - void DrawPathText(di::PathInfo const & geometry, graphics::FontDesc const & font, - strings::UniString const & text); - - void CalculateSymbolMetric(m2::PointD const & pt, graphics::EPosition anchor, - graphics::Icon::Info const & info, m2::RectD & rect); - - void CalculateCircleMetric(m2::PointD const & pt, graphics::EPosition anchor, - graphics::Circle::Info const & info, m2::RectD & rect); - - void CalculateTextMetric(m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & font, strings::UniString const & text, - m2::RectD & result); - /// Result must be bound box contains both texts - void CalculateTextMetric(m2::PointD const & pt, graphics::EPosition anchor, - graphics::FontDesc const & primFont, graphics::FontDesc const & secFont, - strings::UniString const & primText, strings::UniString const & secText, - m2::RectD & result); - /// rects - rect for each glyph - void CalculateTextMetric(di::PathInfo const & geometry, graphics::FontDesc const & font, - strings::UniString const & text, - vector & rects); - - void EndFrame(FrameImage & image); - m2::RectD FrameRect() const; - - graphics::GlyphCache * GetGlyphCache() { return m_glyphCache.get(); } - -private: - template - struct TBlendAdaptor - { - using order_type = TOrder; - using color_type = TColor; - using TValueType = typename color_type::value_type; - using TCalcType = typename color_type::calc_type; - - enum EBaseScale - { - SCALE_SHIFT = color_type::base_shift, - SCALE_MASK = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, TValueType * p, unsigned cr, unsigned cg, - unsigned cb, unsigned ca, unsigned cover) - { - using TBlendTable = agg::comp_op_table_rgba; - if (p[TOrder::A]) - { - TBlendTable::g_comp_op_func[op](p, (cr * ca + SCALE_MASK) >> SCALE_SHIFT, (cg * ca + SCALE_MASK) >> SCALE_SHIFT, - (cb * ca + SCALE_MASK) >> SCALE_SHIFT, ca, cover); - } - else - TBlendTable::g_comp_op_func[op](p, cr, cg, cb, ca, cover); - } - }; - -public: - using TBlender = TBlendAdaptor; - using TPixelFormat = agg::pixfmt_custom_blend_rgba; - - using TBaseRenderer = agg::renderer_base; - using TPrimitivesRenderer = agg::renderer_primitives; - using TSolidRenderer = agg::renderer_scanline_aa_solid; - -private: - unique_ptr m_glyphCache; - map m_symbolsIndex; - vector m_symbolsSkin; - uint32_t m_skinWidth, m_skinHeight; - - std::vector m_frameBuffer; - uint32_t m_frameWidth, m_frameHeight; - - agg::rendering_buffer m_renderBuffer; - TPixelFormat m_pixelFormat; - TBaseRenderer m_baseRenderer; - - TSolidRenderer m_solidRenderer; - - ml::text_engine m_textEngine; -}; - -struct PathParams -{ - agg::rgba8 m_fillColor; - agg::rgba8 m_strokeColor; - bool m_isFill; - bool m_isStroke; - bool m_isEventOdd; - double m_strokeWidth; - - PathParams() - : m_fillColor(agg::rgba(0, 0, 0)) - , m_strokeColor(agg::rgba(0, 0, 0)) - , m_isFill(false) - , m_isStroke(false) - , m_isEventOdd(false) - , m_strokeWidth(1.0) - { - } -}; - -class PathWrapper -{ -public: - void AddParams(PathParams const & params); - void MoveTo(m2::PointD const & pt); - void LineTo(m2::PointD const & pt); - void CurveTo(m2::PointD const & pt1, - m2::PointD const & pt2, - m2::PointD const & ptTo); - void ClosePath(); - void BoundingRect(m2::RectD & rect); - - void Render(SoftwareRenderer::TSolidRenderer & renderer, - agg::trans_affine const & mtx, - m2::RectD const & clipBox); - -private: - agg::path_storage m_storage; - vector m_params; -}; diff --git a/render/tile.cpp b/render/tile.cpp deleted file mode 100644 index d1a6d15f9b..0000000000 --- a/render/tile.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "tile.hpp" - -#include "graphics/opengl/base_texture.hpp" - -Tile::Tile() -{} - -Tile::Tile(shared_ptr const & renderTarget, - const shared_ptr & overlay, - ScreenBase const & tileScreen, - Tiler::RectInfo const & rectInfo, - bool isEmptyDrawing, - int sequenceID) - : m_renderTarget(renderTarget), - m_overlay(overlay), - m_tileScreen(tileScreen), - m_rectInfo(rectInfo), - m_isEmptyDrawing(isEmptyDrawing), - m_sequenceID(sequenceID) -{} - -Tile::~Tile() -{} - -bool LessRectInfo::operator()(Tile const * l, Tile const * r) const -{ - return l->m_rectInfo < r->m_rectInfo; -} diff --git a/render/tile.hpp b/render/tile.hpp deleted file mode 100644 index 7b086d2590..0000000000 --- a/render/tile.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include "tiler.hpp" - -#include "geometry/screenbase.hpp" - -#include "std/shared_ptr.hpp" - -namespace graphics -{ - namespace gl - { - class BaseTexture; - } - class OverlayStorage; -} - -struct Tile -{ - shared_ptr m_renderTarget; //< taken from resource manager - shared_ptr m_overlay; //< text and POI's - ScreenBase m_tileScreen; //< cached to calculate it once, cause tile blitting - //< is performed on GUI thread. - Tiler::RectInfo m_rectInfo; //< taken from tiler - bool m_isEmptyDrawing; //< does this tile contains only coasts and oceans - int m_sequenceID; // SequenceID in witch tile was rendered - - Tile(); - - Tile(shared_ptr const & renderTarget, - shared_ptr const & overlay, - ScreenBase const & tileScreen, - Tiler::RectInfo const & rectInfo, - bool isEmptyDrawing, - int sequenceID); - - ~Tile(); -}; - -struct LessRectInfo -{ - bool operator()(Tile const * l, Tile const * r) const; -}; diff --git a/render/tile_cache.cpp b/render/tile_cache.cpp deleted file mode 100644 index 3cc44d2edd..0000000000 --- a/render/tile_cache.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "tile_cache.hpp" - -void TileCache::EntryValueTraits::Evict(Entry &val) -{ - if (val.m_rm) - val.m_rm->texturePool(graphics::ERenderTargetTexture)->Free(val.m_tile.m_renderTarget); -} - -TileCache::Entry::Entry() -{} - -TileCache::Entry::Entry(Tile const & tile, shared_ptr const & rm) - : m_tile(tile), m_rm(rm) -{} - -TileCache::TileCache() : m_isLocked(false) -{} - -void TileCache::AddTile(Tiler::RectInfo const & key, Entry const & entry) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - m_cache.Add(key, entry, 1); -} - -void TileCache::Lock() -{ - m_lock.Lock(); - m_isLocked = true; -} - -void TileCache::Unlock() -{ - m_isLocked = false; - m_lock.Unlock(); -} - -set const & TileCache::Keys() const -{ - return m_cache.Keys(); -/* set keys = m_cache.Keys(); - set rects; - - for (set::const_iterator it = keys.begin(); it != keys.end(); ++it) - { - Tiler::RectInfo v; - v.fromUInt64Cell(*it); - rects.insert(v); - } - - return rects;*/ -} - -bool TileCache::HasTile(Tiler::RectInfo const & key) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - return m_cache.HasElem(key); -} - -void TileCache::LockTile(Tiler::RectInfo const & key) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - m_cache.LockElem(key); -} - -size_t TileCache::LockCount(Tiler::RectInfo const & key) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - return m_cache.LockCount(key); -} - -void TileCache::UnlockTile(Tiler::RectInfo const & key) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - m_cache.UnlockElem(key); -} - -void TileCache::TouchTile(Tiler::RectInfo const & key) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - m_cache.Touch(key); -} - -Tile const & TileCache::GetTile(Tiler::RectInfo const & key) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - return m_cache.Find(key).m_tile; -} - -void TileCache::Remove(Tiler::RectInfo const & key) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - m_cache.Remove(key); -} - -int TileCache::CanFit() const -{ - return m_cache.CanFit(); -} - -int TileCache::UnlockedWeight() const -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - return m_cache.UnlockedWeight(); -} - -int TileCache::LockedWeight() const -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - return m_cache.LockedWeight(); -} - -int TileCache::CacheSize() const -{ - return m_cache.MaxWeight(); -} - -void TileCache::Resize(int maxWeight) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - m_cache.Resize(maxWeight); -} - -void TileCache::FreeRoom(int weight) -{ - ASSERT(m_isLocked, ("TileCache need to be locked on modify")); - m_cache.FreeRoom(weight); -} diff --git a/render/tile_cache.hpp b/render/tile_cache.hpp deleted file mode 100644 index 81b9647eda..0000000000 --- a/render/tile_cache.hpp +++ /dev/null @@ -1,81 +0,0 @@ -#pragma once - -#include "tile.hpp" -#include "tiler.hpp" - -#include "graphics/resource_manager.hpp" - -#include "base/mru_cache.hpp" -#include "base/mutex.hpp" - -#include "std/bind.hpp" - -namespace graphics -{ - class ResourceManager; -} - -class TileCache -{ -public: - - struct Entry - { - Tile m_tile; - shared_ptr m_rm; - Entry(); - Entry(Tile const & tile, shared_ptr const & rm); - }; - - struct EntryValueTraits - { - static void Evict(Entry & val); - }; - -private: - - my::MRUCache m_cache; - threads::Mutex m_lock; - bool m_isLocked; - - TileCache(TileCache const & src); - TileCache const & operator=(TileCache const & src); - -public: - - TileCache(); - /// lock for multithreaded access - void Lock(); - /// unlock for multithreaded access - void Unlock(); - /// get keys of values in cache - set const & Keys() const; - /// add tile to cache - void AddTile(Tiler::RectInfo const & key, Entry const & entry); - /// check, whether we have some tile in the cache - bool HasTile(Tiler::RectInfo const & key); - /// lock tile - void LockTile(Tiler::RectInfo const & key); - /// unlock tile - void UnlockTile(Tiler::RectInfo const & key); - /// lock count - size_t LockCount(Tiler::RectInfo const & key); - /// touch tile - void TouchTile(Tiler::RectInfo const & key); - /// get tile from the cache - Tile const & GetTile(Tiler::RectInfo const & key); - /// remove the specified tile from the cache - void Remove(Tiler::RectInfo const & key); - /// how much elements can fit in the tileCache - int CanFit() const; - /// how many unlocked elements do we have in tileCache - int UnlockedWeight() const; - /// how many locked elements do we have in tileCache - int LockedWeight() const; - /// the size of the cache - int CacheSize() const; - /// resize the cache - void Resize(int maxWeight); - /// free up to weight spaces evicting unlocked elements from cache - void FreeRoom(int weight); -}; diff --git a/render/tile_renderer.cpp b/render/tile_renderer.cpp deleted file mode 100644 index 338fcad612..0000000000 --- a/render/tile_renderer.cpp +++ /dev/null @@ -1,334 +0,0 @@ -#include "tile_renderer.hpp" -#include "window_handle.hpp" -#include "scales_processor.hpp" - -#include "graphics/opengl/opengl.hpp" -#include "graphics/opengl/gl_render_context.hpp" -#include "graphics/opengl/base_texture.hpp" - -#include "graphics/packets_queue.hpp" -#include "graphics/defines.hpp" - -#include "indexer/scales.hpp" - -#include "base/logging.hpp" -#include "base/condition.hpp" -#include "base/shared_buffer_manager.hpp" - -#include "std/bind.hpp" - -namespace -{ - class TileStructuresLockGuard - { - public: - TileStructuresLockGuard(TileCache & tileCache, TileSet & tileSet) - : m_tileCache(tileCache), m_tileSet(tileSet) - { - m_tileSet.Lock(); - m_tileCache.Lock(); - } - - ~TileStructuresLockGuard() - { - m_tileCache.Unlock(); - m_tileSet.Unlock(); - } - - private: - TileCache & m_tileCache; - TileSet & m_tileSet; - }; -} - -TileRenderer::TileSizeT TileRenderer::GetTileSizes() const -{ - graphics::ResourceManager::TexturePoolParams const & params = - m_resourceManager->params().m_textureParams[graphics::ERenderTargetTexture]; - return make_pair(params.m_texWidth, params.m_texHeight); -} - -TileRenderer::TileRenderer( - size_t tileSize, - unsigned executorsCount, - vector const & bgColors, - RenderPolicy::TRenderFn const & renderFn, - shared_ptr const & primaryRC, - shared_ptr const & rm, - double visualScale, - graphics::PacketsQueue ** packetsQueues) - : m_queue(executorsCount) - , m_tileSize(tileSize) - , m_renderFn(renderFn) - , m_bgColors(bgColors) - , m_sequenceID(0) - , m_isPaused(false) -{ - m_resourceManager = rm; - - m_threadData.resize(m_queue.ExecutorsCount()); - - LOG(LDEBUG, ("initializing ", m_queue.ExecutorsCount(), " rendering threads")); - - TileSizeT const tileSz = GetTileSizes(); - - for (unsigned i = 0; i < m_threadData.size(); ++i) - { - if (!packetsQueues) - m_threadData[i].m_renderContext.reset(primaryRC->createShared()); - - GPUDrawer::Params params; - - params.m_screenParams.m_resourceManager = m_resourceManager; - params.m_screenParams.m_frameBuffer = make_shared(); - - params.m_screenParams.m_threadSlot = m_resourceManager->renderThreadSlot(i); - params.m_visualScale = visualScale; - if (packetsQueues != 0) - params.m_screenParams.m_renderQueue = packetsQueues[i]; - params.m_screenParams.m_renderContext = m_threadData[i].m_renderContext; - - m_threadData[i].m_drawerParams = params; - m_threadData[i].m_drawer = 0; - m_threadData[i].m_threadSlot = params.m_screenParams.m_threadSlot; - m_threadData[i].m_colorBuffer = make_shared(tileSz.first, tileSz.second, false, - m_resourceManager->params().m_rgba4RenderBuffer); - m_threadData[i].m_depthBuffer = make_shared(tileSz.first, tileSz.second, true); - } - - m_queue.AddInitCommand(bind(&TileRenderer::InitializeThreadGL, this, _1)); - m_queue.AddFinCommand(bind(&TileRenderer::FinalizeThreadGL, this, _1)); - - m_queue.Start(); -} - -TileRenderer::~TileRenderer() -{ -} - -void TileRenderer::Shutdown() -{ - LOG(LDEBUG, ("shutdown resources")); - SetSequenceID(numeric_limits::max()); - m_queue.CancelCommands(); - m_queue.Cancel(); - - for (size_t i = 0; i < m_threadData.size(); ++i) - if (m_threadData[i].m_drawer) - delete m_threadData[i].m_drawer; -} - -void TileRenderer::InitializeThreadGL(core::CommandsQueue::Environment const & env) -{ - LOG(LDEBUG, ("initializing TileRenderer", env.threadNum(), "on it's own thread")); - - ThreadData & threadData = m_threadData[env.threadNum()]; - - TileSizeT const tileSz = GetTileSizes(); - - if (threadData.m_renderContext) - { - threadData.m_renderContext->makeCurrent(); - threadData.m_renderContext->startThreadDrawing(threadData.m_threadSlot); - } - threadData.m_drawer = new GPUDrawer(threadData.m_drawerParams); - threadData.m_drawer->OnSize(tileSz.first, tileSz.second); - threadData.m_drawer->Screen()->setRenderTarget(threadData.m_colorBuffer); - threadData.m_drawer->Screen()->setDepthBuffer(threadData.m_depthBuffer); -} - -void TileRenderer::FinalizeThreadGL(core::CommandsQueue::Environment const & env) -{ - ThreadData & threadData = m_threadData[env.threadNum()]; - - if (threadData.m_renderContext) - threadData.m_renderContext->endThreadDrawing(threadData.m_threadSlot); -} - -void TileRenderer::DrawTile(core::CommandsQueue::Environment const & env, - Tiler::RectInfo const & rectInfo, - int sequenceID) -{ -#ifndef USE_DRAPE - if (m_isPaused) - return; - - /// commands from the previous sequence are ignored - if (sequenceID < m_sequenceID) - return; - - if (HasTile(rectInfo)) - return; - - ThreadData & threadData = m_threadData[env.threadNum()]; - - graphics::PacketsQueue * glQueue = threadData.m_drawerParams.m_screenParams.m_renderQueue; - - GPUDrawer * drawer = threadData.m_drawer; - - ScreenBase frameScreen; - - TileSizeT const tileSz = GetTileSizes(); - ASSERT_EQUAL(tileSz.first, tileSz.second, ()); - - m2::RectI renderRect(1, 1, tileSz.first - 1, tileSz.second - 1); - - frameScreen.OnSize(renderRect); - - shared_ptr paintEvent(new PaintEvent(drawer, &env)); - - graphics::TTexturePool * texturePool = m_resourceManager->texturePool(graphics::ERenderTargetTexture); - - shared_ptr tileTarget = texturePool->Reserve(); - - if (texturePool->IsCancelled()) - return; - - shared_ptr tileOverlay(new graphics::OverlayStorage(m2::RectD(renderRect))); - - graphics::Screen * pScreen = drawer->Screen(); - - ScalesProcessor scales; - scales.SetParams(drawer->VisualScale(), tileSz.first); - int const drawingScale = scales.GetDrawTileScale(rectInfo.m_tileScale); - ASSERT(0 <= drawingScale && drawingScale < m_bgColors.size(), ()); - - pScreen->setOverlay(tileOverlay); - pScreen->beginFrame(); - pScreen->setClipRect(renderRect); - pScreen->clear(m_bgColors[drawingScale]); - - frameScreen.SetFromRect(m2::AnyRectD(rectInfo.m_rect)); - - m_renderFn(paintEvent, frameScreen, m2::RectD(renderRect), rectInfo.m_tileScale); - - pScreen->endFrame(); - pScreen->resetOverlay(); - pScreen->copyFramebufferToImage(tileTarget); - - if (!env.IsCancelled()) - { - if (glQueue) - glQueue->completeCommands(); - } - else - { - if (glQueue) - glQueue->cancelCommands(); - } - - if (env.IsCancelled()) - { - texturePool->Free(tileTarget); - } - else - { - AddActiveTile(Tile(tileTarget, - tileOverlay, - frameScreen, - rectInfo, - paintEvent->isEmptyDrawing(), - sequenceID)); - } -#endif //USE_DRAPE -} - -void TileRenderer::AddCommand(Tiler::RectInfo const & rectInfo, int sequenceID, core::CommandsQueue::Chain const & afterTileFns) -{ - SetSequenceID(sequenceID); - - core::CommandsQueue::Chain chain; - chain.addCommand(bind(&TileRenderer::DrawTile, this, _1, rectInfo, sequenceID)); - chain.addCommand(afterTileFns); - - m_queue.AddCommand(chain); -} - -void TileRenderer::CancelCommands() -{ - m_queue.CancelCommands(); -} - -void TileRenderer::ClearCommands() -{ - m_queue.Clear(); -} - -void TileRenderer::SetSequenceID(int sequenceID) -{ - m_sequenceID = sequenceID; -} - -TileCache & TileRenderer::GetTileCache() -{ - return m_tileCache; -} - -void TileRenderer::CacheActiveTile(Tiler::RectInfo const & rectInfo) -{ - TileStructuresLockGuard guard(m_tileCache, m_tileSet); - if (m_tileSet.HasTile(rectInfo)) - { - ASSERT(!m_tileCache.HasTile(rectInfo), ("")); - Tile tile = m_tileSet.GetTile(rectInfo); - - if (m_tileCache.CanFit() == 0) - { - LOG(LDEBUG, ("resizing tileCache to", m_tileCache.CacheSize() + 1, "elements")); - m_tileCache.Resize(m_tileCache.CacheSize() + 1); - } - - m_tileCache.AddTile(rectInfo, TileCache::Entry(tile, m_resourceManager)); - m_tileSet.RemoveTile(rectInfo); - } -} - -bool TileRenderer::HasTile(Tiler::RectInfo const & rectInfo) -{ - TileStructuresLockGuard guard(m_tileCache, m_tileSet); - - if (m_tileSet.HasTile(rectInfo)) - { - m_tileSet.SetTileSequenceID(rectInfo, m_sequenceID); - return true; - } - TileCache & tileCache = GetTileCache(); - if (tileCache.HasTile(rectInfo)) - return true; - - return false; -} - -void TileRenderer::SetIsPaused(bool flag) -{ - m_isPaused = flag; -} - -void TileRenderer::AddActiveTile(Tile const & tile) -{ - TileStructuresLockGuard lock(m_tileCache, m_tileSet); - - Tiler::RectInfo const & key = tile.m_rectInfo; - - if (m_tileSet.HasTile(key) || m_tileCache.HasTile(key)) - m_resourceManager->texturePool(graphics::ERenderTargetTexture)->Free(tile.m_renderTarget); - else - m_tileSet.AddTile(tile); -} - -void TileRenderer::RemoveActiveTile(Tiler::RectInfo const & rectInfo, int sequenceID) -{ - TileStructuresLockGuard lock(m_tileCache, m_tileSet); - - if (m_tileSet.HasTile(rectInfo) && m_tileSet.GetTileSequenceID(rectInfo) <= sequenceID) - { - ASSERT(!m_tileCache.HasTile(rectInfo), ("Tile cannot be in tileSet and tileCache at the same time")); - m_resourceManager->texturePool(graphics::ERenderTargetTexture)->Free(m_tileSet.GetTile(rectInfo).m_renderTarget); - m_tileSet.RemoveTile(rectInfo); - } -} - -size_t TileRenderer::TileSize() const -{ - return m_tileSize; -} diff --git a/render/tile_renderer.hpp b/render/tile_renderer.hpp deleted file mode 100644 index 2e689e1c42..0000000000 --- a/render/tile_renderer.hpp +++ /dev/null @@ -1,123 +0,0 @@ -#pragma once - -#include "render_policy.hpp" -#include "tiler.hpp" -#include "tile_cache.hpp" -#include "tile_set.hpp" -#include "gpu_drawer.hpp" - -#include "geometry/screenbase.hpp" - -#include "base/thread.hpp" -#include "base/threaded_list.hpp" -#include "base/commands_queue.hpp" - -#include "std/shared_ptr.hpp" -#include "std/vector.hpp" - -namespace graphics -{ - class ResourceManager; - class PacketsQueue; - - namespace gl - { - class RenderContext; - } -} - -class WindowHandle; -class Drawer; - -class TileRenderer -{ -protected: - - core::CommandsQueue m_queue; - - shared_ptr m_resourceManager; - - struct ThreadData - { - GPUDrawer * m_drawer; - GPUDrawer::Params m_drawerParams; - unsigned m_threadSlot; - shared_ptr m_renderContext; - shared_ptr m_colorBuffer; - shared_ptr m_depthBuffer; - }; - - buffer_vector m_threadData; - - TileCache m_tileCache; - - /// set of already rendered tiles, which are waiting - /// for the CoverageGenerator to process them - TileSet m_tileSet; - - size_t m_tileSize; - - typedef pair TileSizeT; - TileSizeT GetTileSizes() const; - - RenderPolicy::TRenderFn m_renderFn; - vector m_bgColors; - int m_sequenceID; - - bool m_isPaused; - - threads::Mutex m_tilesInProgressMutex; - set m_tilesInProgress; - - void InitializeThreadGL(core::CommandsQueue::Environment const & env); - void FinalizeThreadGL(core::CommandsQueue::Environment const & env); - -protected: - - virtual void DrawTile(core::CommandsQueue::Environment const & env, - Tiler::RectInfo const & rectInfo, - int sequenceID); - -public: - - /// constructor. - TileRenderer(size_t tileSize, - unsigned tasksCount, - vector const & bgColors, - RenderPolicy::TRenderFn const & renderFn, - shared_ptr const & primaryRC, - shared_ptr const & rm, - double visualScale, - graphics::PacketsQueue ** packetsQueue); - /// destructor. - virtual ~TileRenderer(); - void Shutdown(); - /// add command to the commands queue. - void AddCommand(Tiler::RectInfo const & rectInfo, - int sequenceID, - core::CommandsQueue::Chain const & afterTileFns = core::CommandsQueue::Chain()); - /// get tile cache. - TileCache & GetTileCache(); - /// Move active tile to cache if tile alrady rendered - void CacheActiveTile(Tiler::RectInfo const & rectInfo); - - void SetSequenceID(int sequenceID); - - void CancelCommands(); - - void ClearCommands(); - - bool HasTile(Tiler::RectInfo const & rectInfo); - - /// add tile to the temporary set of rendered tiles, cache it and lock it in the cache. - /// temporary set is necessary to carry the state between corresponding Tile rendering - /// commands and MergeTile commands. - void AddActiveTile(Tile const & tile); - /// remove tile from the TileSet. - /// @param doUpdateCache shows, whether we should - void RemoveActiveTile(Tiler::RectInfo const & rectInfo, int sequenceID); - - void SetIsPaused(bool flag); - - size_t TileSize() const; -}; diff --git a/render/tile_set.cpp b/render/tile_set.cpp deleted file mode 100644 index af50b56482..0000000000 --- a/render/tile_set.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "tile_set.hpp" - -void TileSet::Lock() -{ - m_mutex.Lock(); -} - -void TileSet::Unlock() -{ - m_mutex.Unlock(); -} - -bool TileSet::HasTile(Tiler::RectInfo const & rectInfo) -{ - return m_tiles.find(rectInfo) != m_tiles.end(); -} - -void TileSet::AddTile(Tile const & tile) -{ - m_tiles[tile.m_rectInfo] = tile; -} - -int TileSet::GetTileSequenceID(Tiler::RectInfo const & rectInfo) -{ - ASSERT(HasTile(rectInfo), ()); - return m_tiles[rectInfo].m_sequenceID; -} - -void TileSet::SetTileSequenceID(Tiler::RectInfo const & rectInfo, int sequenceID) -{ - ASSERT(HasTile(rectInfo), ()); - m_tiles[rectInfo].m_sequenceID = sequenceID; -} - -void TileSet::RemoveTile(const Tiler::RectInfo &rectInfo) -{ - m_tiles.erase(rectInfo); -} - -Tile const & TileSet::GetTile(Tiler::RectInfo const & rectInfo) -{ - return m_tiles[rectInfo]; -} - -size_t TileSet::Size() const -{ - return m_tiles.size(); -} diff --git a/render/tile_set.hpp b/render/tile_set.hpp deleted file mode 100644 index 8b2daac978..0000000000 --- a/render/tile_set.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include "tile.hpp" - -#include "base/mutex.hpp" - -#include "std/map.hpp" - -class TileSet -{ -private: - - typedef map TTiles; - - TTiles m_tiles; - - threads::Mutex m_mutex; - -public: - - /// lock TileSet for multithreaded access. - void Lock(); - /// unlock TileSet for multithreaded access. - void Unlock(); - /// do we have the specified tile - bool HasTile(Tiler::RectInfo const & rectInfo); - /// add tile to the set - void AddTile(Tile const & tile); - /// get sequenceID in witch tile was rendered - int GetTileSequenceID(Tiler::RectInfo const & rectInfo); - void SetTileSequenceID(Tiler::RectInfo const & rectInfo, int sequenceID); - /// get tile from the set - Tile const & GetTile(Tiler::RectInfo const & rectInfo); - /// remove tile from the set - void RemoveTile(Tiler::RectInfo const & rectInfo); - /// get the size of TileSet - size_t Size() const; -}; diff --git a/render/tiler.cpp b/render/tiler.cpp deleted file mode 100644 index fd4854c04c..0000000000 --- a/render/tiler.cpp +++ /dev/null @@ -1,137 +0,0 @@ -#include "tiler.hpp" -#include "scales_processor.hpp" - -#include "indexer/mercator.hpp" - -#include "base/logging.hpp" - - -Tiler::RectInfo::RectInfo() - : m_tileScale(0), m_x(0), m_y(0) -{} - -Tiler::RectInfo::RectInfo(int tileScale, int x, int y) - : m_tileScale(tileScale), m_x(x), m_y(y) -{ - initRect(); -} - -void Tiler::RectInfo::initRect() -{ - int k = 1 << m_tileScale; - - double rectSizeX = (MercatorBounds::maxX - MercatorBounds::minX) / k; - double rectSizeY = (MercatorBounds::maxY - MercatorBounds::minY) / k; - - m_rect.setMinX(m_x * rectSizeX); - m_rect.setMaxX((m_x + 1) * rectSizeX); - m_rect.setMinY(m_y * rectSizeY); - m_rect.setMaxY((m_y + 1) * rectSizeY); -} - -LessByScaleAndDistance::LessByScaleAndDistance(m2::PointD const & pt) - : m_pt(pt) -{ -} - -bool LessByScaleAndDistance::operator()(Tiler::RectInfo const & l, Tiler::RectInfo const & r) -{ - if (l.m_tileScale != r.m_tileScale) - return l.m_tileScale < r.m_tileScale; - - return l.m_rect.Center().Length(m_pt) < r.m_rect.Center().Length(m_pt); -} - -bool operator<(Tiler::RectInfo const & l, Tiler::RectInfo const & r) -{ - if (l.m_tileScale != r.m_tileScale) - return l.m_tileScale < r.m_tileScale; - if (l.m_y != r.m_y) - return l.m_y < r.m_y; - if (l.m_x != r.m_x) - return l.m_x < r.m_x; - return false; -} - -bool operator==(Tiler::RectInfo const & l, Tiler::RectInfo const & r) -{ - return (l.m_y == r.m_y) - && (l.m_x == r.m_x) - && (l.m_tileScale == r.m_tileScale); -} - -int Tiler::getTileScale(ScreenBase const & s, int ts) const -{ - return ScalesProcessor(ts).GetTileScaleBase(s); -} - -void Tiler::seed(ScreenBase const & screen, m2::PointD const & centerPt, size_t tileSize) -{ - m_screen = screen; - m_centerPt = centerPt; - m_tileSize = tileSize; - - m_tileScale = getTileScale(screen, tileSize); -} - -void Tiler::tiles(vector & tiles, int depth) -{ - if (m_tileScale == 0) - return; - - tiles.clear(); - - if (m_tileScale - depth < 0) - depth = m_tileScale; - - for (unsigned i = 0; i < depth; ++i) - { - int const pow = depth - 1 - i; - int const scale = 1 << pow; - int const tileSize = m_tileSize * scale; - int const tileScale = getTileScale(m_screen, tileSize); - - double const rectSizeX = (MercatorBounds::maxX - MercatorBounds::minX) / (1 << tileScale); - double const rectSizeY = (MercatorBounds::maxY - MercatorBounds::minY) / (1 << tileScale); - - // calculating coverage on the global rect, which corresponds to the - // pixel rect, which in ceiled to tileSize - - m2::AnyRectD const & globalRect = m_screen.GlobalRect(); - m2::RectD const clipRect = globalRect.GetGlobalRect(); - - int minTileX = static_cast(floor(clipRect.minX() / rectSizeX)); - int maxTileX = static_cast(ceil(clipRect.maxX() / rectSizeX)); - int minTileY = static_cast(floor(clipRect.minY() / rectSizeY)); - int maxTileY = static_cast(ceil(clipRect.maxY() / rectSizeY)); - - // generating new coverage - for (int tileY = minTileY; tileY < maxTileY; ++tileY) - for (int tileX = minTileX; tileX < maxTileX; ++tileX) - { - m2::RectD tileRect(tileX * rectSizeX, - tileY * rectSizeY, - (tileX + 1) * rectSizeX, - (tileY + 1) * rectSizeY); - - if (globalRect.IsIntersect(m2::AnyRectD(tileRect))) - tiles.push_back(RectInfo(tileScale, tileX, tileY)); - } - } - - // sorting coverage elements - sort(tiles.begin(), tiles.end(), LessByScaleAndDistance(m_centerPt)); -} - -Tiler::Tiler() : m_tileScale(0) -{} - -int Tiler::tileScale() const -{ - return m_tileScale; -} - -bool Tiler::isLeaf(RectInfo const & ri) const -{ - return (ri.m_tileScale == m_tileScale); -} diff --git a/render/tiler.hpp b/render/tiler.hpp deleted file mode 100644 index 2656548d0c..0000000000 --- a/render/tiler.hpp +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include "geometry/screenbase.hpp" -#include "geometry/rect2d.hpp" - -#include "std/vector.hpp" - - -class Tiler -{ -public: - - struct RectInfo - { - int m_tileScale; //< bounds / (2 ^ m_tileScale) is a size of the grid for a tile, - //< could be larger than maximum model scale - int m_x; - int m_y; - - m2::RectD m_rect; - - RectInfo(); - RectInfo(int tileScale, int x, int y); - - void initRect(); - }; - -private: - - ScreenBase m_screen; - m2::PointD m_centerPt; - int m_tileScale; - size_t m_tileSize; - - int getTileScale(ScreenBase const & s, int ts) const; - -public: - - Tiler(); - - /// seed tiler with new screenBase. - void seed(ScreenBase const & screenBase, m2::PointD const & centerPt, size_t tileSize); - - void tiles(vector & tiles, int depth); - bool isLeaf(RectInfo const & ri) const; - - int tileScale() const; -}; - -struct LessByScaleAndDistance -{ - m2::PointD m_pt; - LessByScaleAndDistance(m2::PointD const & pt); - bool operator()(Tiler::RectInfo const & l, Tiler::RectInfo const & r); -}; - -bool operator<(Tiler::RectInfo const & l, Tiler::RectInfo const & r); -bool operator==(Tiler::RectInfo const & l, Tiler::RectInfo const & r); diff --git a/render/tiling_render_policy_mt.cpp b/render/tiling_render_policy_mt.cpp deleted file mode 100644 index d863514ede..0000000000 --- a/render/tiling_render_policy_mt.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "tiling_render_policy_mt.hpp" -#include "window_handle.hpp" -#include "tile_renderer.hpp" -#include "coverage_generator.hpp" - -#include "platform/platform.hpp" - -#include "graphics/render_context.hpp" - - -using namespace graphics; - -TilingRenderPolicyMT::TilingRenderPolicyMT(Params const & p) - : BasicTilingRenderPolicy(p, false) -{ - graphics::ResourceManager::Params rmp = p.m_rmParams; - - rmp.checkDeviceCaps(); - bool useNpot = rmp.canUseNPOTextures(); - - rmp.m_textureParams[ELargeTexture] = GetTextureParam(GetLargeTextureSize(useNpot), 1, rmp.m_texFormat, ELargeTexture); - rmp.m_textureParams[EMediumTexture] = GetTextureParam(GetMediumTextureSize(useNpot), 1, rmp.m_texFormat, EMediumTexture); - rmp.m_textureParams[ERenderTargetTexture] = GetTextureParam(TileSize(), 1, rmp.m_texRtFormat, ERenderTargetTexture); - rmp.m_textureParams[ESmallTexture] = GetTextureParam(GetSmallTextureSize(useNpot), 4, rmp.m_texFormat, ESmallTexture); - - rmp.m_storageParams[ELargeStorage] = GetStorageParam(50000, 100000, 5, ELargeStorage); - rmp.m_storageParams[EMediumStorage] = GetStorageParam(6000, 9000, 1, EMediumStorage); - rmp.m_storageParams[ESmallStorage] = GetStorageParam(2000, 4000, 5, ESmallStorage); - rmp.m_storageParams[ETinyStorage] = GetStorageParam(100, 200, 5, ETinyStorage); - - rmp.m_glyphCacheParams = GetResourceGlyphCacheParams(Density()); - - rmp.m_threadSlotsCount = m_cpuCoresCount + 2; - rmp.m_renderThreadsCount = m_cpuCoresCount; - - rmp.m_useSingleThreadedOGL = false; - - m_resourceManager.reset(new graphics::ResourceManager(rmp, SkinName(), Density())); - - m_primaryRC->setResourceManager(m_resourceManager); - m_primaryRC->startThreadDrawing(m_resourceManager->guiThreadSlot()); - - Platform::FilesList fonts; - GetPlatform().GetFontNames(fonts); - m_resourceManager->addFonts(fonts); - - m_drawer.reset(CreateDrawer(p.m_useDefaultFB, p.m_primaryRC, ESmallStorage, ESmallTexture)); - InitCacheScreen(); - InitWindowsHandle(p.m_videoTimer, m_primaryRC); -} - -TilingRenderPolicyMT::~TilingRenderPolicyMT() -{ - LOG(LDEBUG, ("cancelling ResourceManager")); - m_resourceManager->cancel(); - - m_CoverageGenerator->Shutdown(); - m_TileRenderer->Shutdown(); - - m_CoverageGenerator.reset(); - m_TileRenderer.reset(); -} - -void TilingRenderPolicyMT::SetRenderFn(TRenderFn const & renderFn) -{ - m_TileRenderer.reset(new TileRenderer(TileSize(), - m_cpuCoresCount, - m_bgColors, - renderFn, - m_primaryRC, - m_resourceManager, - VisualScale(), - 0)); - - m_CoverageGenerator.reset(new CoverageGenerator(m_TileRenderer.get(), - m_windowHandle, - m_primaryRC, - m_resourceManager, - 0)); -} diff --git a/render/tiling_render_policy_mt.hpp b/render/tiling_render_policy_mt.hpp deleted file mode 100644 index ca3c308536..0000000000 --- a/render/tiling_render_policy_mt.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "basic_tiling_render_policy.hpp" - -namespace graphics -{ - namespace gl - { - class RenderContext; - } - class ResourceManager; -} - -class WindowHandle; - -class TilingRenderPolicyMT : public BasicTilingRenderPolicy -{ -public: - - TilingRenderPolicyMT(Params const & p); - - ~TilingRenderPolicyMT(); - - void SetRenderFn(TRenderFn const & renderFn); -}; diff --git a/render/tiling_render_policy_st.cpp b/render/tiling_render_policy_st.cpp deleted file mode 100644 index 99bf4ca206..0000000000 --- a/render/tiling_render_policy_st.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "tiling_render_policy_st.hpp" -#include "window_handle.hpp" -#include "queued_renderer.hpp" -#include "tile_renderer.hpp" -#include "coverage_generator.hpp" - -#include "platform/platform.hpp" - -#include "graphics/opengl/opengl.hpp" -#include "graphics/render_context.hpp" - - -using namespace graphics; - -TilingRenderPolicyST::TilingRenderPolicyST(Params const & p) - : BasicTilingRenderPolicy(p, - true) -{ - ResourceManager::Params rmp = p.m_rmParams; - - rmp.checkDeviceCaps(); - bool useNpot = rmp.canUseNPOTextures(); - - rmp.m_textureParams[ELargeTexture] = GetTextureParam(GetLargeTextureSize(useNpot), 1, rmp.m_texFormat, ELargeTexture); - rmp.m_textureParams[EMediumTexture] = GetTextureParam(GetMediumTextureSize(useNpot), 10, rmp.m_texFormat, EMediumTexture); - rmp.m_textureParams[ERenderTargetTexture] = GetTextureParam(TileSize(), 1, rmp.m_texRtFormat, ERenderTargetTexture); - rmp.m_textureParams[ESmallTexture] = GetTextureParam(GetSmallTextureSize(useNpot), 2, rmp.m_texFormat, ESmallTexture); - - rmp.m_storageParams[ELargeStorage] = GetStorageParam(6000, 9000, 10, ELargeStorage); - rmp.m_storageParams[EMediumStorage] = GetStorageParam(6000, 9000, 1, EMediumStorage); - rmp.m_storageParams[ESmallStorage] = GetStorageParam(2000, 4000, 5, ESmallStorage); - rmp.m_storageParams[ETinyStorage] = GetStorageParam(100, 200, 5, ETinyStorage); - - rmp.m_glyphCacheParams = GetResourceGlyphCacheParams(Density()); - - rmp.m_threadSlotsCount = m_cpuCoresCount + 2; - rmp.m_renderThreadsCount = m_cpuCoresCount; - - rmp.m_useSingleThreadedOGL = true; - - m_resourceManager.reset(new graphics::ResourceManager(rmp, SkinName(), Density())); - - m_primaryRC->setResourceManager(m_resourceManager); - m_primaryRC->startThreadDrawing(m_resourceManager->guiThreadSlot()); - - Platform::FilesList fonts; - GetPlatform().GetFontNames(fonts); - m_resourceManager->addFonts(fonts); - - m_drawer.reset(CreateDrawer(p.m_useDefaultFB, p.m_primaryRC, ESmallStorage, ESmallTexture)); - InitCacheScreen(); - InitWindowsHandle(p.m_videoTimer, m_primaryRC); -} - -TilingRenderPolicyST::~TilingRenderPolicyST() -{ - LOG(LDEBUG, ("cancelling ResourceManager")); - m_resourceManager->cancel(); - - LOG(LDEBUG, ("deleting TilingRenderPolicyST")); - - m_QueuedRenderer->PrepareQueueCancellation(m_cpuCoresCount); - /// now we should process all commands to collect them into queues - m_CoverageGenerator->Shutdown(); - m_QueuedRenderer->CancelQueuedCommands(m_cpuCoresCount); - - /// firstly stop all rendering commands in progress and collect all commands into queues - - for (unsigned i = 0; i < m_cpuCoresCount; ++i) - m_QueuedRenderer->PrepareQueueCancellation(i); - - m_TileRenderer->Shutdown(); - /// now we should cancel all collected commands - - for (unsigned i = 0; i < m_cpuCoresCount; ++i) - m_QueuedRenderer->CancelQueuedCommands(i); - - LOG(LDEBUG, ("reseting coverageGenerator")); - m_CoverageGenerator.reset(); - LOG(LDEBUG, ("reseting tileRenderer")); - m_TileRenderer.reset(); - LOG(LDEBUG, ("done reseting tileRenderer")); -} - -void TilingRenderPolicyST::SetRenderFn(TRenderFn const & renderFn) -{ - graphics::PacketsQueue ** queues = new graphics::PacketsQueue*[m_cpuCoresCount]; - - for (unsigned i = 0; i < m_cpuCoresCount; ++i) - queues[i] = m_QueuedRenderer->GetPacketsQueue(i); - - m_TileRenderer.reset(new TileRenderer(TileSize(), - m_cpuCoresCount, - m_bgColors, - renderFn, - m_primaryRC, - m_resourceManager, - VisualScale(), - queues)); - - delete [] queues; - - /// CoverageGenerator rendering queue could execute commands partially - /// as there are no render-to-texture calls. -// m_QueuedRenderer->SetPartialExecution(m_cpuCoresCount, true); - m_CoverageGenerator.reset(new CoverageGenerator(m_TileRenderer.get(), - m_windowHandle, - m_primaryRC, - m_resourceManager, - m_QueuedRenderer->GetPacketsQueue(m_cpuCoresCount))); -} diff --git a/render/tiling_render_policy_st.hpp b/render/tiling_render_policy_st.hpp deleted file mode 100644 index 771a615ce0..0000000000 --- a/render/tiling_render_policy_st.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "basic_tiling_render_policy.hpp" - -class TilingRenderPolicyST : public BasicTilingRenderPolicy -{ -public: - - TilingRenderPolicyST(Params const & p); - - ~TilingRenderPolicyST(); - - void SetRenderFn(TRenderFn const & renderFn); -}; diff --git a/render/window_handle.cpp b/render/window_handle.cpp deleted file mode 100644 index 3b9b6d3c18..0000000000 --- a/render/window_handle.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "window_handle.hpp" -#include "render_policy.hpp" - -WindowHandle::WindowHandle() : - m_hasPendingUpdates(false), - m_isUpdatesEnabled(true), - m_needRedraw(true), - m_videoTimer(nullptr), - m_stallsCount(0) -{ -} - -void WindowHandle::setRenderPolicy(RenderPolicy * renderPolicy) -{ - m_renderPolicy = renderPolicy; -} - -void WindowHandle::setVideoTimer(VideoTimer * videoTimer) -{ - m_videoTimer = videoTimer; - if (m_videoTimer != nullptr) - { - m_frameFn = videoTimer->frameFn(); - m_videoTimer->setFrameFn(bind(&WindowHandle::checkedFrameFn, this)); - } - m_stallsCount = 0; -} - -void WindowHandle::checkedFrameFn() -{ - if (m_renderPolicy->NeedRedraw()) - m_stallsCount = 0; - else - ++m_stallsCount; - - if (m_stallsCount >= 60) - { - //LOG(LINFO, ("PausedDOWN")); - if (m_videoTimer != nullptr) - m_videoTimer->pause(); - } - else - { - if (m_frameFn != nullptr) - m_frameFn(); - } -} - -WindowHandle::~WindowHandle() -{ - if (m_videoTimer != nullptr) - { - m_videoTimer->stop(); - m_videoTimer->setFrameFn(m_frameFn); - } -} - -bool WindowHandle::needRedraw() const -{ - return m_isUpdatesEnabled && m_needRedraw; -} - -void WindowHandle::checkTimer() -{ - if (m_videoTimer == nullptr) - return; - - switch (m_videoTimer->state()) - { - case VideoTimer::EStopped: - m_videoTimer->start(); - break; - case VideoTimer::EPaused: - //LOG(LINFO, ("WokenUP")); - m_videoTimer->resume(); - break; - default: - break; - } -} - -void WindowHandle::setNeedRedraw(bool flag) -{ - m_needRedraw = flag; - if (m_needRedraw && m_isUpdatesEnabled) - checkTimer(); -} - -shared_ptr const & WindowHandle::renderContext() -{ - return m_renderContext; -} - -void WindowHandle::setRenderContext(shared_ptr const & renderContext) -{ - m_renderContext = renderContext; -} - -bool WindowHandle::setUpdatesEnabled(bool doEnable) -{ - bool res = false; - - bool wasUpdatesEnabled = m_isUpdatesEnabled; - m_isUpdatesEnabled = doEnable; - - if ((!wasUpdatesEnabled) && (doEnable) && (m_hasPendingUpdates)) - { - setNeedRedraw(true); - m_hasPendingUpdates = false; - res = true; - } - - return res; -} - -void WindowHandle::invalidate() -{ - if (m_isUpdatesEnabled) - setNeedRedraw(true); - else - m_hasPendingUpdates = true; -} diff --git a/render/window_handle.hpp b/render/window_handle.hpp deleted file mode 100644 index a123d80317..0000000000 --- a/render/window_handle.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "events.hpp" -#include "drawer.hpp" - -#include "platform/video_timer.hpp" - -#include "base/logging.hpp" - -#include "std/shared_ptr.hpp" - - -namespace graphics -{ - class RenderContext; -} - -class RenderPolicy; - -class WindowHandle -{ - shared_ptr m_renderContext; - RenderPolicy * m_renderPolicy; - - bool m_hasPendingUpdates; - bool m_isUpdatesEnabled; - bool m_needRedraw; - - VideoTimer * m_videoTimer; - VideoTimer::TFrameFn m_frameFn; - int m_stallsCount; - -public: - - WindowHandle(); - virtual ~WindowHandle(); - - void setRenderPolicy(RenderPolicy * renderPolicy); - void setVideoTimer(VideoTimer * videoTimer); - - void checkedFrameFn(); - - bool needRedraw() const; - - void checkTimer(); - - void setNeedRedraw(bool flag); - - shared_ptr const & renderContext(); - - void setRenderContext(shared_ptr const & renderContext); - - bool setUpdatesEnabled(bool doEnable); - - void invalidate(); -}; diff --git a/render/yopme_render_policy.cpp b/render/yopme_render_policy.cpp deleted file mode 100644 index e91a1d6b74..0000000000 --- a/render/yopme_render_policy.cpp +++ /dev/null @@ -1,276 +0,0 @@ -#include "yopme_render_policy.hpp" -#include "window_handle.hpp" -#include "scales_processor.hpp" - -#include "geometry/screenbase.hpp" - -#include "graphics/opengl/framebuffer.hpp" -#include "graphics/render_context.hpp" -#include "graphics/blitter.hpp" -#include "graphics/pen.hpp" -#include "graphics/display_list.hpp" - -#include "platform/platform.hpp" - -#include "base/matrix.hpp" - -#include "std/algorithm.hpp" -#include "std/vector.hpp" - - -using namespace graphics; - -namespace -{ - const int DestinationDepthOffset = 10; - const int ApiPinDepth = maxDepth - 10; - const int MyLocationDepth = maxDepth; - const int ApiPinLength = 5.0; - - class CrossElement : public OverlayElement - { - public: - CrossElement(OverlayElement::Params const & params) - : OverlayElement(params) - { - setIsFrozen(true); - } - - virtual m2::RectD GetBoundRect() const - { - m2::PointD const offset(ApiPinLength, ApiPinLength); - m2::PointD const & pt = pivot(); - return m2::RectD(pt - offset, pt + offset); - } - - void draw(OverlayRenderer * r, math::Matrix const & m) const - { - Pen::Info outlineInfo(Color::White(), 5); - Pen::Info info(Color::Black(), 3); - - uint32_t outlineID = r->mapInfo(outlineInfo); - uint32_t infoID = r->mapInfo(info); - - m2::PointD const & pt = pivot(); - - m2::PointD firstLineOffset(ApiPinLength, ApiPinLength); - m2::PointD firstLine[2] = - { - pt - firstLineOffset, - pt + firstLineOffset - }; - - m2::PointD secondLineOffset(ApiPinLength, -ApiPinLength); - m2::PointD secondLine[2] = - { - pt - secondLineOffset, - pt + secondLineOffset - }; - - double d = depth(); - r->drawPath(firstLine, 2, 0.0, outlineID, d - DestinationDepthOffset); - r->drawPath(secondLine, 2, 0.0, outlineID, d - DestinationDepthOffset); - r->drawPath(firstLine, 2, 0.0, infoID, d); - r->drawPath(secondLine, 2, 0.0, infoID, d); - } - - void setTransformation(math::Matrix const & m) - { - OverlayElement::setTransformation(m); - } - }; -} - -YopmeRP::YopmeRP(RenderPolicy::Params const & p) - : RenderPolicy(p, 1) - , m_drawApiPin(false) - , m_drawMyPosition(false) -{ - LOG(LDEBUG, ("Yopme render policy created")); - fill(m_bgColors.begin(), m_bgColors.end(), graphics::Color(0xFF, 0xFF, 0xFF, 0xFF)); - - ResourceManager::Params rmp = p.m_rmParams; - - rmp.checkDeviceCaps(); - - double k = VisualScale(); - - rmp.m_textureParams[ELargeTexture] = GetTextureParam(512, 1, rmp.m_texFormat, ELargeTexture); - rmp.m_textureParams[ESmallTexture] = GetTextureParam(128 * k, 2, rmp.m_texFormat, ESmallTexture); - - rmp.m_storageParams[ELargeStorage] = GetStorageParam(50000, 100000, 15, ELargeStorage); - rmp.m_storageParams[EMediumStorage] = GetStorageParam(6000, 9000, 1, EMediumStorage); - rmp.m_storageParams[ESmallStorage] = GetStorageParam(2000, 6000, 1, ESmallStorage); - rmp.m_storageParams[ETinyStorage] = GetStorageParam(100, 200, 1, ETinyStorage); - - rmp.m_glyphCacheParams = GetResourceGlyphCacheParams(Density()); - - rmp.m_renderThreadsCount = 0; - rmp.m_threadSlotsCount = 1; - rmp.m_useSingleThreadedOGL = true; - - m_resourceManager.reset(new ResourceManager(rmp, SkinName(), Density())); - - m_primaryRC->setResourceManager(m_resourceManager); - m_primaryRC->startThreadDrawing(m_resourceManager->guiThreadSlot()); - - Platform::FilesList fonts; - GetPlatform().GetFontNames(fonts); - m_resourceManager->addFonts(fonts); - - m_drawer.reset(CreateDrawer(p.m_useDefaultFB, p.m_primaryRC, ESmallStorage, ESmallTexture)); - m_offscreenDrawer.reset(CreateDrawer(false, p.m_primaryRC, ELargeStorage, ELargeTexture)); - - InitCacheScreen(); - InitWindowsHandle(p.m_videoTimer, p.m_primaryRC); -} - -void YopmeRP::DrawCircle(Screen * pScreen, m2::PointD const & pt) -{ - { - Circle::Info info(8.0, Color::White(), true, 2.0, Color::Black()); - pScreen->drawCircle(pt, info, EPosCenter, MyLocationDepth); - } - - Pen::Info penInfo(Color::Black(), 2.0); - uint32_t penID = pScreen->mapInfo(penInfo); - - Pen::Info boldPenInfo(Color::Black(), 5.0); - uint32_t boldPenID = pScreen->mapInfo(boldPenInfo); - - Pen::Info outlinePenInfo(Color::White(), 3.0); - uint32_t outlinePenID = pScreen->mapInfo(outlinePenInfo); - - const double offset = 12.0; - - { - m2::PointD pts[2] = - { - m2::PointD(pt - m2::PointD(offset, 0.0)), - m2::PointD(pt - m2::PointD(-offset, 0.0)) - }; - - pScreen->drawPath(pts, 2, 0.0, boldPenID, MyLocationDepth - 7); - pScreen->drawPath(pts, 2, 0.0, outlinePenID, MyLocationDepth - 5); - pScreen->drawPath(pts, 2, 0.0, penID, MyLocationDepth); - } - - { - m2::PointD pts[2] = - { - m2::PointD(pt - m2::PointD(0.0, offset)), - m2::PointD(pt - m2::PointD(0.0, -offset)) - }; - - pScreen->drawPath(pts, 2, 0.0, boldPenID, MyLocationDepth - 7); - pScreen->drawPath(pts, 2, 0.0, outlinePenID, MyLocationDepth - 5); - pScreen->drawPath(pts, 2, 0.0, penID, MyLocationDepth); - } - - { - Circle::Info info(3.0, Color::White(), true, 3.0, Color::Black()); - pScreen->drawCircle(pt, info, EPosCenter, MyLocationDepth); - } -} - -void YopmeRP::InsertOverlayCross(m2::PointD pivot, shared_ptr const & overlayStorage) -{ - OverlayElement::Params params; - params.m_depth = ApiPinDepth; - params.m_pivot = pivot; - params.m_position = graphics::EPosCenter; - overlayStorage->AddElement(make_shared(params)); -} - -void YopmeRP::DrawFrame(shared_ptr const & e, ScreenBase const & s) -{ -#ifndef USE_DRAPE - shared_ptr renderTarget; - - int width = m_offscreenDrawer->Screen()->width(); - int height = m_offscreenDrawer->Screen()->height(); - - ASSERT(width == GetDrawer()->Screen()->width(), ()); - ASSERT(height == GetDrawer()->Screen()->height(), ()); - - shared_ptr overlay(new OverlayStorage(m2::RectD(0, 0, width, height))); - - { // offscreen rendering - m2::RectI renderRect(0, 0, width, height); - - Screen * pScreen = m_offscreenDrawer->Screen(); - renderTarget = m_resourceManager->createRenderTarget(width, height); - - pScreen->setOverlay(overlay); - pScreen->beginFrame(); - pScreen->setClipRect(renderRect); - pScreen->clear(m_bgColors[0]); - - shared_ptr paintEvent(new PaintEvent(m_offscreenDrawer.get())); - m_renderFn(paintEvent, s, m2::RectD(renderRect), ScalesProcessor().GetTileScaleBase(s)); - - pScreen->resetOverlay(); - - if (m_drawApiPin) - InsertOverlayCross(m_apiPinPoint, overlay); - - shared_ptr drawOverlay(new Overlay()); - drawOverlay->merge(overlay); - - pScreen->applySharpStates(); - pScreen->clear(m_bgColors[0], false); - - math::Matrix const m = math::Identity(); - drawOverlay->forEach([&pScreen, &m](shared_ptr const & e) - { - e->draw(pScreen, m); - }); - - pScreen->endFrame(); - pScreen->copyFramebufferToImage(renderTarget); - } - - { - // on screen rendering - Screen * pScreen = GetDrawer()->Screen(); - BlitInfo info; - info.m_srcSurface = renderTarget; - info.m_srcRect = m2::RectI(0, 0, width, height); - info.m_texRect = m2::RectU(0, 0, width, height); - info.m_matrix = math::Identity(); - info.m_depth = minDepth; - - pScreen->beginFrame(); - pScreen->clear(m_bgColors[0]); - - pScreen->applyBlitStates(); - pScreen->blit(&info, 1, true); - - pScreen->clear(m_bgColors[0], false); - if (m_drawMyPosition) - DrawCircle(pScreen, m_myPositionPoint); - - pScreen->endFrame(); - } -#endif // USE_DRAPE -} - -void YopmeRP::OnSize(int w, int h) -{ - RenderPolicy::OnSize(w, h); - m_offscreenDrawer->OnSize(w, h); - m_offscreenDrawer->Screen()->setDepthBuffer(make_shared(w, h, true)); - m_offscreenDrawer->Screen()->setRenderTarget(make_shared(w, h, false)); -} - -void YopmeRP::SetDrawingApiPin(bool isNeed, m2::PointD const & point) -{ - m_drawApiPin = isNeed; - m_apiPinPoint = point; -} - -void YopmeRP::SetDrawingMyLocation(bool isNeed, m2::PointD const & point) -{ - m_drawMyPosition = isNeed; - m_myPositionPoint = point; -} diff --git a/render/yopme_render_policy.hpp b/render/yopme_render_policy.hpp deleted file mode 100644 index c6e05e4d31..0000000000 --- a/render/yopme_render_policy.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "render_policy.hpp" - -#include "std/shared_ptr.hpp" - -class Drawer; -class YopmeRP : public RenderPolicy -{ -public: - YopmeRP(RenderPolicy::Params const & p); - virtual void DrawFrame(shared_ptr const & e, ScreenBase const & s); - - virtual void OnSize(int w, int h); - - void SetDrawingApiPin(bool isNeed, m2::PointD const & point); - void SetDrawingMyLocation(bool isNeed, m2::PointD const & point); - -private: - static void DrawCircle(graphics::Screen * pScreen, m2::PointD const & pt); - static void InsertOverlayCross(m2::PointD pivot, shared_ptr const & overlayStorage); - - shared_ptr m_offscreenDrawer; - bool m_drawApiPin; - m2::PointD m_apiPinPoint; // in pixels - bool m_drawMyPosition; - m2::PointD m_myPositionPoint; // in pixels -}; diff --git a/routing/route.cpp b/routing/route.cpp index d144c70901..e7442a8931 100644 --- a/routing/route.cpp +++ b/routing/route.cpp @@ -12,9 +12,6 @@ #include "base/logging.hpp" #include "std/numeric.hpp" -#include "std/utility.hpp" -#include "std/algorithm.hpp" - namespace routing { @@ -263,7 +260,7 @@ void Route::MatchLocationToRoute(location::GpsInfo & location, location::RouteMa if (m_routingSettings.m_matchRoute) location.m_bearing = location::AngleToBearing(GetPolySegAngle(iter.m_ind)); - routeMatchingInfo.Set(iter.m_pt, iter.m_ind); + routeMatchingInfo.Set(iter.m_pt, iter.m_ind, GetMercatorDistanceFromBegin()); } } } diff --git a/routing/routing_integration_tests/osrm_route_test.cpp b/routing/routing_integration_tests/osrm_route_test.cpp index e17e11a3e2..b100b0334a 100644 --- a/routing/routing_integration_tests/osrm_route_test.cpp +++ b/routing/routing_integration_tests/osrm_route_test.cpp @@ -2,7 +2,7 @@ #include "routing/routing_integration_tests/routing_test_tools.hpp" -#include "../../indexer/mercator.hpp" +#include "indexer/mercator.hpp" using namespace routing; diff --git a/routing/routing_session.cpp b/routing/routing_session.cpp index d4222444bc..74320bcc87 100644 --- a/routing/routing_session.cpp +++ b/routing/routing_session.cpp @@ -142,10 +142,8 @@ void RoutingSession::Reset() m_speedWarningSignal = false; } -RoutingSession::State RoutingSession::OnLocationPositionChanged(m2::PointD const & position, - GpsInfo const & info, - Index const & index) -{ +RoutingSession::State RoutingSession::OnLocationPositionChanged(GpsInfo const & info, Index const & index) + { ASSERT(m_state != RoutingNotActive, ()); ASSERT(m_router != nullptr, ()); @@ -194,7 +192,7 @@ RoutingSession::State RoutingSession::OnLocationPositionChanged(m2::PointD const } } } - m_lastGoodPosition = position; + m_lastGoodPosition = m_userCurrentPosition; } else { @@ -365,21 +363,6 @@ void RoutingSession::MatchLocationToRoute(location::GpsInfo & location, m_route.MatchLocationToRoute(location, routeMatchingInfo); } -bool RoutingSession::GetMercatorDistanceFromBegin(double & distance) const -{ - if (m_state != State::OnRoute) - { - distance = 0.0; - return false; - } - - threads::MutexGuard guard(m_routeSessionMutex); - UNUSED_VALUE(guard); - - distance = m_route.GetMercatorDistanceFromBegin(); - return true; -} - bool RoutingSession::DisableFollowMode() { if (m_state == RouteNotStarted || m_state == OnRoute) @@ -389,6 +372,7 @@ bool RoutingSession::DisableFollowMode() } return false; } + void RoutingSession::SetRoutingSettings(RoutingSettings const & routingSettings) { threads::MutexGuard guard(m_routeSessionMutex); @@ -396,6 +380,16 @@ void RoutingSession::SetRoutingSettings(RoutingSettings const & routingSettings) m_routingSettings = routingSettings; } +void RoutingSession::SetUserCurrentPosition(m2::PointD const & position) +{ + m_userCurrentPosition = position; +} + +m2::PointD const & RoutingSession::GetUserCurrentPosition() const +{ + return m_userCurrentPosition; +} + void RoutingSession::EnableTurnNotifications(bool enable) { threads::MutexGuard guard(m_routeSessionMutex); diff --git a/routing/routing_session.hpp b/routing/routing_session.hpp index 270cdb2240..aaa3773fdc 100644 --- a/routing/routing_session.hpp +++ b/routing/routing_session.hpp @@ -90,14 +90,16 @@ public: bool IsOnRoute() const { return (m_state == OnRoute); } void Reset(); - State OnLocationPositionChanged(m2::PointD const & position, location::GpsInfo const & info, - Index const & index); + Route const & GetRoute() const { return m_route; } + + State OnLocationPositionChanged(location::GpsInfo const & info, Index const & index); void GetRouteFollowingInfo(location::FollowingInfo & info) const; void MatchLocationToRoute(location::GpsInfo & location, location::RouteMatchingInfo & routeMatchingInfo) const; - bool GetMercatorDistanceFromBegin(double & distance) const; + void SetUserCurrentPosition(m2::PointD const & position); + m2::PointD const & GetUserCurrentPosition() const; void ActivateAdditionalFeatures() {} @@ -163,6 +165,7 @@ private: double m_lastDistance; int m_moveAwayCounter; m2::PointD m_lastGoodPosition; + m2::PointD m_userCurrentPosition; // Sound turn notification parameters. turns::sound::NotificationManager m_turnNotificationsMgr; diff --git a/routing/routing_tests/routing_session_test.cpp b/routing/routing_tests/routing_session_test.cpp index a2cc532acd..cb92a741c7 100644 --- a/routing/routing_tests/routing_session_test.cpp +++ b/routing/routing_tests/routing_session_test.cpp @@ -124,8 +124,7 @@ UNIT_TEST(TestRouteRebuilding) RoutingSession::State code; while (info.m_latitude < kTestRoute.back().y) { - code = session.OnLocationPositionChanged( - MercatorBounds::FromLatLon(info.m_latitude, info.m_longitude), info, index); + code = session.OnLocationPositionChanged(info, index); TEST_EQUAL(code, RoutingSession::State::OnRoute, ()); info.m_latitude += 0.01; } @@ -147,8 +146,7 @@ UNIT_TEST(TestRouteRebuilding) info.m_latitude = 1.; for (size_t i = 0; i < 10; ++i) { - code = session.OnLocationPositionChanged( - MercatorBounds::FromLatLon(info.m_latitude, info.m_longitude), info, index); + code = session.OnLocationPositionChanged(info, index); info.m_latitude -= 0.1; } TEST_EQUAL(code, RoutingSession::State::RouteNeedRebuild, ()); diff --git a/search/feature_offset_match.hpp b/search/feature_offset_match.hpp index 4179e29b6f..bccfa178a4 100644 --- a/search/feature_offset_match.hpp +++ b/search/feature_offset_match.hpp @@ -17,7 +17,6 @@ #include "std/utility.hpp" #include "std/vector.hpp" - namespace search { namespace impl diff --git a/std/iterator.hpp b/std/iterator.hpp index 0e820b66e1..d72f99eed1 100644 --- a/std/iterator.hpp +++ b/std/iterator.hpp @@ -6,6 +6,7 @@ #include +using std::advance; using std::back_insert_iterator; using std::back_inserter; using std::begin; @@ -14,6 +15,7 @@ using std::end; using std::insert_iterator; using std::istream_iterator; using std::iterator_traits; +using std::next; using std::reverse_iterator; #ifdef DEBUG_NEW diff --git a/std/tuple.hpp b/std/tuple.hpp index 1ab641ca7d..9e05d40bc4 100644 --- a/std/tuple.hpp +++ b/std/tuple.hpp @@ -8,7 +8,7 @@ using std::tuple; using std::make_tuple; -//using std::get; // "get" is very common name, use "get" member function +using std::get; #ifdef DEBUG_NEW #define new DEBUG_NEW diff --git a/std/type_traits.hpp b/std/type_traits.hpp index ca2a399e48..00baf5531f 100644 --- a/std/type_traits.hpp +++ b/std/type_traits.hpp @@ -10,15 +10,18 @@ using std::conditional; using std::enable_if; using std::is_arithmetic; +using std::is_base_of; using std::is_floating_point; using std::is_integral; using std::is_pod; using std::is_same; using std::is_signed; +using std::is_standard_layout; using std::is_unsigned; using std::make_signed; using std::make_unsigned; using std::underlying_type; +using std::is_void; /// @todo clang on linux doesn't have is_trivially_copyable. #ifndef OMIM_OS_LINUX diff --git a/std/utility.hpp b/std/utility.hpp index b535e65831..d2c4a9d159 100644 --- a/std/utility.hpp +++ b/std/utility.hpp @@ -5,10 +5,11 @@ #endif #include -using std::pair; + +using std::forward; using std::make_pair; using std::move; -using std::forward; +using std::pair; #ifdef DEBUG_NEW #define new DEBUG_NEW diff --git a/strings.txt b/strings.txt index bf3ec7d784..3f3a890d92 100644 --- a/strings.txt +++ b/strings.txt @@ -1374,35 +1374,35 @@ fi = ^\non lisätty latausjonoon. [country_status_downloading] - en = Downloading\n^\n^% + en = Downloading\n^\n^ comment = Message to display at the center of the screen when the country is downloading - cs = Stahování\n^\n^% - sk = SÅ¥ahovanie\n^\n^% - de = Wird heruntergeladen\n^\n^% - es = Descargando\n^\n^% - fr = Téléchargement de\n^\n^% - it = Sto scaricando\n^\n^% - ja = ^\n^%\nをダウンロード中 - ko = 다운로드 중\n^\n^% - nl = aan het downloaden\n^\n^% - ru = ЗагружаетÑÑ\n^\n^% - uk = ЗавантажуєтьÑÑ\n^\n^% - zh-Hant = 下載中\n^\n^% - pl = Pobieranie\n^\n^% - pt = A descarregar\n^\n^% - hu = ^\n^%\nletöltése folyamatban - th = à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด\n^\n^% - zh-Hans = 下载 \n^\n^%中 - ar = جاري التنزيل\n^\n^% - da = Downloader\n^\n^% - tr = ^\n^%\nindiriliyor - sv = Laddar ner\n^\n^% - he = מוריד\n^\n^% - id = Sedang mengunduh\n^\n^% - vi = Äang tải xuống\n^\n^% - ro = Se descarcă\n^\n^% - nb = Laster ned\n^\n^% - fi = Ladataan\n^\n^% + cs = Stahování\n^\n^ + sk = SÅ¥ahovanie\n^\n^ + de = Wird heruntergeladen\n^\n^ + es = Descargando\n^\n^ + fr = Téléchargement de\n^\n^ + it = Sto scaricando\n^\n^ + ja = ^\n^\nをダウンロード中 + ko = 다운로드 중\n^\n^ + nl = aan het downloaden\n^\n^ + ru = ЗагружаетÑÑ\n^\n^ + uk = ЗавантажуєтьÑÑ\n^\n^ + zh-Hant = 下載中\n^\n^ + pl = Pobieranie\n^\n^ + pt = A descarregar\n^\n^ + hu = ^\n^\nletöltése folyamatban + th = à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด\n^\n^ + zh-Hans = 下载 \n^\n^中 + ar = جاري التنزيل\n^\n^ + da = Downloader\n^\n^ + tr = ^\n^\nindiriliyor + sv = Laddar ner\n^\n^ + he = מוריד\n^\n^ + id = Sedang mengunduh\n^\n^ + vi = Äang tải xuống\n^\n^ + ro = Se descarcă\n^\n^ + nb = Laster ned\n^\n^ + fi = Ladataan\n^\n^ [country_status_download] comment = Button text for the button at the center of the screen when the country is not downloaded diff --git a/tools/android/update_assets_for_version.sh b/tools/android/update_assets_for_version.sh index 07f1e887fe..4f59119f21 100755 --- a/tools/android/update_assets_for_version.sh +++ b/tools/android/update_assets_for_version.sh @@ -8,11 +8,11 @@ DST=$2 rm -rf $DST || true mkdir $DST || true -files=(copyright.html faq.html resources-ldpi resources-mdpi resources-hdpi resources-xhdpi resources-xxhdpi categories.txt classificator.txt +files=(copyright.html faq.html resources-default resources-ldpi resources-mdpi resources-hdpi resources-xhdpi resources-xxhdpi categories.txt classificator.txt resources-ldpi_dark resources-mdpi_dark resources-hdpi_dark resources-xhdpi_dark resources-xxhdpi_dark resources-ldpi_clear resources-mdpi_clear resources-hdpi_clear resources-xhdpi_clear resources-xxhdpi_clear types.txt fonts_blacklist.txt fonts_whitelist.txt languages.txt unicode_blocks.txt - drules_proto.bin drules_proto_dark.bin drules_proto_clear.bin external_resources.txt packed_polygons.bin countries.txt sound-strings) + drules_proto.bin drules_proto_dark.bin drules_proto_clear.bin external_resources.txt packed_polygons.bin countries.txt sound-strings colors.txt patterns.txt) for item in ${files[*]} do diff --git a/tools/autobuild/ios.sh b/tools/autobuild/ios.sh index ff97897d2a..571747c2ce 100644 --- a/tools/autobuild/ios.sh +++ b/tools/autobuild/ios.sh @@ -11,7 +11,6 @@ if [[ $# < 1 ]]; then exit 1 fi CONFIGURATION="$1" -DRAPE_CONF="$2" source "$MY_PATH/build.sh" source "$MY_PATH/detect_xcode.sh" @@ -39,11 +38,6 @@ else exit 1 fi -if [[ $DRAPE_CONF == *drape* ]]; then - QMAKE_PARAMS=$QMAKE_PARAMS" drape drape_device" - SHADOW_DIR="${SHADOW_DIR}-drape" -fi - if [[ $CONFIGURATION == *simulator* ]]; then MKSPEC="$MY_PATH/../mkspecs/iphonesimulator" else diff --git a/tools/autobuild/shader_preprocessor.py b/tools/autobuild/shader_preprocessor.py index 729e980bba..07e4e0b80e 100644 --- a/tools/autobuild/shader_preprocessor.py +++ b/tools/autobuild/shader_preprocessor.py @@ -27,6 +27,7 @@ def formatShaderDocName(shaderName): def readIndexFile(filePath): f = open(filePath) gpuPrograms = dict() + index = 0 for line in f: lineParts = line.strip().split() if len(lineParts) != 3: @@ -48,16 +49,14 @@ def readIndexFile(filePath): print("More than one difinition of %s gpu program" % lineParts[0]) exit(13) - gpuPrograms[lineParts[0]] = (vertexShader, fragmentShader) + gpuPrograms[index] = (vertexShader, fragmentShader, lineParts[0]) + index += 1 return gpuPrograms def generateShaderIndexes(shaders): return dict((v, k) for k, v in enumerate(shaders)) -def generateProgramIndex(programs): - return dict((v, k) for k, v in enumerate(programs)) - def definitionChanged(newHeaderContent, defFilePath): if not os.path.isfile(defFilePath): return True @@ -104,7 +103,7 @@ def writeDefinitionFile(programIndex): result += "};\n\n" for programName in programIndex.keys(): - result += "extern int const %s;\n" % (programName) + result += "extern int const %s;\n" % (programIndex[programName][2]) result += "\n" result += "void InitGpuProgramsLib(map & gpuIndex);\n\n" @@ -140,12 +139,12 @@ def writeShadersIndex(outputFile, shaderIndex): for shader in shaderIndex: outputFile.write("#define %s %s\n" % (formatShaderIndexName(shader), shaderIndex[shader])) -def writeImplementationFile(programsDef, programIndex, shaderIndex, shaderDir, implFile, defFile, shaders): +def writeImplementationFile(programsDef, shaderIndex, shaderDir, implFile, defFile, shaders): vertexShaders = [s for s in shaders if s.endswith(".vsh")] fragmentShaders = [s for s in shaders if s.endswith(".fsh")] file = open(formatOutFilePath(shaderDir, implFile), 'w') file.write("#include \"%s\"\n\n" % (defFile)) - file.write("#include \"../std/utility.hpp\"\n\n") + file.write("#include \"std/utility.hpp\"\n\n") file.write("namespace gpu\n") file.write("{\n\n") @@ -161,8 +160,8 @@ def writeImplementationFile(programsDef, programIndex, shaderIndex, shaderDir, i file.write("vector FragmentEnum;\n\n") file.write("#endif\n") file.write("//---------------------------------------------//\n") - for program in programIndex: - file.write("const int %s = %s;\n" % (program, programIndex[program])); + for program in programsDef: + file.write("const int %s = %s;\n" % (programsDef[program][2], program)); file.write("//---------------------------------------------//\n") file.write("\n") file.write("ProgramInfo::ProgramInfo()\n") @@ -207,17 +206,8 @@ def writeImplementationFile(programsDef, programIndex, shaderIndex, shaderDir, i file.write("} // namespace gpu\n") file.close() -def validateDocumentation(shaders, shaderDir): - docFiles = [file for file in os.listdir(os.path.join(shaderDir, "doc"))] - undocumentedShaders = [] - for shader in shaders: - if formatShaderDocName(shader) not in docFiles: - undocumentedShaders.append(shader) - # TODO(AlexZ): Commented out lines below to avoid qtcreator console spamming. - #if undocumentedShaders: - #print("no documentation for shaders:", undocumentedShaders) - #exit(20) +############################### if len(sys.argv) < 4: print("Usage : " + sys.argv[0] + " ") @@ -232,15 +222,10 @@ shaders = [file for file in os.listdir(shaderDir) if os.path.isfile(os.path.join shaderIndex = generateShaderIndexes(shaders) programDefinition = readIndexFile(os.path.join(shaderDir, indexFileName)) -programIndex = generateProgramIndex(programDefinition) -headerFile = writeDefinitionFile(programIndex) +headerFile = writeDefinitionFile(programDefinition) if definitionChanged(headerFile, formatOutFilePath(shaderDir, definesFile)): f = open(formatOutFilePath(shaderDir, definesFile), 'w') f.write(headerFile) f.close() -# TODO(AlexZ): Commented out lines below to avoid qtcreator console spamming. -#else: - #print("No need to update definition file") -writeImplementationFile(programDefinition, programIndex, shaderIndex, shaderDir, implFile, definesFile, shaders) -validateDocumentation(shaders, shaderDir) +writeImplementationFile(programDefinition, shaderIndex, shaderDir, implFile, definesFile, shaders) diff --git a/tools/kothic b/tools/kothic index b8d935731e..d8d6ea0d99 160000 --- a/tools/kothic +++ b/tools/kothic @@ -1 +1 @@ -Subproject commit b8d935731e502c5390ba6764f32ba60be2fca884 +Subproject commit d8d6ea0d997f57ba39bd9d6e8e107f6a64970800 diff --git a/tools/python/stylesheet/drules_struct_pb2.py b/tools/python/stylesheet/drules_struct_pb2.py index ff3f6c8237..cb9bd2e3a4 100644 --- a/tools/python/stylesheet/drules_struct_pb2.py +++ b/tools/python/stylesheet/drules_struct_pb2.py @@ -19,7 +19,7 @@ _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor.FileDescriptor( name='drules_struct.proto', package='', - serialized_pb=_b('\n\x13\x64rules_struct.proto\"*\n\x0c\x44\x61shDotProto\x12\n\n\x02\x64\x64\x18\x01 \x03(\x01\x12\x0e\n\x06offset\x18\x02 \x01(\x01\":\n\x0cPathSymProto\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\x0c\n\x04step\x18\x02 \x02(\x01\x12\x0e\n\x06offset\x18\x03 \x01(\x01\"\xaf\x01\n\rLineRuleProto\x12\r\n\x05width\x18\x01 \x02(\x01\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x1e\n\x07\x64\x61shdot\x18\x03 \x01(\x0b\x32\r.DashDotProto\x12\x10\n\x08priority\x18\x04 \x02(\x05\x12\x1e\n\x07pathsym\x18\x05 \x01(\x0b\x32\r.PathSymProto\x12\x17\n\x04join\x18\x06 \x01(\x0e\x32\t.LineJoin\x12\x15\n\x03\x63\x61p\x18\x07 \x01(\x0e\x32\x08.LineCap\"\x9c\x01\n\x0cLineDefProto\x12\r\n\x05width\x18\x01 \x02(\x01\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x1e\n\x07\x64\x61shdot\x18\x03 \x01(\x0b\x32\r.DashDotProto\x12\x1e\n\x07pathsym\x18\x04 \x01(\x0b\x32\r.PathSymProto\x12\x17\n\x04join\x18\x06 \x01(\x0e\x32\t.LineJoin\x12\x15\n\x03\x63\x61p\x18\x07 \x01(\x0e\x32\x08.LineCap\"O\n\rAreaRuleProto\x12\r\n\x05\x63olor\x18\x01 \x02(\r\x12\x1d\n\x06\x62order\x18\x02 \x01(\x0b\x32\r.LineDefProto\x12\x10\n\x08priority\x18\x03 \x02(\x05\"I\n\x0fSymbolRuleProto\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\x16\n\x0e\x61pply_for_type\x18\x02 \x01(\x05\x12\x10\n\x08priority\x18\x03 \x02(\x05\"x\n\x0f\x43\x61ptionDefProto\x12\x0e\n\x06height\x18\x01 \x02(\x05\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x14\n\x0cstroke_color\x18\x03 \x01(\r\x12\x10\n\x08offset_x\x18\x04 \x01(\x05\x12\x10\n\x08offset_y\x18\x05 \x01(\x05\x12\x0c\n\x04text\x18\x06 \x01(\t\"l\n\x10\x43\x61ptionRuleProto\x12!\n\x07primary\x18\x01 \x02(\x0b\x32\x10.CaptionDefProto\x12#\n\tsecondary\x18\x02 \x01(\x0b\x32\x10.CaptionDefProto\x12\x10\n\x08priority\x18\x03 \x02(\x05\"a\n\x0f\x43ircleRuleProto\x12\x0e\n\x06radius\x18\x01 \x02(\x01\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x1d\n\x06\x62order\x18\x03 \x01(\x0b\x32\r.LineDefProto\x12\x10\n\x08priority\x18\x04 \x02(\x05\"m\n\x11PathTextRuleProto\x12!\n\x07primary\x18\x01 \x02(\x0b\x32\x10.CaptionDefProto\x12#\n\tsecondary\x18\x02 \x01(\x0b\x32\x10.CaptionDefProto\x12\x10\n\x08priority\x18\x03 \x02(\x05\"X\n\x0fShieldRuleProto\x12\x0e\n\x06height\x18\x01 \x02(\x05\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x14\n\x0cstroke_color\x18\x03 \x01(\r\x12\x10\n\x08priority\x18\x04 \x02(\x05\"\xa1\x02\n\x10\x44rawElementProto\x12\r\n\x05scale\x18\x01 \x02(\x05\x12\x1d\n\x05lines\x18\x02 \x03(\x0b\x32\x0e.LineRuleProto\x12\x1c\n\x04\x61rea\x18\x03 \x01(\x0b\x32\x0e.AreaRuleProto\x12 \n\x06symbol\x18\x04 \x01(\x0b\x32\x10.SymbolRuleProto\x12\"\n\x07\x63\x61ption\x18\x05 \x01(\x0b\x32\x11.CaptionRuleProto\x12 \n\x06\x63ircle\x18\x06 \x01(\x0b\x32\x10.CircleRuleProto\x12%\n\tpath_text\x18\x07 \x01(\x0b\x32\x12.PathTextRuleProto\x12 \n\x06shield\x18\x08 \x01(\x0b\x32\x10.ShieldRuleProto\x12\x10\n\x08\x61pply_if\x18\t \x03(\t\"G\n\x13\x43lassifElementProto\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\"\n\x07\x65lement\x18\x02 \x03(\x0b\x32\x11.DrawElementProto\"4\n\x0e\x43ontainerProto\x12\"\n\x04\x63ont\x18\x01 \x03(\x0b\x32\x14.ClassifElementProto*4\n\x08LineJoin\x12\r\n\tROUNDJOIN\x10\x00\x12\r\n\tBEVELJOIN\x10\x01\x12\n\n\x06NOJOIN\x10\x02*3\n\x07LineCap\x12\x0c\n\x08ROUNDCAP\x10\x00\x12\x0b\n\x07\x42UTTCAP\x10\x01\x12\r\n\tSQUARECAP\x10\x02\x42\x02H\x03') + serialized_pb=_b('\n\x13\x64rules_struct.proto\"*\n\x0c\x44\x61shDotProto\x12\n\n\x02\x64\x64\x18\x01 \x03(\x01\x12\x0e\n\x06offset\x18\x02 \x01(\x01\":\n\x0cPathSymProto\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\x0c\n\x04step\x18\x02 \x02(\x01\x12\x0e\n\x06offset\x18\x03 \x01(\x01\"\xaf\x01\n\rLineRuleProto\x12\r\n\x05width\x18\x01 \x02(\x01\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x1e\n\x07\x64\x61shdot\x18\x03 \x01(\x0b\x32\r.DashDotProto\x12\x10\n\x08priority\x18\x04 \x02(\x05\x12\x1e\n\x07pathsym\x18\x05 \x01(\x0b\x32\r.PathSymProto\x12\x17\n\x04join\x18\x06 \x01(\x0e\x32\t.LineJoin\x12\x15\n\x03\x63\x61p\x18\x07 \x01(\x0e\x32\x08.LineCap\"\x9c\x01\n\x0cLineDefProto\x12\r\n\x05width\x18\x01 \x02(\x01\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x1e\n\x07\x64\x61shdot\x18\x03 \x01(\x0b\x32\r.DashDotProto\x12\x1e\n\x07pathsym\x18\x04 \x01(\x0b\x32\r.PathSymProto\x12\x17\n\x04join\x18\x06 \x01(\x0e\x32\t.LineJoin\x12\x15\n\x03\x63\x61p\x18\x07 \x01(\x0e\x32\x08.LineCap\"O\n\rAreaRuleProto\x12\r\n\x05\x63olor\x18\x01 \x02(\r\x12\x1d\n\x06\x62order\x18\x02 \x01(\x0b\x32\r.LineDefProto\x12\x10\n\x08priority\x18\x03 \x02(\x05\"_\n\x0fSymbolRuleProto\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\x16\n\x0e\x61pply_for_type\x18\x02 \x01(\x05\x12\x10\n\x08priority\x18\x03 \x02(\x05\x12\x14\n\x0cmin_distance\x18\x04 \x01(\x05\"\x8d\x01\n\x0f\x43\x61ptionDefProto\x12\x0e\n\x06height\x18\x01 \x02(\x05\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x14\n\x0cstroke_color\x18\x03 \x01(\r\x12\x10\n\x08offset_x\x18\x04 \x01(\x05\x12\x10\n\x08offset_y\x18\x05 \x01(\x05\x12\x0c\n\x04text\x18\x06 \x01(\t\x12\x13\n\x0bis_optional\x18\x07 \x01(\x08\"l\n\x10\x43\x61ptionRuleProto\x12!\n\x07primary\x18\x01 \x02(\x0b\x32\x10.CaptionDefProto\x12#\n\tsecondary\x18\x02 \x01(\x0b\x32\x10.CaptionDefProto\x12\x10\n\x08priority\x18\x03 \x02(\x05\"a\n\x0f\x43ircleRuleProto\x12\x0e\n\x06radius\x18\x01 \x02(\x01\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x1d\n\x06\x62order\x18\x03 \x01(\x0b\x32\r.LineDefProto\x12\x10\n\x08priority\x18\x04 \x02(\x05\"m\n\x11PathTextRuleProto\x12!\n\x07primary\x18\x01 \x02(\x0b\x32\x10.CaptionDefProto\x12#\n\tsecondary\x18\x02 \x01(\x0b\x32\x10.CaptionDefProto\x12\x10\n\x08priority\x18\x03 \x02(\x05\"n\n\x0fShieldRuleProto\x12\x0e\n\x06height\x18\x01 \x02(\x05\x12\r\n\x05\x63olor\x18\x02 \x02(\r\x12\x14\n\x0cstroke_color\x18\x03 \x01(\r\x12\x10\n\x08priority\x18\x04 \x02(\x05\x12\x14\n\x0cmin_distance\x18\x05 \x01(\x05\"\xa1\x02\n\x10\x44rawElementProto\x12\r\n\x05scale\x18\x01 \x02(\x05\x12\x1d\n\x05lines\x18\x02 \x03(\x0b\x32\x0e.LineRuleProto\x12\x1c\n\x04\x61rea\x18\x03 \x01(\x0b\x32\x0e.AreaRuleProto\x12 \n\x06symbol\x18\x04 \x01(\x0b\x32\x10.SymbolRuleProto\x12\"\n\x07\x63\x61ption\x18\x05 \x01(\x0b\x32\x11.CaptionRuleProto\x12 \n\x06\x63ircle\x18\x06 \x01(\x0b\x32\x10.CircleRuleProto\x12%\n\tpath_text\x18\x07 \x01(\x0b\x32\x12.PathTextRuleProto\x12 \n\x06shield\x18\x08 \x01(\x0b\x32\x10.ShieldRuleProto\x12\x10\n\x08\x61pply_if\x18\t \x03(\t\"G\n\x13\x43lassifElementProto\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\"\n\x07\x65lement\x18\x02 \x03(\x0b\x32\x11.DrawElementProto\"4\n\x0e\x43ontainerProto\x12\"\n\x04\x63ont\x18\x01 \x03(\x0b\x32\x14.ClassifElementProto*4\n\x08LineJoin\x12\r\n\tROUNDJOIN\x10\x00\x12\r\n\tBEVELJOIN\x10\x01\x12\n\n\x06NOJOIN\x10\x02*3\n\x07LineCap\x12\x0c\n\x08ROUNDCAP\x10\x00\x12\x0b\n\x07\x42UTTCAP\x10\x01\x12\r\n\tSQUARECAP\x10\x02\x42\x02H\x03') ) _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -44,8 +44,8 @@ _LINEJOIN = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1571, - serialized_end=1623, + serialized_start=1637, + serialized_end=1689, ) _sym_db.RegisterEnumDescriptor(_LINEJOIN) @@ -71,8 +71,8 @@ _LINECAP = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1625, - serialized_end=1676, + serialized_start=1691, + serialized_end=1742, ) _sym_db.RegisterEnumDescriptor(_LINECAP) @@ -376,6 +376,13 @@ _SYMBOLRULEPROTO = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='min_distance', full_name='SymbolRuleProto.min_distance', index=3, + number=4, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -388,7 +395,7 @@ _SYMBOLRULEPROTO = _descriptor.Descriptor( oneofs=[ ], serialized_start=545, - serialized_end=618, + serialized_end=640, ) @@ -441,6 +448,13 @@ _CAPTIONDEFPROTO = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='is_optional', full_name='CaptionDefProto.is_optional', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -452,8 +466,8 @@ _CAPTIONDEFPROTO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=620, - serialized_end=740, + serialized_start=643, + serialized_end=784, ) @@ -496,8 +510,8 @@ _CAPTIONRULEPROTO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=742, - serialized_end=850, + serialized_start=786, + serialized_end=894, ) @@ -547,8 +561,8 @@ _CIRCLERULEPROTO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=852, - serialized_end=949, + serialized_start=896, + serialized_end=993, ) @@ -591,8 +605,8 @@ _PATHTEXTRULEPROTO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=951, - serialized_end=1060, + serialized_start=995, + serialized_end=1104, ) @@ -631,6 +645,13 @@ _SHIELDRULEPROTO = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='min_distance', full_name='ShieldRuleProto.min_distance', index=4, + number=5, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -642,8 +663,8 @@ _SHIELDRULEPROTO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1062, - serialized_end=1150, + serialized_start=1106, + serialized_end=1216, ) @@ -728,8 +749,8 @@ _DRAWELEMENTPROTO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1153, - serialized_end=1442, + serialized_start=1219, + serialized_end=1508, ) @@ -765,8 +786,8 @@ _CLASSIFELEMENTPROTO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1444, - serialized_end=1515, + serialized_start=1510, + serialized_end=1581, ) @@ -795,8 +816,8 @@ _CONTAINERPROTO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1517, - serialized_end=1569, + serialized_start=1583, + serialized_end=1635, ) _LINERULEPROTO.fields_by_name['dashdot'].message_type = _DASHDOTPROTO diff --git a/tools/unix/generate_drules.sh b/tools/unix/generate_drules.sh index 76fe6e5dec..85a735af08 100755 --- a/tools/unix/generate_drules.sh +++ b/tools/unix/generate_drules.sh @@ -22,7 +22,7 @@ function BuildDrawingRules() { } # Cleanup -cleanup=(classificator.txt types.txt visibility.txt) +cleanup=(classificator.txt types.txt visibility.txt colors.txt patterns.txt) for item in ${cleanup[*]} do rm $DATA_PATH/$item || true diff --git a/tools/unix/generate_symbols.sh b/tools/unix/generate_symbols.sh index ead8dce85e..b6ae153a65 100755 --- a/tools/unix/generate_symbols.sh +++ b/tools/unix/generate_symbols.sh @@ -4,6 +4,10 @@ set -e -u -x MY_PATH=`pwd` BINARY_PATH="$MY_PATH/../../out/release/skin_generator" DATA_PATH="$MY_PATH/../../data" +DETECT_QMAKE="$MY_PATH/../autobuild/detect_qmake.sh" + +source "$DETECT_QMAKE" +QMAKE="$(PrintQmakePath)" || ( echo "ERROR: qmake was not found, please add it to your PATH or into the tools/autobuild/detect_qmake.sh"; exit 1 ) # If skin_generator does not exist then build it if [ ! -f $BINARY_PATH ]; @@ -12,14 +16,14 @@ then for project in ${projects[*]} do cd $MY_PATH/../../3party/$project - qmake $project.pro -r -spec macx-clang CONFIG+=x86_64 + "$QMAKE" $project.pro -r -spec macx-clang CONFIG+=x86_64 make done projects=(base coding geometry skin_generator) for project in ${projects[*]} do cd $MY_PATH/../../$project - qmake $project.pro -r -spec macx-clang CONFIG+=x86_64 + "$QMAKE" $project.pro -r -spec macx-clang CONFIG+=x86_64 make done cd $MY_PATH diff --git a/xcode/drape/drape.xcodeproj/project.pbxproj b/xcode/drape/drape.xcodeproj/project.pbxproj index 6ef99b392a..e8bc00669d 100644 --- a/xcode/drape/drape.xcodeproj/project.pbxproj +++ b/xcode/drape/drape.xcodeproj/project.pbxproj @@ -7,6 +7,20 @@ objects = { /* Begin PBXBuildFile section */ + 670947231BDF9A4F005014C0 /* data_buffer_impl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947151BDF9A4F005014C0 /* data_buffer_impl.hpp */; }; + 670947241BDF9A4F005014C0 /* depth_constants.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947161BDF9A4F005014C0 /* depth_constants.hpp */; }; + 670947251BDF9A4F005014C0 /* fribidi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947171BDF9A4F005014C0 /* fribidi.cpp */; }; + 670947261BDF9A4F005014C0 /* fribidi.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947181BDF9A4F005014C0 /* fribidi.hpp */; }; + 670947271BDF9A4F005014C0 /* glyph_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947191BDF9A4F005014C0 /* glyph_manager.cpp */; }; + 670947281BDF9A4F005014C0 /* glyph_manager.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709471A1BDF9A4F005014C0 /* glyph_manager.hpp */; }; + 670947291BDF9A4F005014C0 /* hw_texture_ios.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709471B1BDF9A4F005014C0 /* hw_texture_ios.hpp */; }; + 6709472A1BDF9A4F005014C0 /* hw_texture_ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6709471C1BDF9A4F005014C0 /* hw_texture_ios.mm */; }; + 6709472B1BDF9A4F005014C0 /* hw_texture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709471D1BDF9A4F005014C0 /* hw_texture.cpp */; }; + 6709472C1BDF9A4F005014C0 /* hw_texture.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709471E1BDF9A4F005014C0 /* hw_texture.hpp */; }; + 6709472D1BDF9A4F005014C0 /* index_storage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709471F1BDF9A4F005014C0 /* index_storage.cpp */; }; + 6709472E1BDF9A4F005014C0 /* index_storage.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947201BDF9A4F005014C0 /* index_storage.hpp */; }; + 6709472F1BDF9A4F005014C0 /* shader_def.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947211BDF9A4F005014C0 /* shader_def.cpp */; }; + 670947301BDF9A4F005014C0 /* shader_def.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947221BDF9A4F005014C0 /* shader_def.hpp */; }; 670D059D1B0CC8A70013A7AC /* shader_index.txt in Sources */ = {isa = PBXBuildFile; fileRef = 6729A5491A69213A007D5872 /* shader_index.txt */; }; 6729A5631A69213A007D5872 /* attribute_buffer_mutator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6729A4FF1A69213A007D5872 /* attribute_buffer_mutator.cpp */; }; 6729A5641A69213A007D5872 /* attribute_buffer_mutator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6729A5001A69213A007D5872 /* attribute_buffer_mutator.hpp */; }; @@ -63,8 +77,6 @@ 6729A5991A69213A007D5872 /* pointers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6729A5351A69213A007D5872 /* pointers.hpp */; }; 6729A59A1A69213A007D5872 /* render_bucket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6729A5361A69213A007D5872 /* render_bucket.cpp */; }; 6729A59B1A69213A007D5872 /* render_bucket.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6729A5371A69213A007D5872 /* render_bucket.hpp */; }; - 6729A59C1A69213A007D5872 /* sdf_image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6729A5381A69213A007D5872 /* sdf_image.cpp */; }; - 6729A59D1A69213A007D5872 /* sdf_image.h in Headers */ = {isa = PBXBuildFile; fileRef = 6729A5391A69213A007D5872 /* sdf_image.h */; }; 6729A5A01A69213A007D5872 /* shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6729A53C1A69213A007D5872 /* shader.cpp */; }; 6729A5A11A69213A007D5872 /* shader.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6729A53D1A69213A007D5872 /* shader.hpp */; }; 6729A5A21A69213A007D5872 /* stipple_pen_resource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6729A54E1A69213A007D5872 /* stipple_pen_resource.cpp */; }; @@ -81,12 +93,12 @@ 6729A5AD1A69213A007D5872 /* uniform_value.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6729A5591A69213A007D5872 /* uniform_value.hpp */; }; 6729A5AE1A69213A007D5872 /* uniform_values_storage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6729A55A1A69213A007D5872 /* uniform_values_storage.cpp */; }; 6729A5AF1A69213A007D5872 /* uniform_values_storage.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6729A55B1A69213A007D5872 /* uniform_values_storage.hpp */; }; - 6729A5B01A69213A007D5872 /* stb_image.c in Sources */ = {isa = PBXBuildFile; fileRef = 6729A55D1A69213A007D5872 /* stb_image.c */; settings = {COMPILER_FLAGS = "-w"; }; }; - 6729A5B11A69213A007D5872 /* stb_image.h in Headers */ = {isa = PBXBuildFile; fileRef = 6729A55E1A69213A007D5872 /* stb_image.h */; }; 6729A5B21A69213A007D5872 /* vertex_decl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6729A55F1A69213A007D5872 /* vertex_decl.cpp */; }; 6729A5B31A69213A007D5872 /* vertex_decl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6729A5601A69213A007D5872 /* vertex_decl.hpp */; }; 6729A5B41A69213A007D5872 /* vertex_array_buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6729A5611A69213A007D5872 /* vertex_array_buffer.cpp */; }; 6729A5B51A69213A007D5872 /* vertex_array_buffer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6729A5621A69213A007D5872 /* vertex_array_buffer.hpp */; }; + 675D21991BFB876E00717E4F /* projection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675D21971BFB876E00717E4F /* projection.cpp */; }; + 675D219A1BFB876E00717E4F /* projection.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675D21981BFB876E00717E4F /* projection.hpp */; }; /* End PBXBuildFile section */ /* Begin PBXBuildRule section */ @@ -104,6 +116,20 @@ /* End PBXBuildRule section */ /* Begin PBXFileReference section */ + 670947151BDF9A4F005014C0 /* data_buffer_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = data_buffer_impl.hpp; sourceTree = ""; }; + 670947161BDF9A4F005014C0 /* depth_constants.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = depth_constants.hpp; sourceTree = ""; }; + 670947171BDF9A4F005014C0 /* fribidi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fribidi.cpp; sourceTree = ""; }; + 670947181BDF9A4F005014C0 /* fribidi.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fribidi.hpp; sourceTree = ""; }; + 670947191BDF9A4F005014C0 /* glyph_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glyph_manager.cpp; sourceTree = ""; }; + 6709471A1BDF9A4F005014C0 /* glyph_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = glyph_manager.hpp; sourceTree = ""; }; + 6709471B1BDF9A4F005014C0 /* hw_texture_ios.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = hw_texture_ios.hpp; sourceTree = ""; }; + 6709471C1BDF9A4F005014C0 /* hw_texture_ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = hw_texture_ios.mm; sourceTree = ""; }; + 6709471D1BDF9A4F005014C0 /* hw_texture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hw_texture.cpp; sourceTree = ""; }; + 6709471E1BDF9A4F005014C0 /* hw_texture.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = hw_texture.hpp; sourceTree = ""; }; + 6709471F1BDF9A4F005014C0 /* index_storage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = index_storage.cpp; sourceTree = ""; }; + 670947201BDF9A4F005014C0 /* index_storage.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = index_storage.hpp; sourceTree = ""; }; + 670947211BDF9A4F005014C0 /* shader_def.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shader_def.cpp; sourceTree = ""; }; + 670947221BDF9A4F005014C0 /* shader_def.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shader_def.hpp; sourceTree = ""; }; 670D059E1B0CFE940013A7AC /* defaults.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = defaults.xcconfig; path = ../defaults.xcconfig; sourceTree = ""; }; 6729A4F11A691F6A007D5872 /* libdrape.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libdrape.a; sourceTree = BUILT_PRODUCTS_DIR; }; 6729A4FF1A69213A007D5872 /* attribute_buffer_mutator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = attribute_buffer_mutator.cpp; sourceTree = ""; }; @@ -161,8 +187,6 @@ 6729A5351A69213A007D5872 /* pointers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pointers.hpp; sourceTree = ""; }; 6729A5361A69213A007D5872 /* render_bucket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_bucket.cpp; sourceTree = ""; }; 6729A5371A69213A007D5872 /* render_bucket.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = render_bucket.hpp; sourceTree = ""; }; - 6729A5381A69213A007D5872 /* sdf_image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sdf_image.cpp; sourceTree = ""; }; - 6729A5391A69213A007D5872 /* sdf_image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sdf_image.h; sourceTree = ""; }; 6729A53C1A69213A007D5872 /* shader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shader.cpp; sourceTree = ""; }; 6729A53D1A69213A007D5872 /* shader.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shader.hpp; sourceTree = ""; }; 6729A5401A69213A007D5872 /* line_fragment_shader_fsh.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = line_fragment_shader_fsh.txt; sourceTree = ""; }; @@ -193,12 +217,12 @@ 6729A5591A69213A007D5872 /* uniform_value.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = uniform_value.hpp; sourceTree = ""; }; 6729A55A1A69213A007D5872 /* uniform_values_storage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = uniform_values_storage.cpp; sourceTree = ""; }; 6729A55B1A69213A007D5872 /* uniform_values_storage.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = uniform_values_storage.hpp; sourceTree = ""; }; - 6729A55D1A69213A007D5872 /* stb_image.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stb_image.c; sourceTree = ""; }; - 6729A55E1A69213A007D5872 /* stb_image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stb_image.h; sourceTree = ""; }; 6729A55F1A69213A007D5872 /* vertex_decl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vertex_decl.cpp; sourceTree = ""; }; 6729A5601A69213A007D5872 /* vertex_decl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vertex_decl.hpp; sourceTree = ""; }; 6729A5611A69213A007D5872 /* vertex_array_buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vertex_array_buffer.cpp; sourceTree = ""; }; 6729A5621A69213A007D5872 /* vertex_array_buffer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vertex_array_buffer.hpp; sourceTree = ""; }; + 675D21971BFB876E00717E4F /* projection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = projection.cpp; sourceTree = ""; }; + 675D21981BFB876E00717E4F /* projection.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = projection.hpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -234,6 +258,20 @@ children = ( 6729A53E1A69213A007D5872 /* shaders */, 6729A55C1A69213A007D5872 /* utils */, + 670947151BDF9A4F005014C0 /* data_buffer_impl.hpp */, + 670947161BDF9A4F005014C0 /* depth_constants.hpp */, + 670947171BDF9A4F005014C0 /* fribidi.cpp */, + 670947181BDF9A4F005014C0 /* fribidi.hpp */, + 670947191BDF9A4F005014C0 /* glyph_manager.cpp */, + 6709471A1BDF9A4F005014C0 /* glyph_manager.hpp */, + 6709471B1BDF9A4F005014C0 /* hw_texture_ios.hpp */, + 6709471C1BDF9A4F005014C0 /* hw_texture_ios.mm */, + 6709471D1BDF9A4F005014C0 /* hw_texture.cpp */, + 6709471E1BDF9A4F005014C0 /* hw_texture.hpp */, + 6709471F1BDF9A4F005014C0 /* index_storage.cpp */, + 670947201BDF9A4F005014C0 /* index_storage.hpp */, + 670947211BDF9A4F005014C0 /* shader_def.cpp */, + 670947221BDF9A4F005014C0 /* shader_def.hpp */, 6729A4FF1A69213A007D5872 /* attribute_buffer_mutator.cpp */, 6729A5001A69213A007D5872 /* attribute_buffer_mutator.hpp */, 6729A5011A69213A007D5872 /* attribute_provider.cpp */, @@ -289,8 +327,6 @@ 6729A5351A69213A007D5872 /* pointers.hpp */, 6729A5361A69213A007D5872 /* render_bucket.cpp */, 6729A5371A69213A007D5872 /* render_bucket.hpp */, - 6729A5381A69213A007D5872 /* sdf_image.cpp */, - 6729A5391A69213A007D5872 /* sdf_image.h */, 6729A53C1A69213A007D5872 /* shader.cpp */, 6729A53D1A69213A007D5872 /* shader.hpp */, 6729A54E1A69213A007D5872 /* stipple_pen_resource.cpp */, @@ -346,8 +382,8 @@ 6729A55C1A69213A007D5872 /* utils */ = { isa = PBXGroup; children = ( - 6729A55D1A69213A007D5872 /* stb_image.c */, - 6729A55E1A69213A007D5872 /* stb_image.h */, + 675D21971BFB876E00717E4F /* projection.cpp */, + 675D21981BFB876E00717E4F /* projection.hpp */, 6729A55F1A69213A007D5872 /* vertex_decl.cpp */, 6729A5601A69213A007D5872 /* vertex_decl.hpp */, ); @@ -363,10 +399,11 @@ files = ( 6729A5A31A69213A007D5872 /* stipple_pen_resource.hpp in Headers */, 6729A5661A69213A007D5872 /* attribute_provider.hpp in Headers */, + 670947301BDF9A4F005014C0 /* shader_def.hpp in Headers */, 6729A57C1A69213A007D5872 /* glextensions_list.hpp in Headers */, 6729A58D1A69213A007D5872 /* index_buffer_mutator.hpp in Headers */, 6729A5781A69213A007D5872 /* font_texture.hpp in Headers */, - 6729A59D1A69213A007D5872 /* sdf_image.h in Headers */, + 670947231BDF9A4F005014C0 /* data_buffer_impl.hpp in Headers */, 6729A59B1A69213A007D5872 /* render_bucket.hpp in Headers */, 6729A56C1A69213A007D5872 /* binding_info.hpp in Headers */, 6729A5971A69213A007D5872 /* overlay_tree.hpp in Headers */, @@ -377,7 +414,9 @@ 6729A5681A69213A007D5872 /* batcher_helpers.hpp in Headers */, 6729A5931A69213A007D5872 /* oglcontextfactory.hpp in Headers */, 6729A56A1A69213A007D5872 /* batcher.hpp in Headers */, - 6729A5B11A69213A007D5872 /* stb_image.h in Headers */, + 675D219A1BFB876E00717E4F /* projection.hpp in Headers */, + 670947291BDF9A4F005014C0 /* hw_texture_ios.hpp in Headers */, + 670947281BDF9A4F005014C0 /* glyph_manager.hpp in Headers */, 6729A5991A69213A007D5872 /* pointers.hpp in Headers */, 6729A5A51A69213A007D5872 /* symbols_texture.hpp in Headers */, 6729A5831A69213A007D5872 /* glstate.hpp in Headers */, @@ -389,13 +428,17 @@ 6729A5AF1A69213A007D5872 /* uniform_values_storage.hpp in Headers */, 6729A5951A69213A007D5872 /* overlay_handle.hpp in Headers */, 6729A57E1A69213A007D5872 /* glfunctions.hpp in Headers */, + 6709472E1BDF9A4F005014C0 /* index_storage.hpp in Headers */, 6729A5B51A69213A007D5872 /* vertex_array_buffer.hpp in Headers */, 6729A5A71A69213A007D5872 /* texture_manager.hpp in Headers */, 6729A5901A69213A007D5872 /* object_pool.hpp in Headers */, + 670947261BDF9A4F005014C0 /* fribidi.hpp in Headers */, 6729A5A11A69213A007D5872 /* shader.hpp in Headers */, + 670947241BDF9A4F005014C0 /* depth_constants.hpp in Headers */, 6729A5641A69213A007D5872 /* attribute_buffer_mutator.hpp in Headers */, 6729A5811A69213A007D5872 /* glsl_types.hpp in Headers */, 6729A57A1A69213A007D5872 /* glconstants.hpp in Headers */, + 6709472C1BDF9A4F005014C0 /* hw_texture.hpp in Headers */, 6729A5911A69213A007D5872 /* oglcontext.hpp in Headers */, 6729A5891A69213A007D5872 /* gpu_program_manager.hpp in Headers */, 6729A5AB1A69213A007D5872 /* texture.hpp in Headers */, @@ -434,7 +477,7 @@ 6729A4E91A691F6A007D5872 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0710; ORGANIZATIONNAME = maps.me; TargetAttributes = { 6729A4F01A691F6A007D5872 = { @@ -470,27 +513,33 @@ 6729A56B1A69213A007D5872 /* binding_info.cpp in Sources */, 6729A5791A69213A007D5872 /* glconstants.cpp in Sources */, 6729A5941A69213A007D5872 /* overlay_handle.cpp in Sources */, + 6709472D1BDF9A4F005014C0 /* index_storage.cpp in Sources */, 6729A5861A69213A007D5872 /* gpu_buffer.cpp in Sources */, 6729A59A1A69213A007D5872 /* render_bucket.cpp in Sources */, 6729A5921A69213A007D5872 /* oglcontextfactory.cpp in Sources */, 6729A58A1A69213A007D5872 /* gpu_program.cpp in Sources */, - 6729A59C1A69213A007D5872 /* sdf_image.cpp in Sources */, + 6709472A1BDF9A4F005014C0 /* hw_texture_ios.mm in Sources */, 6729A57B1A69213A007D5872 /* glextensions_list.cpp in Sources */, 6729A5981A69213A007D5872 /* pointers.cpp in Sources */, 6729A5881A69213A007D5872 /* gpu_program_manager.cpp in Sources */, 6729A5A41A69213A007D5872 /* symbols_texture.cpp in Sources */, + 675D21991BFB876E00717E4F /* projection.cpp in Sources */, 6729A56D1A69213A007D5872 /* buffer_base.cpp in Sources */, 6729A5A01A69213A007D5872 /* shader.cpp in Sources */, + 6709472F1BDF9A4F005014C0 /* shader_def.cpp in Sources */, 6729A5A21A69213A007D5872 /* stipple_pen_resource.cpp in Sources */, 6729A5691A69213A007D5872 /* batcher.cpp in Sources */, + 670947251BDF9A4F005014C0 /* fribidi.cpp in Sources */, 6729A58C1A69213A007D5872 /* index_buffer_mutator.cpp in Sources */, 6729A57D1A69213A007D5872 /* glfunctions.cpp in Sources */, 6729A5731A69213A007D5872 /* data_buffer.cpp in Sources */, + 6709472B1BDF9A4F005014C0 /* hw_texture.cpp in Sources */, 6729A5AA1A69213A007D5872 /* texture.cpp in Sources */, 6729A5771A69213A007D5872 /* font_texture.cpp in Sources */, 6729A58E1A69213A007D5872 /* index_buffer.cpp in Sources */, 6729A5A61A69213A007D5872 /* texture_manager.cpp in Sources */, 6729A5821A69213A007D5872 /* glstate.cpp in Sources */, + 670947271BDF9A4F005014C0 /* glyph_manager.cpp in Sources */, 6729A56F1A69213A007D5872 /* color.cpp in Sources */, 6729A5671A69213A007D5872 /* batcher_helpers.cpp in Sources */, 6729A5B41A69213A007D5872 /* vertex_array_buffer.cpp in Sources */, @@ -500,7 +549,6 @@ 6729A5AC1A69213A007D5872 /* uniform_value.cpp in Sources */, 6729A5961A69213A007D5872 /* overlay_tree.cpp in Sources */, 6729A5651A69213A007D5872 /* attribute_provider.cpp in Sources */, - 6729A5B01A69213A007D5872 /* stb_image.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -527,6 +575,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -545,6 +594,7 @@ "$(inherited)", "$(OMIM_ROOT)/3party/glm/", "$(OMIM_ROOT)/3party/freetype/include", + "$(OMIM_ROOT)/3party/expat/lib", ); MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; @@ -586,6 +636,7 @@ "$(inherited)", "$(OMIM_ROOT)/3party/glm/", "$(OMIM_ROOT)/3party/freetype/include", + "$(OMIM_ROOT)/3party/expat/lib", ); MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; @@ -597,12 +648,15 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; + EXCLUDED_SOURCE_FILE_NAMES = ""; + "EXCLUDED_SOURCE_FILE_NAMES[sdk=macosx*]" = hw_texture_ios.mm; EXECUTABLE_PREFIX = lib; GCC_ENABLE_CPP_EXCEPTIONS = YES; GCC_ENABLE_CPP_RTTI = YES; GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; }; name = Debug; }; @@ -610,6 +664,8 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; + EXCLUDED_SOURCE_FILE_NAMES = ""; + "EXCLUDED_SOURCE_FILE_NAMES[sdk=macosx*]" = hw_texture_ios.mm; EXECUTABLE_PREFIX = lib; GCC_ENABLE_CPP_EXCEPTIONS = YES; GCC_ENABLE_CPP_RTTI = YES; @@ -617,6 +673,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; }; name = Release; }; diff --git a/xcode/drape_frontend/drape_frontend.xcodeproj/project.pbxproj b/xcode/drape_frontend/drape_frontend.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..40e4038541 --- /dev/null +++ b/xcode/drape_frontend/drape_frontend.xcodeproj/project.pbxproj @@ -0,0 +1,936 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 670947911BDF9BE1005014C0 /* intrusive_vector.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947421BDF9BE0005014C0 /* intrusive_vector.hpp */; }; + 670947921BDF9BE1005014C0 /* kinetic_scroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947431BDF9BE0005014C0 /* kinetic_scroller.cpp */; }; + 670947931BDF9BE1005014C0 /* kinetic_scroller.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947441BDF9BE0005014C0 /* kinetic_scroller.hpp */; }; + 670947941BDF9BE1005014C0 /* line_shape_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947451BDF9BE0005014C0 /* line_shape_helper.cpp */; }; + 670947951BDF9BE1005014C0 /* line_shape_helper.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947461BDF9BE0005014C0 /* line_shape_helper.hpp */; }; + 670947961BDF9BE1005014C0 /* line_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947471BDF9BE0005014C0 /* line_shape.cpp */; }; + 670947971BDF9BE1005014C0 /* line_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947481BDF9BE0005014C0 /* line_shape.hpp */; }; + 670947981BDF9BE1005014C0 /* map_data_provider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947491BDF9BE0005014C0 /* map_data_provider.cpp */; }; + 670947991BDF9BE1005014C0 /* map_data_provider.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709474A1BDF9BE0005014C0 /* map_data_provider.hpp */; }; + 6709479A1BDF9BE1005014C0 /* map_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709474B1BDF9BE0005014C0 /* map_shape.hpp */; }; + 6709479B1BDF9BE1005014C0 /* memory_feature_index.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709474C1BDF9BE0005014C0 /* memory_feature_index.cpp */; }; + 6709479C1BDF9BE1005014C0 /* memory_feature_index.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709474D1BDF9BE0005014C0 /* memory_feature_index.hpp */; }; + 6709479D1BDF9BE1005014C0 /* message_acceptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709474E1BDF9BE0005014C0 /* message_acceptor.cpp */; }; + 6709479E1BDF9BE1005014C0 /* message_acceptor.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709474F1BDF9BE0005014C0 /* message_acceptor.hpp */; }; + 6709479F1BDF9BE1005014C0 /* message_queue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947501BDF9BE0005014C0 /* message_queue.cpp */; }; + 670947A01BDF9BE1005014C0 /* message_queue.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947511BDF9BE0005014C0 /* message_queue.hpp */; }; + 670947A11BDF9BE1005014C0 /* message_subclasses.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947521BDF9BE0005014C0 /* message_subclasses.hpp */; }; + 670947A21BDF9BE1005014C0 /* message.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947531BDF9BE0005014C0 /* message.hpp */; }; + 670947A41BDF9BE1005014C0 /* my_position_controller.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947551BDF9BE0005014C0 /* my_position_controller.hpp */; }; + 670947A51BDF9BE1005014C0 /* my_position.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947561BDF9BE0005014C0 /* my_position.cpp */; }; + 670947A61BDF9BE1005014C0 /* my_position.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947571BDF9BE0005014C0 /* my_position.hpp */; }; + 670947A71BDF9BE1005014C0 /* navigator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947581BDF9BE0005014C0 /* navigator.cpp */; }; + 670947A81BDF9BE1005014C0 /* navigator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947591BDF9BE0005014C0 /* navigator.hpp */; }; + 670947A91BDF9BE1005014C0 /* path_symbol_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709475A1BDF9BE0005014C0 /* path_symbol_shape.cpp */; }; + 670947AA1BDF9BE1005014C0 /* path_symbol_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709475B1BDF9BE0005014C0 /* path_symbol_shape.hpp */; }; + 670947AB1BDF9BE1005014C0 /* path_text_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709475C1BDF9BE0005014C0 /* path_text_shape.cpp */; }; + 670947AC1BDF9BE1005014C0 /* path_text_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709475D1BDF9BE0005014C0 /* path_text_shape.hpp */; }; + 670947AD1BDF9BE1005014C0 /* poi_symbol_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709475E1BDF9BE0005014C0 /* poi_symbol_shape.cpp */; }; + 670947AE1BDF9BE1005014C0 /* poi_symbol_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709475F1BDF9BE0005014C0 /* poi_symbol_shape.hpp */; }; + 670947AF1BDF9BE1005014C0 /* read_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947601BDF9BE0005014C0 /* read_manager.cpp */; }; + 670947B01BDF9BE1005014C0 /* read_manager.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947611BDF9BE0005014C0 /* read_manager.hpp */; }; + 670947B11BDF9BE1005014C0 /* read_mwm_task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947621BDF9BE0005014C0 /* read_mwm_task.cpp */; }; + 670947B21BDF9BE1005014C0 /* read_mwm_task.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947631BDF9BE0005014C0 /* read_mwm_task.hpp */; }; + 670947B31BDF9BE1005014C0 /* render_group.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947641BDF9BE0005014C0 /* render_group.cpp */; }; + 670947B41BDF9BE1005014C0 /* render_group.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947651BDF9BE0005014C0 /* render_group.hpp */; }; + 670947B51BDF9BE1005014C0 /* render_node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947661BDF9BE0005014C0 /* render_node.cpp */; }; + 670947B61BDF9BE1005014C0 /* render_node.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947671BDF9BE0005014C0 /* render_node.hpp */; }; + 670947B71BDF9BE1005014C0 /* route_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947681BDF9BE0005014C0 /* route_builder.cpp */; }; + 670947B81BDF9BE1005014C0 /* route_builder.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947691BDF9BE0005014C0 /* route_builder.hpp */; }; + 670947B91BDF9BE1005014C0 /* route_renderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709476A1BDF9BE0005014C0 /* route_renderer.cpp */; }; + 670947BA1BDF9BE1005014C0 /* route_renderer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709476B1BDF9BE0005014C0 /* route_renderer.hpp */; }; + 670947BB1BDF9BE1005014C0 /* route_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709476C1BDF9BE0005014C0 /* route_shape.cpp */; }; + 670947BC1BDF9BE1005014C0 /* route_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709476D1BDF9BE0005014C0 /* route_shape.hpp */; }; + 670947BD1BDF9BE1005014C0 /* rule_drawer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709476E1BDF9BE0005014C0 /* rule_drawer.cpp */; }; + 670947BE1BDF9BE1005014C0 /* rule_drawer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709476F1BDF9BE0005014C0 /* rule_drawer.hpp */; }; + 670947C01BDF9BE1005014C0 /* selection_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947711BDF9BE0005014C0 /* selection_shape.hpp */; }; + 670947C11BDF9BE1005014C0 /* shape_view_params.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947721BDF9BE0005014C0 /* shape_view_params.hpp */; }; + 670947C21BDF9BE1005014C0 /* stylist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947731BDF9BE0005014C0 /* stylist.cpp */; }; + 670947C31BDF9BE1005014C0 /* stylist.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947741BDF9BE0005014C0 /* stylist.hpp */; }; + 670947C41BDF9BE1005014C0 /* text_handle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947751BDF9BE0005014C0 /* text_handle.cpp */; }; + 670947C51BDF9BE1005014C0 /* text_handle.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947761BDF9BE0005014C0 /* text_handle.hpp */; }; + 670947C61BDF9BE1005014C0 /* text_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947771BDF9BE0005014C0 /* text_layout.cpp */; }; + 670947C71BDF9BE1005014C0 /* text_layout.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947781BDF9BE0005014C0 /* text_layout.hpp */; }; + 670947C81BDF9BE1005014C0 /* text_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947791BDF9BE0005014C0 /* text_shape.cpp */; }; + 670947C91BDF9BE1005014C0 /* text_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709477A1BDF9BE0005014C0 /* text_shape.hpp */; }; + 670947CA1BDF9BE1005014C0 /* threads_commutator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709477B1BDF9BE0005014C0 /* threads_commutator.cpp */; }; + 670947CB1BDF9BE1005014C0 /* threads_commutator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709477C1BDF9BE0005014C0 /* threads_commutator.hpp */; }; + 670947CC1BDF9BE1005014C0 /* tile_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709477D1BDF9BE0005014C0 /* tile_info.cpp */; }; + 670947CD1BDF9BE1005014C0 /* tile_info.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709477E1BDF9BE0005014C0 /* tile_info.hpp */; }; + 670947CE1BDF9BE1005014C0 /* tile_key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709477F1BDF9BE0005014C0 /* tile_key.cpp */; }; + 670947CF1BDF9BE1005014C0 /* tile_key.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947801BDF9BE0005014C0 /* tile_key.hpp */; }; + 670947D01BDF9BE1005014C0 /* tile_tree_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947811BDF9BE0005014C0 /* tile_tree_builder.cpp */; }; + 670947D11BDF9BE1005014C0 /* tile_tree_builder.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947821BDF9BE0005014C0 /* tile_tree_builder.hpp */; }; + 670947D21BDF9BE1005014C0 /* tile_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947831BDF9BE0005014C0 /* tile_tree.cpp */; }; + 670947D31BDF9BE1005014C0 /* tile_tree.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947841BDF9BE0005014C0 /* tile_tree.hpp */; }; + 670947D41BDF9BE1005014C0 /* tile_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947851BDF9BE0005014C0 /* tile_utils.cpp */; }; + 670947D51BDF9BE1005014C0 /* tile_utils.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947861BDF9BE0005014C0 /* tile_utils.hpp */; }; + 670947D61BDF9BE1005014C0 /* user_event_stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947871BDF9BE0005014C0 /* user_event_stream.cpp */; }; + 670947D71BDF9BE1005014C0 /* user_event_stream.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947881BDF9BE0005014C0 /* user_event_stream.hpp */; }; + 670947D81BDF9BE1005014C0 /* user_mark_shapes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947891BDF9BE0005014C0 /* user_mark_shapes.cpp */; }; + 670947D91BDF9BE1005014C0 /* user_mark_shapes.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709478A1BDF9BE0005014C0 /* user_mark_shapes.hpp */; }; + 670947DC1BDF9BE1005014C0 /* viewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709478D1BDF9BE0005014C0 /* viewport.cpp */; }; + 670947DD1BDF9BE1005014C0 /* viewport.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709478E1BDF9BE1005014C0 /* viewport.hpp */; }; + 670947DF1BDF9BE1005014C0 /* visual_params.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947901BDF9BE1005014C0 /* visual_params.hpp */; }; + 670947E41BDF9BEC005014C0 /* engine_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947E01BDF9BEC005014C0 /* engine_context.cpp */; }; + 670947E51BDF9BEC005014C0 /* engine_context.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947E11BDF9BEC005014C0 /* engine_context.hpp */; }; + 670947E61BDF9BEC005014C0 /* frontend_renderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947E21BDF9BEC005014C0 /* frontend_renderer.cpp */; }; + 670947E71BDF9BEC005014C0 /* frontend_renderer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947E31BDF9BEC005014C0 /* frontend_renderer.hpp */; }; + 670947F61BDF9BF5005014C0 /* apply_feature_functors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947E81BDF9BF5005014C0 /* apply_feature_functors.cpp */; }; + 670947F71BDF9BF5005014C0 /* apply_feature_functors.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947E91BDF9BF5005014C0 /* apply_feature_functors.hpp */; }; + 670947F91BDF9BF5005014C0 /* area_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947EB1BDF9BF5005014C0 /* area_shape.hpp */; }; + 670947FA1BDF9BF5005014C0 /* backend_renderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947EC1BDF9BF5005014C0 /* backend_renderer.cpp */; }; + 670947FB1BDF9BF5005014C0 /* backend_renderer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947ED1BDF9BF5005014C0 /* backend_renderer.hpp */; }; + 670947FD1BDF9BF5005014C0 /* base_renderer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947EF1BDF9BF5005014C0 /* base_renderer.hpp */; }; + 670947FE1BDF9BF5005014C0 /* batchers_pool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947F01BDF9BF5005014C0 /* batchers_pool.cpp */; }; + 670947FF1BDF9BF5005014C0 /* batchers_pool.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947F11BDF9BF5005014C0 /* batchers_pool.hpp */; }; + 670948011BDF9BF5005014C0 /* circle_shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947F31BDF9BF5005014C0 /* circle_shape.hpp */; }; + 670948021BDF9BF5005014C0 /* drape_engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947F41BDF9BF5005014C0 /* drape_engine.cpp */; }; + 670948031BDF9BF5005014C0 /* drape_engine.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670947F51BDF9BF5005014C0 /* drape_engine.hpp */; }; + 670948141BDF9C39005014C0 /* base_interpolator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948071BDF9C39005014C0 /* base_interpolator.cpp */; }; + 670948151BDF9C39005014C0 /* base_interpolator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948081BDF9C39005014C0 /* base_interpolator.hpp */; }; + 670948161BDF9C39005014C0 /* interpolation_holder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948091BDF9C39005014C0 /* interpolation_holder.cpp */; }; + 670948171BDF9C39005014C0 /* interpolation_holder.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709480A1BDF9C39005014C0 /* interpolation_holder.hpp */; }; + 670948181BDF9C39005014C0 /* interpolations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709480B1BDF9C39005014C0 /* interpolations.cpp */; }; + 670948191BDF9C39005014C0 /* interpolations.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709480C1BDF9C39005014C0 /* interpolations.hpp */; }; + 6709481A1BDF9C39005014C0 /* model_view_animation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709480D1BDF9C39005014C0 /* model_view_animation.cpp */; }; + 6709481B1BDF9C39005014C0 /* model_view_animation.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709480E1BDF9C39005014C0 /* model_view_animation.hpp */; }; + 6709481C1BDF9C39005014C0 /* opacity_animation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709480F1BDF9C39005014C0 /* opacity_animation.cpp */; }; + 6709481D1BDF9C39005014C0 /* opacity_animation.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948101BDF9C39005014C0 /* opacity_animation.hpp */; }; + 6709481E1BDF9C39005014C0 /* show_hide_animation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948111BDF9C39005014C0 /* show_hide_animation.cpp */; }; + 6709481F1BDF9C39005014C0 /* show_hide_animation.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948121BDF9C39005014C0 /* show_hide_animation.hpp */; }; + 670948201BDF9C39005014C0 /* value_mapping.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948131BDF9C39005014C0 /* value_mapping.hpp */; }; + 670948391BDF9C48005014C0 /* button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948211BDF9C48005014C0 /* button.cpp */; }; + 6709483A1BDF9C48005014C0 /* button.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948221BDF9C48005014C0 /* button.hpp */; }; + 6709483B1BDF9C48005014C0 /* compass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948231BDF9C48005014C0 /* compass.cpp */; }; + 6709483C1BDF9C48005014C0 /* compass.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948241BDF9C48005014C0 /* compass.hpp */; }; + 6709483D1BDF9C48005014C0 /* copyright_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948251BDF9C48005014C0 /* copyright_label.cpp */; }; + 6709483E1BDF9C48005014C0 /* copyright_label.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948261BDF9C48005014C0 /* copyright_label.hpp */; }; + 6709483F1BDF9C48005014C0 /* country_status_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948271BDF9C48005014C0 /* country_status_helper.cpp */; }; + 670948401BDF9C48005014C0 /* country_status_helper.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948281BDF9C48005014C0 /* country_status_helper.hpp */; }; + 670948411BDF9C48005014C0 /* country_status.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948291BDF9C48005014C0 /* country_status.cpp */; }; + 670948421BDF9C48005014C0 /* country_status.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709482A1BDF9C48005014C0 /* country_status.hpp */; }; + 670948431BDF9C48005014C0 /* drape_gui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709482B1BDF9C48005014C0 /* drape_gui.cpp */; }; + 670948441BDF9C48005014C0 /* drape_gui.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709482C1BDF9C48005014C0 /* drape_gui.hpp */; }; + 670948451BDF9C48005014C0 /* gui_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709482D1BDF9C48005014C0 /* gui_text.cpp */; }; + 670948461BDF9C48005014C0 /* gui_text.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709482E1BDF9C48005014C0 /* gui_text.hpp */; }; + 670948471BDF9C48005014C0 /* layer_render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709482F1BDF9C48005014C0 /* layer_render.cpp */; }; + 670948481BDF9C48005014C0 /* layer_render.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948301BDF9C48005014C0 /* layer_render.hpp */; }; + 670948491BDF9C48005014C0 /* ruler_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948311BDF9C48005014C0 /* ruler_helper.cpp */; }; + 6709484A1BDF9C48005014C0 /* ruler_helper.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948321BDF9C48005014C0 /* ruler_helper.hpp */; }; + 6709484C1BDF9C48005014C0 /* ruler.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948341BDF9C48005014C0 /* ruler.hpp */; }; + 6709484D1BDF9C48005014C0 /* shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948351BDF9C48005014C0 /* shape.cpp */; }; + 6709484E1BDF9C48005014C0 /* shape.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948361BDF9C48005014C0 /* shape.hpp */; }; + 6709484F1BDF9C48005014C0 /* skin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948371BDF9C48005014C0 /* skin.cpp */; }; + 670948501BDF9C48005014C0 /* skin.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948381BDF9C48005014C0 /* skin.hpp */; }; + 670948681BDF9C7F005014C0 /* agg_curves.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948521BDF9C7F005014C0 /* agg_curves.cpp */; }; + 670948691BDF9C7F005014C0 /* area_info.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948531BDF9C7F005014C0 /* area_info.hpp */; }; + 6709486A1BDF9C7F005014C0 /* brush_info.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948541BDF9C7F005014C0 /* brush_info.hpp */; }; + 6709486B1BDF9C7F005014C0 /* circle_info.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948551BDF9C7F005014C0 /* circle_info.hpp */; }; + 6709486C1BDF9C7F005014C0 /* cpu_drawer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948561BDF9C7F005014C0 /* cpu_drawer.cpp */; }; + 6709486D1BDF9C7F005014C0 /* cpu_drawer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948571BDF9C7F005014C0 /* cpu_drawer.hpp */; }; + 6709486E1BDF9C7F005014C0 /* default_font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948581BDF9C7F005014C0 /* default_font.cpp */; }; + 670948701BDF9C7F005014C0 /* feature_processor.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709485A1BDF9C7F005014C0 /* feature_processor.hpp */; }; + 670948711BDF9C7F005014C0 /* feature_styler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709485B1BDF9C7F005014C0 /* feature_styler.cpp */; }; + 670948721BDF9C7F005014C0 /* feature_styler.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709485C1BDF9C7F005014C0 /* feature_styler.hpp */; }; + 670948731BDF9C7F005014C0 /* frame_image.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709485D1BDF9C7F005014C0 /* frame_image.hpp */; }; + 670948741BDF9C7F005014C0 /* geometry_processors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709485E1BDF9C7F005014C0 /* geometry_processors.cpp */; }; + 670948751BDF9C7F005014C0 /* geometry_processors.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6709485F1BDF9C7F005014C0 /* geometry_processors.hpp */; }; + 670948771BDF9C7F005014C0 /* glyph_cache_impl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948611BDF9C7F005014C0 /* glyph_cache_impl.hpp */; }; + 670948781BDF9C7F005014C0 /* glyph_cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948621BDF9C7F005014C0 /* glyph_cache.cpp */; }; + 670948791BDF9C7F005014C0 /* glyph_cache.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948631BDF9C7F005014C0 /* glyph_cache.hpp */; }; + 6709487A1BDF9C7F005014C0 /* icon_info.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948641BDF9C7F005014C0 /* icon_info.hpp */; }; + 6709487B1BDF9C7F005014C0 /* path_info.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948651BDF9C7F005014C0 /* path_info.hpp */; }; + 6709487C1BDF9C7F005014C0 /* pen_info.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670948661BDF9C7F005014C0 /* pen_info.hpp */; }; + 6709487D1BDF9C7F005014C0 /* point.h in Headers */ = {isa = PBXBuildFile; fileRef = 670948671BDF9C7F005014C0 /* point.h */; }; + 675D21661BFB785900717E4F /* ruler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948331BDF9C48005014C0 /* ruler.cpp */; }; + 675D218C1BFB871D00717E4F /* proto_to_styles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675D21851BFB871D00717E4F /* proto_to_styles.cpp */; }; + 675D218D1BFB871D00717E4F /* proto_to_styles.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675D21861BFB871D00717E4F /* proto_to_styles.hpp */; }; + 675D218E1BFB871D00717E4F /* rect.h in Headers */ = {isa = PBXBuildFile; fileRef = 675D21871BFB871D00717E4F /* rect.h */; }; + 675D218F1BFB871D00717E4F /* software_renderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675D21881BFB871D00717E4F /* software_renderer.cpp */; }; + 675D21901BFB871D00717E4F /* software_renderer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675D21891BFB871D00717E4F /* software_renderer.hpp */; }; + 675D21911BFB871D00717E4F /* text_engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675D218A1BFB871D00717E4F /* text_engine.cpp */; }; + 675D21921BFB871D00717E4F /* text_engine.h in Headers */ = {isa = PBXBuildFile; fileRef = 675D218B1BFB871D00717E4F /* text_engine.h */; }; + 67E91C751BDFC85E005CEE88 /* feature_processor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948591BDF9C7F005014C0 /* feature_processor.cpp */; }; + 67E91C761BDFC85E005CEE88 /* glyph_cache_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670948601BDF9C7F005014C0 /* glyph_cache_impl.cpp */; }; + 67E91C781BDFC85E005CEE88 /* area_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947EA1BDF9BF5005014C0 /* area_shape.cpp */; }; + 67E91C791BDFC85E005CEE88 /* base_renderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947EE1BDF9BF5005014C0 /* base_renderer.cpp */; }; + 67E91C7A1BDFC85E005CEE88 /* circle_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947F21BDF9BF5005014C0 /* circle_shape.cpp */; }; + 67E91C7B1BDFC85E005CEE88 /* my_position_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947541BDF9BE0005014C0 /* my_position_controller.cpp */; }; + 67E91C7C1BDFC85E005CEE88 /* selection_shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670947701BDF9BE0005014C0 /* selection_shape.cpp */; }; + 67E91C7D1BDFC85E005CEE88 /* user_marks_provider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709478B1BDF9BE0005014C0 /* user_marks_provider.cpp */; }; + 67E91C7E1BDFC85E005CEE88 /* visual_params.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6709478F1BDF9BE1005014C0 /* visual_params.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 6709473A1BDF9B82005014C0 /* libdrape_frontend.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libdrape_frontend.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 670947421BDF9BE0005014C0 /* intrusive_vector.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = intrusive_vector.hpp; sourceTree = ""; }; + 670947431BDF9BE0005014C0 /* kinetic_scroller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kinetic_scroller.cpp; sourceTree = ""; }; + 670947441BDF9BE0005014C0 /* kinetic_scroller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = kinetic_scroller.hpp; sourceTree = ""; }; + 670947451BDF9BE0005014C0 /* line_shape_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = line_shape_helper.cpp; sourceTree = ""; }; + 670947461BDF9BE0005014C0 /* line_shape_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = line_shape_helper.hpp; sourceTree = ""; }; + 670947471BDF9BE0005014C0 /* line_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = line_shape.cpp; sourceTree = ""; }; + 670947481BDF9BE0005014C0 /* line_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = line_shape.hpp; sourceTree = ""; }; + 670947491BDF9BE0005014C0 /* map_data_provider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_data_provider.cpp; sourceTree = ""; }; + 6709474A1BDF9BE0005014C0 /* map_data_provider.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = map_data_provider.hpp; sourceTree = ""; }; + 6709474B1BDF9BE0005014C0 /* map_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = map_shape.hpp; sourceTree = ""; }; + 6709474C1BDF9BE0005014C0 /* memory_feature_index.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory_feature_index.cpp; sourceTree = ""; }; + 6709474D1BDF9BE0005014C0 /* memory_feature_index.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory_feature_index.hpp; sourceTree = ""; }; + 6709474E1BDF9BE0005014C0 /* message_acceptor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = message_acceptor.cpp; sourceTree = ""; }; + 6709474F1BDF9BE0005014C0 /* message_acceptor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = message_acceptor.hpp; sourceTree = ""; }; + 670947501BDF9BE0005014C0 /* message_queue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = message_queue.cpp; sourceTree = ""; }; + 670947511BDF9BE0005014C0 /* message_queue.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = message_queue.hpp; sourceTree = ""; }; + 670947521BDF9BE0005014C0 /* message_subclasses.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = message_subclasses.hpp; sourceTree = ""; }; + 670947531BDF9BE0005014C0 /* message.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = message.hpp; sourceTree = ""; }; + 670947541BDF9BE0005014C0 /* my_position_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = my_position_controller.cpp; sourceTree = ""; }; + 670947551BDF9BE0005014C0 /* my_position_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = my_position_controller.hpp; sourceTree = ""; }; + 670947561BDF9BE0005014C0 /* my_position.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = my_position.cpp; sourceTree = ""; }; + 670947571BDF9BE0005014C0 /* my_position.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = my_position.hpp; sourceTree = ""; }; + 670947581BDF9BE0005014C0 /* navigator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = navigator.cpp; sourceTree = ""; }; + 670947591BDF9BE0005014C0 /* navigator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = navigator.hpp; sourceTree = ""; }; + 6709475A1BDF9BE0005014C0 /* path_symbol_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = path_symbol_shape.cpp; sourceTree = ""; }; + 6709475B1BDF9BE0005014C0 /* path_symbol_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_symbol_shape.hpp; sourceTree = ""; }; + 6709475C1BDF9BE0005014C0 /* path_text_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = path_text_shape.cpp; sourceTree = ""; }; + 6709475D1BDF9BE0005014C0 /* path_text_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_text_shape.hpp; sourceTree = ""; }; + 6709475E1BDF9BE0005014C0 /* poi_symbol_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = poi_symbol_shape.cpp; sourceTree = ""; }; + 6709475F1BDF9BE0005014C0 /* poi_symbol_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = poi_symbol_shape.hpp; sourceTree = ""; }; + 670947601BDF9BE0005014C0 /* read_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = read_manager.cpp; sourceTree = ""; }; + 670947611BDF9BE0005014C0 /* read_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = read_manager.hpp; sourceTree = ""; }; + 670947621BDF9BE0005014C0 /* read_mwm_task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = read_mwm_task.cpp; sourceTree = ""; }; + 670947631BDF9BE0005014C0 /* read_mwm_task.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = read_mwm_task.hpp; sourceTree = ""; }; + 670947641BDF9BE0005014C0 /* render_group.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_group.cpp; sourceTree = ""; }; + 670947651BDF9BE0005014C0 /* render_group.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = render_group.hpp; sourceTree = ""; }; + 670947661BDF9BE0005014C0 /* render_node.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_node.cpp; sourceTree = ""; }; + 670947671BDF9BE0005014C0 /* render_node.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = render_node.hpp; sourceTree = ""; }; + 670947681BDF9BE0005014C0 /* route_builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = route_builder.cpp; sourceTree = ""; }; + 670947691BDF9BE0005014C0 /* route_builder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = route_builder.hpp; sourceTree = ""; }; + 6709476A1BDF9BE0005014C0 /* route_renderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = route_renderer.cpp; sourceTree = ""; }; + 6709476B1BDF9BE0005014C0 /* route_renderer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = route_renderer.hpp; sourceTree = ""; }; + 6709476C1BDF9BE0005014C0 /* route_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = route_shape.cpp; sourceTree = ""; }; + 6709476D1BDF9BE0005014C0 /* route_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = route_shape.hpp; sourceTree = ""; }; + 6709476E1BDF9BE0005014C0 /* rule_drawer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rule_drawer.cpp; sourceTree = ""; }; + 6709476F1BDF9BE0005014C0 /* rule_drawer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rule_drawer.hpp; sourceTree = ""; }; + 670947701BDF9BE0005014C0 /* selection_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = selection_shape.cpp; sourceTree = ""; }; + 670947711BDF9BE0005014C0 /* selection_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = selection_shape.hpp; sourceTree = ""; }; + 670947721BDF9BE0005014C0 /* shape_view_params.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape_view_params.hpp; sourceTree = ""; }; + 670947731BDF9BE0005014C0 /* stylist.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stylist.cpp; sourceTree = ""; }; + 670947741BDF9BE0005014C0 /* stylist.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stylist.hpp; sourceTree = ""; }; + 670947751BDF9BE0005014C0 /* text_handle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text_handle.cpp; sourceTree = ""; }; + 670947761BDF9BE0005014C0 /* text_handle.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = text_handle.hpp; sourceTree = ""; }; + 670947771BDF9BE0005014C0 /* text_layout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text_layout.cpp; sourceTree = ""; }; + 670947781BDF9BE0005014C0 /* text_layout.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = text_layout.hpp; sourceTree = ""; }; + 670947791BDF9BE0005014C0 /* text_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text_shape.cpp; sourceTree = ""; }; + 6709477A1BDF9BE0005014C0 /* text_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = text_shape.hpp; sourceTree = ""; }; + 6709477B1BDF9BE0005014C0 /* threads_commutator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = threads_commutator.cpp; sourceTree = ""; }; + 6709477C1BDF9BE0005014C0 /* threads_commutator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = threads_commutator.hpp; sourceTree = ""; }; + 6709477D1BDF9BE0005014C0 /* tile_info.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tile_info.cpp; sourceTree = ""; }; + 6709477E1BDF9BE0005014C0 /* tile_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tile_info.hpp; sourceTree = ""; }; + 6709477F1BDF9BE0005014C0 /* tile_key.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tile_key.cpp; sourceTree = ""; }; + 670947801BDF9BE0005014C0 /* tile_key.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tile_key.hpp; sourceTree = ""; }; + 670947811BDF9BE0005014C0 /* tile_tree_builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tile_tree_builder.cpp; sourceTree = ""; }; + 670947821BDF9BE0005014C0 /* tile_tree_builder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tile_tree_builder.hpp; sourceTree = ""; }; + 670947831BDF9BE0005014C0 /* tile_tree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tile_tree.cpp; sourceTree = ""; }; + 670947841BDF9BE0005014C0 /* tile_tree.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tile_tree.hpp; sourceTree = ""; }; + 670947851BDF9BE0005014C0 /* tile_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tile_utils.cpp; sourceTree = ""; }; + 670947861BDF9BE0005014C0 /* tile_utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tile_utils.hpp; sourceTree = ""; }; + 670947871BDF9BE0005014C0 /* user_event_stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = user_event_stream.cpp; sourceTree = ""; }; + 670947881BDF9BE0005014C0 /* user_event_stream.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = user_event_stream.hpp; sourceTree = ""; }; + 670947891BDF9BE0005014C0 /* user_mark_shapes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = user_mark_shapes.cpp; sourceTree = ""; }; + 6709478A1BDF9BE0005014C0 /* user_mark_shapes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = user_mark_shapes.hpp; sourceTree = ""; }; + 6709478B1BDF9BE0005014C0 /* user_marks_provider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = user_marks_provider.cpp; sourceTree = ""; }; + 6709478C1BDF9BE0005014C0 /* user_marks_provider.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = user_marks_provider.hpp; sourceTree = ""; }; + 6709478D1BDF9BE0005014C0 /* viewport.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = viewport.cpp; sourceTree = ""; }; + 6709478E1BDF9BE1005014C0 /* viewport.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = viewport.hpp; sourceTree = ""; }; + 6709478F1BDF9BE1005014C0 /* visual_params.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = visual_params.cpp; sourceTree = ""; }; + 670947901BDF9BE1005014C0 /* visual_params.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = visual_params.hpp; sourceTree = ""; }; + 670947E01BDF9BEC005014C0 /* engine_context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = engine_context.cpp; sourceTree = ""; }; + 670947E11BDF9BEC005014C0 /* engine_context.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = engine_context.hpp; sourceTree = ""; }; + 670947E21BDF9BEC005014C0 /* frontend_renderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = frontend_renderer.cpp; sourceTree = ""; }; + 670947E31BDF9BEC005014C0 /* frontend_renderer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = frontend_renderer.hpp; sourceTree = ""; }; + 670947E81BDF9BF5005014C0 /* apply_feature_functors.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = apply_feature_functors.cpp; sourceTree = ""; }; + 670947E91BDF9BF5005014C0 /* apply_feature_functors.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = apply_feature_functors.hpp; sourceTree = ""; }; + 670947EA1BDF9BF5005014C0 /* area_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = area_shape.cpp; sourceTree = ""; }; + 670947EB1BDF9BF5005014C0 /* area_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = area_shape.hpp; sourceTree = ""; }; + 670947EC1BDF9BF5005014C0 /* backend_renderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = backend_renderer.cpp; sourceTree = ""; }; + 670947ED1BDF9BF5005014C0 /* backend_renderer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = backend_renderer.hpp; sourceTree = ""; }; + 670947EE1BDF9BF5005014C0 /* base_renderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = base_renderer.cpp; sourceTree = ""; }; + 670947EF1BDF9BF5005014C0 /* base_renderer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = base_renderer.hpp; sourceTree = ""; }; + 670947F01BDF9BF5005014C0 /* batchers_pool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = batchers_pool.cpp; sourceTree = ""; }; + 670947F11BDF9BF5005014C0 /* batchers_pool.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = batchers_pool.hpp; sourceTree = ""; }; + 670947F21BDF9BF5005014C0 /* circle_shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = circle_shape.cpp; sourceTree = ""; }; + 670947F31BDF9BF5005014C0 /* circle_shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = circle_shape.hpp; sourceTree = ""; }; + 670947F41BDF9BF5005014C0 /* drape_engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = drape_engine.cpp; sourceTree = ""; }; + 670947F51BDF9BF5005014C0 /* drape_engine.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = drape_engine.hpp; sourceTree = ""; }; + 670948071BDF9C39005014C0 /* base_interpolator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = base_interpolator.cpp; sourceTree = ""; }; + 670948081BDF9C39005014C0 /* base_interpolator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = base_interpolator.hpp; sourceTree = ""; }; + 670948091BDF9C39005014C0 /* interpolation_holder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interpolation_holder.cpp; sourceTree = ""; }; + 6709480A1BDF9C39005014C0 /* interpolation_holder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = interpolation_holder.hpp; sourceTree = ""; }; + 6709480B1BDF9C39005014C0 /* interpolations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interpolations.cpp; sourceTree = ""; }; + 6709480C1BDF9C39005014C0 /* interpolations.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = interpolations.hpp; sourceTree = ""; }; + 6709480D1BDF9C39005014C0 /* model_view_animation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = model_view_animation.cpp; sourceTree = ""; }; + 6709480E1BDF9C39005014C0 /* model_view_animation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = model_view_animation.hpp; sourceTree = ""; }; + 6709480F1BDF9C39005014C0 /* opacity_animation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opacity_animation.cpp; sourceTree = ""; }; + 670948101BDF9C39005014C0 /* opacity_animation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = opacity_animation.hpp; sourceTree = ""; }; + 670948111BDF9C39005014C0 /* show_hide_animation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = show_hide_animation.cpp; sourceTree = ""; }; + 670948121BDF9C39005014C0 /* show_hide_animation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = show_hide_animation.hpp; sourceTree = ""; }; + 670948131BDF9C39005014C0 /* value_mapping.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = value_mapping.hpp; sourceTree = ""; }; + 670948211BDF9C48005014C0 /* button.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = button.cpp; sourceTree = ""; }; + 670948221BDF9C48005014C0 /* button.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = button.hpp; sourceTree = ""; }; + 670948231BDF9C48005014C0 /* compass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compass.cpp; sourceTree = ""; }; + 670948241BDF9C48005014C0 /* compass.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = compass.hpp; sourceTree = ""; }; + 670948251BDF9C48005014C0 /* copyright_label.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = copyright_label.cpp; sourceTree = ""; }; + 670948261BDF9C48005014C0 /* copyright_label.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = copyright_label.hpp; sourceTree = ""; }; + 670948271BDF9C48005014C0 /* country_status_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = country_status_helper.cpp; sourceTree = ""; }; + 670948281BDF9C48005014C0 /* country_status_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = country_status_helper.hpp; sourceTree = ""; }; + 670948291BDF9C48005014C0 /* country_status.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = country_status.cpp; sourceTree = ""; }; + 6709482A1BDF9C48005014C0 /* country_status.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = country_status.hpp; sourceTree = ""; }; + 6709482B1BDF9C48005014C0 /* drape_gui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = drape_gui.cpp; sourceTree = ""; }; + 6709482C1BDF9C48005014C0 /* drape_gui.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = drape_gui.hpp; sourceTree = ""; }; + 6709482D1BDF9C48005014C0 /* gui_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gui_text.cpp; sourceTree = ""; }; + 6709482E1BDF9C48005014C0 /* gui_text.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gui_text.hpp; sourceTree = ""; }; + 6709482F1BDF9C48005014C0 /* layer_render.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = layer_render.cpp; sourceTree = ""; }; + 670948301BDF9C48005014C0 /* layer_render.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = layer_render.hpp; sourceTree = ""; }; + 670948311BDF9C48005014C0 /* ruler_helper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruler_helper.cpp; sourceTree = ""; }; + 670948321BDF9C48005014C0 /* ruler_helper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ruler_helper.hpp; sourceTree = ""; }; + 670948331BDF9C48005014C0 /* ruler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruler.cpp; sourceTree = ""; }; + 670948341BDF9C48005014C0 /* ruler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ruler.hpp; sourceTree = ""; }; + 670948351BDF9C48005014C0 /* shape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shape.cpp; sourceTree = ""; }; + 670948361BDF9C48005014C0 /* shape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = shape.hpp; sourceTree = ""; }; + 670948371BDF9C48005014C0 /* skin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = skin.cpp; sourceTree = ""; }; + 670948381BDF9C48005014C0 /* skin.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = skin.hpp; sourceTree = ""; }; + 670948521BDF9C7F005014C0 /* agg_curves.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agg_curves.cpp; sourceTree = ""; }; + 670948531BDF9C7F005014C0 /* area_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = area_info.hpp; sourceTree = ""; }; + 670948541BDF9C7F005014C0 /* brush_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = brush_info.hpp; sourceTree = ""; }; + 670948551BDF9C7F005014C0 /* circle_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = circle_info.hpp; sourceTree = ""; }; + 670948561BDF9C7F005014C0 /* cpu_drawer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu_drawer.cpp; sourceTree = ""; }; + 670948571BDF9C7F005014C0 /* cpu_drawer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cpu_drawer.hpp; sourceTree = ""; }; + 670948581BDF9C7F005014C0 /* default_font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = default_font.cpp; sourceTree = ""; }; + 670948591BDF9C7F005014C0 /* feature_processor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = feature_processor.cpp; sourceTree = ""; }; + 6709485A1BDF9C7F005014C0 /* feature_processor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = feature_processor.hpp; sourceTree = ""; }; + 6709485B1BDF9C7F005014C0 /* feature_styler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = feature_styler.cpp; sourceTree = ""; }; + 6709485C1BDF9C7F005014C0 /* feature_styler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = feature_styler.hpp; sourceTree = ""; }; + 6709485D1BDF9C7F005014C0 /* frame_image.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = frame_image.hpp; sourceTree = ""; }; + 6709485E1BDF9C7F005014C0 /* geometry_processors.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = geometry_processors.cpp; sourceTree = ""; }; + 6709485F1BDF9C7F005014C0 /* geometry_processors.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = geometry_processors.hpp; sourceTree = ""; }; + 670948601BDF9C7F005014C0 /* glyph_cache_impl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glyph_cache_impl.cpp; sourceTree = ""; }; + 670948611BDF9C7F005014C0 /* glyph_cache_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = glyph_cache_impl.hpp; sourceTree = ""; }; + 670948621BDF9C7F005014C0 /* glyph_cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glyph_cache.cpp; sourceTree = ""; }; + 670948631BDF9C7F005014C0 /* glyph_cache.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = glyph_cache.hpp; sourceTree = ""; }; + 670948641BDF9C7F005014C0 /* icon_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = icon_info.hpp; sourceTree = ""; }; + 670948651BDF9C7F005014C0 /* path_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = path_info.hpp; sourceTree = ""; }; + 670948661BDF9C7F005014C0 /* pen_info.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pen_info.hpp; sourceTree = ""; }; + 670948671BDF9C7F005014C0 /* point.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = point.h; sourceTree = ""; }; + 6709487E1BDF9F15005014C0 /* defaults.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = defaults.xcconfig; path = ../defaults.xcconfig; sourceTree = ""; }; + 675D21851BFB871D00717E4F /* proto_to_styles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = proto_to_styles.cpp; sourceTree = ""; }; + 675D21861BFB871D00717E4F /* proto_to_styles.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = proto_to_styles.hpp; sourceTree = ""; }; + 675D21871BFB871D00717E4F /* rect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rect.h; sourceTree = ""; }; + 675D21881BFB871D00717E4F /* software_renderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = software_renderer.cpp; sourceTree = ""; }; + 675D21891BFB871D00717E4F /* software_renderer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = software_renderer.hpp; sourceTree = ""; }; + 675D218A1BFB871D00717E4F /* text_engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text_engine.cpp; sourceTree = ""; }; + 675D218B1BFB871D00717E4F /* text_engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text_engine.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 670947371BDF9B82005014C0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 670947311BDF9B82005014C0 = { + isa = PBXGroup; + children = ( + 6709487E1BDF9F15005014C0 /* defaults.xcconfig */, + 670947411BDF9B99005014C0 /* drape_frontend */, + 6709473B1BDF9B82005014C0 /* Products */, + ); + sourceTree = ""; + }; + 6709473B1BDF9B82005014C0 /* Products */ = { + isa = PBXGroup; + children = ( + 6709473A1BDF9B82005014C0 /* libdrape_frontend.a */, + ); + name = Products; + sourceTree = ""; + }; + 670947411BDF9B99005014C0 /* drape_frontend */ = { + isa = PBXGroup; + children = ( + 670948511BDF9C5F005014C0 /* watch */, + 670948061BDF9C15005014C0 /* gui */, + 670948051BDF9C0D005014C0 /* animation */, + 670947E81BDF9BF5005014C0 /* apply_feature_functors.cpp */, + 670947E91BDF9BF5005014C0 /* apply_feature_functors.hpp */, + 670947EA1BDF9BF5005014C0 /* area_shape.cpp */, + 670947EB1BDF9BF5005014C0 /* area_shape.hpp */, + 670947EC1BDF9BF5005014C0 /* backend_renderer.cpp */, + 670947ED1BDF9BF5005014C0 /* backend_renderer.hpp */, + 670947EE1BDF9BF5005014C0 /* base_renderer.cpp */, + 670947EF1BDF9BF5005014C0 /* base_renderer.hpp */, + 670947F01BDF9BF5005014C0 /* batchers_pool.cpp */, + 670947F11BDF9BF5005014C0 /* batchers_pool.hpp */, + 670947F21BDF9BF5005014C0 /* circle_shape.cpp */, + 670947F31BDF9BF5005014C0 /* circle_shape.hpp */, + 670947F41BDF9BF5005014C0 /* drape_engine.cpp */, + 670947F51BDF9BF5005014C0 /* drape_engine.hpp */, + 670947E01BDF9BEC005014C0 /* engine_context.cpp */, + 670947E11BDF9BEC005014C0 /* engine_context.hpp */, + 670947E21BDF9BEC005014C0 /* frontend_renderer.cpp */, + 670947E31BDF9BEC005014C0 /* frontend_renderer.hpp */, + 670947421BDF9BE0005014C0 /* intrusive_vector.hpp */, + 670947431BDF9BE0005014C0 /* kinetic_scroller.cpp */, + 670947441BDF9BE0005014C0 /* kinetic_scroller.hpp */, + 670947451BDF9BE0005014C0 /* line_shape_helper.cpp */, + 670947461BDF9BE0005014C0 /* line_shape_helper.hpp */, + 670947471BDF9BE0005014C0 /* line_shape.cpp */, + 670947481BDF9BE0005014C0 /* line_shape.hpp */, + 670947491BDF9BE0005014C0 /* map_data_provider.cpp */, + 6709474A1BDF9BE0005014C0 /* map_data_provider.hpp */, + 6709474B1BDF9BE0005014C0 /* map_shape.hpp */, + 6709474C1BDF9BE0005014C0 /* memory_feature_index.cpp */, + 6709474D1BDF9BE0005014C0 /* memory_feature_index.hpp */, + 6709474E1BDF9BE0005014C0 /* message_acceptor.cpp */, + 6709474F1BDF9BE0005014C0 /* message_acceptor.hpp */, + 670947501BDF9BE0005014C0 /* message_queue.cpp */, + 670947511BDF9BE0005014C0 /* message_queue.hpp */, + 670947521BDF9BE0005014C0 /* message_subclasses.hpp */, + 670947531BDF9BE0005014C0 /* message.hpp */, + 670947541BDF9BE0005014C0 /* my_position_controller.cpp */, + 670947551BDF9BE0005014C0 /* my_position_controller.hpp */, + 670947561BDF9BE0005014C0 /* my_position.cpp */, + 670947571BDF9BE0005014C0 /* my_position.hpp */, + 670947581BDF9BE0005014C0 /* navigator.cpp */, + 670947591BDF9BE0005014C0 /* navigator.hpp */, + 6709475A1BDF9BE0005014C0 /* path_symbol_shape.cpp */, + 6709475B1BDF9BE0005014C0 /* path_symbol_shape.hpp */, + 6709475C1BDF9BE0005014C0 /* path_text_shape.cpp */, + 6709475D1BDF9BE0005014C0 /* path_text_shape.hpp */, + 6709475E1BDF9BE0005014C0 /* poi_symbol_shape.cpp */, + 6709475F1BDF9BE0005014C0 /* poi_symbol_shape.hpp */, + 670947601BDF9BE0005014C0 /* read_manager.cpp */, + 670947611BDF9BE0005014C0 /* read_manager.hpp */, + 670947621BDF9BE0005014C0 /* read_mwm_task.cpp */, + 670947631BDF9BE0005014C0 /* read_mwm_task.hpp */, + 670947641BDF9BE0005014C0 /* render_group.cpp */, + 670947651BDF9BE0005014C0 /* render_group.hpp */, + 670947661BDF9BE0005014C0 /* render_node.cpp */, + 670947671BDF9BE0005014C0 /* render_node.hpp */, + 670947681BDF9BE0005014C0 /* route_builder.cpp */, + 670947691BDF9BE0005014C0 /* route_builder.hpp */, + 6709476A1BDF9BE0005014C0 /* route_renderer.cpp */, + 6709476B1BDF9BE0005014C0 /* route_renderer.hpp */, + 6709476C1BDF9BE0005014C0 /* route_shape.cpp */, + 6709476D1BDF9BE0005014C0 /* route_shape.hpp */, + 6709476E1BDF9BE0005014C0 /* rule_drawer.cpp */, + 6709476F1BDF9BE0005014C0 /* rule_drawer.hpp */, + 670947701BDF9BE0005014C0 /* selection_shape.cpp */, + 670947711BDF9BE0005014C0 /* selection_shape.hpp */, + 670947721BDF9BE0005014C0 /* shape_view_params.hpp */, + 670947731BDF9BE0005014C0 /* stylist.cpp */, + 670947741BDF9BE0005014C0 /* stylist.hpp */, + 670947751BDF9BE0005014C0 /* text_handle.cpp */, + 670947761BDF9BE0005014C0 /* text_handle.hpp */, + 670947771BDF9BE0005014C0 /* text_layout.cpp */, + 670947781BDF9BE0005014C0 /* text_layout.hpp */, + 670947791BDF9BE0005014C0 /* text_shape.cpp */, + 6709477A1BDF9BE0005014C0 /* text_shape.hpp */, + 6709477B1BDF9BE0005014C0 /* threads_commutator.cpp */, + 6709477C1BDF9BE0005014C0 /* threads_commutator.hpp */, + 6709477D1BDF9BE0005014C0 /* tile_info.cpp */, + 6709477E1BDF9BE0005014C0 /* tile_info.hpp */, + 6709477F1BDF9BE0005014C0 /* tile_key.cpp */, + 670947801BDF9BE0005014C0 /* tile_key.hpp */, + 670947811BDF9BE0005014C0 /* tile_tree_builder.cpp */, + 670947821BDF9BE0005014C0 /* tile_tree_builder.hpp */, + 670947831BDF9BE0005014C0 /* tile_tree.cpp */, + 670947841BDF9BE0005014C0 /* tile_tree.hpp */, + 670947851BDF9BE0005014C0 /* tile_utils.cpp */, + 670947861BDF9BE0005014C0 /* tile_utils.hpp */, + 670947871BDF9BE0005014C0 /* user_event_stream.cpp */, + 670947881BDF9BE0005014C0 /* user_event_stream.hpp */, + 670947891BDF9BE0005014C0 /* user_mark_shapes.cpp */, + 6709478A1BDF9BE0005014C0 /* user_mark_shapes.hpp */, + 6709478B1BDF9BE0005014C0 /* user_marks_provider.cpp */, + 6709478C1BDF9BE0005014C0 /* user_marks_provider.hpp */, + 6709478D1BDF9BE0005014C0 /* viewport.cpp */, + 6709478E1BDF9BE1005014C0 /* viewport.hpp */, + 6709478F1BDF9BE1005014C0 /* visual_params.cpp */, + 670947901BDF9BE1005014C0 /* visual_params.hpp */, + ); + name = drape_frontend; + path = ../../drape_frontend; + sourceTree = ""; + }; + 670948051BDF9C0D005014C0 /* animation */ = { + isa = PBXGroup; + children = ( + 670948071BDF9C39005014C0 /* base_interpolator.cpp */, + 670948081BDF9C39005014C0 /* base_interpolator.hpp */, + 670948091BDF9C39005014C0 /* interpolation_holder.cpp */, + 6709480A1BDF9C39005014C0 /* interpolation_holder.hpp */, + 6709480B1BDF9C39005014C0 /* interpolations.cpp */, + 6709480C1BDF9C39005014C0 /* interpolations.hpp */, + 6709480D1BDF9C39005014C0 /* model_view_animation.cpp */, + 6709480E1BDF9C39005014C0 /* model_view_animation.hpp */, + 6709480F1BDF9C39005014C0 /* opacity_animation.cpp */, + 670948101BDF9C39005014C0 /* opacity_animation.hpp */, + 670948111BDF9C39005014C0 /* show_hide_animation.cpp */, + 670948121BDF9C39005014C0 /* show_hide_animation.hpp */, + 670948131BDF9C39005014C0 /* value_mapping.hpp */, + ); + path = animation; + sourceTree = ""; + }; + 670948061BDF9C15005014C0 /* gui */ = { + isa = PBXGroup; + children = ( + 670948211BDF9C48005014C0 /* button.cpp */, + 670948221BDF9C48005014C0 /* button.hpp */, + 670948231BDF9C48005014C0 /* compass.cpp */, + 670948241BDF9C48005014C0 /* compass.hpp */, + 670948251BDF9C48005014C0 /* copyright_label.cpp */, + 670948261BDF9C48005014C0 /* copyright_label.hpp */, + 670948271BDF9C48005014C0 /* country_status_helper.cpp */, + 670948281BDF9C48005014C0 /* country_status_helper.hpp */, + 670948291BDF9C48005014C0 /* country_status.cpp */, + 6709482A1BDF9C48005014C0 /* country_status.hpp */, + 6709482B1BDF9C48005014C0 /* drape_gui.cpp */, + 6709482C1BDF9C48005014C0 /* drape_gui.hpp */, + 6709482D1BDF9C48005014C0 /* gui_text.cpp */, + 6709482E1BDF9C48005014C0 /* gui_text.hpp */, + 6709482F1BDF9C48005014C0 /* layer_render.cpp */, + 670948301BDF9C48005014C0 /* layer_render.hpp */, + 670948311BDF9C48005014C0 /* ruler_helper.cpp */, + 670948321BDF9C48005014C0 /* ruler_helper.hpp */, + 670948331BDF9C48005014C0 /* ruler.cpp */, + 670948341BDF9C48005014C0 /* ruler.hpp */, + 670948351BDF9C48005014C0 /* shape.cpp */, + 670948361BDF9C48005014C0 /* shape.hpp */, + 670948371BDF9C48005014C0 /* skin.cpp */, + 670948381BDF9C48005014C0 /* skin.hpp */, + ); + path = gui; + sourceTree = ""; + }; + 670948511BDF9C5F005014C0 /* watch */ = { + isa = PBXGroup; + children = ( + 675D21851BFB871D00717E4F /* proto_to_styles.cpp */, + 675D21861BFB871D00717E4F /* proto_to_styles.hpp */, + 675D21871BFB871D00717E4F /* rect.h */, + 675D21881BFB871D00717E4F /* software_renderer.cpp */, + 675D21891BFB871D00717E4F /* software_renderer.hpp */, + 675D218A1BFB871D00717E4F /* text_engine.cpp */, + 675D218B1BFB871D00717E4F /* text_engine.h */, + 670948521BDF9C7F005014C0 /* agg_curves.cpp */, + 670948531BDF9C7F005014C0 /* area_info.hpp */, + 670948541BDF9C7F005014C0 /* brush_info.hpp */, + 670948551BDF9C7F005014C0 /* circle_info.hpp */, + 670948561BDF9C7F005014C0 /* cpu_drawer.cpp */, + 670948571BDF9C7F005014C0 /* cpu_drawer.hpp */, + 670948581BDF9C7F005014C0 /* default_font.cpp */, + 670948591BDF9C7F005014C0 /* feature_processor.cpp */, + 6709485A1BDF9C7F005014C0 /* feature_processor.hpp */, + 6709485B1BDF9C7F005014C0 /* feature_styler.cpp */, + 6709485C1BDF9C7F005014C0 /* feature_styler.hpp */, + 6709485D1BDF9C7F005014C0 /* frame_image.hpp */, + 6709485E1BDF9C7F005014C0 /* geometry_processors.cpp */, + 6709485F1BDF9C7F005014C0 /* geometry_processors.hpp */, + 670948601BDF9C7F005014C0 /* glyph_cache_impl.cpp */, + 670948611BDF9C7F005014C0 /* glyph_cache_impl.hpp */, + 670948621BDF9C7F005014C0 /* glyph_cache.cpp */, + 670948631BDF9C7F005014C0 /* glyph_cache.hpp */, + 670948641BDF9C7F005014C0 /* icon_info.hpp */, + 670948651BDF9C7F005014C0 /* path_info.hpp */, + 670948661BDF9C7F005014C0 /* pen_info.hpp */, + 670948671BDF9C7F005014C0 /* point.h */, + ); + path = watch; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 670947381BDF9B82005014C0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 670947D31BDF9BE1005014C0 /* tile_tree.hpp in Headers */, + 670947971BDF9BE1005014C0 /* line_shape.hpp in Headers */, + 670948031BDF9BF5005014C0 /* drape_engine.hpp in Headers */, + 6709486A1BDF9C7F005014C0 /* brush_info.hpp in Headers */, + 670948401BDF9C48005014C0 /* country_status_helper.hpp in Headers */, + 675D218E1BFB871D00717E4F /* rect.h in Headers */, + 670948191BDF9C39005014C0 /* interpolations.hpp in Headers */, + 670947CB1BDF9BE1005014C0 /* threads_commutator.hpp in Headers */, + 670948701BDF9C7F005014C0 /* feature_processor.hpp in Headers */, + 670947A41BDF9BE1005014C0 /* my_position_controller.hpp in Headers */, + 670948011BDF9BF5005014C0 /* circle_shape.hpp in Headers */, + 670947A01BDF9BE1005014C0 /* message_queue.hpp in Headers */, + 670947C71BDF9BE1005014C0 /* text_layout.hpp in Headers */, + 670948791BDF9C7F005014C0 /* glyph_cache.hpp in Headers */, + 670947FF1BDF9BF5005014C0 /* batchers_pool.hpp in Headers */, + 670947C01BDF9BE1005014C0 /* selection_shape.hpp in Headers */, + 6709481D1BDF9C39005014C0 /* opacity_animation.hpp in Headers */, + 670947F91BDF9BF5005014C0 /* area_shape.hpp in Headers */, + 670947991BDF9BE1005014C0 /* map_data_provider.hpp in Headers */, + 670947BC1BDF9BE1005014C0 /* route_shape.hpp in Headers */, + 670948721BDF9C7F005014C0 /* feature_styler.hpp in Headers */, + 6709484E1BDF9C48005014C0 /* shape.hpp in Headers */, + 670947B61BDF9BE1005014C0 /* render_node.hpp in Headers */, + 6709484C1BDF9C48005014C0 /* ruler.hpp in Headers */, + 670947AE1BDF9BE1005014C0 /* poi_symbol_shape.hpp in Headers */, + 670947AA1BDF9BE1005014C0 /* path_symbol_shape.hpp in Headers */, + 6709483E1BDF9C48005014C0 /* copyright_label.hpp in Headers */, + 675D21921BFB871D00717E4F /* text_engine.h in Headers */, + 675D218D1BFB871D00717E4F /* proto_to_styles.hpp in Headers */, + 670947951BDF9BE1005014C0 /* line_shape_helper.hpp in Headers */, + 670948501BDF9C48005014C0 /* skin.hpp in Headers */, + 6709481B1BDF9C39005014C0 /* model_view_animation.hpp in Headers */, + 670947B21BDF9BE1005014C0 /* read_mwm_task.hpp in Headers */, + 670947C91BDF9BE1005014C0 /* text_shape.hpp in Headers */, + 6709483A1BDF9C48005014C0 /* button.hpp in Headers */, + 670947C11BDF9BE1005014C0 /* shape_view_params.hpp in Headers */, + 670948461BDF9C48005014C0 /* gui_text.hpp in Headers */, + 6709479C1BDF9BE1005014C0 /* memory_feature_index.hpp in Headers */, + 670947E51BDF9BEC005014C0 /* engine_context.hpp in Headers */, + 670947D11BDF9BE1005014C0 /* tile_tree_builder.hpp in Headers */, + 670947BE1BDF9BE1005014C0 /* rule_drawer.hpp in Headers */, + 6709487C1BDF9C7F005014C0 /* pen_info.hpp in Headers */, + 6709487D1BDF9C7F005014C0 /* point.h in Headers */, + 6709479A1BDF9BE1005014C0 /* map_shape.hpp in Headers */, + 670948731BDF9C7F005014C0 /* frame_image.hpp in Headers */, + 670947FB1BDF9BF5005014C0 /* backend_renderer.hpp in Headers */, + 670947DF1BDF9BE1005014C0 /* visual_params.hpp in Headers */, + 670948421BDF9C48005014C0 /* country_status.hpp in Headers */, + 670948171BDF9C39005014C0 /* interpolation_holder.hpp in Headers */, + 670947FD1BDF9BF5005014C0 /* base_renderer.hpp in Headers */, + 670947D51BDF9BE1005014C0 /* tile_utils.hpp in Headers */, + 670947D91BDF9BE1005014C0 /* user_mark_shapes.hpp in Headers */, + 6709481F1BDF9C39005014C0 /* show_hide_animation.hpp in Headers */, + 670947931BDF9BE1005014C0 /* kinetic_scroller.hpp in Headers */, + 670947E71BDF9BEC005014C0 /* frontend_renderer.hpp in Headers */, + 670947911BDF9BE1005014C0 /* intrusive_vector.hpp in Headers */, + 670947F71BDF9BF5005014C0 /* apply_feature_functors.hpp in Headers */, + 670947CD1BDF9BE1005014C0 /* tile_info.hpp in Headers */, + 6709486B1BDF9C7F005014C0 /* circle_info.hpp in Headers */, + 670947C31BDF9BE1005014C0 /* stylist.hpp in Headers */, + 670948481BDF9C48005014C0 /* layer_render.hpp in Headers */, + 670947AC1BDF9BE1005014C0 /* path_text_shape.hpp in Headers */, + 6709483C1BDF9C48005014C0 /* compass.hpp in Headers */, + 670947B01BDF9BE1005014C0 /* read_manager.hpp in Headers */, + 670947CF1BDF9BE1005014C0 /* tile_key.hpp in Headers */, + 670947BA1BDF9BE1005014C0 /* route_renderer.hpp in Headers */, + 670948201BDF9C39005014C0 /* value_mapping.hpp in Headers */, + 670948441BDF9C48005014C0 /* drape_gui.hpp in Headers */, + 670947DD1BDF9BE1005014C0 /* viewport.hpp in Headers */, + 670947B41BDF9BE1005014C0 /* render_group.hpp in Headers */, + 670948771BDF9C7F005014C0 /* glyph_cache_impl.hpp in Headers */, + 670947A11BDF9BE1005014C0 /* message_subclasses.hpp in Headers */, + 670947C51BDF9BE1005014C0 /* text_handle.hpp in Headers */, + 670947D71BDF9BE1005014C0 /* user_event_stream.hpp in Headers */, + 6709479E1BDF9BE1005014C0 /* message_acceptor.hpp in Headers */, + 6709484A1BDF9C48005014C0 /* ruler_helper.hpp in Headers */, + 670947B81BDF9BE1005014C0 /* route_builder.hpp in Headers */, + 670948751BDF9C7F005014C0 /* geometry_processors.hpp in Headers */, + 6709487A1BDF9C7F005014C0 /* icon_info.hpp in Headers */, + 670948151BDF9C39005014C0 /* base_interpolator.hpp in Headers */, + 670947A61BDF9BE1005014C0 /* my_position.hpp in Headers */, + 675D21901BFB871D00717E4F /* software_renderer.hpp in Headers */, + 670947A81BDF9BE1005014C0 /* navigator.hpp in Headers */, + 670947A21BDF9BE1005014C0 /* message.hpp in Headers */, + 6709487B1BDF9C7F005014C0 /* path_info.hpp in Headers */, + 6709486D1BDF9C7F005014C0 /* cpu_drawer.hpp in Headers */, + 670948691BDF9C7F005014C0 /* area_info.hpp in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 670947391BDF9B82005014C0 /* drape_frontend */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6709473E1BDF9B82005014C0 /* Build configuration list for PBXNativeTarget "drape_frontend" */; + buildPhases = ( + 670947361BDF9B82005014C0 /* Sources */, + 670947371BDF9B82005014C0 /* Frameworks */, + 670947381BDF9B82005014C0 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = drape_frontend; + productName = drape_frontend; + productReference = 6709473A1BDF9B82005014C0 /* libdrape_frontend.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 670947321BDF9B82005014C0 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0710; + ORGANIZATIONNAME = maps.me; + TargetAttributes = { + 670947391BDF9B82005014C0 = { + CreatedOnToolsVersion = 7.1; + }; + }; + }; + buildConfigurationList = 670947351BDF9B82005014C0 /* Build configuration list for PBXProject "drape_frontend" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 670947311BDF9B82005014C0; + productRefGroup = 6709473B1BDF9B82005014C0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 670947391BDF9B82005014C0 /* drape_frontend */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 670947361BDF9B82005014C0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 67E91C751BDFC85E005CEE88 /* feature_processor.cpp in Sources */, + 67E91C761BDFC85E005CEE88 /* glyph_cache_impl.cpp in Sources */, + 67E91C781BDFC85E005CEE88 /* area_shape.cpp in Sources */, + 67E91C791BDFC85E005CEE88 /* base_renderer.cpp in Sources */, + 67E91C7A1BDFC85E005CEE88 /* circle_shape.cpp in Sources */, + 67E91C7B1BDFC85E005CEE88 /* my_position_controller.cpp in Sources */, + 67E91C7C1BDFC85E005CEE88 /* selection_shape.cpp in Sources */, + 67E91C7D1BDFC85E005CEE88 /* user_marks_provider.cpp in Sources */, + 67E91C7E1BDFC85E005CEE88 /* visual_params.cpp in Sources */, + 6709486E1BDF9C7F005014C0 /* default_font.cpp in Sources */, + 670947D01BDF9BE1005014C0 /* tile_tree_builder.cpp in Sources */, + 670947D21BDF9BE1005014C0 /* tile_tree.cpp in Sources */, + 675D21661BFB785900717E4F /* ruler.cpp in Sources */, + 675D218F1BFB871D00717E4F /* software_renderer.cpp in Sources */, + 670947CE1BDF9BE1005014C0 /* tile_key.cpp in Sources */, + 670947AB1BDF9BE1005014C0 /* path_text_shape.cpp in Sources */, + 670947F61BDF9BF5005014C0 /* apply_feature_functors.cpp in Sources */, + 670947D81BDF9BE1005014C0 /* user_mark_shapes.cpp in Sources */, + 670947A51BDF9BE1005014C0 /* my_position.cpp in Sources */, + 670947BB1BDF9BE1005014C0 /* route_shape.cpp in Sources */, + 6709479D1BDF9BE1005014C0 /* message_acceptor.cpp in Sources */, + 6709483B1BDF9C48005014C0 /* compass.cpp in Sources */, + 670947921BDF9BE1005014C0 /* kinetic_scroller.cpp in Sources */, + 6709484D1BDF9C48005014C0 /* shape.cpp in Sources */, + 675D218C1BFB871D00717E4F /* proto_to_styles.cpp in Sources */, + 670948781BDF9C7F005014C0 /* glyph_cache.cpp in Sources */, + 670948431BDF9C48005014C0 /* drape_gui.cpp in Sources */, + 670947D61BDF9BE1005014C0 /* user_event_stream.cpp in Sources */, + 670947B11BDF9BE1005014C0 /* read_mwm_task.cpp in Sources */, + 670948711BDF9C7F005014C0 /* feature_styler.cpp in Sources */, + 670948471BDF9C48005014C0 /* layer_render.cpp in Sources */, + 670948391BDF9C48005014C0 /* button.cpp in Sources */, + 6709486C1BDF9C7F005014C0 /* cpu_drawer.cpp in Sources */, + 670947C41BDF9BE1005014C0 /* text_handle.cpp in Sources */, + 670947BD1BDF9BE1005014C0 /* rule_drawer.cpp in Sources */, + 6709481E1BDF9C39005014C0 /* show_hide_animation.cpp in Sources */, + 6709483D1BDF9C48005014C0 /* copyright_label.cpp in Sources */, + 670947C81BDF9BE1005014C0 /* text_shape.cpp in Sources */, + 670947CC1BDF9BE1005014C0 /* tile_info.cpp in Sources */, + 6709481A1BDF9C39005014C0 /* model_view_animation.cpp in Sources */, + 670947961BDF9BE1005014C0 /* line_shape.cpp in Sources */, + 670948681BDF9C7F005014C0 /* agg_curves.cpp in Sources */, + 670947A91BDF9BE1005014C0 /* path_symbol_shape.cpp in Sources */, + 670947FA1BDF9BF5005014C0 /* backend_renderer.cpp in Sources */, + 670948451BDF9C48005014C0 /* gui_text.cpp in Sources */, + 670948141BDF9C39005014C0 /* base_interpolator.cpp in Sources */, + 670948491BDF9C48005014C0 /* ruler_helper.cpp in Sources */, + 670947E41BDF9BEC005014C0 /* engine_context.cpp in Sources */, + 670947B51BDF9BE1005014C0 /* render_node.cpp in Sources */, + 670947AF1BDF9BE1005014C0 /* read_manager.cpp in Sources */, + 670947941BDF9BE1005014C0 /* line_shape_helper.cpp in Sources */, + 670947C21BDF9BE1005014C0 /* stylist.cpp in Sources */, + 670948741BDF9C7F005014C0 /* geometry_processors.cpp in Sources */, + 670947AD1BDF9BE1005014C0 /* poi_symbol_shape.cpp in Sources */, + 6709479F1BDF9BE1005014C0 /* message_queue.cpp in Sources */, + 670947A71BDF9BE1005014C0 /* navigator.cpp in Sources */, + 6709484F1BDF9C48005014C0 /* skin.cpp in Sources */, + 670947B91BDF9BE1005014C0 /* route_renderer.cpp in Sources */, + 670948411BDF9C48005014C0 /* country_status.cpp in Sources */, + 670947B31BDF9BE1005014C0 /* render_group.cpp in Sources */, + 675D21911BFB871D00717E4F /* text_engine.cpp in Sources */, + 670947FE1BDF9BF5005014C0 /* batchers_pool.cpp in Sources */, + 670947DC1BDF9BE1005014C0 /* viewport.cpp in Sources */, + 670947CA1BDF9BE1005014C0 /* threads_commutator.cpp in Sources */, + 670947981BDF9BE1005014C0 /* map_data_provider.cpp in Sources */, + 670948181BDF9C39005014C0 /* interpolations.cpp in Sources */, + 670948021BDF9BF5005014C0 /* drape_engine.cpp in Sources */, + 6709483F1BDF9C48005014C0 /* country_status_helper.cpp in Sources */, + 6709481C1BDF9C39005014C0 /* opacity_animation.cpp in Sources */, + 6709479B1BDF9BE1005014C0 /* memory_feature_index.cpp in Sources */, + 670947E61BDF9BEC005014C0 /* frontend_renderer.cpp in Sources */, + 670947D41BDF9BE1005014C0 /* tile_utils.cpp in Sources */, + 670947C61BDF9BE1005014C0 /* text_layout.cpp in Sources */, + 670948161BDF9C39005014C0 /* interpolation_holder.cpp in Sources */, + 670947B71BDF9BE1005014C0 /* route_builder.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 6709473C1BDF9B82005014C0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6709487E1BDF9F15005014C0 /* defaults.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(OMIM_ROOT)", + "$(BOOST_ROOT)", + "$(OMIM_ROOT)/3party/glm", + "$(OMIM_ROOT)/3party/protobuf/src", + "$(OMIM_ROOT)/3party/protobuf", + "$(OMIM_ROOT)/3party/freetype/include", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 6709473D1BDF9B82005014C0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6709487E1BDF9F15005014C0 /* defaults.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(OMIM_ROOT)", + "$(BOOST_ROOT)", + "$(OMIM_ROOT)/3party/glm", + "$(OMIM_ROOT)/3party/protobuf/src", + "$(OMIM_ROOT)/3party/protobuf", + "$(OMIM_ROOT)/3party/freetype/include", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 6709473F1BDF9B82005014C0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 670947401BDF9B82005014C0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 670947351BDF9B82005014C0 /* Build configuration list for PBXProject "drape_frontend" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6709473C1BDF9B82005014C0 /* Debug */, + 6709473D1BDF9B82005014C0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6709473E1BDF9B82005014C0 /* Build configuration list for PBXNativeTarget "drape_frontend" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6709473F1BDF9B82005014C0 /* Debug */, + 670947401BDF9B82005014C0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 670947321BDF9B82005014C0 /* Project object */; +} diff --git a/xcode/geometry/geometry.xcodeproj/project.pbxproj b/xcode/geometry/geometry.xcodeproj/project.pbxproj index 4e50925033..30e623dec8 100644 --- a/xcode/geometry/geometry.xcodeproj/project.pbxproj +++ b/xcode/geometry/geometry.xcodeproj/project.pbxproj @@ -71,6 +71,8 @@ 675344DE1A3F68F900A0A8C3 /* binary_operators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675344DB1A3F68F900A0A8C3 /* binary_operators.cpp */; }; 675344DF1A3F68F900A0A8C3 /* binary_operators.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675344DC1A3F68F900A0A8C3 /* binary_operators.hpp */; }; 675344E01A3F68F900A0A8C3 /* boost_concept.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675344DD1A3F68F900A0A8C3 /* boost_concept.hpp */; }; + 675D21951BFB874500717E4F /* latlon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675D21931BFB874500717E4F /* latlon.cpp */; }; + 675D21961BFB874500717E4F /* latlon.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675D21941BFB874500717E4F /* latlon.hpp */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -152,6 +154,8 @@ 675344DB1A3F68F900A0A8C3 /* binary_operators.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binary_operators.cpp; sourceTree = ""; }; 675344DC1A3F68F900A0A8C3 /* binary_operators.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = binary_operators.hpp; sourceTree = ""; }; 675344DD1A3F68F900A0A8C3 /* boost_concept.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = boost_concept.hpp; sourceTree = ""; }; + 675D21931BFB874500717E4F /* latlon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = latlon.cpp; sourceTree = ""; }; + 675D21941BFB874500717E4F /* latlon.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = latlon.hpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ diff --git a/xcode/map/map.xcodeproj/project.pbxproj b/xcode/map/map.xcodeproj/project.pbxproj index 1c8bc595b1..b2b451fac5 100644 --- a/xcode/map/map.xcodeproj/project.pbxproj +++ b/xcode/map/map.xcodeproj/project.pbxproj @@ -12,8 +12,6 @@ 34921F661BFA0A6900737D6E /* api_mark_point.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 34921F611BFA0A6900737D6E /* api_mark_point.hpp */; }; 34921F671BFA0A6900737D6E /* styled_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34921F621BFA0A6900737D6E /* styled_point.cpp */; }; 34921F681BFA0A6900737D6E /* styled_point.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 34921F631BFA0A6900737D6E /* styled_point.hpp */; }; - 674A29C71B26F83C001A525C /* navigator_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 67D1C8041AE50EEE00A239E3 /* navigator_utils.cpp */; }; - 674A29C81B26F844001A525C /* navigator_utils.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 67D1C8051AE50EEE00A239E3 /* navigator_utils.hpp */; }; 674A29F01B26FD6F001A525C /* testingmain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A29EE1B26FD5F001A525C /* testingmain.cpp */; }; 674A2A0D1B26FE62001A525C /* libalohalitics.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 674A29F11B26FE62001A525C /* libalohalitics.a */; }; 674A2A0E1B26FE62001A525C /* libanim.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 674A29F21B26FE62001A525C /* libanim.a */; }; @@ -46,29 +44,16 @@ 674A2A331B26FFE9001A525C /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 674A2A321B26FFE9001A525C /* OpenGL.framework */; }; 674A2A361B27011A001A525C /* working_time_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A2A351B27011A001A525C /* working_time_tests.cpp */; }; 674A2A381B2715FB001A525C /* osm_opening_hours.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 674A2A371B2715FB001A525C /* osm_opening_hours.hpp */; }; + 674C38601BFF3095000D603B /* storage_bridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674C385D1BFF3095000D603B /* storage_bridge.cpp */; }; + 674C38611BFF3095000D603B /* storage_bridge.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 674C385E1BFF3095000D603B /* storage_bridge.hpp */; }; + 674C38621BFF3095000D603B /* user_mark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674C385F1BFF3095000D603B /* user_mark.cpp */; }; 675346381A4054E800A0A8C3 /* active_maps_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345C91A4054E800A0A8C3 /* active_maps_layout.cpp */; }; 675346391A4054E800A0A8C3 /* active_maps_layout.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345CA1A4054E800A0A8C3 /* active_maps_layout.hpp */; }; 6753463A1A4054E800A0A8C3 /* address_finder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345CB1A4054E800A0A8C3 /* address_finder.cpp */; }; - 6753463B1A4054E800A0A8C3 /* alfa_animation_task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345CC1A4054E800A0A8C3 /* alfa_animation_task.cpp */; }; - 6753463C1A4054E800A0A8C3 /* alfa_animation_task.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345CD1A4054E800A0A8C3 /* alfa_animation_task.hpp */; }; - 6753463D1A4054E800A0A8C3 /* anim_phase_chain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345CE1A4054E800A0A8C3 /* anim_phase_chain.cpp */; }; - 6753463E1A4054E800A0A8C3 /* anim_phase_chain.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345CF1A4054E800A0A8C3 /* anim_phase_chain.hpp */; }; - 6753463F1A4054E800A0A8C3 /* animator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345D01A4054E800A0A8C3 /* animator.cpp */; }; - 675346401A4054E800A0A8C3 /* animator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345D11A4054E800A0A8C3 /* animator.hpp */; }; - 675346441A4054E800A0A8C3 /* benchmark_engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345D51A4054E800A0A8C3 /* benchmark_engine.cpp */; }; - 675346451A4054E800A0A8C3 /* benchmark_engine.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345D61A4054E800A0A8C3 /* benchmark_engine.hpp */; }; - 675346461A4054E800A0A8C3 /* benchmark_provider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345D71A4054E800A0A8C3 /* benchmark_provider.cpp */; }; - 675346471A4054E800A0A8C3 /* benchmark_provider.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345D81A4054E800A0A8C3 /* benchmark_provider.hpp */; }; 675346481A4054E800A0A8C3 /* bookmark_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345D91A4054E800A0A8C3 /* bookmark_manager.cpp */; }; 675346491A4054E800A0A8C3 /* bookmark_manager.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345DA1A4054E800A0A8C3 /* bookmark_manager.hpp */; }; 6753464A1A4054E800A0A8C3 /* bookmark.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345DB1A4054E800A0A8C3 /* bookmark.cpp */; }; 6753464B1A4054E800A0A8C3 /* bookmark.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345DC1A4054E800A0A8C3 /* bookmark.hpp */; }; - 6753464C1A4054E800A0A8C3 /* change_viewport_task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345DD1A4054E800A0A8C3 /* change_viewport_task.cpp */; }; - 6753464D1A4054E800A0A8C3 /* change_viewport_task.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345DE1A4054E800A0A8C3 /* change_viewport_task.hpp */; }; - 6753464E1A4054E800A0A8C3 /* compass_arrow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345DF1A4054E800A0A8C3 /* compass_arrow.cpp */; }; - 6753464F1A4054E800A0A8C3 /* compass_arrow.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345E01A4054E800A0A8C3 /* compass_arrow.hpp */; }; - 675346501A4054E800A0A8C3 /* country_status_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345E11A4054E800A0A8C3 /* country_status_display.cpp */; }; - 675346511A4054E800A0A8C3 /* country_status_display.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345E21A4054E800A0A8C3 /* country_status_display.hpp */; }; 675346521A4054E800A0A8C3 /* country_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345E31A4054E800A0A8C3 /* country_tree.cpp */; }; 675346531A4054E800A0A8C3 /* country_tree.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345E41A4054E800A0A8C3 /* country_tree.hpp */; }; 675346621A4054E800A0A8C3 /* feature_vec_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345F31A4054E800A0A8C3 /* feature_vec_model.cpp */; }; @@ -79,31 +64,13 @@ 675346671A4054E800A0A8C3 /* ge0_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345F81A4054E800A0A8C3 /* ge0_parser.hpp */; }; 6753466A1A4054E800A0A8C3 /* geourl_process.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345FB1A4054E800A0A8C3 /* geourl_process.cpp */; }; 6753466B1A4054E800A0A8C3 /* geourl_process.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345FC1A4054E800A0A8C3 /* geourl_process.hpp */; }; - 6753466C1A4054E800A0A8C3 /* information_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345FD1A4054E800A0A8C3 /* information_display.cpp */; }; - 6753466D1A4054E800A0A8C3 /* information_display.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345FE1A4054E800A0A8C3 /* information_display.hpp */; }; - 6753466E1A4054E800A0A8C3 /* location_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345FF1A4054E800A0A8C3 /* location_state.cpp */; }; - 6753466F1A4054E800A0A8C3 /* location_state.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675346001A4054E800A0A8C3 /* location_state.hpp */; }; - 675346721A4054E800A0A8C3 /* move_screen_task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675346031A4054E800A0A8C3 /* move_screen_task.cpp */; }; - 675346731A4054E800A0A8C3 /* move_screen_task.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675346041A4054E800A0A8C3 /* move_screen_task.hpp */; }; 675346741A4054E800A0A8C3 /* mwm_url.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675346051A4054E800A0A8C3 /* mwm_url.cpp */; }; 675346751A4054E800A0A8C3 /* mwm_url.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675346061A4054E800A0A8C3 /* mwm_url.hpp */; }; - 675346761A4054E800A0A8C3 /* navigator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675346071A4054E800A0A8C3 /* navigator.cpp */; }; - 675346771A4054E800A0A8C3 /* navigator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675346081A4054E800A0A8C3 /* navigator.hpp */; }; - 675346791A4054E800A0A8C3 /* pin_click_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6753460A1A4054E800A0A8C3 /* pin_click_manager.cpp */; }; - 6753467A1A4054E800A0A8C3 /* pin_click_manager.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6753460B1A4054E800A0A8C3 /* pin_click_manager.hpp */; }; - 6753467E1A4054E800A0A8C3 /* qgl_render_context.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6753460F1A4054E800A0A8C3 /* qgl_render_context.hpp */; }; - 675346831A4054E800A0A8C3 /* rotate_screen_task.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675346141A4054E800A0A8C3 /* rotate_screen_task.cpp */; }; - 675346841A4054E800A0A8C3 /* rotate_screen_task.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675346151A4054E800A0A8C3 /* rotate_screen_task.hpp */; }; - 675346871A4054E800A0A8C3 /* ruler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675346181A4054E800A0A8C3 /* ruler.cpp */; }; - 675346881A4054E800A0A8C3 /* ruler.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675346191A4054E800A0A8C3 /* ruler.hpp */; }; 6753469B1A4054E800A0A8C3 /* track.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6753462C1A4054E800A0A8C3 /* track.cpp */; }; 6753469C1A4054E800A0A8C3 /* track.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6753462D1A4054E800A0A8C3 /* track.hpp */; }; 6753469D1A4054E800A0A8C3 /* user_mark_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6753462E1A4054E800A0A8C3 /* user_mark_container.cpp */; }; 6753469E1A4054E800A0A8C3 /* user_mark_container.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6753462F1A4054E800A0A8C3 /* user_mark_container.hpp */; }; - 6753469F1A4054E800A0A8C3 /* user_mark_dl_cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675346301A4054E800A0A8C3 /* user_mark_dl_cache.cpp */; }; - 675346A01A4054E800A0A8C3 /* user_mark_dl_cache.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675346311A4054E800A0A8C3 /* user_mark_dl_cache.hpp */; }; 675346A21A4054E800A0A8C3 /* user_mark.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675346331A4054E800A0A8C3 /* user_mark.hpp */; }; - 67A2526C1BB42E4B0063F8A8 /* qgl_render_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6753460E1A4054E800A0A8C3 /* qgl_render_context.cpp */; }; 67F183751BD5041700AB1840 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 67F183741BD5041700AB1840 /* libz.tbd */; }; 67F183761BD5045700AB1840 /* bookmarks_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A29CB1B26FCFE001A525C /* bookmarks_test.cpp */; }; 67F183771BD5045700AB1840 /* ge0_parser_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A29CC1B26FCFE001A525C /* ge0_parser_tests.cpp */; }; @@ -179,30 +146,17 @@ 674A2A321B26FFE9001A525C /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; 674A2A351B27011A001A525C /* working_time_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = working_time_tests.cpp; sourceTree = ""; }; 674A2A371B2715FB001A525C /* osm_opening_hours.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = osm_opening_hours.hpp; sourceTree = ""; }; + 674C385D1BFF3095000D603B /* storage_bridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = storage_bridge.cpp; sourceTree = ""; }; + 674C385E1BFF3095000D603B /* storage_bridge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = storage_bridge.hpp; sourceTree = ""; }; + 674C385F1BFF3095000D603B /* user_mark.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = user_mark.cpp; sourceTree = ""; }; 675345BB1A4054AD00A0A8C3 /* libmap.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libmap.a; sourceTree = BUILT_PRODUCTS_DIR; }; 675345C91A4054E800A0A8C3 /* active_maps_layout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = active_maps_layout.cpp; sourceTree = ""; }; 675345CA1A4054E800A0A8C3 /* active_maps_layout.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = active_maps_layout.hpp; sourceTree = ""; }; 675345CB1A4054E800A0A8C3 /* address_finder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = address_finder.cpp; sourceTree = ""; }; - 675345CC1A4054E800A0A8C3 /* alfa_animation_task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = alfa_animation_task.cpp; sourceTree = ""; }; - 675345CD1A4054E800A0A8C3 /* alfa_animation_task.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = alfa_animation_task.hpp; sourceTree = ""; }; - 675345CE1A4054E800A0A8C3 /* anim_phase_chain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = anim_phase_chain.cpp; sourceTree = ""; }; - 675345CF1A4054E800A0A8C3 /* anim_phase_chain.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = anim_phase_chain.hpp; sourceTree = ""; }; - 675345D01A4054E800A0A8C3 /* animator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = animator.cpp; sourceTree = ""; }; - 675345D11A4054E800A0A8C3 /* animator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = animator.hpp; sourceTree = ""; }; - 675345D51A4054E800A0A8C3 /* benchmark_engine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = benchmark_engine.cpp; sourceTree = ""; }; - 675345D61A4054E800A0A8C3 /* benchmark_engine.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = benchmark_engine.hpp; sourceTree = ""; }; - 675345D71A4054E800A0A8C3 /* benchmark_provider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = benchmark_provider.cpp; sourceTree = ""; }; - 675345D81A4054E800A0A8C3 /* benchmark_provider.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = benchmark_provider.hpp; sourceTree = ""; }; 675345D91A4054E800A0A8C3 /* bookmark_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bookmark_manager.cpp; sourceTree = ""; }; 675345DA1A4054E800A0A8C3 /* bookmark_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bookmark_manager.hpp; sourceTree = ""; }; 675345DB1A4054E800A0A8C3 /* bookmark.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bookmark.cpp; sourceTree = ""; }; 675345DC1A4054E800A0A8C3 /* bookmark.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bookmark.hpp; sourceTree = ""; }; - 675345DD1A4054E800A0A8C3 /* change_viewport_task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = change_viewport_task.cpp; sourceTree = ""; }; - 675345DE1A4054E800A0A8C3 /* change_viewport_task.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = change_viewport_task.hpp; sourceTree = ""; }; - 675345DF1A4054E800A0A8C3 /* compass_arrow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compass_arrow.cpp; sourceTree = ""; }; - 675345E01A4054E800A0A8C3 /* compass_arrow.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = compass_arrow.hpp; sourceTree = ""; }; - 675345E11A4054E800A0A8C3 /* country_status_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = country_status_display.cpp; sourceTree = ""; }; - 675345E21A4054E800A0A8C3 /* country_status_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = country_status_display.hpp; sourceTree = ""; }; 675345E31A4054E800A0A8C3 /* country_tree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = country_tree.cpp; sourceTree = ""; }; 675345E41A4054E800A0A8C3 /* country_tree.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = country_tree.hpp; sourceTree = ""; }; 675345F31A4054E800A0A8C3 /* feature_vec_model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = feature_vec_model.cpp; sourceTree = ""; }; @@ -213,35 +167,13 @@ 675345F81A4054E800A0A8C3 /* ge0_parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ge0_parser.hpp; sourceTree = ""; }; 675345FB1A4054E800A0A8C3 /* geourl_process.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = geourl_process.cpp; sourceTree = ""; }; 675345FC1A4054E800A0A8C3 /* geourl_process.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = geourl_process.hpp; sourceTree = ""; }; - 675345FD1A4054E800A0A8C3 /* information_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = information_display.cpp; sourceTree = ""; }; - 675345FE1A4054E800A0A8C3 /* information_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = information_display.hpp; sourceTree = ""; }; - 675345FF1A4054E800A0A8C3 /* location_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = location_state.cpp; sourceTree = ""; }; - 675346001A4054E800A0A8C3 /* location_state.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = location_state.hpp; sourceTree = ""; }; - 675346031A4054E800A0A8C3 /* move_screen_task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = move_screen_task.cpp; sourceTree = ""; }; - 675346041A4054E800A0A8C3 /* move_screen_task.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = move_screen_task.hpp; sourceTree = ""; }; 675346051A4054E800A0A8C3 /* mwm_url.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mwm_url.cpp; sourceTree = ""; }; 675346061A4054E800A0A8C3 /* mwm_url.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mwm_url.hpp; sourceTree = ""; }; - 675346071A4054E800A0A8C3 /* navigator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = navigator.cpp; sourceTree = ""; }; - 675346081A4054E800A0A8C3 /* navigator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = navigator.hpp; sourceTree = ""; }; - 6753460A1A4054E800A0A8C3 /* pin_click_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pin_click_manager.cpp; sourceTree = ""; }; - 6753460B1A4054E800A0A8C3 /* pin_click_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pin_click_manager.hpp; sourceTree = ""; }; - 6753460E1A4054E800A0A8C3 /* qgl_render_context.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qgl_render_context.cpp; sourceTree = ""; }; - 6753460F1A4054E800A0A8C3 /* qgl_render_context.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = qgl_render_context.hpp; sourceTree = ""; }; - 675346141A4054E800A0A8C3 /* rotate_screen_task.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rotate_screen_task.cpp; sourceTree = ""; }; - 675346151A4054E800A0A8C3 /* rotate_screen_task.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = rotate_screen_task.hpp; sourceTree = ""; }; - 675346181A4054E800A0A8C3 /* ruler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruler.cpp; sourceTree = ""; }; - 675346191A4054E800A0A8C3 /* ruler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ruler.hpp; sourceTree = ""; }; 6753462C1A4054E800A0A8C3 /* track.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = track.cpp; sourceTree = ""; }; 6753462D1A4054E800A0A8C3 /* track.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = track.hpp; sourceTree = ""; }; 6753462E1A4054E800A0A8C3 /* user_mark_container.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = user_mark_container.cpp; sourceTree = ""; }; 6753462F1A4054E800A0A8C3 /* user_mark_container.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = user_mark_container.hpp; sourceTree = ""; }; - 675346301A4054E800A0A8C3 /* user_mark_dl_cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = user_mark_dl_cache.cpp; sourceTree = ""; }; - 675346311A4054E800A0A8C3 /* user_mark_dl_cache.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = user_mark_dl_cache.hpp; sourceTree = ""; }; 675346331A4054E800A0A8C3 /* user_mark.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = user_mark.hpp; sourceTree = ""; }; - 67D1C8041AE50EEE00A239E3 /* navigator_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = navigator_utils.cpp; sourceTree = ""; }; - 67D1C8051AE50EEE00A239E3 /* navigator_utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = navigator_utils.hpp; sourceTree = ""; }; - 67D1C8061AE50EEE00A239E3 /* route_track.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = route_track.cpp; sourceTree = ""; }; - 67D1C8071AE50EEF00A239E3 /* route_track.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = route_track.hpp; sourceTree = ""; }; 67F183741BD5041700AB1840 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 67F1837D1BD5049500AB1840 /* libagg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libagg.a; path = "../../../omim-xcode-build/Debug/libagg.a"; sourceTree = ""; }; 67F1837E1BD5049500AB1840 /* liblodepng.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblodepng.a; path = "../../../omim-xcode-build/Debug/liblodepng.a"; sourceTree = ""; }; @@ -389,38 +321,21 @@ 675345BD1A4054AD00A0A8C3 /* map */ = { isa = PBXGroup; children = ( + 674C385D1BFF3095000D603B /* storage_bridge.cpp */, + 674C385E1BFF3095000D603B /* storage_bridge.hpp */, + 674C385F1BFF3095000D603B /* user_mark.cpp */, 34921F5F1BFA0A6900737D6E /* api_mark_container.cpp */, 34921F601BFA0A6900737D6E /* api_mark_container.hpp */, 34921F611BFA0A6900737D6E /* api_mark_point.hpp */, 34921F621BFA0A6900737D6E /* styled_point.cpp */, 34921F631BFA0A6900737D6E /* styled_point.hpp */, - 67D1C8041AE50EEE00A239E3 /* navigator_utils.cpp */, - 67D1C8051AE50EEE00A239E3 /* navigator_utils.hpp */, - 67D1C8061AE50EEE00A239E3 /* route_track.cpp */, - 67D1C8071AE50EEF00A239E3 /* route_track.hpp */, 675345C91A4054E800A0A8C3 /* active_maps_layout.cpp */, 675345CA1A4054E800A0A8C3 /* active_maps_layout.hpp */, 675345CB1A4054E800A0A8C3 /* address_finder.cpp */, - 675345CC1A4054E800A0A8C3 /* alfa_animation_task.cpp */, - 675345CD1A4054E800A0A8C3 /* alfa_animation_task.hpp */, - 675345CE1A4054E800A0A8C3 /* anim_phase_chain.cpp */, - 675345CF1A4054E800A0A8C3 /* anim_phase_chain.hpp */, - 675345D01A4054E800A0A8C3 /* animator.cpp */, - 675345D11A4054E800A0A8C3 /* animator.hpp */, - 675345D51A4054E800A0A8C3 /* benchmark_engine.cpp */, - 675345D61A4054E800A0A8C3 /* benchmark_engine.hpp */, - 675345D71A4054E800A0A8C3 /* benchmark_provider.cpp */, - 675345D81A4054E800A0A8C3 /* benchmark_provider.hpp */, 675345D91A4054E800A0A8C3 /* bookmark_manager.cpp */, 675345DA1A4054E800A0A8C3 /* bookmark_manager.hpp */, 675345DB1A4054E800A0A8C3 /* bookmark.cpp */, 675345DC1A4054E800A0A8C3 /* bookmark.hpp */, - 675345DD1A4054E800A0A8C3 /* change_viewport_task.cpp */, - 675345DE1A4054E800A0A8C3 /* change_viewport_task.hpp */, - 675345DF1A4054E800A0A8C3 /* compass_arrow.cpp */, - 675345E01A4054E800A0A8C3 /* compass_arrow.hpp */, - 675345E11A4054E800A0A8C3 /* country_status_display.cpp */, - 675345E21A4054E800A0A8C3 /* country_status_display.hpp */, 675345E31A4054E800A0A8C3 /* country_tree.cpp */, 675345E41A4054E800A0A8C3 /* country_tree.hpp */, 675345F31A4054E800A0A8C3 /* feature_vec_model.cpp */, @@ -431,30 +346,12 @@ 675345F81A4054E800A0A8C3 /* ge0_parser.hpp */, 675345FB1A4054E800A0A8C3 /* geourl_process.cpp */, 675345FC1A4054E800A0A8C3 /* geourl_process.hpp */, - 675345FD1A4054E800A0A8C3 /* information_display.cpp */, - 675345FE1A4054E800A0A8C3 /* information_display.hpp */, - 675345FF1A4054E800A0A8C3 /* location_state.cpp */, - 675346001A4054E800A0A8C3 /* location_state.hpp */, - 675346031A4054E800A0A8C3 /* move_screen_task.cpp */, - 675346041A4054E800A0A8C3 /* move_screen_task.hpp */, 675346051A4054E800A0A8C3 /* mwm_url.cpp */, 675346061A4054E800A0A8C3 /* mwm_url.hpp */, - 675346071A4054E800A0A8C3 /* navigator.cpp */, - 675346081A4054E800A0A8C3 /* navigator.hpp */, - 6753460A1A4054E800A0A8C3 /* pin_click_manager.cpp */, - 6753460B1A4054E800A0A8C3 /* pin_click_manager.hpp */, - 6753460E1A4054E800A0A8C3 /* qgl_render_context.cpp */, - 6753460F1A4054E800A0A8C3 /* qgl_render_context.hpp */, - 675346141A4054E800A0A8C3 /* rotate_screen_task.cpp */, - 675346151A4054E800A0A8C3 /* rotate_screen_task.hpp */, - 675346181A4054E800A0A8C3 /* ruler.cpp */, - 675346191A4054E800A0A8C3 /* ruler.hpp */, 6753462C1A4054E800A0A8C3 /* track.cpp */, 6753462D1A4054E800A0A8C3 /* track.hpp */, 6753462E1A4054E800A0A8C3 /* user_mark_container.cpp */, 6753462F1A4054E800A0A8C3 /* user_mark_container.hpp */, - 675346301A4054E800A0A8C3 /* user_mark_dl_cache.cpp */, - 675346311A4054E800A0A8C3 /* user_mark_dl_cache.hpp */, 675346331A4054E800A0A8C3 /* user_mark.hpp */, 674A2A371B2715FB001A525C /* osm_opening_hours.hpp */, ); @@ -469,39 +366,22 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 675346881A4054E800A0A8C3 /* ruler.hpp in Headers */, - 6753464D1A4054E800A0A8C3 /* change_viewport_task.hpp in Headers */, 6753466B1A4054E800A0A8C3 /* geourl_process.hpp in Headers */, - 675346471A4054E800A0A8C3 /* benchmark_provider.hpp in Headers */, - 6753466D1A4054E800A0A8C3 /* information_display.hpp in Headers */, 675346671A4054E800A0A8C3 /* ge0_parser.hpp in Headers */, 675346A21A4054E800A0A8C3 /* user_mark.hpp in Headers */, - 675346841A4054E800A0A8C3 /* rotate_screen_task.hpp in Headers */, - 6753464F1A4054E800A0A8C3 /* compass_arrow.hpp in Headers */, - 6753463C1A4054E800A0A8C3 /* alfa_animation_task.hpp in Headers */, 34921F661BFA0A6900737D6E /* api_mark_point.hpp in Headers */, - 675346451A4054E800A0A8C3 /* benchmark_engine.hpp in Headers */, 675346751A4054E800A0A8C3 /* mwm_url.hpp in Headers */, 6753464B1A4054E800A0A8C3 /* bookmark.hpp in Headers */, - 675346401A4054E800A0A8C3 /* animator.hpp in Headers */, - 675346771A4054E800A0A8C3 /* navigator.hpp in Headers */, 34921F681BFA0A6900737D6E /* styled_point.hpp in Headers */, - 6753467E1A4054E800A0A8C3 /* qgl_render_context.hpp in Headers */, - 6753466F1A4054E800A0A8C3 /* location_state.hpp in Headers */, 6753469E1A4054E800A0A8C3 /* user_mark_container.hpp in Headers */, 34921F651BFA0A6900737D6E /* api_mark_container.hpp in Headers */, 675346491A4054E800A0A8C3 /* bookmark_manager.hpp in Headers */, - 6753467A1A4054E800A0A8C3 /* pin_click_manager.hpp in Headers */, - 675346731A4054E800A0A8C3 /* move_screen_task.hpp in Headers */, 675346631A4054E800A0A8C3 /* feature_vec_model.hpp in Headers */, - 675346511A4054E800A0A8C3 /* country_status_display.hpp in Headers */, 6753469C1A4054E800A0A8C3 /* track.hpp in Headers */, 675346391A4054E800A0A8C3 /* active_maps_layout.hpp in Headers */, - 6753463E1A4054E800A0A8C3 /* anim_phase_chain.hpp in Headers */, - 674A29C81B26F844001A525C /* navigator_utils.hpp in Headers */, - 675346A01A4054E800A0A8C3 /* user_mark_dl_cache.hpp in Headers */, 675346651A4054E800A0A8C3 /* framework.hpp in Headers */, 675346531A4054E800A0A8C3 /* country_tree.hpp in Headers */, + 674C38611BFF3095000D603B /* storage_bridge.hpp in Headers */, 674A2A381B2715FB001A525C /* osm_opening_hours.hpp in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -598,36 +478,20 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 675346791A4054E800A0A8C3 /* pin_click_manager.cpp in Sources */, - 675346441A4054E800A0A8C3 /* benchmark_engine.cpp in Sources */, 675346481A4054E800A0A8C3 /* bookmark_manager.cpp in Sources */, 675346741A4054E800A0A8C3 /* mwm_url.cpp in Sources */, - 6753469F1A4054E800A0A8C3 /* user_mark_dl_cache.cpp in Sources */, - 675346831A4054E800A0A8C3 /* rotate_screen_task.cpp in Sources */, 675346521A4054E800A0A8C3 /* country_tree.cpp in Sources */, - 674A29C71B26F83C001A525C /* navigator_utils.cpp in Sources */, 6753469B1A4054E800A0A8C3 /* track.cpp in Sources */, 675346621A4054E800A0A8C3 /* feature_vec_model.cpp in Sources */, - 675346871A4054E800A0A8C3 /* ruler.cpp in Sources */, - 675346761A4054E800A0A8C3 /* navigator.cpp in Sources */, - 6753463F1A4054E800A0A8C3 /* animator.cpp in Sources */, 6753469D1A4054E800A0A8C3 /* user_mark_container.cpp in Sources */, - 6753466E1A4054E800A0A8C3 /* location_state.cpp in Sources */, - 6753463D1A4054E800A0A8C3 /* anim_phase_chain.cpp in Sources */, 34921F641BFA0A6900737D6E /* api_mark_container.cpp in Sources */, - 6753463B1A4054E800A0A8C3 /* alfa_animation_task.cpp in Sources */, - 6753464C1A4054E800A0A8C3 /* change_viewport_task.cpp in Sources */, - 6753466C1A4054E800A0A8C3 /* information_display.cpp in Sources */, - 675346501A4054E800A0A8C3 /* country_status_display.cpp in Sources */, - 6753464E1A4054E800A0A8C3 /* compass_arrow.cpp in Sources */, + 674C38621BFF3095000D603B /* user_mark.cpp in Sources */, 675346641A4054E800A0A8C3 /* framework.cpp in Sources */, 6753466A1A4054E800A0A8C3 /* geourl_process.cpp in Sources */, - 675346461A4054E800A0A8C3 /* benchmark_provider.cpp in Sources */, + 674C38601BFF3095000D603B /* storage_bridge.cpp in Sources */, 675346661A4054E800A0A8C3 /* ge0_parser.cpp in Sources */, 6753463A1A4054E800A0A8C3 /* address_finder.cpp in Sources */, - 67A2526C1BB42E4B0063F8A8 /* qgl_render_context.cpp in Sources */, 675346381A4054E800A0A8C3 /* active_maps_layout.cpp in Sources */, - 675346721A4054E800A0A8C3 /* move_screen_task.cpp in Sources */, 6753464A1A4054E800A0A8C3 /* bookmark.cpp in Sources */, 34921F671BFA0A6900737D6E /* styled_point.cpp in Sources */, ); @@ -735,6 +599,7 @@ "$(QT_PATH)/include", "$(OMIM_ROOT)/3party/freetype/include", "$(OMIM_ROOT)/3party/expat/lib", + "$(OMIM_ROOT)/3party/glm", ); MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; @@ -781,6 +646,7 @@ "$(QT_PATH)/include", "$(OMIM_ROOT)/3party/freetype/include", "$(OMIM_ROOT)/3party/expat/lib", + "$(OMIM_ROOT)/3party/glm", ); MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; diff --git a/xcode/mapshot/mapshot.xcodeproj/project.pbxproj b/xcode/mapshot/mapshot.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..f721511b6b --- /dev/null +++ b/xcode/mapshot/mapshot.xcodeproj/project.pbxproj @@ -0,0 +1,431 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 675D213D1BFB717400717E4F /* mapshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675D213C1BFB717400717E4F /* mapshot.cpp */; }; + 675D21411BFB76B000717E4F /* libbase.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D213E1BFB76B000717E4F /* libbase.a */; }; + 675D21431BFB76B000717E4F /* libmap.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21401BFB76B000717E4F /* libmap.a */; }; + 675D21551BFB779A00717E4F /* libalohalitics.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21441BFB779A00717E4F /* libalohalitics.a */; }; + 675D21561BFB779A00717E4F /* libcoding.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21451BFB779A00717E4F /* libcoding.a */; }; + 675D21571BFB779A00717E4F /* libdrape_frontend.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21461BFB779A00717E4F /* libdrape_frontend.a */; }; + 675D21581BFB779A00717E4F /* libdrape.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21471BFB779A00717E4F /* libdrape.a */; }; + 675D21591BFB779A00717E4F /* libexpat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21481BFB779A00717E4F /* libexpat.a */; }; + 675D215A1BFB779A00717E4F /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21491BFB779A00717E4F /* libfreetype.a */; }; + 675D215B1BFB779A00717E4F /* libfribidi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D214A1BFB779A00717E4F /* libfribidi.a */; }; + 675D215C1BFB779A00717E4F /* libindexer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D214B1BFB779A00717E4F /* libindexer.a */; }; + 675D215D1BFB779A00717E4F /* libjansson.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D214C1BFB779A00717E4F /* libjansson.a */; }; + 675D215E1BFB779A00717E4F /* libosrm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D214D1BFB779A00717E4F /* libosrm.a */; }; + 675D215F1BFB779A00717E4F /* libplatform.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D214E1BFB779A00717E4F /* libplatform.a */; }; + 675D21601BFB779A00717E4F /* libprotobuf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D214F1BFB779A00717E4F /* libprotobuf.a */; }; + 675D21611BFB779A00717E4F /* librouting.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21501BFB779A00717E4F /* librouting.a */; }; + 675D21621BFB779A00717E4F /* libsearch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21511BFB779A00717E4F /* libsearch.a */; }; + 675D21631BFB779A00717E4F /* libstorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21521BFB779A00717E4F /* libstorage.a */; }; + 675D21641BFB779A00717E4F /* libsuccinct.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21531BFB779A00717E4F /* libsuccinct.a */; }; + 675D21651BFB779A00717E4F /* libtomcrypt.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21541BFB779A00717E4F /* libtomcrypt.a */; }; + 675D21721BFB827B00717E4F /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21711BFB827B00717E4F /* CoreLocation.framework */; }; + 675D21741BFB828200717E4F /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21731BFB828200717E4F /* OpenGL.framework */; }; + 675D21761BFB828900717E4F /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21751BFB828900717E4F /* CoreFoundation.framework */; }; + 675D21781BFB829000717E4F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21771BFB829000717E4F /* Cocoa.framework */; }; + 675D217D1BFB84BA00717E4F /* libapi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21791BFB84BA00717E4F /* libapi.a */; }; + 675D217E1BFB84BA00717E4F /* libgeometry.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D217A1BFB84BA00717E4F /* libgeometry.a */; }; + 675D217F1BFB84BA00717E4F /* libminizip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D217B1BFB84BA00717E4F /* libminizip.a */; }; + 675D21801BFB84BA00717E4F /* libopening_hours.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D217C1BFB84BA00717E4F /* libopening_hours.a */; }; + 675D21821BFB85E800717E4F /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21811BFB85E800717E4F /* libz.tbd */; }; + 675D21841BFB86F400717E4F /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21831BFB86F400717E4F /* IOKit.framework */; }; + 675D21C91BFB8F7C00717E4F /* libsdf_image.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21C71BFB8F7C00717E4F /* libsdf_image.a */; }; + 675D21CA1BFB8F7C00717E4F /* libstb_image.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21C81BFB8F7C00717E4F /* libstb_image.a */; }; + 675D21CC1BFB907F00717E4F /* liblodepng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21CB1BFB907F00717E4F /* liblodepng.a */; }; + 675D21CF1BFDDF9300717E4F /* libgflags.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675D21CE1BFDDF9300717E4F /* libgflags.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 675D212F1BFB6F3D00717E4F /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 675D21311BFB6F3D00717E4F /* mapshot */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mapshot; sourceTree = BUILT_PRODUCTS_DIR; }; + 675D213B1BFB6F7E00717E4F /* defaults.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = defaults.xcconfig; path = ../defaults.xcconfig; sourceTree = ""; }; + 675D213C1BFB717400717E4F /* mapshot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mapshot.cpp; sourceTree = ""; }; + 675D213E1BFB76B000717E4F /* libbase.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libbase.a; path = "/Volumes/AltHD/mapsme/omim/xcode/base/../../../omim-xcode-build/Debug/libbase.a"; sourceTree = ""; }; + 675D21401BFB76B000717E4F /* libmap.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmap.a; path = "/Volumes/AltHD/mapsme/omim/xcode/map/../../../omim-xcode-build/Debug/libmap.a"; sourceTree = ""; }; + 675D21441BFB779A00717E4F /* libalohalitics.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libalohalitics.a; path = "/Volumes/AltHD/mapsme/omim/xcode/alohalitics/../../../omim-xcode-build/Debug/libalohalitics.a"; sourceTree = ""; }; + 675D21451BFB779A00717E4F /* libcoding.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcoding.a; path = "/Volumes/AltHD/mapsme/omim/xcode/coding/../../../omim-xcode-build/Debug/libcoding.a"; sourceTree = ""; }; + 675D21461BFB779A00717E4F /* libdrape_frontend.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libdrape_frontend.a; path = "/Volumes/AltHD/mapsme/omim/xcode/drape_frontend/../../../omim-xcode-build/Debug/libdrape_frontend.a"; sourceTree = ""; }; + 675D21471BFB779A00717E4F /* libdrape.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libdrape.a; path = "/Volumes/AltHD/mapsme/omim/xcode/drape/../../../omim-xcode-build/Debug/libdrape.a"; sourceTree = ""; }; + 675D21481BFB779A00717E4F /* libexpat.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libexpat.a; path = "/Volumes/AltHD/mapsme/omim/xcode/expat/../../../omim-xcode-build/Debug/libexpat.a"; sourceTree = ""; }; + 675D21491BFB779A00717E4F /* libfreetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfreetype.a; path = "/Volumes/AltHD/mapsme/omim/xcode/freetype/../../../omim-xcode-build/Debug/libfreetype.a"; sourceTree = ""; }; + 675D214A1BFB779A00717E4F /* libfribidi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfribidi.a; path = "/Volumes/AltHD/mapsme/omim/xcode/fribidi/../../../omim-xcode-build/Debug/libfribidi.a"; sourceTree = ""; }; + 675D214B1BFB779A00717E4F /* libindexer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libindexer.a; path = "/Volumes/AltHD/mapsme/omim/xcode/indexer/../../../omim-xcode-build/Debug/libindexer.a"; sourceTree = ""; }; + 675D214C1BFB779A00717E4F /* libjansson.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjansson.a; path = "/Volumes/AltHD/mapsme/omim/xcode/jansson/../../../omim-xcode-build/Debug/libjansson.a"; sourceTree = ""; }; + 675D214D1BFB779A00717E4F /* libosrm.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libosrm.a; path = "/Volumes/AltHD/mapsme/omim/xcode/osrm/../../../omim-xcode-build/Debug/libosrm.a"; sourceTree = ""; }; + 675D214E1BFB779A00717E4F /* libplatform.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libplatform.a; path = "/Volumes/AltHD/mapsme/omim/xcode/platform/../../../omim-xcode-build/Debug/libplatform.a"; sourceTree = ""; }; + 675D214F1BFB779A00717E4F /* libprotobuf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libprotobuf.a; path = "/Volumes/AltHD/mapsme/omim/xcode/protobuf/../../../omim-xcode-build/Debug/libprotobuf.a"; sourceTree = ""; }; + 675D21501BFB779A00717E4F /* librouting.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = librouting.a; path = "/Volumes/AltHD/mapsme/omim/xcode/routing/../../../omim-xcode-build/Debug/librouting.a"; sourceTree = ""; }; + 675D21511BFB779A00717E4F /* libsearch.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsearch.a; path = "/Volumes/AltHD/mapsme/omim/xcode/search/../../../omim-xcode-build/Debug/libsearch.a"; sourceTree = ""; }; + 675D21521BFB779A00717E4F /* libstorage.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libstorage.a; path = "/Volumes/AltHD/mapsme/omim/xcode/storage/../../../omim-xcode-build/Debug/libstorage.a"; sourceTree = ""; }; + 675D21531BFB779A00717E4F /* libsuccinct.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsuccinct.a; path = "/Volumes/AltHD/mapsme/omim/xcode/succinct/../../../omim-xcode-build/Debug/libsuccinct.a"; sourceTree = ""; }; + 675D21541BFB779A00717E4F /* libtomcrypt.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtomcrypt.a; path = "/Volumes/AltHD/mapsme/omim/xcode/tomcrypt/../../../omim-xcode-build/Debug/libtomcrypt.a"; sourceTree = ""; }; + 675D21711BFB827B00717E4F /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 675D21731BFB828200717E4F /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + 675D21751BFB828900717E4F /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; + 675D21771BFB829000717E4F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 675D21791BFB84BA00717E4F /* libapi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libapi.a; path = "/Volumes/AltHD/mapsme/omim/xcode/api/../../../omim-xcode-build/Debug/libapi.a"; sourceTree = ""; }; + 675D217A1BFB84BA00717E4F /* libgeometry.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgeometry.a; path = "/Volumes/AltHD/mapsme/omim/xcode/geometry/../../../omim-xcode-build/Debug/libgeometry.a"; sourceTree = ""; }; + 675D217B1BFB84BA00717E4F /* libminizip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libminizip.a; path = "/Volumes/AltHD/mapsme/omim/xcode/minizip/../../../omim-xcode-build/Debug/libminizip.a"; sourceTree = ""; }; + 675D217C1BFB84BA00717E4F /* libopening_hours.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopening_hours.a; path = "/Volumes/AltHD/mapsme/omim/xcode/opening_hours/../../../omim-xcode-build/Debug/libopening_hours.a"; sourceTree = ""; }; + 675D21811BFB85E800717E4F /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 675D21831BFB86F400717E4F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + 675D21C71BFB8F7C00717E4F /* libsdf_image.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsdf_image.a; path = "../../../omim-xcode-build/Debug/libsdf_image.a"; sourceTree = ""; }; + 675D21C81BFB8F7C00717E4F /* libstb_image.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libstb_image.a; path = "../../../omim-xcode-build/Debug/libstb_image.a"; sourceTree = ""; }; + 675D21CB1BFB907F00717E4F /* liblodepng.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblodepng.a; path = "../../../omim-xcode-build/Debug/liblodepng.a"; sourceTree = ""; }; + 675D21CE1BFDDF9300717E4F /* libgflags.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgflags.a; path = "/Volumes/AltHD/mapsme/omim/xcode/gflags/../../../omim-xcode-build/Debug/libgflags.a"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 675D212E1BFB6F3D00717E4F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 675D21CF1BFDDF9300717E4F /* libgflags.a in Frameworks */, + 675D21CC1BFB907F00717E4F /* liblodepng.a in Frameworks */, + 675D21C91BFB8F7C00717E4F /* libsdf_image.a in Frameworks */, + 675D21CA1BFB8F7C00717E4F /* libstb_image.a in Frameworks */, + 675D21841BFB86F400717E4F /* IOKit.framework in Frameworks */, + 675D21821BFB85E800717E4F /* libz.tbd in Frameworks */, + 675D217D1BFB84BA00717E4F /* libapi.a in Frameworks */, + 675D217E1BFB84BA00717E4F /* libgeometry.a in Frameworks */, + 675D217F1BFB84BA00717E4F /* libminizip.a in Frameworks */, + 675D21801BFB84BA00717E4F /* libopening_hours.a in Frameworks */, + 675D21781BFB829000717E4F /* Cocoa.framework in Frameworks */, + 675D21761BFB828900717E4F /* CoreFoundation.framework in Frameworks */, + 675D21741BFB828200717E4F /* OpenGL.framework in Frameworks */, + 675D21721BFB827B00717E4F /* CoreLocation.framework in Frameworks */, + 675D21551BFB779A00717E4F /* libalohalitics.a in Frameworks */, + 675D21561BFB779A00717E4F /* libcoding.a in Frameworks */, + 675D21571BFB779A00717E4F /* libdrape_frontend.a in Frameworks */, + 675D21581BFB779A00717E4F /* libdrape.a in Frameworks */, + 675D21591BFB779A00717E4F /* libexpat.a in Frameworks */, + 675D215A1BFB779A00717E4F /* libfreetype.a in Frameworks */, + 675D215B1BFB779A00717E4F /* libfribidi.a in Frameworks */, + 675D215C1BFB779A00717E4F /* libindexer.a in Frameworks */, + 675D215D1BFB779A00717E4F /* libjansson.a in Frameworks */, + 675D215E1BFB779A00717E4F /* libosrm.a in Frameworks */, + 675D215F1BFB779A00717E4F /* libplatform.a in Frameworks */, + 675D21601BFB779A00717E4F /* libprotobuf.a in Frameworks */, + 675D21611BFB779A00717E4F /* librouting.a in Frameworks */, + 675D21621BFB779A00717E4F /* libsearch.a in Frameworks */, + 675D21631BFB779A00717E4F /* libstorage.a in Frameworks */, + 675D21641BFB779A00717E4F /* libsuccinct.a in Frameworks */, + 675D21651BFB779A00717E4F /* libtomcrypt.a in Frameworks */, + 675D21411BFB76B000717E4F /* libbase.a in Frameworks */, + 675D21431BFB76B000717E4F /* libmap.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 675D21281BFB6F3D00717E4F = { + isa = PBXGroup; + children = ( + 675D21CD1BFB90AD00717E4F /* Libs */, + 675D213B1BFB6F7E00717E4F /* defaults.xcconfig */, + 675D21331BFB6F3D00717E4F /* mapshot */, + 675D21321BFB6F3D00717E4F /* Products */, + ); + sourceTree = ""; + }; + 675D21321BFB6F3D00717E4F /* Products */ = { + isa = PBXGroup; + children = ( + 675D21311BFB6F3D00717E4F /* mapshot */, + ); + name = Products; + sourceTree = ""; + }; + 675D21331BFB6F3D00717E4F /* mapshot */ = { + isa = PBXGroup; + children = ( + 675D213C1BFB717400717E4F /* mapshot.cpp */, + ); + name = mapshot; + path = ../../mapshot; + sourceTree = ""; + }; + 675D21CD1BFB90AD00717E4F /* Libs */ = { + isa = PBXGroup; + children = ( + 675D21CE1BFDDF9300717E4F /* libgflags.a */, + 675D21CB1BFB907F00717E4F /* liblodepng.a */, + 675D21C71BFB8F7C00717E4F /* libsdf_image.a */, + 675D21C81BFB8F7C00717E4F /* libstb_image.a */, + 675D21831BFB86F400717E4F /* IOKit.framework */, + 675D21811BFB85E800717E4F /* libz.tbd */, + 675D21791BFB84BA00717E4F /* libapi.a */, + 675D217A1BFB84BA00717E4F /* libgeometry.a */, + 675D217B1BFB84BA00717E4F /* libminizip.a */, + 675D217C1BFB84BA00717E4F /* libopening_hours.a */, + 675D21771BFB829000717E4F /* Cocoa.framework */, + 675D21751BFB828900717E4F /* CoreFoundation.framework */, + 675D21731BFB828200717E4F /* OpenGL.framework */, + 675D21711BFB827B00717E4F /* CoreLocation.framework */, + 675D21441BFB779A00717E4F /* libalohalitics.a */, + 675D21451BFB779A00717E4F /* libcoding.a */, + 675D21461BFB779A00717E4F /* libdrape_frontend.a */, + 675D21471BFB779A00717E4F /* libdrape.a */, + 675D21481BFB779A00717E4F /* libexpat.a */, + 675D21491BFB779A00717E4F /* libfreetype.a */, + 675D214A1BFB779A00717E4F /* libfribidi.a */, + 675D214B1BFB779A00717E4F /* libindexer.a */, + 675D214C1BFB779A00717E4F /* libjansson.a */, + 675D214D1BFB779A00717E4F /* libosrm.a */, + 675D214E1BFB779A00717E4F /* libplatform.a */, + 675D214F1BFB779A00717E4F /* libprotobuf.a */, + 675D21501BFB779A00717E4F /* librouting.a */, + 675D21511BFB779A00717E4F /* libsearch.a */, + 675D21521BFB779A00717E4F /* libstorage.a */, + 675D21531BFB779A00717E4F /* libsuccinct.a */, + 675D21541BFB779A00717E4F /* libtomcrypt.a */, + 675D213E1BFB76B000717E4F /* libbase.a */, + 675D21401BFB76B000717E4F /* libmap.a */, + ); + name = Libs; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 675D21301BFB6F3D00717E4F /* mapshot */ = { + isa = PBXNativeTarget; + buildConfigurationList = 675D21381BFB6F3D00717E4F /* Build configuration list for PBXNativeTarget "mapshot" */; + buildPhases = ( + 675D212D1BFB6F3D00717E4F /* Sources */, + 675D212E1BFB6F3D00717E4F /* Frameworks */, + 675D212F1BFB6F3D00717E4F /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = mapshot; + productName = mapshot; + productReference = 675D21311BFB6F3D00717E4F /* mapshot */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 675D21291BFB6F3D00717E4F /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0710; + ORGANIZATIONNAME = maps.me; + TargetAttributes = { + 675D21301BFB6F3D00717E4F = { + CreatedOnToolsVersion = 7.1.1; + }; + }; + }; + buildConfigurationList = 675D212C1BFB6F3D00717E4F /* Build configuration list for PBXProject "mapshot" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 675D21281BFB6F3D00717E4F; + productRefGroup = 675D21321BFB6F3D00717E4F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 675D21301BFB6F3D00717E4F /* mapshot */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 675D212D1BFB6F3D00717E4F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 675D213D1BFB717400717E4F /* mapshot.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 675D21361BFB6F3D00717E4F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 675D213B1BFB6F7E00717E4F /* defaults.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = "$(QT_PATH)/lib"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(OMIM_ROOT)", + "$(BOOST_ROOT)", + "$(OMIM_ROOT)/3party/glm", + "$(OMIM_ROOT)/3party/gflags/src/", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-framework", + QtCore, + "-framework", + QtNetwork, + "-framework", + QtWidgets, + "-framework", + QtOpenGL, + "-framework", + QtGui, + "-framework", + SystemConfiguration, + ); + SDKROOT = macosx; + }; + name = Debug; + }; + 675D21371BFB6F3D00717E4F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 675D213B1BFB6F7E00717E4F /* defaults.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = "$(QT_PATH)/lib"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(OMIM_ROOT)", + "$(BOOST_ROOT)", + "$(OMIM_ROOT)/3party/glm", + "$(OMIM_ROOT)/3party/gflags/src/", + ); + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ( + "-framework", + QtCore, + "-framework", + QtNetwork, + "-framework", + QtWidgets, + "-framework", + QtOpenGL, + "-framework", + QtGui, + "-framework", + SystemConfiguration, + ); + SDKROOT = macosx; + }; + name = Release; + }; + 675D21391BFB6F3D00717E4F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 675D213A1BFB6F3D00717E4F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 675D212C1BFB6F3D00717E4F /* Build configuration list for PBXProject "mapshot" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 675D21361BFB6F3D00717E4F /* Debug */, + 675D21371BFB6F3D00717E4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 675D21381BFB6F3D00717E4F /* Build configuration list for PBXNativeTarget "mapshot" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 675D21391BFB6F3D00717E4F /* Debug */, + 675D213A1BFB6F3D00717E4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 675D21291BFB6F3D00717E4F /* Project object */; +} diff --git a/xcode/omim.xcworkspace/contents.xcworkspacedata b/xcode/omim.xcworkspace/contents.xcworkspacedata index 21f4cc2621..8ecd0d496d 100644 --- a/xcode/omim.xcworkspace/contents.xcworkspacedata +++ b/xcode/omim.xcworkspace/contents.xcworkspacedata @@ -52,6 +52,12 @@ + + + + @@ -68,6 +74,9 @@ + + @@ -114,4 +123,7 @@ location = "group:../iphone/Maps/Maps.xcodeproj"> + + diff --git a/xcode/sdf_image/sdf_image.xcodeproj/project.pbxproj b/xcode/sdf_image/sdf_image.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..b8c6cb6352 --- /dev/null +++ b/xcode/sdf_image/sdf_image.xcodeproj/project.pbxproj @@ -0,0 +1,255 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 675D21AF1BFB8D8A00717E4F /* sdf_image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675D21AD1BFB8D8A00717E4F /* sdf_image.cpp */; }; + 675D21B01BFB8D8A00717E4F /* sdf_image.h in Headers */ = {isa = PBXBuildFile; fileRef = 675D21AE1BFB8D8A00717E4F /* sdf_image.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 675D21A41BFB8D3F00717E4F /* libsdf_image.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libsdf_image.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 675D21AB1BFB8D4900717E4F /* defaults.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = defaults.xcconfig; path = ../defaults.xcconfig; sourceTree = ""; }; + 675D21AD1BFB8D8A00717E4F /* sdf_image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sdf_image.cpp; sourceTree = ""; }; + 675D21AE1BFB8D8A00717E4F /* sdf_image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sdf_image.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 675D21A11BFB8D3F00717E4F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 675D219B1BFB8D3F00717E4F = { + isa = PBXGroup; + children = ( + 675D21AC1BFB8D6700717E4F /* sdf_image */, + 675D21AB1BFB8D4900717E4F /* defaults.xcconfig */, + 675D21A51BFB8D3F00717E4F /* Products */, + ); + sourceTree = ""; + }; + 675D21A51BFB8D3F00717E4F /* Products */ = { + isa = PBXGroup; + children = ( + 675D21A41BFB8D3F00717E4F /* libsdf_image.a */, + ); + name = Products; + sourceTree = ""; + }; + 675D21AC1BFB8D6700717E4F /* sdf_image */ = { + isa = PBXGroup; + children = ( + 675D21AD1BFB8D8A00717E4F /* sdf_image.cpp */, + 675D21AE1BFB8D8A00717E4F /* sdf_image.h */, + ); + name = sdf_image; + path = ../../3party/sdf_image; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 675D21A21BFB8D3F00717E4F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 675D21B01BFB8D8A00717E4F /* sdf_image.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 675D21A31BFB8D3F00717E4F /* sdf_image */ = { + isa = PBXNativeTarget; + buildConfigurationList = 675D21A81BFB8D3F00717E4F /* Build configuration list for PBXNativeTarget "sdf_image" */; + buildPhases = ( + 675D21A01BFB8D3F00717E4F /* Sources */, + 675D21A11BFB8D3F00717E4F /* Frameworks */, + 675D21A21BFB8D3F00717E4F /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = sdf_image; + productName = sdf_image; + productReference = 675D21A41BFB8D3F00717E4F /* libsdf_image.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 675D219C1BFB8D3F00717E4F /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0710; + ORGANIZATIONNAME = maps.me; + TargetAttributes = { + 675D21A31BFB8D3F00717E4F = { + CreatedOnToolsVersion = 7.1.1; + }; + }; + }; + buildConfigurationList = 675D219F1BFB8D3F00717E4F /* Build configuration list for PBXProject "sdf_image" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 675D219B1BFB8D3F00717E4F; + productRefGroup = 675D21A51BFB8D3F00717E4F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 675D21A31BFB8D3F00717E4F /* sdf_image */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 675D21A01BFB8D3F00717E4F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 675D21AF1BFB8D8A00717E4F /* sdf_image.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 675D21A61BFB8D3F00717E4F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 675D21AB1BFB8D4900717E4F /* defaults.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; + }; + name = Debug; + }; + 675D21A71BFB8D3F00717E4F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 675D21AB1BFB8D4900717E4F /* defaults.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; + }; + name = Release; + }; + 675D21A91BFB8D3F00717E4F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 675D21AA1BFB8D3F00717E4F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 675D219F1BFB8D3F00717E4F /* Build configuration list for PBXProject "sdf_image" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 675D21A61BFB8D3F00717E4F /* Debug */, + 675D21A71BFB8D3F00717E4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 675D21A81BFB8D3F00717E4F /* Build configuration list for PBXNativeTarget "sdf_image" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 675D21A91BFB8D3F00717E4F /* Debug */, + 675D21AA1BFB8D3F00717E4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 675D219C1BFB8D3F00717E4F /* Project object */; +} diff --git a/xcode/stb_image/stb_image.xcodeproj/project.pbxproj b/xcode/stb_image/stb_image.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..ba03ef5e4f --- /dev/null +++ b/xcode/stb_image/stb_image.xcodeproj/project.pbxproj @@ -0,0 +1,255 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 675D21C51BFB8F2B00717E4F /* stb_image.c in Sources */ = {isa = PBXBuildFile; fileRef = 675D21C31BFB8F2B00717E4F /* stb_image.c */; }; + 675D21C61BFB8F2B00717E4F /* stb_image.h in Headers */ = {isa = PBXBuildFile; fileRef = 675D21C41BFB8F2B00717E4F /* stb_image.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 675D21BA1BFB8DBA00717E4F /* libstb_image.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libstb_image.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 675D21C11BFB8DC900717E4F /* defaults.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = defaults.xcconfig; path = ../defaults.xcconfig; sourceTree = ""; }; + 675D21C31BFB8F2B00717E4F /* stb_image.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stb_image.c; sourceTree = ""; }; + 675D21C41BFB8F2B00717E4F /* stb_image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stb_image.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 675D21B71BFB8DBA00717E4F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 675D21B11BFB8DBA00717E4F = { + isa = PBXGroup; + children = ( + 675D21C21BFB8F1000717E4F /* stb_image */, + 675D21C11BFB8DC900717E4F /* defaults.xcconfig */, + 675D21BB1BFB8DBA00717E4F /* Products */, + ); + sourceTree = ""; + }; + 675D21BB1BFB8DBA00717E4F /* Products */ = { + isa = PBXGroup; + children = ( + 675D21BA1BFB8DBA00717E4F /* libstb_image.a */, + ); + name = Products; + sourceTree = ""; + }; + 675D21C21BFB8F1000717E4F /* stb_image */ = { + isa = PBXGroup; + children = ( + 675D21C31BFB8F2B00717E4F /* stb_image.c */, + 675D21C41BFB8F2B00717E4F /* stb_image.h */, + ); + name = stb_image; + path = ../../3party/stb_image; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 675D21B81BFB8DBA00717E4F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 675D21C61BFB8F2B00717E4F /* stb_image.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 675D21B91BFB8DBA00717E4F /* stb_image */ = { + isa = PBXNativeTarget; + buildConfigurationList = 675D21BE1BFB8DBA00717E4F /* Build configuration list for PBXNativeTarget "stb_image" */; + buildPhases = ( + 675D21B61BFB8DBA00717E4F /* Sources */, + 675D21B71BFB8DBA00717E4F /* Frameworks */, + 675D21B81BFB8DBA00717E4F /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = stb_image; + productName = stb_image; + productReference = 675D21BA1BFB8DBA00717E4F /* libstb_image.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 675D21B21BFB8DBA00717E4F /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0710; + ORGANIZATIONNAME = maps.me; + TargetAttributes = { + 675D21B91BFB8DBA00717E4F = { + CreatedOnToolsVersion = 7.1.1; + }; + }; + }; + buildConfigurationList = 675D21B51BFB8DBA00717E4F /* Build configuration list for PBXProject "stb_image" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 675D21B11BFB8DBA00717E4F; + productRefGroup = 675D21BB1BFB8DBA00717E4F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 675D21B91BFB8DBA00717E4F /* stb_image */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 675D21B61BFB8DBA00717E4F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 675D21C51BFB8F2B00717E4F /* stb_image.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 675D21BC1BFB8DBA00717E4F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 675D21C11BFB8DC900717E4F /* defaults.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; + }; + name = Debug; + }; + 675D21BD1BFB8DBA00717E4F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 675D21C11BFB8DC900717E4F /* defaults.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; + }; + name = Release; + }; + 675D21BF1BFB8DBA00717E4F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 675D21C01BFB8DBA00717E4F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 675D21B51BFB8DBA00717E4F /* Build configuration list for PBXProject "stb_image" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 675D21BC1BFB8DBA00717E4F /* Debug */, + 675D21BD1BFB8DBA00717E4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 675D21BE1BFB8DBA00717E4F /* Build configuration list for PBXNativeTarget "stb_image" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 675D21BF1BFB8DBA00717E4F /* Debug */, + 675D21C01BFB8DBA00717E4F /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 675D21B21BFB8DBA00717E4F /* Project object */; +}