|
1 | 1 | # Gradient |
2 | | -Class to create linear, radial, elliptical and conic gradients as bitmaps, even without canvas |
| 2 | + |
| 3 | +Class to create **linear, radial, elliptical and conic gradients** as bitmaps, even without canvas |
| 4 | + |
| 5 | +**version 1.0.0** (9 kB minified) |
| 6 | + |
| 7 | +Example: |
| 8 | + |
| 9 | +```javascript |
| 10 | +const w = 200, h = 200; |
| 11 | + |
| 12 | +function addColorStops(gradient) |
| 13 | +{ |
| 14 | + const colors = ['red', 'yellow', 'green', 'blue']; |
| 15 | + const stops = [0.0, 0.33, 0.66, 1.0]; |
| 16 | + stops.forEach((s, i) => { |
| 17 | + gradient.addColorStop(s, colors[i]); |
| 18 | + }); |
| 19 | + return gradient; |
| 20 | +} |
| 21 | +function applyGradient(gradient1, canvas1, gradient2, canvas2) |
| 22 | +{ |
| 23 | + addColorStops(gradient1); |
| 24 | + addColorStops(gradient2); |
| 25 | + const ctx1 = canvas1.getContext("2d"); |
| 26 | + ctx1.fillStyle = gradient1; |
| 27 | + ctx1.fillRect(0, 0, w, h); |
| 28 | + const ctx2 = canvas2.getContext("2d"); |
| 29 | + const imData = ctx2.createImageData(w, h); |
| 30 | + imData.data.set(gradient2.getBitmap(w, h)); |
| 31 | + ctx2.putImageData(imData, 0, 0); |
| 32 | +} |
| 33 | +function drawLinearGradient(x1, y1, x2, y2) |
| 34 | +{ |
| 35 | + const canvas1 = document.getElementById('linear1'); |
| 36 | + const canvas2 = document.getElementById('linear2'); |
| 37 | + applyGradient( |
| 38 | + canvas1.getContext("2d").createLinearGradient(x1, y1, x2, y2), |
| 39 | + canvas1, |
| 40 | + Gradient.createLinearGradient(x1, y1, x2, y2), |
| 41 | + canvas2 |
| 42 | + ); |
| 43 | +} |
| 44 | +function drawRadialGradient(x1, y1, r1, x2, y2, r2) |
| 45 | +{ |
| 46 | + const canvas1 = document.getElementById('radial1'); |
| 47 | + const canvas2 = document.getElementById('radial2'); |
| 48 | + applyGradient( |
| 49 | + canvas1.getContext("2d").createRadialGradient(x1, y1, r1, x2, y2, r2), |
| 50 | + canvas1, |
| 51 | + Gradient.createRadialGradient(x1, y1, r1, x2, y2, r2), |
| 52 | + canvas2 |
| 53 | + ); |
| 54 | +} |
| 55 | +function drawEllipticGradient(cx, cy, rx, ry, angle) |
| 56 | +{ |
| 57 | + const canvas1 = document.getElementById('elliptic1'); |
| 58 | + const canvas2 = document.getElementById('elliptic2'); |
| 59 | + const ctx = canvas1.getContext("2d"); |
| 60 | + const r = Math.max(rx, ry), sx = rx/r, sy = ry/r; |
| 61 | + applyGradient( |
| 62 | + canvas1.getContext("2d").createRadialGradient(cx/sx, cy/sy, 0, cx/sx, cy/sy, r), |
| 63 | + canvas1, |
| 64 | + Gradient.createEllipticGradient(cx, cy, rx, ry, /*angle*/0), |
| 65 | + canvas2 |
| 66 | + ); |
| 67 | + ctx.scale(sx, sy); |
| 68 | + /*ctx.translate(-cx/sx, -cy/sy); |
| 69 | + ctx.rotate(angle); |
| 70 | + ctx.translate(cx/sx, cy/sy);*/ |
| 71 | + ctx.fillRect(0, 0, w/sx, h/sy); |
| 72 | +} |
| 73 | +function drawConicGradient(angle, cx, cy) |
| 74 | +{ |
| 75 | + const canvas1 = document.getElementById('conic1'); |
| 76 | + const canvas2 = document.getElementById('conic2'); |
| 77 | + applyGradient( |
| 78 | + canvas1.getContext("2d").createConicGradient(angle, cx, cy), |
| 79 | + canvas1, |
| 80 | + Gradient.createConicGradient(angle, cx, cy), |
| 81 | + canvas2 |
| 82 | + ); |
| 83 | +} |
| 84 | + |
| 85 | +drawLinearGradient(20, 20, w - 20, h - 20); |
| 86 | +drawRadialGradient(100, 100, 10, 160, 120, 80); |
| 87 | +drawEllipticGradient(100, 100, 100, 40, Math.PI/4); |
| 88 | +drawConicGradient(Math.PI/4, 60, 80); |
| 89 | +``` |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +**see also** |
| 94 | + |
| 95 | +* [css-color](https://github.com/foo123/css-color) simple class to parse and manipulate colors in various formats |
0 commit comments