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
e3857482
Commit
e3857482
authored
Mar 16, 2010
by
Sandijs Ribaks
Committed by
Alexandre Julliard
Mar 17, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Add surface conversion function from WINED3DFMT_YUY2 to WINED3DFMT_B8G8R8X8_UNORM.
parent
94edcc1d
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
50 additions
and
0 deletions
+50
-0
surface_base.c
dlls/wined3d/surface_base.c
+50
-0
No files found.
dlls/wined3d/surface_base.c
View file @
e3857482
...
...
@@ -742,6 +742,55 @@ static void convert_a8r8g8b8_x8r8g8b8(const BYTE *src, BYTE *dst,
}
}
static
inline
BYTE
cliptobyte
(
int
x
)
{
return
(
BYTE
)
((
x
<
0
)
?
0
:
((
x
>
255
)
?
255
:
x
));
}
static
void
convert_yuy2_x8r8g8b8
(
const
BYTE
*
src
,
BYTE
*
dst
,
DWORD
pitch_in
,
DWORD
pitch_out
,
unsigned
int
w
,
unsigned
int
h
)
{
unsigned
int
x
,
y
;
int
c2
,
d
,
e
,
r2
=
0
,
g2
=
0
,
b2
=
0
;
TRACE
(
"Converting %ux%u pixels, pitches %u %u
\n
"
,
w
,
h
,
pitch_in
,
pitch_out
);
for
(
y
=
0
;
y
<
h
;
++
y
)
{
const
BYTE
*
src_line
=
src
+
y
*
pitch_in
;
DWORD
*
dst_line
=
(
DWORD
*
)(
dst
+
y
*
pitch_out
);
for
(
x
=
0
;
x
<
w
;
++
x
)
{
/* YUV to RGB conversion formulas from http://en.wikipedia.org/wiki/YUV:
* C = Y - 16; D = U - 128; E = V - 128;
* R = cliptobyte((298 * C + 409 * E + 128) >> 8);
* G = cliptobyte((298 * C - 100 * D - 208 * E + 128) >> 8);
* B = cliptobyte((298 * C + 516 * D + 128) >> 8);
* Two adjacent YUY2 pixels are stored as four bytes: Y0 U Y1 V .
* U and V are shared between the pixels.
*/
if
(
!
(
x
&
1
))
/* for every even pixel, read new U and V */
{
d
=
(
int
)
src_line
[
1
]
-
128
;
e
=
(
int
)
src_line
[
3
]
-
128
;
r2
=
409
*
e
+
128
;
g2
=
-
100
*
d
-
208
*
e
+
128
;
b2
=
516
*
d
+
128
;
}
c2
=
298
*
((
int
)
src_line
[
0
]
-
16
);
dst_line
[
x
]
=
0xff000000
|
cliptobyte
((
c2
+
r2
)
>>
8
)
<<
16
/* red */
|
cliptobyte
((
c2
+
g2
)
>>
8
)
<<
8
/* green */
|
cliptobyte
((
c2
+
b2
)
>>
8
);
/* blue */
/* Scale RGB values to 0..255 range,
* then clip them if still not in range (may be negative),
* then shift them within DWORD if necessary.
*/
src_line
+=
2
;
}
}
}
struct
d3dfmt_convertor_desc
{
WINED3DFORMAT
from
,
to
;
void
(
*
convert
)(
const
BYTE
*
src
,
BYTE
*
dst
,
DWORD
pitch_in
,
DWORD
pitch_out
,
unsigned
int
w
,
unsigned
int
h
);
...
...
@@ -752,6 +801,7 @@ static const struct d3dfmt_convertor_desc convertors[] =
{
WINED3DFMT_R32_FLOAT
,
WINED3DFMT_R16_FLOAT
,
convert_r32_float_r16_float
},
{
WINED3DFMT_B5G6R5_UNORM
,
WINED3DFMT_B8G8R8X8_UNORM
,
convert_r5g6b5_x8r8g8b8
},
{
WINED3DFMT_B8G8R8A8_UNORM
,
WINED3DFMT_B8G8R8X8_UNORM
,
convert_a8r8g8b8_x8r8g8b8
},
{
WINED3DFMT_YUY2
,
WINED3DFMT_B8G8R8X8_UNORM
,
convert_yuy2_x8r8g8b8
},
};
static
inline
const
struct
d3dfmt_convertor_desc
*
find_convertor
(
WINED3DFORMAT
from
,
WINED3DFORMAT
to
)
...
...
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