580
/* try to allocate a triple buffer and a temporary buffer in video memory */
582
/* Try to allocate a triple buffer and a temporary buffer in video memory. */
582
int create_triple_surface(video_canvas_t *canvas, int width, int height)
584
int video_create_triple_surface(video_canvas_t *canvas, int width, int height)
584
586
HRESULT ddresult;
585
587
DDSURFACEDESC desc;
588
590
memset(&desc, 0, sizeof(desc));
589
591
desc.dwSize = sizeof(desc);
590
592
desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
591
593
desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
592
desc.dwBackBufferCount = 2;
594
desc.dwBackBufferCount = 2;
594
596
ddresult = IDirectDraw2_CreateSurface(canvas->dd_object2, &desc,
595
597
&canvas->primary_surface, NULL);
596
if (ddresult != DD_OK) return FALSE;
598
if (ddresult != DD_OK)
598
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
601
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
599
602
ddresult = IDirectDrawSurface_GetAttachedSurface(canvas->primary_surface, &ddscaps, &canvas->back_surface);
600
if (ddresult != DD_OK) {
603
if (ddresult != DD_OK) {
601
604
ui_error("Cannot get attached surface for primary surface:\n%s",
602
605
dd_error(ddresult));
605
attach_clipper(canvas);
608
attach_clipper(canvas);
607
if (!create_temporary_surface(canvas, width, height, TRUE))
609
/* triple buffering needs a temporary surface... */
610
IDirectDrawSurface_Release(canvas->primary_surface);
611
canvas->render_surface = NULL;
612
canvas->primary_surface = NULL;
613
canvas->back_surface = NULL;
614
canvas->temporary_surface = NULL;
610
if (!create_temporary_surface(canvas, width, height, TRUE)) {
611
/* triple buffering needs a temporary surface... */
612
IDirectDrawSurface_Release(canvas->primary_surface);
613
canvas->render_surface = NULL;
614
canvas->primary_surface = NULL;
615
canvas->back_surface = NULL;
616
canvas->temporary_surface = NULL;
617
canvas->render_surface = canvas->temporary_surface;
619
canvas->render_surface = canvas->temporary_surface;
622
/* try to allocate a single buffer and a temporary buffer in video or system memory */
624
int create_single_surface(video_canvas_t *canvas, int width, int height)
625
/* Try to allocate a single buffer and a temporary buffer in video or system
628
int video_create_single_surface(video_canvas_t *canvas, int width, int height)
626
630
HRESULT ddresult;
627
631
DDSURFACEDESC desc;
635
639
ddresult = IDirectDraw2_CreateSurface(canvas->dd_object2, &desc,
636
640
&canvas->primary_surface, NULL);
637
if (ddresult != DD_OK) return FALSE;
639
attach_clipper(canvas);
641
if (!create_temporary_surface(canvas, width, height, FALSE))
642
canvas->render_surface = canvas->primary_surface;
644
canvas->render_surface = canvas->temporary_surface;
641
if (ddresult != DD_OK)
644
attach_clipper(canvas);
646
if (!create_temporary_surface(canvas, width, height, FALSE))
647
canvas->render_surface = canvas->primary_surface;
649
canvas->render_surface = canvas->temporary_surface;
652
655
int video_number_of_canvases;
653
656
video_canvas_t *video_canvases[2];
654
657
extern int fullscreen_active;
765
768
desc2.dwSize = sizeof(desc2);
766
769
ddresult = IDirectDraw2_GetDisplayMode(canvas->dd_object2, &desc2);
768
create_single_surface(canvas, desc2.dwWidth, desc2.dwHeight);
771
video_create_single_surface(canvas, desc2.dwWidth, desc2.dwHeight);
770
773
/* Create the temporary surface. */
771
774
/* memset(&desc, 0, sizeof(desc));
900
903
result = IDirectDraw2_CreatePalette(canvas->dd_object2, DDPCAPS_8BIT,
901
904
ape, &canvas->dd_palette, NULL);
904
set_physical_colors(canvas);
906
video_set_palette(canvas);
907
video_set_physical_colors(canvas);
984
987
extern int window_canvas_ysize[2];
985
988
//extern int status_height;
987
void canvas_update(HWND hwnd, HDC hdc, int xclient, int yclient, int w, int h)
990
void video_canvas_update(HWND hwnd, HDC hdc, int xclient, int yclient, int w,
989
993
video_canvas_t *c;
990
994
int xs; // upperleft x in framebuffer