//��������������������������������������������������������������������������� // WinMain //��������������������������������������������������������������������������� int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ushort width = 640; ushort height = 480; int bpp = 16; screen_type scrndevice = SCREEN_DIB; dword scrnflags = 0; float gamma = 1.0f; BOOL use_dinput = FALSE; char palname[256]; strcpy(palname,"DEFAULT.PAL"); //��� Process INI { XFParseINI ini; if (!ini.open("VIEWER.INI",XF_OPEN_READ)) { char buff[256]; //��� Screen parameters if (!ini.section("Screen")) { if (!ini.read("FullScreen",buff)) { strlwr(buff); if (strstr(buff,"yes")) scrnflags |= VNGO_SET_RESOLUTION; } if (!ini.read("Device",buff)) { strlwr(buff); if (strstr(buff,"ddraw")) scrndevice = SCREEN_DDRAW; else if (strstr(buff,"d3d")) scrndevice = SCREEN_D3D; else scrndevice = SCREEN_DIB; } if (!ini.read("Resolution",buff)) { strlwr(buff); if (strstr(buff,"320x240x8")) { width = 320; height = 240; bpp = 8; } else if (strstr(buff,"640x480x8")) { width = 640; height = 480; bpp = 8; } else if (strstr(buff,"640x480x15")) { width = 640; height = 480; bpp = 15; } else if (strstr(buff,"640x480x16")) { width = 640; height = 480; bpp = 16; } } if (!ini.read("Palette",buff)) strncpy(palname,buff,sizeof(palname)); if (!ini.read("Gamma",buff)) { gamma = float(atof(buff)); if (gamma < 0.5f) gamma = 0.5f; else if (gamma > 2.0f) gamma = 2.0f; } } //��� Startup parameters if (!ini.section("Startup")) { if (!ini.read("DirectInput",buff)) { strlwr(buff); if (strstr(buff,"yes")) use_dinput = TRUE; } } } } //��� Initialize Windows //��� If we are already running, this routine will reactivate the older //��� application and return failure. if (!InitApplication (hInstance, nCmdShow, width, height)) return 1; //��� Initializes MythOS //��� Initialize the MythOS system MythOS = new MythosSystem (MYTHOS_MEM_SIZE); if (!MythOS) return 1; //��� Create the devices if (use_dinput) { Devs = new MaxDevicesDirectX (hWndClient); if (!Devs) return 1; if (!Devs->is_mouse_present() || !Devs->is_keyboard_present()) { delete Devs; Devs = new MaxDevicesWin32 (hWndClient); } } else Devs = new MaxDevicesWin32 (hWndClient); if (!Devs) return 1; //��� Finish MythOS initialization if (MythOS->init (MYTHOS_ESCHER_ARENA_SIZE, MYTHOS_ESCHER_SORT_SIZE, 0)) return 1; MythOS->Vangogh.set_gamma(gamma); //��� Install Fonts if (gberg_install_font("ARIAL-15.IFF", 0)) return 1; //��� Setup palette and screen manager for(;;) { if (Palette) { delete Palette; Palette = 0; } if (Screen) { delete Screen; Screen = 0; } //��� Create palette switch (bpp) { case 8: Palette = new VngoPal8; break; case 15: Palette = new VngoPal15; break; case 16: Palette = new VngoPal16; break; } if (!Palette || Palette->init(0,palname)) return 1; //��� Create screen manager switch (scrndevice) { case SCREEN_DIB: Screen = new VngoDIB(hWndClient); break; case SCREEN_DDRAW: Screen = new VngoDirectDraw(hWndClient); break; case SCREEN_D3D: Screen = new VngoDirect3D(hWndClient); scrnflags |= VNGO_3DDEVICE | VNGO_ALLOC_ZBUFFER; break; } if (!Screen || Screen->get_initstate()) return 1; VNGError err = Screen->set_mode (width, height, (bpp == 8) ? 8 : 16, Palette, scrnflags); if (err == VNGO_NO_ERROR) break; else if (err == VNGO_NEEDS_PAL8) bpp = 8; else if (err == VNGO_NEEDS_PAL15) bpp = 15; else if (err == VNGO_NEEDS_PAL16) bpp = 16; else return 1; } //��� Create viewport switch (scrndevice) { case SCREEN_DIB: if (bpp == 8) { Vport = new VngoVportDB8(width,height, ((VngoDIB*)Screen)->gmap,0,Palette, VNGO_ZBUFFER_DEV); } else { Vport = new VngoVportDB16(width,height, ((VngoDIB*)Screen)->gmap,0,Palette, VNGO_ZBUFFER_DEV); } break; case SCREEN_DDRAW: if (bpp == 8) { Vport = new VngoVportDD8(((VngoDirectDraw*)Screen)->SurfaceManager, 0, Palette, VNGO_ZBUFFER_DEV); } else { Vport = new VngoVportDD16(((VngoDirectDraw*)Screen)->SurfaceManager, 0, Palette, VNGO_ZBUFFER_DEV); } break; case SCREEN_D3D: { VngoRect rct(0,0,width,height); Vport = new VngoVportD3D(rct, Palette, VNGO_ZBUFFER_DEV, Screen); } break; } if (!Vport) return 1; gberg_color(Palette->get_index(VngoColor24bit(255,255,255)), VNGO_TRANSPARENT); //��� Create viewer application instance Viewer *view = new Viewer; if (!view || !view->create()) return 1; //��� Main Loop while (PumpWindows()) { Devs->update(); view->process_events(); view->render(); Screen->flip(); } //��� Destroy viewer application delete view; //����������������������������������������������������������� Termination if (Vport) { delete Vport; Vport=0; } if (Palette) { delete Palette; Palette=0; } if (Screen) { delete Screen; Screen=0; } if (Devs) { delete Devs; Devs=0; } if (MythOS) { delete MythOS; MythOS=0; } return 0; }