UNPKG

@radial-color-picker/angular-color-picker

Version:
75 lines 10.5 kB
/** * Modified version of Lea Verou's * {@link https://github.com/leaverou/conic-gradient conic-gradient}. * * @example * paintColorWheelToCanvas(document.querySelector('#canvas'), 250); * * @param canvas Canvas to paint the color wheel * @param size Color wheel diameter in pixels * @returns canvas The passed canvas for easier chaining */ export const paintColorWheelToCanvas = (canvas, size) => { const half = size / 2; const radius = Math.sqrt(2) * half; const deg = Math.PI / 180; const pi2 = Math.PI * 2; canvas.width = canvas.height = size; const ctx = canvas.getContext('2d'); // .02: To prevent empty blank line and corresponding moire // only non-alpha colors are cared now const thetaOffset = 0.5 * deg + 0.02; // Transform coordinate system so that angles start from the top left, like in CSS ctx.translate(half, half); ctx.rotate(-Math.PI / 2); ctx.translate(-half, -half); for (let i = 0; i < 360; i += 0.5) { ctx.fillStyle = `hsl(${i}, 100%, 50%)`; ctx.beginPath(); ctx.moveTo(half, half); const beginArg = i * deg; const endArg = Math.min(pi2, beginArg + thetaOffset); ctx.arc(half, half, radius, beginArg, endArg); ctx.closePath(); ctx.fill(); } return canvas; }; /** * * @param canvas Canvas to paint the color wheel * @param diameter Color wheel diameter in pixels * @param coefficient Relation between inner white circle outer border and color circle outer border, controls the width of the color gradient path * @returns canvas The passed canvas for easier chaining */ export const renderColorMap = (canvas, diameter, coefficient = 0.77) => { canvas.width = canvas.height = diameter; const radius = diameter / 2; const toRad = (2 * Math.PI) / 360; const step = 0.2; const aliasing = 1; const ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, diameter, diameter); for (let i = 0; i < 360; i += step) { const sRad = (i - aliasing) * toRad; const eRad = (i + step) * toRad; ctx.beginPath(); ctx.arc(radius, radius, radius / 2, sRad, eRad, false); ctx.strokeStyle = 'hsl(' + i + ', 100%, 50%)'; ctx.lineWidth = radius; ctx.closePath(); ctx.stroke(); } ctx.fillStyle = 'rgb(255, 255, 255)'; ctx.beginPath(); ctx.arc(radius, radius, radius * coefficient, 0, Math.PI * 2, true); ctx.closePath(); ctx.fill(); ctx.strokeStyle = 'rgb(255, 255, 255)'; ctx.lineWidth = 2; ctx.beginPath(); ctx.arc(radius, radius, radius, 0, 2 * Math.PI); ctx.stroke(); return canvas; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZ3JhZGllbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AcmFkaWFsLWNvbG9yLXBpY2tlci9hbmd1bGFyLWNvbG9yLXBpY2tlci8iLCJzb3VyY2VzIjpbImxpYi9oZWxwZXJzL2NvbG9yLWdyYWRpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE1BQXlCLEVBQUUsSUFBWSxFQUFxQixFQUFFO0lBQ3BHLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7SUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFeEIsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBDLDJEQUEyRDtJQUMzRCxzQ0FBc0M7SUFDdEMsTUFBTSxXQUFXLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFFckMsa0ZBQWtGO0lBQ2xGLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENB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QUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUdiLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBNb2RpZmllZCB2ZXJzaW9uIG9mIExlYSBWZXJvdSdzXHJcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbGVhdmVyb3UvY29uaWMtZ3JhZGllbnQgY29uaWMtZ3JhZGllbnR9LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBwYWludENvbG9yV2hlZWxUb0NhbnZhcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2FudmFzJyksIDI1MCk7XHJcbiAqXHJcbiAqIEBwYXJhbSBjYW52YXMgQ2FudmFzIHRvIHBhaW50IHRoZSBjb2xvciB3aGVlbFxyXG4gKiBAcGFyYW0gc2l6ZSAgIENvbG9yIHdoZWVsIGRpYW1ldGVyIGluIHBpeGVsc1xyXG4gKiBAcmV0dXJucyBjYW52YXMgVGhlIHBhc3NlZCBjYW52YXMgZm9yIGVhc2llciBjaGFpbmluZ1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBhaW50Q29sb3JXaGVlbFRvQ2FudmFzID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIHNpemU6IG51bWJlcik6IEhUTUxDYW52YXNFbGVtZW50ID0+IHtcclxuICBjb25zdCBoYWxmID0gc2l6ZSAvIDI7XHJcbiAgY29uc3QgcmFkaXVzID0gTWF0aC5zcXJ0KDIpICogaGFsZjtcclxuICBjb25zdCBkZWcgPSBNYXRoLlBJIC8gMTgwO1xyXG4gIGNvbnN0IHBpMiA9IE1hdGguUEkgKiAyO1xyXG5cclxuICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gc2l6ZTtcclxuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgLy8gLjAyOiBUbyBwcmV2ZW50IGVtcHR5IGJsYW5rIGxpbmUgYW5kIGNvcnJlc3BvbmRpbmcgbW9pcmVcclxuICAvLyBvbmx5IG5vbi1hbHBoYSBjb2xvcnMgYXJlIGNhcmVkIG5vd1xyXG4gIGNvbnN0IHRoZXRhT2Zmc2V0ID0gMC41ICogZGVnICsgMC4wMjtcclxuXHJcbiAgLy8gVHJhbnNmb3JtIGNvb3JkaW5hdGUgc3lzdGVtIHNvIHRoYXQgYW5nbGVzIHN0YXJ0IGZyb20gdGhlIHRvcCBsZWZ0LCBsaWtlIGluIENTU1xyXG4gIGN0eC50cmFuc2xhdGUoaGFsZiwgaGFsZik7XHJcbiAgY3R4LnJvdGF0ZSgtTWF0aC5QSSAvIDIpO1xyXG4gIGN0eC50cmFuc2xhdGUoLWhhbGYsIC1oYWxmKTtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAzNjA7IGkgKz0gMC41KSB7XHJcbiAgICBjdHguZmlsbFN0eWxlID0gYGhzbCgke2l9LCAxMDAlLCA1MCUpYDtcclxuICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgIGN0eC5tb3ZlVG8oaGFsZiwgaGFsZik7XHJcblxyXG4gICAgY29uc3QgYmVnaW5BcmcgPSBpICogZGVnO1xyXG4gICAgY29uc3QgZW5kQXJnID0gTWF0aC5taW4ocGkyLCBiZWdpbkFyZyArIHRoZXRhT2Zmc2V0KTtcclxuXHJcbiAgICBjdHguYXJjKGhhbGYsIGhhbGYsIHJhZGl1cywgYmVnaW5BcmcsIGVuZEFyZyk7XHJcblxyXG4gICAgY3R4LmNsb3NlUGF0aCgpO1xyXG4gICAgY3R4LmZpbGwoKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBjYW52YXM7XHJcbn07XHJcblxyXG4vKipcclxuICpcclxuICogQHBhcmFtIGNhbnZhcyBDYW52YXMgdG8gcGFpbnQgdGhlIGNvbG9yIHdoZWVsXHJcbiAqIEBwYXJhbSBkaWFtZXRlciBDb2xvciB3aGVlbCBkaWFtZXRlciBpbiBwaXhlbHNcclxuICogQHBhcmFtIGNvZWZmaWNpZW50IFJlbGF0aW9uIGJldHdlZW4gaW5uZXIgd2hpdGUgY2lyY2xlIG91dGVyIGJvcmRlciBhbmQgY29sb3IgY2lyY2xlIG91dGVyIGJvcmRlciwgY29udHJvbHMgdGhlIHdpZHRoIG9mIHRoZSBjb2xvciBncmFkaWVudCBwYXRoXHJcbiAqIEByZXR1cm5zIGNhbnZhcyBUaGUgcGFzc2VkIGNhbnZhcyBmb3IgZWFzaWVyIGNoYWluaW5nXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVuZGVyQ29sb3JNYXAgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgZGlhbWV0ZXI6IG51bWJlciwgY29lZmZpY2llbnQ6IG51bWJlciA9IDAuNzcpOiBIVE1MQ2FudmFzRWxlbWVudCA9PiB7XHJcbiAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IGRpYW1ldGVyO1xyXG4gIGNvbnN0IHJhZGl1cyA9IGRpYW1ldGVyIC8gMjtcclxuICBjb25zdCB0b1JhZCA9ICgyICogTWF0aC5QSSkgLyAzNjA7XHJcbiAgY29uc3Qgc3RlcCA9IDAuMjtcclxuICBjb25zdCBhbGlhc2luZyA9IDE7XHJcblxyXG5cclxuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICBjdHguY2xlYXJSZWN0KDAsIDAsIGRpYW1ldGVyLCBkaWFtZXRlcik7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAzNjA7IGkgKz0gc3RlcCkge1xyXG4gICAgY29uc3Qgc1JhZCA9IChpIC0gYWxpYXNpbmcpICogdG9SYWQ7XHJcbiAgICBjb25zdCBlUmFkID0gKGkgKyBzdGVwKSAqIHRvUmFkO1xyXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgY3R4LmFyYyhyYWRpdXMsIHJhZGl1cywgcmFkaXVzIC8gMiwgc1JhZCwgZVJhZCwgZmFsc2UpO1xyXG4gICAgY3R4LnN0cm9rZVN0eWxlID0gJ2hzbCgnICsgaSArICcsIDEwMCUsIDUwJSknO1xyXG4gICAgY3R4LmxpbmVXaWR0aCA9IHJhZGl1cztcclxuICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgIGN0eC5zdHJva2UoKTtcclxuICB9XHJcblxyXG4gIGN0eC5maWxsU3R5bGUgPSAncmdiKDI1NSwgMjU1LCAyNTUpJztcclxuICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgY3R4LmFyYyhyYWRpdXMsIHJhZGl1cywgcmFkaXVzICogY29lZmZpY2llbnQsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcclxuICBjdHguY2xvc2VQYXRoKCk7XHJcbiAgY3R4LmZpbGwoKTtcclxuXHJcbiAgY3R4LnN0cm9rZVN0eWxlID0gJ3JnYigyNTUsIDI1NSwgMjU1KSc7XHJcbiAgY3R4LmxpbmVXaWR0aCA9IDI7XHJcbiAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gIGN0eC5hcmMocmFkaXVzLCByYWRpdXMsIHJhZGl1cywgMCwgMiAqIE1hdGguUEkpO1xyXG4gIGN0eC5zdHJva2UoKTtcclxuXHJcblxyXG4gIHJldHVybiBjYW52YXM7XHJcbn07XHJcbiJdfQ==