Commit 39ef9c3a authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

win32u: Move dib.drv implementation from gdi.exe.

parent bc4edb8a
...@@ -23,11 +23,10 @@ ...@@ -23,11 +23,10 @@
#include "windef.h" #include "windef.h"
#include "winbase.h" #include "winbase.h"
#include "wingdi.h" #include "ntgdi.h"
#include "wownt32.h" #include "wownt32.h"
#include "wine/wingdi16.h" #include "wine/wingdi16.h"
#include "wine/list.h" #include "wine/list.h"
#include "wine/gdi_driver.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(gdi); WINE_DEFAULT_DEBUG_CHANNEL(gdi);
...@@ -430,129 +429,6 @@ static void free_segptr_bits( HBITMAP16 bmp ) ...@@ -430,129 +429,6 @@ static void free_segptr_bits( HBITMAP16 bmp )
} }
} }
/* window surface used to implement the DIB.DRV driver */
struct dib_window_surface
{
struct window_surface header;
RECT bounds;
void *bits;
UINT info_size;
BITMAPINFO info; /* variable size, must be last */
};
static struct dib_window_surface *get_dib_surface( struct window_surface *surface )
{
return (struct dib_window_surface *)surface;
}
/***********************************************************************
* dib_surface_lock
*/
static void CDECL dib_surface_lock( struct window_surface *window_surface )
{
/* nothing to do */
}
/***********************************************************************
* dib_surface_unlock
*/
static void CDECL dib_surface_unlock( struct window_surface *window_surface )
{
/* nothing to do */
}
/***********************************************************************
* dib_surface_get_bitmap_info
*/
static void *CDECL dib_surface_get_bitmap_info( struct window_surface *window_surface, BITMAPINFO *info )
{
struct dib_window_surface *surface = get_dib_surface( window_surface );
memcpy( info, &surface->info, surface->info_size );
return surface->bits;
}
/***********************************************************************
* dib_surface_get_bounds
*/
static RECT *CDECL dib_surface_get_bounds( struct window_surface *window_surface )
{
struct dib_window_surface *surface = get_dib_surface( window_surface );
return &surface->bounds;
}
/***********************************************************************
* dib_surface_set_region
*/
static void CDECL dib_surface_set_region( struct window_surface *window_surface, HRGN region )
{
/* nothing to do */
}
/***********************************************************************
* dib_surface_flush
*/
static void CDECL dib_surface_flush( struct window_surface *window_surface )
{
/* nothing to do */
}
/***********************************************************************
* dib_surface_destroy
*/
static void CDECL dib_surface_destroy( struct window_surface *window_surface )
{
struct dib_window_surface *surface = get_dib_surface( window_surface );
TRACE( "freeing %p\n", surface );
HeapFree( GetProcessHeap(), 0, surface );
}
static const struct window_surface_funcs dib_surface_funcs =
{
dib_surface_lock,
dib_surface_unlock,
dib_surface_get_bitmap_info,
dib_surface_get_bounds,
dib_surface_set_region,
dib_surface_flush,
dib_surface_destroy
};
/***********************************************************************
* create_surface
*/
static struct window_surface *create_surface( const BITMAPINFO *info )
{
struct dib_window_surface *surface;
int color = 0;
if (info->bmiHeader.biBitCount <= 8)
color = info->bmiHeader.biClrUsed ? info->bmiHeader.biClrUsed : (1 << info->bmiHeader.biBitCount);
else if (info->bmiHeader.biCompression == BI_BITFIELDS)
color = 3;
surface = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
offsetof( struct dib_window_surface, info.bmiColors[color] ));
if (!surface) return NULL;
surface->header.funcs = &dib_surface_funcs;
surface->header.rect.left = 0;
surface->header.rect.top = 0;
surface->header.rect.right = info->bmiHeader.biWidth;
surface->header.rect.bottom = abs(info->bmiHeader.biHeight);
surface->header.ref = 1;
surface->info_size = offsetof( BITMAPINFO, bmiColors[color] );
surface->bits = (char *)info + surface->info_size;
memcpy( &surface->info, info, surface->info_size );
TRACE( "created %p %lux%lu for info %p bits %p\n",
surface, surface->header.rect.right, surface->header.rect.bottom, info, surface->bits );
return &surface->header;
}
/*********************************************************************** /***********************************************************************
* SetBkColor (GDI.1) * SetBkColor (GDI.1)
...@@ -1299,19 +1175,8 @@ HDC16 WINAPI CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output, ...@@ -1299,19 +1175,8 @@ HDC16 WINAPI CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output,
{ {
if (!lstrcmpiA( driver, "dib" ) || !lstrcmpiA( driver, "dirdib" )) if (!lstrcmpiA( driver, "dib" ) || !lstrcmpiA( driver, "dirdib" ))
{ {
struct window_surface *surface; DRIVER_INFO_2W driver_info = { .cVersion = NTGDI_WIN16_DIB };
HDC hdc; return HDC_16( NtGdiOpenDCW( NULL, NULL, NULL, 0, TRUE, 0, &driver_info, (void *)initData ));
if (!(surface = create_surface( (const BITMAPINFO *)initData ))) return 0;
if ((hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL )))
{
__wine_set_visible_region( hdc, CreateRectRgnIndirect( &surface->rect ),
&surface->rect, &surface->rect, surface );
TRACE( "returning hdc %p surface %p\n", hdc, surface );
}
window_surface_release( surface );
return HDC_16( hdc );
} }
return HDC_16( CreateDCA( driver, device, output, initData ) ); return HDC_16( CreateDCA( driver, device, output, initData ) );
} }
......
...@@ -201,10 +201,10 @@ INT WINAPI NtGdiExtSelectClipRgn( HDC hdc, HRGN rgn, INT mode ) ...@@ -201,10 +201,10 @@ INT WINAPI NtGdiExtSelectClipRgn( HDC hdc, HRGN rgn, INT mode )
} }
/*********************************************************************** /***********************************************************************
* __wine_set_visible_region (win32u.@) * set_visible_region
*/ */
void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect, const RECT *device_rect, void set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect, const RECT *device_rect,
struct window_surface *surface ) struct window_surface *surface )
{ {
DC * dc; DC * dc;
......
...@@ -755,6 +755,13 @@ HDC WINAPI NtGdiOpenDCW( UNICODE_STRING *device, const DEVMODEW *devmode, UNICOD ...@@ -755,6 +755,13 @@ HDC WINAPI NtGdiOpenDCW( UNICODE_STRING *device, const DEVMODEW *devmode, UNICOD
DC_InitDC( dc ); DC_InitDC( dc );
release_dc_ptr( dc ); release_dc_ptr( dc );
if (driver_info && driver_info->cVersion == NTGDI_WIN16_DIB &&
!create_dib_surface( hdc, pdev ))
{
NtGdiDeleteObjectApp( hdc );
return 0;
}
return hdc; return hdc;
} }
......
...@@ -245,6 +245,134 @@ void create_offscreen_window_surface( const RECT *visible_rect, struct window_su ...@@ -245,6 +245,134 @@ void create_offscreen_window_surface( const RECT *visible_rect, struct window_su
*surface = &impl->header; *surface = &impl->header;
} }
/* window surface used to implement the DIB.DRV driver */
struct dib_window_surface
{
struct window_surface header;
RECT bounds;
void *bits;
UINT info_size;
BITMAPINFO info; /* variable size, must be last */
};
static struct dib_window_surface *get_dib_surface( struct window_surface *surface )
{
return (struct dib_window_surface *)surface;
}
/***********************************************************************
* dib_surface_lock
*/
static void CDECL dib_surface_lock( struct window_surface *window_surface )
{
/* nothing to do */
}
/***********************************************************************
* dib_surface_unlock
*/
static void CDECL dib_surface_unlock( struct window_surface *window_surface )
{
/* nothing to do */
}
/***********************************************************************
* dib_surface_get_bitmap_info
*/
static void *CDECL dib_surface_get_bitmap_info( struct window_surface *window_surface, BITMAPINFO *info )
{
struct dib_window_surface *surface = get_dib_surface( window_surface );
memcpy( info, &surface->info, surface->info_size );
return surface->bits;
}
/***********************************************************************
* dib_surface_get_bounds
*/
static RECT *CDECL dib_surface_get_bounds( struct window_surface *window_surface )
{
struct dib_window_surface *surface = get_dib_surface( window_surface );
return &surface->bounds;
}
/***********************************************************************
* dib_surface_set_region
*/
static void CDECL dib_surface_set_region( struct window_surface *window_surface, HRGN region )
{
/* nothing to do */
}
/***********************************************************************
* dib_surface_flush
*/
static void CDECL dib_surface_flush( struct window_surface *window_surface )
{
/* nothing to do */
}
/***********************************************************************
* dib_surface_destroy
*/
static void CDECL dib_surface_destroy( struct window_surface *window_surface )
{
struct dib_window_surface *surface = get_dib_surface( window_surface );
TRACE( "freeing %p\n", surface );
free( surface );
}
static const struct window_surface_funcs dib_surface_funcs =
{
dib_surface_lock,
dib_surface_unlock,
dib_surface_get_bitmap_info,
dib_surface_get_bounds,
dib_surface_set_region,
dib_surface_flush,
dib_surface_destroy
};
BOOL create_dib_surface( HDC hdc, const BITMAPINFO *info )
{
struct dib_window_surface *surface;
int color = 0;
HRGN region;
RECT rect;
if (info->bmiHeader.biBitCount <= 8)
color = info->bmiHeader.biClrUsed ? info->bmiHeader.biClrUsed : (1 << info->bmiHeader.biBitCount);
else if (info->bmiHeader.biCompression == BI_BITFIELDS)
color = 3;
surface = calloc( 1, offsetof( struct dib_window_surface, info.bmiColors[color] ));
if (!surface) return FALSE;
rect.left = 0;
rect.top = 0;
rect.right = info->bmiHeader.biWidth;
rect.bottom = abs(info->bmiHeader.biHeight);
surface->header.funcs = &dib_surface_funcs;
surface->header.rect = rect;
surface->header.ref = 1;
surface->info_size = offsetof( BITMAPINFO, bmiColors[color] );
surface->bits = (char *)info + surface->info_size;
memcpy( &surface->info, info, surface->info_size );
TRACE( "created %p %ux%u for info %p bits %p\n",
surface, rect.right, rect.bottom, info, surface->bits );
region = NtGdiCreateRectRgn( rect.left, rect.top, rect.right, rect.bottom );
set_visible_region( hdc, region, &rect, &rect, &surface->header );
TRACE( "using hdc %p surface %p\n", hdc, surface );
window_surface_release( &surface->header );
return TRUE;
}
/******************************************************************* /*******************************************************************
* register_window_surface * register_window_surface
* *
...@@ -400,7 +528,7 @@ static void update_visible_region( struct dce *dce ) ...@@ -400,7 +528,7 @@ static void update_visible_region( struct dce *dce )
} }
if (!surface) SetRectEmpty( &top_rect ); if (!surface) SetRectEmpty( &top_rect );
__wine_set_visible_region( dce->hdc, vis_rgn, &win_rect, &top_rect, surface ); set_visible_region( dce->hdc, vis_rgn, &win_rect, &top_rect, surface );
if (surface) window_surface_release( surface ); if (surface) window_surface_release( surface );
} }
...@@ -411,7 +539,7 @@ static void release_dce( struct dce *dce ) ...@@ -411,7 +539,7 @@ static void release_dce( struct dce *dce )
{ {
if (!dce->hwnd) return; /* already released */ if (!dce->hwnd) return; /* already released */
__wine_set_visible_region( dce->hdc, 0, &dummy_surface.rect, &dummy_surface.rect, &dummy_surface ); set_visible_region( dce->hdc, 0, &dummy_surface.rect, &dummy_surface.rect, &dummy_surface );
user_driver->pReleaseDC( dce->hwnd, dce->hdc ); user_driver->pReleaseDC( dce->hwnd, dce->hdc );
if (dce->clip_rgn) NtGdiDeleteObjectApp( dce->clip_rgn ); if (dce->clip_rgn) NtGdiDeleteObjectApp( dce->clip_rgn );
......
...@@ -1229,7 +1229,6 @@ static struct unix_funcs unix_funcs = ...@@ -1229,7 +1229,6 @@ static struct unix_funcs unix_funcs =
__wine_get_vulkan_driver, __wine_get_vulkan_driver,
__wine_get_wgl_driver, __wine_get_wgl_driver,
__wine_set_display_driver, __wine_set_display_driver,
__wine_set_visible_region,
}; };
NTSTATUS gdi_init(void) NTSTATUS gdi_init(void)
......
...@@ -159,6 +159,8 @@ extern void free_brush_pattern( struct brush_pattern *pattern ) DECLSPEC_HIDDEN; ...@@ -159,6 +159,8 @@ extern void free_brush_pattern( struct brush_pattern *pattern ) DECLSPEC_HIDDEN;
/* clipping.c */ /* clipping.c */
extern BOOL clip_device_rect( DC *dc, RECT *dst, const RECT *src ) DECLSPEC_HIDDEN; extern BOOL clip_device_rect( DC *dc, RECT *dst, const RECT *src ) DECLSPEC_HIDDEN;
extern BOOL clip_visrect( DC *dc, RECT *dst, const RECT *src ) DECLSPEC_HIDDEN; extern BOOL clip_visrect( DC *dc, RECT *dst, const RECT *src ) DECLSPEC_HIDDEN;
extern void set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect,
const RECT *device_rect, struct window_surface *surface );
extern void update_dc_clipping( DC * dc ) DECLSPEC_HIDDEN; extern void update_dc_clipping( DC * dc ) DECLSPEC_HIDDEN;
/* Return the total DC region (if any) */ /* Return the total DC region (if any) */
......
...@@ -1320,9 +1320,6 @@ ...@@ -1320,9 +1320,6 @@
################################################################ ################################################################
# Wine internal extensions # Wine internal extensions
# user32
@ cdecl __wine_set_visible_region(long long ptr ptr ptr)
# Graphics drivers # Graphics drivers
@ cdecl __wine_set_display_driver(ptr long) @ cdecl __wine_set_display_driver(ptr long)
......
...@@ -290,8 +290,6 @@ struct unix_funcs ...@@ -290,8 +290,6 @@ struct unix_funcs
const struct vulkan_funcs * (CDECL *get_vulkan_driver)( UINT version ); const struct vulkan_funcs * (CDECL *get_vulkan_driver)( UINT version );
struct opengl_funcs * (CDECL *get_wgl_driver)( HDC hdc, UINT version ); struct opengl_funcs * (CDECL *get_wgl_driver)( HDC hdc, UINT version );
void (CDECL *set_display_driver)( struct user_driver_funcs *funcs, UINT version ); void (CDECL *set_display_driver)( struct user_driver_funcs *funcs, UINT version );
void (CDECL *set_visible_region)( HDC hdc, HRGN hrgn, const RECT *vis_rect, const RECT *device_rect,
struct window_surface *surface );
}; };
/* clipboard.c */ /* clipboard.c */
...@@ -305,6 +303,7 @@ extern ULONG_PTR set_icon_param( HICON handle, ULONG_PTR param ) DECLSPEC_HIDDEN ...@@ -305,6 +303,7 @@ extern ULONG_PTR set_icon_param( HICON handle, ULONG_PTR param ) DECLSPEC_HIDDEN
/* dce.c */ /* dce.c */
extern struct window_surface dummy_surface DECLSPEC_HIDDEN; extern struct window_surface dummy_surface DECLSPEC_HIDDEN;
extern BOOL create_dib_surface( HDC hdc, const BITMAPINFO *info ) DECLSPEC_HIDDEN;
extern void create_offscreen_window_surface( const RECT *visible_rect, extern void create_offscreen_window_surface( const RECT *visible_rect,
struct window_surface **surface ) DECLSPEC_HIDDEN; struct window_surface **surface ) DECLSPEC_HIDDEN;
extern void erase_now( HWND hwnd, UINT rdw_flags ) DECLSPEC_HIDDEN; extern void erase_now( HWND hwnd, UINT rdw_flags ) DECLSPEC_HIDDEN;
......
...@@ -1166,13 +1166,6 @@ BOOL CDECL __wine_get_icm_profile( HDC hdc, BOOL allow_default, DWORD *size, WCH ...@@ -1166,13 +1166,6 @@ BOOL CDECL __wine_get_icm_profile( HDC hdc, BOOL allow_default, DWORD *size, WCH
return unix_funcs->get_icm_profile( hdc, allow_default, size, filename ); return unix_funcs->get_icm_profile( hdc, allow_default, size, filename );
} }
void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect, const RECT *device_rect,
struct window_surface *surface )
{
if (!unix_funcs) return;
unix_funcs->set_visible_region( hdc, hrgn, vis_rect, device_rect, surface );
}
BOOL CDECL __wine_get_brush_bitmap_info( HBRUSH handle, BITMAPINFO *info, void *bits, UINT *usage ) BOOL CDECL __wine_get_brush_bitmap_info( HBRUSH handle, BITMAPINFO *info, void *bits, UINT *usage )
{ {
if (!unix_funcs) return FALSE; if (!unix_funcs) return FALSE;
......
...@@ -183,6 +183,9 @@ struct font_enum_entry ...@@ -183,6 +183,9 @@ struct font_enum_entry
/* flag for NtGdiGetRandomRgn to respect LAYOUT_RTL */ /* flag for NtGdiGetRandomRgn to respect LAYOUT_RTL */
#define NTGDI_RGN_MIRROR_RTL 0x80000000 #define NTGDI_RGN_MIRROR_RTL 0x80000000
/* magic driver version that we use for win16 DCs with DIB surfaces */
#define NTGDI_WIN16_DIB 0xfafa000
#endif /* __WINESRC__ */ #endif /* __WINESRC__ */
struct font_realization_info struct font_realization_info
......
...@@ -327,8 +327,6 @@ struct user_driver_funcs ...@@ -327,8 +327,6 @@ struct user_driver_funcs
}; };
extern void CDECL __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT version ); extern void CDECL __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT version );
extern void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect,
const RECT *device_rect, struct window_surface *surface );
extern void CDECL __wine_set_display_driver( struct user_driver_funcs *funcs, UINT version ); extern void CDECL __wine_set_display_driver( struct user_driver_funcs *funcs, UINT version );
extern struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version ); extern struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version );
extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver( UINT version ); extern const struct vulkan_funcs * CDECL __wine_get_vulkan_driver( UINT version );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment