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
b07df8a1
Commit
b07df8a1
authored
Jan 02, 2003
by
Lionel Ulmer
Committed by
Alexandre Julliard
Jan 02, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- allow application to load palette-less textures
- handle palette change of loaded textures - some changes in the ExecuteBuffer
parent
bb9837d2
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
84 additions
and
54 deletions
+84
-54
d3dexecutebuffer.c
dlls/ddraw/d3dexecutebuffer.c
+29
-35
d3dtexture.c
dlls/ddraw/d3dtexture.c
+50
-19
main.c
dlls/ddraw/dsurface/main.c
+4
-0
mesa_private.h
dlls/ddraw/mesa_private.h
+1
-0
No files found.
dlls/ddraw/d3dexecutebuffer.c
View file @
b07df8a1
...
...
@@ -217,12 +217,12 @@ static void execute(IDirect3DExecuteBufferImpl *This,
switch
(
current
->
bOpcode
)
{
case
D3DOP_POINT
:
{
TRACE
(
"POINT-s (%d)
\n
"
,
count
);
WARN
(
"POINT-s (%d)
\n
"
,
count
);
instr
+=
count
*
size
;
}
break
;
case
D3DOP_LINE
:
{
TRACE
(
"LINE-s (%d)
\n
"
,
count
);
WARN
(
"LINE-s (%d)
\n
"
,
count
);
instr
+=
count
*
size
;
}
break
;
...
...
@@ -278,37 +278,31 @@ static void execute(IDirect3DExecuteBufferImpl *This,
break
;
case
D3DVT_TLVERTEX
:
{
GLdouble
height
,
width
,
minZ
,
maxZ
;
GLdouble
height
,
width
;
GLfloat
trans_mat
[
16
];
/* First, disable lighting */
glDisable
(
GL_LIGHTING
);
/* Then do not put any transformation matrixes */
width
=
lpDevice
->
surface
->
surface_desc
.
dwWidth
;
height
=
lpDevice
->
surface
->
surface_desc
.
dwHeight
;
/* The X axis is straighforward.. For the Y axis, we need to convert 'D3D' screen coordinates
to OpenGL screen coordinates (ie the upper left corner is not the same).
For Z, the mystery is what should it be mapped to ? Ie should the resulting range be between
-1.0 and 1.0 (as the X and Y coordinates) or between 0.0 and 1.0 ? */
trans_mat
[
0
]
=
2
.
0
/
width
;
trans_mat
[
4
]
=
0
.
0
;
trans_mat
[
8
]
=
0
.
0
;
trans_mat
[
12
]
=
-
1
.
0
;
trans_mat
[
1
]
=
0
.
0
;
trans_mat
[
5
]
=
-
2
.
0
/
height
;
trans_mat
[
9
]
=
0
.
0
;
trans_mat
[
13
]
=
1
.
0
;
trans_mat
[
2
]
=
0
.
0
;
trans_mat
[
6
]
=
0
.
0
;
trans_mat
[
10
]
=
1
.
0
;
trans_mat
[
14
]
=
-
1
.
0
;
trans_mat
[
3
]
=
0
.
0
;
trans_mat
[
7
]
=
0
.
0
;
trans_mat
[
11
]
=
0
.
0
;
trans_mat
[
15
]
=
1
.
0
;
glMatrixMode
(
GL_MODELVIEW
);
glLoadIdentity
();
glMatrixMode
(
GL_PROJECTION
);
glLoadIdentity
();
if
(
lpViewport
==
NULL
)
{
ERR
(
"No current viewport !
\n
"
);
/* Using standard values */
height
=
640
.
0
;
width
=
480
.
0
;
minZ
=
-
10
.
0
;
maxZ
=
10
.
0
;
}
else
{
height
=
(
GLdouble
)
lpViewport
->
viewports
.
vp1
.
dwHeight
;
width
=
(
GLdouble
)
lpViewport
->
viewports
.
vp1
.
dwWidth
;
minZ
=
(
GLdouble
)
lpViewport
->
viewports
.
vp1
.
dvMinZ
;
maxZ
=
(
GLdouble
)
lpViewport
->
viewports
.
vp1
.
dvMaxZ
;
if
(
minZ
==
maxZ
)
{
/* I do not know why, but many Dx 3.0 games have minZ = maxZ = 0.0 */
minZ
=
0
.
0
;
maxZ
=
1
.
0
;
}
}
glOrtho
(
0
.
0
,
width
,
height
,
0
.
0
,
-
minZ
,
-
maxZ
);
glLoadMatrixf
(
trans_mat
);
/* Remove also fogging... */
glDisable
(
GL_FOG
);
}
break
;
default:
...
...
@@ -335,7 +329,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
}
break
;
case
D3DOP_MATRIXLOAD
:
TRACE
(
"MATRIXLOAD-s (%d)
\n
"
,
count
);
WARN
(
"MATRIXLOAD-s (%d)
\n
"
,
count
);
instr
+=
count
*
size
;
break
;
...
...
@@ -440,23 +434,23 @@ static void execute(IDirect3DExecuteBufferImpl *This,
}
break
;
case
D3DLIGHTSTATE_COLORMODEL
:
{
TRACE
(
" COLORMODEL
\n
"
);
WARN
(
" COLORMODEL
\n
"
);
}
break
;
case
D3DLIGHTSTATE_FOGMODE
:
{
TRACE
(
" FOGMODE
\n
"
);
WARN
(
" FOGMODE
\n
"
);
}
break
;
case
D3DLIGHTSTATE_FOGSTART
:
{
TRACE
(
" FOGSTART
\n
"
);
WARN
(
" FOGSTART
\n
"
);
}
break
;
case
D3DLIGHTSTATE_FOGEND
:
{
TRACE
(
" FOGEND
\n
"
);
WARN
(
" FOGEND
\n
"
);
}
break
;
case
D3DLIGHTSTATE_FOGDENSITY
:
{
TRACE
(
" FOGDENSITY
\n
"
);
WARN
(
" FOGDENSITY
\n
"
);
}
break
;
default:
...
...
@@ -605,7 +599,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
}
break
;
case
D3DOP_TEXTURELOAD
:
{
TRACE
(
"TEXTURELOAD-s (%d)
\n
"
,
count
);
WARN
(
"TEXTURELOAD-s (%d)
\n
"
,
count
);
instr
+=
count
*
size
;
}
break
;
...
...
@@ -640,7 +634,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
}
break
;
case
D3DOP_SPAN
:
{
TRACE
(
"SPAN-s (%d)
\n
"
,
count
);
WARN
(
"SPAN-s (%d)
\n
"
,
count
);
instr
+=
count
*
size
;
}
break
;
...
...
@@ -737,7 +731,7 @@ Main_IDirect3DExecuteBufferImpl_1_Lock(LPDIRECT3DEXECUTEBUFFER iface,
{
ICOM_THIS_FROM
(
IDirect3DExecuteBufferImpl
,
IDirect3DExecuteBuffer
,
iface
);
DWORD
dwSize
;
TRACE
(
"(%p/%p)->(%p)
: stub!
\n
"
,
This
,
iface
,
lpDesc
);
TRACE
(
"(%p/%p)->(%p)
\n
"
,
This
,
iface
,
lpDesc
);
dwSize
=
lpDesc
->
dwSize
;
memset
(
lpDesc
,
0
,
dwSize
);
...
...
dlls/ddraw/d3dtexture.c
View file @
b07df8a1
...
...
@@ -177,21 +177,22 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) {
#endif
if
(
pal
==
NULL
)
{
ERR
(
"Palettized texture Loading with a NULL palette !
\n
"
);
glBindTexture
(
GL_TEXTURE_2D
,
current_texture
);
return
D3DERR_INVALIDPALETTE
;
}
/* Get the surface's palette */
for
(
i
=
0
;
i
<
256
;
i
++
)
{
table
[
i
][
0
]
=
pal
->
palents
[
i
].
peRed
;
table
[
i
][
1
]
=
pal
->
palents
[
i
].
peGreen
;
table
[
i
][
2
]
=
pal
->
palents
[
i
].
peBlue
;
if
((
src_d
->
dwFlags
&
DDSD_CKSRCBLT
)
&&
(
i
>=
src_d
->
ddckCKSrcBlt
.
dwColorSpaceLowValue
)
&&
(
i
<=
src_d
->
ddckCKSrcBlt
.
dwColorSpaceHighValue
))
table
[
i
][
3
]
=
0x00
;
else
table
[
i
][
3
]
=
0xFF
;
/* Upload a black texture. The real one will be uploaded on palette change */
WARN
(
"Palettized texture Loading with a NULL palette !
\n
"
);
memset
(
table
,
0
,
256
*
4
);
}
else
{
/* Get the surface's palette */
for
(
i
=
0
;
i
<
256
;
i
++
)
{
table
[
i
][
0
]
=
pal
->
palents
[
i
].
peRed
;
table
[
i
][
1
]
=
pal
->
palents
[
i
].
peGreen
;
table
[
i
][
2
]
=
pal
->
palents
[
i
].
peBlue
;
if
((
src_d
->
dwFlags
&
DDSD_CKSRCBLT
)
&&
(
i
>=
src_d
->
ddckCKSrcBlt
.
dwColorSpaceLowValue
)
&&
(
i
<=
src_d
->
ddckCKSrcBlt
.
dwColorSpaceHighValue
))
table
[
i
][
3
]
=
0x00
;
else
table
[
i
][
3
]
=
0xFF
;
}
}
if
(
ptr_ColorTableEXT
!=
NULL
)
{
...
...
@@ -373,6 +374,19 @@ Main_IDirect3DTextureImpl_2_1T_Load(LPDIRECT3DTEXTURE2 iface,
return
DD_OK
;
}
static
void
gltex_set_palette
(
IDirectDrawSurfaceImpl
*
This
,
IDirectDrawPaletteImpl
*
pal
)
{
IDirect3DTextureGLImpl
*
glThis
=
(
IDirect3DTextureGLImpl
*
)
This
->
tex_private
;
/* First call the previous set_palette function */
glThis
->
set_palette
(
This
,
pal
);
/* Then re-upload the texture to OpenGL */
ENTER_GL
();
gltex_upload_texture
(
This
,
glThis
->
first_unlock
);
LEAVE_GL
();
}
static
void
gltex_final_release
(
IDirectDrawSurfaceImpl
*
This
)
{
...
...
@@ -415,12 +429,12 @@ gltex_unlock_update(IDirectDrawSurfaceImpl* This, LPCRECT pRect)
{
IDirect3DTextureGLImpl
*
glThis
=
(
IDirect3DTextureGLImpl
*
)
This
->
tex_private
;
glThis
->
unlock_update
(
This
,
pRect
);
ENTER_GL
();
gltex_upload_texture
(
This
,
glThis
->
first_unlock
);
LEAVE_GL
();
glThis
->
first_unlock
=
FALSE
;
glThis
->
unlock_update
(
This
,
pRect
);
}
HRESULT
WINAPI
...
...
@@ -490,7 +504,22 @@ GL_IDirect3DTextureImpl_2_1T_Load(LPDIRECT3DTEXTURE2 iface,
/* Suppress the ALLOCONLOAD flag */
This
->
surface_desc
.
ddsCaps
.
dwCaps
&=
~
DDSCAPS_ALLOCONLOAD
;
This
->
palette
=
lpD3DTextureImpl
->
palette
;
/* After seeing some logs, not sure at all about this... */
if
(
This
->
palette
==
NULL
)
{
This
->
palette
=
lpD3DTextureImpl
->
palette
;
if
(
lpD3DTextureImpl
->
palette
!=
NULL
)
IDirectDrawPalette_AddRef
(
ICOM_INTERFACE
(
lpD3DTextureImpl
->
palette
,
IDirectDrawPalette
));
}
else
{
if
(
lpD3DTextureImpl
->
palette
!=
NULL
)
{
PALETTEENTRY
palent
[
256
];
IDirectDrawPalette
*
pal_int
=
ICOM_INTERFACE
(
lpD3DTextureImpl
->
palette
,
IDirectDrawPalette
);
IDirectDrawPalette_AddRef
(
pal_int
);
IDirectDrawPalette_GetEntries
(
pal_int
,
0
,
0
,
256
,
palent
);
IDirectDrawPalette_SetEntries
(
ICOM_INTERFACE
(
This
->
palette
,
IDirectDrawPalette
),
0
,
0
,
256
,
palent
);
}
}
/* Copy one surface on the other */
dst_d
=
(
DDSURFACEDESC
*
)
&
(
This
->
surface_desc
);
...
...
@@ -676,6 +705,7 @@ HRESULT d3dtexture_create(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surf, BOOL
private
->
final_release
=
surf
->
final_release
;
private
->
lock_update
=
surf
->
lock_update
;
private
->
unlock_update
=
surf
->
unlock_update
;
private
->
set_palette
=
surf
->
set_palette
;
/* If at creation, we can optimize stuff and wait the first 'unlock' to upload a valid stuff to OpenGL.
Otherwise, it will be uploaded here (and may be invalid). */
...
...
@@ -688,7 +718,8 @@ HRESULT d3dtexture_create(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surf, BOOL
surf
->
unlock_update
=
gltex_unlock_update
;
surf
->
tex_private
=
private
;
surf
->
aux_setcolorkey_cb
=
gltex_setcolorkey_cb
;
surf
->
set_palette
=
gltex_set_palette
;
ENTER_GL
();
if
(
surf
->
mipmap_level
==
0
)
{
glGenTextures
(
1
,
&
(
private
->
tex_name
));
...
...
dlls/ddraw/dsurface/main.c
View file @
b07df8a1
...
...
@@ -100,6 +100,10 @@ HRESULT Main_DirectDrawSurface_late_allocate(IDirectDrawSurfaceImpl* This)
static
void
Main_DirectDrawSurface_Destroy
(
IDirectDrawSurfaceImpl
*
This
)
{
if
(
This
->
palette
)
{
IDirectDrawPalette_Release
(
ICOM_INTERFACE
(
This
->
palette
,
IDirectDrawPalette
));
This
->
palette
=
NULL
;
}
This
->
final_release
(
This
);
if
(
This
->
private
!=
This
+
1
)
HeapFree
(
GetProcessHeap
(),
0
,
This
->
private
);
if
(
This
->
tex_private
)
HeapFree
(
GetProcessHeap
(),
0
,
This
->
tex_private
);
...
...
dlls/ddraw/mesa_private.h
View file @
b07df8a1
...
...
@@ -100,6 +100,7 @@ typedef struct IDirect3DTextureGLImpl
void
(
*
final_release
)(
struct
IDirectDrawSurfaceImpl
*
This
);
void
(
*
lock_update
)(
IDirectDrawSurfaceImpl
*
This
,
LPCRECT
pRect
,
DWORD
dwFlags
);
void
(
*
unlock_update
)(
IDirectDrawSurfaceImpl
*
This
,
LPCRECT
pRect
);
void
(
*
set_palette
)(
IDirectDrawSurfaceImpl
*
This
,
IDirectDrawPaletteImpl
*
pal
);
}
IDirect3DTextureGLImpl
;
typedef
struct
IDirect3DDeviceGLImpl
...
...
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