Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 1 | /* Direct3D Texture |
| 2 | (c) 1998 Lionel ULMER |
| 3 | |
| 4 | This files contains the implementation of interface Direct3DTexture2. */ |
| 5 | |
| 6 | |
David Luyer | ee517e8 | 1999-02-28 12:27:56 +0000 | [diff] [blame] | 7 | #include <string.h> |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 8 | #include "config.h" |
Jim Aston | 2e1cafa | 1999-03-14 16:35:05 +0000 | [diff] [blame] | 9 | #include "windef.h" |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 10 | #include "winerror.h" |
Francois Gouget | a94d649 | 1999-02-02 16:14:23 +0000 | [diff] [blame] | 11 | #include "wine/obj_base.h" |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 12 | #include "heap.h" |
| 13 | #include "ddraw.h" |
| 14 | #include "d3d.h" |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 15 | #include "debugtools.h" |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 16 | |
| 17 | #include "d3d_private.h" |
| 18 | |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 19 | DEFAULT_DEBUG_CHANNEL(ddraw) |
| 20 | |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 21 | #ifdef HAVE_MESAGL |
| 22 | |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 23 | /* Define this if you want to save to a file all the textures used by a game |
| 24 | (can be funny to see how they managed to cram all the pictures in |
| 25 | texture memory) */ |
| 26 | #undef TEXTURE_SNOOP |
| 27 | |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 28 | #ifdef TEXTURE_SNOOP |
| 29 | #define SNOOP_PALETTED() \ |
| 30 | { \ |
| 31 | FILE *f; \ |
| 32 | char buf[32]; \ |
| 33 | int x, y; \ |
| 34 | \ |
Lionel Ulmer | 48c0816 | 2000-01-05 01:51:02 +0000 | [diff] [blame] | 35 | sprintf(buf, "%ld.pnm", This->tex_name); \ |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 36 | f = fopen(buf, "wb"); \ |
| 37 | fprintf(f, "P6\n%ld %ld\n255\n", src_d->dwWidth, src_d->dwHeight); \ |
| 38 | for (y = 0; y < src_d->dwHeight; y++) { \ |
| 39 | for (x = 0; x < src_d->dwWidth; x++) { \ |
| 40 | unsigned char c = ((unsigned char *) src_d->y.lpSurface)[y * src_d->dwWidth + x]; \ |
| 41 | fputc(table[c][0], f); \ |
| 42 | fputc(table[c][1], f); \ |
| 43 | fputc(table[c][2], f); \ |
| 44 | } \ |
| 45 | } \ |
| 46 | fclose(f); \ |
| 47 | } |
| 48 | |
| 49 | #define SNOOP_5650() \ |
| 50 | { \ |
| 51 | FILE *f; \ |
| 52 | char buf[32]; \ |
| 53 | int x, y; \ |
| 54 | \ |
Lionel Ulmer | 48c0816 | 2000-01-05 01:51:02 +0000 | [diff] [blame] | 55 | sprintf(buf, "%ld.pnm", This->tex_name); \ |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 56 | f = fopen(buf, "wb"); \ |
| 57 | fprintf(f, "P6\n%ld %ld\n255\n", src_d->dwWidth, src_d->dwHeight); \ |
| 58 | for (y = 0; y < src_d->dwHeight; y++) { \ |
| 59 | for (x = 0; x < src_d->dwWidth; x++) { \ |
| 60 | unsigned short c = ((unsigned short *) src_d->y.lpSurface)[y * src_d->dwWidth + x]; \ |
| 61 | fputc((c & 0xF800) >> 8, f); \ |
| 62 | fputc((c & 0x07E0) >> 3, f); \ |
| 63 | fputc((c & 0x001F) << 3, f); \ |
| 64 | } \ |
| 65 | } \ |
| 66 | fclose(f); \ |
| 67 | } |
| 68 | |
| 69 | #define SNOOP_5551() \ |
| 70 | { \ |
| 71 | FILE *f; \ |
| 72 | char buf[32]; \ |
| 73 | int x, y; \ |
| 74 | \ |
Lionel Ulmer | 48c0816 | 2000-01-05 01:51:02 +0000 | [diff] [blame] | 75 | sprintf(buf, "%ld.pnm", This->tex_name); \ |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 76 | f = fopen(buf, "wb"); \ |
| 77 | fprintf(f, "P6\n%ld %ld\n255\n", src_d->dwWidth, src_d->dwHeight); \ |
| 78 | for (y = 0; y < src_d->dwHeight; y++) { \ |
| 79 | for (x = 0; x < src_d->dwWidth; x++) { \ |
| 80 | unsigned short c = ((unsigned short *) src_d->y.lpSurface)[y * src_d->dwWidth + x]; \ |
| 81 | fputc((c & 0xF800) >> 8, f); \ |
| 82 | fputc((c & 0x07C0) >> 3, f); \ |
| 83 | fputc((c & 0x003E) << 2, f); \ |
| 84 | } \ |
| 85 | } \ |
| 86 | fclose(f); \ |
| 87 | } |
| 88 | #else |
| 89 | #define SNOOP_PALETTED() |
| 90 | #define SNOOP_5650() |
| 91 | #define SNOOP_5551() |
| 92 | #endif |
| 93 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 94 | static ICOM_VTABLE(IDirect3DTexture2) texture2_vtable; |
| 95 | static ICOM_VTABLE(IDirect3DTexture) texture_vtable; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 96 | |
| 97 | /******************************************************************************* |
| 98 | * Texture2 Creation functions |
| 99 | */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 100 | LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf) |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 101 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 102 | IDirect3DTexture2Impl* tex; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 103 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 104 | tex = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DTexture2Impl)); |
| 105 | tex->ref = 1; |
Francois Gouget | 01c9ac4 | 1999-10-31 01:59:23 +0000 | [diff] [blame] | 106 | ICOM_VTBL(tex) = &texture2_vtable; |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 107 | tex->surface = surf; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 108 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 109 | return (LPDIRECT3DTEXTURE2)tex; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | /******************************************************************************* |
| 113 | * Texture Creation functions |
| 114 | */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 115 | LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf) |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 116 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 117 | IDirect3DTexture2Impl* tex; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 118 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 119 | tex = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DTexture2Impl)); |
| 120 | tex->ref = 1; |
Francois Gouget | 01c9ac4 | 1999-10-31 01:59:23 +0000 | [diff] [blame] | 121 | ICOM_VTBL(tex) = (ICOM_VTABLE(IDirect3DTexture2)*)&texture_vtable; |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 122 | tex->surface = surf; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 123 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 124 | return (LPDIRECT3DTEXTURE)tex; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 125 | } |
| 126 | |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 127 | /******************************************************************************* |
| 128 | * IDirectSurface callback methods |
| 129 | */ |
| 130 | HRESULT WINAPI SetColorKey_cb(IDirect3DTexture2Impl *texture, DWORD dwFlags, LPDDCOLORKEY ckey ) |
| 131 | { |
| 132 | DDSURFACEDESC *tex_d; |
| 133 | int bpp; |
| 134 | GLuint current_texture; |
| 135 | |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 136 | TRACE("(%p) : colorkey callback\n", texture); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 137 | |
| 138 | /* Get the texture description */ |
| 139 | tex_d = &(texture->surface->s.surface_desc); |
| 140 | bpp = (tex_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8 ? |
| 141 | 1 /* 8 bit of palette index */: |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 142 | tex_d->ddpfPixelFormat.u.dwRGBBitCount / 8 /* RGB bits for each colors */ ); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 143 | |
| 144 | /* Now, save the current texture */ |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 145 | ENTER_GL(); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 146 | glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); |
| 147 | |
| 148 | /* If the GetHandle was not done yet, it's an error */ |
| 149 | if (texture->tex_name == 0) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 150 | ERR("Unloaded texture !\n"); |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 151 | LEAVE_GL(); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 152 | return DD_OK; |
| 153 | } |
| 154 | glBindTexture(GL_TEXTURE_2D, texture->tex_name); |
| 155 | |
| 156 | if (tex_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 157 | FIXME("Todo Paletted\n"); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 158 | } else if (tex_d->ddpfPixelFormat.dwFlags & DDPF_RGB) { |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 159 | if (tex_d->ddpfPixelFormat.u.dwRGBBitCount == 8) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 160 | FIXME("Todo 3_3_2_0\n"); |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 161 | } else if (tex_d->ddpfPixelFormat.u.dwRGBBitCount == 16) { |
| 162 | if (tex_d->ddpfPixelFormat.u4.dwRGBAlphaBitMask == 0x00000000) { |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 163 | /* Now transform the 5_6_5 into a 5_5_5_1 surface to support color keying */ |
| 164 | unsigned short *dest = (unsigned short *) HeapAlloc(GetProcessHeap(), |
| 165 | HEAP_ZERO_MEMORY, |
| 166 | tex_d->dwWidth * tex_d->dwHeight * bpp); |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 167 | unsigned short *src = (unsigned short *) tex_d->u1.lpSurface; |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 168 | int x, y; |
| 169 | |
| 170 | for (y = 0; y < tex_d->dwHeight; y++) { |
| 171 | for (x = 0; x < tex_d->dwWidth; x++) { |
| 172 | unsigned short cpixel = src[x + y * tex_d->dwWidth]; |
| 173 | |
| 174 | if ((dwFlags & DDCKEY_SRCBLT) && |
| 175 | (cpixel >= ckey->dwColorSpaceLowValue) && |
| 176 | (cpixel <= ckey->dwColorSpaceHighValue)) /* No alpha bit => this pixel is transparent */ |
| 177 | dest[x + y * tex_d->dwWidth] = (cpixel & ~0x003F) | ((cpixel & 0x001F) << 1) | 0x0000; |
| 178 | else /* Alpha bit is set => this pixel will be seen */ |
| 179 | dest[x + y * tex_d->dwWidth] = (cpixel & ~0x003F) | ((cpixel & 0x001F) << 1) | 0x0001; |
| 180 | } |
| 181 | } |
| 182 | |
| 183 | glTexImage2D(GL_TEXTURE_2D, |
| 184 | 0, |
| 185 | GL_RGBA, |
| 186 | tex_d->dwWidth, tex_d->dwHeight, |
| 187 | 0, |
| 188 | GL_RGBA, |
| 189 | GL_UNSIGNED_SHORT_5_5_5_1, |
| 190 | dest); |
| 191 | |
| 192 | /* Frees the temporary surface */ |
| 193 | HeapFree(GetProcessHeap(),0,dest); |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 194 | } else if (tex_d->ddpfPixelFormat.u4.dwRGBAlphaBitMask == 0x00000001) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 195 | FIXME("Todo 5_5_5_1\n"); |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 196 | } else if (tex_d->ddpfPixelFormat.u4.dwRGBAlphaBitMask == 0x0000000F) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 197 | FIXME("Todo 4_4_4_4\n"); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 198 | } else { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 199 | ERR("Unhandled texture format (bad Aplha channel for a 16 bit texture)\n"); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 200 | } |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 201 | } else if (tex_d->ddpfPixelFormat.u.dwRGBBitCount == 24) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 202 | FIXME("Todo 8_8_8_0\n"); |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 203 | } else if (tex_d->ddpfPixelFormat.u.dwRGBBitCount == 32) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 204 | FIXME("Todo 8_8_8_8\n"); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 205 | } else { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 206 | ERR("Unhandled texture format (bad RGB count)\n"); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 207 | } |
| 208 | } else { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 209 | ERR("Unhandled texture format (neither RGB nor INDEX)\n"); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 210 | } |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 211 | LEAVE_GL(); |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 212 | |
| 213 | return DD_OK; |
| 214 | } |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 215 | |
| 216 | /******************************************************************************* |
| 217 | * IDirect3DTexture2 methods |
| 218 | */ |
| 219 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 220 | static HRESULT WINAPI IDirect3DTexture2Impl_QueryInterface(LPDIRECT3DTEXTURE2 iface, |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 221 | REFIID riid, |
| 222 | LPVOID* ppvObj) |
| 223 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 224 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 225 | |
Alexandre Julliard | 681c75b | 2000-01-18 05:09:49 +0000 | [diff] [blame] | 226 | FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 227 | |
| 228 | return S_OK; |
| 229 | } |
| 230 | |
| 231 | |
| 232 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 233 | static ULONG WINAPI IDirect3DTexture2Impl_AddRef(LPDIRECT3DTEXTURE2 iface) |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 234 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 235 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 236 | TRACE("(%p)->()incrementing from %lu.\n", This, This->ref ); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 237 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 238 | return ++(This->ref); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 239 | } |
| 240 | |
| 241 | |
| 242 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 243 | static ULONG WINAPI IDirect3DTexture2Impl_Release(LPDIRECT3DTEXTURE2 iface) |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 244 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 245 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 246 | FIXME("(%p)->() decrementing from %lu.\n", This, This->ref ); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 247 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 248 | if (!--(This->ref)) { |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 249 | /* Delete texture from OpenGL */ |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 250 | ENTER_GL(); |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 251 | glDeleteTextures(1, &(This->tex_name)); |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 252 | LEAVE_GL(); |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 253 | |
| 254 | /* Release surface */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 255 | IDirectDrawSurface4_Release((IDirectDrawSurface4*)This->surface); |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 256 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 257 | HeapFree(GetProcessHeap(),0,This); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 258 | return 0; |
| 259 | } |
| 260 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 261 | return This->ref; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 262 | } |
| 263 | |
| 264 | /*** IDirect3DTexture methods ***/ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 265 | static HRESULT WINAPI IDirect3DTextureImpl_GetHandle(LPDIRECT3DTEXTURE iface, |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 266 | LPDIRECT3DDEVICE lpD3DDevice, |
| 267 | LPD3DTEXTUREHANDLE lpHandle) |
| 268 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 269 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
| 270 | IDirect3DDeviceImpl* ilpD3DDevice=(IDirect3DDeviceImpl*)lpD3DDevice; |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 271 | FIXME("(%p)->(%p,%p): stub\n", This, ilpD3DDevice, lpHandle); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 272 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 273 | *lpHandle = (D3DTEXTUREHANDLE) This; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 274 | |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 275 | /* Now, bind a new texture */ |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 276 | ENTER_GL(); |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 277 | ilpD3DDevice->set_context(ilpD3DDevice); |
| 278 | This->D3Ddevice = (void *) ilpD3DDevice; |
| 279 | if (This->tex_name == 0) |
| 280 | glGenTextures(1, &(This->tex_name)); |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 281 | LEAVE_GL(); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 282 | |
Andreas Mohr | 8cd9351 | 2000-01-29 21:12:58 +0000 | [diff] [blame] | 283 | TRACE("OpenGL texture handle is : %d\n", This->tex_name); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 284 | |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 285 | return D3D_OK; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 286 | } |
| 287 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 288 | static HRESULT WINAPI IDirect3DTextureImpl_Initialize(LPDIRECT3DTEXTURE iface, |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 289 | LPDIRECT3DDEVICE lpD3DDevice, |
| 290 | LPDIRECTDRAWSURFACE lpSurface) |
| 291 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 292 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 293 | TRACE("(%p)->(%p,%p)\n", This, lpD3DDevice, lpSurface); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 294 | |
| 295 | return DDERR_ALREADYINITIALIZED; |
| 296 | } |
| 297 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 298 | static HRESULT WINAPI IDirect3DTextureImpl_Unload(LPDIRECT3DTEXTURE iface) |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 299 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 300 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 301 | FIXME("(%p)->(): stub\n", This); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 302 | |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 303 | return D3D_OK; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 304 | } |
| 305 | |
| 306 | /*** IDirect3DTexture2 methods ***/ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 307 | static HRESULT WINAPI IDirect3DTexture2Impl_GetHandle(LPDIRECT3DTEXTURE2 iface, |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 308 | LPDIRECT3DDEVICE2 lpD3DDevice2, |
| 309 | LPD3DTEXTUREHANDLE lpHandle) |
| 310 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 311 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
| 312 | IDirect3DDevice2Impl* ilpD3DDevice2=(IDirect3DDevice2Impl*)lpD3DDevice2; |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 313 | TRACE("(%p)->(%p,%p)\n", This, ilpD3DDevice2, lpHandle); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 314 | |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 315 | /* For 32 bits OSes, handles = pointers */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 316 | *lpHandle = (D3DTEXTUREHANDLE) This; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 317 | |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 318 | /* Now, bind a new texture */ |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 319 | ENTER_GL(); |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 320 | ilpD3DDevice2->set_context(ilpD3DDevice2); |
| 321 | This->D3Ddevice = (void *) ilpD3DDevice2; |
| 322 | if (This->tex_name == 0) |
| 323 | glGenTextures(1, &(This->tex_name)); |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 324 | LEAVE_GL(); |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 325 | |
Andreas Mohr | 8cd9351 | 2000-01-29 21:12:58 +0000 | [diff] [blame] | 326 | TRACE("OpenGL texture handle is : %d\n", This->tex_name); |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 327 | |
| 328 | return D3D_OK; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 329 | } |
| 330 | |
| 331 | /* Common methods */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 332 | static HRESULT WINAPI IDirect3DTexture2Impl_PaletteChanged(LPDIRECT3DTEXTURE2 iface, |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 333 | DWORD dwStart, |
| 334 | DWORD dwCount) |
| 335 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 336 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 337 | FIXME("(%p)->(%8ld,%8ld): stub\n", This, dwStart, dwCount); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 338 | |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 339 | return D3D_OK; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 340 | } |
| 341 | |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 342 | /* NOTE : if you experience crashes in this function, you must have a buggy |
| 343 | version of Mesa. See the file d3dtexture.c for a cure */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 344 | static HRESULT WINAPI IDirect3DTexture2Impl_Load(LPDIRECT3DTEXTURE2 iface, |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 345 | LPDIRECT3DTEXTURE2 lpD3DTexture2) |
| 346 | { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 347 | ICOM_THIS(IDirect3DTexture2Impl,iface); |
| 348 | IDirect3DTexture2Impl* ilpD3DTexture2=(IDirect3DTexture2Impl*)lpD3DTexture2; |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 349 | DDSURFACEDESC *src_d, *dst_d; |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 350 | TRACE("(%p)->(%p)\n", This, ilpD3DTexture2); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 351 | |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 352 | TRACE("Copied surface %p to surface %p\n", ilpD3DTexture2->surface, This->surface); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 353 | |
| 354 | /* Suppress the ALLOCONLOAD flag */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 355 | This->surface->s.surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD; |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 356 | |
| 357 | /* Copy one surface on the other */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 358 | dst_d = &(This->surface->s.surface_desc); |
| 359 | src_d = &(ilpD3DTexture2->surface->s.surface_desc); |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 360 | |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 361 | /* Install the callbacks to the destination surface */ |
| 362 | This->surface->s.texture = This; |
| 363 | This->surface->s.SetColorKey_cb = SetColorKey_cb; |
| 364 | |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 365 | if ((src_d->dwWidth != dst_d->dwWidth) || (src_d->dwHeight != dst_d->dwHeight)) { |
| 366 | /* Should also check for same pixel format, lPitch, ... */ |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 367 | ERR("Error in surface sizes\n"); |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 368 | return D3DERR_TEXTURE_LOAD_FAILED; |
| 369 | } else { |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 370 | /* LPDIRECT3DDEVICE2 d3dd = (LPDIRECT3DDEVICE2) This->D3Ddevice; */ |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 371 | /* I should put a macro for the calculus of bpp */ |
| 372 | int bpp = (src_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8 ? |
| 373 | 1 /* 8 bit of palette index */: |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 374 | src_d->ddpfPixelFormat.u.dwRGBBitCount / 8 /* RGB bits for each colors */ ); |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 375 | GLuint current_texture; |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 376 | |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 377 | /* Copy the main memry texture into the surface that corresponds to the OpenGL |
| 378 | texture object. */ |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 379 | memcpy(dst_d->u1.lpSurface, src_d->u1.lpSurface, src_d->dwWidth * src_d->dwHeight * bpp); |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 380 | |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 381 | ENTER_GL(); |
| 382 | |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 383 | /* Now, load the texture */ |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 384 | /* d3dd->set_context(d3dd); We need to set the context somehow.... */ |
| 385 | glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 386 | |
| 387 | /* If the GetHandle was not done, get the texture name here */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 388 | if (This->tex_name == 0) |
| 389 | glGenTextures(1, &(This->tex_name)); |
| 390 | glBindTexture(GL_TEXTURE_2D, This->tex_name); |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 391 | |
| 392 | if (src_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 393 | /* **************** |
| 394 | Paletted Texture |
| 395 | **************** */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 396 | IDirectDrawPaletteImpl* pal = This->surface->s.palette; |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 397 | BYTE table[256][4]; |
| 398 | int i; |
| 399 | |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 400 | if (pal == NULL) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 401 | ERR("Palettized texture Loading with a NULL palette !\n"); |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 402 | LEAVE_GL(); |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 403 | return D3DERR_TEXTURE_LOAD_FAILED; |
| 404 | } |
| 405 | |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 406 | /* Get the surface's palette */ |
| 407 | for (i = 0; i < 256; i++) { |
| 408 | table[i][0] = pal->palents[i].peRed; |
| 409 | table[i][1] = pal->palents[i].peGreen; |
| 410 | table[i][2] = pal->palents[i].peBlue; |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 411 | if ((This->surface->s.surface_desc.dwFlags & DDSD_CKSRCBLT) && |
| 412 | (i >= This->surface->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) && |
| 413 | (i <= This->surface->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue)) |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 414 | table[i][3] = 0x00; |
| 415 | else |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 416 | table[i][3] = 0xFF; |
| 417 | } |
| 418 | |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 419 | /* Texture snooping */ |
| 420 | SNOOP_PALETTED(); |
Lionel Ulmer | 48c0816 | 2000-01-05 01:51:02 +0000 | [diff] [blame] | 421 | |
| 422 | #if defined(HAVE_GL_COLOR_TABLE) && defined(HAVE_GL_PALETTED_TEXTURE) |
| 423 | /* use Paletted Texture Extension */ |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 424 | glColorTableEXT(GL_TEXTURE_2D, /* target */ |
| 425 | GL_RGBA, /* internal format */ |
| 426 | 256, /* table size */ |
| 427 | GL_RGBA, /* table format */ |
| 428 | GL_UNSIGNED_BYTE, /* table type */ |
| 429 | table); /* the color table */ |
| 430 | |
| 431 | glTexImage2D(GL_TEXTURE_2D, /* target */ |
| 432 | 0, /* level */ |
| 433 | GL_COLOR_INDEX8_EXT, /* internal format */ |
| 434 | src_d->dwWidth, src_d->dwHeight, /* width, height */ |
| 435 | 0, /* border */ |
| 436 | GL_COLOR_INDEX, /* texture format */ |
| 437 | GL_UNSIGNED_BYTE, /* texture type */ |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 438 | src_d->u1.lpSurface); /* the texture */ |
Lionel Ulmer | 48c0816 | 2000-01-05 01:51:02 +0000 | [diff] [blame] | 439 | #endif |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 440 | } else if (src_d->ddpfPixelFormat.dwFlags & DDPF_RGB) { |
| 441 | /* ************ |
| 442 | RGB Textures |
| 443 | ************ */ |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 444 | if (src_d->ddpfPixelFormat.u.dwRGBBitCount == 8) { |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 445 | /* ********************** |
| 446 | GL_UNSIGNED_BYTE_3_3_2 |
| 447 | ********************** */ |
| 448 | glTexImage2D(GL_TEXTURE_2D, |
| 449 | 0, |
| 450 | GL_RGB, |
| 451 | src_d->dwWidth, src_d->dwHeight, |
| 452 | 0, |
| 453 | GL_RGB, |
| 454 | GL_UNSIGNED_BYTE_3_3_2, |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 455 | src_d->u1.lpSurface); |
| 456 | } else if (src_d->ddpfPixelFormat.u.dwRGBBitCount == 16) { |
| 457 | if (src_d->ddpfPixelFormat.u4.dwRGBAlphaBitMask == 0x00000000) { |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 458 | |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 459 | /* Texture snooping */ |
| 460 | SNOOP_5650(); |
| 461 | |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 462 | glTexImage2D(GL_TEXTURE_2D, |
| 463 | 0, |
| 464 | GL_RGB, |
| 465 | src_d->dwWidth, src_d->dwHeight, |
| 466 | 0, |
| 467 | GL_RGB, |
| 468 | GL_UNSIGNED_SHORT_5_6_5, |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 469 | src_d->u1.lpSurface); |
| 470 | } else if (src_d->ddpfPixelFormat.u4.dwRGBAlphaBitMask == 0x00000001) { |
Lionel Ulmer | 81c7544 | 1999-04-06 07:10:48 +0000 | [diff] [blame] | 471 | /* Texture snooping */ |
| 472 | SNOOP_5551(); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 473 | |
| 474 | glTexImage2D(GL_TEXTURE_2D, |
| 475 | 0, |
| 476 | GL_RGBA, |
| 477 | src_d->dwWidth, src_d->dwHeight, |
| 478 | 0, |
| 479 | GL_RGBA, |
| 480 | GL_UNSIGNED_SHORT_5_5_5_1, |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 481 | src_d->u1.lpSurface); |
| 482 | } else if (src_d->ddpfPixelFormat.u4.dwRGBAlphaBitMask == 0x0000000F) { |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 483 | glTexImage2D(GL_TEXTURE_2D, |
| 484 | 0, |
| 485 | GL_RGBA, |
| 486 | src_d->dwWidth, src_d->dwHeight, |
| 487 | 0, |
| 488 | GL_RGBA, |
| 489 | GL_UNSIGNED_SHORT_4_4_4_4, |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 490 | src_d->u1.lpSurface); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 491 | } else { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 492 | ERR("Unhandled texture format (bad Aplha channel for a 16 bit texture)\n"); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 493 | } |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 494 | } else if (src_d->ddpfPixelFormat.u.dwRGBBitCount == 24) { |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 495 | glTexImage2D(GL_TEXTURE_2D, |
| 496 | 0, |
| 497 | GL_RGB, |
| 498 | src_d->dwWidth, src_d->dwHeight, |
| 499 | 0, |
| 500 | GL_RGB, |
| 501 | GL_UNSIGNED_BYTE, |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 502 | src_d->u1.lpSurface); |
| 503 | } else if (src_d->ddpfPixelFormat.u.dwRGBBitCount == 32) { |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 504 | glTexImage2D(GL_TEXTURE_2D, |
| 505 | 0, |
| 506 | GL_RGBA, |
| 507 | src_d->dwWidth, src_d->dwHeight, |
| 508 | 0, |
| 509 | GL_RGBA, |
| 510 | GL_UNSIGNED_BYTE, |
Ove Kaaven | 1d4bccc | 1999-10-23 18:52:17 +0000 | [diff] [blame] | 511 | src_d->u1.lpSurface); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 512 | } else { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 513 | ERR("Unhandled texture format (bad RGB count)\n"); |
Lionel Ulmer | 1d3e501 | 1999-01-23 12:32:46 +0000 | [diff] [blame] | 514 | } |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 515 | } else { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 516 | ERR("Unhandled texture format (neither RGB nor INDEX)\n"); |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 517 | } |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 518 | |
| 519 | glBindTexture(GL_TEXTURE_2D, current_texture); |
Lionel Ulmer | ad72585 | 1999-05-13 18:53:05 +0000 | [diff] [blame] | 520 | |
| 521 | LEAVE_GL(); |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 522 | } |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 523 | |
Alexandre Julliard | 8da12c4 | 1999-01-17 16:55:11 +0000 | [diff] [blame] | 524 | return D3D_OK; |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 525 | } |
| 526 | |
| 527 | |
| 528 | /******************************************************************************* |
| 529 | * IDirect3DTexture2 VTable |
| 530 | */ |
Paul Quinn | 2305f3c | 1999-05-22 11:41:38 +0000 | [diff] [blame] | 531 | static ICOM_VTABLE(IDirect3DTexture2) texture2_vtable = |
| 532 | { |
| 533 | ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 534 | /*** IUnknown methods ***/ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 535 | IDirect3DTexture2Impl_QueryInterface, |
| 536 | IDirect3DTexture2Impl_AddRef, |
| 537 | IDirect3DTexture2Impl_Release, |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 538 | /*** IDirect3DTexture methods ***/ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 539 | IDirect3DTexture2Impl_GetHandle, |
| 540 | IDirect3DTexture2Impl_PaletteChanged, |
| 541 | IDirect3DTexture2Impl_Load |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 542 | }; |
| 543 | |
| 544 | /******************************************************************************* |
| 545 | * IDirect3DTexture VTable |
| 546 | */ |
Paul Quinn | 2305f3c | 1999-05-22 11:41:38 +0000 | [diff] [blame] | 547 | static ICOM_VTABLE(IDirect3DTexture) texture_vtable = |
| 548 | { |
| 549 | ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 550 | /*** IUnknown methods ***/ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 551 | IDirect3DTexture2Impl_QueryInterface, |
| 552 | IDirect3DTexture2Impl_AddRef, |
| 553 | IDirect3DTexture2Impl_Release, |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 554 | /*** IDirect3DTexture methods ***/ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 555 | IDirect3DTextureImpl_Initialize, |
| 556 | IDirect3DTextureImpl_GetHandle, |
| 557 | IDirect3DTexture2Impl_PaletteChanged, |
| 558 | IDirect3DTexture2Impl_Load, |
| 559 | IDirect3DTextureImpl_Unload |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 560 | }; |
| 561 | |
| 562 | #else /* HAVE_MESAGL */ |
| 563 | |
| 564 | /* These function should never be called if MesaGL is not present */ |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 565 | LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 566 | ERR("Should not be called...\n"); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 567 | return NULL; |
| 568 | } |
| 569 | |
Francois Gouget | 022d372 | 1999-03-27 16:56:13 +0000 | [diff] [blame] | 570 | LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf) { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 571 | ERR("Should not be called...\n"); |
Lionel Ulmer | 5ff0077 | 1999-01-03 17:00:19 +0000 | [diff] [blame] | 572 | return NULL; |
| 573 | } |
| 574 | |
| 575 | #endif /* HAVE_MESAGL */ |