comparison src/video/win32/SDL_ceddrawrender.c @ 3168:6338b7f2d024

Hi, I have prepared a set of patches to readd WindowsCE support to SDL 1.3. I've created a new GAPI/Rawframebuffer and a DirectDraw renderer. Both renderers are work in progress and there are several unimplemented cases. (Notably RenderLine/RenderPoint/RenderFill/QueryTexturePixels/UpdateTexture and texture blending ) Nevertheless I am successfully using these renderers together with the SDL software renderer. (On most devices the SDL software renderer will be much faster as there are only badly optimized vendor drivers available) I send these patches now in this unpolished state because there seems to be some interest in win ce and someone has to start supporting SDL 1.3 Now on to the patches: wince_events_window_fixes.patch fixes some wince incompatibilities and adds fullscreen support via SHFullScreen. NOTE: This patch shouldn't have any side effects on Windows, but I have NOT tested it on Windows, so please double-check. This patch doesn't dependent on the following ones. wince_renderers_system.patch This patch does all necessary modifications to the SDL system. - it adds the renderers to the configure system - it adds the renderers to win32video SDL_ceddrawrender.c SDL_ceddrawrender.h SDL_gapirender_c.h SDL_gapirender.c SDL_gapirender.h these files add the new render drivers and should be placed in src/video/win32 Some notes to people who want to test this: - I have only compiled sdl with ming32ce, so the VisualC files are not up to date - As mingw32ce has no ddraw.h this file must be taken from the MS SDK and modified to work with gcc - I had to modify line 2611 in configure.in to EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lcoredll -lcommctrl -lmmtimer -Wl,--image-base -Wl,0x10000" otherwise GetCPinfo wouldn't link. If someone knows whats causing this I'd be happy to hear about it. It would be great if these patches could make their way into SVN as this would make collaboration much much easier. I'm out of office for the next week and therefore will be unavailable via email. Regards Stefan
author Sam Lantinga <slouken@libsdl.org>
date Sun, 07 Jun 2009 02:44:46 +0000
parents
children 83518f8fcd61
comparison
equal deleted inserted replaced
3167:0c85abc61e47 3168:6338b7f2d024
1 /*
2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997-2009 Sam Lantinga
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 Sam Lantinga
20 slouken@libsdl.org
21
22 Stefan Klug
23 klug.stefan@gmx.de
24 */
25 #include "SDL_config.h"
26
27 #if SDL_VIDEO_RENDER_DDRAW
28
29 #include "SDL_win32video.h"
30 #include "../SDL_yuv_sw_c.h"
31
32 #if 0
33 #define DDRAW_LOG(...) printf(__VA_ARGS__)
34 #else
35 #define DDRAW_LOG(...)
36 #endif
37
38
39 /* DirectDraw renderer implementation */
40
41 static SDL_Renderer *DDRAW_CreateRenderer(SDL_Window * window, Uint32 flags);
42 static int DDRAW_DisplayModeChanged(SDL_Renderer * renderer);
43 static int DDRAW_CreateTexture(SDL_Renderer * renderer,
44 SDL_Texture * texture);
45 static int DDRAW_QueryTexturePixels(SDL_Renderer * renderer,
46 SDL_Texture * texture, void **pixels,
47 int *pitch);
48 static int DDRAW_SetTextureColorMod(SDL_Renderer * renderer,
49 SDL_Texture * texture);
50 static int DDRAW_SetTextureAlphaMod(SDL_Renderer * renderer,
51 SDL_Texture * texture);
52 static int DDRAW_SetTextureBlendMode(SDL_Renderer * renderer,
53 SDL_Texture * texture);
54 static int DDRAW_SetTextureScaleMode(SDL_Renderer * renderer,
55 SDL_Texture * texture);
56 static int DDRAW_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
57 const SDL_Rect * rect, const void *pixels,
58 int pitch);
59 static int DDRAW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
60 const SDL_Rect * rect, int markDirty,
61 void **pixels, int *pitch);
62 static void DDRAW_UnlockTexture(SDL_Renderer * renderer,
63 SDL_Texture * texture);
64 static void DDRAW_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
65 int numrects, const SDL_Rect * rects);
66 static int DDRAW_RenderPoint(SDL_Renderer * renderer, int x, int y);
67 static int DDRAW_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2,
68 int y2);
69 static int DDRAW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect);
70 static int DDRAW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
71 const SDL_Rect * srcrect,
72 const SDL_Rect * dstrect);
73 static void DDRAW_RenderPresent(SDL_Renderer * renderer);
74 static void DDRAW_DestroyTexture(SDL_Renderer * renderer,
75 SDL_Texture * texture);
76 static void DDRAW_DestroyRenderer(SDL_Renderer * renderer);
77
78
79 SDL_RenderDriver DDRAW_RenderDriver = {
80 DDRAW_CreateRenderer,
81 {
82 "ddraw",
83 (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
84 SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
85 SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED),
86 (SDL_TEXTUREMODULATE_NONE),
87 (SDL_BLENDMODE_NONE),
88 (SDL_TEXTURESCALEMODE_NONE),
89 0,
90 {0},
91 0,
92 0}
93 };
94
95 typedef struct
96 {
97 IDirectDraw *ddraw;
98 IDirectDrawSurface *primary;
99 } DDRAW_RenderData;
100
101 typedef struct
102 {
103 RECT lock;
104 IDirectDrawSurface *surface;
105 } DDRAW_TextureData;
106
107
108 static void
109 DDRAW_SetError(const char *prefix, HRESULT result)
110 {
111 const char *error;
112
113 switch (result) {
114 case DDERR_CANTCREATEDC:
115 error = "CANTCREATEDC";
116 break;
117 case DDERR_CANTLOCKSURFACE:
118 error = "CANTLOCKSURFACE";
119 break;
120 case DDERR_CLIPPERISUSINGHWND:
121 error = "CLIPPERISUSINGHWND";
122 break;
123 case DDERR_COLORKEYNOTSET:
124 error = "COLORKEYNOTSET";
125 break;
126 case DDERR_CURRENTLYNOTAVAIL:
127 error = "CURRENTLYNOTAVAIL";
128 break;
129 case DDERR_DCALREADYCREATED:
130 error = "DCALREADYCREATED";
131 break;
132 case DDERR_DEVICEDOESNTOWNSURFACE:
133 error = "DEVICEDOESNTOWNSURFACE";
134 break;
135 case DDERR_DIRECTDRAWALREADYCREATED:
136 error = "DIRECTDRAWALREADYCREATED";
137 break;
138 case DDERR_EXCLUSIVEMODEALREADYSET:
139 error = "EXCLUSIVEMODEALREADYSET";
140 break;
141 case DDERR_GENERIC:
142 error = "GENERIC";
143 break;
144 case DDERR_HEIGHTALIGN:
145 error = "HEIGHTALIGN";
146 break;
147 case DDERR_IMPLICITLYCREATED:
148 error = "IMPLICITLYCREATED";
149 break;
150 case DDERR_INCOMPATIBLEPRIMARY:
151 error = "INCOMPATIBLEPRIMARY";
152 break;
153 case DDERR_INVALIDCAPS:
154 error = "INVALIDCAPS";
155 break;
156 case DDERR_INVALIDCLIPLIST:
157 error = "INVALIDCLIPLIST";
158 break;
159 case DDERR_INVALIDMODE:
160 error = "INVALIDMODE";
161 break;
162 case DDERR_INVALIDOBJECT:
163 error = "INVALIDOBJECT";
164 break;
165 case DDERR_INVALIDPARAMS:
166 error = "INVALIDPARAMS";
167 break;
168 case DDERR_INVALIDPIXELFORMAT:
169 error = "INVALIDPIXELFORMAT";
170 break;
171 case DDERR_INVALIDPOSITION:
172 error = "INVALIDPOSITION";
173 break;
174 case DDERR_INVALIDRECT:
175 error = "INVALIDRECT";
176 break;
177 case DDERR_LOCKEDSURFACES:
178 error = "LOCKEDSURFACES";
179 break;
180 case DDERR_MOREDATA:
181 error = "MOREDATA";
182 break;
183 case DDERR_NOALPHAHW:
184 error = "NOALPHAHW";
185 break;
186 case DDERR_NOBLTHW:
187 error = "NOBLTHW";
188 break;
189 case DDERR_NOCLIPLIST:
190 error = "NOCLIPLIST";
191 break;
192 case DDERR_NOCLIPPERATTACHED:
193 error = "NOCLIPPERATTACHED";
194 break;
195 case DDERR_NOCOLORCONVHW:
196 error = "NOCOLORCONVHW";
197 break;
198 case DDERR_NOCOLORKEYHW:
199 error = "NOCOLORKEYHW";
200 break;
201 case DDERR_NOCOOPERATIVELEVELSET:
202 error = "NOCOOPERATIVELEVELSET";
203 break;
204 case DDERR_NODC:
205 error = "NODC";
206 break;
207 case DDERR_NOFLIPHW:
208 error = "NOFLIPHW";
209 break;
210 case DDERR_NOOVERLAYDEST:
211 error = "NOOVERLAYDEST";
212 break;
213 case DDERR_NOOVERLAYHW:
214 error = "NOOVERLAYHW";
215 break;
216 case DDERR_NOPALETTEATTACHED:
217 error = "NOPALETTEATTACHED";
218 break;
219 case DDERR_NOPALETTEHW:
220 error = "NOPALETTEHW";
221 break;
222 case DDERR_NORASTEROPHW:
223 error = "NORASTEROPHW";
224 break;
225 case DDERR_NOSTRETCHHW:
226 error = "NOSTRETCHHW";
227 break;
228 case DDERR_NOTAOVERLAYSURFACE:
229 error = "NOTAOVERLAYSURFACE";
230 break;
231 case DDERR_NOTFLIPPABLE:
232 error = "NOTFLIPPABLE";
233 break;
234 case DDERR_NOTFOUND:
235 error = "NOTFOUND";
236 break;
237 case DDERR_NOTLOCKED:
238 error = "NOTLOCKED";
239 break;
240 case DDERR_NOTPALETTIZED:
241 error = "NOTPALETTIZED";
242 break;
243 case DDERR_NOVSYNCHW:
244 error = "NOVSYNCHW";
245 break;
246 case DDERR_NOZOVERLAYHW:
247 error = "NOZOVERLAYHW";
248 break;
249 case DDERR_OUTOFCAPS:
250 error = "OUTOFCAPS";
251 break;
252 case DDERR_OUTOFMEMORY:
253 error = "OUTOFMEMORY";
254 break;
255 case DDERR_OUTOFVIDEOMEMORY:
256 error = "OUTOFVIDEOMEMORY";
257 break;
258 case DDERR_OVERLAPPINGRECTS:
259 error = "OVERLAPPINGRECTS";
260 break;
261 case DDERR_OVERLAYNOTVISIBLE:
262 error = "OVERLAYNOTVISIBLE";
263 break;
264 case DDERR_PALETTEBUSY:
265 error = "PALETTEBUSY";
266 break;
267 case DDERR_PRIMARYSURFACEALREADYEXISTS:
268 error = "PRIMARYSURFACEALREADYEXISTS";
269 break;
270 case DDERR_REGIONTOOSMALL:
271 error = "REGIONTOOSMALL";
272 break;
273 case DDERR_SURFACEBUSY:
274 error = "SURFACEBUSY";
275 break;
276 case DDERR_SURFACELOST:
277 error = "SURFACELOST";
278 break;
279 case DDERR_TOOBIGHEIGHT:
280 error = "TOOBIGHEIGHT";
281 break;
282 case DDERR_TOOBIGSIZE:
283 error = "TOOBIGSIZE";
284 break;
285 case DDERR_TOOBIGWIDTH:
286 error = "TOOBIGWIDTH";
287 break;
288 case DDERR_UNSUPPORTED:
289 error = "UNSUPPORTED";
290 break;
291 case DDERR_UNSUPPORTEDFORMAT:
292 error = "UNSUPPORTEDFORMAT";
293 break;
294 case DDERR_VERTICALBLANKINPROGRESS:
295 error = "VERTICALBLANKINPROGRESS";
296 break;
297 case DDERR_VIDEONOTACTIVE:
298 error = "VIDEONOTACTIVE";
299 break;
300 case DDERR_WASSTILLDRAWING:
301 error = "WASSTILLDRAWING";
302 break;
303 case DDERR_WRONGMODE:
304 error = "WRONGMODE";
305 break;
306 default:
307 error = "UNKNOWN";
308 break;
309 }
310 SDL_SetError("%s: %s", prefix, error);
311 }
312
313 static SDL_bool
314 PixelFormatToDDPIXELFORMAT(Uint32 format, LPDDPIXELFORMAT dst)
315 {
316 SDL_zerop(dst);
317 dst->dwSize = sizeof(*dst);
318
319 if (SDL_ISPIXELFORMAT_FOURCC(format)) {
320 dst->dwFlags = DDPF_FOURCC;
321 dst->dwFourCC = format;
322 } else if (SDL_ISPIXELFORMAT_INDEXED(format)) {
323 SDL_SetError("Indexed pixelformats are not supported.");
324 return SDL_FALSE;
325 } else {
326 int bpp;
327 Uint32 Rmask, Gmask, Bmask, Amask;
328 if (!SDL_PixelFormatEnumToMasks
329 (format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
330 SDL_SetError("pixelformat not supported");
331 return SDL_FALSE;
332 }
333
334 if (!Rmask && !Gmask && !Bmask) {
335 dst->dwFlags = DDPF_ALPHA;
336 dst->dwAlphaBitDepth = bpp;
337 } else {
338 dst->dwFlags = DDPF_RGB;
339 dst->dwRGBBitCount = bpp;
340 dst->dwRBitMask = Rmask;
341 dst->dwGBitMask = Gmask;
342 dst->dwBBitMask = Bmask;
343
344 if (Amask) {
345 dst->dwFlags |= DDPF_ALPHAPIXELS;
346 dst->dwRGBAlphaBitMask = Amask;
347 }
348 }
349 }
350
351 return SDL_TRUE;
352 }
353
354 static SDL_bool
355 DDRAW_IsTextureFormatAvailable(IDirectDraw * ddraw, Uint32 display_format,
356 Uint32 texture_format)
357 {
358 int bpp;
359 Uint32 Rmask, Gmask, Bmask, Amask;
360
361 if (SDL_ISPIXELFORMAT_FOURCC(texture_format)) {
362 //TODO I don't expect DDRAW to support all 4CC formats, but I don't know which ones
363 return SDL_TRUE;
364 }
365 //These are only basic checks
366 if (SDL_ISPIXELFORMAT_INDEXED(texture_format)) {
367 return SDL_FALSE;
368 }
369
370 if (!SDL_PixelFormatEnumToMasks
371 (texture_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
372 return SDL_FALSE;
373 }
374
375 switch (bpp) {
376 case 4:
377 case 8:
378 case 16:
379 case 24:
380 case 32:
381 break;
382 default:
383 return SDL_FALSE;
384 }
385
386 return SDL_TRUE;
387 }
388
389 void
390 DDRAW_AddRenderDriver(_THIS)
391 {
392 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
393 SDL_RendererInfo *info = &DDRAW_RenderDriver.info;
394 SDL_DisplayMode *mode = &SDL_CurrentDisplay.desktop_mode;
395
396 if (data->ddraw) {
397 int i;
398 int formats[] = {
399 SDL_PIXELFORMAT_INDEX8,
400 SDL_PIXELFORMAT_RGB332,
401 SDL_PIXELFORMAT_RGB444,
402 SDL_PIXELFORMAT_RGB555,
403 SDL_PIXELFORMAT_ARGB4444,
404 SDL_PIXELFORMAT_ARGB1555,
405 SDL_PIXELFORMAT_RGB565,
406 SDL_PIXELFORMAT_RGB888,
407 SDL_PIXELFORMAT_ARGB8888,
408 SDL_PIXELFORMAT_ARGB2101010,
409 };
410
411 for (i = 0; i < SDL_arraysize(formats); ++i) {
412 if (DDRAW_IsTextureFormatAvailable
413 (data->ddraw, mode->format, formats[i])) {
414 info->texture_formats[info->num_texture_formats++] =
415 formats[i];
416 }
417 }
418
419 //TODO the fourcc formats should get fetched from IDirectDraw::GetFourCCCodes
420 info->texture_formats[info->num_texture_formats++] =
421 SDL_PIXELFORMAT_YV12;
422 info->texture_formats[info->num_texture_formats++] =
423 SDL_PIXELFORMAT_IYUV;
424 info->texture_formats[info->num_texture_formats++] =
425 SDL_PIXELFORMAT_YUY2;
426 info->texture_formats[info->num_texture_formats++] =
427 SDL_PIXELFORMAT_UYVY;
428 info->texture_formats[info->num_texture_formats++] =
429 SDL_PIXELFORMAT_YVYU;
430
431 SDL_AddRenderDriver(0, &DDRAW_RenderDriver);
432 }
433 }
434
435 SDL_Renderer *
436 DDRAW_CreateRenderer(SDL_Window * window, Uint32 flags)
437 {
438 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
439 SDL_VideoData *videodata = (SDL_VideoData *) display->device->driverdata;
440 SDL_WindowData *windowdata = (SDL_WindowData *) window->driverdata;
441 SDL_Renderer *renderer;
442 DDRAW_RenderData *data;
443 HRESULT result;
444 DDSURFACEDESC ddsd;
445
446 renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
447 if (!renderer) {
448 SDL_OutOfMemory();
449 return NULL;
450 }
451
452 data = (DDRAW_RenderData *) SDL_calloc(1, sizeof(*data));
453 if (!data) {
454 DDRAW_DestroyRenderer(renderer);
455 SDL_OutOfMemory();
456 return NULL;
457 }
458 data->ddraw = videodata->ddraw;
459
460 renderer->DisplayModeChanged = DDRAW_DisplayModeChanged;
461 renderer->CreateTexture = DDRAW_CreateTexture;
462 renderer->QueryTexturePixels = DDRAW_QueryTexturePixels;
463
464 renderer->SetTextureColorMod = DDRAW_SetTextureColorMod;
465 renderer->SetTextureAlphaMod = DDRAW_SetTextureAlphaMod;
466 renderer->SetTextureBlendMode = DDRAW_SetTextureBlendMode;
467 renderer->SetTextureScaleMode = DDRAW_SetTextureScaleMode;
468 renderer->UpdateTexture = DDRAW_UpdateTexture;
469 renderer->LockTexture = DDRAW_LockTexture;
470 renderer->UnlockTexture = DDRAW_UnlockTexture;
471 renderer->DirtyTexture = DDRAW_DirtyTexture;
472 renderer->RenderPoint = DDRAW_RenderPoint;
473 renderer->RenderLine = DDRAW_RenderLine;
474 renderer->RenderFill = DDRAW_RenderFill;
475 renderer->RenderCopy = DDRAW_RenderCopy;
476 renderer->RenderPresent = DDRAW_RenderPresent;
477 renderer->DestroyTexture = DDRAW_DestroyTexture;
478 renderer->DestroyRenderer = DDRAW_DestroyRenderer;
479 renderer->info = DDRAW_RenderDriver.info;
480 renderer->window = window->id;
481 renderer->driverdata = data;
482
483 renderer->info.flags = SDL_RENDERER_ACCELERATED;
484
485 SDL_zero(ddsd);
486 ddsd.dwSize = sizeof(ddsd);
487 ddsd.dwFlags = DDSD_CAPS;
488
489 if (window->flags & SDL_WINDOW_FULLSCREEN) {
490 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
491 } else {
492 //TODO handle non fullscreen
493 SDL_SetError("DirectDraw renderer has only fullscreen implemented");
494 DDRAW_DestroyRenderer(renderer);
495 return NULL;
496 }
497
498 if (flags & SDL_RENDERER_PRESENTFLIP2) {
499 ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT;
500 ddsd.dwBackBufferCount = 2;
501 } else if (flags & SDL_RENDERER_PRESENTFLIP3) {
502 ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT;
503 ddsd.dwBackBufferCount = 3;
504 } else if (flags & SDL_RENDERER_PRESENTCOPY) {
505 //TODO what is the best approximation to this mode
506 } else {
507
508 }
509
510 if (flags & SDL_RENDERER_PRESENTVSYNC) {
511 SDL_SetError("DirectDraw renderer with v-sync is not implemented");
512 DDRAW_DestroyRenderer(renderer);
513 return NULL;
514 }
515
516 result =
517 data->ddraw->lpVtbl->SetCooperativeLevel(data->ddraw,
518 windowdata->hwnd,
519 DDSCL_NORMAL);
520 if (result != DD_OK) {
521 DDRAW_SetError("CreateDevice()", result);
522 DDRAW_DestroyRenderer(renderer);
523 return NULL;
524 }
525
526 result =
527 data->ddraw->lpVtbl->CreateSurface(data->ddraw, &ddsd, &data->primary,
528 NULL);
529 if (result != DD_OK) {
530 DDRAW_SetError("CreateDevice()", result);
531 DDRAW_DestroyRenderer(renderer);
532 return NULL;
533 }
534
535 return renderer;
536 }
537
538 static int
539 DDRAW_Reset(SDL_Renderer * renderer)
540 {
541 //TODO implement
542 /*D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
543 HRESULT result;
544
545 result = IDirect3DDevice9_Reset(data->device, &data->pparams);
546 if (FAILED(result)) {
547 if (result == D3DERR_DEVICELOST) {
548 /* Don't worry about it, we'll reset later... *
549 return 0;
550 } else {
551 D3D_SetError("Reset()", result);
552 return -1;
553 }
554 }
555 IDirect3DDevice9_SetVertexShader(data->device, NULL);
556 IDirect3DDevice9_SetFVF(data->device,
557 D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
558 IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE,
559 D3DCULL_NONE);
560 IDirect3DDevice9_SetRenderState(data->device, D3DRS_LIGHTING, FALSE); */
561 return 0;
562 }
563
564 static int
565 DDRAW_DisplayModeChanged(SDL_Renderer * renderer)
566 {
567 //TODO implement
568 /*D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
569 SDL_Window *window = SDL_GetWindowFromID(renderer->window);
570 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
571
572 data->pparams.BackBufferWidth = window->w;
573 data->pparams.BackBufferHeight = window->h;
574 if (window->flags & SDL_WINDOW_FULLSCREEN) {
575 data->pparams.BackBufferFormat =
576 PixelFormatToD3DFMT(display->fullscreen_mode.format);
577 } else {
578 data->pparams.BackBufferFormat = D3DFMT_UNKNOWN;
579 }
580 return D3D_Reset(renderer); */
581 return 0;
582 }
583
584 static int
585 DDRAW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
586 {
587 DDRAW_RenderData *renderdata = (DDRAW_RenderData *) renderer->driverdata;
588 SDL_Window *window = SDL_GetWindowFromID(renderer->window);
589 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
590 Uint32 display_format = display->current_mode.format;
591 DDRAW_TextureData *data;
592 DDSURFACEDESC ddsd;
593 HRESULT result;
594
595 data = (DDRAW_TextureData *) SDL_calloc(1, sizeof(*data));
596 if (!data) {
597 SDL_OutOfMemory();
598 return -1;
599 }
600
601 SDL_zero(ddsd);
602 ddsd.dwSize = sizeof(ddsd);
603 ddsd.dwFlags = DDSD_PIXELFORMAT | DDSD_HEIGHT | DDSD_WIDTH;
604 ddsd.dwWidth = texture->w;
605 ddsd.dwHeight = texture->h;
606
607
608 if (!PixelFormatToDDPIXELFORMAT(texture->format, &ddsd.ddpfPixelFormat)) {
609 SDL_free(data);
610 return -1;
611 }
612
613 texture->driverdata = data;
614
615 result =
616 renderdata->ddraw->lpVtbl->CreateSurface(renderdata->ddraw, &ddsd,
617 &data->surface, NULL);
618 if (result != DD_OK) {
619 SDL_free(data);
620 DDRAW_SetError("CreateTexture", result);
621 return -1;
622 }
623
624 return 0;
625 }
626
627 static int
628 DDRAW_QueryTexturePixels(SDL_Renderer * renderer, SDL_Texture * texture,
629 void **pixels, int *pitch)
630 {
631 //TODO implement
632 SDL_SetError("QueryTexturePixels is not implemented");
633 return -1;
634 }
635
636 static int
637 DDRAW_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture)
638 {
639 return 0;
640 }
641
642 static int
643 DDRAW_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture)
644 {
645 return 0;
646 }
647
648 static int
649 DDRAW_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
650 {
651 switch (texture->blendMode) {
652 case SDL_BLENDMODE_NONE:
653 return 0;
654 default:
655 SDL_Unsupported();
656 texture->blendMode = SDL_BLENDMODE_NONE;
657 return -1;
658 }
659 }
660
661 static int
662 DDRAW_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
663 {
664 switch (texture->scaleMode) {
665 case SDL_TEXTURESCALEMODE_NONE:
666 default:
667 SDL_Unsupported();
668 texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
669 return -1;
670 }
671 return 0;
672 }
673
674 static int
675 DDRAW_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
676 const SDL_Rect * rect, const void *pixels, int pitch)
677 {
678 DDRAW_TextureData *data = (DDRAW_TextureData *) texture->driverdata;
679
680 //TODO implement
681 SDL_SetError("UpdateTexture is not implemented");
682 return 0;
683 }
684
685 static int
686 DDRAW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
687 const SDL_Rect * rect, int markDirty, void **pixels,
688 int *pitch)
689 {
690 DDRAW_TextureData *data = (DDRAW_TextureData *) texture->driverdata;
691 HRESULT result;
692 DDSURFACEDESC ddsd;
693
694 SDL_zero(ddsd);
695 ddsd.dwSize = sizeof(ddsd);
696
697 /**
698 * On a Axim x51v locking a subrect returns the startaddress of the whole surface,
699 * wheras on my ASUS MyPal 696 the startaddress of the locked area is returned,
700 * thats why I always lock the whole surface and calculate the pixels pointer by hand.
701 * This shouldn't be a speed problem, as multiple locks aren't available on DDraw Mobile
702 * see http://msdn.microsoft.com/en-us/library/ms858221.aspx
703 */
704
705 result = data->surface->lpVtbl->Lock(data->surface, NULL, &ddsd, 0, NULL);
706 if (result != DD_OK) {
707 DDRAW_SetError("LockRect()", result);
708 return -1;
709 }
710
711 *pixels = ddsd.lpSurface + rect->y * ddsd.lPitch + rect->x * ddsd.lXPitch;
712 *pitch = ddsd.lPitch;
713 return 0;
714 }
715
716 static void
717 DDRAW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
718 {
719 DDRAW_TextureData *data = (DDRAW_TextureData *) texture->driverdata;
720
721 data->surface->lpVtbl->Unlock(data->surface, NULL);
722 }
723
724 static void
725 DDRAW_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
726 int numrects, const SDL_Rect * rects)
727 {
728 }
729
730 static void
731 DDRAW_SetBlendMode(DDRAW_RenderData * data, int blendMode)
732 {
733 switch (blendMode) {
734
735 }
736 }
737
738 static int
739 DDRAW_RenderPoint(SDL_Renderer * renderer, int x, int y)
740 {
741 return -1;
742 }
743
744 static int
745 DDRAW_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
746 {
747 return -1;
748 }
749
750 static int
751 DDRAW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect)
752 {
753 return -1;
754 }
755
756 static int
757 DDRAW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
758 const SDL_Rect * srcrect, const SDL_Rect * dstrect)
759 {
760 DDRAW_RenderData *data = (DDRAW_RenderData *) renderer->driverdata;
761 DDRAW_TextureData *texturedata =
762 (DDRAW_TextureData *) texture->driverdata;
763 HRESULT result;
764 RECT srcr;
765 RECT dstr;
766 DDBLTFX bltfx;
767
768 srcr.left = srcrect->x;
769 srcr.top = srcrect->y;
770 srcr.right = srcrect->x + srcrect->w;
771 srcr.bottom = srcrect->y + srcrect->h;
772
773 dstr.left = dstrect->x;
774 dstr.top = dstrect->y;
775 dstr.right = dstrect->x + dstrect->w;
776 dstr.bottom = dstrect->y + dstrect->h;
777
778 SDL_zero(bltfx);
779 bltfx.dwSize = sizeof(bltfx);
780 bltfx.dwROP = SRCCOPY;
781
782 data->primary->lpVtbl->Blt(data->primary, &dstr, texturedata->surface,
783 &srcr, DDBLT_ROP, &bltfx);
784
785 return 0;
786 }
787
788 static void
789 DDRAW_RenderPresent(SDL_Renderer * renderer)
790 {
791 DDRAW_RenderData *data = (DDRAW_RenderData *) renderer->driverdata;
792 HRESULT result;
793
794 return;
795
796 result =
797 data->primary->lpVtbl->Flip(data->primary, NULL, DDFLIP_INTERVAL1);
798 if (result != DD_OK) {
799 DDRAW_SetError("Present()", result);
800 }
801 }
802
803 static void
804 DDRAW_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
805 {
806 DDRAW_TextureData *data = (DDRAW_TextureData *) texture->driverdata;
807
808 if (!data) {
809 return;
810 }
811
812 data->surface->lpVtbl->Release(data->surface);
813 SDL_free(data);
814 texture->driverdata = NULL;
815 }
816
817 static void
818 DDRAW_DestroyRenderer(SDL_Renderer * renderer)
819 {
820 DDRAW_RenderData *data = (DDRAW_RenderData *) renderer->driverdata;
821
822 if (data) {
823 data->primary->lpVtbl->Release(data->primary);
824 SDL_free(data);
825 }
826 SDL_free(renderer);
827 }
828
829 #endif /* SDL_VIDEO_RENDER_DDRAW */
830
831 /* vi: set ts=4 sw=4 expandtab: */