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
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
-
|
|
337
|
-
|
|
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
|
-
|
|
349
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
m
|
|
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
|
|
104
|
+
if tracksInfoWindowChanges {
|
|
106
105
|
m.tracksInfoWindowChanges = true
|
|
107
|
-
|
|
108
|
-
|
|
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 {
|
|
162
|
+
defer {
|
|
163
|
+
Task { @MainActor in self.tasks.removeValue(forKey: m.id) }
|
|
164
|
+
}
|
|
164
165
|
|
|
165
|
-
let
|
|
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
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
|
|
253
|
-
guard let base = svgImg.uiImage else { return nil }
|
|
247
|
+
svgImg.size = size
|
|
254
248
|
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
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