毎度俺様メモなのですが…(近いうちにトップのページに現れないように直します).
症状
ビットマップを含むメタファイルをSetWorldTransformで180度回転したデバイスコンテキストに描画するとビットマップだけ描画されない
var xf: TXForm; // XForm begin xf.eM11 := -1; // Cos(180°) xf.eM12 := 0; // Sin(180°) xf.eM21 := -0; // -Sin(180°) xf.eM22 := -1; // Cos(180°) xf.eDx := Printer.Width; xf.eDy := 2 * Printer.Height; SetWorldTransform(Printer.Canvas.Handle, xf); Printer.Canvas.Draw(MyMetafile); //※以下略
環境
Borland Delphi 5
不具合の発生条件
少なくとも,Windows 2000で180°回転を意図してem12, em21に180°の正弦値として0を指定したとき.
処方
180°の時には定数0を指定せずに sin(pi) などを使う.
メモ
いくつかの角度で試しただけですがその中で不具合が発生したのは180°のときでかつ定数(この場合は0)を指定した場合のみでした.Sin関数を使った場合は正常に動作しました.驚いたことに統合環境で関数の戻り値を見ると0ではなくて-5.4210108624e-20となっていました.
Delphiでは浮動小数の0を表現するのに 0 を使ってはいけないのかと思って int(0.1) (小数点以下を切り捨てて浮動小数形式で返す)も試してみましたが戻り値を見てみるとやはり0で不具合が起きましたので0を渡してはいけないようです.