postMessage ArrayBuffer для собственного клиентского модуля из JavaScript
Я хотел бы отправить изображение HTML-холста в модуль NaCl в Google Chrome. На "стороне домика" у меня есть следующий код:
var NaClModule = .... // NaCl module denoted by <embed> tag
var canvas = .... // canvas element
canvas.addEventListener('click', function() {
var imageData = this.getContext('2d').getImageData(0, 0, this.width, this.height);
NaClModule.postMessage(imageData.data);
});
imageData.data
имеет тип Uint8ClampedArray
на консоли JavaScript. Таким образом, я предположил, что модуль NaCl видит передаваемые данные как pp::VarArrayBuffer
Однако модуль NaCl фактически принимает переданные данные как pp::VarDictionary
с ключом = индексом исходного массива и значением = значением исходного массива (подтверждается pp::Var::DebugString
).
Это ожидаемое поведение? Если нет, что не так с моим кодом?
Или есть другой способ передачи изображения в модуль NaCl?
1 ответ
Передача холста в модуль NaCl выполняется в примере с Earth для загрузки текстуры из JPEG (см. Examples/demo/earth в SDK).
Вот фрагмент из этого примера:
var imageData = context.getImageData(0, 0, img.width, img.height);
// Send NaCl module the raw image data obtained from canvas.
common.naclModule.postMessage({'message' : 'texture',
'name' : name,
'width' : img.width,
'height' : img.height,
'data' : imageData.data.buffer});
Похоже, вам просто нужно изменить свой код на это:
NaClModule.postMessage(imageData.data.buffer);
И это должно работать.