Add image/svg support to iced_glow

https://github.com/iced-rs/iced/issues/674

Uses image/svg support in `iced_graphics`. The is not currently using an
atlas, and uses one texture/draw per image. This should be good enough
for now; supporting images with glow is better than not supporting them,
and if something else performs better, that improvement can be made
without any change to the public API.
This commit is contained in:
Ian Douglas Scott 2022-10-24 17:06:02 -07:00 committed by Héctor Ramón Jiménez
parent 2c7c42ee93
commit 5575e6ea08
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
8 changed files with 368 additions and 8 deletions

View file

@ -0,0 +1,82 @@
use glow::HasContext;
use iced_graphics::image::{TextureStore, TextureStoreEntry};
#[derive(Debug)]
pub struct Textures;
impl Textures {
pub fn new() -> Self {
Self
}
}
impl TextureStore for Textures {
type Entry = Entry;
type State<'a> = &'a glow::Context;
fn upload(
&mut self,
width: u32,
height: u32,
data: &[u8],
gl: &mut &glow::Context,
) -> Option<Self::Entry> {
unsafe {
let texture = gl.create_texture().expect("create texture");
gl.bind_texture(glow::TEXTURE_2D, Some(texture));
gl.tex_image_2d(
glow::TEXTURE_2D,
0,
glow::SRGB8_ALPHA8 as i32,
width as i32,
height as i32,
0,
glow::BGRA,
glow::UNSIGNED_BYTE,
Some(data),
);
gl.tex_parameter_i32(
glow::TEXTURE_2D,
glow::TEXTURE_WRAP_S,
glow::CLAMP_TO_EDGE as _,
);
gl.tex_parameter_i32(
glow::TEXTURE_2D,
glow::TEXTURE_WRAP_T,
glow::CLAMP_TO_EDGE as _,
);
gl.tex_parameter_i32(
glow::TEXTURE_2D,
glow::TEXTURE_MIN_FILTER,
glow::LINEAR as _,
);
gl.tex_parameter_i32(
glow::TEXTURE_2D,
glow::TEXTURE_MAG_FILTER,
glow::LINEAR as _,
);
gl.bind_texture(glow::TEXTURE_2D, None);
Some(Entry {
size: (width, height),
texture,
})
}
}
fn remove(&mut self, entry: &Entry, gl: &mut &glow::Context) {
unsafe { gl.delete_texture(entry.texture) }
}
}
#[derive(Debug)]
pub struct Entry {
size: (u32, u32),
pub texture: glow::NativeTexture,
}
impl TextureStoreEntry for Entry {
fn size(&self) -> (u32, u32) {
self.size
}
}