rebranding, image databending

This commit is contained in:
Breval Ferrari 2025-01-17 01:45:25 -05:00
parent f7eb44179d
commit ff6e44072e
No known key found for this signature in database
GPG key ID: CEAB625B75A836B2
7 changed files with 104 additions and 40 deletions

View file

@ -1,6 +1,6 @@
[package]
name = "bingus"
version = "0.1.2"
version = "0.2.0"
edition.workspace = true
license.workspace = true
description.workspace = true
@ -10,4 +10,5 @@ keywords.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
derive-new = { workspace = true }
image = { version = "0.25", features = ["rayon"] }
num = "0"

1
bingus/src/img.rs Normal file
View file

@ -0,0 +1 @@
pub mod image;

66
bingus/src/img/image.rs Normal file
View file

@ -0,0 +1,66 @@
use std::ops::{BitOr, Deref, Shl};
use image::{ImageBuffer, Pixel};
use num::{traits::ToBytes, Zero};
use crate::{Bendable, IntoDataBytes, TryFromDataBytes};
impl<P: Pixel> IntoDataBytes for ImageBuffer<P, Vec<P::Subpixel>>
where
Vec<P>: Deref<Target = [P::Subpixel]>,
P::Subpixel: ToBytes,
{
fn into_bytes(self) -> crate::Bytes {
self.into_iter()
.flat_map(|subpixel| subpixel.to_be_bytes().as_ref().to_vec())
.collect()
}
}
pub struct Dimensions {
pub width: u32,
pub height: u32,
}
impl<P: Pixel> TryFromDataBytes for ImageBuffer<P, Vec<P::Subpixel>>
where
Vec<P>: Deref<Target = [P::Subpixel]>,
P::Subpixel:
ToBytes + Zero + Shl<u8, Output = P::Subpixel> + BitOr<P::Subpixel, Output = P::Subpixel>,
{
type Error = ();
type Format = Dimensions;
fn try_from_bytes(bytes: crate::Bytes, format: Self::Format) -> Result<Self, Self::Error>
where
Self: Sized,
{
ImageBuffer::from_raw(
format.width,
format.height,
bytes
.chunks_exact(P::Subpixel::zero().to_be_bytes().as_ref().len())
.map(|p| {
p.iter()
.copied()
.flat_map(num::traits::cast::<u8, P::Subpixel>)
.reduce(|acc, b| (acc << 8u8) | b)
.unwrap()
})
.collect::<Vec<P::Subpixel>>(),
)
.ok_or(())
}
}
impl<P: Pixel> Bendable for ImageBuffer<P, Vec<P::Subpixel>>
where
Vec<P>: Deref<Target = [P::Subpixel]>,
P::Subpixel:
ToBytes + Zero + Shl<u8, Output = P::Subpixel> + BitOr<P::Subpixel, Output = P::Subpixel>,
{
type Unit = P;
fn apply<F: Fn(&Self::Unit) -> Self::Unit>(mut self, f: F) -> Self {
self.pixels_mut().for_each(|p| *p = f(p));
self
}
}

View file

@ -1,2 +1,34 @@
#![forbid(unused_crate_dependencies)]
pub mod rawdata;
pub mod img;
pub mod snd;
pub mod txt;
pub type Bytes = Vec<u8>;
pub trait Bendable: TryFromDataBytes + IntoDataBytes {
type Unit;
fn bend_into<T: Bendable>(
self,
format: <T as TryFromDataBytes>::Format,
) -> Result<T, <T as TryFromDataBytes>::Error> {
T::bend_from(self, format)
}
fn bend_from<T: Bendable>(
b: T,
format: <Self as TryFromDataBytes>::Format,
) -> Result<Self, <Self as TryFromDataBytes>::Error> {
Self::try_from_bytes(b.into_bytes(), format)
}
fn apply<F: Fn(&Self::Unit) -> Self::Unit>(self, f: F) -> Self;
}
pub trait IntoDataBytes: Sized {
fn into_bytes(self) -> Bytes;
}
pub trait TryFromDataBytes {
type Error;
type Format;
fn try_from_bytes(bytes: Bytes, format: Self::Format) -> Result<Self, Self::Error>
where
Self: Sized;
}

View file

@ -1,36 +0,0 @@
use std::ops::Deref;
use derive_new::new;
pub type Bytes = [u8];
#[derive(new)]
pub struct RawData<D: Deref<Target = Bytes>>(D);
impl<D> From<RawData<D>> for Vec<u8>
where
D: Deref<Target = Bytes>,
{
fn from(value: RawData<D>) -> Self {
value.to_owned()
}
}
impl<D> Clone for RawData<D>
where
D: Clone + Deref<Target = Bytes>,
{
fn clone(&self) -> Self {
Self(self.deref().clone())
}
}
impl<D> Deref for RawData<D>
where
D: Deref<Target = Bytes>,
{
type Target = D;
fn deref(&self) -> &Self::Target {
&self.0
}
}

0
bingus/src/snd.rs Normal file
View file

0
bingus/src/txt.rs Normal file
View file