Delphi XE3ではFireMonkeyが2となりました。
いろいろな宣言やユニットの変更が行われていますが、問題はヘルプが追いついていないということで・・・
気づいた変更点を書いていきます。
カラー定数の定義ユニットが変わった
「claWhite」などのカラー定数の定義場所が変わっています。
これは「System.UIConsts」に移動しています。定数を使う場合は自分でusesに書かなければなりません。
Canvas.Scanlineが消えた
TBitmapに高速にピクセルを打つための常套手段、Scanlineプラロパティが消えています。しかしヘルプには「Scanlineを使える」と書いてあり、混乱します。
以下XE3ヘルプから引用
TBitmap はピクセル単位(Pixels、ScanLine)で操作やカスタマイズを行うことができます。低レベルでカスタマイズを行うには、カラービット(StartLine)を使用します。
かなり焦りましたが、Delphi MLで細川さんからアドバイスをいただきました。TBitmap.Map関数でデータへの構造体を取得、それに対して処理を行うようです。ちなみにTBitmap.Mapは説明が入っていません。(;–
以下のコードでScanlineと同等の処理が可能です。
var Bmp: TBitmap; BmpData: TBitmapData; yAddr : Integer; Bmp := TBitmap.Create(300, 300); Bmp.Map(TMapAccess.maWrite, BmpData); for Y := 0 to Bmp.Height - 1 do begin YAddr := Y * Bmp.Height; for X := 0 to Bmp.Width - 1 do PAlphaColorArray(BmpData.Data)^[YAddr + X] := $80FF0000; end; Bmp.Unmap(BmpData); Bmp.Free;
上記の処理で、半透明赤のビットマップが出来上がります。
ちなみに、TBitmapDataにはSetPixelという座標でピクセルにアクセスできるプロパティがあります。
TBitmapData.Dataと比較してみたところ、Data経由でアクセスしたほうが10倍近く速いです。SetPixelはほんの少しの処理なら便利ですが、画像全体に行う処理では使わないほうがよさそうです。
上記の比較をしたソースコード(exe入り)をアップしておきます。
こちらからダウンロードしてみてください。当然ながらDelphi XE3でしかコンパイルできません。