У меня есть конкретный случай, но мне также любопытно в целом.Как установить свойство типизированного объекта при сохранении его типа?
У меня есть холст, я получаю его ImgData с помощью createImageData, и я установил его свойство данных как нечто другое, чтобы затем использовать PutImageData и передать ему этот модифицированный ImgData.
Моя версия PureScript не работает, хотя запись логики в Javascript в консоли работает безупречно. Ошибка:
foreign.js:423 Uncaught TypeError: Failed to execute 'putImageData' on 'CanvasRenderingContext2D':
parameter 1 is not of type 'ImageData'.
В PureScript:
getCleanBuffer :: forall e. Context2D -> Eff (canvas :: Canvas | e) ImageData
getCleanBuffer ctx = do
imgData <- getImageData ctx 0.0 0.0 160.0 144.0
return imgData { data = buffer }
where buffer = asUint8ClampedArray $ A.replicate (160*144*4) 0
Запись этого JavaScript в консольных работы (обр 160 * 144 * 4 нулей)
var arr2 = new Uint8ClampedArray(arr);
var imgData = ctx.getImageData(0,0,160,144);
imgData.data = arr2;
ctx.putImageData(imgData,0,0);
Я отлаженный getCleanBuffer и вот что я нашел
var getCleanBuffer = function (ctx) {
var buffer = Data_TypedArray.asUint8ClampedArray(Data_Array.replicate((160 * 144 | 0) * 4 | 0)(0));
return function __do() {
var v = Graphics_Canvas.getImageData(ctx)(0.0)(0.0)(160.0)(144.0)();
var $9 = {};
for (var $10 in v) {
if (v.hasOwnProperty($10)) {
$9[$10] = v[$10];
};
};
$9.data = buffer;
return $9;
Эта переменная $ 9 (копия ImgData с измененными данными) при проверке обнаруживает, что она не является типом ImgData, например v (исходная ImgData), но это просто «объект». Отсутствует ширина и высота, которые у v, но даже когда я исправляю ее во время отладки, я все равно получаю ту же ошибку.
Я думаю, проблема в том, что новый объект является беспричинной записью. Еще одна проблема заключается в том, что ширина и высота не были скопированы.
Я могу написать функцию javascript для установки атрибута данных вручную. Но этот случай в целом кажется общим, конечно, я чего-то не хватает, не так ли?
Спасибо!
Это похоже на ошибку в библиотеке холста. Не могли бы вы подать там какой-нибудь вопрос? –
Сначала я думал, что вы имеете в виду ошибку в холсте HTML5. После просмотра отчета об ошибке gb. Открылся, понял. Но что же тогда должен был ImgData? Не совсем, просто в общем. – PsyFish