1

ポインター オーバーランまたはハードウェア固有のバグのすべての特徴を備えた FMX の奇妙なバグがあり、追跡できませんでした。それを再現するための小さなアプリはありません(まだ)以下にコードスニペットがありますが、小さなアプリケーションでこれを再現できなかったため、それらは単なるスニペットです。

アプリはいくつかの PNG ファイルを読み込み、PNG ファイルの色分けに基づいてメモリ内ビットマップを作成します。最初は空白。メモリ内のビットマップと同じサイズのバイト配列があります。これは、そのピクセルが元の赤い (たとえば) 領域に対応するかどうかを示すマスク (ゼロ、ゼロ以外) です。ユーザーはアプリでペイントし、一時的な表示ビットマップにペイントし、マウス ボタンを離すと、そのビットマップがバイト配列に対してスキャンされ、メモリ内ビットマップに書き込まれます。

ここまで私と?基本的に、オリジナルの色分けされたサブセット、色領域用に作成されたマスク、サブセットへのペイントがマスクされます。これが図です:

ビットマップとマスクの図

これは、XP (GDI+ キャンバス)、Win7 (D2D キャンバス)、Win8.1、およびほとんどの Win10 マシンで正常に動作します。ただし、1 つは Intel HD 4600 を搭載し、もう 1 つは Intel Iris 5000 を搭載した 2 つの Win10 マシンでは、マスキングとピクセルの設定のステップを実行した後、クライアントはビットマップに奇妙なアーティファクトを取得します。

アーティファクトは、ビットマップ上に明らかにランダムに散在する長方形で、大きい (100x20px など) か小さい (10x8 など) かのいずれかです。また、ボタン グリフなど、UI の残りの部分もビットマップに表示されているスクリーンショットを見てきました。スクリーンショットの例を次に示します。

例 1 - 小さな長方形

ここでは、ユーザーはすでに濃い赤の領域をペイントしており、明るい色を別の場所にペイントしています。これらの小さな斑点のある長方形が表示されます。

例 2 - 大きな長方形

ここでは、ユーザーが幅広のストライプを中央にペイントしています。濃い赤と薄い赤の四角形は、マスクしてビットマップに描画した後のアーティファクトの例です。

私には、間違ったストライドか何かでピクセルを書いているように聞こえます。配列またはビットマップ データ アクセスのオフ バイ ワン エラーについてコードを厳密に検査し、次のコードを使用してビットマップ データのピクセルを取得または設定しています。

function GetBitmapColor(const M : PBitmapData; const X, Y : Integer) : TAlphaColor;
begin
  Result := PixelToAlphaColor(
    @PAlphaColorArray(M.Data)[Y * (M.Pitch div PixelFormatBytes[M.PixelFormat]) + X],
    M.PixelFormat);
end;

procedure SetBitmapColor(const M : PBitmapData; const X, Y : Integer; const C : TAlphaColor);
begin
  AlphaColorToPixel(C,
    @PAlphaColorArray(M.Data)[Y * (M.Pitch div PixelFormatBytes[M.PixelFormat]) + X],
    M.PixelFormat);
end;

これらは、シアトルのドキュメントにあるビットマップ データにアクセスするためのサンプル コードに基づいています。X と Y が (ビットマップ サイズで) 有効な範囲内にあるというアサーションはすべて問題ありません。これは上記の OS とハードウェアで発生しますが、同じ OS (Win10) と他のカード (別の Intel HD、Nvidia など) では発生しません。Win10 タブレットで。私が試したWin10 VMで。私のWin7開発マシンで。バッファオーバーランなどに関する限り、範囲チェックをオンにしてコンパイルしてもエラーは発生せず、ビットマップサイズに対して有効なX / Y座標をチェックする自分自身のアサートもありません。

このエラーは、同じマシン上の XE6 と Seattle の両方で発生します。

これを再現できません。彼らはこのマシンへのリモート アクセスをセットアップしている最中ですが、何が起こっているのかを把握するのはまだ難しいでしょう。そのため、誰かが以前にこのようなことを見たことがあるのか​​ 、または確認する具体的な方法の具体的な提案があるのだろうかと思います.ビットマップ ポインタ オーバーランまたは同様のものですか?

4

0 に答える 0