From 71610bc327792f1cff0285d94ce83d46d8033d06 Mon Sep 17 00:00:00 2001 From: alex-osm Date: Wed, 17 Apr 2024 16:26:33 +0300 Subject: [PATCH] Handle skImageFromPngResource null result --- .../Map/Layers/OABaseVectorLinesLayer.mm | 13 ++-- Sources/Core/OAMapMarkersCollection.mm | 78 ++++++++++--------- Sources/Core/OAMapillaryTilesProvider.mm | 3 + Sources/Core/OAOsmNotesMapLayerProvider.mm | 2 + Sources/Helpers/OANativeUtilities.mm | 15 +++- 5 files changed, 63 insertions(+), 48 deletions(-) diff --git a/Sources/Controllers/Map/Layers/OABaseVectorLinesLayer.mm b/Sources/Controllers/Map/Layers/OABaseVectorLinesLayer.mm index a9f221b570..cf5da2c86f 100644 --- a/Sources/Controllers/Map/Layers/OABaseVectorLinesLayer.mm +++ b/Sources/Controllers/Map/Layers/OABaseVectorLinesLayer.mm @@ -58,8 +58,7 @@ - (void)initLayer _currentGraphPosition = std::make_shared(); _currentGraphXAxisPositions = std::make_shared(); - - + _xAxisLocationIcon = [OANativeUtilities skImageFromPngResource:@"map_mapillary_location"]; OsmAnd::MapMarkerBuilder locationMarkerBuilder; @@ -170,9 +169,10 @@ - (void) setVectorLineProvider:(std::shared_ptr & canvas.drawCircle(bitmapSize / 2, bitmapSize / 2, (bitmapSize - strokeWidth) / 2, paint); const auto arrowImage = [OANativeUtilities skImageFromPngResource:@"map_direction_arrow_small"]; - canvas.drawImage(arrowImage, - (bitmapSize - arrowImage->width()) / 2.0f, - (bitmapSize - arrowImage->height()) / 2.0f); + if (arrowImage) + canvas.drawImage(arrowImage, + (bitmapSize - arrowImage->width()) / 2.0f, + (bitmapSize - arrowImage->height()) / 2.0f); canvas.flush(); return bitmap.asImage(); @@ -259,7 +259,8 @@ - (void) showCurrentStatisticsLocation:(OATrackChartPoints *)trackPoints for (CLLocation *location in trackPoints.xAxisPoints) { - xAxisMarkerBuilder.addOnMapSurfaceIcon(_locationIconKey, OsmAnd::SingleSkImage(_xAxisLocationIcon)); + if (_xAxisLocationIcon) + xAxisMarkerBuilder.addOnMapSurfaceIcon(_locationIconKey, OsmAnd::SingleSkImage(_xAxisLocationIcon)); const auto& marker = xAxisMarkerBuilder.buildAndAddToCollection(_currentGraphXAxisPositions); marker->setPosition(OsmAnd::Utilities::convertLatLonTo31(OsmAnd::LatLon(location.coordinate.latitude, location.coordinate.longitude))); } diff --git a/Sources/Core/OAMapMarkersCollection.mm b/Sources/Core/OAMapMarkersCollection.mm index ed399aed8b..6e3dae4d10 100644 --- a/Sources/Core/OAMapMarkersCollection.mm +++ b/Sources/Core/OAMapMarkersCollection.mm @@ -119,44 +119,46 @@ // SpriteMapSymbol with pinIconBitmap as an icon sk_sp pinIcon([OANativeUtilities skImageFromPngResource:@"icon_star_fill"]); - - const std::shared_ptr pinIconSymbol(new OsmAnd::BillboardRasterMapSymbol( - symbolsGroup)); - pinIconSymbol->order = order++; - pinIconSymbol->image = pinIcon; - pinIconSymbol->size = OsmAnd::PointI(pinIcon->width(), pinIcon->height()); - pinIconSymbol->contentClass = OsmAnd::RasterMapSymbol::ContentClass::Icon; - pinIconSymbol->content = QString().sprintf( - "markerGroup(%p:%p)->pinIconBitmap:%p", - this, - symbolsGroup.get(), - pinIcon.get()); - pinIconSymbol->languageId = OsmAnd::LanguageId::Invariant; - - pinIconSymbol->position31 = OsmAnd::Utilities::convertLatLonTo31(OsmAnd::LatLon(50.4486, 30.51348)); - //pinIconSymbol->offset = OsmAnd::PointI(0, 0); - pinIconSymbol->isHidden = false; - //pinIconSymbol->modulationColor = OsmAnd::FColorARGB(); - - /* - std::shared_ptr textSymbol(new OsmAnd::MapPrimitiviser::TextSymbol()); - - const std::shared_ptr pinCaptionSymbol(new OsmAnd::SymbolRasterizer::RasterizedSpriteSymbol(symbolsGroup)); - - pinCaptionSymbol->order = order++; - pinCaptionSymbol->contentClass = OsmAnd::RasterMapSymbol::ContentClass::Caption; - pinCaptionSymbol->content = QString("Test Тест Надпись"); - pinCaptionSymbol->languageId = OsmAnd::LanguageId::Invariant; - - pinCaptionSymbol->position31 = OsmAnd::Utilities::convertLatLonTo31(OsmAnd::LatLon(50.4486, 30.51348)); - //pinCaptionSymbol->offset = OsmAnd::PointI(0, 0); - pinCaptionSymbol->isHidden = false; - //pinCaptionSymbol->modulationColor = OsmAnd::FColorARGB(); - */ - - - symbolsGroup->symbols.push_back(pinIconSymbol); - //symbolsGroup->symbols.push_back(pinCaptionSymbol); + if (pinIcon) + { + const std::shared_ptr pinIconSymbol(new OsmAnd::BillboardRasterMapSymbol( + symbolsGroup)); + pinIconSymbol->order = order++; + pinIconSymbol->image = pinIcon; + pinIconSymbol->size = OsmAnd::PointI(pinIcon->width(), pinIcon->height()); + pinIconSymbol->contentClass = OsmAnd::RasterMapSymbol::ContentClass::Icon; + pinIconSymbol->content = QString().sprintf( + "markerGroup(%p:%p)->pinIconBitmap:%p", + this, + symbolsGroup.get(), + pinIcon.get()); + pinIconSymbol->languageId = OsmAnd::LanguageId::Invariant; + + pinIconSymbol->position31 = OsmAnd::Utilities::convertLatLonTo31(OsmAnd::LatLon(50.4486, 30.51348)); + //pinIconSymbol->offset = OsmAnd::PointI(0, 0); + pinIconSymbol->isHidden = false; + //pinIconSymbol->modulationColor = OsmAnd::FColorARGB(); + + /* + std::shared_ptr textSymbol(new OsmAnd::MapPrimitiviser::TextSymbol()); + + const std::shared_ptr pinCaptionSymbol(new OsmAnd::SymbolRasterizer::RasterizedSpriteSymbol(symbolsGroup)); + + pinCaptionSymbol->order = order++; + pinCaptionSymbol->contentClass = OsmAnd::RasterMapSymbol::ContentClass::Caption; + pinCaptionSymbol->content = QString("Test Тест Надпись"); + pinCaptionSymbol->languageId = OsmAnd::LanguageId::Invariant; + + pinCaptionSymbol->position31 = OsmAnd::Utilities::convertLatLonTo31(OsmAnd::LatLon(50.4486, 30.51348)); + //pinCaptionSymbol->offset = OsmAnd::PointI(0, 0); + pinCaptionSymbol->isHidden = false; + //pinCaptionSymbol->modulationColor = OsmAnd::FColorARGB(); + */ + + + symbolsGroup->symbols.push_back(pinIconSymbol); + //symbolsGroup->symbols.push_back(pinCaptionSymbol); + } } outData.reset(new OsmAnd::IMapKeyedSymbolsProvider::Data(tmpStr.get(), symbolsGroup)); diff --git a/Sources/Core/OAMapillaryTilesProvider.mm b/Sources/Core/OAMapillaryTilesProvider.mm index 1c5b7d92a5..8e0ecc97d8 100644 --- a/Sources/Core/OAMapillaryTilesProvider.mm +++ b/Sources/Core/OAMapillaryTilesProvider.mm @@ -92,6 +92,9 @@ const std::shared_ptr& geometryTile, SkCanvas& canvas) { + if (!_image) + return; + int dzoom = req.zoom - getZoomForRequest(req); double mult = (int) pow(2.0, dzoom); const auto tileSize31 = (1u << (OsmAnd::ZoomLevel::MaxZoomLevel - req.zoom)); diff --git a/Sources/Core/OAOsmNotesMapLayerProvider.mm b/Sources/Core/OAOsmNotesMapLayerProvider.mm index 4769a0a63e..be80afb5cb 100644 --- a/Sources/Core/OAOsmNotesMapLayerProvider.mm +++ b/Sources/Core/OAOsmNotesMapLayerProvider.mm @@ -194,6 +194,8 @@ const auto iconClosed = [OANativeUtilities getScaledSkImage:[OANativeUtilities skImageFromPngResource:@"map_osm_note_resolved"] scaleFactor:_symbolsScaleFactor]; QList> mapSymbolsGroups; + if (!iconOpen || !iconClosed) + return mapSymbolsGroups; for (const auto note : _notesCache) { diff --git a/Sources/Helpers/OANativeUtilities.mm b/Sources/Helpers/OANativeUtilities.mm index fe8d8e8be9..2b42223449 100644 --- a/Sources/Helpers/OANativeUtilities.mm +++ b/Sources/Helpers/OANativeUtilities.mm @@ -58,13 +58,20 @@ @implementation OANativeUtilities + (sk_sp) skImageFromPngResource:(NSString *)resourceName { + NSString *resourcePath = nil; if ([UIScreen mainScreen].scale > 2.0f) - resourceName = [resourceName stringByAppendingString:@"@3x"]; + resourcePath = [[NSBundle mainBundle] pathForResource:[resourceName stringByAppendingString:@"@3x"] ofType:@"png"]; else if ([UIScreen mainScreen].scale > 1.0f) - resourceName = [resourceName stringByAppendingString:@"@2x"]; + resourcePath = [[NSBundle mainBundle] pathForResource:[resourceName stringByAppendingString:@"@2x"] ofType:@"png"]; + else + resourcePath = [[NSBundle mainBundle] pathForResource:resourceName ofType:@"png"]; + + if (resourcePath == nil) + resourcePath = [[NSBundle mainBundle] pathForResource:[resourceName stringByAppendingString:@"@2x"] ofType:@"png"]; + + if (resourcePath == nil) + resourcePath = [[NSBundle mainBundle] pathForResource:[resourceName stringByAppendingString:@"@3x"] ofType:@"png"]; - const auto resourcePath = [[NSBundle mainBundle] pathForResource:resourceName - ofType:@"png"]; if (resourcePath == nil) return nullptr;