From c3b588321bf37f1878e6101a1f05174d9a6a2565 Mon Sep 17 00:00:00 2001 From: Taku Fukada Date: Fri, 28 Aug 2026 11:48:01 +0900 Subject: [PATCH] Fix `ImageSource` not rendering across world copies (#4508) --- CHANGELOG.md | 1 + metrics/cache-style.db | Bin 39825408 -> 39825408 bytes metrics/integration/image/world-wrap.png | Bin 0 -> 186 bytes .../image/world-wrap/expected.png | Bin 0 -> 548 bytes .../render-tests/image/world-wrap/style.json | 56 ++++++++++++++++++ .../renderer/sources/render_image_source.cpp | 18 +++--- 6 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 metrics/integration/image/world-wrap.png create mode 100644 metrics/integration/render-tests/image/world-wrap/expected.png create mode 100644 metrics/integration/render-tests/image/world-wrap/style.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 27436f963..e83f6b6e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ ### 🐞 Bug fixes - *...Add new stuff here...* +- [core] Fix `ImageSource` not rendering across world copies ([#4508](https://github.com/maplibre/maplibre-native/issues/4508)). - [core] Repaint data-driven symbol paint properties after feature-state updates. - [core] Accept alpha values in legacy comma-separated `hsl()` colors ([#4434](https://github.com/maplibre/maplibre-native/issues/4434)). - [core] Fix thread-unsafe headless OpenGL display singleton initialization [#4332](https://github.com/maplibre/maplibre-native/pull/4332) diff --git a/metrics/cache-style.db b/metrics/cache-style.db index 681f0d9ce3146beb927e27f2b272cce395813c04..71a5adc28e7f1587e353a9f72dbeda978e0ea53d 100644 GIT binary patch delta 3461 zcmZ|Sd0Z6b1IO{1+1cG$*n>+Hyg)#1SVTqf;8qbq6uj>g@Rksh4s{WWij+&)AOkG5 ztVE8IOl>vopwbcxk1}b^iptWIN=)hd{r%y8zkR(v@8_A_XJ%ge$L!8nIv==LP+5P& zIYIEdCkUSN1wpx69uOs-Yg)W_u(Hz7E(n6pwMxBLyJTo@D)$gu?s{Kx)Chvnzi@oZ z#n3Rxp%F`rL8f+7V~dly%4Edm!AsMNW25FIkbjSfYB0Vx7BQhZ; z4W8i7WlC^QOt8jHrE@hAqxqBsO&aLKDzLGzlf6$tVR)L8&MW zO-1Qw8k&wWP$rszW};bWHkyOxqIqaOT7VX!MQAZvf*wIj(K3{UvQZ9Nj#i+RXcbzG z)}Xa$9m++IqCB)7<)aPgF|-jCpvTb@=t=Yx+JrWvEy#ij(Nu z=m2^Hy@}pJ2T=n$gc?y3YDO*SZS)R0j9SsV=m>fb9Yx2`ar8d2p%dsN`T(6mr_qP# zBlI!)1ht`0(P!v$bOxP8U!X71In<8Mqp#4{r~_R<7ttkj8GVDkMOV;w=ql=L4Ql)T z@_v1a>?WA5n2wotn+htO%*UFnlT^HvTf_40=N-d^4k1Z6ENHiDmug3AO`7YPqndI} zj%J+3Ro$hwsduSYspHgrFB{WQA{Bm$!OZ=*GMyxna3$a|GM}enD==IB~Q(j@fN$={9#ut*yoO zRAq9o_Ml+gV4P+gW^^;$Hk>y!8!8Oz4Vi{0gNMFb-=ROOuhK_5UUDpObaiNQNYUNV zRqOI}5jq#8OF5#HC<~NuMWwx8px@CS=q9>_{zSLY9n_8fLVu%w&|TDn z?xBCtee?kJmekaWrHDvGMP#BT8loi%(GdsYNc6-&jKoBoh%<2^uEdS>A?~Cv=|?<> zC+SZHkbz_n8BDy0HyJ{Fh%fOYLy12LAb})^1d|XFO2SAuF_Q=~j6{;*WCR&WqR1#R znnaT^WGop+#*-KlOX5g8Ng#?FHL6|s^RNj0e+GWmvlORkXb$W_uwz9)8a zjr>5alOM@Xl+%GLQ@+ zgNYaMCPRo1@g;s_DDfu&B#;D=U=l(?Nf-$yW)eY$Nj80Bq!i$zR^x74Wjom(DHS-> z^u)lD^1q*AFfk_;y!$Vd`JMv>7Znv5Z1C7aYaPLg6ZqRCw_xwkl5^d|qp?7|qm zkRaj|MS>zL|L5=7+I#zSzby(@$qFtoq2M_oRpT>5WjdUpD=cq$4fiRF(?+r zp?H*l5>XPGfF`0zC>c#gDQF5xMQLa%N=MVsbd-TI(F`;b%|f%$95ffrL-WxBv`}g= IFOn?(0SB&YkpKVy delta 5714 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 VBf*p4DKH9*22Wd-=ZvxB{U4yc1>XPw diff --git a/metrics/integration/image/world-wrap.png b/metrics/integration/image/world-wrap.png new file mode 100644 index 0000000000000000000000000000000000000000..1586b0ecb005fd6d33bd0982aca35557c8768626 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^96-#%!3HEZpRM}hI~WrfBpBEl$fO*s z94K;t0mCE4BuX66z&L?VfPxSJhFn8M0|g-f3b`fBN63nThV#t2e=aa^&)ft|2Mi3J Lu6{1-oD!M #include +#include + namespace mln { using namespace style; @@ -142,15 +144,15 @@ void RenderImageSource::update(Immutable baseImpl_, static_cast(transformState.getZoom()), zoomRange); for (auto tile : idealTiles) { - if (tile.wrap != 0 && tileCover[0].canonical.isChildOf(tile.canonical)) { - tileIds.emplace_back(tile.wrap, tileCover[0].canonical); - hasVisibleTile = true; - } else if (!hasVisibleTile) { - for (auto coveringTile : tileCover) { - if (coveringTile.canonical == tile.canonical || coveringTile.canonical.isChildOf(tile.canonical) || - tile.canonical.isChildOf(coveringTile.canonical)) { - hasVisibleTile = true; + for (auto coveringTile : tileCover) { + if (coveringTile.canonical == tile.canonical || coveringTile.canonical.isChildOf(tile.canonical) || + tile.canonical.isChildOf(coveringTile.canonical)) { + hasVisibleTile = true; + const UnwrappedTileID wrappedTileID(tile.wrap, tileCover[0].canonical); + if (tile.wrap != 0 && std::find(tileIds.cbegin(), tileIds.cend(), wrappedTileID) == tileIds.cend()) { + tileIds.push_back(wrappedTileID); } + break; } } }