OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview Puts text on a braille display. | 6 * @fileoverview Puts text on a braille display. |
7 * | 7 * |
8 */ | 8 */ |
9 | 9 |
10 goog.provide('cvox.BrailleDisplayManager'); | 10 goog.provide('cvox.BrailleDisplayManager'); |
(...skipping 19 matching lines...) Expand all Loading... |
30 this.translatorManager_ = translatorManager; | 30 this.translatorManager_ = translatorManager; |
31 /** | 31 /** |
32 * @type {!cvox.NavBraille} | 32 * @type {!cvox.NavBraille} |
33 * @private | 33 * @private |
34 */ | 34 */ |
35 this.content_ = new cvox.NavBraille({}); | 35 this.content_ = new cvox.NavBraille({}); |
36 /** | 36 /** |
37 * @type {!cvox.ExpandingBrailleTranslator.ExpansionType} valueExpansion | 37 * @type {!cvox.ExpandingBrailleTranslator.ExpansionType} valueExpansion |
38 * @private | 38 * @private |
39 */ | 39 */ |
40 this.expansionType_ = | 40 this.expansionType_ = cvox.ExpandingBrailleTranslator.ExpansionType.SELECTION; |
41 cvox.ExpandingBrailleTranslator.ExpansionType.SELECTION; | |
42 /** | 41 /** |
43 * @type {cvox.PanStrategy} | 42 * @type {cvox.PanStrategy} |
44 * @private | 43 * @private |
45 */ | 44 */ |
46 this.panStrategy_ = new cvox.PanStrategy(); | 45 this.panStrategy_ = new cvox.PanStrategy(); |
47 /** | 46 /** |
48 * @type {function(!cvox.BrailleKeyEvent, !cvox.NavBraille)} | 47 * @type {function(!cvox.BrailleKeyEvent, !cvox.NavBraille)} |
49 * @private | 48 * @private |
50 */ | 49 */ |
51 this.commandListener_ = function() {}; | 50 this.commandListener_ = function() {}; |
52 /** | 51 /** |
53 * Current display state to show in the Virtual Braille Captions display. | 52 * Current display state to show in the Virtual Braille Captions display. |
54 * This is different from realDisplayState_ if the braille captions feature | 53 * This is different from realDisplayState_ if the braille captions feature |
55 * is enabled and there is no hardware display connected. Otherwise, it is | 54 * is enabled and there is no hardware display connected. Otherwise, it is |
56 * the same object as realDisplayState_. | 55 * the same object as realDisplayState_. |
57 * @type {!cvox.BrailleDisplayState} | 56 * @type {!cvox.BrailleDisplayState} |
58 * @private | 57 * @private |
59 */ | 58 */ |
60 this.displayState_ = {available: false, textRowCount: 0, | 59 this.displayState_ = {available: false, textRowCount: 0, textColumnCount: 0}; |
61 textColumnCount: 0}; | |
62 /** | 60 /** |
63 * State reported from the chrome api, reflecting a real hardware | 61 * State reported from the chrome api, reflecting a real hardware |
64 * display. | 62 * display. |
65 * @type {!cvox.BrailleDisplayState} | 63 * @type {!cvox.BrailleDisplayState} |
66 * @private | 64 * @private |
67 */ | 65 */ |
68 this.realDisplayState_ = this.displayState_; | 66 this.realDisplayState_ = this.displayState_; |
69 | 67 |
70 translatorManager.addChangeListener(function() { | 68 translatorManager.addChangeListener(function() { |
71 this.translateContent_(this.content_, this.expansionType_); | 69 this.translateContent_(this.content_, this.expansionType_); |
72 }.bind(this)); | 70 }.bind(this)); |
73 | 71 |
74 chrome.storage.onChanged.addListener(function(changes, area) { | 72 chrome.storage.onChanged.addListener(function(changes, area) { |
75 if (area == 'local' && 'brailleWordWrap' in changes) { | 73 if (area == 'local' && 'brailleWordWrap' in changes) { |
76 this.updatePanStrategy_(changes.brailleWordWrap.newValue); | 74 this.updatePanStrategy_(changes.brailleWordWrap.newValue); |
77 } | 75 } |
78 if (area == 'local' && ('virtualBrailleRows' in changes || | 76 if (area == 'local' && |
79 'virtualBrailleColumns' in changes)) { | 77 ('virtualBrailleRows' in changes || |
| 78 'virtualBrailleColumns' in changes)) { |
80 this.onCaptionsStateChanged_(); | 79 this.onCaptionsStateChanged_(); |
81 } | 80 } |
82 }.bind(this)); | 81 }.bind(this)); |
83 chrome.storage.local.get({brailleWordWrap: true}, function(items) { | 82 chrome.storage.local.get({brailleWordWrap: true}, function(items) { |
84 this.updatePanStrategy_(items.brailleWordWrap); | 83 this.updatePanStrategy_(items.brailleWordWrap); |
85 }.bind(this)); | 84 }.bind(this)); |
86 | 85 |
87 cvox.BrailleCaptionsBackground.init(goog.bind( | 86 cvox.BrailleCaptionsBackground.init( |
88 this.onCaptionsStateChanged_, this)); | 87 goog.bind(this.onCaptionsStateChanged_, this)); |
89 if (goog.isDef(chrome.brailleDisplayPrivate)) { | 88 if (goog.isDef(chrome.brailleDisplayPrivate)) { |
90 var onDisplayStateChanged = goog.bind(this.refreshDisplayState_, this); | 89 var onDisplayStateChanged = goog.bind(this.refreshDisplayState_, this); |
91 chrome.brailleDisplayPrivate.getDisplayState(onDisplayStateChanged); | 90 chrome.brailleDisplayPrivate.getDisplayState(onDisplayStateChanged); |
92 chrome.brailleDisplayPrivate.onDisplayStateChanged.addListener( | 91 chrome.brailleDisplayPrivate.onDisplayStateChanged.addListener( |
93 onDisplayStateChanged); | 92 onDisplayStateChanged); |
94 chrome.brailleDisplayPrivate.onKeyEvent.addListener( | 93 chrome.brailleDisplayPrivate.onKeyEvent.addListener( |
95 goog.bind(this.onKeyEvent_, this)); | 94 goog.bind(this.onKeyEvent_, this)); |
96 } else { | 95 } else { |
97 // Get the initial captions state since we won't refresh the display | 96 // Get the initial captions state since we won't refresh the display |
98 // state in an API callback in this case. | 97 // state in an API callback in this case. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 // are 6-dot (2 x 3), but we should have a way to detect that via brltty. | 167 // are 6-dot (2 x 3), but we should have a way to detect that via brltty. |
169 var cellWidth = 2; | 168 var cellWidth = 2; |
170 var cellHeight = 3; | 169 var cellHeight = 3; |
171 var maxCellHeight = 4; | 170 var maxCellHeight = 4; |
172 | 171 |
173 var rows = this.displayState_.textRowCount; | 172 var rows = this.displayState_.textRowCount; |
174 var columns = this.displayState_.textColumnCount; | 173 var columns = this.displayState_.textColumnCount; |
175 var imageDataUrl = imageUrl; | 174 var imageDataUrl = imageUrl; |
176 var imgElement = document.createElement('img'); | 175 var imgElement = document.createElement('img'); |
177 imgElement.src = imageDataUrl; | 176 imgElement.src = imageDataUrl; |
178 imgElement.onload = (function() { | 177 imgElement.onload = function() { |
179 var canvas = document.createElement('canvas'); | 178 var canvas = document.createElement('canvas'); |
180 var context = canvas.getContext('2d'); | 179 var context = canvas.getContext('2d'); |
181 canvas.width = columns * cellWidth; | 180 canvas.width = columns * cellWidth; |
182 canvas.height = rows * cellHeight; | 181 canvas.height = rows * cellHeight; |
183 context.drawImage(imgElement, 0, 0, canvas.width, canvas.height); | 182 context.drawImage(imgElement, 0, 0, canvas.width, canvas.height); |
184 var imageData = context.getImageData(0, 0, canvas.width, canvas.height); | 183 var imageData = context.getImageData(0, 0, canvas.width, canvas.height); |
185 var data = imageData.data; | 184 var data = imageData.data; |
186 var outputData = []; | 185 var outputData = []; |
187 | 186 |
188 // Convert image to black and white by thresholding the luminance for | 187 // Convert image to black and white by thresholding the luminance for |
189 // all opaque (non-transparent) pixels. | 188 // all opaque (non-transparent) pixels. |
190 for (var i = 0; i < data.length; i += 4) { | 189 for (var i = 0; i < data.length; i += 4) { |
191 var red = data[i]; | 190 var red = data[i]; |
192 var green = data[i + 1]; | 191 var green = data[i + 1]; |
193 var blue = data[i + 2]; | 192 var blue = data[i + 2]; |
194 var alpha = data[i + 3]; | 193 var alpha = data[i + 3]; |
195 var luminance = | 194 var luminance = 0.2126 * red + 0.7152 * green + 0.0722 * blue; |
196 0.2126 * red + | |
197 0.7152 * green + | |
198 0.0722 * blue; | |
199 // Show braille pin if the alpha is greater than the threshold and | 195 // Show braille pin if the alpha is greater than the threshold and |
200 // the luminance is less than the threshold. | 196 // the luminance is less than the threshold. |
201 var show = (alpha >= cvox.BrailleDisplayManager.ALPHA_THRESHOLD_ && | 197 var show = |
202 luminance < cvox.BrailleDisplayManager.LUMINANCE_THRESHOLD_); | 198 (alpha >= cvox.BrailleDisplayManager.ALPHA_THRESHOLD_ && |
| 199 luminance < cvox.BrailleDisplayManager.LUMINANCE_THRESHOLD_); |
203 outputData.push(show); | 200 outputData.push(show); |
204 } | 201 } |
205 | 202 |
206 // Convert black-and-white array to the proper encoding for Braille cells. | 203 // Convert black-and-white array to the proper encoding for Braille |
| 204 // cells. |
207 var brailleBuf = new ArrayBuffer(rows * columns); | 205 var brailleBuf = new ArrayBuffer(rows * columns); |
208 var view = new Uint8Array(brailleBuf); | 206 var view = new Uint8Array(brailleBuf); |
209 for (var i = 0; i < rows; i++) { | 207 for (var i = 0; i < rows; i++) { |
210 for (var j = 0; j < columns; j++) { | 208 for (var j = 0; j < columns; j++) { |
211 // Index in braille array | 209 // Index in braille array |
212 var brailleIndex = i * columns + j; | 210 var brailleIndex = i * columns + j; |
213 for (var cellColumn = 0; cellColumn < cellWidth; cellColumn++) { | 211 for (var cellColumn = 0; cellColumn < cellWidth; cellColumn++) { |
214 for (var cellRow = 0; cellRow < cellHeight; cellRow++) { | 212 for (var cellRow = 0; cellRow < cellHeight; cellRow++) { |
215 var bitmapIndex = | 213 var bitmapIndex = |
216 (i * columns * cellHeight + j + cellRow * columns) * cellWidth | 214 (i * columns * cellHeight + j + cellRow * columns) * cellWidth + |
217 + cellColumn; | 215 cellColumn; |
218 if (outputData[bitmapIndex]) { | 216 if (outputData[bitmapIndex]) { |
219 view[brailleIndex] += | 217 view[brailleIndex] += |
220 cvox.BrailleDisplayManager.COORDS_TO_BRAILLE_DOT_[ | 218 cvox.BrailleDisplayManager.COORDS_TO_BRAILLE_DOT_ |
221 cellColumn * maxCellHeight + cellRow]; | 219 [cellColumn * maxCellHeight + cellRow]; |
222 } | 220 } |
223 } | 221 } |
224 } | 222 } |
225 } | 223 } |
226 } | 224 } |
227 | 225 |
228 if (this.realDisplayState_.available) { | 226 if (this.realDisplayState_.available) { |
229 chrome.brailleDisplayPrivate.writeDots( | 227 chrome.brailleDisplayPrivate.writeDots( |
230 brailleBuf, | 228 brailleBuf, this.displayState_.textColumnCount, |
231 this.displayState_.textColumnCount, | |
232 this.displayState_.textRowCount); | 229 this.displayState_.textRowCount); |
233 } | 230 } |
234 if (cvox.BrailleCaptionsBackground.isEnabled()) { | 231 if (cvox.BrailleCaptionsBackground.isEnabled()) { |
235 cvox.BrailleCaptionsBackground.setImageContent( | 232 cvox.BrailleCaptionsBackground.setImageContent(brailleBuf, rows, columns); |
236 brailleBuf, rows, columns); | |
237 } | 233 } |
238 }).bind(this); | 234 }.bind(this); |
239 }; | 235 }; |
240 | 236 |
241 | 237 |
242 /** | 238 /** |
243 * Sets the command listener. When a command is invoked, the listener will be | 239 * Sets the command listener. When a command is invoked, the listener will be |
244 * called with the BrailleKeyEvent corresponding to the command and the content | 240 * called with the BrailleKeyEvent corresponding to the command and the content |
245 * that was present on the display when the command was invoked. The content | 241 * that was present on the display when the command was invoked. The content |
246 * is guaranteed to be identical to an object previously used as the parameter | 242 * is guaranteed to be identical to an object previously used as the parameter |
247 * to cvox.BrailleDisplayManager.setContent, or null if no content was set. | 243 * to cvox.BrailleDisplayManager.setContent, or null if no content was set. |
248 * @param {function(!cvox.BrailleKeyEvent, !cvox.NavBraille)} func The listener. | 244 * @param {function(!cvox.BrailleKeyEvent, !cvox.NavBraille)} func The listener. |
(...skipping 12 matching lines...) Expand all Loading... |
261 | 257 |
262 | 258 |
263 /** | 259 /** |
264 * @param {{available: boolean, textRowCount: (number|undefined), | 260 * @param {{available: boolean, textRowCount: (number|undefined), |
265 * textColumnCount: (number|undefined)}} newState Display state reported | 261 * textColumnCount: (number|undefined)}} newState Display state reported |
266 * by the extension API. Note that the type is almost the same as | 262 * by the extension API. Note that the type is almost the same as |
267 * cvox.BrailleDisplayState except that the extension API allows | 263 * cvox.BrailleDisplayState except that the extension API allows |
268 * some fields to be undefined, while cvox.BrailleDisplayState does not. | 264 * some fields to be undefined, while cvox.BrailleDisplayState does not. |
269 * @private | 265 * @private |
270 */ | 266 */ |
271 cvox.BrailleDisplayManager.prototype.refreshDisplayState_ = function( | 267 cvox.BrailleDisplayManager.prototype.refreshDisplayState_ = function(newState) { |
272 newState) { | |
273 var oldColumnCount = this.displayState_.textColumnCount || 0; | 268 var oldColumnCount = this.displayState_.textColumnCount || 0; |
274 var oldRowCount = this.displayState_.textRowCount || 0; | 269 var oldRowCount = this.displayState_.textRowCount || 0; |
275 var processDisplayState = function(displayState) { | 270 var processDisplayState = function(displayState) { |
276 this.displayState_ = displayState; | 271 this.displayState_ = displayState; |
277 var newColumnCount = displayState.textColumnCount || 0; | 272 var newColumnCount = displayState.textColumnCount || 0; |
278 var newRowCount = displayState.textRowCount || 0; | 273 var newRowCount = displayState.textRowCount || 0; |
279 | 274 |
280 if (oldColumnCount != newColumnCount || oldRowCount != newRowCount) { | 275 if (oldColumnCount != newColumnCount || oldRowCount != newRowCount) { |
281 this.panStrategy_.setDisplaySize(newRowCount, newColumnCount); | 276 this.panStrategy_.setDisplaySize(newRowCount, newColumnCount); |
282 } | 277 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 * braille captions display. | 309 * braille captions display. |
315 * @private | 310 * @private |
316 */ | 311 */ |
317 cvox.BrailleDisplayManager.prototype.refresh_ = function() { | 312 cvox.BrailleDisplayManager.prototype.refresh_ = function() { |
318 if (!this.displayState_.available) { | 313 if (!this.displayState_.available) { |
319 return; | 314 return; |
320 } | 315 } |
321 var brailleBuf = this.panStrategy_.getCurrentBrailleViewportContents(); | 316 var brailleBuf = this.panStrategy_.getCurrentBrailleViewportContents(); |
322 var textBuf = this.panStrategy_.getCurrentTextViewportContents(); | 317 var textBuf = this.panStrategy_.getCurrentTextViewportContents(); |
323 if (this.realDisplayState_.available) { | 318 if (this.realDisplayState_.available) { |
324 chrome.brailleDisplayPrivate.writeDots(brailleBuf, | 319 chrome.brailleDisplayPrivate.writeDots( |
325 brailleBuf.byteLength, 1); | 320 brailleBuf, brailleBuf.byteLength, 1); |
326 } | 321 } |
327 if (cvox.BrailleCaptionsBackground.isEnabled()) { | 322 if (cvox.BrailleCaptionsBackground.isEnabled()) { |
328 cvox.BrailleCaptionsBackground.setContent(textBuf, brailleBuf, | 323 cvox.BrailleCaptionsBackground.setContent( |
329 this.panStrategy_.brailleToText, this.panStrategy_.offsetsForSlices, | 324 textBuf, brailleBuf, this.panStrategy_.brailleToText, |
330 this.displayState_.textRowCount, this.displayState_.textColumnCount); | 325 this.panStrategy_.offsetsForSlices, this.displayState_.textRowCount, |
| 326 this.displayState_.textColumnCount); |
331 } | 327 } |
332 }; | 328 }; |
333 | 329 |
334 /** | 330 /** |
335 * @param {!cvox.NavBraille} newContent New display content. | 331 * @param {!cvox.NavBraille} newContent New display content. |
336 * @param {cvox.ExpandingBrailleTranslator.ExpansionType} newExpansionType | 332 * @param {cvox.ExpandingBrailleTranslator.ExpansionType} newExpansionType |
337 * How the value part of of the new content should be expanded | 333 * How the value part of of the new content should be expanded |
338 * with regards to contractions. | 334 * with regards to contractions. |
339 * @private | 335 * @private |
340 */ | 336 */ |
(...skipping 26 matching lines...) Expand all Loading... |
367 translatedEndIndex = cells.byteLength; | 363 translatedEndIndex = cells.byteLength; |
368 } else { | 364 } else { |
369 translatedEndIndex = textToBraille[endIndex]; | 365 translatedEndIndex = textToBraille[endIndex]; |
370 } | 366 } |
371 // Add the cursor to cells. | 367 // Add the cursor to cells. |
372 this.writeCursor_(cells, translatedStartIndex, translatedEndIndex); | 368 this.writeCursor_(cells, translatedStartIndex, translatedEndIndex); |
373 targetPosition = translatedStartIndex; | 369 targetPosition = translatedStartIndex; |
374 } else { | 370 } else { |
375 targetPosition = 0; | 371 targetPosition = 0; |
376 } | 372 } |
377 this.panStrategy_.setContent(this.content_.text.toString(), | 373 this.panStrategy_.setContent( |
378 cells, brailleToText, targetPosition); | 374 this.content_.text.toString(), cells, brailleToText, targetPosition); |
379 | 375 |
380 this.refresh_(); | 376 this.refresh_(); |
381 }.bind(this); | 377 }.bind(this); |
382 | 378 |
383 var translator = this.translatorManager_.getExpandingTranslator(); | 379 var translator = this.translatorManager_.getExpandingTranslator(); |
384 if (!translator) { | 380 if (!translator) { |
385 writeTranslatedContent(new ArrayBuffer(0), [], []); | 381 writeTranslatedContent(new ArrayBuffer(0), [], []); |
386 } else { | 382 } else { |
387 translator.translate( | 383 translator.translate( |
388 newContent.text, | 384 newContent.text, newExpansionType, writeTranslatedContent); |
389 newExpansionType, | |
390 writeTranslatedContent); | |
391 } | 385 } |
392 }; | 386 }; |
393 | 387 |
394 | 388 |
395 /** | 389 /** |
396 * @param {cvox.BrailleKeyEvent} event The key event. | 390 * @param {cvox.BrailleKeyEvent} event The key event. |
397 * @private | 391 * @private |
398 */ | 392 */ |
399 cvox.BrailleDisplayManager.prototype.onKeyEvent_ = function(event) { | 393 cvox.BrailleDisplayManager.prototype.onKeyEvent_ = function(event) { |
400 switch (event.command) { | 394 switch (event.command) { |
401 case cvox.BrailleKeyCommand.PAN_LEFT: | 395 case cvox.BrailleKeyCommand.PAN_LEFT: |
402 this.panLeft_(); | 396 this.panLeft_(); |
403 break; | 397 break; |
404 case cvox.BrailleKeyCommand.PAN_RIGHT: | 398 case cvox.BrailleKeyCommand.PAN_RIGHT: |
405 this.panRight_(); | 399 this.panRight_(); |
406 break; | 400 break; |
407 case cvox.BrailleKeyCommand.ROUTING: | 401 case cvox.BrailleKeyCommand.ROUTING: |
408 event.displayPosition = this.brailleToTextPosition_( | 402 event.displayPosition = this.brailleToTextPosition_( |
409 event.displayPosition + this.panStrategy_.viewPort.firstRow * | 403 event.displayPosition + |
410 this.panStrategy_.displaySize.columns); | 404 this.panStrategy_.viewPort.firstRow * |
411 // fall through | 405 this.panStrategy_.displaySize.columns); |
| 406 // fall through |
412 default: | 407 default: |
413 this.commandListener_(event, this.content_); | 408 this.commandListener_(event, this.content_); |
414 break; | 409 break; |
415 } | 410 } |
416 }; | 411 }; |
417 | 412 |
418 | 413 |
419 /** | 414 /** |
420 * Shift the display by one full display size and refresh the content. | 415 * Shift the display by one full display size and refresh the content. |
421 * Sends the appropriate command if the display is already at the leftmost | 416 * Sends the appropriate command if the display is already at the leftmost |
422 * position. | 417 * position. |
423 * @private | 418 * @private |
424 */ | 419 */ |
425 cvox.BrailleDisplayManager.prototype.panLeft_ = function() { | 420 cvox.BrailleDisplayManager.prototype.panLeft_ = function() { |
426 if (this.panStrategy_.previous()) { | 421 if (this.panStrategy_.previous()) { |
427 this.refresh_(); | 422 this.refresh_(); |
428 } else { | 423 } else { |
429 this.commandListener_({ | 424 this.commandListener_( |
430 command: cvox.BrailleKeyCommand.PAN_LEFT | 425 {command: cvox.BrailleKeyCommand.PAN_LEFT}, this.content_); |
431 }, this.content_); | |
432 } | 426 } |
433 }; | 427 }; |
434 | 428 |
435 | 429 |
436 /** | 430 /** |
437 * Shifts the display position to the right by one full display size and | 431 * Shifts the display position to the right by one full display size and |
438 * refreshes the content. Sends the appropriate command if the display is | 432 * refreshes the content. Sends the appropriate command if the display is |
439 * already at its rightmost position. | 433 * already at its rightmost position. |
440 * @private | 434 * @private |
441 */ | 435 */ |
442 cvox.BrailleDisplayManager.prototype.panRight_ = function() { | 436 cvox.BrailleDisplayManager.prototype.panRight_ = function() { |
443 if (this.panStrategy_.next()) { | 437 if (this.panStrategy_.next()) { |
444 this.refresh_(); | 438 this.refresh_(); |
445 } else { | 439 } else { |
446 this.commandListener_({ | 440 this.commandListener_( |
447 command: cvox.BrailleKeyCommand.PAN_RIGHT | 441 {command: cvox.BrailleKeyCommand.PAN_RIGHT}, this.content_); |
448 }, this.content_); | |
449 } | 442 } |
450 }; | 443 }; |
451 | 444 |
452 /** | 445 /** |
453 * Writes a cursor in the specified range into translated content. | 446 * Writes a cursor in the specified range into translated content. |
454 * @param {ArrayBuffer} buffer Buffer to add cursor to. | 447 * @param {ArrayBuffer} buffer Buffer to add cursor to. |
455 * @param {number} startIndex The start index to place the cursor. | 448 * @param {number} startIndex The start index to place the cursor. |
456 * @param {number} endIndex The end index to place the cursor (exclusive). | 449 * @param {number} endIndex The end index to place the cursor (exclusive). |
457 * @private | 450 * @private |
458 */ | 451 */ |
(...skipping 16 matching lines...) Expand all Loading... |
475 }; | 468 }; |
476 | 469 |
477 /** | 470 /** |
478 * Returns the text position corresponding to an absolute braille position, | 471 * Returns the text position corresponding to an absolute braille position, |
479 * that is not accounting for the current pan position. | 472 * that is not accounting for the current pan position. |
480 * @private | 473 * @private |
481 * @param {number} braillePosition Braille position relative to the startof | 474 * @param {number} braillePosition Braille position relative to the startof |
482 * the translated content. | 475 * the translated content. |
483 * @return {number} The mapped position in code units. | 476 * @return {number} The mapped position in code units. |
484 */ | 477 */ |
485 cvox.BrailleDisplayManager.prototype.brailleToTextPosition_ = | 478 cvox.BrailleDisplayManager.prototype.brailleToTextPosition_ = function( |
486 function(braillePosition) { | 479 braillePosition) { |
487 var mapping = this.panStrategy_.brailleToText; | 480 var mapping = this.panStrategy_.brailleToText; |
488 if (braillePosition < 0) { | 481 if (braillePosition < 0) { |
489 // This shouldn't happen. | 482 // This shouldn't happen. |
490 console.error('WARNING: Braille position < 0: ' + braillePosition); | 483 console.error('WARNING: Braille position < 0: ' + braillePosition); |
491 return 0; | 484 return 0; |
492 } else if (braillePosition >= mapping.length) { | 485 } else if (braillePosition >= mapping.length) { |
493 // This happens when the user clicks on the right part of the display | 486 // This happens when the user clicks on the right part of the display |
494 // when it is not entirely filled with content. Allow addressing the | 487 // when it is not entirely filled with content. Allow addressing the |
495 // position after the last character. | 488 // position after the last character. |
496 return this.content_.text.length; | 489 return this.content_.text.length; |
497 } else { | 490 } else { |
498 return mapping[braillePosition]; | 491 return mapping[braillePosition]; |
499 } | 492 } |
500 }; | 493 }; |
501 | 494 |
502 /** | 495 /** |
503 * @param {boolean} wordWrap | 496 * @param {boolean} wordWrap |
504 * @private | 497 * @private |
505 */ | 498 */ |
506 cvox.BrailleDisplayManager.prototype.updatePanStrategy_ = function(wordWrap) { | 499 cvox.BrailleDisplayManager.prototype.updatePanStrategy_ = function(wordWrap) { |
507 this.panStrategy_.setPanStrategy(wordWrap); | 500 this.panStrategy_.setPanStrategy(wordWrap); |
508 this.refresh_(); | 501 this.refresh_(); |
509 }; | 502 }; |
OLD | NEW |