mirror of
https://github.com/emilk/egui.git
synced 2026-08-30 21:30:03 -04:00
Partial font texture update (#1149)
This commit is contained in:
@@ -33,7 +33,6 @@ struct ContextImpl {
|
||||
fonts: Option<Fonts>,
|
||||
memory: Memory,
|
||||
animation_manager: AnimationManager,
|
||||
latest_font_image_version: Option<u64>,
|
||||
tex_manager: WrappedTextureManager,
|
||||
|
||||
input: InputState,
|
||||
@@ -709,17 +708,15 @@ impl Context {
|
||||
.memory
|
||||
.end_frame(&ctx_impl.input, &ctx_impl.frame_state.used_ids);
|
||||
|
||||
let font_image = ctx_impl.fonts.as_ref().unwrap().font_image();
|
||||
let font_image_version = font_image.version;
|
||||
|
||||
if Some(font_image_version) != ctx_impl.latest_font_image_version {
|
||||
let font_image_delta = ctx_impl.fonts.as_ref().unwrap().font_image_delta();
|
||||
if let Some(font_image_delta) = font_image_delta {
|
||||
ctx_impl
|
||||
.tex_manager
|
||||
.0
|
||||
.write()
|
||||
.set(TextureId::default(), font_image.image.clone().into());
|
||||
ctx_impl.latest_font_image_version = Some(font_image_version);
|
||||
.set(TextureId::default(), font_image_delta);
|
||||
}
|
||||
|
||||
ctx_impl
|
||||
.output
|
||||
.textures_delta
|
||||
@@ -757,7 +754,7 @@ impl Context {
|
||||
let clipped_meshes = tessellator::tessellate_shapes(
|
||||
shapes,
|
||||
tessellation_options,
|
||||
self.fonts().font_image().size(),
|
||||
self.fonts().font_image_size(),
|
||||
);
|
||||
self.write().paint_stats = paint_stats.with_clipped_meshes(&clipped_meshes);
|
||||
clipped_meshes
|
||||
@@ -961,8 +958,8 @@ impl Context {
|
||||
.show(ui, |ui| {
|
||||
let mut font_definitions = self.fonts().definitions().clone();
|
||||
font_definitions.ui(ui);
|
||||
let font_image = self.fonts().font_image();
|
||||
font_image.ui(ui);
|
||||
let font_image_size = self.fonts().font_image_size();
|
||||
crate::introspection::font_texture_ui(ui, font_image_size);
|
||||
self.set_fonts(font_definitions);
|
||||
});
|
||||
|
||||
|
||||
@@ -1,60 +1,58 @@
|
||||
//! uis for egui types.
|
||||
use crate::*;
|
||||
|
||||
impl Widget for &epaint::FontImage {
|
||||
fn ui(self, ui: &mut Ui) -> Response {
|
||||
use epaint::Mesh;
|
||||
// Show font texture in demo Ui
|
||||
pub(crate) fn font_texture_ui(ui: &mut Ui, [width, height]: [usize; 2]) -> Response {
|
||||
use epaint::Mesh;
|
||||
|
||||
ui.vertical(|ui| {
|
||||
// Show font texture in demo Ui
|
||||
let [width, height] = self.size();
|
||||
ui.vertical(|ui| {
|
||||
let color = if ui.visuals().dark_mode {
|
||||
Color32::WHITE
|
||||
} else {
|
||||
Color32::BLACK
|
||||
};
|
||||
|
||||
ui.label(format!(
|
||||
"Texture size: {} x {} (hover to zoom)",
|
||||
width, height
|
||||
));
|
||||
if width <= 1 || height <= 1 {
|
||||
return;
|
||||
}
|
||||
let mut size = vec2(width as f32, height as f32);
|
||||
if size.x > ui.available_width() {
|
||||
size *= ui.available_width() / size.x;
|
||||
}
|
||||
let (rect, response) = ui.allocate_at_least(size, Sense::hover());
|
||||
let mut mesh = Mesh::default();
|
||||
mesh.add_rect_with_uv(
|
||||
rect,
|
||||
[pos2(0.0, 0.0), pos2(1.0, 1.0)].into(),
|
||||
Color32::WHITE,
|
||||
);
|
||||
ui.painter().add(Shape::mesh(mesh));
|
||||
ui.label(format!(
|
||||
"Texture size: {} x {} (hover to zoom)",
|
||||
width, height
|
||||
));
|
||||
if width <= 1 || height <= 1 {
|
||||
return;
|
||||
}
|
||||
let mut size = vec2(width as f32, height as f32);
|
||||
if size.x > ui.available_width() {
|
||||
size *= ui.available_width() / size.x;
|
||||
}
|
||||
let (rect, response) = ui.allocate_at_least(size, Sense::hover());
|
||||
let mut mesh = Mesh::default();
|
||||
mesh.add_rect_with_uv(rect, [pos2(0.0, 0.0), pos2(1.0, 1.0)].into(), color);
|
||||
ui.painter().add(Shape::mesh(mesh));
|
||||
|
||||
let (tex_w, tex_h) = (width as f32, height as f32);
|
||||
let (tex_w, tex_h) = (width as f32, height as f32);
|
||||
|
||||
response
|
||||
.on_hover_cursor(CursorIcon::ZoomIn)
|
||||
.on_hover_ui_at_pointer(|ui| {
|
||||
if let Some(pos) = ui.ctx().latest_pointer_pos() {
|
||||
let (_id, zoom_rect) = ui.allocate_space(vec2(128.0, 128.0));
|
||||
let u = remap_clamp(pos.x, rect.x_range(), 0.0..=tex_w);
|
||||
let v = remap_clamp(pos.y, rect.y_range(), 0.0..=tex_h);
|
||||
response
|
||||
.on_hover_cursor(CursorIcon::ZoomIn)
|
||||
.on_hover_ui_at_pointer(|ui| {
|
||||
if let Some(pos) = ui.ctx().latest_pointer_pos() {
|
||||
let (_id, zoom_rect) = ui.allocate_space(vec2(128.0, 128.0));
|
||||
let u = remap_clamp(pos.x, rect.x_range(), 0.0..=tex_w);
|
||||
let v = remap_clamp(pos.y, rect.y_range(), 0.0..=tex_h);
|
||||
|
||||
let texel_radius = 32.0;
|
||||
let u = u.at_least(texel_radius).at_most(tex_w - texel_radius);
|
||||
let v = v.at_least(texel_radius).at_most(tex_h - texel_radius);
|
||||
let texel_radius = 32.0;
|
||||
let u = u.at_least(texel_radius).at_most(tex_w - texel_radius);
|
||||
let v = v.at_least(texel_radius).at_most(tex_h - texel_radius);
|
||||
|
||||
let uv_rect = Rect::from_min_max(
|
||||
pos2((u - texel_radius) / tex_w, (v - texel_radius) / tex_h),
|
||||
pos2((u + texel_radius) / tex_w, (v + texel_radius) / tex_h),
|
||||
);
|
||||
let mut mesh = Mesh::default();
|
||||
mesh.add_rect_with_uv(zoom_rect, uv_rect, Color32::WHITE);
|
||||
ui.painter().add(Shape::mesh(mesh));
|
||||
}
|
||||
});
|
||||
})
|
||||
.response
|
||||
}
|
||||
let uv_rect = Rect::from_min_max(
|
||||
pos2((u - texel_radius) / tex_w, (v - texel_radius) / tex_h),
|
||||
pos2((u + texel_radius) / tex_w, (v + texel_radius) / tex_h),
|
||||
);
|
||||
let mut mesh = Mesh::default();
|
||||
mesh.add_rect_with_uv(zoom_rect, uv_rect, color);
|
||||
ui.painter().add(Shape::mesh(mesh));
|
||||
}
|
||||
});
|
||||
})
|
||||
.response
|
||||
}
|
||||
|
||||
impl Widget for &mut epaint::text::FontDefinitions {
|
||||
|
||||
@@ -1087,9 +1087,13 @@ pub struct PlotImage {
|
||||
|
||||
impl PlotImage {
|
||||
/// Create a new image with position and size in plot coordinates.
|
||||
pub fn new(texture_id: impl Into<TextureId>, position: Value, size: impl Into<Vec2>) -> Self {
|
||||
pub fn new(
|
||||
texture_id: impl Into<TextureId>,
|
||||
center_position: Value,
|
||||
size: impl Into<Vec2>,
|
||||
) -> Self {
|
||||
Self {
|
||||
position,
|
||||
position: center_position,
|
||||
name: Default::default(),
|
||||
highlight: false,
|
||||
texture_id: texture_id.into(),
|
||||
|
||||
Reference in New Issue
Block a user