BOOL init_dib_info_from_bitmapobj(dib_info *dib, BITMAPOBJ *bmp) { if (!is_bitmapobj_dib( bmp )) { BITMAPINFO info; get_ddb_bitmapinfo( bmp, &info ); if (!bmp->dib.dsBm.bmBits) { int width_bytes = get_dib_stride( bmp->dib.dsBm.bmWidth, bmp->dib.dsBm.bmBitsPixel ); bmp->dib.dsBm.bmBits = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, bmp->dib.dsBm.bmHeight * width_bytes ); if (!bmp->dib.dsBm.bmBits) return FALSE; } init_dib_info_from_bitmapinfo( dib, &info, bmp->dib.dsBm.bmBits ); } else init_dib_info( dib, &bmp->dib.dsBmih, bmp->dib.dsBitfields, bmp->color_table, bmp->dib.dsBm.bmBits ); return TRUE; }
BOOL init_dib_info_from_bitmapobj(dib_info *dib, BITMAPOBJ *bmp, enum dib_info_flags flags) { if (!bmp->dib) { char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; BITMAPINFO *info = (BITMAPINFO *)buffer; get_ddb_bitmapinfo( bmp, info ); if (!bmp->bitmap.bmBits) { int width_bytes = get_dib_stride( bmp->bitmap.bmWidth, bmp->bitmap.bmBitsPixel ); bmp->bitmap.bmBits = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, bmp->bitmap.bmHeight * width_bytes ); if (!bmp->bitmap.bmBits) return FALSE; } return init_dib_info_from_bitmapinfo( dib, info, bmp->bitmap.bmBits, flags | private_color_table ); } return init_dib_info( dib, &bmp->dib->dsBmih, bmp->dib->dsBitfields, bmp->color_table, bmp->nb_colors, bmp->dib->dsBm.bmBits, flags ); }
static void set_initial_bitmap_bits( HBITMAP hbitmap, BITMAPOBJ *bmp ) { char src_bmibuf[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; BITMAPINFO *src_info = (BITMAPINFO *)src_bmibuf; char dst_bmibuf[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; BITMAPINFO *dst_info = (BITMAPINFO *)dst_bmibuf; DWORD err; struct gdi_image_bits bits; struct bitblt_coords src, dst; if (!bmp->bitmap.bmBits) return; if (bmp->funcs->pPutImage == nulldrv_PutImage) return; get_ddb_bitmapinfo( bmp, src_info ); bits.ptr = bmp->bitmap.bmBits; bits.is_copy = FALSE; bits.free = NULL; bits.param = NULL; src.x = 0; src.y = 0; src.width = bmp->bitmap.bmWidth; src.height = bmp->bitmap.bmHeight; src.visrect.left = 0; src.visrect.top = 0; src.visrect.right = bmp->bitmap.bmWidth; src.visrect.bottom = bmp->bitmap.bmHeight; dst = src; copy_bitmapinfo( dst_info, src_info ); err = bmp->funcs->pPutImage( NULL, hbitmap, 0, dst_info, &bits, &src, &dst, 0 ); if (err == ERROR_BAD_FORMAT) { err = convert_bits( src_info, &src, dst_info, &bits, FALSE ); if (!err) err = bmp->funcs->pPutImage( NULL, hbitmap, 0, dst_info, &bits, &src, &dst, 0 ); if (bits.free) bits.free( &bits ); } }