diff --git a/index.html b/index.html
index 16327b9..00152bc 100644
--- a/index.html
+++ b/index.html
@@ -24,6 +24,7 @@
+
diff --git a/media/filter.color.jpg b/media/filter.color.jpg
new file mode 100644
index 0000000..eb15803
Binary files /dev/null and b/media/filter.color.jpg differ
diff --git a/scripts/modules/filter.balance.js b/scripts/modules/filter.balance.js
new file mode 100644
index 0000000..fd6e5e2
--- /dev/null
+++ b/scripts/modules/filter.balance.js
@@ -0,0 +1,46 @@
+Filter.prototype.filter_balance = function(pixels = this.pixels(),p = null)
+{
+ // / media/filter.color.jpg
+ // : balance 0.5 2.4 1.2
+
+ p[0] = parseFloat(p[0]);
+ p[1] = p[1] ? parseFloat(p[1]) : parseFloat(p[0]);
+ p[2] = p[2] ? parseFloat(p[2]) : parseFloat(p[0]);
+
+ var data = pixels.data;
+
+ // Multiply
+ if(p[0] % 1 !== 0 && p[1] % 1 !== 0 && p[2] % 1 !== 0){
+ console.log("Multi");
+ for (var i = 0; i < data.length; i += 4) {
+ data[i] = data[i] * p[0]; // red
+ data[i + 1] = data[i + 1] * p[1]; // green
+ data[i + 2] = data[i + 2] * p[2]; // blue
+
+ // Clamp
+ data[i] = data[i] < 255 ? data[i] : 255;
+ data[i + 1] = data[i + 1] < 255 ? data[i + 1] : 255;
+ data[i + 2] = data[i + 2] < 255 ? data[i + 2] : 255;
+ }
+ }
+ // Add
+ else{
+ p[0] = parseInt(p[0]);
+ p[1] = p[1] ? parseInt(p[1]) : parseInt(p[0]);
+ p[2] = p[2] ? parseInt(p[2]) : parseInt(p[0]);
+
+ for (i = 0; i < data.length; i += 4) {
+ data[i] = data[i] + p[0]; // red
+ data[i + 1] = data[i + 1] + p[1]; // green
+ data[i + 2] = data[i + 2] + p[2]; // blue
+
+ // Clamp
+ data[i] = data[i] < 255 ? data[i] : 255;
+ data[i + 1] = data[i + 1] < 255 ? data[i + 1] : 255;
+ data[i + 2] = data[i + 2] < 255 ? data[i + 2] : 255;
+ }
+ }
+
+ ronin.canvas.clear();
+ ronin.canvas.context().putImageData(pixels, 0, 0, 0, 0, pixels.width, pixels.height);
+}
\ No newline at end of file
diff --git a/scripts/modules/filter.js b/scripts/modules/filter.js
index 9625f74..e71aed3 100644
--- a/scripts/modules/filter.js
+++ b/scripts/modules/filter.js
@@ -22,6 +22,9 @@ function Filter(element)
case "eval":
this.filter_eval(this.pixels(),p);
break;
+ case "balance":
+ this.filter_balance(this.pixels(),p);
+ break;
}
}