package com.jotuntech.sketcher.common; public class Pixels { private final static int RANDOM_SIZE = 3079; private static int[] randomNumbers; private static int randomCounter; public static int random() { if(randomNumbers == null) { randomNumbers = new int[RANDOM_SIZE]; for(int i = 0; i < RANDOM_SIZE; i++) { randomNumbers[i] = (int) Math.round(Math.random() * 255f); } } randomCounter %= RANDOM_SIZE; return randomNumbers[randomCounter++]; } /* public final static int squareRoot(int a_nInput) { int op = a_nInput; int res = 0; int one = 1 << 30; // The second-to-top bit is set: use 1u << 14 for uint16_t type; use 1uL<<30 for int type // "one" starts at the highest power of four <= than the argument. while (one > op) { one >>= 2; } while (one != 0) { if (op >= res + one) { op = op - (res + one); res = res + 2 * one; } res >>= 1; one >>= 2; } // Do arithmetic rounding to nearest integer if (op > res) { res++; } return res; } */ public static int lerp(int destination, int source, int alpha) { /* mask destination */ int destinationRB = destination & 0x00FF00FF; int destinationAG = destination >>> 8 & 0x00FF00FF; /* mask source */ int sourceRB = source & 0x00FF00FF; int sourceAG = source >>> 8 & 0x00FF00FF; /* calc difference */ int deltaRB = sourceRB - destinationRB; int deltaAG = sourceAG - destinationAG; /* scale difference by alpha */ deltaRB *= alpha; deltaAG *= alpha; deltaRB >>>= 8; deltaAG >>>= 8; /* add delta to destination and mask */ int RB = (deltaRB + destinationRB) & 0x00FF00FF; int AG = (deltaAG + destinationAG) << 8 & 0xFF00FF00; return RB | AG; } public static int getChannel0(int pixel) { return pixel >>> 24; } public static int getChannel1(int pixel) { return (pixel >>> 16) & 0xFF; } public static int getChannel2(int pixel) { return (pixel >>> 8) & 0xFF; } public static int getChannel3(int pixel) { return pixel & 0xFF; } public static int stripChannel0(int pixel) { return pixel & 0xFFFFFF; } public static int pack(int c1, int c2, int c3) { return (c1 << 16) | (c2 << 8) | c3; } public static int pack(int c0, int color) { return (c0 << 24) | color; } public static int pack(int c0, int c1, int c2, int c3) { return (c0 << 24) | (c1 << 16) | (c2 << 8) | c3; } private final static float a = 0.055f; public static float gammaDecode(float v) { v /= 255f; if(v <= 0.04045d) { v /= 12.92d; } else { v = (float) Math.pow((v + a) / (1d + a), 2.4f); } return v; } public static int gammaEncode(float v) { if(v <= 0.0031308) { v *= 12.92d; } else { v = (1f + a) * (float) Math.pow(v, 1 / 2.4f) - a; } return Math.round(v * 255f); } }