package com.github.axet.lookup.common; /** * Range Color object. Can hold range color value. (minimum and maximum of * specified color) in the int-rgb value * * @author axet * */ public class RangeColor { public int min; public int max; public RangeColor(RangeColor range) { this.min = range.min; this.max = range.max; } /** * create range from mid * * @param mid * @param diff */ public RangeColor(int rgb, float f) { rgb &= 0x00ffffff; int diff = (int) (255 * f); int r = (rgb & 0xff0000) >> 16; int g = (rgb & 0x00ff00) >> 8; int b = (rgb & 0x0000ff) >> 0; int rm = r - diff; if (rm < 0) rm = 0; int gm = g - diff; if (gm < 0) gm = 0; int bm = b - diff; if (bm < 0) bm = 0; this.min = rm << 16 | gm << 8 | bm; int rb = r + diff; if (rb > 255) rb = 255; int gb = g + diff; if (gb > 255) gb = 255; int bb = b + diff; if (bb > 255) bb = 255; this.max = rb << 16 | gb << 8 | bb; } public RangeColor(int min, int max) { this.min = min; this.max = max; } /** * if rgb1 > rgb2 return true * * @param rgb1 * @param rgb2 * @return */ public static boolean isGr(int rgb1, int rgb2) { int r1 = rgb1 & 0xff0000; int g1 = rgb1 & 0x00ff00; int b1 = rgb1 & 0x0000ff; int r2 = rgb2 & 0xff0000; int g2 = rgb2 & 0x00ff00; int b2 = rgb2 & 0x0000ff; return (r1 > r2) || (g1 > g2) || (b1 > b2); } public boolean inRange(RangeColor r) { return inRange(r.min) || inRange(r.max); } public boolean inRange(int rgb) { int r = rgb & 0xff0000; int g = rgb & 0x00ff00; int b = rgb & 0x0000ff; int rl = min & 0xff0000; int gl = min & 0x00ff00; int bl = min & 0x0000ff; int rh = max & 0xff0000; int gh = max & 0x00ff00; int bh = max & 0x0000ff; return (r >= rl && r <= rh) && (g >= gl && g <= gh) && (b >= bl && b <= bh); } public int getDistance(int rgb) { int r1 = (rgb & 0xff0000) >> 16; int g1 = (rgb & 0x00ff00) >> 8; int b1 = (rgb & 0x0000ff) >> 0; int rl = (min & 0xff0000) >> 16; int gl = (min & 0x00ff00) >> 8; int bl = (min & 0x0000ff) >> 0; int rh = (max & 0xff0000) >> 16; int gh = (max & 0x00ff00) >> 8; int bh = (max & 0x0000ff) >> 0; if ((r1 >= rl && r1 <= rh) && (g1 >= gl && g1 <= gh) && (b1 >= bl && b1 <= bh)) return 0; int total = 0; if (r1 < rl) total = rl - r1; if (r1 > rh) total += r1 - rh; if (g1 < gl) total += gl - g1; if (g1 > gh) total += g1 - gh; if (b1 < bl) total += bl - b1; if (b1 > bh) total += b1 - bh; return total; } public void merge(RangeColor color) { merge(color.min); merge(color.max); } public void merge(int rgb) { int r1 = (rgb & 0xff0000) >> 16; int g1 = (rgb & 0x00ff00) >> 8; int b1 = (rgb & 0x0000ff) >> 0; int rl = (min & 0xff0000) >> 16; int gl = (min & 0x00ff00) >> 8; int bl = (min & 0x0000ff) >> 0; int rh = (max & 0xff0000) >> 16; int gh = (max & 0x00ff00) >> 8; int bh = (max & 0x0000ff) >> 0; rl = Math.min(rl, r1); gl = Math.min(gl, g1); bl = Math.min(bl, b1); rh = Math.max(rh, r1); gh = Math.max(gh, g1); bh = Math.max(bh, b1); min = (rl << 16) | (gl << 8) | (bl); max = (rh << 16) | (gh << 8) | (bh); } int av(int l, int h) { return l + (h - l) / 2; } public int average() { int rl = (min & 0xff0000) >> 16; int gl = (min & 0x00ff00) >> 8; int bl = (min & 0x0000ff) >> 0; int rh = (max & 0xff0000) >> 16; int gh = (max & 0x00ff00) >> 8; int bh = (max & 0x0000ff) >> 0; return (av(rl, rh) << 16) | (av(gl, gh) << 8) | (av(bl, bh)); } public void extend(int a, float f) { RangeColor cc = new RangeColor(a, f); merge(cc.min); merge(cc.max); } }