toolkit/jb/shared.js (709 lines of code) (raw):

function initP5(w, h) { return function(p) { p.setup = function() { var c = p.createCanvas(w, h); c.addClass('p5-canvas'); p.noLoop(); }; p.draw = function() { p.clear(); p.background(0, 0); //drawForms(p, getForms() || []); }; } } function maybeCachedImage(p, f) { // TODO: here should be a cache return p.createImg(f.data); } var PRODUCTS = [ { label: 'JB', id: 'jetbrains', palette: [ '#9151e1', '#ec4476', '#fde74a'] }, // jetbrains-1 { label: ' ', id: 'empty0', palette: [ ] }, // separator { label: 'IJ', id: 'intellij-idea', palette: [ '#087cfa', '#fe315d', '#f97a12' ] }, // idea // IJ_ { label: 'PS', id: 'phpstorm', palette: [ '#b24eee', '#7660f4', '#fc378c' ] }, // phpstorm // PS_ { label: 'PC', id: 'pycharm', palette: [ '#21d789', '#fcf84a', '#07c3f2' ] }, // pycharm // PC_ { label: 'RM', id: 'rubymine', palette: [ '#fc2555', '#fd8638', '#8f41cd' ] }, // rubymine // RM_ { label: 'WS', id: 'webstorm', palette: [ '#22cdd6', '#2888d4', '#feee56' ] }, // webstorm // WS_ { label: 'CL', id: 'clion', palette: [ '#32d791', '#1a9edd', '#ea3a8c' ] }, // clion // CL_ { label: 'DG', id: 'datagrip', palette: [ '#32d791', '#9779f5', '#fd5fe4' ] }, // // DG_ { label: 'AC', id: 'appcode', palette: [ '#2b7fe3', '#25daee', '#30de95' ] }, // appcode // AC_ { label: 'GO', id: 'gogland', palette: [ '#078efc', '#bb4efc', '#3bea62' ] }, // gogland // GO_ { label: ' ', id: 'empty1', palette: [ ] }, // separator { label: 'R#', id: 'resharper', palette: [ '#c21456', '#e14ce3', '#fdbc2c' ] }, // resharper // R#_ { label: 'R++', id: 'resharper-cpp', palette: [ '#fdbc2c', '#e14ce3', '#c21456' ] }, // // R++_ { label: 'DC', id: 'dotcover', palette: [ '#fd7522', '#786bfb', '#e14ce3' ] }, // dotcover // DC_ { label: 'DM', id: 'dotmemory', palette: [ '#fdbc2c', '#786bfb', '#e14ce3' ] }, // // DM_ { label: 'DP', id: 'dotpeek', palette: [ '#23cbfc', '#786bfb', '#e14ce3' ] }, // // DP_ { label: 'DT', id: 'dottrace', palette: [ '#fc1681', '#786bfb', '#e14ce3' ] }, // dottrace // DT_ { label: 'RD', id: 'rider', palette: [ '#c40b55', '#e800ca', '#ffbd00' ] }, // rider // RD_ { label: ' ', id: 'empty2', palette: [ ] }, // separator { label: 'TC', id: 'teamcity', palette: [ '#22b1ef', '#9062f7', '#46e869' ] }, // teamcity // TC_ { label: 'YT', id: 'youtrack', palette: [ '#22b1ef', '#9062f7', '#fc378c' ] }, // youtrack // YT_ { label: 'UP', id: 'upsource', palette: [ '#22b1ef', '#9062f7', '#fd8224' ] }, // upsource // UP_ { label: 'HB', id: 'hub', palette: [ '#1fb9ee', '#965ff7', '#feec56' ] }, // hub // HB_ { label: ' ', id: 'empty3', palette: [ ] }, // separator { label: 'KT', id: 'kotlin', palette: [ '#1b84f2', '#24dea7', '#ed4baa' ] }, // kotlin // KT_ { label: 'MPS', id: 'mps', palette: [ '#31d68b', '#3188cd', '#f1e969' ] } // mps // MPS_ ]; function numberToHex(num) { return (num > 15) ? num.toString(16) : '0' + num.toString(16); } function toHexColor(color) { return '#' + numberToHex(color.r || 0) + numberToHex(color.g || 0) + numberToHex(color.b || 0); } function hexToColor (p, hex, opacity) { // TODO: unhex!! return p.color(p.red(p.color(hex)), p.green(p.color(hex)), p.blue(p.color(hex)), opacity); } function _rgb(r, g, b, a) { return { r: r, g: g, b: b, a: a }; } function howMuch(single, plural) { return function(list) { if (!list) return 'Nothing'; if (list.length == 0) return 'No ' + plural; if (list.length == 1) return 'One ' + single; if (list.length == 2) return 'Two ' + plural; return list.length + ' ' + plural; }; } function stopPropagation(event) { event.stopPropagation(); return event; } // ============= Sketch-specific ============= var imagesToLoad = PRODUCTS.map(function(product) { return { product: product, id: product.id + '/logo', path: 'logos/' + product.id + '-text-square.svg' }; }); imagesToLoad = imagesToLoad.concat(PRODUCTS.map(function(product) { return { product: product, id: product.id + '/bg', path: 'bg/' + product.id + '-bg.png' }; })); var readyImgCount = 0; var cachedImages = {}; var imagesErrors = {}; function loadSketchImages(p, onComplete) { showLoaderAt(0); imagesToLoad.forEach(function(imgSpec, index) { if (cachedImages[imgSpec.id] || imagesErrors[imgSpec.id]) return; var img = new Image(); //console.log('start loading image', imgSpec.id); img.onload = function() { //console.log('received', imgSpec.path); cachedImages[imgSpec.id] = img; readyImgCount++; //console.log('images ready:', readyImgCount + '/' + imagesToLoad.length); showLoaderAt(readyImgCount / imagesToLoad.length, 'Loading Images'); if (readyImgCount == imagesToLoad.length) { if (onComplete) onComplete(); hideLoader(); //console.log('finished loading images'); } }; img.onerror = function() { imagesErrors[imgSpec.id] = true; //console.log('image at ' + imgSpec.path + ' failed to load'); readyImgCount++; //console.log('images ready:', readyImgCount + '/' + imagesToLoad.length); showLoaderAt(readyImgCount / imagesToLoad.length, 'Loading Images'); if (readyImgCount == imagesToLoad.length) { if (onComplete) onComplete(); hideLoader(); //console.log('finished loading images'); } }; img.src = imgSpec.path; }); } // jb/noise var EMPTY_PIXELS = { width: 0, height: 0, values: [], step: 10, seed: -1, density: -1, time: -1 }; function makePixelExtractingSketch(className, drawContent, adaptPixels) { var refresher; function refreshSketch(inlets) { return refresher ? refresher(inlets) : EMPTY_PIXELS; } var sketchFunc = function(p) { var width = window.innerWidth; var height = window.innerHeight; var setupCalled = false; var ctx; var cvs; p.preload = function() {}; // or else it calls `preload` of the main sketch p.setup = function() { cvs = p.createCanvas(width, height).parent('rpd-jb-hidden-canvases'); //cvs.position(-5000, -5000); cvs.canvas.className = className || 'hidden-canvas'; cvs.canvas.style.display = 'none'; cvs.canvas.style.visibility = 'hidden'; // console.log(cvs); //cvs.style.display = 'none'; ctx = cvs.drawingContext; p.background(p.color(0, 0, 0, 0)); p.noLoop(); setupCalled = true; }; var lastConfig; var lastPixels; refresher = function(inlets) { if (!setupCalled) return; lastConfig = inlets; p.redraw(); return adaptPixels ? adaptPixels(lastPixels, lastConfig, p, cvs.canvas, width, height) : lastPixels; }; p.draw = function() { if (!lastConfig) return; p.clear(); //lastValues = []; drawContent(p, lastConfig, ctx, width, height); p.loadPixels(); lastPixels = p.pixels; }; }; /*var backgroundP5 =*/ new p5(sketchFunc); return refreshSketch; } // jb/noise function initNoiseSketch() { var lastSeed, lastStep; return makePixelExtractingSketch('noise-canvas', function(p, inlets, ctx, width, height) { p.noStroke(); var palette = inlets.palette; p.noiseDetail(inlets.octave, inlets.falloff); lastSeed = p.random(1000); lastStep = inlets.grain; grainRadius = inlets.radius; p.noiseSeed(lastSeed); var x, y, c, opacity, resultColor, startColor, middleColor, endColor; var noisePoints = []; var max = 0 var point; for (x = 0; x < width; x+=lastStep) { noisePoints[x] = []; for (y = 0; y < height; y+=lastStep) { point = p.noise(x * 0.005, y * 0.005); noisePoints[x][y] = point; if( point >= max) { max = point; } } } for (x = 0; x < width; x += lastStep) { for (y = 0; y < height; y += lastStep) { opacity = noisePoints[x][y] + 1 - max; startColor = hexToColor(p, palette[2], opacity * 255); middleColor = hexToColor(p, palette[1], opacity * 255); endColor = hexToColor(p, palette[0], opacity * 255); if (opacity < 0.5) { resultColor = p.lerpColor(startColor, middleColor, opacity * 2); } else { resultColor = p.lerpColor(middleColor, endColor, (opacity - 0.5) * 2 ); } //c = (x / width) * 255; if (inlets.border) { p.stroke(p.color(sketchConfig.bgcolor.r, sketchConfig.bgcolor.g, sketchConfig.bgcolor.b)); p.strokeWeight(inlets.border); } p.fill(resultColor); p.rect(x, y, lastStep, lastStep, grainRadius * lastStep ); //p.rect(width - x, y, 10, 10); //column.push(c); } //lastValues.push(column); } }, function(values, config, p, canvas, width, height) { return { width: width, height: height, values: values, canvas: canvas, time: new Date(), step: lastStep, density: p.pixelDensity(), seed: lastSeed }; }); } // jb/background function initBackgroundSketch() { return makePixelExtractingSketch( 'background-canvas', drawBackground, function(values, config, p, canvas, width, height) { return { width: width, height: height, values: values, canvas: canvas, time: new Date(), step: -1, density: p.pixelDensity(), seed: -1 }; }); } // jb/h-rorschach function initHRorschachSketch() { var lastInlets; return makePixelExtractingSketch( 'rorschach-canvas', function(p, inlets, ctx, width, height) { lastInlets = inlets; p.loadPixels(); var pixels = inlets.pixels; var d = pixels.density; var width = pixels.width; var height = pixels.height; var source = pixels.values; var target = p.pixels; var trgIdx, srcIdx; for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { for (var i = 0; i < d; i++) { for (var j = 0; j < d; j++) { trgIdx = 4 * ((y * d + j) * width * d + (x * d + i)); srcIdx = (x < width / 2) ? trgIdx : 4 * ((y * d + j) * width * d + ((width - x) * d + i)); target[trgIdx] = source[srcIdx]; target[trgIdx+1] = source[srcIdx+1]; target[trgIdx+2] = source[srcIdx+2]; target[trgIdx+3] = source[srcIdx+3]; } } } } p.updatePixels(); }, function(values, config, p, canvas, width, height) { return { width: width, height: height, values: values, canvas: canvas, time: new Date(), step: lastInlets.pixels.step, density: p.pixelDensity(), seed: lastInlets.pixels.seed }; }); } // jb/v-rorschach function initVRorschachSketch() { var lastInlets; return makePixelExtractingSketch( 'rorschach-canvas', function(p, inlets, ctx, width, height) { lastInlets = inlets; p.loadPixels(); var pixels = inlets.pixels; var d = pixels.density; var width = pixels.width; var height = pixels.height; var source = pixels.values; var target = p.pixels; var trgIdx, srcIdx; for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { for (var i = 0; i < d; i++) { for (var j = 0; j < d; j++) { trgIdx = 4 * ((y * d + j) * width * d + (x * d + i)); srcIdx = (y < height / 2) ? trgIdx : 4 * (((height - y) * d + j) * width * d + ((x * d + i))); target[trgIdx] = source[srcIdx]; target[trgIdx+1] = source[srcIdx+1]; target[trgIdx+2] = source[srcIdx+2]; target[trgIdx+3] = source[srcIdx+3]; } } } } p.updatePixels(); }, function(values, config, p, canvas, width, height) { return { width: width, height: height, values: values, canvas: canvas, time: new Date(), step: lastInlets.pixels.step, density: p.pixelDensity(), seed: lastInlets.pixels.seed }; }); } // jb/draw-pixels function drawPixels(p, config, ctx, renderOptions) { var pixels = config.pixels; var blur = config.blur; var contrast = Math.floor((config.contrast || 0) * 255); var opacity = renderOptions.opacity; if (!pixels) return; p.push(); if (opacity) ctx.globalAlpha = opacity; ctx.drawImage(pixels.canvas, 0, 0, pixels.width, pixels.height); p.loadPixels(); var src = p.pixels; // pixels.values var trg = p.pixels; // console.log('copying', src.length, 'pixels to', pixels.length, 'pixels'); for (var i = 0; i < src.length; i += 4) { trg[i] = src[i] - contrast ; trg[i+1] = src[i+1] - contrast ; trg[i+2] = src[i+2] - contrast; trg[i+3] = src[i+3]/* * opacity */; //trg[i] = src[i]; } p.updatePixels(); if (blur) { p.filter(p.BLUR, blur); } p.pop(); } // jb/collect-point-data function collectPointData(pixels, config) { var srcPixels = pixels.values; if (!srcPixels || !srcPixels.length) return []; var step = Math.floor(config.step || pixels.step); if (!step) return []; var chaos = config.chaos / 100; var d = pixels.density; var srcWidth = pixels.width; var srcHeight = pixels.height; var low = config.low; var high = config.high; var dsrcWidth = srcWidth * d; var dsrcHeight = srcHeight * d; var maxPoints = dsrcWidth * dsrcHeight * 4; /* console.log('collectPointData', dsrcWidth, 'x', dsrcHeight, 'pixels length', srcPixels.length, 'expected length', maxPoints); */ var idx, pxBrightness, r, g, b, a; var lastPoint; var pointData = []; var xpos, ypos; for (var x = 0; x < srcWidth; x += step) { for (var y = 0; y < srcHeight; y += step) { // console.log('y', y, pointData.length >= maxPoints); pxBrightness = pixelBrightnessByCoords(x, y, srcPixels, srcWidth, d); if ((pxBrightness > low) && (random(0, pxBrightness) < high)) { xpos = x + random(-step / 2, step / 2) * chaos; ypos = y + random(-step / 2, step / 2) * chaos; pointData.push([ xpos, ypos, pxBrightness ]); if (pointData.length >= maxPoints) break; } } } return pointData; } // jb/apply-gradient function applyGradient(p, config, ctx) { var palette = config.palette; if (!palette) return; var width = config.width || window.innerWidth; var height = config.height || window.innerHeight; //Main gradient // --> p.blendMode(p.OVERLAY); // p.blendMode(p.NORMAL); if (ctx) { //var gradient = ctx.createLinearGradient(startGrad1.x, startGrad1.y, endGrad1.x, endGrad1.y); // gradient.addColorStop(0, palette[0]); // gradient.addColorStop(1, palette[2]); var gradient = ctx.createLinearGradient(0, 0, width, height); gradient.addColorStop(0.1, palette[2]); gradient.addColorStop(0.5, palette[1]); gradient.addColorStop(0.9, palette[0]); ctx.fillStyle = gradient; ctx.fillRect(0, 0, width, height); } // --> p.blendMode(p.BLEND); } // jb/draw-logo function putLogoAt(ctx, image, x, y) { ctx.drawImage(image, x - 870 / 2, y - 55, 870, 110); } function drawLogo(p, logo, ctx) { if (!logo || !logo.product) return; var productId = logo.product; // --> p.blendMode(p.NORMAL); if (cachedImages[productId + '/logo'] && ctx) { putLogoAt(ctx, cachedImages[productId + '/logo'] , logo.x * width, logo.y * height); } } // jb/edges-joints function drawEdgesJoints(p, config) { var voronoi = config.voronoi; var radius = config.jointRadius; var border = config.jointBorder; var srcPixels = config.pixels.values; var srcWidth = config.pixels.width || window.innerWidth; var srcHeight = config.pixels.height || window.innerHeight; var d = config.pixels.density; var dsrcWidth = srcWidth * d; var dsrcHeight = srcHeight * d; var palette = config.palette; var s = config.jointSize; p.rectMode(p.CENTER); var myEdges = voronoi.edges; //myDelaunay.getEdges(); var squares = []; for (var n = 0; n < myEdges.length; n++) { if (!myEdges[n]) continue; var startX = myEdges[n][0][0]; var startY = myEdges[n][0][1]; var endX = myEdges[n][1][0]; var endY = myEdges[n][1][1]; var pxBrightnessStart = Math.floor(pixelBrightnessByCoords(startX, startY, srcPixels, srcWidth, d)); var pxBrightnessEnd = Math.floor(pixelBrightnessByCoords(endX, endY, srcPixels, srcWidth, d)); if (!pxBrightnessEnd) { pxBrightnessEnd = 0 } ; if (!pxBrightnessStart) { pxBrightnessStart = 0 } ; // if (pxBrightnessStart & pxBrightnessEnd) { // if(pxBrightnessStart > 80) {console.log(pxBrightnessStart) }; // var randomStartSeed = Math.floor(p.random(3)); // var randomEndSeed = Math.floor(p.random(3)); // var randomEndSeed = randomStartSeed; /* while( randomEndSeed != randomStartSeed ) { randomEndSeed = Math.floor(p.random(3)); } */ var randomStartColor = p.random(palette); var randomEndColor = p.random(palette); /* while (randomStartColor == randomEndColor) { randomEndColor = p.random(palette); } */ var brightnessStart = p.map(pxBrightnessStart, 40, 100, 0, 1); var brightnessEnd = p.map(pxBrightnessEnd, 40, 100, 0, 1); //var colorStart = p.lerpColor(hexToColor (p, randomStartColor, 200), hexToColor (p, randomStartColor, 255), brightnessStart); //var colorEnd = p.lerpColor(hexToColor (p, randomEndColor, 200), hexToColor (p, randomEndColor, 255), brightnessEnd); //var colorStart = p.lerpColor(p.color(255, 100), p.color(255, 255), brightnessStart); //var colorEnd = p.lerpColor(p.color(255, 100), p.color(255, 255), brightnessEnd); var colorStart = p.lerpColor(hexToColor(p, randomStartColor, 100), hexToColor(p, randomStartColor, 255), brightnessStart); var colorEnd = p.lerpColor(hexToColor(p, randomEndColor, 100), hexToColor(p, randomEndColor, 255), brightnessEnd); p.strokeWeight(1); p.stroke(255); // --> p.blendMode(p.SCREEN); gradientLine(startX, startY, endX, endY, colorStart, colorEnd); // line(startX, startY, endX, endY); squares[n] = { x: startX, y: startY, size: Math.floor(p.map(pxBrightnessStart, 40, 100, 1, s)), //color: /*p.color(p.random(0, 255), p.random(0, 255), p.random(0, 255))*/ p.lerpColor(hexToColor (p, randomStartColor, 100), hexToColor (p, randomStartColor, 255),/*colorStart , p.color(255, 255), */ p.random(0, 1)) color: (Math.random() < 0.5) ? colorStart : colorEnd }; } var square, sqSize; for (var n = 0; n < myEdges.length; n++) { if (!myEdges[n]) continue; square = squares[n]; sqSize = square.size; p.fill(p.red(square.color), p.green(square.color), p.blue(square.color), 255); p.noStroke(); if (sqSize > 0) { p.ellipse(square.x, square.y, sqSize/3, sqSize/3); p.stroke(24); p.strokeWeight(border); p.rect(square.x, square.y, sqSize, sqSize, sqSize * radius); } } // } } // jb/curved-edges function drawCurvedEdges(p, config) { var voronoi = config.voronoi; var palette = config.palette; var near = config.near; var far = config.far; var curve = config.curve; var density = config.density; var myEdges = voronoi.edges; var startX, startY, endX, endY; var randomEdge, randomX, randomY, myDist; for (var n = 0; n < myEdges.length; n++) { if (!myEdges[n]) continue; startX = myEdges[n][0][0]; startY = myEdges[n][0][1]; endX = myEdges[n][1][0]; endY = myEdges[n][1][1]; randomEdge = Math.floor(p.random(0, myEdges.length)); if (!myEdges[randomEdge]) continue; randomX = myEdges[randomEdge][0][0]; randomY = myEdges[randomEdge][0][1]; myDist = p.dist(startX, startY, randomX, randomY); if (p.random(0, 1) < density && (myDist < near * 1000) && (myDist > far * 1000)) { p.noFill(); p.stroke(p.color(hexToColor(p, p.random(palette),p.random(100, 255)))); p.strokeWeight(0.3); // --> p.blendMode(p.OVERLAY); p.bezier( startX, startY, startX, startY + curve * 1000, //TODO: make beautiful curves in future randomX, randomY - curve * 1000, randomX, randomY ); // --> p.blendMode(p.BLEND); } } } // jb/shapes function drawShapes(p, config) { // return; var voronoi = config.voronoi; var width = window.innerWidth; var height = window.innerHeight; var polygons = voronoi.polygons(); var cells = voronoi.cells; var palette = config.palette; p.smooth(); p.noStroke(); //p.blendMode(p.SCREEN); var shapes = []; var s = 0; var minX, minY, maxX, maxY; var area; var coords; var l, site; // p.noiseDetail(1, 1); for (var j = 0; j < polygons.length; j++) { //if (!polygons[j]) continue; coords = polygons[j]; minX = Infinity, minY = Infinity; maxX = 0, maxY = 0; for (l = 0; l < coords.length; l++) { minX = Math.min(maxX, coords[l][0]); minY = Math.min(minY, coords[l][1]); maxX = Math.max(maxX, coords[l][0]); maxY = Math.max(maxY, coords[l][1]); } site = cells[j].site; area = (maxX - minX) * (maxY - minY); var qty = p.map(config.qty, 0, 1, 0, 5000); if (area < qty) { shapes.push({ coords: coords, value: p.noise(site[0] / width, site[1] / height) }); s++; } } var value, colorValue; var startColor, middleColor, endColor, resultColor; for (j = 0; j < shapes.length; j++) { if (!shapes[j]) continue; value = shapes[j].value; // startColor = hexToColor(p, palette[0], value * 255); // middleColor = hexToColor(p, palette[1], value * 255); // endColor = hexToColor(p, palette[2], value * 255); // colorValue = value * 0.6; // if (colorValue < 0.5) { // resultColor = p.lerpColor(startColor, middleColor, colorValue ); // } else { // resultColor = p.lerpColor(middleColor, endColor, (colorValue - 0.5) ); // } //console.log(/*value, palette.length, value * palette.length, */colorIdx); p.fill(hexToColor(p, p.random(palette), value * 255)); //p.fill(255, value * 255); // p.fill(resultColor); //p.fill(p.color('#ff0000')); p.beginShape(); coords = shapes[j].coords; for (var l = 0; l < coords.length; l++) { p.vertex(coords[l][0], coords[l][1]); } p.endShape(p.CLOSE); } } // jb/back-edges-squares function drawBackEdgesSquares(p, config) { var data = config.points; var palette = config.palette; var range = config.range; p.rectMode(p.CENTER); p.noStroke(); var point; for (var i = 0; i < data.length; i++) { point = data[i]; p.fill(hexToColor(p, p.random(palette), 255)); p.rect(point[0], point[1], 2, 2); } p.strokeWeight(0.25); // --> p.blendMode(p.OVERLAY); for (var i = 0; i < data.length; i++) { p.stroke(hexToColor(p, p.random(palette), Math.floor(p.random(100,255)))); for (var j = 0; j < data.length; j++) { var point1 = data[i]; var point2 = data[j]; if (p.dist(point1[0], point1[1], point2[0], point2[1]) < range) { p.line(point1[0], point1[1], point2[0], point2[1]); } } } } var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // jb/dark-gradients function drawDarkGradients(p, config) { if (isSafari) return; // FIXME var width = config.width || window.innerWidth; var height = config.height || window.innerHeight; var iris = config.iris || 0; var pupilOpacity = config.pupilOpacity || 0; var pupilColor = config.pupilColor || { r: 0, g: 0, b: 0 }; if (ctx) { //p.blendMode(p.OVERLAY); //if (isSafari && ctx.globalCompositeOperation == 'overlay') { //p.blendMode(p.NORMAL); //} var gradient = ctx.createRadialGradient(width/2, height/2, 4.5 * iris, width/2, height/2, width/2 * iris / 100); //gradient.addColorStop(0, p.color(pupilColor.r, pupilColor.g, pupilColor.b, pupilOpacity)); gradient.addColorStop(0, 'rgba(' + pupilColor.r + ',' + pupilColor.g + ',' + pupilColor.b + ',' + pupilOpacity + ')'); //gradient.addColorStop(0, 'green'); //gradient.addColorStop(1, p.color(0)); gradient.addColorStop(1, 'rgba(0, 0, 0, 1)'); //gradient.addColorStop(1, 'white'); ctx.fillStyle = gradient; ctx.fillRect(0, 0, width, height); //if (isSafari) return; //if (!isSafari) { p.blendMode(p.MULTIPLY); //} var gradient = ctx.createRadialGradient(width/2, height/2, 2 * iris, width/2, height/2, 0.7 * width * iris / 100); //gradient.addColorStop(0, p.color(pupilColor.r, pupilColor.g, pupilColor.b, pupilOpacity)); gradient.addColorStop(0, 'rgba(' + pupilColor.r + ',' + pupilColor.g + ',' + pupilColor.b + ',' + pupilOpacity + ')'); //gradient.addColorStop(0, 'green'); //gradient.addColorStop(1, p.color(24, 24, 24)); gradient.addColorStop(1, 'rgba(24, 24, 24, 1)'); //gradient.addColorStop(1, 'white'); ctx.fillStyle = gradient; ctx.fillRect(0, 0, width, height); //p.blendMode(p.NORMAL); } } // jb/background function drawBackground(p, config, ctx) { var productId = config.product; if (!productId) return; var width = config.width; var height = config.height; //p.blendMode(p.NORMAL); if (cachedImages[productId + '/bg'] && ctx && productId!='empty0') { ctx.save(); ctx.rotate(config.angle); ctx.scale(config.scale, config.scale); ctx.drawImage(cachedImages[productId + '/bg'], config.x || 0, config.y || 0, width, height); ctx.restore(); //putLogoAt(ctx, , logo.x * width, logo.y * height); } } // jb/image function initCustomBackgroundSketch() { return makePixelExtractingSketch( 'custom-background-canvas', drawCustomBackground, function(values, config, p, canvas, width, height) { return { width: width, height: height, values: values, canvas: canvas, time: new Date(), step: -1, density: p.pixelDensity(), seed: -1 }; }); } function drawCustomBackground(p, config, ctx) { var file = config.file; if (!file) return; p.image(maybeCachedImage(p, file), 0, 0, window.innerWidth, window.innerHeight); p.filter(GRAY); p.filter(INVERT); //ctx.drawImage(file, 0, 0, file.width, file.height, 0, 0, window.innerWidth, window.innerHeight); } function pixelBrightnessByCoords(x, y, srcPixels, width, pxDensity) { //var idx = (Math.floor(x) + Math.floor(y) * width) * 4 * pxDensity; var idx = 4 * ((Math.floor(y) * pxDensity) * width * pxDensity + (Math.floor(x) * pxDensity)); var r = srcPixels[idx]; var g = srcPixels[idx + 1]; var b = srcPixels[idx + 2]; var a = srcPixels[idx + 3]; return brightness(color(r, g, b, a)); }