maps.nyc.gov

Source: ol/layer/colorswap.js

var nyc = nyc || {};
nyc.ol = nyc.ol || {};
nyc.ol.layer = nyc.ol.layer || {};

/**
 * @desc An event handler for ol.layer.Layer#postcompose to re-render the layer in with colors swapped
 * @public
 * @function
 * @param {ol.render.Event} event The event data from the ol.layer.Layer#postcompose event
 * @param {Array<Array<number>>} beforeColors The RGB values of the colors to replace
 * @param {Array<Array<number>>} afterColors The RGB values of the replacement colors
 * @param {number} [variance=0] The variance for considering RGB values equal
 */
nyc.ol.layer.colorswap = function(event, beforeColors, afterColors, variance) {
	var context = event.context;
	var closeEnough = function(actual, expected){
		return Math.abs(actual - expected) <= variance;
	};
	if (context){
		try{
			var canvas = context.canvas;
			var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
			var pixelArray = imageData.data;
			var length = pixelArray.length / 4; // 4 components - red, green, blue and alpha
			for (var i = 0; i < length; i++) {
			    var index = 4 * i;
			    var r = pixelArray[index];
			    var g = pixelArray[++index];
			    var b = pixelArray[++index];
			    var a = pixelArray[++index];
			    $.each(beforeColors, function(whichColor, beforeColor){
			    	if (
				    		closeEnough(r, beforeColor[0]) && 
				    		closeEnough(g, beforeColor[1]) && 
				    		closeEnough(b, beforeColor[2])
				    	) {
			    			var afterColor = afterColors[whichColor];
					    	pixelArray[--index] = afterColor[2];
					        pixelArray[--index] = afterColor[1];
					        pixelArray[--index] = afterColor[0];
					    }			    	
			    });
			    
			}
			context.putImageData(imageData, 0, 0);
		}catch (ignore){
			/* don't break if canvas has cross-origin data */
		} 
	}
};

nyc-lib: Source: ol/layer/colorswap.js

maps.nyc.gov

Source: ol/layer/colorswap.js

var nyc = nyc || {};
nyc.ol = nyc.ol || {};
nyc.ol.layer = nyc.ol.layer || {};

/**
 * @desc An event handler for ol.layer.Layer#postcompose to re-render the layer in with colors swapped
 * @public
 * @function
 * @param {ol.render.Event} event The event data from the ol.layer.Layer#postcompose event
 * @param {Array<Array<number>>} beforeColors The RGB values of the colors to replace
 * @param {Array<Array<number>>} afterColors The RGB values of the replacement colors
 * @param {number} [variance=0] The variance for considering RGB values equal
 */
nyc.ol.layer.colorswap = function(event, beforeColors, afterColors, variance) {
	var context = event.context;
	var closeEnough = function(actual, expected){
		return Math.abs(actual - expected) <= variance;
	};
	if (context){
		try{
			var canvas = context.canvas;
			var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
			var pixelArray = imageData.data;
			var length = pixelArray.length / 4; // 4 components - red, green, blue and alpha
			for (var i = 0; i < length; i++) {
			    var index = 4 * i;
			    var r = pixelArray[index];
			    var g = pixelArray[++index];
			    var b = pixelArray[++index];
			    var a = pixelArray[++index];
			    $.each(beforeColors, function(whichColor, beforeColor){
			    	if (
				    		closeEnough(r, beforeColor[0]) && 
				    		closeEnough(g, beforeColor[1]) && 
				    		closeEnough(b, beforeColor[2])
				    	) {
			    			var afterColor = afterColors[whichColor];
					    	pixelArray[--index] = afterColor[2];
					        pixelArray[--index] = afterColor[1];
					        pixelArray[--index] = afterColor[0];
					    }			    	
			    });
			    
			}
			context.putImageData(imageData, 0, 0);
		}catch (ignore){
			/* don't break if canvas has cross-origin data */
		} 
	}
};