convert line ends
[canaan.git] / prj / cam / src / render / scrnloop.c
blob2dec2701829faeadbcc3274bce42fe54e3d25b65
1 /*
2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
4 */
6 // $Header: r:/t2repos/thief2/src/render/scrnloop.c,v 1.28 2000/02/25 16:28:37 kevin Exp $
7 #include <windows.h>
8 #include <config.h>
9 #include <resapi.h>
10 #include <palrstyp.h>
11 #include <appagg.h>
12 #include <appapi.h>
14 #include <loopapi.h>
15 #include <dispbase.h>
16 #include <vismsg.h>
18 #include <dev2d.h>
19 #include <portal.h>
20 #include <scrnman.h>
21 #include <scrnmode.h>
22 #include <resloop.h>
23 #include <uiloop.h>
24 #include <wrloop.h> // for constraints
25 #include <scrnloop.h>
26 #include <palmgr.h>
27 #include <palette.h>
28 #include <gamma.h>
29 #include <mprintf.h>
31 // Must be last header
32 #include <dbmem.h>
34 BOOL gScrnLoopSetModeFailed = FALSE;
36 eLoopMessageResult LGAPI ScrnManLoopFunc(void* context, eLoopMessage msg, tLoopMessageData hdata)
38 eLoopMessageResult result = kLoopDispatchContinue;
40 ScrnManContext* data = (ScrnManContext*)context;
41 switch(msg)
43 case kMsgEnterMode:
44 case kMsgResumeMode:
46 BOOL auto_fail = FALSE;
50 #ifndef SHIP
51 if (config_is_defined("scrn_loop_auto_fail"))
53 auto_fail = TRUE;
54 gScrnLoopSetModeFailed = TRUE;
56 #endif
58 if (!auto_fail)
59 gScrnLoopSetModeFailed = !ScrnModeSet(data->mode_params.min_mode,
60 data->mode_params.preferred,
61 data->mode_params.max_mode);
63 if (gScrnLoopSetModeFailed)
65 // OK, try preferred flags and bitdepth, but default dims
66 sScrnMode mode;
67 ScrnModeCopy(&mode, ScrnModeGetDefault(), kScrnModeAllValid);
68 ScrnModeCopy(&mode, data->mode_params.preferred, kScrnModeBitDepthValid | kScrnModeFlagsValid);
69 if (auto_fail || (!ScrnModeSet(data->mode_params.min_mode, &mode, data->mode_params.max_mode)))
71 BOOL last_resort = auto_fail ? FALSE : ScrnModeSet(NULL, ScrnModeGetDefault() ,NULL);
72 if (!last_resort)
74 char buf[80];
75 config_get_raw("scrn_loop_fail_msg",buf,sizeof(buf));
76 MessageBox ((HWND)NULL, buf, (LPCSTR)NULL, MB_ICONWARNING);
77 exit(0);
82 if (data->pal_res != NULL)
84 IResMan* pResMan = AppGetObj(IResMan);
85 IRes* pRes = IResMan_Bind(pResMan,
86 data->pal_res,
87 RESTYPE_PALETTE,
88 NULL, NULL, 0);
89 if (pRes)
91 ScrnNewPalette(IRes_Lock(pRes),0,256);
92 IRes_Unlock(pRes);
93 SafeRelease(pRes);
95 else
97 #ifndef SHIP
98 mprintf("Failed to load palette %s\n", data->pal_res);
99 #endif
102 // This now happens in ScrnSetRes()...
103 // ScrnInit3d();
104 porthw_init();
105 gamma_display();
106 portal_set_mem_rect_row((grd_bpp==8) ? 256 : 512);
108 break;
110 case kMsgSuspendMode:
111 case kMsgExitMode:
112 porthw_shutdown();
113 ScrnTerm3d();
114 break;
116 case kMsgBeginFrame:
117 ScrnStartFrame();
118 break;
119 case kMsgEndFrame:
120 ScrnEndFrame();
121 break;
123 case kMsgAppInit:
124 palmgr_init();
125 { // here, we really should get a default palette from somewhere useful
126 uchar *pal=Malloc(768);
127 int i;
128 for (i=0; i<64; i++)
129 pal[3*i]=pal[3*i+1]=pal[3*i+2]=i<<2;
130 for (i=0; i<64; i++)
131 { pal[192+3*i+0]=i; pal[192+3*i+1]=pal[192+3*i+2]=0; }
132 for (i=0; i<64; i++)
133 { pal[384+3*i+1]=i; pal[384+3*i+0]=pal[384+3*i+2]=0; }
134 for (i=0; i<64; i++)
135 { pal[576+3*i+2]=i; pal[576+3*i+0]=pal[576+3*i+1]=0; }
136 ScrnNewPalette(pal,0,256);
137 Free(pal);
139 break;
140 case kMsgAppTerm:
141 palmgr_shutdown();
142 ScrnUnsetRes();
143 break;
145 case kMsgVisual:
146 ScrnForceUpdate();
147 break;
149 return result;
152 #pragma off(unreferenced)
153 ILoopClient* LGAPI CreateScrnManClient(sLoopClientDesc * pDesc, tLoopClientData data)
155 ScrnManContext* pContext = (ScrnManContext*)data;
156 return CreateSimpleLoopClient(ScrnManLoopFunc,pContext,&ScrnManClientDesc);
158 #pragma on(unreferenced)
160 sLoopClientDesc ScrnManClientDesc =
162 &LOOPID_ScrnMan,
163 "Screen Manager",
164 kPriorityNormal,
165 kMsgsMode|kMsgsFrameEdge|kMsgVisual|kMsgsAppOuter,
167 kLCF_Callback,
168 CreateScrnManClient,
170 NO_LC_DATA,
173 { kConstrainAfter, &LOOPID_Res, kMsgsMode},
174 { kConstrainAfter, &LOOPID_UI, kMsgVisual},
175 { kConstrainBefore, &LOOPID_Wr, kMsgsAppOuter},
176 { kNullConstraint }