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
c2a9b4a8
Commit
c2a9b4a8
authored
Jul 14, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winex11: Add support for byte swapping in GetImage.
parent
e6fcbc54
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
142 additions
and
24 deletions
+142
-24
bitblt.c
dlls/winex11.drv/bitblt.c
+142
-24
No files found.
dlls/winex11.drv/bitblt.c
View file @
c2a9b4a8
...
...
@@ -30,6 +30,7 @@
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "winternl.h"
#include "x11drv.h"
#include "wine/debug.h"
...
...
@@ -443,6 +444,41 @@ static const unsigned char BITBLT_Opcodes[256][MAX_OP_LEN] =
{
OP
(
PAT
,
DST
,
GXset
)
}
/* 0xff 1 */
};
static
const
unsigned
char
bit_swap
[
256
]
=
{
0x00
,
0x80
,
0x40
,
0xc0
,
0x20
,
0xa0
,
0x60
,
0xe0
,
0x10
,
0x90
,
0x50
,
0xd0
,
0x30
,
0xb0
,
0x70
,
0xf0
,
0x08
,
0x88
,
0x48
,
0xc8
,
0x28
,
0xa8
,
0x68
,
0xe8
,
0x18
,
0x98
,
0x58
,
0xd8
,
0x38
,
0xb8
,
0x78
,
0xf8
,
0x04
,
0x84
,
0x44
,
0xc4
,
0x24
,
0xa4
,
0x64
,
0xe4
,
0x14
,
0x94
,
0x54
,
0xd4
,
0x34
,
0xb4
,
0x74
,
0xf4
,
0x0c
,
0x8c
,
0x4c
,
0xcc
,
0x2c
,
0xac
,
0x6c
,
0xec
,
0x1c
,
0x9c
,
0x5c
,
0xdc
,
0x3c
,
0xbc
,
0x7c
,
0xfc
,
0x02
,
0x82
,
0x42
,
0xc2
,
0x22
,
0xa2
,
0x62
,
0xe2
,
0x12
,
0x92
,
0x52
,
0xd2
,
0x32
,
0xb2
,
0x72
,
0xf2
,
0x0a
,
0x8a
,
0x4a
,
0xca
,
0x2a
,
0xaa
,
0x6a
,
0xea
,
0x1a
,
0x9a
,
0x5a
,
0xda
,
0x3a
,
0xba
,
0x7a
,
0xfa
,
0x06
,
0x86
,
0x46
,
0xc6
,
0x26
,
0xa6
,
0x66
,
0xe6
,
0x16
,
0x96
,
0x56
,
0xd6
,
0x36
,
0xb6
,
0x76
,
0xf6
,
0x0e
,
0x8e
,
0x4e
,
0xce
,
0x2e
,
0xae
,
0x6e
,
0xee
,
0x1e
,
0x9e
,
0x5e
,
0xde
,
0x3e
,
0xbe
,
0x7e
,
0xfe
,
0x01
,
0x81
,
0x41
,
0xc1
,
0x21
,
0xa1
,
0x61
,
0xe1
,
0x11
,
0x91
,
0x51
,
0xd1
,
0x31
,
0xb1
,
0x71
,
0xf1
,
0x09
,
0x89
,
0x49
,
0xc9
,
0x29
,
0xa9
,
0x69
,
0xe9
,
0x19
,
0x99
,
0x59
,
0xd9
,
0x39
,
0xb9
,
0x79
,
0xf9
,
0x05
,
0x85
,
0x45
,
0xc5
,
0x25
,
0xa5
,
0x65
,
0xe5
,
0x15
,
0x95
,
0x55
,
0xd5
,
0x35
,
0xb5
,
0x75
,
0xf5
,
0x0d
,
0x8d
,
0x4d
,
0xcd
,
0x2d
,
0xad
,
0x6d
,
0xed
,
0x1d
,
0x9d
,
0x5d
,
0xdd
,
0x3d
,
0xbd
,
0x7d
,
0xfd
,
0x03
,
0x83
,
0x43
,
0xc3
,
0x23
,
0xa3
,
0x63
,
0xe3
,
0x13
,
0x93
,
0x53
,
0xd3
,
0x33
,
0xb3
,
0x73
,
0xf3
,
0x0b
,
0x8b
,
0x4b
,
0xcb
,
0x2b
,
0xab
,
0x6b
,
0xeb
,
0x1b
,
0x9b
,
0x5b
,
0xdb
,
0x3b
,
0xbb
,
0x7b
,
0xfb
,
0x07
,
0x87
,
0x47
,
0xc7
,
0x27
,
0xa7
,
0x67
,
0xe7
,
0x17
,
0x97
,
0x57
,
0xd7
,
0x37
,
0xb7
,
0x77
,
0xf7
,
0x0f
,
0x8f
,
0x4f
,
0xcf
,
0x2f
,
0xaf
,
0x6f
,
0xef
,
0x1f
,
0x9f
,
0x5f
,
0xdf
,
0x3f
,
0xbf
,
0x7f
,
0xff
};
#ifdef BITBLT_TEST
/* Opcodes test */
...
...
@@ -1587,6 +1623,103 @@ static void set_color_info( const ColorShifts *color_shifts, BITMAPINFO *info )
}
}
/* copy the image bits, fixing up alignment and byte swapping as necessary */
static
DWORD
copy_image_bits
(
BITMAPINFO
*
info
,
const
ColorShifts
*
color_shifts
,
XImage
*
image
,
const
struct
gdi_image_bits
*
src_bits
,
struct
gdi_image_bits
*
dst_bits
)
{
BOOL
need_byteswap
;
int
x
,
y
,
height
=
-
info
->
bmiHeader
.
biHeight
;
unsigned
int
width_bytes
=
image
->
bytes_per_line
;
unsigned
char
*
src
,
*
dst
;
switch
(
info
->
bmiHeader
.
biBitCount
)
{
case
1
:
need_byteswap
=
(
image
->
bitmap_bit_order
!=
MSBFirst
);
break
;
case
4
:
need_byteswap
=
(
image
->
byte_order
!=
MSBFirst
);
break
;
case
16
:
case
32
:
need_byteswap
=
(
image
->
byte_order
!=
LSBFirst
);
break
;
case
24
:
need_byteswap
=
((
image
->
byte_order
==
LSBFirst
&&
color_shifts
->
logicalBlue
.
shift
==
16
)
||
(
image
->
byte_order
==
MSBFirst
&&
color_shifts
->
logicalBlue
.
shift
==
0
));
break
;
default:
need_byteswap
=
FALSE
;
break
;
}
if
((
need_byteswap
&&
!
src_bits
->
is_copy
)
||
(
width_bytes
&
3
))
{
width_bytes
=
(
width_bytes
+
3
)
&
~
3
;
info
->
bmiHeader
.
biSizeImage
=
height
*
width_bytes
;
if
(
!
(
dst_bits
->
ptr
=
HeapAlloc
(
GetProcessHeap
(),
0
,
info
->
bmiHeader
.
biSizeImage
)))
return
ERROR_OUTOFMEMORY
;
dst_bits
->
offset
=
src_bits
->
offset
;
dst_bits
->
is_copy
=
TRUE
;
dst_bits
->
free
=
free_heap_bits
;
}
else
{
/* swap bits in place */
dst_bits
->
ptr
=
src_bits
->
ptr
;
dst_bits
->
offset
=
src_bits
->
offset
;
dst_bits
->
is_copy
=
src_bits
->
is_copy
;
dst_bits
->
free
=
NULL
;
if
(
!
need_byteswap
)
return
ERROR_SUCCESS
;
/* nothing to do */
}
src
=
src_bits
->
ptr
;
dst
=
dst_bits
->
ptr
;
if
(
need_byteswap
)
{
switch
(
info
->
bmiHeader
.
biBitCount
)
{
case
1
:
for
(
y
=
0
;
y
<
height
;
y
++
,
src
+=
image
->
bytes_per_line
,
dst
+=
width_bytes
)
for
(
x
=
0
;
x
<
image
->
bytes_per_line
;
x
++
)
dst
[
x
]
=
bit_swap
[
src
[
x
]];
break
;
case
4
:
for
(
y
=
0
;
y
<
height
;
y
++
,
src
+=
image
->
bytes_per_line
,
dst
+=
width_bytes
)
for
(
x
=
0
;
x
<
image
->
bytes_per_line
;
x
++
)
dst
[
x
]
=
(
src
[
x
]
<<
4
)
|
(
src
[
x
]
>>
4
);
break
;
case
16
:
for
(
y
=
0
;
y
<
height
;
y
++
,
src
+=
image
->
bytes_per_line
,
dst
+=
width_bytes
)
for
(
x
=
0
;
x
<
info
->
bmiHeader
.
biWidth
;
x
++
)
((
USHORT
*
)
dst
)[
x
]
=
RtlUshortByteSwap
(
((
const
USHORT
*
)
src
)[
x
]
);
break
;
case
24
:
for
(
y
=
0
;
y
<
height
;
y
++
,
src
+=
image
->
bytes_per_line
,
dst
+=
width_bytes
)
for
(
x
=
0
;
x
<
info
->
bmiHeader
.
biWidth
;
x
++
)
{
unsigned
char
tmp
=
src
[
3
*
x
];
dst
[
3
*
x
]
=
src
[
3
*
x
+
2
];
dst
[
3
*
x
+
1
]
=
src
[
3
*
x
+
1
];
dst
[
3
*
x
+
2
]
=
tmp
;
}
break
;
case
32
:
for
(
y
=
0
;
y
<
height
;
y
++
,
src
+=
image
->
bytes_per_line
,
dst
+=
width_bytes
)
for
(
x
=
0
;
x
<
info
->
bmiHeader
.
biWidth
;
x
++
)
((
ULONG
*
)
dst
)[
x
]
=
RtlUlongByteSwap
(
((
const
ULONG
*
)
src
)[
x
]
);
break
;
}
}
else
{
for
(
y
=
0
;
y
<
height
;
y
++
,
src
+=
image
->
bytes_per_line
,
dst
+=
width_bytes
)
memcpy
(
dst
,
src
,
image
->
bytes_per_line
);
}
return
ERROR_SUCCESS
;
}
/***********************************************************************
* X11DRV_GetImage
*/
...
...
@@ -1597,8 +1730,9 @@ DWORD X11DRV_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
X_PHYSBITMAP
*
bitmap
;
DWORD
ret
=
ERROR_SUCCESS
;
XImage
*
image
;
UINT
i
,
align
,
x
,
y
,
width
,
height
;
UINT
align
,
x
,
y
,
width
,
height
;
int
depth
;
struct
gdi_image_bits
src_bits
;
const
XPixmapFormatValues
*
format
;
const
ColorShifts
*
color_shifts
;
...
...
@@ -1631,8 +1765,8 @@ DWORD X11DRV_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
FIXME
(
"depth %u bpp %u not supported yet
\n
"
,
depth
,
format
->
bits_per_pixel
);
return
ERROR_BAD_FORMAT
;
}
bits
->
offset
=
rect
->
left
&
(
align
-
1
);
x
=
rect
->
left
-
bits
->
offset
;
src_bits
.
offset
=
rect
->
left
&
(
align
-
1
);
x
=
rect
->
left
-
src_bits
.
offset
;
y
=
rect
->
top
;
width
=
rect
->
right
-
x
;
height
=
rect
->
bottom
-
rect
->
top
;
...
...
@@ -1687,31 +1821,15 @@ DWORD X11DRV_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
info
->
bmiHeader
.
biClrImportant
=
0
;
set_color_info
(
color_shifts
,
info
);
/* check if we need to copy the bits */
if
(
image
->
bytes_per_line
&
3
)
{
UINT
width_bytes
=
(
image
->
bytes_per_line
+
3
)
&
~
3
;
info
->
bmiHeader
.
biSizeImage
=
height
*
width_bytes
;
if
((
bits
->
ptr
=
HeapAlloc
(
GetProcessHeap
(),
0
,
info
->
bmiHeader
.
biSizeImage
)))
{
bits
->
is_copy
=
TRUE
;
bits
->
free
=
free_heap_bits
;
for
(
i
=
0
;
i
<
height
;
i
++
)
memcpy
(
(
char
*
)
bits
->
ptr
+
i
*
width_bytes
,
(
char
*
)
image
->
data
+
i
*
image
->
bytes_per_line
,
image
->
bytes_per_line
);
/* FIXME: byte swapping */
}
else
ret
=
ERROR_OUTOFMEMORY
;
}
else
src_bits
.
ptr
=
image
->
data
;
src_bits
.
is_copy
=
TRUE
;
ret
=
copy_image_bits
(
info
,
color_shifts
,
image
,
&
src_bits
,
bits
);
if
(
!
ret
&&
bits
->
ptr
==
image
->
data
)
{
bits
->
ptr
=
image
->
data
;
bits
->
is_copy
=
TRUE
;
bits
->
free
=
free_ximage_bits
;
image
->
data
=
NULL
;
}
wine_tsx11_lock
();
XDestroyImage
(
image
);
wine_tsx11_unlock
();
...
...
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