私には特定のケースがありますが、一般的にも興味があります。
キャンバスがあり、createImageData を使用して ImgData を取得し、データ プロパティを別のものに設定して、PutImageData を使用し、この変更された ImgData を渡します。
コンソールで Javascript でロジックを記述しても問題なく動作しますが、私の PureScript バージョンは失敗します。エラーは次のとおりです。
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 をコンソールに書き込むと動作します (arr は 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 のコピー) 変数を調べると、v (元の ImgData) のように ImgData 型ではないことがわかりますが、それは単なる「オブジェクト」です。v の幅と高さがありませんが、デバッグ中に修正しても同じエラーが発生します。
問題は、新しいオブジェクトが型のないレコードであることだと思います。幅と高さがコピーされていないという事実は、別の問題です。
データ属性を手動で設定する JavaScript 関数を記述できます。しかし、このケースは一般的によくあるケースのように思えますが、確かに何かが欠けているのではないでしょうか?
ありがとう!