react-native-google-maps-plus 1.7.0-dev.15 → 1.7.0-dev.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -77,7 +77,10 @@ class MapMarkerBuilder(
77
77
  val height = (svg.documentHeight.takeIf { it > 0 } ?: 128f).toInt()
78
78
 
79
79
  createBitmap(width, height).apply {
80
- Canvas(this).also(svg::renderToCanvas)
80
+ density = context.resources.displayMetrics.densityDpi
81
+ Canvas(this).also {
82
+ svg.renderToCanvas(it)
83
+ }
81
84
  }
82
85
  }
83
86
 
@@ -98,10 +101,12 @@ class MapMarkerBuilder(
98
101
  val innerSvg = SVG.getFromString(svgText)
99
102
  val w = innerSvg.documentWidth.takeIf { it > 0 } ?: 128f
100
103
  val h = innerSvg.documentHeight.takeIf { it > 0 } ?: 128f
101
- val bmp = createBitmap(w.toInt(), h.toInt())
102
- val canvas = Canvas(bmp)
103
- innerSvg.renderToCanvas(canvas)
104
- bmp
104
+ createBitmap(w.toInt(), h.toInt()).apply {
105
+ density = context.resources.displayMetrics.densityDpi
106
+ Canvas(this).also {
107
+ innerSvg.renderToCanvas(it)
108
+ }
109
+ }
105
110
  } else {
106
111
  conn.inputStream.use { BitmapFactory.decodeStream(it) }
107
112
  }
@@ -328,27 +333,28 @@ class MapMarkerBuilder(
328
333
  coroutineContext.ensureActive()
329
334
  val svg = SVG.getFromString(m.iconSvg.svgString)
330
335
 
331
- coroutineContext.ensureActive()
332
- svg.setDocumentWidth(m.iconSvg.width.dpToPx())
333
- svg.setDocumentHeight(m.iconSvg.height.dpToPx())
336
+ val wPx =
337
+ m.iconSvg.width
338
+ .dpToPx()
339
+ .toInt()
340
+ val hPx =
341
+ m.iconSvg.height
342
+ .dpToPx()
343
+ .toInt()
334
344
 
335
345
  coroutineContext.ensureActive()
336
- bmp =
337
- createBitmap(
338
- m.iconSvg.width
339
- .dpToPx()
340
- .toInt(),
341
- m.iconSvg.height
342
- .dpToPx()
343
- .toInt(),
344
- Bitmap.Config.ARGB_8888,
345
- )
346
+ svg.setDocumentWidth(wPx.toFloat())
347
+ svg.setDocumentHeight(hPx.toFloat())
346
348
 
347
349
  coroutineContext.ensureActive()
348
- val canvas = Canvas(bmp)
349
- svg.renderToCanvas(canvas)
350
+ bmp =
351
+ createBitmap(wPx, hPx, Bitmap.Config.ARGB_8888).apply {
352
+ density = context.resources.displayMetrics.densityDpi
353
+ Canvas(this).also {
354
+ svg.renderToCanvas(it)
355
+ }
356
+ }
350
357
 
351
- coroutineContext.ensureActive()
352
358
  return bmp
353
359
  } catch (t: Throwable) {
354
360
  try {
@@ -444,7 +444,10 @@ GMSIndoorDisplayDelegate {
444
444
 
445
445
  @MainActor
446
446
  func removeMarker(id: String) {
447
- markersById.removeValue(forKey: id).map { $0.map = nil }
447
+ markersById.removeValue(forKey: id).map {
448
+ $0.icon = nil
449
+ $0.map = nil
450
+ }
448
451
  }
449
452
 
450
453
  @MainActor
@@ -51,8 +51,7 @@ final class MapMarkerBuilder {
51
51
  }
52
52
 
53
53
  if !prev.markerStyleEquals(next) {
54
- buildIconAsync(next.id, next) { img in
55
- m.tracksViewChanges = true
54
+ buildIconAsync(next) { img in
56
55
  m.icon = img
57
56
 
58
57
  if !prev.anchorEquals(next) {
@@ -69,9 +68,9 @@ final class MapMarkerBuilder {
69
68
  )
70
69
  }
71
70
 
72
- onMainAsync { [weak m] in
73
- try? await Task.sleep(nanoseconds: 250_000_000)
74
- m?.tracksViewChanges = false
71
+ m.tracksViewChanges = true
72
+ DispatchQueue.main.async {
73
+ m.tracksViewChanges = false
75
74
  }
76
75
  }
77
76
  } else {
@@ -102,11 +101,10 @@ final class MapMarkerBuilder {
102
101
  m.snippet = next.snippet
103
102
  }
104
103
 
105
- if(tracksInfoWindowChanges) {
104
+ if tracksInfoWindowChanges {
106
105
  m.tracksInfoWindowChanges = true
107
- onMainAsync { [weak m] in
108
- try? await Task.sleep(nanoseconds: 250_000_000)
109
- m?.tracksInfoWindowChanges = false
106
+ DispatchQueue.main.async {
107
+ m.tracksInfoWindowChanges = false
110
108
  }
111
109
  }
112
110
 
@@ -140,7 +138,6 @@ final class MapMarkerBuilder {
140
138
  }
141
139
  }
142
140
 
143
- @MainActor
144
141
  func buildIconAsync(
145
142
  _ m: RNMarker,
146
143
  onReady: @escaping (UIImage?) -> Void
@@ -158,18 +155,24 @@ final class MapMarkerBuilder {
158
155
  return
159
156
  }
160
157
 
158
+ let scale = UIScreen.main.scale
159
+
161
160
  let task = Task(priority: .userInitiated) { [weak self] in
162
161
  guard let self else { return }
163
- defer { self.tasks.removeValue(forKey: m.id) }
162
+ defer {
163
+ Task { @MainActor in self.tasks.removeValue(forKey: m.id) }
164
+ }
164
165
 
165
- let scale = UIScreen.main.scale
166
- let img = await self.renderUIImage(m, scale)
166
+ let img = self.renderUIImage(m, scale)
167
167
  guard let img, !Task.isCancelled else { return }
168
168
 
169
169
  self.iconCache.setObject(img, forKey: key)
170
170
 
171
171
  await MainActor.run {
172
172
  guard !Task.isCancelled else { return }
173
+ }
174
+
175
+ Task { @MainActor in
173
176
  onReady(img)
174
177
  }
175
178
  }
@@ -212,18 +215,11 @@ final class MapMarkerBuilder {
212
215
 
213
216
  svgImg.size = size
214
217
 
215
- guard let base = svgImg.uiImage else {
218
+ guard let finalImage = SVGKExporterUIImage.export(asUIImage: svgImg) else {
219
+ svgImg.clear()
216
220
  return nil
217
221
  }
218
-
219
- let fmt = UIGraphicsImageRendererFormat.default()
220
- fmt.opaque = false
221
- fmt.scale = UIScreen.main.scale
222
- let renderer = UIGraphicsImageRenderer(size: size, format: fmt)
223
-
224
- let finalImage = renderer.image { _ in
225
- base.draw(in: CGRect(origin: .zero, size: size))
226
- }
222
+ svgImg.clear()
227
223
 
228
224
  let imageView = UIImageView(image: finalImage)
229
225
  imageView.frame = CGRect(origin: .zero, size: size)
@@ -233,10 +229,10 @@ final class MapMarkerBuilder {
233
229
  return imageView
234
230
  }
235
231
 
236
- @MainActor
237
- private func renderUIImage(_ m: RNMarker, _ scale: CGFloat) async -> UIImage? {
238
- guard let iconSvg = m.iconSvg,
239
- let data = iconSvg.svgString.data(using: .utf8)
232
+ private func renderUIImage(_ m: RNMarker, _ scale: CGFloat) -> UIImage? {
233
+ guard
234
+ let iconSvg = m.iconSvg,
235
+ let data = iconSvg.svgString.data(using: .utf8)
240
236
  else { return nil }
241
237
 
242
238
  let size = CGSize(
@@ -244,28 +240,21 @@ final class MapMarkerBuilder {
244
240
  height: max(1, CGFloat(iconSvg.height))
245
241
  )
246
242
 
247
- return await Task.detached(priority: .userInitiated) {
248
- autoreleasepool {
249
- guard let svgImg = SVGKImage(data: data) else { return nil }
250
- svgImg.size = size
243
+ return autoreleasepool { () -> UIImage? in
244
+ guard !Task.isCancelled else { return nil }
245
+ guard let svgImg = SVGKImage(data: data) else { return nil }
251
246
 
252
- guard !Task.isCancelled else { return nil }
253
- guard let base = svgImg.uiImage else { return nil }
247
+ svgImg.size = size
254
248
 
255
- if let cg = base.cgImage {
256
- return UIImage(cgImage: cg, scale: scale, orientation: .up)
257
- }
258
- guard !Task.isCancelled else { return nil }
259
- let fmt = UIGraphicsImageRendererFormat.default()
260
- fmt.opaque = false
261
- fmt.scale = scale
262
- guard !Task.isCancelled else { return nil }
263
- let renderer = UIGraphicsImageRenderer(size: size, format: fmt)
264
- return renderer.image { _ in
265
- base.draw(in: CGRect(origin: .zero, size: size))
266
- }
249
+ guard !Task.isCancelled else {
250
+ svgImg.clear()
251
+ return nil
267
252
  }
268
- }.value
253
+
254
+ let uiImage = SVGKExporterUIImage.export(asUIImage: svgImg)
255
+ svgImg.clear()
256
+ return uiImage
257
+ }
269
258
  }
270
259
 
271
260
  }
@@ -141,12 +141,14 @@ final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec {
141
141
  for (id, next) in nextById {
142
142
  if let prev = prevById[id] {
143
143
  if !prev.markerEquals(next) {
144
- self.impl.updateMarker(id: id) { m in
144
+ self.impl.updateMarker(id: id) { [weak self] m in
145
+ guard let self else { return }
145
146
  self.markerBuilder.update(prev, next, m)
146
147
  }
147
148
  }
148
149
  } else {
149
- self.markerBuilder.buildIconAsync(next) { icon in
150
+ self.markerBuilder.buildIconAsync(next) { [weak self] icon in
151
+ guard let self else { return }
150
152
  let marker = self.markerBuilder.build(next, icon: icon)
151
153
  self.impl.addMarker(id: id, marker: marker)
152
154
  }
@@ -174,7 +176,8 @@ final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec {
174
176
  for (id, next) in nextById {
175
177
  if let prev = prevById[id] {
176
178
  if !prev.polylineEquals(next) {
177
- impl.updatePolyline(id: id) { pl in
179
+ impl.updatePolyline(id: id) { [weak self] pl in
180
+ guard let self else { return }
178
181
  self.polylineBuilder.update(prev, next, pl)
179
182
  }
180
183
  }
@@ -206,7 +209,8 @@ final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec {
206
209
  for (id, next) in nextById {
207
210
  if let prev = prevById[id] {
208
211
  if !prev.polygonEquals(next) {
209
- impl.updatePolygon(id: id) { pg in
212
+ impl.updatePolygon(id: id) { [weak self] pg in
213
+ guard let self else { return }
210
214
  self.polygonBuilder.update(prev, next, pg)
211
215
  }
212
216
  }
@@ -235,7 +239,8 @@ final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec {
235
239
  for (id, next) in nextById {
236
240
  if let prev = prevById[id] {
237
241
  if !prev.circleEquals(next) {
238
- impl.updateCircle(id: id) { circle in
242
+ impl.updateCircle(id: id) { [weak self] circle in
243
+ guard let self else { return }
239
244
  self.circleBuilder.update(prev, next, circle)
240
245
  }
241
246
  }
@@ -422,12 +427,12 @@ final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec {
422
427
 
423
428
  @MainActor
424
429
  func showMarkerInfoWindow(id: String) {
425
- impl.showMarkerInfoWindow(id: id);
430
+ impl.showMarkerInfoWindow(id: id)
426
431
  }
427
432
 
428
433
  @MainActor
429
434
  func hideMarkerInfoWindow(id: String) {
430
- impl.hideMarkerInfoWindow(id: id);
435
+ impl.hideMarkerInfoWindow(id: id)
431
436
  }
432
437
 
433
438
  @MainActor
@@ -0,0 +1,22 @@
1
+ import SVGKit
2
+
3
+ extension SVGKImage {
4
+ @inline(__always)
5
+ func clear() {
6
+ caLayerTree?.sublayers?.forEach { $0.removeFromSuperlayer() }
7
+ if let layer = caLayerTree {
8
+ layer.sublayers?.forEach { $0.removeFromSuperlayer() }
9
+ layer.removeFromSuperlayer()
10
+ }
11
+
12
+ if let dom = domDocument {
13
+ dom.childNodes = nil
14
+ }
15
+
16
+ if let root = domTree {
17
+ root.childNodes = nil
18
+ }
19
+
20
+ caLayerTree.sublayers?.removeAll()
21
+ }
22
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-google-maps-plus",
3
- "version": "1.7.0-dev.15",
3
+ "version": "1.7.0-dev.16",
4
4
  "description": "React Native wrapper for Android & iOS Google Maps SDK",
5
5
  "main": "./lib/module/index.js",
6
6
  "module": "./lib/module/index.js",