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);

И это должно работать.

Другие вопросы по тегам