/*
* Copyright © 2003 Maxim Stepin (maxst@hiend3d.com)
*
* Copyright © 2010 Cameron Zemek (grom@zeminvaders.net)
*
* Copyright © 2011 Tamme Schichler (tamme.schichler@googlemail.com)
* Copyright © 2012 A. Eduardo García (arcnorj@gmail.com)
*
* This file is part of hqx-java.
*
* hqx-java is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* hqx-java is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with hqx-java. If not, see <http://www.gnu.org/licenses/>.
*/
package com.opendoorlogistics.codefromweb.hqx;
/**
* Helper class to interpolate colors. Nothing to see here, move along...
*/
final class Interpolation {
private static final int Mask4 = 0xFF000000;
private static final int Mask2 = 0x0000FF00;
private static final int Mask13 = 0x00FF00FF;
// return statements:
// 1. line: green
// 2. line: red and blue
// 3. line: alpha
static final int Mix3To1(final int c1, final int c2) {
//return (c1*3+c2) >> 2;
if (c1 == c2) {
return c1;
}
return ((((c1 & Mask2) * 3 + (c2 & Mask2)) >> 2) & Mask2) |
((((c1 & Mask13) * 3 + (c2 & Mask13)) >> 2) & Mask13) |
((((c1 & Mask4) >> 2) * 3 + ((c2 & Mask4) >> 2)) & Mask4);
}
static final int Mix2To1To1(final int c1, final int c2, final int c3) {
//return (c1*2+c2+c3) >> 2;
return ((((c1 & Mask2) * 2 + (c2 & Mask2) + (c3 & Mask2)) >> 2) & Mask2) |
((((c1 & Mask13) * 2 + (c2 & Mask13) + (c3 & Mask13)) >> 2) & Mask13) |
((((c1 & Mask4) >> 2) * 2 + ((c2 & Mask4) >> 2) + ((c3 & Mask4) >> 2)) & Mask4);
}
static final int Mix7To1(final int c1, final int c2) {
//return (c1*7+c2)/8;
if (c1 == c2) {
return c1;
}
return ((((c1 & Mask2) * 7 + (c2 & Mask2)) >> 3) & Mask2) |
((((c1 & Mask13) * 7 + (c2 & Mask13)) >> 3) & Mask13) |
((((c1 & Mask4) >> 3) * 7 + ((c2 & Mask4) >> 3)) & Mask4);
}
static final int Mix2To7To7(final int c1, final int c2, final int c3) {
//return (c1*2+(c2+c3)*7)/16;
return ((((c1 & Mask2) * 2 + (c2 & Mask2) * 7 + (c3 & Mask2) * 7) >> 4) & Mask2) |
((((c1 & Mask13) * 2 + (c2 & Mask13) * 7 + (c3 & Mask13) * 7) >> 4) & Mask13) |
((((c1 & Mask4) >> 4) * 2 + ((c2 & Mask4) >> 4) * 7 + ((c3 & Mask4) >> 4) * 7) & Mask4);
}
static final int MixEven(final int c1, final int c2) {
//return (c1+c2) >> 1;
if (c1 == c2) {
return c1;
}
return ((((c1 & Mask2) + (c2 & Mask2)) >> 1) & Mask2) |
((((c1 & Mask13) + (c2 & Mask13)) >> 1) & Mask13) |
((((c1 & Mask4) >> 1) + ((c2 & Mask4) >> 1)) & Mask4);
}
static final int Mix4To2To1(final int c1, final int c2, final int c3) {
//return (c1*5+c2*2+c3)/8;
return ((((c1 & Mask2) * 5 + (c2 & Mask2) * 2 + (c3 & Mask2)) >> 3) & Mask2) |
((((c1 & Mask13) * 5 + (c2 & Mask13) * 2 + (c3 & Mask13)) >> 3) & Mask13) |
((((c1 & Mask4) >> 3) * 5 + ((c2 & Mask4) >> 3) * 2 + ((c3 & Mask4) >> 3)) & Mask4);
}
static final int Mix6To1To1(final int c1, final int c2, final int c3) {
//return (c1*6+c2+c3)/8;
return ((((c1 & Mask2) * 6 + (c2 & Mask2) + (c3 & Mask2)) >> 3) & Mask2) |
((((c1 & Mask13) * 6 + (c2 & Mask13) + (c3 & Mask13)) >> 3) & Mask13) |
((((c1 & Mask4) >> 3) * 6 + ((c2 & Mask4) >> 3) + ((c3 & Mask4) >> 3)) & Mask4);
}
static final int Mix5To3(final int c1, final int c2) {
//return (c1*5+c2*3)/8;
if (c1 == c2) {
return c1;
}
return ((((c1 & Mask2) * 5 + (c2 & Mask2) * 3) >> 3) & Mask2) |
((((c1 & Mask13) * 5 + (c2 & Mask13) * 3) >> 3) & Mask13) |
((((c1 & Mask4) >> 3) * 5 + ((c2 & Mask4) >> 3) * 3) & Mask4);
}
static final int Mix2To3To3(final int c1, final int c2, final int c3) {
//return (c1*2+(c2+c3)*3)/8;
return ((((c1 & Mask2) * 2 + (c2 & Mask2) * 3 + (c3 & Mask2) * 3) >> 3) & Mask2) |
((((c1 & Mask13) * 2 + (c2 & Mask13) * 3 + (c3 & Mask13) * 3) >> 3) & Mask13) |
((((c1 & Mask4) >> 3) * 2 + ((c2 & Mask4) >> 3) * 3 + ((c3 & Mask4) >> 3) * 3) & Mask4);
}
static final int Mix14To1To1(final int c1, final int c2, final int c3) {
//return (c1*14+c2+c3)/16;
return ((((c1 & Mask2) * 14 + (c2 & Mask2) + (c3 & Mask2)) >> 4) & Mask2) |
((((c1 & Mask13) * 14 + (c2 & Mask13) + (c3 & Mask13)) >> 4) & Mask13) |
((((c1 & Mask4) >> 4) * 14 + ((c2 & Mask4) >> 4) + ((c3 & Mask4) >> 4)) & Mask4);
}
}