/*
* Copyright (C) 2014 Clark Scheff
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.scheffsblend.iconfilters;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import java.util.ArrayList;
import java.util.List;
public class ColorFilterUtils {
/**
* See the following links for reference
* http://groups.google.com/group/android-developers/browse_thread/thread/9e215c83c3819953
* http://gskinner.com/blog/archives/2007/12/colormatrix_cla.html
* @param value
*/
public static ColorMatrix adjustHue(float value) {
ColorMatrix cm = new ColorMatrix();
value = value / 180 * (float) Math.PI;
if (value != 0) {
float cosVal = (float) Math.cos(value);
float sinVal = (float) Math.sin(value);
float lumR = 0.213f;
float lumG = 0.715f;
float lumB = 0.072f;
float[] mat = new float[]{
lumR + cosVal * (1 - lumR) + sinVal * (-lumR),
lumG + cosVal * (-lumG) + sinVal * (-lumG),
lumB + cosVal * (-lumB) + sinVal * (1 - lumB), 0, 0,
lumR + cosVal * (-lumR) + sinVal * (0.143f),
lumG + cosVal * (1 - lumG) + sinVal * (0.140f),
lumB + cosVal * (-lumB) + sinVal * (-0.283f), 0, 0,
lumR + cosVal * (-lumR) + sinVal * (-(1 - lumR)),
lumG + cosVal * (-lumG) + sinVal * (lumG),
lumB + cosVal * (1 - lumB) + sinVal * (lumB), 0, 0,
0, 0, 0, 1, 0,
0, 0, 0, 0, 1};
cm.set(mat);
}
return cm;
}
public static ColorMatrix adjustSaturation(float saturation) {
saturation = saturation / 100;
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(saturation);
return cm;
}
public static ColorMatrix invertColors() {
float[] matrix = {
-1, 0, 0, 0, 255, //red
0, -1, 0, 0, 255, //green
0, 0, -1, 0, 255, //blue
0, 0, 0, 1, 0 //alpha
};
return new ColorMatrix(matrix);
}
public static ColorMatrix adjustBrightness(float brightness) {
brightness = brightness / 100;
ColorMatrix cm = new ColorMatrix();
cm.setScale(brightness, brightness, brightness, 1);
return cm;
}
public static ColorMatrix adjustContrast(float contrast) {
contrast = contrast / 100 + 1;
float o = (-0.5f * contrast + 0.5f) * 255;
float[] matrix = {
contrast, 0, 0, 0, o, //red
0, contrast, 0, 0, o, //green
0, 0, contrast, 0, o, //blue
0, 0, 0, 1, 0 //alpha
};
return new ColorMatrix(matrix);
}
public static ColorMatrix adjustAlpha(float alpha) {
alpha = alpha / 100;
ColorMatrix cm = new ColorMatrix();
cm.setScale(1, 1, 1, alpha);
return cm;
}
public static ColorMatrix applyTint(int color) {
float alpha = Color.alpha(color) / 255f;
float red = Color.red(color) * alpha;
float green = Color.green(color) * alpha;
float blue = Color.blue(color) * alpha;
float[] matrix = {
1, 0, 0, 0, red, //red
0, 1, 0, 0, green, //green
0, 0, 1, 0, blue, //blue
0, 0, 0, 1, 0 //alpha
};
return new ColorMatrix(matrix);
}
public static class Builder {
private List<ColorMatrix> mMatrixList;
public Builder() {
mMatrixList = new ArrayList<ColorMatrix>();
}
public Builder hue(float value) {
mMatrixList.add(adjustHue(value));
return this;
}
public Builder saturate(float saturation) {
mMatrixList.add(adjustSaturation(saturation));
return this;
}
public Builder brightness(float brightness) {
mMatrixList.add(adjustBrightness(brightness));
return this;
}
public Builder contrast(float contrast) {
mMatrixList.add(adjustContrast(contrast));
return this;
}
public Builder alpha(float alpha) {
mMatrixList.add(adjustAlpha(alpha));
return this;
}
public Builder invertColors() {
mMatrixList.add(ColorFilterUtils.invertColors());
return this;
}
public Builder tint(int color) {
mMatrixList.add(applyTint(color));
return this;
}
public ColorMatrix build() {
if (mMatrixList == null || mMatrixList.size() == 0) return null;
ColorMatrix colorMatrix = new ColorMatrix();
for (ColorMatrix cm : mMatrixList) {
colorMatrix.postConcat(cm);
}
return colorMatrix;
}
}
}