1

私には特定のケースがありますが、一般的にも興味があります。

キャンバスがあり、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 関数を記述できます。しかし、このケースは一般的によくあるケースのように思えますが、確かに何かが欠けているのではないでしょうか?

ありがとう!

4

2 に答える 2