From 21b42eea4416079f4dc0d93cf088d527ef024319 Mon Sep 17 00:00:00 2001 From: Nicki Dlugash Date: Mon, 28 Sep 2015 18:10:49 -0400 Subject: [PATCH] [ios] [android] Add default marker sprites --- .../mapbox/mapboxsdk/annotations/Marker.java | 10 +- .../mapboxsdk/annotations/MarkerOptions.java | 4 +- .../com/mapbox/mapboxsdk/views/MapView.java | 23 ++++- .../main/res/drawable-hdpi/default_marker.png | Bin 0 -> 1520 bytes .../main/res/drawable-mdpi/default_marker.png | Bin 0 -> 1010 bytes .../res/drawable-xhdpi/default_marker.png | Bin 0 -> 1995 bytes .../res/drawable-xxhdpi/default_marker.png | Bin 0 -> 2998 bytes .../res/drawable-xxxhdpi/default_marker.png | Bin 0 -> 4006 bytes .../mapboxsdk/testapp/MainActivity.java | 4 +- platform/default/resources/default_marker.svg | 10 ++ platform/ios/MGLMapView.mm | 89 +++++++++--------- platform/ios/resources/default_marker.png | Bin 0 -> 1010 bytes platform/ios/resources/default_marker@2x.png | Bin 0 -> 1995 bytes platform/ios/resources/default_marker@3x.png | Bin 0 -> 2998 bytes 14 files changed, 87 insertions(+), 53 deletions(-) create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/default_marker.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/default_marker.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/default_marker.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/default_marker.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/default_marker.png create mode 100644 platform/default/resources/default_marker.svg create mode 100644 platform/ios/resources/default_marker.png create mode 100644 platform/ios/resources/default_marker@2x.png create mode 100644 platform/ios/resources/default_marker@3x.png diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java index 78043c403..59d3bc90c 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java @@ -1,10 +1,12 @@ package com.mapbox.mapboxsdk.annotations; import android.graphics.Point; +import android.support.annotation.Nullable; import android.view.View; import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.views.InfoWindow; +import com.mapbox.mapboxsdk.views.MapView; public class Marker extends Annotation { @@ -17,7 +19,7 @@ public class Marker extends Annotation { LatLng position; float rotation; String snippet; - String sprite = "default_marker"; + String sprite; String title; private InfoWindow infoWindow = null; @@ -133,9 +135,11 @@ public class Marker extends Annotation { * * https://github.com/mapbox/mapbox-gl-styles/blob/mb-pages/sprites/mapbox-streets.json * - * @param sprite + * If null you will get the default marker. + * + * @param sprite The name of the sprite. */ - public void setSprite(String sprite) { + public void setSprite(@Nullable String sprite) { this.sprite = sprite; } diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java index 8e8b196d1..46451eda9 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java @@ -1,5 +1,7 @@ package com.mapbox.mapboxsdk.annotations; +import android.support.annotation.Nullable; + import com.mapbox.mapboxsdk.geometry.LatLng; public class MarkerOptions extends AnnotationOptions { @@ -98,7 +100,7 @@ public class MarkerOptions extends AnnotationOptions { return this; } - public MarkerOptions sprite(String sprite) { + public MarkerOptions sprite(@Nullable String sprite) { ((Marker)annotation).sprite = sprite; return this; } diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java index ad7204a3d..c31380400 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java @@ -16,6 +16,7 @@ import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.RectF; import android.graphics.SurfaceTexture; +import android.graphics.drawable.BitmapDrawable; import android.location.Location; import android.net.ConnectivityManager; import android.net.NetworkInfo; @@ -142,6 +143,9 @@ public final class MapView extends FrameLayout implements LocationListener, Comp // Index into R.arrays.attribution_links private static final int ATTRIBUTION_INDEX_IMPROVE_THIS_MAP = 2; + // Used for loading default marker sprite + private static final String DEFAULT_SPRITE = "com.mapbox.sprites.default"; + // // Instance members // @@ -154,6 +158,7 @@ public final class MapView extends FrameLayout implements LocationListener, Comp // Used to handle DPI scaling private float mScreenDensity = 1.0f; + private float mScreenDensityDpi = 1.0f; // Touch gesture detectors private GestureDetectorCompat mGestureDetector; @@ -482,8 +487,7 @@ public final class MapView extends FrameLayout implements LocationListener, Comp // Get the screen's density mScreenDensity = context.getResources().getDisplayMetrics().density; - int tenDp = (int) (10 * mScreenDensity); - int sixteenDp = (int) (16 * mScreenDensity); + mScreenDensityDpi = context.getResources().getDisplayMetrics().densityDpi; // Get the cache path String cachePath = context.getCacheDir().getAbsolutePath(); @@ -1322,18 +1326,31 @@ public final class MapView extends FrameLayout implements LocationListener, Comp // Annotations // - public void setSprite(String symbol, float scale, Bitmap bitmap) { + public void setSprite(String symbol, Bitmap bitmap) { if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) { bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false); } ByteBuffer buffer = ByteBuffer.allocate(bitmap.getRowBytes() * bitmap.getHeight()); bitmap.copyPixelsToBuffer(buffer); + //float scale = mScreenDensityDpi / bitmap.getDensity() * mScreenDensity; + float scale = 1.0f; + mNativeMapView.setSprite(symbol, bitmap.getWidth(), bitmap.getHeight(), scale, buffer.array()); } public Marker addMarker(MarkerOptions markerOptions) { Marker marker = markerOptions.getMarker(); + + // Load the default marker sprite + if (marker.getSprite() == null) { + BitmapDrawable bitmapDrawable = (BitmapDrawable) ContextCompat.getDrawable(mContext, R.drawable.default_marker); + Bitmap bitmap = bitmapDrawable.getBitmap(); + setSprite(DEFAULT_SPRITE, bitmap); + + marker.setSprite(DEFAULT_SPRITE); + } + long id = mNativeMapView.addMarker(marker); marker.setId(id); // the annotation needs to know its id marker.setMapView(this); // the annotation needs to know which map view it is in diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/default_marker.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/default_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0af4c6ab8c454be95b4765a3898fa5d67d0067 GIT binary patch literal 1520 zcmVWN}=HIdwYsq>HX6Vp1j}WG``&$)bn-*ROo1!`-_!`FN*rcxAr@`RFn z73$*>((8at2l}aidJi-<(#wGW`Q2_^FXBr}G#ri6*z9a>6aYVG8qCmMcv&aQ^ydEk zhQMMSxH&#fv1C&9p5dnq!8s_r1oT-1xbS`(+_76wXrJFt$#fbc(Ed(URok_dmCM_} z48^MbVyB=Q@V^*7isyC#MR@dL)xI7K(oPFD&U=y}Q{DVc3cy|&jcyFCw*8o8G=I3d(0OVrBuhiF5M?-^VTi6DJ zSNci*dB)DJckxXd;#5yJCMW3*uh8bsPC9b_Jbe-ls|ELXhIgo=C&6d~6GPpV?NObs zry~ms^y=~B^xnmbwD<7g|2*M)Ji|NGL0xUHw-_q;EewI)++uixhYnHK*|VB;@D6oQ zS8uMt0u$i&8ds%en#rNwleRh?BXSYA8r zf?Nh6nIFg6^J33diI0pJZw{hPu8k3RXj)OUho-8EJQYqFyl{cmIB{qR?@$MI(MC&x zHKc;$$tB(1z0n+?g^39oIB}vV9MA9$bx>D#RI;og2PbY{W^<#v-YrvYb@85hT`ux) zxi>aO!6g=|Rp{HTt@J#fP_#6|9UPgN!R=Qzk+c`g>`Dle zyPTn>3c{s@4+;mleZb(rkheekY+`r%+2xSBkG*!#aFc+r%_Y{>vTJ}nH`4|i$xnCg za;UB2FnA=l{QCI;O~hiR!bNsERqs&DKq1%$1FWrZ;vNj}B{KN zET2;B_OynHY79NI7q=D{L#z3sJAo00Bf*}3gfO}O;DH*eYP^cKkZE9)`$ zWRI8+U4g{B-*=t_030000m{G8B)KoXJFa>pBy66(wY{N1{V$IeF+19SHcT z6u!wx>Kh-Ywd`huNn7=Ohk*=HT|M7$glc?V+76YwcTrt+HGNN~8&5eL(u>;+Am2oF`sBU=Mo2*bi}Ud?l#qhEy>oiS&DPrAXu9LANYbpjS$iC z=2g_qjQ8{N)H5?fi~IJ`oYP6~Mn>poE=RRmlXReI@Ly?%6|^ zBN6h~*Kc*13179f5wY$#>x=+L|K#LFq}&)Vy%DK>Tv(vf?d^FoH4N>kHsZ`C`lHvnlCvw70rk7d}-2OGCW*D&88mdA?;f;6Xy?E;tH z<$FW1S<9of9pD3BaOhnoX71%{sJB>@r2rrJf+J6;q4oXrG?_=J6krP<_!{Ssv?x)_ z&c2C>9TRG{otiJ1BLr^7mzJWRcaS=4U<)7fNg+d&_z1OrnEqBWb?9INTg``xMM$?R zE8i+Vvkyz9-ZMH%uz{^vmmjQfIP9pZsyfKaP(lz!gPF_;!Db7XZ=!)%j7Am~#-6*~ zw-mcwVjqzuttd(^Psn6W+>tEqtrKovcjt1Say1`+ObS+3SR9mZD$x`##@|9n5*! zI5shs>|fmc@Qvnci0*J56TGa@y7niKS;nWPrZz4AzO)gNH1U>54<|%nqID{xj55k7 gql_~COZ*aG0OGQs<%kp{B>(^b07*qoM6N<$f?LhmRsaA1 literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/default_marker.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/default_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..d05c82bfe28d9e4d87f8cce2b74a6b39b4805c1f GIT binary patch literal 1995 zcmV;+2Q>JJP)v@uO-+Qf8KOssBPh>J=a zQEaH95(bcmj(~&1LuWce|L<}R9Ol8jceqd&_e&1<&b{aH&42#a`3DDOh;NFD>iE*g zZ7(-Jx4MKbo!mm)+PJlTHa^~&$vO^`q^kJx3Ac~ARhe9?kK0e&T9|B~r39H6By^nH z=ki&OD~l>iim5z5pS)|<(0abAc=YTUO+J54!+aeW9itbqf7REgxivG<(6R|Kxdy)c zCbp5v3JPdjSvge}7nu^@z}Pr-jSSPs#DshVatE2@)r<);xf4Qinw0j|)+R~HEFjso z2M;vq3P6%4OcP{sKMH-L+I8!wzPg&+E*DvWNGwL}fdD;t{8&DMUN)ub>(V0!sqL(& zAeYlgRsnNuEGnXW-j)9GaXhNq@9|V!nwhzvOOVOI5WbM)HkFprN}(t(FOlQ~lWb4B z#lpAU!hL;B4Q(weqt(DaBO}z_+bcirRDEXRzF}*rs<>p;$N^XjYpNWQ2#T$(gMWLc zb`z~OuqM_92f-ytg2(5!*1WY&Mj~`S6rzq`P;0oyGc&-NSX<=+WC`iPV*T)SW{hHF zYKm^Ks~F;IDr{gQ*v&4gjITz3wL2a@gpc%t6YFA&CMvcb?ECsRDl4hf=QA|fAFSBd zhK48{jcT7?-M5dn95_H5_v|5$-%q1GJ=(i_PoGjG9;XU}^Ew<38ssrB1-9t#9U=h; z;K@hz^@g?=RS^?Hasu$MiySjGV&^ zLG4_iWVq?AD>qlWc3-}%`8lINUyM=bSkf35xP+YIcu3<@`pWC&Z@)q42b{1`$i5is zH6THSOXmW?nQ3D#gJUaz2+`Bps@orZWHgaubqUTaCfKGOTF1r=4MyNc*aCh(a)hp* zJehL4@eJ?KM}|71NrS?r%^}XbT6F$!*Dme!W;9ulAy4{7=}KS_Qs>OXVX1$=c67*( zg$|K!;oRG3HqEy>-AYLRQ7$={C7$Cn)z~#WY>FTjexJV-!WSZhbi!~YuvV{0mjZx; z!igk7X!|K7ia1!CJ)DEc<_yTBI@Ajn6B3-}9JQ#CwBY{cz`*|&HI%hmWZg!MBxf|e znwT);w5Ub*+WsT-krQvk>AWF0$SXSo>8Vu%E z{N8E939IlyT9oe^99j{#gE=v`z>#$I>a-a($_{+FisJXRo*v5yVop(5zbe+sDCKXG z2GbJ^T1F0YDTdLM@tH(5nD*X)C0mU-FxOIsk+#B`4xEmm>RN}A#CzMeEsNl#t}ZFP zPA0e0s#D$kRwG}_6c}rCYfTXpHDk@HZ}kuGp=Qc7IgG(r#cDe(BUoKs?f4fk(_8OMz0hW8Y1^+AVB?m z5Sk?lw|c!zA*U1T7V+FA++v|nXvP#lCYGxZb1j^rossf*yuUCWe>WHoQ%Rne3UWP5 zlEZIw_*F?etz~C_c|9lRe!}{GUJGrSiAHq^LTY@e;g*wX!MoYneOseZ-E_Lxoa=8!A`P?gc=40T zNvc`9HtDA_lya|hcT@PqbBa0~_rJ~0KWe}pAjybI(y5Sx7%Ge^{e`@|PoYy|Oi*s2 z3OvI*^g&+}_EaIbBw2B}p3y8i{kvS@dv5npnSrbR5%)4fMj!MwLC__*BoXwRbsZNy zo{pd^>+88t*sCRTh2r<1Q0_rX%wjtOUh>0a^PNy z>E*y!AQ0$Fl;H4krDzdig3DqfVWo`0lV@Vh7Gr>=H<>b$z=Ok+qk?9Y0hyE>$c-%- ziv>xX*z-h;Tn(To-OJ>jnM(OZY=&2NuMjcp)^MWKOrJ?aaw(h3f~~|EIK;%3|G!%) z$ohnidW2+i4QwAIg$yOkq{3vwh7B7wY}l}2!-fqTHf-3iVZ(+E8#Zj%uwlc74I4IW d=-@vA1^|>xdY&#X)Q$iE002ovPDHLkV1g93zViS8 literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/default_marker.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/default_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..703b172c154d584d8c46e9cec018410bd2fc7075 GIT binary patch literal 2998 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 YkEChNJ2NU=6>%yZO#_Vzb=$E20b+i|v;Y7A literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/default_marker.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/default_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..8331ffef71de3726f45963f5d013c472693c5fff GIT binary patch literal 4006 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 markerList = new ArrayList<>(); - final Marker backLot = generateMarker("Back Lot", "The back lot behind my house", "default_marker", 38.649441, -121.369064); + final Marker backLot = generateMarker("Back Lot", "The back lot behind my house", null, 38.649441, -121.369064); markerList.add(backLot); final Marker cheeseRoom = generateMarker("Cheese Room", "The only air conditioned room on the property", "dog-park-15", 38.531577, -122.010646); diff --git a/platform/default/resources/default_marker.svg b/platform/default/resources/default_marker.svg new file mode 100644 index 000000000..3cb5af09a --- /dev/null +++ b/platform/default/resources/default_marker.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index b4bb1ba8f..3906dd84b 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -55,6 +55,7 @@ const CLLocationDegrees MGLAngularFieldOfView = M_PI / 6.; NSString *const MGLAnnotationIDKey = @"MGLAnnotationIDKey"; NSString *const MGLAnnotationSymbolKey = @"MGLAnnotationSymbolKey"; +NSString *const MGLAnnotationSpritePrefix = @"com.mapbox.sprites."; static NSURL *MGLURLForBundledStyleNamed(NSString *styleName) { @@ -2087,8 +2088,6 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) BOOL delegateImplementsFillColorForPolygon = [self.delegate respondsToSelector:@selector(mapView:fillColorForPolygonAnnotation:)]; BOOL delegateImplementsLineWidthForPolyline = [self.delegate respondsToSelector:@selector(mapView:lineWidthForPolylineAnnotation:)]; - const std::string spritePrefix = "com.mapbox.sprites."; - for (id annotation in annotations) { NSAssert([annotation conformsToProtocol:@protocol(MGLAnnotation)], @"annotation should conform to MGLAnnotation"); @@ -2169,51 +2168,24 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) } else { - MGLAnnotationImage *annotationImage = nil; - NSString *symbolName = nil; - - if (delegateImplementsImageForPoint) + MGLAnnotationImage *annotationImage = delegateImplementsImageForPoint ? [self.delegate mapView:self imageForAnnotation:annotation] : nil; + if ( ! annotationImage) { - annotationImage = [self.delegate mapView:self imageForAnnotation:annotation]; - - if (annotationImage) - { - const std::string cSymbolName = spritePrefix + std::string(annotationImage.reuseIdentifier.UTF8String); - symbolName = [NSString stringWithUTF8String:cSymbolName.c_str()]; - - if ( ! [self.annotationImages objectForKey:annotationImage.reuseIdentifier]) - { - // store image & symbol name - [self.annotationImages setObject:annotationImage forKey:annotationImage.reuseIdentifier]; - - // retrieve pixels - CGImageRef image = annotationImage.image.CGImage; - size_t width = CGImageGetWidth(image); - size_t height = CGImageGetHeight(image); - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - std::string pixels(width * height * 4, '\0'); - size_t bytesPerPixel = 4; - size_t bytesPerRow = bytesPerPixel * width; - size_t bitsPerComponent = 8; - char *pixelData = const_cast(pixels.data()); - CGContextRef context = CGBitmapContextCreate(pixelData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); - CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); - CGContextRelease(context); - CGColorSpaceRelease(colorSpace); - - // add sprite - auto cSpriteImage = std::make_shared( - uint16_t(annotationImage.image.size.width), - uint16_t(annotationImage.image.size.height), - float(annotationImage.image.scale), - std::move(pixels)); - - // sprite upload - _mbglMap->setSprite(cSymbolName, cSpriteImage); - } - } + UIImage *defaultAnnotationImage = [MGLMapView resourceImageNamed:MGLDefaultStyleMarkerSymbolName]; + annotationImage = [MGLAnnotationImage annotationImageWithImage:defaultAnnotationImage + reuseIdentifier:MGLDefaultStyleMarkerSymbolName]; } + if ( ! [self.annotationImages objectForKey:annotationImage.reuseIdentifier]) + { + // store image & symbol name + [self.annotationImages setObject:annotationImage forKey:annotationImage.reuseIdentifier]; + + [self installAnnotationImage:annotationImage]; + } + + NSString *symbolName = [MGLAnnotationSpritePrefix stringByAppendingString:annotationImage.reuseIdentifier]; + points.emplace_back(MGLLatLngFromLocationCoordinate2D(annotation.coordinate), symbolName ? [symbolName UTF8String] : ""); } } @@ -2243,6 +2215,35 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) } } +- (void)installAnnotationImage:(MGLAnnotationImage *)annotationImage +{ + // retrieve pixels + CGImageRef image = annotationImage.image.CGImage; + size_t width = CGImageGetWidth(image); + size_t height = CGImageGetHeight(image); + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + std::string pixels(width * height * 4, '\0'); + size_t bytesPerPixel = 4; + size_t bytesPerRow = bytesPerPixel * width; + size_t bitsPerComponent = 8; + char *pixelData = const_cast(pixels.data()); + CGContextRef context = CGBitmapContextCreate(pixelData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); + CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); + CGContextRelease(context); + CGColorSpaceRelease(colorSpace); + + // add sprite + auto cSpriteImage = std::make_shared( + uint16_t(annotationImage.image.size.width), + uint16_t(annotationImage.image.size.height), + float(annotationImage.image.scale), + std::move(pixels)); + + // sprite upload + NSString *symbolName = [MGLAnnotationSpritePrefix stringByAppendingString:annotationImage.reuseIdentifier]; + _mbglMap->setSprite(symbolName.UTF8String, cSpriteImage); +} + - (void)removeAnnotation:(id )annotation { if ( ! annotation) return; diff --git a/platform/ios/resources/default_marker.png b/platform/ios/resources/default_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..b112096c180eecca2d6afde217a9fe54eae6f327 GIT binary patch literal 1010 zcmVm{G8B)KoXJFa>pBy66(wY{N1{V$IeF+19SHcT z6u!wx>Kh-Ywd`huNn7=Ohk*=HT|M7$glc?V+76YwcTrt+HGNN~8&5eL(u>;+Am2oF`sBU=Mo2*bi}Ud?l#qhEy>oiS&DPrAXu9LANYbpjS$iC z=2g_qjQ8{N)H5?fi~IJ`oYP6~Mn>poE=RRmlXReI@Ly?%6|^ zBN6h~*Kc*13179f5wY$#>x=+L|K#LFq}&)Vy%DK>Tv(vf?d^FoH4N>kHsZ`C`lHvnlCvw70rk7d}-2OGCW*D&88mdA?;f;6Xy?E;tH z<$FW1S<9of9pD3BaOhnoX71%{sJB>@r2rrJf+J6;q4oXrG?_=J6krP<_!{Ssv?x)_ z&c2C>9TRG{otiJ1BLr^7mzJWRcaS=4U<)7fNg+d&_z1OrnEqBWb?9INTg``xMM$?R zE8i+Vvkyz9-ZMH%uz{^vmmjQfIP9pZsyfKaP(lz!gPF_;!Db7XZ=!)%j7Am~#-6*~ zw-mcwVjqzuttd(^Psn6W+>tEqtrKovcjt1Say1`+ObS+3SR9mZD$x`##@|9n5*! zI5shs>|fmc@Qvnci0*J56TGa@y7niKS;nWPrZz4AzO)gNH1U>54<|%nqID{xj55k7 gql_~COZ*aG0OGQs<%kp{B>(^b07*qoM6N<$f?LhmRsaA1 literal 0 HcmV?d00001 diff --git a/platform/ios/resources/default_marker@2x.png b/platform/ios/resources/default_marker@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d05c82bfe28d9e4d87f8cce2b74a6b39b4805c1f GIT binary patch literal 1995 zcmV;+2Q>JJP)v@uO-+Qf8KOssBPh>J=a zQEaH95(bcmj(~&1LuWce|L<}R9Ol8jceqd&_e&1<&b{aH&42#a`3DDOh;NFD>iE*g zZ7(-Jx4MKbo!mm)+PJlTHa^~&$vO^`q^kJx3Ac~ARhe9?kK0e&T9|B~r39H6By^nH z=ki&OD~l>iim5z5pS)|<(0abAc=YTUO+J54!+aeW9itbqf7REgxivG<(6R|Kxdy)c zCbp5v3JPdjSvge}7nu^@z}Pr-jSSPs#DshVatE2@)r<);xf4Qinw0j|)+R~HEFjso z2M;vq3P6%4OcP{sKMH-L+I8!wzPg&+E*DvWNGwL}fdD;t{8&DMUN)ub>(V0!sqL(& zAeYlgRsnNuEGnXW-j)9GaXhNq@9|V!nwhzvOOVOI5WbM)HkFprN}(t(FOlQ~lWb4B z#lpAU!hL;B4Q(weqt(DaBO}z_+bcirRDEXRzF}*rs<>p;$N^XjYpNWQ2#T$(gMWLc zb`z~OuqM_92f-ytg2(5!*1WY&Mj~`S6rzq`P;0oyGc&-NSX<=+WC`iPV*T)SW{hHF zYKm^Ks~F;IDr{gQ*v&4gjITz3wL2a@gpc%t6YFA&CMvcb?ECsRDl4hf=QA|fAFSBd zhK48{jcT7?-M5dn95_H5_v|5$-%q1GJ=(i_PoGjG9;XU}^Ew<38ssrB1-9t#9U=h; z;K@hz^@g?=RS^?Hasu$MiySjGV&^ zLG4_iWVq?AD>qlWc3-}%`8lINUyM=bSkf35xP+YIcu3<@`pWC&Z@)q42b{1`$i5is zH6THSOXmW?nQ3D#gJUaz2+`Bps@orZWHgaubqUTaCfKGOTF1r=4MyNc*aCh(a)hp* zJehL4@eJ?KM}|71NrS?r%^}XbT6F$!*Dme!W;9ulAy4{7=}KS_Qs>OXVX1$=c67*( zg$|K!;oRG3HqEy>-AYLRQ7$={C7$Cn)z~#WY>FTjexJV-!WSZhbi!~YuvV{0mjZx; z!igk7X!|K7ia1!CJ)DEc<_yTBI@Ajn6B3-}9JQ#CwBY{cz`*|&HI%hmWZg!MBxf|e znwT);w5Ub*+WsT-krQvk>AWF0$SXSo>8Vu%E z{N8E939IlyT9oe^99j{#gE=v`z>#$I>a-a($_{+FisJXRo*v5yVop(5zbe+sDCKXG z2GbJ^T1F0YDTdLM@tH(5nD*X)C0mU-FxOIsk+#B`4xEmm>RN}A#CzMeEsNl#t}ZFP zPA0e0s#D$kRwG}_6c}rCYfTXpHDk@HZ}kuGp=Qc7IgG(r#cDe(BUoKs?f4fk(_8OMz0hW8Y1^+AVB?m z5Sk?lw|c!zA*U1T7V+FA++v|nXvP#lCYGxZb1j^rossf*yuUCWe>WHoQ%Rne3UWP5 zlEZIw_*F?etz~C_c|9lRe!}{GUJGrSiAHq^LTY@e;g*wX!MoYneOseZ-E_Lxoa=8!A`P?gc=40T zNvc`9HtDA_lya|hcT@PqbBa0~_rJ~0KWe}pAjybI(y5Sx7%Ge^{e`@|PoYy|Oi*s2 z3OvI*^g&+}_EaIbBw2B}p3y8i{kvS@dv5npnSrbR5%)4fMj!MwLC__*BoXwRbsZNy zo{pd^>+88t*sCRTh2r<1Q0_rX%wjtOUh>0a^PNy z>E*y!AQ0$Fl;H4krDzdig3DqfVWo`0lV@Vh7Gr>=H<>b$z=Ok+qk?9Y0hyE>$c-%- ziv>xX*z-h;Tn(To-OJ>jnM(OZY=&2NuMjcp)^MWKOrJ?aaw(h3f~~|EIK;%3|G!%) z$ohnidW2+i4QwAIg$yOkq{3vwh7B7wY}l}2!-fqTHf-3iVZ(+E8#Zj%uwlc74I4IW d=-@vA1^|>xdY&#X)Q$iE002ovPDHLkV1g93zViS8 literal 0 HcmV?d00001 diff --git a/platform/ios/resources/default_marker@3x.png b/platform/ios/resources/default_marker@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..703b172c154d584d8c46e9cec018410bd2fc7075 GIT binary patch literal 2998 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 YkEChNJ2NU=6>%yZO#_Vzb=$E20b+i|v;Y7A literal 0 HcmV?d00001