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 |