diff --git a/Cargo.toml b/Cargo.toml index 6348b3db..4e006815 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,7 +68,7 @@ gst_pbutils = { version = "0.23", package = "gstreamer-pbutils" } gst_play = { version = "0.23", package = "gstreamer-play" } gst_video = { version = "0.23", package = "gstreamer-video" } gtk = { package = "gtk4", version = "0.9", features = ["gnome_47"] } -shumate = { package = "libshumate", version = "0.6" } +shumate = { package = "libshumate", version = "0.6", features = ["v1_1"] } sourceview = { package = "sourceview5", version = "0.9" } [dependencies.matrix-sdk] diff --git a/meson.build b/meson.build index f17dc740..60ca2a89 100644 --- a/meson.build +++ b/meson.build @@ -37,7 +37,7 @@ dependency('gstreamer-video-1.0', version: '>= 1.20') dependency('gtksourceview-5', version: '>= 5.0.0') dependency('libwebp', version: '>= 1.0.0') dependency('openssl', version: '>= 3.0.0') -dependency('shumate-1.0', version: '>= 1.0.0') +dependency('shumate-1.0', version: '>= 1.1.0') dependency('sqlite3', version: '>= 3.24.0') # Required by glycin crate diff --git a/src/components/media/location_viewer.rs b/src/components/media/location_viewer.rs index 5e46b0b4..ad76379e 100644 --- a/src/components/media/location_viewer.rs +++ b/src/components/media/location_viewer.rs @@ -1,6 +1,6 @@ use adw::{prelude::*, subclass::prelude::*}; use geo_uri::GeoUri; -use gtk::{CompositeTemplate, gdk_pixbuf, gio, glib}; +use gtk::{gdk, gio, glib}; use shumate::prelude::*; use crate::i18n::gettext_f; @@ -12,7 +12,7 @@ mod imp { use super::*; - #[derive(Debug, Default, CompositeTemplate, glib::Properties)] + #[derive(Debug, Default, gtk::CompositeTemplate, glib::Properties)] #[template(resource = "/org/gnome/Fractal/ui/components/media/location_viewer.ui")] #[properties(wrapper_type = super::LocationViewer)] pub struct LocationViewer { @@ -52,27 +52,49 @@ mod imp { "/org/gnome/Fractal/mapstyle/osm-liberty/style.json", gio::ResourceLookupFlags::NONE, ) - .expect("Could not load map style"); - let source = + .expect("should be able to load map style"); + let renderer = shumate::VectorRenderer::new("vector-tiles", &String::from_utf8_lossy(&style)) - .expect("Could not read map style"); - source.set_license("© OpenMapTiles © OpenStreetMap contributors"); - source.set_license_uri("https://www.openstreetmap.org/copyright"); + .expect("should be able to read map style"); + renderer.set_license("© OpenMapTiles © OpenStreetMap contributors"); + renderer.set_license_uri("https://www.openstreetmap.org/copyright"); - let spritepixbuf = gdk_pixbuf::Pixbuf::from_resource( - "/org/gnome/Fractal/mapstyle/osm-liberty/sprites.png", - ) - .expect("Could not load map sprites"); - let spritejson = gio::resources_lookup_data( + let sprite_sheet = renderer + .sprite_sheet() + .expect("renderer should have sprite sheet"); + + let sprites_texture = + gdk::Texture::from_resource("/org/gnome/Fractal/mapstyle/osm-liberty/sprites.png"); + let sprites_json = gio::resources_lookup_data( "/org/gnome/Fractal/mapstyle/osm-liberty/sprites.json", gio::ResourceLookupFlags::NONE, ) - .expect("Could not load map sprite sheet"); - source - .set_sprite_sheet_data(&spritepixbuf, &String::from_utf8_lossy(&spritejson)) - .expect("Could not set map sprite sheet"); - - self.map.set_map_source(Some(&source)); + .expect("should be able to load map sprite sheet"); + sprite_sheet + .add_page( + &sprites_texture, + &String::from_utf8_lossy(&sprites_json), + 1.0, + ) + .expect("should be able to add map sprite sheet page"); + + let sprites_2x_texture = gdk::Texture::from_resource( + "/org/gnome/Fractal/mapstyle/osm-liberty/sprites@2x.png", + ); + let sprites_2x_json = gio::resources_lookup_data( + "/org/gnome/Fractal/mapstyle/osm-liberty/sprites@2x.json", + gio::ResourceLookupFlags::NONE, + ) + .expect("should be able to load map 2x sprite sheet"); + sprite_sheet + .add_page( + &sprites_2x_texture, + &String::from_utf8_lossy(&sprites_2x_json), + 2.0, + ) + .expect("should be able to add map 2x sprite sheet page"); + + self.map.set_map_source(Some(&renderer)); let viewport = self.map.viewport().expect("map has a viewport"); viewport.set_zoom_level(12.0);