diff options
48 files changed, 440 insertions, 285 deletions
diff --git a/android/UnitTests/jni/mock.cpp b/android/UnitTests/jni/mock.cpp index 2b48f0102e..8b65b31899 100644 --- a/android/UnitTests/jni/mock.cpp +++ b/android/UnitTests/jni/mock.cpp @@ -76,7 +76,7 @@ namespace android_tests JavaVM * m_Vm; JNIEnv * m_Env; public: - MainThreadScopeGuard(JavaVM * vm) : m_Vm(vm), m_Env(nullptr) + explicit MainThreadScopeGuard(JavaVM * vm) : m_Vm(vm), m_Env(nullptr) { assert(vm); m_Vm->AttachCurrentThread(&m_Env, NULL); diff --git a/android/jni/com/mapswithme/maps/VideoTimer.hpp b/android/jni/com/mapswithme/maps/VideoTimer.hpp index be4b7dab58..439954329a 100644 --- a/android/jni/com/mapswithme/maps/VideoTimer.hpp +++ b/android/jni/com/mapswithme/maps/VideoTimer.hpp @@ -13,7 +13,7 @@ namespace android public: - VideoTimer(TFrameFn frameFn); + explicit VideoTimer(TFrameFn frameFn); ~VideoTimer(); void SetParentObject(jobject videoTimer); diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 6850be27ef..fb65c72da8 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -1264,13 +1264,12 @@ public class MwmActivity extends BaseMwmFragmentActivity return; } - if (mSearchController.hide()) + if (mSearchController != null && mSearchController.hide()) { SearchEngine.INSTANCE.cancelInteractiveSearch(); if (mFilterController != null) mFilterController.resetFilter(); - if (mSearchController != null) - mSearchController.clear(); + mSearchController.clear(); return; } diff --git a/android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java b/android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java index fd25569527..ba20345f7e 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java @@ -72,7 +72,7 @@ public class CatalogTag implements Parcelable if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CatalogTag that = (CatalogTag) o; - return mId.equals(that.mId) || mId.equals(that.mId); + return mId.equals(that.mId); } @Override diff --git a/android/src/com/mapswithme/util/log/ZipLogsTask.java b/android/src/com/mapswithme/util/log/ZipLogsTask.java index bf78051e45..58c1759d7d 100644 --- a/android/src/com/mapswithme/util/log/ZipLogsTask.java +++ b/android/src/com/mapswithme/util/log/ZipLogsTask.java @@ -55,29 +55,32 @@ class ZipLogsTask implements Runnable private boolean zipFileAtPath(@NonNull String sourcePath, @NonNull String toLocation) { File sourceFile = new File(sourcePath); - try + try(FileOutputStream dest = new FileOutputStream(toLocation, false); + ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest))) { - BufferedInputStream origin; - FileOutputStream dest = new FileOutputStream(toLocation, false); - ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); if (sourceFile.isDirectory()) { zipSubFolder(out, sourceFile, sourceFile.getParent().length()); } else { - byte data[] = new byte[BUFFER_SIZE]; - FileInputStream fi = new FileInputStream(sourcePath); - origin = new BufferedInputStream(fi, BUFFER_SIZE); - ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath)); - out.putNextEntry(entry); - int count; - while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) + try(FileInputStream fi = new FileInputStream(sourcePath); + BufferedInputStream origin = new BufferedInputStream(fi, BUFFER_SIZE);) { - out.write(data, 0, count); + ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath)); + out.putNextEntry(entry); + byte data[] = new byte[BUFFER_SIZE]; + int count; + while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) { + out.write(data, 0, count); + } + } catch (Exception e) + { + Log.e(TAG, "Failed to read zip file entry '" + sourcePath +"' to location '" + + toLocation + "'", e); + return false; } } - out.close(); } catch (Exception e) { diff --git a/base/base_tests/thread_pool_tests.cpp b/base/base_tests/thread_pool_tests.cpp index 07152758bf..1a94bfa64d 100644 --- a/base/base_tests/thread_pool_tests.cpp +++ b/base/base_tests/thread_pool_tests.cpp @@ -92,7 +92,7 @@ namespace class CancelTestTask : public threads::IRoutine { public: - CancelTestTask(bool isWaitDoCall) + explicit CancelTestTask(bool isWaitDoCall) : m_waitDoCall(isWaitDoCall) , m_doCalled(false) { diff --git a/coding/coding_tests/file_container_test.cpp b/coding/coding_tests/file_container_test.cpp index 6ffbdb4f60..2eb64205df 100644 --- a/coding/coding_tests/file_container_test.cpp +++ b/coding/coding_tests/file_container_test.cpp @@ -240,7 +240,7 @@ UNIT_TEST(FilesMappingContainer_MoveHandle) class HandleWrapper { public: - HandleWrapper(FilesMappingContainer::Handle && handle) : m_handle(std::move(handle)) + explicit HandleWrapper(FilesMappingContainer::Handle && handle) : m_handle(std::move(handle)) { TEST(m_handle.IsValid(), ()); } diff --git a/data/categories.txt b/data/categories.txt index eb4624a5e5..54e1a56c53 100644 --- a/data/categories.txt +++ b/data/categories.txt @@ -2189,7 +2189,7 @@ ru:^Место для пикника|3Пикник ar:^مكان نزهة|سياحة|مناظر cs:3^Piknik|picnic|picnik da:3^Picnic -nl:3^Picnicplaats|3picnicweide|3picnictafel +nl:3^Picknickplaats|picknickweide|picknicktafel fi:3^Piknikpaikat fr:3^Terrain de pique-nique|3aire de pique-nique de:3^Picknickplatz|Grillplatz @@ -2707,15 +2707,20 @@ fa:خرابه های تاریخی historic-ship|@tourism en:^Ship|boat ru:^Корабль|судно|лодка +nl:^Schip|boot +de:^Schiff|Boot historic-tomb|@tourism en:^Tomb|grave|memorial ru:^Гробница|склеп|захоронение|могила|кладбище +nl:^Tombe|graf|gedenkteken +de:^Grab|Gedenkstätte leisure-dog_park en:3^Dog area|Dog park ru:^Место для выгула собак|Площадка для собак|4Собачья площадка cs:3^Psí hřiště +nl:4^Hondenpark|Hondengebied de:4^Hundezone|Hundeauslaufzone fi:Koirapuisto he:גינת כלבים @@ -2837,7 +2842,7 @@ it:^Car Sharing ja:^カーシェアリング ko:^카셰어링 nb:^Kjøre sammen -nl:^Autodelen +nl:3^Carpool|Carpoolen|Auto delen|Autodelen pl:^Carsharing pt:^Partilha de carro pt-BR:^Compartilhamento de carro @@ -2858,7 +2863,7 @@ ru:4^Прокат авто|3авто|3машина|прокат|авто нап ar:^تأجير سيارات|سيارة|تأجير|إيجار cs:3^Půjčovna aut|auto|pronájem|nájemné da:4^Biludlejning|bil -nl:3^Autoverhuur|autodelen|auto|huur +nl:3^Autoverhuur|4huurauto|auto delen|auto|huur fi:^Autovuokraamo fr:4^Location de voitures|auto|loueur|location|partage de:3^Autoverleih|Mietauto|Auto|Fahrzeug Mieten|Verleih|KFZ-Vermietung|Fahrzeugvermietung @@ -2891,7 +2896,7 @@ ru:^Кинотеатр|3кино ar:^سينما cs:3^Kino|biograf da:3^Biograf -nl:3^Bioscoop|cinema +nl:3^Bioscoop|filmtheater|cinema fi:^Elokuvateatteri fr:3^Cinéma de:3^Kino|Cinema|Filmtheater|Lichtspielhaus @@ -2957,7 +2962,7 @@ ru:3^Ночной клуб|3дискотека|ночной бар|диско|т ar:^نادي ليلي|رقص cs:4^Noční klub|3disco|3klub da:3^Natklub|dans|danseklub -nl:3^Discotheek|3disco|dansen +nl:3^Discotheek|3disco|dansen|nachtclub fi:^Yökerho fr:3^Discothèque|3boîte de nuit|danse de:3^Nachtclub|Nachtklub|Nachtbar|Nachtlokal|Disko|Tanzen|Club @@ -3214,7 +3219,7 @@ ru:4^Больница ar:^مستشفى cs:4^Nemocnice da:4^Hospital -nl:4^Ziekenhuis +nl:4^Ziekenhuis|hospitaal fi:^Sairaala fr:4^Hôpital de:4^Krankenhaus @@ -3248,9 +3253,9 @@ ru:4госпиталь|врач|доктор|медицинский центр| ar:^عيادة|طبيب|دكتور cs:klinika|pohotovost|zdravotnické centrum|3lékař|doktor da:sygehus -nl:kliniek|hospitaal|tandarts|3dokter +nl:kliniek|hospitaal|3dokter|3eerste hulp fr:clinique|3médecin|3docteur -de:Spital|3Arzt|Doktor|Medizinische Einrichtung|Medizinisches Zentrum|Gesundheitswesen|Ambulanz|Gesundheitsdienstleistungen|Erste Hilfe +de:Spital|Klinik|3Arzt|Doktor|Medizinische Einrichtung|Medizinisches Zentrum|Gesundheitswesen|Ambulanz|Gesundheitsdienstleistungen|Erste Hilfe hu:rendelőintézet|3orvos ja:クリニック|医師|医者|ドクター|救急|診療 ko:의사|의사가 @@ -3274,7 +3279,7 @@ ru:^Поликлиника|клиника|больница|врач|медици ar:^عيادة|مستشفى|طبيب|دكتور cs:^Klinika|nemocnice da:^Klinik|hospital -nl:^Kliniek|ziekenhuis +nl:^Kliniek|ziekenhuis|hospitaal fi:^Klinikka|sairaala fr:^Clinique|hôpital de:^Klinik|Krankenhaus|Ambulanz|Arzt|Diagnostik|Gesundheitsdienstleistungen|Doktor @@ -3306,7 +3311,7 @@ ru:^Врач|больница|клиника|поликлиника ar:^طبيب|عيادة|مستشفى cs:^Lékařská ordinace|Klinika|nemocnice da:^Lægekontor|lægehus|klinik|hospital -nl:^Huisartsenpost|Kliniek|huisarts|ziekenhuis +nl:^Huisartsenpost|Kliniek|huisarts|ziekenhuis|dokter fi:^Lääkärin vastaanotto|Klinikka|sairaala fr:^Cabinet médical|hôpital de:^Arztpraxis|Klinik|Krankenhaus @@ -3369,7 +3374,7 @@ ru:^Охотничья вышка ar:^منصة صيد cs:^Lovecké stanoviště|posed da:^Jagtsted|hochsitz -nl:^Jaagplek +nl:^Jachtplaats|jaagplek fi:^Metsästyspaikka fr:^Mirador de:^Hochsitz|Anstand @@ -3467,9 +3472,9 @@ en:U+1F697|U+1F17F|U+1F698|U+1F699 ru:Автостоянка|парковка ar:^موقف سيارات da:3Parkeringsplads -nl:parking +nl:3Parkeren|parkeerplaats|parking fr:3parking -de:Parking +de:3Parkplatz|Parking ja:パーキング|コインパーキング pt:3Parking pt-BR:3^Estacionamento @@ -3520,9 +3525,10 @@ fa:داروخانه amenity-pharmacy|@pharmacy en:3drugstore|apothecary|dispensary|U+1F489|U+1F48A ar:^متجر أدوية|صيدلية -nl:verdeelstation +nl:Apotheek|drogist fi:3Farmasia fr:dispensaire +de:Apotheke|Drogerie ja:ドラッグストア|薬剤師|調剤|薬屋 ko:약물 매장|약종상 pt:3Farmacêutico @@ -3545,7 +3551,7 @@ da:3^Postboks|3postboks|postkasse|p/o|post nl:3^Brievenbus|post fi:^Postilaatikko fr:3^Boîte aux lettres|courrier -de:3^Briefkasten|3Postfach +de:3^Briefkasten|3Postfach|post hu:3^Postaláda|Levelesláda id:^Kotak pos it:3^Casella @@ -3629,7 +3635,7 @@ ru:^Мусорный контейнер|мусорка ar:^قمامة|مهملات|سلة مهملات|صندوق قمامة cs:^Odpadky|koš|popelnice|uložiště odpadu da:^Bortskaffelse af affald|skraldespand|skrald -nl:^Uitschot|afval|prullenbak|vuilnis +nl:^Afvalcontainer|afval|prullenbak|vuilnis fi:^Roska fr:^Déchets|poubelle|déchet de:^Müllcontainer|Mülltonne|Abfälle|Müll @@ -3662,10 +3668,10 @@ ru:^Приём вторсырья|утиль|сырье|сбор сырья|ст ar:^مركز إعادة تدوير cs:^Recyklační středisko da:^Genbrugsplads -nl:^Milieustraat +nl:^Milieustraat|recycling centrum|milieupark|gemeentewerf fi:^Kierrätyskeskus fr:^Centre de recyclage -de:^Recyclinghof +de:^Recyclinghof|Recyclingzentrum hu:^Hulladékudvar|Újrahasznosító központ|hulladékgyűjtő központ id:^TPA it:^Centro di riciclaggio @@ -3793,7 +3799,7 @@ ru:3^Туалет ar:^حمام cs:3^Záchody da:3^Toilet -nl:3^Toilet +nl:3^Toilet|WC fi:^WC fr:3^Toilettes de:3^Toilette @@ -3825,7 +3831,7 @@ amenity-toilets|@toilet en:wc|5restroom|4bathroom|loo|lavatory|U+1F6BD|U+1F6BE|U+1F4A9|U+1F6BB|U+1F6B9|U+1F6BA ar:^حمام|مرحاض cs:wc|toalety -nl:wc +nl:WC|toilet fr:wc de:WC hu:WC @@ -4043,7 +4049,7 @@ ru:^Округ|графство ar:^مقاطعة cs:^Země da:^Amt -nl:^Graafschap +nl:^Provincie|graafschap fi:^Lääni fr:^Comté de:^Kreis|Bezirk @@ -4141,7 +4147,7 @@ ru:^Остров ar:^جزيرة cs:^Ostrov da:^Ø -nl:^Eilandje +nl:^Eiland|eilandje fi:^Saari fr:^Île|ilôt de:^Insel @@ -4207,7 +4213,7 @@ ru:^Посёлок|деревня ar:^قرية صغيرة|قرية cs:^Vesnička da:^Landsby|landsby -nl:^Gehucht|buurschap|dorpje|dorp +nl:^Gehucht|buurtschap|dorpje|dorp fi:^Pieni kylä fr:^Hameau|village de:^Weiler|Dorf @@ -4273,7 +4279,7 @@ ru:^Местность|регион ar:^منطقة مجاورة cs:^Lokalita da:^Lokalitet|sted -nl:^Plaats|localiteit +nl:^Plaats|streek|localiteit fi:^Paikkakunta fr:^Localité de:^Örtlichkeit|Lokalität|Region|Ort @@ -4405,7 +4411,7 @@ ru:^Гоночный трек ar:^مسار سباق cs:^Závodiště da:^Væddeløbsbane -nl:^Racebaan +nl:^Renbaan|racebaan fi:^Kilparata fr:^Circuit de:^Rennbahn @@ -4503,7 +4509,7 @@ ru:3^Съезд ar:^مخرج|تقاطع cs:^Dopravní uzel|3dálnice da:2^Motorvejsafkørsel|afkørsel -nl:3^Afrit|3uitgang|3kruising +nl:3^Afrit|3afslag|3uitgang|3kruising fi:^Poistumistie|liittymä fr:3^Sortie|3bifurcation de:4^Ausfahrt|Abfahrt @@ -4888,7 +4894,7 @@ ru:3^Парикмахерская|стрижки|укладки|покрас|с ar:^مصفف شعر cs:4^Kadeřnictví|4holičství da:3^Frisør -nl:3^Kapper +nl:3^Kapper|kapsalon|haarsalon|kapperszaak fi:^Kampaamo fr:3^Coiffeur|salon de coiffure de:3^Friseur|Frisiersalon|Frisör|Coiffeur @@ -4954,7 +4960,7 @@ ru:^Стадион|4спорт|матч|арена|спортивная арен ar:^استاد|رياضة cs:^Stadion|4sport da:^Stadium|sport -nl:^Stadium|4sport +nl:^Stadion|stadium|4sport|arena fi:^Stadion fr:^Stade|4sport de:^Stadion|4Sport|Olympiastadion|Sportstadion|Sportkomplex|Arena @@ -5149,11 +5155,11 @@ fa:استخرشنا sport-equestrian en:Equestrian Sports ru:Конный спорт -de:Pferdesport -es:Deportes ecuestres +nl:Paardensport|ruitersport fr:Sport équestre hu:Lovassportok -nl:Paardensport +de:Pferdesport +es:Deportes ecuestres pt-BR:Esportes equestres el:Ιππασία @@ -5162,11 +5168,12 @@ en:^Basketball ru:^Баскетбол de:^Basketball es:^Baloncesto +nl:^Basketbal fi:^Koripallo fr:^Basket-ball +de:^Basketball it:^Pallacanestro hu:^Kosárlabda -nl:^Basketbal pt-BR:^Basquetebol da:^Basketball fa:بسکتبال @@ -5175,13 +5182,13 @@ el:Καλαθόσφαιρα sport-athletics en:^Athletics ru:^Лёгкая атлетика -de:^Leichtathletik es:^Atletismo +nl:^Atletiek fi:^Yleisurheilu fr:^Athlétisme +de:^Leichtathletik it:^Atletica leggera hu:^Atlétika -nl:^Atletiek pt-BR:^Atletismo el:Στίβος @@ -5312,7 +5319,7 @@ da:^Bugt|havbugt nl:^Baai fi:^Lahti fr:^Baie -de:^Bucht|Bay +de:^Bucht|Bai hu:^Öböl id:^Teluk it:^Baia @@ -5374,7 +5381,7 @@ ru:3^СТО|3автомастерская|автосервис|авто ar:^محل صيانة السيارات|محطة خدمات cs:3^Auto opravna|auto|auta|Půjčení da:3^Garage|3bilværksted|service station -nl:3^Auto reparatie|auto|wagen +nl:3^Auto reparatie|auto|wagen|garage fi:^Autokorjaamo fr:3^Réparation d'automobiles|3garage|4station service|voiture|auto de:3^Autowerkstatt|Kfz|Reparaturwerkstatt|Auto|Werkstatt @@ -5407,7 +5414,7 @@ ru:4^Кемпинг ar:^تخييم|مكان التخييم|أرض التخييم cs:4^Kempování|camping|kemp|camp da:^Camping|campingplads|teltplads|lejrplads -nl:4^Camping|kamperen +nl:4^Camping|kamperen|kampeerplek fi:^Retkeily fr:4^Camping|terrain de camping de:4^Zeltplatz|Zelten|Campingplatz|Camping @@ -5440,7 +5447,7 @@ ru:4^Автокемпинг|кемпинг|стоянка грузовиков ar:^موقع البيت المتنقل cs:^Kemp pro obytné přívěsy da:^Autocamperplads|husvogn -nl:^Caravan site|camping +nl:^Caravan site|camping|woonwagenkamp fi:^Asuntovaunupaikka|Retkeily fr:4^Parc caravanier|VR|caravane|camping-car de:4^Wohnwagenstellplatz|Campingplatz|Wohnwagenplatz|Wohnmobilpark @@ -5471,7 +5478,7 @@ ru:^Офис|компания|контора|фирма|бизнес|бюро|у ar:^مكتب|شركة cs:^Kancelář da:^Kontor|firma|virksomhed -nl:^Kantoor|ambt +nl:^Kantoor|ambt|bedrijf|bedrijfspand|bedrijfskantoor fi:^Toimisto fr:^Bureau|compagnie de:^Büro|Amt|Unternehmen|Agentur|Dienststelle|Firma|Geschäft|Gesellschaft @@ -5536,7 +5543,7 @@ ru:^Госучреждение|административное учрежден ar:^مكتب حكومي cs:^Úřad vlády da:^Regeringskontor -nl:^Overheidskantoor|overheidspand +nl:^Overheidskantoor|overheidspand|regeringskantoor fi:^Viranomaistoimito fr:^Administration publique de:^Regierungsstelle @@ -5568,7 +5575,7 @@ ru:^Адвокат|нотариус|юрист|право|защита прав| ar:^مكتب محامي|مكتب محاماة cs:^Právní kancelář da:^Advokatkontor -nl:^Advocatenkantoor +nl:^Advocatenkantoor|advocaat fi:^Lakitoimisto fr:^Cabinet d'avocat de:^Anwaltsbüro|Anwaltskanzlei|Anwalt|Rechtsanwalt|Jurist|Gerichtsanwalt|Rechtsbeistand|Rechtsberater|Verteidiger @@ -5599,7 +5606,7 @@ ru:^Мобильный оператор ar:^شركة اتصالات|شركة محمول cs:^Mobilní operátor da:^Mobiloperatør -nl:^Mobiele provider +nl:^Mobiele provider|provider fi:^Matkapuhelinoperaattori fr:^Opérateur mobile de:^Mobilbetreiber|Mobilfunkanbieter @@ -5630,7 +5637,7 @@ ru:^Пивоварня|пивзавод|производство пива|пив ar:^مصنع جعة cs:^Pivovar da:^Bryggeri -nl:^Brouwerij +nl:^Brouwerij|bier|ambachtelijk bier|brouwhuis fi:^Panimo fr:^Brasserie de:^Brauerei|Brauhaus|Hausbrauerei|Bier|Bierausschank|Hausbräu @@ -5661,7 +5668,7 @@ ru:^Столяр|мастерская столяра ar:^نجار cs:^Truhlář da:^Tømrer -nl:^Timmerman +nl:^Timmerman|houtbewerker fi:^Puuseppä fr:^Menuisier|charpentier de:^Zimmermann @@ -5723,10 +5730,10 @@ ru:^Садовник ar:^مهندس مناظر cs:^Zahradník da:^Gartner -nl:^Tuinarchitect|landschapsarchitect +nl:^Tuinarchitect|landschapsarchitect|tuinman fi:^Puutarhuri fr:^Paysagiste -de:^Landschaftsgärtner +de:^Landschaftsgärtner|Gärtner hu:^Kertész id:^Tukang kebun it:^Giardiniere|architetto di esterni @@ -5754,10 +5761,10 @@ ru:^Кондиционеры ar:^تكييف|مكيف هواء cs:^HVAC|montér vzduchotechniky da:^Blikkenslager|klimaanlæg -nl:^Airconditioning|luchtbehandeling +nl:^Airconditioning|luchtbehandeling|airco fi:^Ilmastointilaite fr:^Climatiseur -de:^Heizung|Lüftung|Klima|Installateur +de:^Heizung|Lüftung|Klima|Installateur|Klimaanlage hu:^Hűtés-fűtés szerelő|légkondicionáló id:^Hvac it:^Impianti HVAC|aria condizionata @@ -5847,7 +5854,7 @@ ru:^Фотограф|фотоателье ar:^مصور فوتوغرافي|استوديو تصوير cs:^Fotograf|fotografické studio da:^Fotograf|studio -nl:^Fotograaf +nl:^Fotograaf|fotografie studio fi:^Valokuvaaja fr:^Photographe|studio photographique de:^Fotograf|Fotostudio @@ -5882,7 +5889,7 @@ da:^VVS-mand nl:^Loodgieter fi:^Putkimies fr:^Plombier -de:^Installateur +de:^Installateur|Klempner hu:^Vízvezeték-szerelő id:^Tukang pipa it:^Idraulico|tubista @@ -6231,6 +6238,7 @@ ru:^Копировальный центр|печать|полиграфия ar:^محل نسخ|طباعة cs:^Kopírovací obchod|Tiskárny da:^Kopieringsbutik|Trykkeri +nl:^Copy shop|Kopieerwinkel|printer|drukker fi:^Painotalo|Tulostaja fr:^Boutique de photocopies|Imprimerie de:^Kopierladen|Drucker @@ -6293,7 +6301,7 @@ ru:^Турагентство|путешествия|туристическое ar:^وكيل سفريات|جولات cs:^Cestovní kancelář|cesty da:^Rejsebureau|rundrejser -nl:^Reisagentschap|reizen +nl:^Reisbureau|reisagentschap|reizen fi:^Matkatoimisto fr:^Agence de voyages|Voyages organisés de:^Reisebüro|Reisen|Rundreisen|Reisevermittlung|Reisevermittler|Reiseagentur|Touren|Ausflüge|Urlaub|Touristeninformation|Last-Minute-Tour @@ -6356,7 +6364,7 @@ ru:^Химчистка ar:^غسيل جاف|غسيل cs:^Chemické čištění|čistírna da:^Renseri|vaskeri -nl:^Droogkuis|wassen +nl:^Stomerij|chemisch reinigen|droogkuis|wassen|stomen fi:^Kuivapesula|pesula fr:^Nettoyage à sec|Lavage de:^Chemische Reinigung|Reinigung @@ -6420,7 +6428,7 @@ ru:^Автомойка ar:^مغسلة سيارات cs:^Myčka aut da:^Bilvask -nl:^Car wash +nl:^Car wash|autowasstraat|wasstraat fi:^Autopesula fr:^Station de lavage de:^Autowäsche @@ -6487,7 +6495,7 @@ da:^Ladestation|opladning nl:^Oplaadstation|opladen fi:^Latausasema|lataus fr:^Station de recharge|Recharge -de:^Ladestation +de:^Ladestation|aufladen hu:^Töltőállomás|töltés id:^Pusat Pengisian Daya|pengisian daya it:^Stazione di ricarica|ricarica @@ -6516,10 +6524,10 @@ ru:^Детская комната|ясли ar:^حضانة|رعاية أطفال cs:^Jesle|Péče o děti da:^Vuggestue|Børnehave -nl:^Crèche|kinderzorg +nl:^Crèche|kinderopvang|kinderzorg fi:^Päivähoito|Lastenhoito fr:^Garderie|Garde d'enfant -de:^Kindertagesstätte|Kinderzimmer|Kindergarten|Kinderbetreuung +de:^Kindertagesstätte|Kindergarten|Kinderbetreuung hu:^Bölcsőde|Gyermekgondozás|Gyermekfelügyelet id:^Penitipan Anak|Perawatan Anak it:^Asilo|cura dell'infanzia @@ -6612,7 +6620,7 @@ ru:^Телефон для экстренных вызовов ar:^هاتف الطوارئ cs:^Tísňového volání da:^Nødtelefon -nl:^Praatpaal +nl:^Praatpaal|4noodtelefoon fi:^Hätäpuhelin fr:^Téléphone d'urgence de:^Notruftelefon|Nottelefon @@ -6646,7 +6654,7 @@ ru:^Фитнес-клуб|качалка|тренажерный зал|фитн ar:^مركز للياقة البدنية، نادي رياضي cs:^Fitness|tělocvična da:^Trænings- og motionscenter|fitnesscenter -nl:^Fitnesscentrum|sportschool +nl:^Fitnesscentrum|sportschool|gym|fitness|workout fi:^Kuntosali fr:^Centre fitness|salle de gym de:^Fitnessstudio|Fitnesscenter|Fitness|Fitnessraum|Fitnessclub|Gesundheitsclub|Training|Trainingsraum|Turnhalle @@ -6839,7 +6847,7 @@ ru:2^Зоопарк ar:^حديقة حيوان cs:^zoologická zahrada da:^Zoo -nl:^Dierentuin +nl:^Dierentuin|zoo fi:^Eläintarha fr:^Zoo de:^Zoo @@ -6873,7 +6881,7 @@ ru:^Туристический офис ar:^مكتب سياحة cs:^Informační centrum da:^Turistkontor -nl:^Toeristische informatie +nl:^VVV|Toeristische informatie fi:^Turistitoimisto fr:^Office de tourisme de:^Fremdenverkehrsamt @@ -6937,10 +6945,10 @@ ru:^Суд ar:^محكمة cs:^Soud da:^Domhus|retsbygning -nl:^Rechtbank +nl:^Rechtban|gerechtsgebouw fi:^Oikeustalo fr:^Palais de justice -de:^Justizgebäude +de:^Justizgebäude|Gerichtsgebäude hu:^Bíróság id:^Gedung pengadilan it:^Tribunale @@ -7065,7 +7073,7 @@ ru:^Зона отдыха на трассе ar:^استراحة cs:^Odpočívadlo da:^Rasteplads -nl:^Parkeerplaats +nl:^Snelweg rustplaats|Parkeerplaats fi:^Levähdyspaikka fr:^Aire de repos de:^Rastplatz @@ -7191,7 +7199,7 @@ ru:^Подстанция ar:^محطة كهرباء فرعية cs:^Rozvodna da:^Transformerstation -nl:^Substation +nl:^Onderstation fi:^Muuntoasema fr:^Sous-station de:^Umspannwerk @@ -7254,10 +7262,10 @@ ru:^Рыбный магазин|рыба|морепродукты|рыбная ar:^سماك cs:^Prodej ryb da:^Fiskehandler -nl:^Visboer +nl:^Visboer|vismarkt|vis|zeevoedsel|schelpdier fi:^Kalakauppias fr:^Poissonnier -de:^Fischhändler +de:^Fischhändler|Fischmarkt|Fisch|Meeresfrüchte|Schaltier hu:^Halüzlet id:^Penjual Ikan it:^Pescivendolo @@ -7286,7 +7294,7 @@ ru:^Билетная касса|билет|театральная касса|б ar:^مكتب تذاكر cs:^Prodej vstupenek da:^Billetkontor -nl:^Kaartjesverkoop +nl:^Kaartverkoop|Kaartjesverkoop|kaartjes fi:^Lippumyymälä fr:^Billetterie de:^Fahrkartenschalter|Fahrkartengeschäft|Fahrkarten|Fahrkartenzentrum|Fahrkartenausgabe|Fahrkartenagentur|Fahrkartenhäuschen|Reisecenter|Kassenschalter|Zahlschalter @@ -7318,10 +7326,10 @@ ru:^Винный магазин ar:^متجر مشروبات روحية cs:^Vinařství da:^Vinhandel -nl:^Wijn|Slijterij +nl:^Slijterij|Wijn fi:^Alkoholimyymälä fr:^Hors licence -de:^Wein- und Spirituosengeschäft +de:^Wein- und Spirituosengeschäft|Weinladen hu:^Borkereskedés id:^Toko anggur it:^Negozio di alcolici @@ -7447,7 +7455,7 @@ ru:^Карта ar:^خريطة سياحية cs:^Turistická mapa da:^Turistkort -nl:^Toeristische kaart +nl:^Toeristische kaart|toeristenkaart fi:^Turistikartta fr:^Carte touristique de:^Touristenkarte @@ -7510,7 +7518,7 @@ ru:^Вертолётная площадка ar:^مهبط مروحيات cs:^Helipad da:^Helikopterlandingsplads -nl:^Heliplatform +nl:^Heliplatform|helikopterplatform|helipad fi:^Helikopterialusta fr:^Hélisurface de:^Hubschrauberlandeplatz @@ -7542,7 +7550,7 @@ ru:^Паркомат ar:^ماكينة دفع تذاكر الموقف cs:^Parkovací automat da:^Parkeringsbilletmaskine -nl:^Betaalautomaat parkeergarage +nl:^Parkeerautomaat|Betaalautomaat parkeergarage fi:^Pysäköintimaksuautomaatti fr:^Horodateur de:^Parkautomat @@ -7798,7 +7806,7 @@ ru:^Пункт оплаты ar:^كشك رسوم عبور cs:^Mýtné da:^Betalingsstation -nl:^Tolhokje +nl:^Tolhuisje|Tolhokje fi:^Tietulliasema fr:^Poste de péage de:^Mautstelle @@ -7865,7 +7873,7 @@ da:^Vandpark nl:^Waterpark fi:^Vesipuisto fr:^Centre aquatique -de:^Freizeitbad +de:^Wasserpark|Freizeitbad hu:^Strand|Élményfürdő|Aquapark id:^Taman air it:^Parco acquatico @@ -8372,7 +8380,7 @@ ru:^Дом отдыха ar:^منتج cs:^Letovisko da:^Resort -nl:^Complex +nl:^Resort|Complex fi:^Lomakohteet fr:^Complexe touristique de:^Resort @@ -8479,7 +8487,7 @@ it:^Chiosco gelati ja:^アイスクリーム屋 ko:^아이스크림 스탠드 nb:^Iskrem -nl:^Ijsstand +nl:^Ijskraam|Ijsstand pl:^Stoisko z lodami pt:^Banca de gelados pt-BR:^Sorveteria @@ -8512,7 +8520,7 @@ it:^Internet Cafe ja:^インターネットカフェ ko:^인터넷 카페 nb:^Internettkafé -nl:^Internetcafe +nl:^Internetcafé pl:^Kafejka internetowa pt:^Cibercafé pt-BR:^Cibercafé @@ -8545,7 +8553,7 @@ it:^Parcheggio moto ja:^バイク駐輪場 ko:^오토바이 주차 nb:^Motorsykkelparkering -nl:^Parking Motorfietsen +nl:^Motorfiets Parkeerplaats|Parking Motorfietsen pl:^Parking motocyklowy pt:^Estacionamento de motos pt-BR:^Estacionamento de motos @@ -8578,7 +8586,7 @@ it:^Casa di riposo ja:^養護施設 ko:^요양원 nb:^Sykehjem -nl:^Bejaardentehuis +nl:^Bejaardentehuis|Pleeghuis pl:^Dom opieki pt:^Casa de repouso pt-BR:^Casa de repouso @@ -8708,7 +8716,7 @@ it:^Defibrillatore ja:^除細動器 ko:^제세동기 nb:^Hjertestarter -nl:^Defibrillator +nl:^AED|Defibrillator pl:^Defibrylator pt:^Desfibrilador pt-BR:^Desfibrilador @@ -9004,7 +9012,7 @@ it:^Centro massaggi ja:^マッサージパーラー ko:^안마 시술소 nb:^Massasjesalong -nl:^Massagesalon +nl:^Massagesalon|Massagetherapie|Wellness-Center|Spa|Massage pl:^Salon masażu pt:^Centro de massagens pt-BR:^Massagista @@ -9070,7 +9078,7 @@ it:^Edicola ja:^新聞販売店 ko:^신문 가판대 nb:^Aviskiosk -nl:^Kiosk +nl:^Kiosk|krant pl:^Stoisko z prasą pt:^Banca de jornais pt-BR:^Banca de jornais|jornaleiro @@ -9168,7 +9176,7 @@ it:^Studio tatuaggi ja:^タトゥーパーラー ko:^문신 시술소 nb:^Tatovør -nl:^Tattoosalon +nl:^Tatoeagezaak|Tattoosalon|Tattoo Studio|Tattoo Shop|tatoeage pl:^Salon tatuażu pt:^Estúdio de tatuagens pt-BR:^Estúdio de tatuagens|tatuador @@ -9192,7 +9200,7 @@ cs:^Smíšené zboží da:^Småtingsbutik de:^Billigladen el:^Παντοπωλείο|Μπακάλικο|Ψιλικατζίδικο -es:^«Todo a cien» +es:^Tienda de Variedades fi:^Halpakauppa fr:^Bazar hu:^Vegyesbolt @@ -9201,7 +9209,7 @@ it:^Negozio di accessori ja:^雑貨店 ko:^잡화점 nb:^Billigbutikk -nl:^Bazaar +nl:^Bazaar|Variety Store pl:^Sklep z różnościami pt:^Loja dos 300 pt-BR:^1,99|Loja de variedades @@ -9252,13 +9260,17 @@ zh-Hant:^山屋 tourism-gallery|@tourism en:^Gallery|museum ru:^Галерея|музей|картины|картинная галерея +de:^Galerie|Museum +nl:^Galerij|museum tourism-theme_park|@tourism|@children en:^Theme park|Amusement park ru:^Парк развлечений|Парк аттракционов|Тематический парк +de:^Freizeitpark|Vergnügungspark fr:^Parc d'attractions|Parc de loisirs es:^Parque de atracciones fi:^Huvipuisto +nl:^Pretpark|Attractiepark pt:^Parque de diversão boundary-national_park|@tourism @@ -9311,7 +9323,7 @@ it:Riserva ja:自然保護区 ko:천연보호구역 nb:Reservat -nl:Reserve +nl:Natuurgebied|reservaat pl:Rezerwat przyrody pt:Reserva natural pt-BR:Reserva Florestal diff --git a/data/countries.txt b/data/countries.txt index a5c35a21ce..eac86d8101 100644 --- a/data/countries.txt +++ b/data/countries.txt @@ -12360,8 +12360,8 @@ "g": [ { "id": "South Africa_Western Cape", - "s": 23826809, - "sha1_base64": "jIRuCov7rqi2MSS1Xw+9EoPgp8c=", + "s": 25355941, + "sha1_base64": "QqCRUsWHw5A9WaGDa6jYKeH697U=", "old": [ "South Africa" ], @@ -12373,8 +12373,8 @@ }, { "id": "South Africa_Gauteng", - "s": 16113854, - "sha1_base64": "AKn6gGt34hFGI+4EHk3bHt8OqSA=", + "s": 16237030, + "sha1_base64": "2S/KGVBeEE2UutvIFdSGah9qH9U=", "old": [ "South Africa" ], @@ -12385,8 +12385,8 @@ }, { "id": "South Africa_North West", - "s": 6108377, - "sha1_base64": "H8VIodaZ4x0619pTFGetmL6u3Yc=", + "s": 6195513, + "sha1_base64": "bH87cvnMfmlUhDwBTmSLIN7isXk=", "old": [ "South Africa" ], @@ -12397,8 +12397,8 @@ }, { "id": "South Africa_Free State", - "s": 7116673, - "sha1_base64": "F0ptHQBIEwXq6/5ATDhWFW2UBYY=", + "s": 7124358, + "sha1_base64": "dSfJRReeogwWTd+DacvbNd2NKDs=", "old": [ "South Africa" ], @@ -12409,8 +12409,8 @@ }, { "id": "South Africa_Eastern Cape", - "s": 12713624, - "sha1_base64": "CJuKG0PBUQGHPv7ms3b34vKIY/E=", + "s": 12884152, + "sha1_base64": "XicL3LVXAbO4dkUMC/VEqL+2/4o=", "old": [ "South Africa" ], @@ -12421,8 +12421,8 @@ }, { "id": "South Africa_Northern Cape", - "s": 8984267, - "sha1_base64": "DoymmaJgjkj6dIHzP8lfyX7r0xE=", + "s": 9000592, + "sha1_base64": "8cHhw+xNOoxs/mYYfD9rkNYCMDI=", "old": [ "South Africa" ], @@ -12433,8 +12433,8 @@ }, { "id": "South Africa_Mpumalanga", - "s": 7327800, - "sha1_base64": "a50w7deSki4BRgC1dfs9HRhWEGo=", + "s": 7359457, + "sha1_base64": "2Mff7Zamb8uvTzl48Cnyz8r1364=", "old": [ "South Africa" ], @@ -12445,8 +12445,8 @@ }, { "id": "South Africa_Limpopo", - "s": 7177527, - "sha1_base64": "ZI7N+e8QbuDAf92cYmtIzGnzxkk=", + "s": 7193263, + "sha1_base64": "WeZiMCox9BUFxC2/rOsKpC9xUeE=", "old": [ "South Africa" ], @@ -12457,8 +12457,8 @@ }, { "id": "South Africa_KwaZulu-Natal", - "s": 21241430, - "sha1_base64": "NDoRZasth+TjXvSzhxfeRWeJYkA=", + "s": 21606493, + "sha1_base64": "cNUUOrqu87Yzhx1ueWxx3HeXnwQ=", "old": [ "South Africa" ], diff --git a/drape/vulkan/vulkan_base_context.cpp b/drape/vulkan/vulkan_base_context.cpp index bc49774532..b7d42ea6aa 100644 --- a/drape/vulkan/vulkan_base_context.cpp +++ b/drape/vulkan/vulkan_base_context.cpp @@ -177,7 +177,14 @@ bool VulkanBaseContext::BeginRendering() if (!m_presentAvailable) return false; - auto res = vkWaitForFences(m_device, 1, &m_fences[m_inflightFrameIndex], VK_TRUE, UINT64_MAX); + // We wait for the fences no longer than kTimeoutNanoseconds. If timer is expired skip + // the frame. It helps to prevent freeze on vkWaitForFences in the case of resetting surface. + uint64_t constexpr kTimeoutNanoseconds = 2 * 1000 * 1000 * 1000; + auto res = vkWaitForFences(m_device, 1, &m_fences[m_inflightFrameIndex], VK_TRUE, + kTimeoutNanoseconds); + if (res == VK_TIMEOUT) + return false; + if (res != VK_SUCCESS && res != VK_ERROR_DEVICE_LOST) CHECK_RESULT_VK_CALL(vkWaitForFences, res); @@ -199,9 +206,20 @@ bool VulkanBaseContext::BeginRendering() } m_frameCounter++; - - res = vkAcquireNextImageKHR(m_device, m_swapchain, UINT64_MAX, m_acquireSemaphores[m_inflightFrameIndex], + + // Here we also wait no longer than kTimeoutNanoseconds. In this case we have to + // recreate synchronization primitives, because one of fences can be reset. + res = vkAcquireNextImageKHR(m_device, m_swapchain, kTimeoutNanoseconds, + m_acquireSemaphores[m_inflightFrameIndex], VK_NULL_HANDLE, &m_imageIndex); + if (res == VK_TIMEOUT) + { + vkDeviceWaitIdle(m_device); + DestroySyncPrimitives(); + CreateSyncPrimitives(); + return false; + } + if (res == VK_ERROR_OUT_OF_DATE_KHR || res == VK_SUBOPTIMAL_KHR) { RecreateSwapchainAndDependencies(); diff --git a/drape/vulkan/vulkan_object_manager.cpp b/drape/vulkan/vulkan_object_manager.cpp index 30c69dce35..7823f5cd40 100644 --- a/drape/vulkan/vulkan_object_manager.cpp +++ b/drape/vulkan/vulkan_object_manager.cpp @@ -130,7 +130,7 @@ VulkanObject VulkanObjectManager::CreateBuffer(VulkanMemoryManager::ResourceType return result; } -VulkanObject VulkanObjectManager::CreateImage(VkImageUsageFlags usageFlags, VkFormat format, +VulkanObject VulkanObjectManager::CreateImage(VkImageUsageFlags usageFlags, VkFormat format, VkImageTiling tiling, VkImageAspectFlags aspectFlags, uint32_t width, uint32_t height) { VulkanObject result; @@ -142,7 +142,7 @@ VulkanObject VulkanObjectManager::CreateImage(VkImageUsageFlags usageFlags, VkFo imageCreateInfo.mipLevels = 1; imageCreateInfo.arrayLayers = 1; imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT; - imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL; + imageCreateInfo.tiling = tiling; imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; imageCreateInfo.extent = { width, height, 1 }; diff --git a/drape/vulkan/vulkan_object_manager.hpp b/drape/vulkan/vulkan_object_manager.hpp index aca03d9fd5..de76b97583 100644 --- a/drape/vulkan/vulkan_object_manager.hpp +++ b/drape/vulkan/vulkan_object_manager.hpp @@ -73,7 +73,7 @@ public: VulkanObject CreateBuffer(VulkanMemoryManager::ResourceType resourceType, uint32_t sizeInBytes, uint64_t batcherHash); - VulkanObject CreateImage(VkImageUsageFlags usageFlags, VkFormat format, + VulkanObject CreateImage(VkImageUsageFlags usageFlags, VkFormat format, VkImageTiling tiling, VkImageAspectFlags aspectFlags, uint32_t width, uint32_t height); DescriptorSetGroup CreateDescriptorSetGroup(ref_ptr<VulkanGpuProgram> program); diff --git a/drape/vulkan/vulkan_texture.cpp b/drape/vulkan/vulkan_texture.cpp index b7191123fa..836396341c 100644 --- a/drape/vulkan/vulkan_texture.cpp +++ b/drape/vulkan/vulkan_texture.cpp @@ -113,9 +113,12 @@ void VulkanTexture::Create(ref_ptr<dp::GraphicsContext> context, Params const & } auto const format = VulkanFormatUnpacker::Unpack(params.m_format); + VkFormatProperties formatProperties; vkGetPhysicalDeviceFormatProperties(vulkanContext->GetPhysicalDevice(), format, &formatProperties); - CHECK(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT, ()); + VkImageTiling tiling = VK_IMAGE_TILING_LINEAR; + if (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) + tiling = VK_IMAGE_TILING_OPTIMAL; m_isMutable = params.m_isMutable; if (params.m_isRenderTarget) @@ -127,12 +130,12 @@ void VulkanTexture::Create(ref_ptr<dp::GraphicsContext> context, Params const & params.m_format == TextureFormat::DepthStencil ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT) : VK_IMAGE_ASPECT_DEPTH_BIT; m_textureObject = m_objectManager->CreateImage(VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, - format, aspect, params.m_width, params.m_height); + format, tiling, aspect, params.m_width, params.m_height); } else { m_textureObject = m_objectManager->CreateImage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, - format, VK_IMAGE_ASPECT_COLOR_BIT, + format, tiling, VK_IMAGE_ASPECT_COLOR_BIT, params.m_width, params.m_height); } } @@ -152,9 +155,8 @@ void VulkanTexture::Create(ref_ptr<dp::GraphicsContext> context, Params const & m_creationStagingBuffer->Flush(); // Create image. - m_textureObject = m_objectManager->CreateImage(VK_IMAGE_USAGE_SAMPLED_BIT, format, - VK_IMAGE_ASPECT_COLOR_BIT, - params.m_width, params.m_height); + m_textureObject = m_objectManager->CreateImage(VK_IMAGE_USAGE_SAMPLED_BIT, format, tiling, + VK_IMAGE_ASPECT_COLOR_BIT, params.m_width, params.m_height); } } diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 19779b6a2b..7de05e166d 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -199,7 +199,7 @@ void DrapeEngine::SetModelViewRect(m2::RectD const & rect, bool applyRotation, i void DrapeEngine::SetModelViewAnyRect(m2::AnyRectD const & rect, bool isAnim) { - PostUserEvent(make_unique_dp<SetAnyRectEvent>(rect, isAnim)); + PostUserEvent(make_unique_dp<SetAnyRectEvent>(rect, isAnim, true /* fitInViewport */)); } void DrapeEngine::ClearUserMarksGroup(kml::MarkGroupId groupId) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 97d300a941..8cabcd64e3 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1244,20 +1244,33 @@ void FrontendRenderer::ProcessSelection(ref_ptr<SelectObjectMessage> msg) if (msg->IsDismiss()) { m_selectionShape->Hide(); + if (!m_myPositionController->IsModeChangeViewport() && m_selectionTrackInfo.is_initialized()) + { + AddUserEvent(make_unique_dp<SetAnyRectEvent>(m_selectionTrackInfo.get().m_startRect, true /* isAnim */, + false /* fitInViewport */)); + } + m_selectionTrackInfo.reset(); } else { double offsetZ = 0.0; - if (m_userEventStream.GetCurrentScreen().isPerspective()) + auto const & modelView = m_userEventStream.GetCurrentScreen(); + if (modelView.isPerspective()) { dp::TOverlayContainer selectResult; if (m_overlayTree->IsNeedUpdate()) - BuildOverlayTree(m_userEventStream.GetCurrentScreen()); + BuildOverlayTree(modelView); m_overlayTree->Select(msg->GetPosition(), selectResult); for (ref_ptr<dp::OverlayHandle> handle : selectResult) offsetZ = max(offsetZ, handle->GetPivotZ()); } m_selectionShape->Show(msg->GetSelectedObject(), msg->GetPosition(), offsetZ, msg->IsAnim()); + if (!m_myPositionController->IsModeChangeViewport()) + { + m2::PointD startPosition; + m_selectionShape->IsVisible(modelView, startPosition); + m_selectionTrackInfo = SelectionTrackInfo(modelView.GlobalRect(), startPosition); + } } } @@ -1991,13 +2004,15 @@ void FrontendRenderer::OnTouchMapAction(TouchEvent::ETouchType touchType) // the completion of touch actions. It helps to prevent the creation of redundant checks. auto const blockTimer = (touchType == TouchEvent::TOUCH_DOWN || touchType == TouchEvent::TOUCH_MOVE); m_myPositionController->ResetRoutingNotFollowTimer(blockTimer); + m_selectionTrackInfo.reset(); } + bool FrontendRenderer::OnNewVisibleViewport(m2::RectD const & oldViewport, m2::RectD const & newViewport, m2::PointD & gOffset) { gOffset = m2::PointD(0, 0); if (m_myPositionController->IsModeChangeViewport() || m_selectionShape == nullptr || - oldViewport == newViewport) + oldViewport == newViewport || !m_selectionTrackInfo.is_initialized()) { return false; } @@ -2009,43 +2024,63 @@ bool FrontendRenderer::OnNewVisibleViewport(m2::RectD const & oldViewport, m2::PointD pos; m2::PointD targetPos; - if (m_selectionShape->IsVisible(screen, pos) && - m_selectionShape->IsVisible(targetScreen, targetPos)) + if (!m_selectionShape->IsVisible(screen, pos) || !m_selectionShape->IsVisible(targetScreen, targetPos)) + return false; + + m2::RectD rect(pos, pos); + m2::RectD targetRect(targetPos, targetPos); + + if (m_overlayTree->IsNeedUpdate()) + BuildOverlayTree(screen); + + if (!(m_selectionShape->GetSelectedObject() == SelectionShape::OBJECT_POI && + m_overlayTree->GetSelectedFeatureRect(screen, rect) && + m_overlayTree->GetSelectedFeatureRect(targetScreen, targetRect))) { - m2::RectD rect(pos, pos); - m2::RectD targetRect(targetPos, targetPos); + double const r = m_selectionShape->GetRadius(); + rect.Inflate(r, r); + targetRect.Inflate(r, r); + } + double const ptZ = m_selectionShape->GetPositionZ(); + + double const kOffset = 50 * VisualParams::Instance().GetVisualScale(); + rect.Inflate(kOffset, kOffset); + targetRect.Inflate(kOffset, kOffset); - if (m_overlayTree->IsNeedUpdate()) - BuildOverlayTree(screen); + if (newViewport.SizeX() < rect.SizeX() || newViewport.SizeY() < rect.SizeY()) + return false; - if (!(m_selectionShape->GetSelectedObject() == SelectionShape::OBJECT_POI && - m_overlayTree->GetSelectedFeatureRect(screen, rect) && - m_overlayTree->GetSelectedFeatureRect(targetScreen, targetRect))) + m2::PointD pOffset(0.0, 0.0); + if ((oldViewport.IsIntersect(targetRect) && !newViewport.IsRectInside(rect)) || + (newViewport.IsRectInside(rect) && m_selectionTrackInfo.get().m_snapSides != m2::PointI::Zero())) + { + // In case the rect of the selection is [partly] hidden, scroll the map to keep it visible. + // In case the rect of the selection is visible after the map scrolling, + // try to rollback part of that scrolling to return the map to its original position. + if (rect.minX() < newViewport.minX() || m_selectionTrackInfo.get().m_snapSides.x < 0) { - double const r = m_selectionShape->GetRadius(); - rect.Inflate(r, r); - targetRect.Inflate(r, r); + pOffset.x = std::max(m_selectionTrackInfo.get().m_startPos.x - pos.x, newViewport.minX() - rect.minX()); + m_selectionTrackInfo.get().m_snapSides.x = -1; } - - if (oldViewport.IsIntersect(targetRect) && !newViewport.IsRectInside(rect)) + else if (rect.maxX() > newViewport.maxX() || m_selectionTrackInfo.get().m_snapSides.x > 0) { - double const kOffset = 50 * VisualParams::Instance().GetVisualScale(); - m2::PointD pOffset(0.0, 0.0); - if (rect.minX() < newViewport.minX()) - pOffset.x = newViewport.minX() - rect.minX() + kOffset; - else if (rect.maxX() > newViewport.maxX()) - pOffset.x = newViewport.maxX() - rect.maxX() - kOffset; - - if (rect.minY() < newViewport.minY()) - pOffset.y = newViewport.minY() - rect.minY() + kOffset; - else if (rect.maxY() > newViewport.maxY()) - pOffset.y = newViewport.maxY() - rect.maxY() - kOffset; + pOffset.x = std::min(m_selectionTrackInfo.get().m_startPos.x - pos.x, newViewport.maxX() - rect.maxX()); + m_selectionTrackInfo.get().m_snapSides.x = 1; + } - gOffset = screen.PtoG(screen.P3dtoP(pos + pOffset)) - screen.PtoG(screen.P3dtoP(pos)); - return true; + if (rect.minY() < newViewport.minY() || m_selectionTrackInfo.get().m_snapSides.y < 0) + { + pOffset.y = std::max(m_selectionTrackInfo.get().m_startPos.y - pos.y, newViewport.minY() - rect.minY()); + m_selectionTrackInfo.get().m_snapSides.y = -1; + } + else if (rect.maxY() > newViewport.maxY() || m_selectionTrackInfo.get().m_snapSides.y > 0) + { + pOffset.y = std::min(m_selectionTrackInfo.get().m_startPos.y - pos.y, newViewport.maxY() - rect.maxY()); + m_selectionTrackInfo.get().m_snapSides.y = 1; } } - return false; + gOffset = screen.PtoG(screen.P3dtoP(pos + pOffset, ptZ)) - screen.PtoG(screen.P3dtoP(pos, ptZ)); + return true; } TTilesCollection FrontendRenderer::ResolveTileKeys(ScreenBase const & screen) diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 479825c613..447d365ab3 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -39,6 +39,8 @@ #include <unordered_set> #include <vector> +#include <boost/optional.hpp> + namespace dp { class Framebuffer; @@ -268,7 +270,23 @@ private: drape_ptr<gui::LayerRenderer> m_guiRenderer; gui::TWidgetsLayoutInfo m_lastWidgetsLayout; drape_ptr<MyPositionController> m_myPositionController; + drape_ptr<SelectionShape> m_selectionShape; + struct SelectionTrackInfo + { + SelectionTrackInfo() = default; + + SelectionTrackInfo(m2::AnyRectD const & startRect, m2::PointD const & startPos) + : m_startRect(startRect) + , m_startPos(startPos) + {} + + m2::AnyRectD m_startRect; + m2::PointD m_startPos; + m2::PointI m_snapSides = m2::PointI::Zero(); + }; + boost::optional<SelectionTrackInfo> m_selectionTrackInfo; + drape_ptr<RouteRenderer> m_routeRenderer; drape_ptr<TrafficRenderer> m_trafficRenderer; drape_ptr<TransitSchemeRenderer> m_transitSchemeRenderer; diff --git a/drape_frontend/selection_shape.hpp b/drape_frontend/selection_shape.hpp index 757ea08315..afc48a5475 100644 --- a/drape_frontend/selection_shape.hpp +++ b/drape_frontend/selection_shape.hpp @@ -44,6 +44,7 @@ public: bool IsVisible(ScreenBase const & screen, m2::PointD & pxPos) const; double GetRadius() const { return m_radius; } + double GetPositionZ() const { return m_positionZ; } ESelectedObject GetSelectedObject() const; diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index b67fc6407f..b62be4ea7d 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -362,7 +362,7 @@ bool UserEventStream::OnSetScale(ref_ptr<ScaleEvent> scaleEvent) bool UserEventStream::OnSetAnyRect(ref_ptr<SetAnyRectEvent> anyRectEvent) { - return SetRect(anyRectEvent->GetRect(), anyRectEvent->IsAnim()); + return SetRect(anyRectEvent->GetRect(), anyRectEvent->IsAnim(), anyRectEvent->FitInViewport()); } bool UserEventStream::OnSetRect(ref_ptr<SetRectEvent> rectEvent) @@ -455,16 +455,22 @@ bool UserEventStream::SetRect(m2::RectD rect, int zoom, bool applyRotation, bool CheckMinGlobalRect(rect, kDefault3dScale); CheckMinMaxVisibleScale(rect, zoom, kDefault3dScale); m2::AnyRectD targetRect = applyRotation ? ToRotated(m_navigator, rect) : m2::AnyRectD(rect); - return SetRect(targetRect, isAnim, parallelAnimCreator); + return SetRect(targetRect, isAnim, true /* fitInViewport */, parallelAnimCreator); } -bool UserEventStream::SetRect(m2::AnyRectD const & rect, bool isAnim, +bool UserEventStream::SetRect(m2::AnyRectD const & rect, bool isAnim, bool fitInViewport, TAnimationCreator const & parallelAnimCreator) { ScreenBase tmp = GetCurrentScreen(); - tmp.SetFromRects(rect, tmp.PixelRectIn3d()); - tmp.MatchGandP3d(rect.GlobalCenter(), tmp.PixelRectIn3d().Center()); - + if (fitInViewport) + { + tmp.SetFromRects(rect, tmp.PixelRectIn3d()); + tmp.MatchGandP3d(rect.GlobalCenter(), tmp.PixelRectIn3d().Center()); + } + else + { + tmp.SetFromRects(rect, tmp.PixelRect()); + } return SetScreen(tmp, isAnim, parallelAnimCreator); } diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp index 836c26cc73..ac83bd4c00 100644 --- a/drape_frontend/user_event_stream.hpp +++ b/drape_frontend/user_event_stream.hpp @@ -194,19 +194,22 @@ private: class SetAnyRectEvent : public UserEvent { public: - SetAnyRectEvent(m2::AnyRectD const & rect, bool isAnim) + SetAnyRectEvent(m2::AnyRectD const & rect, bool isAnim, bool fitInViewport) : m_rect(rect) , m_isAnim(isAnim) + , m_fitInViewport(fitInViewport) {} EventType GetType() const override { return UserEvent::EventType::SetAnyRect; } m2::AnyRectD const & GetRect() const { return m_rect; } bool IsAnim() const { return m_isAnim; } + bool FitInViewport() const { return m_fitInViewport; } private: m2::AnyRectD m_rect; // destination mercator rect bool m_isAnim; + bool m_fitInViewport; }; class FollowAndRotateEvent : public UserEvent @@ -408,7 +411,7 @@ private: bool SetAngle(double azimuth, TAnimationCreator const & parallelAnimCreator = nullptr); bool SetRect(m2::RectD rect, int zoom, bool applyRotation, bool isAnim, TAnimationCreator const & parallelAnimCreator = nullptr); - bool SetRect(m2::AnyRectD const & rect, bool isAnim, + bool SetRect(m2::AnyRectD const & rect, bool isAnim, bool fitInViewport, TAnimationCreator const & parallelAnimCreator = nullptr); bool SetScreen(ScreenBase const & screen, bool isAnim, diff --git a/generator/coastlines_generator.cpp b/generator/coastlines_generator.cpp index 27ef4032df..1960dc7d7b 100644 --- a/generator/coastlines_generator.cpp +++ b/generator/coastlines_generator.cpp @@ -103,7 +103,7 @@ namespace size_t m_totalNotMergedCoastsPoints; public: - DoAddToTree(CoastlineFeaturesGenerator & rMain) + explicit DoAddToTree(CoastlineFeaturesGenerator & rMain) : m_rMain(rMain), m_notMergedCoastsCount(0), m_totalNotMergedCoastsPoints(0) {} virtual void operator() (FeatureBuilder1 const & fb) diff --git a/generator/generator_tests/tesselator_test.cpp b/generator/generator_tests/tesselator_test.cpp index a4719fd6e7..c4d58e67ef 100644 --- a/generator/generator_tests/tesselator_test.cpp +++ b/generator/generator_tests/tesselator_test.cpp @@ -14,7 +14,7 @@ namespace { size_t & m_count; public: - DoDump(size_t & count) : m_count(count) + explicit DoDump(size_t & count) : m_count(count) { m_count = 0; } diff --git a/generator/statistics.cpp b/generator/statistics.cpp index 9b1f938edb..db4b2d4d9b 100644 --- a/generator/statistics.cpp +++ b/generator/statistics.cpp @@ -51,7 +51,7 @@ namespace stats MapInfo & m_info; public: - AccumulateStatistic(MapInfo & info) : m_info(info) {} + explicit AccumulateStatistic(MapInfo & info) : m_info(info) {} void operator() (FeatureType & f, uint32_t) { diff --git a/geocoder/geocoder_tests/geocoder_tests.cpp b/geocoder/geocoder_tests/geocoder_tests.cpp index d8568dcd7c..95ecd182ab 100644 --- a/geocoder/geocoder_tests/geocoder_tests.cpp +++ b/geocoder/geocoder_tests/geocoder_tests.cpp @@ -135,11 +135,11 @@ UNIT_TEST(Geocoder_MismatchedLocality) 10 {"properties": {"address": {"locality": "Moscow"}}} 11 {"properties": {"address": {"locality": "Paris"}}} -21 {"properties": {"address": {"street": "Street", "locality": "Moscow"}}} -22 {"properties": {"address": {"building": "2", "street": "Street", "locality": "Moscow"}}} +21 {"properties": {"address": {"street": "Krymskaya", "locality": "Moscow"}}} +22 {"properties": {"address": {"building": "2", "street": "Krymskaya", "locality": "Moscow"}}} -31 {"properties": {"address": {"street": "Street", "locality": "Paris"}}} -32 {"properties": {"address": {"building": "3", "street": "Street", "locality": "Paris"}}} +31 {"properties": {"address": {"street": "Krymskaya", "locality": "Paris"}}} +32 {"properties": {"address": {"building": "3", "street": "Krymskaya", "locality": "Paris"}}} )#"; ScopedFile const regionsJsonFile("regions.jsonl", kData); @@ -147,10 +147,10 @@ UNIT_TEST(Geocoder_MismatchedLocality) base::GeoObjectId const building2(22); - TestGeocoder(geocoder, "Moscow Street 2", {{building2, 1.0}}); + TestGeocoder(geocoder, "Moscow Krymskaya 2", {{building2, 1.0}}); - // "Street 3" looks almost like a match to "Paris-Street-3" but we should not emit it. - TestGeocoder(geocoder, "Moscow Street 3", {}); + // "Krymskaya 3" looks almost like a match to "Paris-Krymskaya-3" but we should not emit it. + TestGeocoder(geocoder, "Moscow Krymskaya 3", {}); } UNIT_TEST(Geocoder_LocalityBuilding) @@ -160,8 +160,8 @@ UNIT_TEST(Geocoder_LocalityBuilding) 22 {"properties": {"address": {"building": "2", "locality": "Zelenograd"}}} -31 {"properties": {"address": {"street": "Street", "locality": "Zelenograd"}}} -32 {"properties": {"address": {"building": "2", "street": "Street", "locality": "Zelenograd"}}} +31 {"properties": {"address": {"street": "Krymskaya", "locality": "Zelenograd"}}} +32 {"properties": {"address": {"building": "2", "street": "Krymskaya", "locality": "Zelenograd"}}} )#"; ScopedFile const regionsJsonFile("regions.jsonl", kData); diff --git a/geocoder/hierarchy.cpp b/geocoder/hierarchy.cpp index d606f3459c..abccd07598 100644 --- a/geocoder/hierarchy.cpp +++ b/geocoder/hierarchy.cpp @@ -76,6 +76,19 @@ bool Hierarchy::Entry::DeserializeFromJSONImpl(json_t * const root, string const m_type = static_cast<Type>(i); } + auto const & subregion = m_address[static_cast<size_t>(Type::Subregion)]; + auto const & locality = m_address[static_cast<size_t>(Type::Locality)]; + if (m_type == Type::Street && locality.empty() && subregion.empty() /* if locality detection fail */) + { + ++stats.m_noLocalityStreets; + return false; + } + if (m_type == Type::Building && locality.empty() && subregion.empty() /* if locality detection fail */) + { + ++stats.m_noLocalityBuildings; + return false; + } + m_nameTokens.clear(); FromJSONObjectOptionalField(properties, "name", m_name); search::NormalizeAndTokenizeAsUtf8(m_name, m_nameTokens); diff --git a/geocoder/hierarchy.hpp b/geocoder/hierarchy.hpp index 8579db75fb..087f694074 100644 --- a/geocoder/hierarchy.hpp +++ b/geocoder/hierarchy.hpp @@ -41,6 +41,12 @@ public: // Number of entries without the name field or with an empty one. uint64_t m_emptyNames = 0; + // Number of street entries without a locality name. + uint64_t m_noLocalityStreets = 0; + + // Number of building entries without a locality name. + uint64_t m_noLocalityBuildings = 0; + // Number of entries whose names do not match the most // specific parts of their addresses. // This is expected from POIs but not from regions or streets. @@ -72,7 +78,7 @@ public: Type m_type = Type::Count; // The address fields of this entry, one per Type. - std::array<Tokens, static_cast<size_t>(Type::Count) + 1> m_address; + std::array<Tokens, static_cast<size_t>(Type::Count)> m_address; }; explicit Hierarchy(std::vector<Entry> && entries, bool sorted); diff --git a/geocoder/hierarchy_reader.cpp b/geocoder/hierarchy_reader.cpp index ae734f97ef..f0f5f30c82 100644 --- a/geocoder/hierarchy_reader.cpp +++ b/geocoder/hierarchy_reader.cpp @@ -20,7 +20,7 @@ void operator+=(Hierarchy::ParsingStats & accumulator, Hierarchy::ParsingStats & struct ValidationStats { uint64_t m_numLoaded, m_badJsons, m_badOsmIds, m_duplicateOsmIds, m_duplicateAddresses, - m_emptyAddresses, m_emptyNames, m_mismatchedNames; + m_emptyAddresses, m_emptyNames, m_noLocalityStreets, m_noLocalityBuildings, m_mismatchedNames; }; static_assert(sizeof(Hierarchy::ParsingStats) == sizeof(ValidationStats), "Hierarchy::ParsingStats has been modified"); @@ -32,6 +32,8 @@ void operator+=(Hierarchy::ParsingStats & accumulator, Hierarchy::ParsingStats & accumulator.m_duplicateAddresses += stats.m_duplicateAddresses; accumulator.m_emptyAddresses += stats.m_emptyAddresses; accumulator.m_emptyNames += stats.m_emptyNames; + accumulator.m_noLocalityStreets += stats.m_noLocalityStreets; + accumulator.m_noLocalityBuildings += stats.m_noLocalityBuildings; accumulator.m_mismatchedNames += stats.m_mismatchedNames; } } // namespace @@ -82,6 +84,8 @@ Hierarchy HierarchyReader::Read(unsigned int readersCount) LOG(LINFO, ("Entries with duplicate address parts:", stats.m_duplicateAddresses)); LOG(LINFO, ("Entries without address:", stats.m_emptyAddresses)); LOG(LINFO, ("Entries without names:", stats.m_emptyNames)); + LOG(LINFO, ("Street entries without a locality name:", stats.m_noLocalityStreets)); + LOG(LINFO, ("Building entries without a locality name:", stats.m_noLocalityBuildings)); LOG(LINFO, ("Entries whose names do not match their most specific addresses:", stats.m_mismatchedNames)); LOG(LINFO, ("(End of stats.)")); diff --git a/geocoder/index.cpp b/geocoder/index.cpp index 21b30be043..ae47e36e1c 100644 --- a/geocoder/index.cpp +++ b/geocoder/index.cpp @@ -8,6 +8,7 @@ #include "base/logging.hpp" #include "base/string_utils.hpp" +#include <algorithm> #include <atomic> #include <cstddef> #include <mutex> @@ -43,7 +44,12 @@ Index::Doc const & Index::GetDoc(DocId const id) const // static string Index::MakeIndexKey(Tokens const & tokens) { - return strings::JoinStrings(tokens, " "); + if (tokens.size() == 1 || is_sorted(begin(tokens), end(tokens))) + return strings::JoinStrings(tokens, " "); + + auto indexTokens = tokens; + sort(begin(indexTokens), end(indexTokens)); + return strings::JoinStrings(indexTokens, " "); } void Index::AddEntries() @@ -83,11 +89,25 @@ void Index::AddStreet(DocId const & docId, Index::Doc const & doc) { CHECK_EQUAL(doc.m_type, Type::Street, ()); size_t const t = static_cast<size_t>(doc.m_type); + + auto isStreetSynonym = [] (string const & s) { + return search::IsStreetSynonym(strings::MakeUniString(s)); + }; + + if (all_of(begin(doc.m_address[t]), end(doc.m_address[t]), isStreetSynonym)) + { + LOG(LDEBUG, ("Undefined proper name in tokens", doc.m_address[t], "of street entry", + doc.m_osmId, "(", doc.m_address, ")")); + if (doc.m_address[t].size() > 1) + m_docIdsByTokens[MakeIndexKey(doc.m_address[t])].emplace_back(docId); + return; + } + m_docIdsByTokens[MakeIndexKey(doc.m_address[t])].emplace_back(docId); for (size_t i = 0; i < doc.m_address[t].size(); ++i) { - if (!search::IsStreetSynonym(strings::MakeUniString(doc.m_address[t][i]))) + if (!isStreetSynonym(doc.m_address[t][i])) continue; auto addr = doc.m_address[t]; addr.erase(addr.begin() + i); diff --git a/geometry/screenbase.cpp b/geometry/screenbase.cpp index 1721b3148f..e922aa3bd1 100644 --- a/geometry/screenbase.cpp +++ b/geometry/screenbase.cpp @@ -441,6 +441,11 @@ m2::PointD ScreenBase::PtoP3d(m2::PointD const & pt, double ptZ) const m2::PointD ScreenBase::P3dtoP(m2::PointD const & pt) const { + return P3dtoP(pt, 0.0 /* ptZ */); +} + +m2::PointD ScreenBase::P3dtoP(m2::PointD const & pt, double ptZ) const +{ if (!m_isPerspective) return pt; @@ -448,14 +453,24 @@ m2::PointD ScreenBase::P3dtoP(m2::PointD const & pt) const double const normalizedY = -2.0 * pt.y / PixelRectIn3d().SizeY() + 1.0; double normalizedZ = 0.0; + if (m_3dAngleX != 0.0) { double const halfFOV = m_3dFOV / 2.0; double const cameraZ = 1.0 / tan(halfFOV); double const tanX = tan(m_3dAngleX); - double const cameraDistanceZ = - cameraZ * (1.0 + (normalizedY + 1.0) * tanX / (cameraZ - normalizedY * tanX)); + double cameraDistanceZ = cameraZ * (1.0 + (normalizedY + 1.0) * tanX / (cameraZ - normalizedY * tanX)); + + if (ptZ != 0.0) + { + double const t = sqrt(cameraZ * cameraZ + normalizedY * normalizedY); + double const cosBeta = cameraZ / t; + double const sinBeta = normalizedY / t; + double const dz = ptZ * GetZScale() * cosBeta / (cos(m_3dAngleX) * cosBeta - sin(m_3dAngleX) * sinBeta); + + cameraDistanceZ -= dz; + } double const a = (m_3dFarZ + m_3dNearZ) / (m_3dFarZ - m_3dNearZ); double const b = -2.0 * m_3dFarZ * m_3dNearZ / (m_3dFarZ - m_3dNearZ); diff --git a/geometry/screenbase.hpp b/geometry/screenbase.hpp index 2278883134..ffdaa96612 100644 --- a/geometry/screenbase.hpp +++ b/geometry/screenbase.hpp @@ -92,6 +92,7 @@ public: double GetDepth3d() const { return m_3dFarZ - m_3dNearZ; } m2::PointD P3dtoP(m2::PointD const & pt) const; + m2::PointD P3dtoP(m2::PointD const & pt, double ptZ) const; Matrix3dT const & Pto3dMatrix() const { return m_Pto3d; } bool isPerspective() const { return m_isPerspective; } diff --git a/indexer/drawing_rules.cpp b/indexer/drawing_rules.cpp index c0e29e4cb9..c422d5522c 100644 --- a/indexer/drawing_rules.cpp +++ b/indexer/drawing_rules.cpp @@ -217,7 +217,7 @@ namespace { LineDefProto m_line; public: - Line(LineRuleProto const & r) + explicit Line(LineRuleProto const & r) { m_line.set_color(r.color()); m_line.set_width(r.width()); @@ -236,7 +236,7 @@ namespace { AreaRuleProto m_area; public: - Area(AreaRuleProto const & r) : m_area(r) {} + explicit Area(AreaRuleProto const & r) : m_area(r) {} virtual AreaRuleProto const * GetArea() const { return &m_area; } }; @@ -245,7 +245,7 @@ namespace { SymbolRuleProto m_symbol; public: - Symbol(SymbolRuleProto const & r) : m_symbol(r) + explicit Symbol(SymbolRuleProto const & r) : m_symbol(r) { SetType(r.apply_for_type()); } @@ -261,9 +261,8 @@ namespace text_type_t m_textTypeSecondary; public: - CaptionT(T const & r) : m_caption(r) - , m_textTypePrimary(text_type_name) - , m_textTypeSecondary(text_type_name) + explicit CaptionT(T const & r) + : m_caption(r), m_textTypePrimary(text_type_name), m_textTypeSecondary(text_type_name) { if (!m_caption.primary().text().empty()) m_textTypePrimary = GetTextType(m_caption.primary().text()); @@ -305,7 +304,7 @@ namespace { ShieldRuleProto m_shield; public: - Shield(ShieldRuleProto const & r) : m_shield(r) {} + explicit Shield(ShieldRuleProto const & r) : m_shield(r) {} virtual ShieldRuleProto const * GetShield() const { return &m_shield; } }; @@ -408,7 +407,7 @@ namespace } public: - DoSetIndex(RulesHolder & holder) + explicit DoSetIndex(RulesHolder & holder) : m_holder(holder) {} void operator() (ClassifObject * p) diff --git a/indexer/feature_visibility.cpp b/indexer/feature_visibility.cpp index a71329769d..51077d6a85 100644 --- a/indexer/feature_visibility.cpp +++ b/indexer/feature_visibility.cpp @@ -136,7 +136,7 @@ namespace int m_scale; public: - IsDrawableChecker(int scale) : m_scale(scale) {} + explicit IsDrawableChecker(int scale) : m_scale(scale) {} typedef bool ResultType; diff --git a/map/benchmark_tool/features_loading.cpp b/map/benchmark_tool/features_loading.cpp index 5cc42f8015..6851035b60 100644 --- a/map/benchmark_tool/features_loading.cpp +++ b/map/benchmark_tool/features_loading.cpp @@ -28,7 +28,7 @@ namespace int m_scale; public: - Accumulator(Result & res) : m_res(res) {} + explicit Accumulator(Result & res) : m_res(res) {} void Reset(int scale) { diff --git a/map/framework.hpp b/map/framework.hpp index c7ef5cc817..7fda4c5469 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -265,7 +265,7 @@ protected: void InitTransliteration(); public: - Framework(FrameworkParams const & params = {}); + explicit Framework(FrameworkParams const & params = {}); virtual ~Framework(); /// Get access to booking api helpers diff --git a/map/geourl_process.cpp b/map/geourl_process.cpp index ef9721c70b..6f54f6efa2 100644 --- a/map/geourl_process.cpp +++ b/map/geourl_process.cpp @@ -111,7 +111,7 @@ namespace url_scheme }; public: - LatLonParser(Info & info) + explicit LatLonParser(Info & info) : m_regexp("-?\\d+\\.{1}\\d*, *-?\\d+\\.{1}\\d*") , m_info(info) , m_latPriority(-1) diff --git a/map/mwm_tests/multithread_mwm_test.cpp b/map/mwm_tests/multithread_mwm_test.cpp index 4b1899a1d2..9825c30fc6 100644 --- a/map/mwm_tests/multithread_mwm_test.cpp +++ b/map/mwm_tests/multithread_mwm_test.cpp @@ -36,7 +36,7 @@ namespace } public: - FeaturesLoader(SourceT const & src) : m_src(src) {} + explicit FeaturesLoader(SourceT const & src) : m_src(src) {} virtual void Do() { diff --git a/map/routing_manager.cpp b/map/routing_manager.cpp index 886f048ad1..5b46665725 100644 --- a/map/routing_manager.cpp +++ b/map/routing_manager.cpp @@ -619,7 +619,7 @@ void RoutingManager::FollowRoute() m_transitReadManager->BlockTransitSchemeMode(true /* isBlocked */); - // Switching on the extrapolatior only for following mode in car and bicycle navigation. + // Switching on the extrapolator only for following mode in car and bicycle navigation. m_extrapolator.Enable(m_currentRouterType == RouterType::Vehicle || m_currentRouterType == RouterType::Bicycle); m_delegate.OnRouteFollow(m_currentRouterType); diff --git a/map/style_tests/classificator_tests.cpp b/map/style_tests/classificator_tests.cpp index f930e887d6..181240026d 100644 --- a/map/style_tests/classificator_tests.cpp +++ b/map/style_tests/classificator_tests.cpp @@ -32,7 +32,7 @@ namespace { Classificator const & m_c; public: - DoCheckConsistency(Classificator const & c) : m_c(c) {} + explicit DoCheckConsistency(Classificator const & c) : m_c(c) {} void operator() (ClassifObject const * p, uint32_t type) const { if (p->IsDrawableAny() && !m_c.IsTypeValid(type)) diff --git a/platform/http_request.cpp b/platform/http_request.cpp index f2dece1621..6169c6becf 100644 --- a/platform/http_request.cpp +++ b/platform/http_request.cpp @@ -155,7 +155,7 @@ class FileHttpRequest : public HttpRequest, public IHttpThreadCallback { int64_t m_pos; public: - ThreadByPos(int64_t pos) : m_pos(pos) {} + explicit ThreadByPos(int64_t pos) : m_pos(pos) {} inline bool operator() (ThreadHandleT const & p) const { return (p.second == m_pos); diff --git a/platform/location_service.cpp b/platform/location_service.cpp index ecffe373f3..52c9e1810e 100644 --- a/platform/location_service.cpp +++ b/platform/location_service.cpp @@ -71,7 +71,7 @@ namespace location } public: - DesktopLocationService(LocationObserver & observer) + explicit DesktopLocationService(LocationObserver & observer) : LocationService(observer), m_reportFirstEvent(true) { #if defined(OMIM_OS_MAC) diff --git a/platform/platform_tests/apk_test.cpp b/platform/platform_tests/apk_test.cpp index 83760b4e24..76f9094a50 100644 --- a/platform/platform_tests/apk_test.cpp +++ b/platform/platform_tests/apk_test.cpp @@ -41,9 +41,8 @@ namespace string const & m_cont; public: - ApkTester(string const & cont) : m_cont(cont) + explicit ApkTester(string const & cont) : m_cont(cont), m_hashes(COUNT) { - m_hashes.resize(COUNT); } virtual void Do() diff --git a/platform/wifi_location_service.cpp b/platform/wifi_location_service.cpp index 7f80c38add..f3ea900756 100644 --- a/platform/wifi_location_service.cpp +++ b/platform/wifi_location_service.cpp @@ -95,7 +95,7 @@ namespace location } public: - WiFiLocationService(LocationObserver & observer) : LocationService(observer) + explicit WiFiLocationService(LocationObserver & observer) : LocationService(observer) { } diff --git a/routing/restrictions_serialization.hpp b/routing/restrictions_serialization.hpp index c942a14de2..59f5df89a1 100644 --- a/routing/restrictions_serialization.hpp +++ b/routing/restrictions_serialization.hpp @@ -11,9 +11,10 @@ #include "base/bits.hpp" #include "base/checked_cast.hpp" -#include "std/algorithm.hpp" -#include "std/string.hpp" -#include "std/vector.hpp" +#include <algorithm> +#include <cstdint> +#include <string> +#include <vector> namespace routing { @@ -27,7 +28,7 @@ struct Restriction /// could be split into two categories. /// * no_left_turn, no_right_turn, no_u_turn and so on go to "No" category. /// * only_left_turn, only_right_turn and so on go to "Only" category. - /// That's enough to rememeber if + /// That's enough to remember if /// * there's only way to pass the junction is driving along the restriction (Only) /// * driving along the restriction is prohibited (No) enum class Type @@ -36,21 +37,21 @@ struct Restriction Only, // Only going according such restriction is permitted }; - Restriction(Type type, vector<uint32_t> const & links) : m_featureIds(links), m_type(type) {} + Restriction(Type type, std::vector<uint32_t> const & links) : m_featureIds(links), m_type(type) {} bool IsValid() const; bool operator==(Restriction const & restriction) const; bool operator<(Restriction const & restriction) const; // Links of the restriction in feature ids term. - vector<uint32_t> m_featureIds; + std::vector<uint32_t> m_featureIds; Type m_type; }; -using RestrictionVec = vector<Restriction>; +using RestrictionVec = std::vector<Restriction>; -string ToString(Restriction::Type const & type); -string DebugPrint(Restriction::Type const & type); -string DebugPrint(Restriction const & restriction); +std::string ToString(Restriction::Type const & type); +std::string DebugPrint(Restriction::Type const & type); +std::string DebugPrint(Restriction const & restriction); struct RestrictionHeader { @@ -95,8 +96,8 @@ class RestrictionSerializer public: template <class Sink> static void Serialize(RestrictionHeader const & header, - routing::RestrictionVec::const_iterator begin, - routing::RestrictionVec::const_iterator end, Sink & sink) + RestrictionVec::const_iterator begin, + RestrictionVec::const_iterator end, Sink & sink) { auto const firstOnlyIt = begin + header.m_noRestrictionCount; SerializeSingleType(begin, firstOnlyIt, sink); @@ -105,12 +106,12 @@ public: template <class Source> static void Deserialize(RestrictionHeader const & header, - routing::RestrictionVec & restrictionsNo, - routing::RestrictionVec & restrictionsOnly, Source & src) + RestrictionVec & restrictionsNo, + RestrictionVec & restrictionsOnly, Source & src) { - DeserializeSingleType(routing::Restriction::Type::No, header.m_noRestrictionCount, + DeserializeSingleType(Restriction::Type::No, header.m_noRestrictionCount, restrictionsNo, src); - DeserializeSingleType(routing::Restriction::Type::Only, header.m_onlyRestrictionCount, + DeserializeSingleType(Restriction::Type::Only, header.m_onlyRestrictionCount, restrictionsOnly, src); } @@ -122,14 +123,14 @@ private: /// \param end is an iterator to the element after the last element to serialize. /// \note All restrictions should have the same type. template <class Sink> - static void SerializeSingleType(routing::RestrictionVec::const_iterator begin, - routing::RestrictionVec::const_iterator end, Sink & sink) + static void SerializeSingleType(RestrictionVec::const_iterator begin, + RestrictionVec::const_iterator end, Sink & sink) { if (begin == end) return; - CHECK(is_sorted(begin, end), ()); - routing::Restriction::Type const type = begin->m_type; + CHECK(std::is_sorted(begin, end), ()); + Restriction::Type const type = begin->m_type; uint32_t prevFirstLinkFeatureId = 0; BitWriter<FileWriter> bits(sink); @@ -160,8 +161,8 @@ private: } template <class Source> - static bool DeserializeSingleType(routing::Restriction::Type type, uint32_t count, - routing::RestrictionVec & restrictions, Source & src) + static bool DeserializeSingleType(Restriction::Type type, uint32_t count, + RestrictionVec & restrictions, Source & src) { uint32_t prevFirstLinkFeatureId = 0; BitReader<Source> bits(src); @@ -175,7 +176,7 @@ private: } size_t const numLinks = biasedLinkNumber + 1 /* number of link is two or more */; - routing::Restriction restriction(type, {} /* links */); + Restriction restriction(type, {} /* links */); restriction.m_featureIds.resize(numLinks); auto const biasedFirstFeatureId = coding::DeltaCoder::Decode(bits); if (biasedFirstFeatureId == 0) @@ -185,7 +186,7 @@ private: } restriction.m_featureIds[0] = prevFirstLinkFeatureId + base::checked_cast<uint32_t>(biasedFirstFeatureId) - 1; - for (size_t i = 1; i < numLinks; ++i) + for (size_t j = 1; j < numLinks; ++j) { auto const biasedDelta = coding::DeltaCoder::Decode(bits); if (biasedDelta == 0) @@ -195,8 +196,8 @@ private: } uint32_t const delta = base::asserted_cast<uint32_t>(biasedDelta - 1); - restriction.m_featureIds[i] = - static_cast<uint32_t>(bits::ZigZagDecode(delta) + restriction.m_featureIds[i - 1]); + restriction.m_featureIds[j] = + static_cast<uint32_t>(bits::ZigZagDecode(delta) + restriction.m_featureIds[j - 1]); } prevFirstLinkFeatureId = restriction.m_featureIds[0]; diff --git a/search/features_layer_matcher.cpp b/search/features_layer_matcher.cpp index 56d442005b..49ec9d61b1 100644 --- a/search/features_layer_matcher.cpp +++ b/search/features_layer_matcher.cpp @@ -53,46 +53,32 @@ void FeaturesLayerMatcher::OnQueryFinished() uint32_t FeaturesLayerMatcher::GetMatchingStreet(uint32_t houseId) { - FeatureType feature; - return GetMatchingStreetImpl(houseId, feature); -} - -uint32_t FeaturesLayerMatcher::GetMatchingStreet(uint32_t houseId, FeatureType & houseFeature) -{ - return GetMatchingStreetImpl(houseId, houseFeature); -} + auto entry = m_matchingStreetsCache.Get(houseId); + if (!entry.second) + return entry.first; -FeaturesLayerMatcher::Streets const & FeaturesLayerMatcher::GetNearbyStreets(uint32_t featureId) -{ FeatureType feature; - return GetNearbyStreetsImpl(featureId, feature); -} + if (!GetByIndex(houseId, feature)) + return kInvalidId; -FeaturesLayerMatcher::Streets const & FeaturesLayerMatcher::GetNearbyStreets(uint32_t featureId, - FeatureType & feature) -{ - return GetNearbyStreetsImpl(featureId, feature); + return GetMatchingStreet(feature); } -FeaturesLayerMatcher::Streets const & FeaturesLayerMatcher::GetNearbyStreetsImpl( - uint32_t featureId, FeatureType & feature) +FeaturesLayerMatcher::Streets const & FeaturesLayerMatcher::GetNearbyStreets(FeatureType & feature) { static FeaturesLayerMatcher::Streets const kEmptyStreets; - auto entry = m_nearbyStreetsCache.Get(featureId); + auto entry = m_nearbyStreetsCache.Get(feature.GetID().m_index); if (!entry.second) return entry.first; - if (!feature.GetID().IsValid() && !GetByIndex(featureId, feature)) - return kEmptyStreets; - auto & streets = entry.first; m_reverseGeocoder.GetNearbyStreets(feature, streets); return streets; } -uint32_t FeaturesLayerMatcher::GetMatchingStreetImpl(uint32_t houseId, FeatureType & houseFeature) +uint32_t FeaturesLayerMatcher::GetMatchingStreet(FeatureType & houseFeature) { // Check if this feature is modified - the logic will be different. string streetName; @@ -100,14 +86,10 @@ uint32_t FeaturesLayerMatcher::GetMatchingStreetImpl(uint32_t houseId, FeatureTy osm::Editor::Instance().GetEditedFeatureStreet(houseFeature.GetID(), streetName); // Check the cached result value. - auto entry = m_matchingStreetsCache.Get(houseId); + auto entry = m_matchingStreetsCache.Get(houseFeature.GetID().m_index); if (!edited && !entry.second) return entry.first; - // Load feature if needed. - if (!houseFeature.GetID().IsValid() && !GetByIndex(houseId, houseFeature)) - return kInvalidId; - uint32_t & result = entry.first; result = kInvalidId; @@ -119,7 +101,7 @@ uint32_t FeaturesLayerMatcher::GetMatchingStreetImpl(uint32_t houseId, FeatureTy } // Get nearby streets and calculate the resulting index. - auto const & streets = GetNearbyStreets(houseId, houseFeature); + auto const & streets = GetNearbyStreets(houseFeature); if (edited) { diff --git a/search/features_layer_matcher.hpp b/search/features_layer_matcher.hpp index 97c1dbaef9..574e3119ed 100644 --- a/search/features_layer_matcher.hpp +++ b/search/features_layer_matcher.hpp @@ -341,24 +341,21 @@ private: if (!loaded && !GetByIndex(houseId, feature)) continue; - if (GetMatchingStreet(houseId, feature) == streetId) + if (GetMatchingStreet(feature) == streetId) fn(houseId, streetId); } } } - // Returns id of a street feature corresponding to a |houseId|, or + // Returns id of a street feature corresponding to a |houseId|/|houseFeature|, or // kInvalidId if there're not such street. uint32_t GetMatchingStreet(uint32_t houseId); - uint32_t GetMatchingStreet(uint32_t houseId, FeatureType & houseFeature); - uint32_t GetMatchingStreetImpl(uint32_t houseId, FeatureType & houseFeature); + uint32_t GetMatchingStreet(FeatureType & houseFeature); using Street = ReverseGeocoder::Street; using Streets = std::vector<Street>; - Streets const & GetNearbyStreets(uint32_t featureId); - Streets const & GetNearbyStreets(uint32_t featureId, FeatureType & feature); - Streets const & GetNearbyStreetsImpl(uint32_t featureId, FeatureType & feature); + Streets const & GetNearbyStreets(FeatureType & feature); inline bool GetByIndex(uint32_t id, FeatureType & ft) const { diff --git a/search/house_detector.hpp b/search/house_detector.hpp index bee7dcbf5e..ad03f86502 100644 --- a/search/house_detector.hpp +++ b/search/house_detector.hpp @@ -75,7 +75,7 @@ struct HouseProjection : public ProjectionOnStreet class EqualHouse { public: - EqualHouse(House const * h) : m_house(h) {} + explicit EqualHouse(House const * h) : m_house(h) {} bool operator() (HouseProjection const * p) const { return m_house == p->m_house; } private: diff --git a/software_renderer/cpu_drawer.cpp b/software_renderer/cpu_drawer.cpp index 3309a6042d..0be7ecafea 100644 --- a/software_renderer/cpu_drawer.cpp +++ b/software_renderer/cpu_drawer.cpp @@ -119,7 +119,7 @@ class CPUDrawer::CPUOverlayTree bool m_isIntersect; public: - DoPreciseIntersect(CPUDrawer::OverlayWrapper const * oe) + explicit DoPreciseIntersect(CPUDrawer::OverlayWrapper const * oe) : m_elem(oe), m_isIntersect(false) { } diff --git a/software_renderer/text_engine.h b/software_renderer/text_engine.h index a38d49211e..a69f5273f3 100644 --- a/software_renderer/text_engine.h +++ b/software_renderer/text_engine.h @@ -128,7 +128,7 @@ public: unsigned int charcode; symbol_holder() : advance(0), angle(0.0), charcode(0) {} - symbol_holder(unsigned int code) : advance(0), angle(0.0), charcode(code) {} + explicit symbol_holder(unsigned int code) : advance(0), angle(0.0), charcode(code) {} ml::rect_d const & bounds() const { return m_bounds; } }; diff --git a/tools/python/openlr/quality.py b/tools/python/openlr/quality.py index f27b2122c1..903b058f31 100755 --- a/tools/python/openlr/quality.py +++ b/tools/python/openlr/quality.py @@ -141,12 +141,16 @@ def parse_route(route): def ignored_segments_number(tree, limit): ignored_segments = 0 + ignored_segments_but_matched = 0 segments = islice(tree.findall('.//Segment'), limit) for s in segments: ignored = s.find('Ignored') if ignored is not None and ignored.text == 'true': ignored_segments += 1 - return ignored_segments + route = s.find('Route') + if route is not None: + ignored_segments_but_matched += 1 + return ignored_segments, ignored_segments_but_matched def parse_segments(tree, limit): segments = islice(tree.findall('.//Segment'), limit) @@ -184,15 +188,26 @@ def merge(src, dst): int(s.find('.//ReportSegmentID').text): s.find('GoldenRoute') for s in src.findall('Segment') } + ignored_routes = { + int(s.find('.//ReportSegmentID').text): s.find('Ignored') + for s in src.findall('Segment') + } for s in dst.findall('Segment'): assert not s.find('GoldenRoute') - golden_route = golden_routes[int(s.find('.//ReportSegmentID').text)] - if not golden_route: + assert not s.find('Ignored') + + reportSegmentID = int(s.find('.//ReportSegmentID').text) + golden_route = golden_routes[reportSegmentID] + ignored_route = ignored_routes[reportSegmentID] + + if ignored_route is not None and ignored_route.text == 'true': elem = ET.Element('Ignored') elem.text = 'true' s.append(elem) continue - s.append(golden_route) + + if golden_route: + s.append(golden_route) if __name__ == '__main__': import argparse @@ -242,6 +257,10 @@ if __name__ == '__main__': 'Base' if mean1 - mean2 > 0 else 'New', mean1 - mean2 )) + print('Base: {0[1]} matched segments from {0[0]} ignored segments.'. + format(ignored_segments_number(assessed, args.limit))) + print('New: {0[1]} matched segments from {0[0]} ignored segments.'. + format(ignored_segments_number(candidate, args.limit))) else: print('{}\t{}'.format( 'segment_id', 'intersection_weight') @@ -253,4 +272,6 @@ if __name__ == '__main__': np.mean(list(assessed_scores.values())), np.std(list(assessed_scores.values()), ddof=1) )) - print('Ignored segments number: {:d}'.format(ignored_segments_number(assessed, args.limit))) + + print('{0[1]} matched segments from {0[0]} ignored segments.'. + format(ignored_segments_number(assessed, args.limit))) |