/* draw.c */ /* включение guids */ #define INITGUID /* включение стандартных заголовков */ #include "global.h" #include "draw.h" /* интерфейсы для работы с графикой */ LPDIRECTDRAWSURFACE7 lpddSrf; /* интерфейс вторичной поверхности */ LPDIRECTDRAWPALETTE lpddPlt; /* интерфейс палитры */ /* локальные переменные */ static LPDIRECTDRAW7 lpdd; /* основной интерфейс DirectDraw */ static LPDIRECTDRAWSURFACE7 lpddSrfPrm; /* интерфейс первичной поверхности */ /* создание основного интерфейса DirectDraw */ static int CrtDraw(void) { /* получим интерфейс DirectDraw */ if (FAILED(DirectDrawCreateEx(NULL,&lpdd,&IID_IDirectDraw7,NULL))) return 1; /* зададим режим работы */ if (FAILED(IDirectDraw7_SetCooperativeLevel(lpdd,ghWndMain, DDSCL_FULLSCREEN|DDSCL_EXCLUSIVE|DDSCL_ALLOWMODEX))) return 1; /* установим видеорежим */ if (FAILED(IDirectDraw7_SetDisplayMode(lpdd,SCREEN_WIDTH, SCREEN_HEIGHT,SCREEN_BPP,0,0))) return 1; return 0; } /* создание поверхностей */ static int CrtSurface(void) { DDSURFACEDESC2 ddsd; /* подготовка структуры */ INIT_DIRECT_STRUCT(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.dwBackBufferCount = 1; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_SYSTEMMEMORY; /* создадим первичную поверхность */ if (FAILED(IDirectDraw7_CreateSurface(lpdd,&ddsd,&lpddSrfPrm,NULL))) return 1; /* присоединим задний буфер */ ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; if (FAILED(IDirectDrawSurface7_GetAttachedSurface(lpddSrfPrm, &ddsd.ddsCaps,&lpddSrf))) return 1; return 0; } /* создание палитры */ static int CrtPalette(void) { PALETTEENTRY plt[256]; int i; /* заполним палитру черным цветом */ for (i = 0; i < 256; i++) SET_PALETTE(plt[i],0,0,0); /* создаем палитру */ if (FAILED(IDirectDraw7_CreatePalette(lpdd,DDPCAPS_8BIT|DDPCAPS_INITIALIZE, plt,&lpddPlt,NULL))) return 1; /* присоеденим палитру к поверхности */ if (FAILED(IDirectDrawSurface7_SetPalette(lpddSrfPrm,lpddPlt))) return 1; return 0; } /* инициализация модуля рисования кадра */ int InitDraw(void) { /* создадим основной интерфейс DairectDraw */ if (CrtDraw()) return 1; /* создадим поверхности */ if (CrtSurface()) return 1; /* создадим палитру */ if (CrtPalette()) return 1; return 0; } /* деинициализация модуля рисования кадра */ void ReleaseDraw(void) { /* освободим палитру */ if (lpddPlt) { IDirectDrawPalette_Release(lpddPlt); lpddPlt = NULL; } /* освободим заднюю поверхность */ if (lpddSrf) { IDirectDrawSurface7_Release(lpddSrf); lpddSrf = NULL; } /* освободим первичную поверхность */ if (lpddSrfPrm) { IDirectDrawSurface7_Release(lpddSrfPrm); lpddSrfPrm = NULL; } /* освободим основной интерфейс DirectDraw */ if (lpdd) { IDirectDraw7_Release(lpdd); lpdd = NULL; } } /* обновляет изображение (переключает буфер) */ void UpdateDraw(void) { /* переключим буфер */ IDirectDrawSurface7_Flip(lpddSrfPrm,NULL,DDFLIP_WAIT); }