C++ で記述された GDI オブジェクトをキャッシュする API に取り組んでおり、win32 API を模倣するさまざまな Create メソッドを実装しています。そのようなメソッドの 1 つは、パックされた DIB にCreateDIBPatternBrushPt()
を取り込みます。VOID*
には、ビットマップのピクセルを定義するバイト配列が直後に続く構造体がVOID*
含まれます。BITMAPINFO
パックされた DIB について調査しました。本、Programming Windows、およびウィキペディアによると、長さは行の長さとbiHeight
(のメンバーBITMAPINFOHEADER
)の積に等しくなります。
RowLength = 4 * ((bmi.bcWidth * bmi.bcBitCount + 31) / 32) ;
したがって、現在、私の考えは次のようなことです。
//copy BIMAPINFO to access width and height
//lpPackedDIB is the VOID* parameter of CreateDIBPatternBrushPt()
BITMAPINFO tmpBitmapInfo;
std::memcpy(&tmpBitmapInfo, lpPackedDIB, sizeof(BITMAPINFO));
//copy entire packed DIB
int rowLength = 4 * ((tmpBitmapInfo.bmiHeader.biWidth * tmpBitmapInfo.bmiHeader.biBitCount + 31) / 32);
std::memcpy(m_pPackedDIB, lpPackedDIB, sizeof(BITMAPINFO) + rowLength * std::abs(bitmapInfo.bmiHeader.biHeight));
これはこれを行う有効な方法のように思えますか? また、このロジックを適切にテストできるように、lpPackedDIB
を使用する人がどこから来るのかを知りたいです。CreateDIBPatternBrushPt()
編集:
参照: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183493(v=vs.85).aspx https://en.wikipedia.org/wiki/BMP_file_format#File_structure https:/ /www-user.tu-chemnitz.de/~heha/petzold/ch15b.htm (特に「DIB ピクセル ビット」セクション)