aboutsummaryrefslogtreecommitdiff
path: root/old/evc/src/refsampler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'old/evc/src/refsampler.rs')
-rw-r--r--old/evc/src/refsampler.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/old/evc/src/refsampler.rs b/old/evc/src/refsampler.rs
new file mode 100644
index 0000000..8a8f44f
--- /dev/null
+++ b/old/evc/src/refsampler.rs
@@ -0,0 +1,51 @@
+use crate::{
+ block::AdvancedReference,
+ format::ser::map_scalar8,
+ frame::Frame,
+ helpers::{matrix::Mat2, pixel::Pixel, vector::Vec2},
+ view::View,
+};
+
+#[derive(Debug, Clone)]
+pub struct Sampler<'a> {
+ pub view: View<&'a Frame>,
+ pub halfsize: Vec2<f32>,
+
+ pub translation: Vec2<f32>,
+ pub transform: Mat2<f32>,
+
+ pub value_scale: f32,
+}
+
+impl<'a> Sampler<'a> {
+ #[inline]
+ pub fn sample(&self, p: Vec2<f32>) -> Pixel {
+ self.view
+ .sample(self.translation + self.transform.transform(p - self.halfsize) + self.halfsize)
+ .scale(self.value_scale)
+ }
+ pub fn from_refblock(
+ view: View<&'a Frame>,
+ AdvancedReference {
+ translation,
+ transform,
+ value_scale,
+ }: &AdvancedReference,
+ ) -> Self {
+ Self {
+ transform: Mat2 {
+ a: map_scalar8(transform.a),
+ b: map_scalar8(transform.b),
+ c: map_scalar8(transform.c),
+ d: map_scalar8(transform.d),
+ },
+ halfsize: Into::<Vec2<f32>>::into(view.size).scale(0.5),
+ translation: Vec2 {
+ x: map_scalar8(translation.x),
+ y: map_scalar8(translation.y),
+ },
+ value_scale: 1.05f32.powf(*value_scale as f32),
+ view,
+ }
+ }
+}