Skip to content

Commit

Permalink
Ran rustfmt on everything + updated Travis config to check formatting…
Browse files Browse the repository at this point in the history
… and automatically push test images.
  • Loading branch information
francesca64 committed Dec 14, 2017
1 parent db353a4 commit b1bf9e7
Show file tree
Hide file tree
Showing 19 changed files with 672 additions and 534 deletions.
22 changes: 18 additions & 4 deletions .travis.yml
@@ -1,11 +1,25 @@
language: rust
cache: cargo
rust:
- stable
- beta
- nightly
matrix:
allow_failures:
include:
- rust: nightly

env: RUSTFMT=0.3.1
install:
- export LD_LIBRARY_PATH=$(rustc --print sysroot)/lib:$LD_LIBRARY_PATH
- if [[ `rustfmt --version` != $RUSTFMT* ]] ; then travis_wait cargo install --force rustfmt-nightly --vers $RUSTFMT; fi
- export PATH="$PATH:$HOME/.cargo/bin"
script:
- rustfmt --write-mode=diff src/lib.rs
- cargo build
- cargo test
before_script:
- sudo chmod -R 0777 /home/travis/build/kosinix/raster/tests/
- sudo chmod -R 0777 /home/travis/build/kosinix/raster/tests/
script:
- cargo build
- cargo test
- cargo doc
after_success:
- test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && bash deploy-docs.sh
25 changes: 25 additions & 0 deletions deploy-docs.sh
@@ -0,0 +1,25 @@
#!/bin/bash

set -o errexit -o nounset

: ${TRAVIS:?"This should only be run on Travis CI."}

rev=$(git rev-parse --short HEAD)

git init
git config user.name "Francesca Sunshine"
git config user.email "francesca@comfy.love"

git remote add upstream "https://$GH_TOKEN@github.com/kosinix/raster.git"
git fetch upstream
git reset upstream/gh-pages

rm -rf in out docs
mv tests/in in
mv tests/out out
rm out/.gitignore
mv target/doc docs

git add -A in out docs
git commit -m "Updated docs for ${rev}"
git push --force --quiet upstream HEAD:gh-pages
5 changes: 5 additions & 0 deletions rustfmt.toml
@@ -0,0 +1,5 @@
use_try_shorthand = true

# This was merged, but doesn't seem to work? https://github.com/rust-lang-nursery/rustfmt/pull/1869
# error_on_line_overflow_comments = false
error_on_line_overflow = false
132 changes: 97 additions & 35 deletions src/blend.rs
@@ -1,13 +1,10 @@
//! A module for blending 2 images.
// See https://en.wikipedia.org/wiki/Alpha_compositing


// from rust


// from external crate


// from local crate
use error::RasterResult;
use Image;
Expand All @@ -20,24 +17,33 @@ pub enum BlendMode {
Difference,
Multiply,
Overlay,
Screen
Screen,
}

pub fn difference(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32, loop_start_x:i32, loop_end_x:i32, offset_x:i32, offset_y:i32, opacity:f32) -> RasterResult<Image> {

pub fn difference(
image1: &Image,
image2: &Image,
loop_start_y: i32,
loop_end_y: i32,
loop_start_x: i32,
loop_end_x: i32,
offset_x: i32,
offset_y: i32,
opacity: f32,
) -> RasterResult<Image> {
let mut canvas = image1.clone();

for y in loop_start_y..loop_end_y {
for x in loop_start_x..loop_end_x {
let canvas_x = x + offset_x;
let canvas_y = y + offset_y;
let rgba1 = try!(image1.get_pixel(canvas_x, canvas_y));
let rgba1 = image1.get_pixel(canvas_x, canvas_y)?;
let a1 = rgba1.a as f32 / 255.0; // convert to 0.0 - 1.0
let r1 = rgba1.r as f32 * a1;
let g1 = rgba1.g as f32 * a1;
let b1 = rgba1.b as f32 * a1;

let rgba2 = try!(image2.get_pixel(x, y));
let rgba2 = image2.get_pixel(x, y)?;
let a2 = rgba2.a as f32 / 255.0 * opacity; // convert to 0.0 - 1.0
let r2 = rgba2.r as f32;
let g2 = rgba2.g as f32;
Expand All @@ -48,28 +54,41 @@ pub fn difference(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i
let b3 = ch_alpha_f(b1, b2, BlendFunction::Difference, a2);
let a3 = 255;

try!(canvas.set_pixel(canvas_x, canvas_y, &Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8)));
canvas.set_pixel(
canvas_x,
canvas_y,
&Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8),
)?;
}
}

Ok(canvas)
}

pub fn multiply(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32, loop_start_x:i32, loop_end_x:i32, offset_x:i32, offset_y:i32, opacity:f32) -> RasterResult<Image> {

pub fn multiply(
image1: &Image,
image2: &Image,
loop_start_y: i32,
loop_end_y: i32,
loop_start_x: i32,
loop_end_x: i32,
offset_x: i32,
offset_y: i32,
opacity: f32,
) -> RasterResult<Image> {
let mut canvas = image1.clone();

for y in loop_start_y..loop_end_y {
for x in loop_start_x..loop_end_x {
let canvas_x = x + offset_x;
let canvas_y = y + offset_y;
let rgba1 = try!(image1.get_pixel(canvas_x, canvas_y));
let rgba1 = image1.get_pixel(canvas_x, canvas_y)?;
let a1 = rgba1.a as f32 / 255.0; // convert to 0.0 - 1.0
let r1 = rgba1.r as f32 * a1;
let g1 = rgba1.g as f32 * a1;
let b1 = rgba1.b as f32 * a1;

let rgba2 = try!(image2.get_pixel(x, y));
let rgba2 = image2.get_pixel(x, y)?;
let a2 = rgba2.a as f32 / 255.0 * opacity; // convert to 0.0 - 1.0
let r2 = rgba2.r as f32;
let g2 = rgba2.g as f32;
Expand All @@ -80,28 +99,41 @@ pub fn multiply(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32
let b3 = ch_alpha_f(b1, b2, BlendFunction::Multiply, a2);
let a3 = 255;

try!(canvas.set_pixel(canvas_x, canvas_y, &Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8)));
canvas.set_pixel(
canvas_x,
canvas_y,
&Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8),
)?;
}
}

Ok(canvas)
}

pub fn normal(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32, loop_start_x:i32, loop_end_x:i32, offset_x:i32, offset_y:i32, opacity:f32) -> RasterResult<Image> {

pub fn normal(
image1: &Image,
image2: &Image,
loop_start_y: i32,
loop_end_y: i32,
loop_start_x: i32,
loop_end_x: i32,
offset_x: i32,
offset_y: i32,
opacity: f32,
) -> RasterResult<Image> {
let mut canvas = image1.clone();

for y in loop_start_y..loop_end_y {
for x in loop_start_x..loop_end_x {
let canvas_x = x + offset_x;
let canvas_y = y + offset_y;
let color1 = try!(image1.get_pixel(canvas_x, canvas_y));
let color1 = image1.get_pixel(canvas_x, canvas_y)?;
let a1 = color1.a as f32 / 255.0; // convert to 0.0 - 1.0
let r1 = color1.r as f32 * a1;
let g1 = color1.g as f32 * a1;
let b1 = color1.b as f32 * a1;

let color2 = try!(image2.get_pixel(x, y));
let color2 = image2.get_pixel(x, y)?;
let a2 = color2.a as f32 / 255.0 * opacity; // convert to 0.0 - 1.0
let r2 = color2.r as f32;
let g2 = color2.g as f32;
Expand All @@ -112,28 +144,41 @@ pub fn normal(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32,
let b3 = (a2 * b2) + ((1.0 - a2) * b1);
let a3 = 255;

try!(canvas.set_pixel(canvas_x, canvas_y, &Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8)));
canvas.set_pixel(
canvas_x,
canvas_y,
&Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8),
)?;
}
}

Ok(canvas)
}

pub fn overlay(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32, loop_start_x:i32, loop_end_x:i32, offset_x:i32, offset_y:i32, opacity:f32) -> RasterResult<Image> {

pub fn overlay(
image1: &Image,
image2: &Image,
loop_start_y: i32,
loop_end_y: i32,
loop_start_x: i32,
loop_end_x: i32,
offset_x: i32,
offset_y: i32,
opacity: f32,
) -> RasterResult<Image> {
let mut canvas = image1.clone();

for y in loop_start_y..loop_end_y {
for x in loop_start_x..loop_end_x {
let canvas_x = x + offset_x;
let canvas_y = y + offset_y;
let rgba1 = try!(image1.get_pixel(canvas_x, canvas_y));
let rgba1 = image1.get_pixel(canvas_x, canvas_y)?;
let a1 = rgba1.a as f32 / 255.0; // convert to 0.0 - 1.0
let r1 = rgba1.r as f32 * a1;
let g1 = rgba1.g as f32 * a1;
let b1 = rgba1.b as f32 * a1;

let rgba2 = try!(image2.get_pixel(x, y));
let rgba2 = image2.get_pixel(x, y)?;
let a2 = rgba2.a as f32 / 255.0 * opacity; // convert to 0.0 - 1.0
let r2 = rgba2.r as f32;
let g2 = rgba2.g as f32;
Expand All @@ -144,28 +189,41 @@ pub fn overlay(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32,
let b3 = ch_alpha_f(b1, b2, BlendFunction::Overlay, a2);
let a3 = 255;

try!(canvas.set_pixel(canvas_x, canvas_y, &Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8)));
canvas.set_pixel(
canvas_x,
canvas_y,
&Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8),
)?;
}
}

Ok(canvas)
}

pub fn screen(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32, loop_start_x:i32, loop_end_x:i32, offset_x:i32, offset_y:i32, opacity:f32) -> RasterResult<Image> {

pub fn screen(
image1: &Image,
image2: &Image,
loop_start_y: i32,
loop_end_y: i32,
loop_start_x: i32,
loop_end_x: i32,
offset_x: i32,
offset_y: i32,
opacity: f32,
) -> RasterResult<Image> {
let mut canvas = image1.clone();

for y in loop_start_y..loop_end_y {
for x in loop_start_x..loop_end_x {
let canvas_x = x + offset_x;
let canvas_y = y + offset_y;
let rgba1 = try!(image1.get_pixel(canvas_x, canvas_y));
let rgba1 = image1.get_pixel(canvas_x, canvas_y)?;
let a1 = rgba1.a as f32 / 255.0; // convert to 0.0 - 1.0
let r1 = rgba1.r as f32 * a1;
let g1 = rgba1.g as f32 * a1;
let b1 = rgba1.b as f32 * a1;

let rgba2 = try!(image2.get_pixel(x, y));
let rgba2 = image2.get_pixel(x, y)?;
let a2 = rgba2.a as f32 / 255.0 * opacity; // convert to 0.0 - 1.0
let r2 = rgba2.r as f32;
let g2 = rgba2.g as f32;
Expand All @@ -176,7 +234,11 @@ pub fn screen(image1: &Image, image2: &Image, loop_start_y:i32, loop_end_y:i32,
let b3 = ch_alpha_f(b1, b2, BlendFunction::Screen, a2);
let a3 = 255;

try!(canvas.set_pixel(canvas_x, canvas_y, &Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8)));
canvas.set_pixel(
canvas_x,
canvas_y,
&Color::rgba(r3 as u8, g3 as u8, b3 as u8, a3 as u8),
)?;
}
}

Expand All @@ -197,15 +259,15 @@ enum BlendFunction {
Difference,
Multiply,
Overlay,
Screen
Screen,
}

fn ch_alpha_f(base: f32, top: f32, f: BlendFunction, opacity: f32) -> f32 {
match f {
BlendFunction::Difference => ch_alpha( base, ch_difference( base, top ), opacity ),
BlendFunction::Multiply => ch_alpha( base, ch_multiply( base, top ), opacity ),
BlendFunction::Overlay => ch_alpha( base, ch_overlay( base, top ), opacity ),
BlendFunction::Screen => ch_alpha( base, ch_screen( base, top ), opacity )
BlendFunction::Difference => ch_alpha(base, ch_difference(base, top), opacity),
BlendFunction::Multiply => ch_alpha(base, ch_multiply(base, top), opacity),
BlendFunction::Overlay => ch_alpha(base, ch_overlay(base, top), opacity),
BlendFunction::Screen => ch_alpha(base, ch_screen(base, top), opacity),
}
}

Expand All @@ -229,6 +291,6 @@ fn ch_overlay(base: f32, top: f32) -> f32 {
}
}

fn ch_screen(base: f32, top:f32) -> f32 {
fn ch_screen(base: f32, top: f32) -> f32 {
255.0 - (((255.0 - base) * (255.0 - top)) / 255.0)
}

0 comments on commit b1bf9e7

Please sign in to comment.