UNPKG

scichart

Version:

Fast WebGL JavaScript Charting Library and Framework

130 lines (129 loc) 5.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.applyOpacityToHtmlColor = exports.uintArgbColorIsTransparent = exports.uintArgbColorOverrideOpacity = exports.uintArgbColorMultiplyOpacity = exports.uintArgbColorToAbgr = exports.linearColorMapLerp = exports.uintArgbColorLerp = exports.uintArgbColorLerp24bit = void 0; var TLinearColorMap_1 = require("../types/TLinearColorMap"); var parseColor_1 = require("./parseColor"); /** * Linearly interpolates between two colors based on the ratio passed in. E.g. Ratio = 0.0f returns From color, * ratio = 1.0f returns To Color. Ratio = 0.5f returns a mix of the two. * Works only for numbers not more than 24 bit * @param from the start color, for example 0xff0000 * @param to the end color, for example 0x00ff00 * @param ratio the value between 0 and 1 * @constructor */ function uintArgbColorLerp24bit(from, to, ratio) { var mask1 = 0x00ff00ff; var mask2 = 0xff00ff00; var f2 = 256 * ratio; var f1 = 256 - f2; return (((((from & mask1) * f1 + (to & mask1) * f2) >> 8) & mask1) | ((((from & mask2) * f1 + (to & mask2) * f2) >> 8) & mask2)); } exports.uintArgbColorLerp24bit = uintArgbColorLerp24bit; /** * Linearly interpolates between two colors based on the ratio passed in. E.g. Ratio = 0.0f returns From color, * ratio = 1.0f returns To Color. Ratio = 0.5f returns a mix of the two * Works for 32 bit colors * @param from the start color, for example 0x0000ffff (format ARGB) * @param to the end color, for example 0xffffffff * @param ratio the value between 0 and 1 * @constructor */ function uintArgbColorLerp(from, to, ratio) { // We use >>> because in js all bitwise operations are 32 bit // https://stackoverflow.com/questions/6798111/bitwise-operations-on-32-bit-unsigned-ints var from1half = from >>> 16; var from2half = (from & 0x0000ffff) >>> 0; var to1half = to >>> 16; var to2half = (to & 0x0000ffff) >>> 0; var result1half = uintArgbColorLerp24bit(from1half, to1half, ratio); var result2half = uintArgbColorLerp24bit(from2half, to2half, ratio); return ((result1half << 16) >>> 0) + result2half; } exports.uintArgbColorLerp = uintArgbColorLerp; /** * Linearly interpolates a data-value in a TLinearColorMap, which specifies Gradient Stops, Data Minimum * and Maximum and color stepping mode * @param colorMap * @param dataValue * @constructor */ function linearColorMapLerp(colorMap, dataValue) { // Value is outside of range, return Minimum color if (dataValue < colorMap.Minimum) { return (0, parseColor_1.parseColorToUIntArgb)(colorMap.GradientStops[0].color); } // Scale the value from 0.0 -> 1.0 var scaleFactor = 1 / (colorMap.Maximum - colorMap.Minimum); var scaledValue = (dataValue - colorMap.Minimum) * scaleFactor; var stops = colorMap.GradientStops; // Calculate scale factors for gradient stops var stopScaleFactors = []; var i; for (i = 1; i < stops.length; i++) { stopScaleFactors.push(1 / (stops[i].offset - stops[i - 1].offset)); } for (i = 0; i < stops.length - 1; i++) { var stop_1 = stops[i]; var nextStop = stops[i + 1]; // If between two stops if (scaledValue >= stop_1.offset && scaledValue < nextStop.offset) { // Simple step? Just return the current stop color if (colorMap.Mode === TLinearColorMap_1.EColorMapMode.Stepped) { return (0, parseColor_1.parseColorToUIntArgb)(stop_1.color); } // Compute the ratio to interpolate between two stops var localRatio = (scaledValue - stop_1.offset) * stopScaleFactors[i]; return uintArgbColorLerp((0, parseColor_1.parseColorToUIntArgb)(stop_1.color), (0, parseColor_1.parseColorToUIntArgb)(nextStop.color), localRatio); } } return (0, parseColor_1.parseColorToUIntArgb)(colorMap.GradientStops[i].color); } exports.linearColorMapLerp = linearColorMapLerp; function uintArgbColorToAbgr(argbColor) { var r = (argbColor & 0x00ff0000) >> 16; var g = (argbColor & 0x0000ff00) >> 8; var b = argbColor & 0x000000ff; var retval = argbColor - (argbColor & 0x00ffffff); retval += b << 16; retval += g << 8; retval += r; return retval; } exports.uintArgbColorToAbgr = uintArgbColorToAbgr; function uintArgbColorMultiplyOpacity(argbColor, opacity) { var alpha = argbColor - (argbColor & 0x00ffffff); alpha = alpha >>> 24; alpha *= opacity; alpha = Math.floor(alpha); alpha = alpha * 0x1000000; // ( 24 bitwise right shift simply doesn't work, as it generates a negative values ) var rgb = argbColor & 0x00ffffff; // RGB return alpha + rgb; } exports.uintArgbColorMultiplyOpacity = uintArgbColorMultiplyOpacity; function uintArgbColorOverrideOpacity(argbColor, opacity) { var alpha = opacity * 255; alpha = Math.floor(alpha); alpha = alpha * 0x1000000; // ( 24 bitwise right shift simply doesn't work, as it generates a negative values ) var rgb = argbColor & 0x00ffffff; // RGB return alpha + rgb; } exports.uintArgbColorOverrideOpacity = uintArgbColorOverrideOpacity; function uintArgbColorIsTransparent(argbColor) { var alpha = argbColor - (argbColor & 0x00ffffff); return alpha !== 0xff000000; } exports.uintArgbColorIsTransparent = uintArgbColorIsTransparent; /** * Applies the given opacity to an html color code or name, returning an html color code. * @param color * @param opacity * @returns */ function applyOpacityToHtmlColor(color, opacity) { var tarbg = (0, parseColor_1.parseColorToTArgb)(color); tarbg.opacity = Math.floor(opacity * 256); return (0, parseColor_1.parseTArgbToHtmlColor)(tarbg); } exports.applyOpacityToHtmlColor = applyOpacityToHtmlColor;