Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
5112699a
Commit
5112699a
authored
Jan 10, 2012
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winex11: Store the XRender format in the bitmap structure.
parent
3e85a7c2
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
58 additions
and
61 deletions
+58
-61
bitmap.c
dlls/winex11.drv/bitmap.c
+20
-15
x11drv.h
dlls/winex11.drv/x11drv.h
+2
-2
xrender.c
dlls/winex11.drv/xrender.c
+36
-44
No files found.
dlls/winex11.drv/bitmap.c
View file @
5112699a
...
...
@@ -125,8 +125,7 @@ HBITMAP X11DRV_SelectBitmap( PHYSDEV dev, HBITMAP hbitmap )
/***********************************************************************
* X11DRV_create_phys_bitmap
*/
BOOL
X11DRV_create_phys_bitmap
(
HBITMAP
hbitmap
,
const
BITMAP
*
bitmap
,
int
depth
,
int
true_color
,
const
ColorShifts
*
shifts
)
X_PHYSBITMAP
*
X11DRV_create_phys_bitmap
(
HBITMAP
hbitmap
,
const
BITMAP
*
bitmap
,
int
depth
)
{
X_PHYSBITMAP
*
physBitmap
;
...
...
@@ -135,16 +134,12 @@ BOOL X11DRV_create_phys_bitmap( HBITMAP hbitmap, const BITMAP *bitmap, int depth
{
WARN
(
"Trying to create invalid pixmap %dx%d planes %d bpp %d
\n
"
,
bitmap
->
bmWidth
,
bitmap
->
bmHeight
,
bitmap
->
bmPlanes
,
bitmap
->
bmBitsPixel
);
return
FALSE
;
return
NULL
;
}
TRACE
(
"(%p) %dx%d %d bpp
\n
"
,
hbitmap
,
bitmap
->
bmWidth
,
bitmap
->
bmHeight
,
bitmap
->
bmBitsPixel
);
if
(
!
(
physBitmap
=
X11DRV_init_phys_bitmap
(
hbitmap
)))
return
FALSE
;
if
(
!
(
physBitmap
=
X11DRV_init_phys_bitmap
(
hbitmap
)))
return
NULL
;
physBitmap
->
depth
=
depth
;
physBitmap
->
trueColor
=
true_color
;
if
(
true_color
)
physBitmap
->
color_shifts
=
*
shifts
;
wine_tsx11_lock
();
physBitmap
->
pixmap
=
XCreatePixmap
(
gdi_display
,
root_window
,
...
...
@@ -161,9 +156,11 @@ BOOL X11DRV_create_phys_bitmap( HBITMAP hbitmap, const BITMAP *bitmap, int depth
{
WARN
(
"Can't create Pixmap
\n
"
);
HeapFree
(
GetProcessHeap
(),
0
,
physBitmap
);
return
FALSE
;
return
NULL
;
}
return
TRUE
;
TRACE
(
"(%p) %dx%d %d bpp -> %lx
\n
"
,
hbitmap
,
bitmap
->
bmWidth
,
bitmap
->
bmHeight
,
bitmap
->
bmBitsPixel
,
physBitmap
->
pixmap
);
return
physBitmap
;
}
...
...
@@ -177,15 +174,22 @@ BOOL X11DRV_create_phys_bitmap( HBITMAP hbitmap, const BITMAP *bitmap, int depth
BOOL
X11DRV_CreateBitmap
(
PHYSDEV
dev
,
HBITMAP
hbitmap
)
{
BITMAP
bitmap
;
X_PHYSBITMAP
*
phys_bitmap
;
if
(
!
GetObjectW
(
hbitmap
,
sizeof
(
bitmap
),
&
bitmap
))
return
FALSE
;
if
(
bitmap
.
bmBitsPixel
==
1
)
return
X11DRV_create_phys_bitmap
(
hbitmap
,
&
bitmap
,
1
,
FALSE
,
NULL
);
return
X11DRV_create_phys_bitmap
(
hbitmap
,
&
bitmap
,
screen_depth
,
(
visual
->
class
==
TrueColor
||
visual
->
class
==
DirectColor
),
&
X11DRV_PALETTE_default_shifts
);
{
if
(
!
(
phys_bitmap
=
X11DRV_create_phys_bitmap
(
hbitmap
,
&
bitmap
,
1
)))
return
FALSE
;
phys_bitmap
->
trueColor
=
FALSE
;
}
else
{
if
(
!
(
phys_bitmap
=
X11DRV_create_phys_bitmap
(
hbitmap
,
&
bitmap
,
screen_depth
)))
return
FALSE
;
phys_bitmap
->
trueColor
=
(
visual
->
class
==
TrueColor
||
visual
->
class
==
DirectColor
);
phys_bitmap
->
color_shifts
=
X11DRV_PALETTE_default_shifts
;
}
return
TRUE
;
}
...
...
@@ -205,6 +209,7 @@ BOOL X11DRV_CopyBitmap( HBITMAP src, HBITMAP dst )
if
(
!
(
phys_dst
=
X11DRV_init_phys_bitmap
(
dst
)))
return
FALSE
;
phys_dst
->
depth
=
phys_src
->
depth
;
phys_dst
->
format
=
phys_src
->
format
;
phys_dst
->
trueColor
=
phys_src
->
trueColor
;
if
(
phys_dst
->
trueColor
)
phys_dst
->
color_shifts
=
phys_src
->
color_shifts
;
...
...
dlls/winex11.drv/x11drv.h
View file @
5112699a
...
...
@@ -119,6 +119,7 @@ typedef struct
Pixmap
pixmap
;
XID
glxpixmap
;
int
depth
;
/* depth of the X pixmap */
int
format
;
/* color format (used by XRender) */
ColorShifts
color_shifts
;
/* color shifts of the X pixmap */
BOOL
trueColor
;
}
X_PHYSBITMAP
;
...
...
@@ -253,8 +254,7 @@ extern void X11DRV_XInput2_Init(void) DECLSPEC_HIDDEN;
extern
HBITMAP
create_brush_bitmap
(
X11DRV_PDEVICE
*
physDev
,
const
struct
brush_pattern
*
pattern
)
DECLSPEC_HIDDEN
;
extern
X_PHYSBITMAP
*
X11DRV_get_phys_bitmap
(
HBITMAP
hbitmap
)
DECLSPEC_HIDDEN
;
extern
X_PHYSBITMAP
*
X11DRV_init_phys_bitmap
(
HBITMAP
hbitmap
)
DECLSPEC_HIDDEN
;
extern
BOOL
X11DRV_create_phys_bitmap
(
HBITMAP
hbitmap
,
const
BITMAP
*
bitmap
,
int
depth
,
int
true_color
,
const
ColorShifts
*
shifts
)
DECLSPEC_HIDDEN
;
extern
X_PHYSBITMAP
*
X11DRV_create_phys_bitmap
(
HBITMAP
hbitmap
,
const
BITMAP
*
bitmap
,
int
depth
)
DECLSPEC_HIDDEN
;
extern
Pixmap
X11DRV_get_pixmap
(
HBITMAP
hbitmap
)
DECLSPEC_HIDDEN
;
extern
DWORD
copy_image_bits
(
BITMAPINFO
*
info
,
BOOL
is_r8g8b8
,
XImage
*
image
,
const
struct
gdi_image_bits
*
src_bits
,
struct
gdi_image_bits
*
dst_bits
,
...
...
dlls/winex11.drv/xrender.c
View file @
5112699a
...
...
@@ -482,35 +482,6 @@ static void get_xrender_color( struct xrender_physdev *physdev, COLORREF src_col
dst_color
->
alpha
=
0xffff
;
}
static
enum
wxr_format
get_xrender_format_from_color_shifts
(
int
depth
,
ColorShifts
*
shifts
)
{
int
redMask
,
greenMask
,
blueMask
;
unsigned
int
i
;
if
(
depth
==
1
)
return
WXR_FORMAT_MONO
;
/* physDevs of a depth <=8, don't have color_shifts set and XRender can't handle those except for 1-bit */
if
(
!
shifts
)
return
default_format
;
redMask
=
shifts
->
physicalRed
.
max
<<
shifts
->
physicalRed
.
shift
;
greenMask
=
shifts
->
physicalGreen
.
max
<<
shifts
->
physicalGreen
.
shift
;
blueMask
=
shifts
->
physicalBlue
.
max
<<
shifts
->
physicalBlue
.
shift
;
/* Try to locate a format which matches the specification of the dibsection. */
for
(
i
=
0
;
i
<
WXR_NB_FORMATS
;
i
++
)
{
if
(
depth
==
wxr_formats_template
[
i
].
depth
&&
redMask
==
(
wxr_formats_template
[
i
].
redMask
<<
wxr_formats_template
[
i
].
red
)
&&
greenMask
==
(
wxr_formats_template
[
i
].
greenMask
<<
wxr_formats_template
[
i
].
green
)
&&
blueMask
==
(
wxr_formats_template
[
i
].
blueMask
<<
wxr_formats_template
[
i
].
blue
)
)
return
i
;
}
/* This should not happen because when we reach 'shifts' must have been set and we only allows shifts which are backed by X */
ERR
(
"No XRender format found for %u %08x/%08x/%08x
\n
"
,
depth
,
redMask
,
greenMask
,
blueMask
);
return
WXR_INVALID_FORMAT
;
}
static
enum
wxr_format
get_xrender_format_from_bitmapinfo
(
const
BITMAPINFO
*
info
)
{
if
(
info
->
bmiHeader
.
biPlanes
!=
1
)
return
WXR_INVALID_FORMAT
;
...
...
@@ -1301,19 +1272,40 @@ static BOOL xrenderdrv_CopyBitmap( HBITMAP src, HBITMAP dst )
*/
static
BOOL
xrenderdrv_CreateBitmap
(
PHYSDEV
dev
,
HBITMAP
hbitmap
)
{
enum
wxr_format
format
;
enum
wxr_format
format
=
WXR_INVALID_FORMAT
;
X_PHYSBITMAP
*
phys_bitmap
;
BITMAP
bitmap
;
if
(
!
GetObjectW
(
hbitmap
,
sizeof
(
bitmap
),
&
bitmap
))
return
FALSE
;
format
=
get_bitmap_format
(
bitmap
.
bmBitsPixel
);
if
(
pict_formats
[
format
])
return
X11DRV_create_phys_bitmap
(
hbitmap
,
&
bitmap
,
pict_formats
[
format
]
->
depth
,
TRUE
,
&
wxr_color_shifts
[
format
]
);
if
(
bitmap
.
bmBitsPixel
==
1
)
{
if
(
!
(
phys_bitmap
=
X11DRV_create_phys_bitmap
(
hbitmap
,
&
bitmap
,
1
)))
return
FALSE
;
phys_bitmap
->
format
=
WXR_FORMAT_MONO
;
phys_bitmap
->
trueColor
=
FALSE
;
}
else
{
format
=
get_bitmap_format
(
bitmap
.
bmBitsPixel
);
dev
=
GET_NEXT_PHYSDEV
(
dev
,
pCreateBitmap
);
return
dev
->
funcs
->
pCreateBitmap
(
dev
,
hbitmap
);
if
(
pict_formats
[
format
])
{
if
(
!
(
phys_bitmap
=
X11DRV_create_phys_bitmap
(
hbitmap
,
&
bitmap
,
pict_formats
[
format
]
->
depth
)))
return
FALSE
;
phys_bitmap
->
format
=
format
;
phys_bitmap
->
trueColor
=
TRUE
;
phys_bitmap
->
color_shifts
=
wxr_color_shifts
[
format
];
}
else
{
if
(
!
(
phys_bitmap
=
X11DRV_create_phys_bitmap
(
hbitmap
,
&
bitmap
,
screen_depth
)))
return
FALSE
;
phys_bitmap
->
format
=
WXR_INVALID_FORMAT
;
phys_bitmap
->
trueColor
=
(
visual
->
class
==
TrueColor
||
visual
->
class
==
DirectColor
);
phys_bitmap
->
color_shifts
=
X11DRV_PALETTE_default_shifts
;
}
}
return
TRUE
;
}
/****************************************************************************
...
...
@@ -1337,8 +1329,8 @@ static HBITMAP xrenderdrv_SelectBitmap( PHYSDEV dev, HBITMAP hbitmap )
if
(
ret
)
{
free_xrender_picture
(
physdev
);
physdev
->
format
=
get_xrender_format_from_color_shifts
(
physdev
->
x11dev
->
depth
,
physdev
->
x11dev
->
color_shifts
)
;
if
(
hbitmap
==
BITMAP_stock_phys_bitmap
.
hbitmap
)
physdev
->
format
=
WXR_FORMAT_MONO
;
else
physdev
->
format
=
X11DRV_get_phys_bitmap
(
hbitmap
)
->
format
;
physdev
->
pict_format
=
pict_formats
[
physdev
->
format
];
}
return
ret
;
...
...
@@ -2192,7 +2184,7 @@ static DWORD xrenderdrv_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMA
{
if
(
!
(
bitmap
=
X11DRV_get_phys_bitmap
(
hbitmap
)))
return
ERROR_INVALID_HANDLE
;
physdev
=
NULL
;
dst_format
=
get_xrender_format_from_color_shifts
(
bitmap
->
depth
,
&
bitmap
->
color_shifts
)
;
dst_format
=
bitmap
->
format
;
}
else
{
...
...
@@ -2558,11 +2550,11 @@ static HBRUSH xrenderdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, const struct b
{
struct
xrender_physdev
*
physdev
=
get_xrender_dev
(
dev
);
X_PHYSBITMAP
*
physbitmap
;
enum
wxr_format
format
;
BOOL
delete_bitmap
=
FALSE
;
BITMAP
bm
;
HBITMAP
bitmap
;
Pixmap
pixmap
;
XRenderPictFormat
*
pict_format
;
Picture
src_pict
,
dst_pict
;
XRenderPictureAttributes
pa
;
...
...
@@ -2577,8 +2569,8 @@ static HBRUSH xrenderdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, const struct b
delete_bitmap
=
TRUE
;
}
format
=
get_xrender_format_from_color_shifts
(
physbitmap
->
depth
,
&
physbitmap
->
color_shifts
)
;
if
(
format
==
WXR_FORMAT_MONO
||
!
pict_formats
[
format
]
)
goto
x11drv_fallback
;
if
(
physbitmap
->
format
==
WXR_FORMAT_MONO
)
goto
x11drv_fallback
;
if
(
!
(
pict_format
=
pict_formats
[
physbitmap
->
format
])
)
goto
x11drv_fallback
;
GetObjectW
(
bitmap
,
sizeof
(
bm
),
&
bm
);
...
...
@@ -2587,7 +2579,7 @@ static HBRUSH xrenderdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, const struct b
physdev
->
pict_format
->
depth
);
pa
.
repeat
=
RepeatNone
;
src_pict
=
pXRenderCreatePicture
(
gdi_display
,
physbitmap
->
pixmap
,
pict_format
s
[
format
]
,
CPRepeat
,
&
pa
);
src_pict
=
pXRenderCreatePicture
(
gdi_display
,
physbitmap
->
pixmap
,
pict_format
,
CPRepeat
,
&
pa
);
dst_pict
=
pXRenderCreatePicture
(
gdi_display
,
pixmap
,
physdev
->
pict_format
,
CPRepeat
,
&
pa
);
xrender_blit
(
PictOpSrc
,
src_pict
,
0
,
dst_pict
,
0
,
0
,
0
,
0
,
1
.
0
,
1
.
0
,
bm
.
bmWidth
,
bm
.
bmHeight
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment