Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: ui/accessibility/extensions/colorenhancer/src/cvd.js

Issue 984833004: Add color enhancer as a chromium accessibility extensions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update to 1.1.2 Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698