引用:
GDI系の構造体はOS/2 Ver1.?のPM(プレゼンテーションマネージャだったかな?、GUIを管理するシステム)までさかのぼります。
当時のOS/2がターゲットとしていたCPUは286ですので、必然的に構造体のアライメントは2バイト境界となります。
その後、MSとIBMがそれぞれの道を進む事になった際に、Win3.1とOS/2 Ver2へと別々の道を進んでいきます。
GUI系のAPI(名称は別として)は座標の原点が左上か左下の違いしかありませんでした。
Win9x系のディスプレイドライバでGDIを処理するコードは16ビットセグメントで実行します。(DirectX系は32Bitです)
また、WinNT系でもAPIはWin9x系と互換なので過去を引きずっています。(ディスプレイドライバーは32ビット化済みです。)
↑バグ報告板から抜粋
http://www.discoversoft.net/forum/viewt ... =2112#2111
Win32APIってのは、それ自身の設計はかなり古くからあるみたいですね。286の時代ですか、私はいくつだったんでしょう??
VC++をお持ちの方は、のヘッダファイルを見ていただけるとわかりますが、下のような感じでアラインメントの補正が行われています。
コード:
#include <pshpack2.h>
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
#include <poppack.h>
pshpack1.h、pshpack2.h、pshpack4.h、pshpack8.hというファイルが存在し、これがABで言うAlign修飾子相当のものになります。poppack.hでデフォルトの状態に復帰します。
ABのapi_gdi.sbpに関しては、VCのwingdi.hのpshpack*.hをチェックしながら補正を行う必要がありますが、今回はBITMAPFILEHEADERの修正だけで間に合うみたいです。