diff --git a/README.md b/README.md
index bb73ab0..1bc941d 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ Silicon is an alternative to [Carbon](https://github.com/dawnlabs/carbon) implem
It can render your source code into a beautiful image.
-
+
## Why Silicon
diff --git a/example/example.png b/example/example.png
new file mode 100644
index 0000000..d7df881
Binary files /dev/null and b/example/example.png differ
diff --git a/example/example.rs b/example/example.rs
new file mode 100644
index 0000000..1e72f2c
--- /dev/null
+++ b/example/example.rs
@@ -0,0 +1,10 @@
+fn factorial(n: u64) -> u64 {
+ match n {
+ 0 => 1,
+ _ => n * factorial(n - 1),
+ }
+}
+
+fn main() {
+ println!("10! = {}", factorial(10));
+}
\ No newline at end of file
diff --git a/example/example.sh b/example/example.sh
new file mode 100644
index 0000000..1b2d552
--- /dev/null
+++ b/example/example.sh
@@ -0,0 +1 @@
+silicon example.rs -o example.png
diff --git a/src/utils.rs b/src/utils.rs
index 4214099..8026027 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -269,31 +269,48 @@ pub(crate) fn copy_alpha(src: &RgbaImage, dst: &mut RgbaImage, x: u32, y: u32) {
pub(crate) fn round_corner(image: &mut DynamicImage, radius: u32) {
// draw a circle with given foreground on given background
// then split it into four pieces and paste them to the four corner of the image
+ //
+ // the circle is drawn on a bigger image to avoid the aliasing
+ // later it will be scaled to the correct size
+ // we add +1 (to the radius) to make sure that there is also space for the border to mitigate artefacts when scaling
+ // note that the +1 isn't added to the radius when drawing the circle
let mut circle =
- RgbaImage::from_pixel(radius * 2 + 1, radius * 2 + 1, Rgba([255, 255, 255, 0]));
+ RgbaImage::from_pixel((radius + 1) * 4, (radius + 1) * 4, Rgba([255, 255, 255, 0]));
let width = image.width();
let height = image.height();
+ // use the bottom right pixel to get the color of the foreground
let foreground = image.get_pixel(width - 1, height - 1);
- // TODO: need a blur on edge
draw_filled_circle_mut(
&mut circle,
- (radius as i32, radius as i32),
- radius as i32,
+ (((radius + 1) * 2) as i32, ((radius + 1) * 2) as i32),
+ radius as i32 * 2,
foreground,
);
- let part = crop_imm(&circle, 0, 0, radius, radius);
+ // scale down the circle to the correct size
+ let circle = resize(
+ &circle,
+ (radius + 1) * 2,
+ (radius + 1) * 2,
+ FilterType::Triangle,
+ );
+
+ // top left
+ let part = crop_imm(&circle, 1, 1, radius, radius);
image.copy_from(&*part, 0, 0).unwrap();
- let part = crop_imm(&circle, radius + 1, 0, radius, radius);
+ // top right
+ let part = crop_imm(&circle, radius + 1, 1, radius, radius - 1);
image.copy_from(&*part, width - radius, 0).unwrap();
- let part = crop_imm(&circle, 0, radius + 1, radius, radius);
+ // bottom left
+ let part = crop_imm(&circle, 1, radius + 1, radius, radius);
image.copy_from(&*part, 0, height - radius).unwrap();
+ // bottom right
let part = crop_imm(&circle, radius + 1, radius + 1, radius, radius);
image
.copy_from(&*part, width - radius, height - radius)