Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
b6ddd8ca
Commit
b6ddd8ca
authored
Nov 11, 2003
by
Lionel Ulmer
Committed by
Alexandre Julliard
Nov 11, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Better color-keying support.
parent
b95693c6
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
92 additions
and
24 deletions
+92
-24
mesa.c
dlls/ddraw/d3ddevice/mesa.c
+65
-10
mesa.c
dlls/ddraw/direct3d/mesa.c
+1
-1
main.c
dlls/ddraw/dsurface/main.c
+1
-1
mesa.c
dlls/ddraw/mesa.c
+19
-11
mesa_private.h
dlls/ddraw/mesa_private.h
+6
-1
No files found.
dlls/ddraw/d3ddevice/mesa.c
View file @
b6ddd8ca
...
...
@@ -163,10 +163,8 @@ static DWORD d3ddevice_set_state_for_flush(IDirect3DDeviceImpl *d3d_dev, LPCRECT
if
(
gl_d3d_dev
->
cull_face
!=
FALSE
)
glDisable
(
GL_CULL_FACE
);
if
(
use_alpha
)
{
if
(
gl_d3d_dev
->
alpha_test
==
FALSE
)
glEnable
(
GL_ALPHA_TEST
);
if
(((
d3d_dev
->
state_block
.
render_state
[
D3DRENDERSTATE_ALPHAREF
-
1
]
&
0x000000FF
)
!=
0x00
)
||
((
d3d_dev
->
state_block
.
render_state
[
D3DRENDERSTATE_ALPHAFUNC
-
1
])
!=
D3DCMP_GREATER
))
{
glAlphaFunc
(
GL_GREATER
,
0
.
0
);
}
if
((
gl_d3d_dev
->
current_alpha_test_func
!=
GL_NOTEQUAL
)
||
(
gl_d3d_dev
->
current_alpha_test_ref
!=
0
.
0
))
glAlphaFunc
(
GL_NOTEQUAL
,
0
.
0
);
}
else
{
if
(
gl_d3d_dev
->
alpha_test
!=
FALSE
)
glDisable
(
GL_ALPHA_TEST
);
}
...
...
@@ -190,11 +188,8 @@ static void d3ddevice_restore_state_after_flush(IDirect3DDeviceImpl *d3d_dev, DW
else
if
((
gl_d3d_dev
->
alpha_test
==
0
)
&&
(
use_alpha
!=
0
))
glDisable
(
GL_ALPHA_TEST
);
if
(
use_alpha
)
{
if
(((
d3d_dev
->
state_block
.
render_state
[
D3DRENDERSTATE_ALPHAREF
-
1
]
&
0x000000FF
)
!=
0x00
)
||
((
d3d_dev
->
state_block
.
render_state
[
D3DRENDERSTATE_ALPHAFUNC
-
1
])
!=
D3DCMP_GREATER
))
{
glAlphaFunc
(
convert_D3D_compare_to_GL
(
d3d_dev
->
state_block
.
render_state
[
D3DRENDERSTATE_ALPHAFUNC
-
1
]),
(
d3d_dev
->
state_block
.
render_state
[
D3DRENDERSTATE_ALPHAREF
-
1
]
&
0x000000FF
)
/
255
.
0
);
}
if
((
gl_d3d_dev
->
current_alpha_test_func
!=
GL_NOTEQUAL
)
||
(
gl_d3d_dev
->
current_alpha_test_ref
!=
0
.
0
))
glAlphaFunc
(
gl_d3d_dev
->
current_alpha_test_func
,
gl_d3d_dev
->
current_alpha_test_ref
);
}
if
(
gl_d3d_dev
->
stencil_test
!=
0
)
glEnable
(
GL_STENCIL_TEST
);
if
(
gl_d3d_dev
->
cull_face
!=
0
)
glEnable
(
GL_CULL_FACE
);
...
...
@@ -2152,6 +2147,7 @@ draw_primitive_handle_textures(IDirect3DDeviceImpl *This)
{
IDirect3DDeviceGLImpl
*
glThis
=
(
IDirect3DDeviceGLImpl
*
)
This
;
DWORD
stage
;
BOOLEAN
enable_colorkey
=
FALSE
;
for
(
stage
=
0
;
stage
<
MAX_TEXTURES
;
stage
++
)
{
IDirectDrawSurfaceImpl
*
surf_ptr
=
This
->
current_texture
[
stage
];
...
...
@@ -2208,6 +2204,55 @@ draw_primitive_handle_textures(IDirect3DDeviceImpl *This)
This will also update the various texture parameters if needed.
*/
gltex_upload_texture
(
surf_ptr
,
This
,
stage
);
/* And finally check for color-keying (only on first stage) */
if
(
This
->
current_texture
[
stage
]
->
surface_desc
.
dwFlags
&
DDSD_CKSRCBLT
)
{
if
(
stage
==
0
)
{
enable_colorkey
=
TRUE
;
}
else
{
static
BOOL
warn
=
FALSE
;
if
(
warn
==
FALSE
)
{
warn
=
TRUE
;
WARN
(
" Surface has color keying on stage different from 0 (%ld) !"
,
stage
);
}
}
}
else
{
if
(
stage
==
0
)
{
enable_colorkey
=
FALSE
;
}
}
}
/* Apparently, whatever the state of BLEND, color keying is always activated for 'old' D3D versions */
if
(((
This
->
state_block
.
render_state
[
D3DRENDERSTATE_COLORKEYENABLE
-
1
])
||
(
glThis
->
version
==
1
))
&&
(
enable_colorkey
))
{
TRACE
(
" colorkey activated.
\n
"
);
if
(
glThis
->
alpha_test
==
FALSE
)
{
glEnable
(
GL_ALPHA_TEST
);
glThis
->
alpha_test
=
TRUE
;
}
if
((
glThis
->
current_alpha_test_func
!=
GL_NOTEQUAL
)
||
(
glThis
->
current_alpha_test_ref
!=
0
.
0
))
{
if
(
This
->
state_block
.
render_state
[
D3DRENDERSTATE_ALPHATESTENABLE
-
1
]
==
TRUE
)
{
static
BOOL
warn
=
FALSE
;
if
(
warn
==
FALSE
)
{
warn
=
TRUE
;
WARN
(
" Overriding application-given alpha test values - some graphical glitches may appear !
\n
"
);
}
}
glThis
->
current_alpha_test_func
=
GL_NOTEQUAL
;
glThis
->
current_alpha_test_ref
=
0
.
0
;
glAlphaFunc
(
GL_NOTEQUAL
,
0
.
0
);
}
/* Some sanity checks should be added here if a game mixes alphatest + color keying...
Only one has been found for now, and the ALPHAFUNC is 'Always' so it works :-) */
}
else
{
if
(
This
->
state_block
.
render_state
[
D3DRENDERSTATE_ALPHATESTENABLE
-
1
]
==
FALSE
)
{
glDisable
(
GL_ALPHA_TEST
);
glThis
->
alpha_test
=
FALSE
;
}
/* Maybe we should restore here the application-given alpha test states ? */
}
return
stage
;
...
...
@@ -3712,7 +3757,7 @@ apply_texture_state(IDirect3DDeviceImpl *This)
}
HRESULT
d3ddevice_create
(
IDirect3DDeviceImpl
**
obj
,
IDirectDrawImpl
*
d3d
,
IDirectDrawSurfaceImpl
*
surface
)
d3ddevice_create
(
IDirect3DDeviceImpl
**
obj
,
IDirectDrawImpl
*
d3d
,
IDirectDrawSurfaceImpl
*
surface
,
BOOLEAN
from_surface
)
{
IDirect3DDeviceImpl
*
object
;
IDirect3DDeviceGLImpl
*
gl_object
;
...
...
@@ -3745,6 +3790,13 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirectDrawImpl *d3d, IDirectDrawSur
TRACE
(
" device critical section : %p
\n
"
,
&
(
object
->
crit
));
/* This is just a hack for some badly done games :-/ */
if
(
from_surface
)
{
gl_object
->
version
=
1
;
TRACE
(
" using D3D1 special hacks.
\n
"
);
}
else
gl_object
->
version
=
7
;
device_context
=
GetDC
(
surface
->
ddraw_owner
->
window
);
gl_object
->
display
=
get_display
(
device_context
);
gl_object
->
drawable
=
get_drawable
(
device_context
);
...
...
@@ -3868,6 +3920,9 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirectDrawImpl *d3d, IDirectDrawSur
if
(
GL_extensions
.
glActiveTexture
!=
NULL
)
{
GL_extensions
.
glActiveTexture
(
GL_TEXTURE0_WINE
);
}
gl_object
->
current_alpha_test_ref
=
0
.
0
;
gl_object
->
current_alpha_test_func
=
GL_ALWAYS
;
glAlphaFunc
(
GL_ALWAYS
,
0
.
0
);
glClear
(
GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT
|
GL_STENCIL_BUFFER_BIT
);
glDrawBuffer
(
buffer
);
...
...
dlls/ddraw/direct3d/mesa.c
View file @
b6ddd8ca
...
...
@@ -146,7 +146,7 @@ create_device_helper(IDirectDrawImpl *This,
IDirect3DDeviceImpl
*
lpd3ddev
;
HRESULT
ret_value
;
ret_value
=
d3ddevice_create
(
&
lpd3ddev
,
This
,
lpDDS
);
ret_value
=
d3ddevice_create
(
&
lpd3ddev
,
This
,
lpDDS
,
FALSE
);
if
(
FAILED
(
ret_value
))
return
ret_value
;
if
((
iid
==
NULL
)
||
...
...
dlls/ddraw/dsurface/main.c
View file @
b6ddd8ca
...
...
@@ -189,7 +189,7 @@ Main_DirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID riid,
IDirect3DDeviceImpl
*
d3ddevimpl
;
HRESULT
ret_value
;
ret_value
=
d3ddevice_create
(
&
d3ddevimpl
,
This
->
ddraw_owner
,
This
);
ret_value
=
d3ddevice_create
(
&
d3ddevimpl
,
This
->
ddraw_owner
,
This
,
TRUE
);
if
(
FAILED
(
ret_value
))
return
ret_value
;
*
ppObj
=
ICOM_INTERFACE
(
d3ddevimpl
,
IDirect3DDevice
);
...
...
dlls/ddraw/mesa.c
View file @
b6ddd8ca
...
...
@@ -333,9 +333,16 @@ void set_render_state(IDirect3DDeviceImpl* This,
break
;
case
D3DRENDERSTATE_ALPHAREF
:
/* 24 */
case
D3DRENDERSTATE_ALPHAFUNC
:
/* 25 */
glAlphaFunc
(
convert_D3D_compare_to_GL
(
lpStateBlock
->
render_state
[
D3DRENDERSTATE_ALPHAFUNC
-
1
]),
(
lpStateBlock
->
render_state
[
D3DRENDERSTATE_ALPHAREF
-
1
]
&
0x000000FF
)
/
255
.
0
);
case
D3DRENDERSTATE_ALPHAFUNC
:
{
/* 25 */
GLenum
func
=
convert_D3D_compare_to_GL
(
lpStateBlock
->
render_state
[
D3DRENDERSTATE_ALPHAFUNC
-
1
]);
GLclampf
ref
=
(
lpStateBlock
->
render_state
[
D3DRENDERSTATE_ALPHAREF
-
1
]
&
0x000000FF
)
/
255
.
0
;
if
((
func
!=
glThis
->
current_alpha_test_func
)
||
(
ref
!=
glThis
->
current_alpha_test_ref
))
{
glAlphaFunc
(
func
,
ref
);
glThis
->
current_alpha_test_func
=
func
;
glThis
->
current_alpha_test_ref
=
ref
;
}
}
break
;
case
D3DRENDERSTATE_DITHERENABLE
:
/* 26 */
...
...
@@ -352,6 +359,11 @@ void set_render_state(IDirect3DDeviceImpl* This,
glDisable
(
GL_BLEND
);
}
glThis
->
blending
=
dwRenderState
;
/* Hack for some old games ... */
if
(
glThis
->
version
==
1
)
{
lpStateBlock
->
render_state
[
D3DRENDERSTATE_COLORKEYENABLE
-
1
]
=
dwRenderState
;
}
break
;
case
D3DRENDERSTATE_FOGENABLE
:
/* 28 */
...
...
@@ -395,13 +407,7 @@ void set_render_state(IDirect3DDeviceImpl* This,
break
;
case
D3DRENDERSTATE_COLORKEYENABLE
:
/* 41 */
/* This needs to be fixed. */
if
((
dwRenderState
!=
0
)
&&
(
glThis
->
blending
==
0
))
{
glEnable
(
GL_BLEND
);
}
else
if
((
dwRenderState
==
0
)
&&
(
glThis
->
blending
!=
0
))
{
glDisable
(
GL_BLEND
);
}
glThis
->
blending
=
dwRenderState
;
/* Nothing done here, only storage matters. */
break
;
case
D3DRENDERSTATE_MIPMAPLODBIAS
:
/* 46 */
...
...
@@ -927,6 +933,8 @@ HRESULT upload_surface_to_tex_memory(RECT *rect, DWORD xoffset, DWORD yoffset, v
/* Used when converting stuff */
line_increase
=
src_d
->
u1
.
lPitch
-
(
width
*
bpp
);
TRACE
(
" uploading texture to memory using conversion %d.
\n
"
,
convert_type
);
switch
(
convert_type
)
{
case
CONVERT_PALETTED
:
{
IDirectDrawPaletteImpl
*
pal
=
current_surface
->
palette
;
...
...
@@ -996,7 +1004,7 @@ HRESULT upload_surface_to_tex_memory(RECT *rect, DWORD xoffset, DWORD yoffset, v
for
(
y
=
0
;
y
<
height
;
y
++
)
{
for
(
x
=
0
;
x
<
width
;
x
++
)
{
WORD
color
=
*
src
++
;
*
dst
=
((
color
&
0xFF
D
0
)
|
((
color
&
0x1F
)
<<
1
));
*
dst
=
((
color
&
0xFF
C
0
)
|
((
color
&
0x1F
)
<<
1
));
if
((
color
<
src_d
->
ddckCKSrcBlt
.
dwColorSpaceLowValue
)
||
(
color
>
src_d
->
ddckCKSrcBlt
.
dwColorSpaceHighValue
))
*
dst
|=
0x0001
;
...
...
dlls/ddraw/mesa_private.h
View file @
b6ddd8ca
...
...
@@ -117,6 +117,9 @@ typedef struct IDirect3DDeviceGLImpl
/* The last type of vertex drawn */
GL_TRANSFORM_STATE
transform_state
;
/* Maybe a hack, but it works */
DWORD
version
;
/* Used to handle fogging faster... */
BYTE
fog_table
[
3
*
0x10000
];
/* 3 is for R, G and B
0x10000 is 0xFF for the vertex color and
...
...
@@ -142,6 +145,8 @@ typedef struct IDirect3DDeviceGLImpl
DWORD
prev_clear_stencil
;
D3DVALUE
prev_clear_Z
;
BOOLEAN
depth_mask
,
depth_test
,
alpha_test
,
stencil_test
,
cull_face
,
lighting
,
blending
,
fogging
;
GLenum
current_alpha_test_func
;
GLclampf
current_alpha_test_ref
;
GLenum
current_tex_env
;
GLenum
current_active_tex_unit
;
}
IDirect3DDeviceGLImpl
;
...
...
@@ -180,7 +185,7 @@ extern HRESULT d3dexecutebuffer_create(IDirect3DExecuteBufferImpl **obj, IDirect
extern
HRESULT
d3dmaterial_create
(
IDirect3DMaterialImpl
**
obj
,
IDirectDrawImpl
*
d3d
);
extern
HRESULT
d3dviewport_create
(
IDirect3DViewportImpl
**
obj
,
IDirectDrawImpl
*
d3d
);
extern
HRESULT
d3dvertexbuffer_create
(
IDirect3DVertexBufferImpl
**
obj
,
IDirectDrawImpl
*
d3d
,
LPD3DVERTEXBUFFERDESC
lpD3DVertBufDesc
,
DWORD
dwFlags
);
extern
HRESULT
d3ddevice_create
(
IDirect3DDeviceImpl
**
obj
,
IDirectDrawImpl
*
d3d
,
IDirectDrawSurfaceImpl
*
surface
);
extern
HRESULT
d3ddevice_create
(
IDirect3DDeviceImpl
**
obj
,
IDirectDrawImpl
*
d3d
,
IDirectDrawSurfaceImpl
*
surface
,
BOOLEAN
from_surface
);
/* Used for Direct3D to request the device to enumerate itself */
extern
HRESULT
d3ddevice_enumerate
(
LPD3DENUMDEVICESCALLBACK
cb
,
LPVOID
context
,
DWORD
version
)
;
...
...
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