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

Unified Diff: chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js

Issue 2544203004: Display images in multiline Braille
Patch Set: set upstream to correct branch Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js b/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js
index 6cecbd94e22171373885a40e976446c256009725..8a906a70f2d86b08d48273790c2381490213186e 100644
--- a/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js
+++ b/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js
@@ -75,6 +75,10 @@ cvox.BrailleDisplayManager = function(translatorManager) {
if (area == 'local' && 'brailleWordWrap' in changes) {
this.updatePanStrategy_(changes.brailleWordWrap.newValue);
}
+ if (area == 'local' && ('virtualBrailleRows' in changes ||
dmazzoni 2016/12/05 17:29:40 This should probably be part of the previous chang
ultimatedbz 2016/12/05 19:37:38 Done.
+ 'virtualBrailleColumns' in changes)) {
+ this.onCaptionsStateChanged_();
+ }
}.bind(this));
chrome.storage.local.get({brailleWordWrap: true}, function(items) {
this.updatePanStrategy_(items.brailleWordWrap);
@@ -119,6 +123,121 @@ cvox.BrailleDisplayManager.prototype.setContent = function(
/**
+ * Takes a imageDataUrl and displays it in braille onto the physical braille
dmazzoni 2016/12/05 17:29:40 Takes an image, in the form of a data url,
ultimatedbz 2016/12/05 19:32:00 Done.
+ * display and the virtual braille captions display.
+ * @param {!string} imageUrl The imageDataUrl of the image to display.
dmazzoni 2016/12/05 17:29:40 Same, "The image, in the form of a data url" or so
ultimatedbz 2016/12/05 19:32:01 Done.
+ */
+cvox.BrailleDisplayManager.prototype.setImageContent = function(imageUrl) {
+ var rows = this.displayState_.textRowCount;
+ var columns = this.displayState_.textColumnCount;
+ var imageDataUrl = imageUrl;
+ var imgElement = document.createElement('img');
+ imgElement.src = imageDataUrl;
+ var c1 = document.createElement('canvas');
dmazzoni 2016/12/05 17:29:40 var canvas
ultimatedbz 2016/12/05 19:32:01 Done.
+ var context = c1.getContext('2d');
+ c1.width = imgElement.width;
+ c1.height = imgElement.height;
+ context.drawImage(imgElement, 0, 0);
+ var originalImageData = context.getImageData(0, 0, c1.width, c1.height);
+ var originalData = originalImageData.data;
+
+ // Convert image to black and white.
+ var c2 = document.createElement('canvas');
dmazzoni 2016/12/05 17:29:40 You probably don't need two canvases for this, rig
ultimatedbz 2016/12/05 19:32:01 Done.
+ var context2 = c2.getContext('2d');
+ c2.width = imgElement.width;
+ c2.height = imgElement.height;
+ var blackWhiteData = [];
+ for (var i = 0; i < originalData.length; i += 4) {
+ // If the alpha value is transparent (less than 20) or the pixel is
+ // white(over 600), don't show.
+ var value = (originalData[i] +
+ originalData[i + 1] +
+ originalData[i + 2] > 200 * 3) ||
+ (originalData[i + 3]) < 20 ? 0 : 255;
+ blackWhiteData[i] = value;
+ blackWhiteData[i + 1] = value;
+ blackWhiteData[i + 2] = value;
+ }
+ var blackWhiteImageData = context2.getImageData(0, 0, c2.width, c2.height);
+ blackWhiteImageData.data = blackWhiteData;
+ context2.putImageData(blackWhiteImageData, 0, 0, 0, 0, c2.width, c2.height);
+
+ // Scaled down to braille dimensions.
dmazzoni 2016/12/05 17:29:40 I think it'd look better to rescale first, then co
ultimatedbz 2016/12/05 19:32:01 That's awesome! You can actually specify how big y
+ var c3 = document.createElement('canvas');
+ var context3 = c3.getContext('2d');
+ c3.width = columns * 2;
+ c3.height = rows * 4;
+ var imageData3 = context3.createImageData(c3.width, c3.height);
+ var data3 = imageData3.data;
+ var data = blackWhiteData;
+ var xScale = c2.width / c3.width;
+ var yScale = c2.height / c3.height;
+ for (var i = 0; i < c3.height; i++) {
+ for (var j = 0; j < c3.width; j++) {
+ var newX = Math.floor(j * xScale);
+ var newY = Math.floor(i * yScale);
+ var index = newX * 4 + newY * 4 * c2.width;
+ var index3 = i * 4 * c3.width + 4 * j;
+
+ data3[index3] = data[index];
+ data3[index3 + 1] = data[index + 1];
+ data3[index3 + 2] = data[index + 2];
+ data3[index3 + 3] = data[index + 3];
+ }
+ }
+ context3.putImageData(imageData3, 0, 0);
+
+ // Covert to Braille.
dmazzoni 2016/12/05 17:29:40 Convert
ultimatedbz 2016/12/05 19:32:01 Done.
+ var buf = new ArrayBuffer(rows * columns);
+ var view = new Uint8Array(buf);
+ var dot1 = 0x1;
+ var dot2 = 0x2;
+ var dot3 = 0x4;
+ var dot4 = 0x8;
+ var dot5 = 0x10;
+ var dot6 = 0x20;
+ var dot7 = 0x40;
+ var dot8 = 0x80;
+
+ for (var i = 0; i < rows; i++) {
+ for (var j = 0; j < columns; j++) {
+ //Index in braille array
+ var index = i * columns + j;
+
+ view[index] = 0;
+ if (data3[(i * columns * 4 + j) * 2 * 4] == 255)
dmazzoni 2016/12/05 17:29:40 I'd do something like this: coordsToBrailleDot[0]
ultimatedbz 2016/12/05 19:32:01 This was really clever. On top of this, I made som
+ view[index] += dot1;
+ if (data3[(i * columns * 4 + j + columns) * 2 * 4] == 255)
+ view[index] += dot2;
+ if (data3[(i * columns * 4 + j + 2 * columns) * 2 * 4] == 255)
+ view[index] += dot3;
+ if (data3[(i * columns * 4 + j + 3 * columns) * 2 * 4] == 255)
+ view[index] += dot7;
+
+ if (data3[((i * columns * 4 + j) * 2 + 1) * 4] == 255)
+ view[index] += dot4;
+ if (data3[((i * columns * 4 + j + columns) * 2 + 1) * 4] == 255)
+ view[index] += dot5;
+ if (data3[((i * columns * 4 + j + 2 * columns) * 2 + 1) * 4] == 255)
+ view[index] += dot6;
+ if (data3[((i * columns * 4 + j + 3 * columns) * 2 + 1) * 4] == 255)
+ view[index] += dot8;
+ }
+ }
+
+ if (!this.displayState_.available) {
dmazzoni 2016/12/05 17:29:40 Put this check at the top
ultimatedbz 2016/12/05 19:32:01 Done.
+ return;
+ }
+ if (this.realDisplayState_.available) {
+ chrome.brailleDisplayPrivate.writeDots(buf, buf.byteLength, 1);
+ }
+ if (cvox.BrailleCaptionsBackground.isEnabled()) {
+ cvox.BrailleCaptionsBackground.setImageContent(buf, rows, columns);
+ }
+};
+
+
+/**
* Sets the command listener. When a command is invoked, the listener will be
* called with the BrailleKeyEvent corresponding to the command and the content
* that was present on the display when the command was invoked. The content

Powered by Google App Engine
This is Rietveld 408576698