Implement image support for canvas widget
This commit is contained in:
parent
87a613edd1
commit
0ceee1cf3a
16 changed files with 485 additions and 29 deletions
|
|
@ -149,6 +149,8 @@ impl Pipeline {
|
|||
6 => Float32x2,
|
||||
// Layer
|
||||
7 => Sint32,
|
||||
// Snap
|
||||
8 => Uint32,
|
||||
),
|
||||
}],
|
||||
},
|
||||
|
|
@ -212,8 +214,6 @@ impl Pipeline {
|
|||
transformation: Transformation,
|
||||
scale: f32,
|
||||
) {
|
||||
let transformation = transformation * Transformation::scale(scale);
|
||||
|
||||
let nearest_instances: &mut Vec<Instance> = &mut Vec::new();
|
||||
let linear_instances: &mut Vec<Instance> = &mut Vec::new();
|
||||
|
||||
|
|
@ -226,6 +226,7 @@ impl Pipeline {
|
|||
bounds,
|
||||
rotation,
|
||||
opacity,
|
||||
snap,
|
||||
} => {
|
||||
if let Some(atlas_entry) =
|
||||
cache.upload_raster(device, encoder, handle)
|
||||
|
|
@ -235,6 +236,7 @@ impl Pipeline {
|
|||
[bounds.width, bounds.height],
|
||||
f32::from(*rotation),
|
||||
*opacity,
|
||||
*snap,
|
||||
atlas_entry,
|
||||
match filter_method {
|
||||
crate::core::image::FilterMethod::Nearest => {
|
||||
|
|
@ -268,6 +270,7 @@ impl Pipeline {
|
|||
size,
|
||||
f32::from(*rotation),
|
||||
*opacity,
|
||||
true,
|
||||
atlas_entry,
|
||||
nearest_instances,
|
||||
);
|
||||
|
|
@ -300,6 +303,7 @@ impl Pipeline {
|
|||
nearest_instances,
|
||||
linear_instances,
|
||||
transformation,
|
||||
scale,
|
||||
);
|
||||
|
||||
self.prepare_layer += 1;
|
||||
|
|
@ -375,9 +379,12 @@ impl Layer {
|
|||
nearest_instances: &[Instance],
|
||||
linear_instances: &[Instance],
|
||||
transformation: Transformation,
|
||||
scale_factor: f32,
|
||||
) {
|
||||
let uniforms = Uniforms {
|
||||
transform: transformation.into(),
|
||||
scale_factor,
|
||||
_padding: [0.0; 3],
|
||||
};
|
||||
|
||||
let bytes = bytemuck::bytes_of(&uniforms);
|
||||
|
|
@ -492,6 +499,7 @@ struct Instance {
|
|||
_position_in_atlas: [f32; 2],
|
||||
_size_in_atlas: [f32; 2],
|
||||
_layer: u32,
|
||||
_snap: u32,
|
||||
}
|
||||
|
||||
impl Instance {
|
||||
|
|
@ -502,6 +510,10 @@ impl Instance {
|
|||
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
||||
struct Uniforms {
|
||||
transform: [f32; 16],
|
||||
scale_factor: f32,
|
||||
// Uniforms must be aligned to their largest member,
|
||||
// this uses a mat4x4<f32> which aligns to 16, so align to that
|
||||
_padding: [f32; 3],
|
||||
}
|
||||
|
||||
fn add_instances(
|
||||
|
|
@ -509,6 +521,7 @@ fn add_instances(
|
|||
image_size: [f32; 2],
|
||||
rotation: f32,
|
||||
opacity: f32,
|
||||
snap: bool,
|
||||
entry: &atlas::Entry,
|
||||
instances: &mut Vec<Instance>,
|
||||
) {
|
||||
|
|
@ -525,6 +538,7 @@ fn add_instances(
|
|||
image_size,
|
||||
rotation,
|
||||
opacity,
|
||||
snap,
|
||||
allocation,
|
||||
instances,
|
||||
);
|
||||
|
|
@ -554,8 +568,8 @@ fn add_instances(
|
|||
];
|
||||
|
||||
add_instance(
|
||||
position, center, size, rotation, opacity, allocation,
|
||||
instances,
|
||||
position, center, size, rotation, opacity, snap,
|
||||
allocation, instances,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -569,6 +583,7 @@ fn add_instance(
|
|||
size: [f32; 2],
|
||||
rotation: f32,
|
||||
opacity: f32,
|
||||
snap: bool,
|
||||
allocation: &atlas::Allocation,
|
||||
instances: &mut Vec<Instance>,
|
||||
) {
|
||||
|
|
@ -591,6 +606,7 @@ fn add_instance(
|
|||
(height as f32 - 1.0) / atlas::SIZE as f32,
|
||||
],
|
||||
_layer: layer as u32,
|
||||
_snap: snap as u32,
|
||||
};
|
||||
|
||||
instances.push(instance);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue