Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 | |
| 6 // ======= Global state ======= | |
| 7 | |
| 8 var storedDelta = 0; | |
| 9 var storedSeverity = 0; | |
| 10 var storedType = "type_a"; | |
| 11 var storedSimulate = false; | |
| 12 var curFilter = 0; | |
| 13 | |
| 14 | |
| 15 // ======= 3x3 matrix ops ======= | |
| 16 | |
| 17 var identityMatrix3x3 = [ | |
| 18 [1, 0, 0], | |
| 19 [0, 1, 0], | |
| 20 [0, 0, 1] | |
| 21 ]; | |
| 22 | |
| 23 | |
|
kevers
2015/03/09 13:56:59
Should have jsdoc for all functions.
Peter Wen
2015/03/09 21:35:56
Added some and others left as TODOs.
| |
| 24 function add3x3(m1, m2) { | |
| 25 var result = []; | |
| 26 for (var i = 0; i < 3; i++) { | |
| 27 result[i] = []; | |
| 28 for (var j = 0; j < 3; j++) { | |
| 29 result[i].push(m1[i][j] + m2[i][j]); | |
| 30 } | |
| 31 } | |
| 32 return result; | |
| 33 } | |
| 34 | |
| 35 | |
| 36 function sub3x3(m1, m2) { | |
| 37 var result = []; | |
| 38 for (var i = 0; i < 3; i++) { | |
| 39 result[i] = []; | |
| 40 for (var j = 0; j < 3; j++) { | |
| 41 result[i].push(m1[i][j] - m2[i][j]); | |
| 42 } | |
| 43 } | |
| 44 return result; | |
| 45 } | |
| 46 | |
| 47 | |
| 48 function mul3x3(m1, m2) { | |
| 49 var result = []; | |
| 50 for (var i = 0; i < 3; i++) { | |
| 51 result[i] = []; | |
| 52 for (var j = 0; j < 3; j++) { | |
| 53 var sum = 0; | |
| 54 for (var k = 0; k < 3; k++) { | |
| 55 sum += m1[i][k] * m2[k][j]; | |
| 56 } | |
| 57 result[i].push(sum); | |
| 58 } | |
| 59 } | |
| 60 return result; | |
| 61 } | |
| 62 | |
| 63 | |
| 64 function mul3x3Scalar(m, k) { | |
| 65 var result = []; | |
| 66 for (var i = 0; i < 3; i++) { | |
| 67 result[i] = []; | |
| 68 for (var j = 0; j < 3; j++) { | |
| 69 result[i].push(k * m[i][j]); | |
| 70 } | |
| 71 } | |
| 72 return result; | |
| 73 } | |
| 74 | |
| 75 | |
| 76 // ======= CVD parameters ======= | |
| 77 | |
| 78 var cvdSimulationParams = { | |
|
dmazzoni
2015/03/09 15:40:40
Could you provide any docs on how these were compu
kevers
2015/03/09 15:56:55
Peter, these values were generated by doing a poly
mustaq
2015/03/09 16:35:18
Since we had decided earlier to use severity=1 w/o
kevers
2015/03/09 18:41:48
Thought we decided that we (eventually) wouldn't s
Peter Wen
2015/03/09 21:35:57
Done.
| |
| 79 type_a /*protanomaly*/: [ | |
|
kevers
2015/03/09 13:56:59
jsdoc @emum {string}
Also style for enumeration sh
Peter Wen
2015/03/09 21:35:57
Done.
| |
| 80 [0.4720, -1.2946, 0.9857], | |
| 81 [-0.6128, 1.6326, 0.0187], | |
| 82 [0.1407, -0.3380, -0.0044], | |
| 83 [-0.1420, 0.2488, 0.0044], | |
| 84 [0.1872, -0.3908, 0.9942], | |
| 85 [-0.0451, 0.1420, 0.0013], | |
| 86 [0.0222, -0.0253, -0.0004], | |
| 87 [-0.0290, -0.0201, 0.0006], | |
| 88 [0.0068, 0.0454, 0.9990] | |
| 89 ], | |
| 90 type_b /*deuteranomaly*/: [ | |
| 91 [0.5442, -1.1454, 0.9818], | |
| 92 [-0.7091, 1.5287, 0.0238], | |
| 93 [0.1650, -0.3833, -0.0055], | |
| 94 [-0.1664, 0.4368, 0.0056], | |
| 95 [0.2178, -0.5327, 0.9927], | |
| 96 [-0.0514, 0.0958, 0.0017], | |
| 97 [0.0180, -0.0288, -0.0006], | |
| 98 [-0.0232, -0.0649, 0.0007], | |
| 99 [0.0052, 0.0360, 0.9998] | |
| 100 ], | |
| 101 type_c /*tritanomaly*/: [ | |
| 102 [0.4275, -0.0181, 0.9307], | |
| 103 [-0.2454, 0.0013, 0.0827], | |
| 104 [-0.1821, 0.0168, -0.0134], | |
| 105 [-0.1280, 0.0047, 0.0202], | |
| 106 [0.0233, -0.0398, 0.9728], | |
| 107 [0.1048, 0.0352, 0.0070], | |
| 108 [-0.0156, 0.0061, 0.0071], | |
| 109 [0.3841, 0.2947, 0.0151], | |
| 110 [-0.3685, -0.3008, 0.9778] | |
| 111 ] | |
| 112 }; | |
| 113 | |
| 114 | |
| 115 var cvdCorrectionMatrices = { | |
|
kevers
2015/03/09 13:56:59
Dead code. Please remove.
Peter Wen
2015/03/09 21:35:57
Done.
| |
| 116 type_a /*protanomaly*/: [ | |
| 117 [0.0, 0.0, 0.0], | |
| 118 [0.7, 1.0, 0.0], | |
| 119 [0.7, 0.0, 1.0] | |
| 120 ], | |
| 121 type_b /*deuteranomaly*/: [ | |
| 122 [1.0, 0.7, 0.0], | |
| 123 [0.0, 0.0, 0.0], | |
| 124 [0.0, 0.7, 1.0] | |
| 125 ], | |
| 126 type_c /*tritanomaly*/: [ | |
| 127 [1.0, 0.0, 0.7], | |
| 128 [0.0, 1.0, 0.7], | |
| 129 [0.0, 0.0, 0.0] | |
| 130 ] | |
| 131 }; | |
| 132 | |
| 133 | |
| 134 // TODO(mustaq): A common matrix for all types? E.g. Kevin's experiment | |
| 135 // suggested: Mx[1][0] = 0.7+0.3*delta and Mx[2][0] = 0.7-0.3*delta | |
| 136 var cvdCorrectionParams = { | |
|
kevers
2015/03/09 13:56:59
See comments above on enumerations.
Peter Wen
2015/03/09 21:35:56
Done.
| |
| 137 type_a /*protanomaly*/: { | |
| 138 addendum: [ | |
| 139 [-1.0, 0.0, 0.0], | |
| 140 [0.5, 1.0, 0.0], | |
| 141 [1.5, 0.0, 1.0] | |
| 142 ], | |
| 143 delta_factor: [ | |
| 144 [0.0, 0.0, 0.0], | |
| 145 [1.0, 0.0, 0.0], | |
| 146 [-1.0, 0.0, 0.0] | |
| 147 ] | |
| 148 }, | |
| 149 type_b /*deuteranomaly*/: { | |
| 150 addendum: [ | |
| 151 [1.0, 0.5, 0.0], | |
| 152 [0.5, -1.0, 0.0], | |
| 153 [1.5, 1.5, 1.0] | |
| 154 ], | |
| 155 delta_factor: [ | |
| 156 [0.0, 1.0, 0.0], | |
| 157 [0.0, 0.0, 0.0], | |
| 158 [0.0, -1.0, 0.0] | |
| 159 ] | |
| 160 }, | |
| 161 type_c /*tritanomaly*/: { | |
| 162 addendum: [ | |
| 163 [1.0, 0.0, 1.5], | |
| 164 [0.0, 1.0, 0.5], | |
| 165 [0.0, 0.0, -1.0] | |
| 166 ], | |
| 167 delta_factor: [ | |
| 168 [0.0, 0.0, -1.0], | |
| 169 [0.0, 0.0, 1.0], | |
| 170 [0.0, 0.0, 0.0] | |
| 171 ] | |
| 172 } | |
| 173 }; | |
| 174 | |
| 175 | |
| 176 // ======= CVD matrix builders ======= | |
| 177 | |
| 178 function getCvdSimulationMatrix(cvdType, severity) { | |
| 179 var cvdSimulationParam = cvdSimulationParams[cvdType]; | |
| 180 var severity2 = severity * severity; | |
| 181 var matrix = []; | |
| 182 for (var i = 0; i < 3; i++) { | |
| 183 var row = []; | |
| 184 for (var j = 0; j < 3; j++) { | |
| 185 var paramRow = i*3+j; | |
| 186 var val = cvdSimulationParam[paramRow][0] * severity2 | |
| 187 + cvdSimulationParam[paramRow][1] * severity | |
| 188 + cvdSimulationParam[paramRow][2]; | |
| 189 row.push(val); | |
| 190 } | |
| 191 matrix.push(row); | |
| 192 } | |
| 193 return matrix; | |
| 194 } | |
| 195 | |
| 196 | |
| 197 function getCvdCorrectionMatrix(cvdType, delta) { | |
| 198 cvdCorrectionParam = cvdCorrectionParams[cvdType]; | |
| 199 // TODO(mustaq): Perhaps nuke full-matrix operations after experiment. | |
| 200 return add3x3(cvdCorrectionParam["addendum"], | |
| 201 mul3x3Scalar(cvdCorrectionParam["delta_factor"], delta)); | |
| 202 } | |
| 203 | |
| 204 | |
| 205 function getCvdMatrixAsString(cvdType, severity, delta, simulate) { | |
| 206 var effectiveMatrix = getCvdSimulationMatrix(cvdType, severity); | |
| 207 | |
| 208 if (!simulate) { | |
| 209 var cvdCorrectionMatrix = getCvdCorrectionMatrix(cvdType, delta); | |
| 210 var tmpProduct = mul3x3(cvdCorrectionMatrix, effectiveMatrix); | |
| 211 | |
| 212 effectiveMatrix = sub3x3( | |
| 213 add3x3(identityMatrix3x3, cvdCorrectionMatrix), | |
| 214 tmpProduct); | |
| 215 } | |
| 216 | |
| 217 var outputRows = []; | |
| 218 for (var i = 0; i < 3; i++) { | |
| 219 outputRows.push(effectiveMatrix[i].join(" ") + " 0 0"); | |
| 220 } | |
| 221 // Add the alpha row | |
| 222 outputRows.push("0 0 0 1 0"); | |
| 223 return outputRows.join(" "); | |
| 224 } | |
| 225 | |
| 226 | |
| 227 // ======= Page linker ======= | |
| 228 | |
| 229 var svgDefaultMatrix = | |
| 230 "1 0 0 0 0 " + | |
| 231 "0 1 0 0 0 " + | |
| 232 "0 0 1 0 0 " + | |
| 233 "0 0 0 1 0"; | |
| 234 | |
| 235 var svgContent = | |
| 236 '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">' + | |
| 237 ' <defs>' + | |
| 238 ' <filter id="cvd_extension_0">' + | |
| 239 ' <feColorMatrix id="cvd_filter_matrix_0" type="matrix" values="' + | |
| 240 svgDefaultMatrix + '"/>' + | |
| 241 ' </filter>' + | |
| 242 ' <filter id="cvd_extension_1">' + | |
| 243 ' <feColorMatrix id="cvd_filter_matrix_1" type="matrix" values="' + | |
| 244 svgDefaultMatrix + '"/>' + | |
| 245 ' </filter>' + | |
| 246 ' </defs>' + | |
| 247 '</svg>'; | |
| 248 | |
| 249 | |
| 250 function addSvgIfMissing() { | |
| 251 var wrap = document.getElementById("cvd_extension_svg_filter"); | |
| 252 if (!wrap) { | |
| 253 wrap = document.createElement("span"); | |
| 254 wrap.id = "cvd_extension_svg_filter"; | |
| 255 wrap.setAttribute("hidden", ""); | |
| 256 wrap.innerHTML = svgContent; | |
| 257 document.body.appendChild(wrap); | |
| 258 } | |
| 259 } | |
| 260 | |
| 261 | |
| 262 function update() { | |
| 263 if (!document.body) { | |
| 264 document.addEventListener("DOMContentLoaded", update); | |
| 265 return; | |
| 266 } | |
| 267 addSvgIfMissing(); | |
| 268 var next = 1 - curFilter; | |
| 269 | |
| 270 console.log( | |
|
kevers
2015/03/09 13:56:59
Please change console.log calls to DebugPrint and
Peter Wen
2015/03/09 21:35:57
Do you mean to create a debugPrint global function
kevers
2015/03/10 14:07:51
Added a note to clarify in reviewer comment on pop
| |
| 271 "Setting matrix#" + next + " to " + | |
| 272 getCvdMatrixAsString( | |
| 273 storedType, storedSeverity, storedDelta, storedSimulate)); | |
| 274 | |
| 275 var matrix = document.getElementById("cvd_filter_matrix_" + next); | |
| 276 matrix.setAttribute( | |
| 277 "values", getCvdMatrixAsString( | |
| 278 storedType, storedSeverity, storedDelta, storedSimulate)); | |
| 279 | |
| 280 var html = document.documentElement; | |
| 281 html.classList.remove("filter" + curFilter); | |
| 282 html.offsetTop; | |
| 283 html.classList.add("filter" + next); | |
| 284 | |
| 285 curFilter = next; | |
| 286 | |
| 287 window.scrollBy(0, 1); | |
|
kevers
2015/03/09 13:56:59
This looks like a strange hack. Why is it needed?
dmazzoni
2015/03/09 15:40:40
Yeah, if the filters don't update without this hac
Peter Wen
2015/03/09 21:35:57
Added TODO to investigate.
| |
| 288 window.scrollBy(0, -1); | |
| 289 } | |
| 290 | |
| 291 | |
| 292 function onExtensionMessage(request) { | |
| 293 console.log(request); | |
| 294 var changed = false; | |
| 295 | |
| 296 if (request["delta"] !== undefined) { | |
| 297 var delta = request.delta; | |
| 298 if (storedDelta != delta) { | |
| 299 storedDelta = delta; | |
| 300 changed = true; | |
| 301 } | |
| 302 } | |
| 303 | |
| 304 if (request["severity"] !== undefined) { | |
| 305 var severity = request.severity; | |
| 306 if (storedSeverity != severity) { | |
| 307 storedSeverity = severity; | |
| 308 changed = true; | |
| 309 } | |
| 310 } | |
| 311 | |
| 312 if (request["type"] !== undefined) { | |
| 313 var type = request.type; | |
| 314 if (storedType != type) { | |
| 315 storedType = type; | |
| 316 changed = true; | |
| 317 } | |
| 318 } | |
| 319 | |
| 320 if (request["simulate"] !== undefined) { | |
| 321 var simulate = request.simulate; | |
| 322 if (storedSimulate != simulate) { | |
| 323 storedSimulate = simulate; | |
| 324 changed = true; | |
| 325 } | |
| 326 } | |
| 327 | |
| 328 if (changed) | |
| 329 update(); | |
| 330 } | |
| 331 | |
| 332 | |
| 333 function init() { | |
| 334 chrome.extension.onRequest.addListener(onExtensionMessage); | |
| 335 chrome.extension.sendRequest({"init": true}, onExtensionMessage); | |
| 336 } | |
| 337 | |
| 338 | |
| 339 init(); | |
| OLD | NEW |