snap text on shader

This commit is contained in:
2025-08-23 22:16:00 -04:00
parent 5ce6fca275
commit 50ccf7393d
10 changed files with 101 additions and 64 deletions

View File

@@ -1,18 +1,17 @@
use std::ops::Index;
use std::{
ops::Index,
sync::mpsc::{Receiver, Sender, channel},
};
use image::DynamicImage;
use crate::{
layout::{UiMsg, UiMsgSender},
render::TexturePrimitive,
util::RefCounter,
};
use crate::{render::TexturePrimitive, util::RefCounter};
#[derive(Clone)]
pub struct TextureHandle {
pub inner: TexturePrimitive,
counter: RefCounter,
send: UiMsgSender,
send: Sender<u32>,
}
/// a texture manager for a ui
@@ -21,7 +20,8 @@ pub struct Textures {
free: Vec<u32>,
images: Vec<Option<DynamicImage>>,
updates: Vec<Update>,
send: UiMsgSender,
send: Sender<u32>,
recv: Receiver<u32>,
}
pub enum TextureUpdate<'a> {
@@ -37,12 +37,14 @@ enum Update {
}
impl Textures {
pub fn new(send: UiMsgSender) -> Self {
pub fn new() -> Self {
let (send, recv) = channel();
Self {
free: Vec::new(),
images: Vec::new(),
updates: Vec::new(),
send,
recv,
}
}
pub fn add(&mut self, image: impl Into<DynamicImage>) -> TextureHandle {
@@ -72,10 +74,12 @@ impl Textures {
}
}
pub fn free(&mut self, idx: u32) {
self.images[idx as usize] = None;
self.updates.push(Update::Free(idx));
self.free.push(idx);
pub fn free(&mut self) {
for idx in self.recv.try_iter() {
self.images[idx as usize] = None;
self.updates.push(Update::Free(idx));
self.free.push(idx);
}
}
pub fn updates(&mut self) -> impl Iterator<Item = TextureUpdate<'_>> {
@@ -90,7 +94,7 @@ impl Textures {
impl Drop for TextureHandle {
fn drop(&mut self) {
if self.counter.drop() {
let _ = self.send.send(UiMsg::FreeTexture(self.inner.view_idx));
let _ = self.send.send(self.inner.view_idx);
}
}
}
@@ -102,3 +106,9 @@ impl Index<&TextureHandle> for Textures {
self.images[index.inner.view_idx as usize].as_ref().unwrap()
}
}
impl Default for Textures {
fn default() -> Self {
Self::new()
}
}