DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bitblt_coords *src, const BITMAPINFO *dst_info, void *dst_bits ) { dib_info src_dib, dst_dib; DWORD ret; init_dib_info_from_bitmapinfo( &src_dib, src_info, src_bits ); init_dib_info_from_bitmapinfo( &dst_dib, dst_info, dst_bits ); __TRY { dst_dib.funcs->convert_to( &dst_dib, &src_dib, &src->visrect, FALSE ); ret = TRUE; } __EXCEPT_PAGE_FAULT { WARN( "invalid bits pointer %p\n", src_bits ); ret = FALSE; } __ENDTRY if(!ret) return ERROR_BAD_FORMAT; /* update coordinates, the destination rectangle is always stored at 0,0 */ src->x -= src->visrect.left; src->y -= src->visrect.top; offset_rect( &src->visrect, -src->visrect.left, -src->visrect.top ); return ERROR_SUCCESS; }
DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bitblt_coords *src, const BITMAPINFO *dst_info, void *dst_bits, BOOL add_alpha ) { dib_info src_dib, dst_dib; DWORD ret; if ( !init_dib_info_from_bitmapinfo( &src_dib, src_info, src_bits, 0 ) ) return ERROR_BAD_FORMAT; if ( !init_dib_info_from_bitmapinfo( &dst_dib, dst_info, dst_bits, 0 ) ) return ERROR_BAD_FORMAT; __TRY { dst_dib.funcs->convert_to( &dst_dib, &src_dib, &src->visrect ); ret = TRUE; } __EXCEPT_PAGE_FAULT { WARN( "invalid bits pointer %p\n", src_bits ); ret = FALSE; } __ENDTRY /* We shared the color tables, so there's no need to free the dib_infos here */ if(!ret) return ERROR_BAD_FORMAT; /* update coordinates, the destination rectangle is always stored at 0,0 */ src->x -= src->visrect.left; src->y -= src->visrect.top; offset_rect( &src->visrect, -src->visrect.left, -src->visrect.top ); if (add_alpha && dst_dib.funcs == &funcs_8888 && src_dib.funcs != &funcs_8888) { DWORD *pixel = dst_dib.bits.ptr; int x, y; for (y = src->visrect.top; y < src->visrect.bottom; y++, pixel += dst_dib.stride / 4) for (x = src->visrect.left; x < src->visrect.right; x++) pixel[x] |= 0xff000000; } return ERROR_SUCCESS; }
void dibdrv_set_window_surface( DC *dc, struct window_surface *surface ) { char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; BITMAPINFO *info = (BITMAPINFO *)buffer; RECT rect; void *bits; PHYSDEV windev; struct windrv_physdev *physdev; struct dibdrv_physdev *dibdrv; TRACE( "%p %p\n", dc->hSelf, surface ); windev = pop_dc_driver( dc, &window_driver ); if (surface) { if (windev) push_dc_driver( &dc->physDev, windev, windev->funcs ); else { if (!window_driver.pCreateDC( &dc->physDev, NULL, NULL, NULL, NULL )) return; windev = find_dc_driver( dc, &window_driver ); } physdev = get_windrv_physdev( windev ); window_surface_add_ref( surface ); if (physdev->surface) window_surface_release( physdev->surface ); physdev->surface = surface; dibdrv = physdev->dibdrv; bits = surface->funcs->get_info( surface, info ); init_dib_info_from_bitmapinfo( &dibdrv->dib, info, bits ); /* clip the device rect to the surface */ rect = surface->rect; offset_rect( &rect, dc->device_rect.left, dc->device_rect.top ); intersect_rect( &dc->device_rect, &dc->device_rect, &rect ); dibdrv->dib.rect = dc->vis_rect; offset_rect( &dibdrv->dib.rect, -rect.left, -rect.top ); dibdrv->bounds = surface->funcs->get_bounds( surface ); DC_InitDC( dc ); } else if (windev) { dib_driver.pDeleteDC( pop_dc_driver( dc, &dib_driver )); windev->funcs->pDeleteDC( windev ); DC_InitDC( dc ); } }
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 ); }