-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.rs
101 lines (90 loc) · 3.36 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// TODO: use turbojpeg for compression
use image::{imageops, ImageBuffer, RgbImage};
use lib::Transformation;
use p256::ecdsa::{signature::Verifier, Signature, VerifyingKey};
#[no_mangle]
extern "C" fn round(x: f32) -> f32 {
let scale: f32 = 10_f32.powi(0);
(x * scale).round() / scale
}
#[no_mangle]
extern "C" fn roundf(x: f32) -> f32 {
let offset = x % 1.0f32;
if offset >= 0.5 {
return x + (1.0f32 - offset);
}
return x - offset;
}
pub fn main() {
let transformations = sp1_zkvm::io::read::<Vec<Transformation>>();
let img_buf = sp1_zkvm::io::read::<Vec<u8>>();
let old_width = sp1_zkvm::io::read::<u32>();
let old_height = sp1_zkvm::io::read::<u32>();
let signing_key = sp1_zkvm::io::read::<Vec<u8>>();
let signature = sp1_zkvm::io::read::<Vec<u8>>();
// Verify signature.
let verifying_key = VerifyingKey::from_sec1_bytes(&signing_key).unwrap();
assert!(verifying_key
.verify(&img_buf, &Signature::try_from(&signature[..]).unwrap())
.is_ok());
// crop image.
println!("Before reading image");
println!("width: {:?}", old_width);
println!("height: {:?}", old_height);
println!("img_buf.len(): {:?}", img_buf.len());
let img: RgbImage = ImageBuffer::from_raw(old_width, old_height, img_buf).unwrap();
println!("Finished reading image");
let mut new_width = old_width;
let mut new_height = old_height;
let mut transformed_img = img;
for transformation in transformations {
match transformation {
Transformation::Crop(params) => {
new_width = params.width;
new_height = params.height;
transformed_img = imageops::crop(
&mut transformed_img,
params.x,
params.y,
new_width,
new_height,
)
.to_image();
}
Transformation::Grayscale() => {
transformed_img = RgbImage::from_raw(
new_width,
new_height,
imageops::grayscale(&transformed_img).as_raw().to_vec(),
)
.unwrap();
}
Transformation::Rotate90() => {
transformed_img = imageops::rotate90(&transformed_img);
}
Transformation::Rotate180() => {
transformed_img = imageops::rotate180(&transformed_img);
}
Transformation::Rotate270() => {
transformed_img = imageops::rotate270(&transformed_img);
}
Transformation::FlipVertical() => {
transformed_img = imageops::flip_vertical(&transformed_img);
}
Transformation::FlipHorizontal() => {
transformed_img = imageops::flip_horizontal(&transformed_img);
}
Transformation::Brighten(params) => {
transformed_img = imageops::brighten(&transformed_img, params.value)
}
Transformation::Constrast(params) => {
transformed_img = imageops::contrast(&transformed_img, params.contrast);
}
};
}
let img_buffer = transformed_img.as_raw();
// Write back cropped image.
sp1_zkvm::io::write(&img_buffer);
sp1_zkvm::io::write(&new_width);
sp1_zkvm::io::write(&new_height);
}