convert line ends
[canaan.git] / prj / cam / src / dark / statbar.cpp
blobd37857e093a0c53537af4d22a40006e4c4bb051b
1 /*
2 @Copyright Looking Glass Studios, Inc.
3 1996,1997,1998,1999,2000 Unpublished Work.
4 */
6 // $Header: r:/t2repos/thief2/src/dark/statbar.cpp,v 1.5 2000/02/19 13:09:04 toml Exp $
7 #include <statbar.h>
8 #include <2d.h>
9 #include <imgsrc.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <memall.h>
13 #include <dbmem.h> // must be last header!
15 ////////////////////////////////////////////////////////////
16 // cStatusBar implementation
19 cStatusBar::cStatusBar(const sStatusBarDesc &desc )
20 :sStatusBarDesc(desc),
21 mpCanvas(NULL)
23 Reset();
24 memset(&mVal,0,sizeof(mVal));
25 RectSetNull(&mScreenRect);
28 void cStatusBar::Reset()
30 for (int i = 0; i < kNumValues; i++)
31 mLastVal[i] = -1;
32 if (mpCanvas)
33 gr_free_canvas(mpCanvas);
34 mpCanvas = NULL;
35 mLastDrawTime = 0;
38 const Rect& cStatusBar::GetScreenRect()
40 return mScreenRect;
43 void cStatusBar::SetScreenRect(const Rect& r)
45 if (RectWidth(&r) != RectWidth(&mScreenRect)
46 || RectHeight(&r) != RectHeight(&mScreenRect))
47 Reset();
48 mScreenRect = r;
51 void cStatusBar::SetVal(eValue which, int val)
53 if (abs(val - mLastVal[which]) > tolerance)
54 Reset();
56 mVal[which] = val;
59 void cStatusBar::DoDraw(const Rect& fillme)
61 gr_set_fcolor(gr_make_screen_fcolor(colors[kFG]));
62 gr_rect(RECT_UNWRAP(&fillme));
65 BOOL cStatusBar::MakeDrawCanvas() { return TRUE;}
67 void cStatusBar::Update(ulong time)
69 BOOL expired = refresh >= 0 && time - mLastDrawTime > refresh;
71 // HideAtMax logic
72 if ((flags & kHideAtMax) && expired && mVal[kCur] == mVal[kMax])
74 memcpy(&mLastVal,&mVal,sizeof(mLastVal));
75 return ;
78 // No screen rect
79 if (RectCheckNull(&mScreenRect))
80 return;
82 BOOL need_refresh = expired|| mpCanvas == NULL;
84 BOOL bDoCanvas = MakeDrawCanvas();
86 // if we have changed values, or time has elapsed, refresh
87 if (need_refresh)
89 // clamp values
90 int& max = mVal[kMax];
91 if (max <= 0) max = 1;
92 int& val = mVal[kCur];
93 if (val > max) val = max;
94 if (val < 0) val = 0;
96 int w = RectWidth(&mScreenRect);
97 int h = RectHeight(&mScreenRect);
99 // make the canvas
100 if (bDoCanvas)
102 if (!mpCanvas)
103 mpCanvas = gr_alloc_canvas(grd_canvas->bm.type,w,h);
104 gr_push_canvas(mpCanvas);
105 gr_clear(0);
108 // interpolate between left and right edge
109 int xval = val*w/max;
111 // figure out where the full part of the bar is
112 Rect fillme = { 0, 0, w, h };
113 if (flags & kRtoL)
114 fillme.ul.x = w - xval;
115 else
116 fillme.lr.x = xval;
118 DoDraw(fillme);
120 if (flags & kDrawBorder)
122 gr_set_fcolor(colors[kBorder]);
123 gr_box(0,0,w,h);
126 if (bDoCanvas)
127 gr_pop_canvas();
129 memcpy(&mLastVal,&mVal,sizeof(mLastVal));
130 mLastDrawTime = time;
133 if (bDoCanvas)
135 if (flags & kTransparent)
136 mpCanvas->bm.flags |= BMF_TRANS;
138 gr_bitmap(&mpCanvas->bm,mScreenRect.ul.x,mScreenRect.ul.y);