summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2014-11-11 13:30:13 -0500
committerJules Laplace <jules@okfoc.us>2014-11-11 13:30:13 -0500
commit0abda4c9e25320285bc6a8960768d8c7427ad496 (patch)
tree1395091a05b08d2086951a38735b5008df12125a
parent46bbbaf4be97fce3996207e75d09552096e61fa4 (diff)
splitting out color picker
-rw-r--r--public/assets/javascripts/ui/editor/ColorControl.js175
-rw-r--r--public/assets/javascripts/ui/lib/LabColorPicker.js178
-rw-r--r--views/controls/editor/color-control.ejs1
-rw-r--r--views/partials/scripts.ejs1
4 files changed, 182 insertions, 173 deletions
diff --git a/public/assets/javascripts/ui/editor/ColorControl.js b/public/assets/javascripts/ui/editor/ColorControl.js
index d1a8c7b..0c5463e 100644
--- a/public/assets/javascripts/ui/editor/ColorControl.js
+++ b/public/assets/javascripts/ui/editor/ColorControl.js
@@ -4,8 +4,6 @@ var ColorControl = View.extend({
events: {
"mousedown": "stopPropagation",
- "mousedown #brightness-control": "beginBrightness",
- "input #brightness-control": "updateBrightness",
"click .color-swatches span": "setSurface",
"click .colors span": "setHue",
},
@@ -32,6 +30,7 @@ var ColorControl = View.extend({
this.colorPicker = new LabColorPicker(this, 155, 155)
this.$("#color-picker").append( this.colorPicker.canvas )
this.$("#color-picker").append( this.colorPicker.cursor )
+ this.$(".slider").append( this.colorPicker.brightness )
this.$swatches = this.$(".swatch")
this.$labels = this.$(".swatch + label")
@@ -41,8 +40,7 @@ var ColorControl = View.extend({
floor: this.$("#floor-color"),
ceiling: this.$("#ceiling-color"),
}
- this.$brightnessControl = this.$("#brightness-control")
-
+
this.$colors = this.$(".colors")
this.colors.forEach(function(color){
var $swatch = $("<span>")
@@ -134,7 +132,6 @@ var ColorControl = View.extend({
color = Walls.colors[ mode ]
this.labColor = this.colorPicker.load(color)
- this.$brightnessControl.val( this.labColor[0] )
},
setSurface: function(e){
@@ -144,174 +141,8 @@ var ColorControl = View.extend({
setHue: function(e){
var color = $(e.currentTarget).data('color')
-
this.labColor = this.colorPicker.load(color)
- this.$brightnessControl.val( this.labColor[0] )
-
this.pick(color, this.labColor)
- },
-
- beginBrightness: function(){
- this.begin()
- $(window).one("mouseup", this.finalize.bind(this))
- },
-
- updateBrightness: function(){
- this.labColor[0] = parseFloat( this.$brightnessControl.val() )
- var rgb = this.colorPicker.setLab( this.labColor )
- this.pick(rgb, this.labColor)
- },
-
-})
-
-var LabColorPicker = function (parent, w, h) {
- var base = this
- var canvas = this.canvas = document.createElement('canvas')
- var ctx = this.ctx = canvas.getContext('2d')
- var imageData = ctx.createImageData(w,h)
- var data = imageData.data
-
- var cursor = this.cursor = document.createElement("div")
- cursor.className = "colorPickerCursor"
-
- canvas.width = w
- canvas.height = h
- canvas.className = "colorPicker"
-
- var ww = w-1
- var hh = h-1
-
- var L_range = [0, 110]
- var a_range = [-86.185, 98.254]
- var b_range = [-107.863, 94.482]
-
- var rgb = [0,0,0]
-
- var val = 80
-
- this.mouse = new mouse({
- el: canvas,
- down: function(e, cursor){
- parent.begin()
- cursor.x.a = -cursor.x.a
- base.pick(cursor.x.a, cursor.y.a)
- },
- drag: function(e, cursor){
- cursor.x.b = -cursor.x.b
- base.pick(cursor.x.b, cursor.y.b)
- },
- up: function(){
- parent.finalize()
- }
- })
-
- this.setLab = function(Lab) {
- val = Lab[0]
- this.paint()
- var rgb = xyz2rgb(hunterlab2xyz(Lab[0], Lab[1], Lab[2])).map(Math.round)
- return rgb
- }
- this.pick = function(i, j){
- i = clamp(i, 0, w)
- j = clamp(j, 0, h)
- var x = mix( i/ww, a_range[0], a_range[1] )
- var y = mix( j/hh, b_range[0], b_range[1] )
- var rgb = xyz2rgb(hunterlab2xyz(val, x, y)).map(Math.round)
- this.moveCursor(i, j)
- parent.pick( rgb, [val,x,y] )
- }
- this.load = function(rgba){
- var Lab = xyz2hunterlab(rgb2xyz(rgba))
- var val = clamp( Lab[0], L_range[0], L_range[1] )
- var x = mix( norm(Lab[1], a_range[0], a_range[1]), 0, ww )
- var y = mix( norm(Lab[2], b_range[0], b_range[1]), 0, hh )
-
- this.moveCursor(x,y)
- this.setLab(Lab)
- return Lab
- }
- this.moveCursor = function(x,y){
- cursor.style.left = x + "px"
- cursor.style.top = y + "px"
- }
- this.paint = function() {
- val = clamp(val, L_range[0], L_range[1])
- var x, y, t
- for (var i = 0; i < w; i++) {
- for (var j = 0; j < h; j++) {
- x = mix( i/ww, a_range[0], a_range[1] )
- y = mix( j/hh, b_range[0], b_range[1] )
- t = (j*w + i) * 4
- rgb = xyz2rgb(hunterlab2xyz(val, x, y))
- data[t] = Math.round( rgb[0] )
- data[t+1] = Math.round( rgb[1] )
- data[t+2] = Math.round( rgb[2] )
- data[t+3] = 255
- }
- }
- ctx.putImageData(imageData,0,0)
- }
-
- function hunterlab2xyz (L,a,b) {
- var_Y = L / 10
- var_X = a / 17.5 * L / 10
- var_Z = b / 7 * L / 10
-
- Y = Math.pow(var_Y, 2)
- X = ( var_X + Y ) / 1.02
- Z = -( var_Z - Y ) / 0.847
- xyz = [X,Y,Z]
}
- function xyz2rgb(){
- var var_X = xyz[0] / 100 //X from 0 to 95.047 (Observer = 2°, Illuminant = D65)
- var var_Y = xyz[1] / 100 //Y from 0 to 100.000
- var var_Z = xyz[2] / 100 //Z from 0 to 108.883
- var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986
- var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415
- var_B = var_X * 0.0557 + var_Y * -0.2040 + var_Z * 1.0570
-
- if ( var_R > 0.0031308 ) var_R = 1.055 * Math.pow( var_R, 1 / 2.4 ) - 0.055
- else var_R = 12.92 * var_R
- if ( var_G > 0.0031308 ) var_G = 1.055 * Math.pow( var_G, 1 / 2.4 ) - 0.055
- else var_G = 12.92 * var_G
- if ( var_B > 0.0031308 ) var_B = 1.055 * Math.pow( var_B, 1 / 2.4 ) - 0.055
- else var_B = 12.92 * var_B
-
- rgb[0] = clamp(var_R * 255, 0, 255)
- rgb[1] = clamp(var_G * 255, 0, 255)
- rgb[2] = clamp(var_B * 255, 0, 255)
- return rgb
- }
- function rgb2xyz(RGB){
- var var_R = ( RGB[0] / 255 ) // R from 0 to 255
- var var_G = ( RGB[1] / 255 ) // G from 0 to 255
- var var_B = ( RGB[2] / 255 ) // B from 0 to 255
-
- if ( var_R > 0.04045 ) var_R = Math.pow( ( var_R + 0.055 ) / 1.055, 2.4)
- else var_R = var_R / 12.92
- if ( var_G > 0.04045 ) var_G = Math.pow( ( var_G + 0.055 ) / 1.055, 2.4)
- else var_G = var_G / 12.92
- if ( var_B > 0.04045 ) var_B = Math.pow( ( var_B + 0.055 ) / 1.055, 2.4)
- else var_B = var_B / 12.92
-
- var_R = var_R * 100
- var_G = var_G * 100
- var_B = var_B * 100
-
- //Observer. = 2°, Illuminant = D65
- var x = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
- var y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
- var z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505
- return [x,y,z]
- }
- function xyz2hunterlab (XYZ) {
- var X = XYZ[0]
- var Y = XYZ[1] || 1e-6 // otherwise divide-by-zero error when converting rgb(0,0,0)
- var Z = XYZ[2]
- var L = 10 * sqrt( Y )
- var a = 17.5 * ( ( ( 1.02 * X ) - Y ) / sqrt( Y ) )
- var b = 7 * ( ( Y - ( 0.847 * Z ) ) / sqrt( Y ) )
- return [L,a,b]
- }
-}
+})
diff --git a/public/assets/javascripts/ui/lib/LabColorPicker.js b/public/assets/javascripts/ui/lib/LabColorPicker.js
new file mode 100644
index 0000000..0e1563a
--- /dev/null
+++ b/public/assets/javascripts/ui/lib/LabColorPicker.js
@@ -0,0 +1,178 @@
+var LabColorPicker = function (parent, w, h) {
+ var base = this
+ var canvas = this.canvas = document.createElement('canvas')
+ var ctx = this.ctx = canvas.getContext('2d')
+ var imageData = ctx.createImageData(w,h)
+ var data = imageData.data
+
+ var cursor = this.cursor = document.createElement("div")
+ cursor.className = "colorPickerCursor"
+
+ var brightnessControl = this.brightness = document.createElement("input")
+ var $brightnessControl = $(brightnessControl)
+ brightnessControl.setAttribute("type", "range")
+ brightnessControl.setAttribute("min", "0")
+ brightnessControl.setAttribute("max", "110")
+ brightnessControl.setAttribute("value", "0")
+
+ canvas.width = w
+ canvas.height = h
+ canvas.className = "colorPicker"
+
+ var ww = w-1
+ var hh = h-1
+
+ var L_range = [0, 110]
+ var a_range = [-86.185, 98.254]
+ var b_range = [-107.863, 94.482]
+
+ var rgb = [0,0,0]
+
+ var val = 80
+
+ this.mouse = new mouse({
+ el: canvas,
+ down: function(e, cursor){
+ parent.begin()
+ cursor.x.a = -cursor.x.a
+ base.pick(cursor.x.a, cursor.y.a)
+ },
+ drag: function(e, cursor){
+ cursor.x.b = -cursor.x.b
+ base.pick(cursor.x.b, cursor.y.b)
+ },
+ up: function(){
+ parent.finalize()
+ }
+ })
+
+ $brightnessControl.on({
+ "mousedown": function(){ base.beginBrightness() },
+ "input": function(){ base.updateBrightness() },
+ })
+
+ this.setLab = function(Lab) {
+ val = Lab[0]
+ this.paint()
+ var rgb = xyz2rgb(hunterlab2xyz(Lab[0], Lab[1], Lab[2])).map(Math.round)
+ return rgb
+ }
+ this.pick = function(i, j){
+ i = clamp(i, 0, w)
+ j = clamp(j, 0, h)
+ var x = mix( i/ww, a_range[0], a_range[1] )
+ var y = mix( j/hh, b_range[0], b_range[1] )
+ var rgb = xyz2rgb(hunterlab2xyz(val, x, y)).map(Math.round)
+ this.moveCursor(i, j)
+ parent.pick( rgb, [val,x,y] )
+ }
+ this.load = function(rgba){
+ var Lab = xyz2hunterlab(rgb2xyz(rgba))
+ var val = clamp( Lab[0], L_range[0], L_range[1] )
+ var x = mix( norm(Lab[1], a_range[0], a_range[1]), 0, ww )
+ var y = mix( norm(Lab[2], b_range[0], b_range[1]), 0, hh )
+
+ this.moveCursor(x,y)
+ this.setLab(Lab)
+ this.setBrightness(Lab)
+
+ return Lab
+ }
+ this.moveCursor = function(x,y){
+ cursor.style.left = x + "px"
+ cursor.style.top = y + "px"
+ }
+ this.paint = function() {
+ val = clamp(val, L_range[0], L_range[1])
+ var x, y, t
+ for (var i = 0; i < w; i++) {
+ for (var j = 0; j < h; j++) {
+ x = mix( i/ww, a_range[0], a_range[1] )
+ y = mix( j/hh, b_range[0], b_range[1] )
+ t = (j*w + i) * 4
+ rgb = xyz2rgb(hunterlab2xyz(val, x, y))
+ data[t] = Math.round( rgb[0] )
+ data[t+1] = Math.round( rgb[1] )
+ data[t+2] = Math.round( rgb[2] )
+ data[t+3] = 255
+ }
+ }
+ ctx.putImageData(imageData,0,0)
+ }
+
+ this.beginBrightness = function(){
+ parent.begin()
+ $(window).one("mouseup", parent.finalize.bind(parent))
+ }
+ this.updateBrightness = function(){
+ parent.labColor[0] = parseFloat( $brightnessControl.val() )
+ var rgb = base.setLab( parent.labColor )
+ parent.pick(rgb, parent.labColor)
+ }
+ this.setBrightness = function(Lab){
+ $brightnessControl.val(Lab[0])
+ }
+
+ function hunterlab2xyz (L,a,b) {
+ var_Y = L / 10
+ var_X = a / 17.5 * L / 10
+ var_Z = b / 7 * L / 10
+
+ Y = Math.pow(var_Y, 2)
+ X = ( var_X + Y ) / 1.02
+ Z = -( var_Z - Y ) / 0.847
+ xyz = [X,Y,Z]
+ }
+ function xyz2rgb(){
+ var var_X = xyz[0] / 100 //X from 0 to 95.047 (Observer = 2°, Illuminant = D65)
+ var var_Y = xyz[1] / 100 //Y from 0 to 100.000
+ var var_Z = xyz[2] / 100 //Z from 0 to 108.883
+
+ var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986
+ var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415
+ var_B = var_X * 0.0557 + var_Y * -0.2040 + var_Z * 1.0570
+
+ if ( var_R > 0.0031308 ) var_R = 1.055 * Math.pow( var_R, 1 / 2.4 ) - 0.055
+ else var_R = 12.92 * var_R
+ if ( var_G > 0.0031308 ) var_G = 1.055 * Math.pow( var_G, 1 / 2.4 ) - 0.055
+ else var_G = 12.92 * var_G
+ if ( var_B > 0.0031308 ) var_B = 1.055 * Math.pow( var_B, 1 / 2.4 ) - 0.055
+ else var_B = 12.92 * var_B
+
+ rgb[0] = clamp(var_R * 255, 0, 255)
+ rgb[1] = clamp(var_G * 255, 0, 255)
+ rgb[2] = clamp(var_B * 255, 0, 255)
+ return rgb
+ }
+ function rgb2xyz(RGB){
+ var var_R = ( RGB[0] / 255 ) // R from 0 to 255
+ var var_G = ( RGB[1] / 255 ) // G from 0 to 255
+ var var_B = ( RGB[2] / 255 ) // B from 0 to 255
+
+ if ( var_R > 0.04045 ) var_R = Math.pow( ( var_R + 0.055 ) / 1.055, 2.4)
+ else var_R = var_R / 12.92
+ if ( var_G > 0.04045 ) var_G = Math.pow( ( var_G + 0.055 ) / 1.055, 2.4)
+ else var_G = var_G / 12.92
+ if ( var_B > 0.04045 ) var_B = Math.pow( ( var_B + 0.055 ) / 1.055, 2.4)
+ else var_B = var_B / 12.92
+
+ var_R = var_R * 100
+ var_G = var_G * 100
+ var_B = var_B * 100
+
+ //Observer. = 2°, Illuminant = D65
+ var x = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
+ var y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
+ var z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505
+ return [x,y,z]
+ }
+ function xyz2hunterlab (XYZ) {
+ var X = XYZ[0]
+ var Y = XYZ[1] || 1e-6 // otherwise divide-by-zero error when converting rgb(0,0,0)
+ var Z = XYZ[2]
+ var L = 10 * sqrt( Y )
+ var a = 17.5 * ( ( ( 1.02 * X ) - Y ) / sqrt( Y ) )
+ var b = 7 * ( ( Y - ( 0.847 * Z ) ) / sqrt( Y ) )
+ return [L,a,b]
+ }
+}
diff --git a/views/controls/editor/color-control.ejs b/views/controls/editor/color-control.ejs
index 8ce6e85..1fa1688 100644
--- a/views/controls/editor/color-control.ejs
+++ b/views/controls/editor/color-control.ejs
@@ -8,7 +8,6 @@
</div>
<div class="slider">
- <input type="range" min="0" max="110" value="0" id="brightness-control" />
</div>
<div class="color-swatches">
diff --git a/views/partials/scripts.ejs b/views/partials/scripts.ejs
index 70c3b27..7bdb246 100644
--- a/views/partials/scripts.ejs
+++ b/views/partials/scripts.ejs
@@ -80,6 +80,7 @@
<script type="text/javascript" src="/assets/javascripts/ui/lib/ConfirmModal.js"></script>
<script type="text/javascript" src="/assets/javascripts/ui/lib/ErrorModal.js"></script>
<script type="text/javascript" src="/assets/javascripts/ui/lib/Parser.js"></script>
+<script type="text/javascript" src="/assets/javascripts/ui/lib/LabColorPicker.js"></script>
<script type="text/javascript" src="/assets/javascripts/ui/site/SignInModal.js"></script>
<script type="text/javascript" src="/assets/javascripts/ui/site/SignUpModal.js"></script>