windows-nt/Source/XPSP1/NT/base/ntsetup/mpk/enduser/gauge.c
2020-09-26 16:20:57 +08:00

221 lines
3.7 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
dngauge.c
Abstract:
Code implementing a gas gauge for file copies for DOS-hosted NT Setup.
Author:
Ted Miller (tedm) 14-April-1992
Revision History:
--*/
#include "enduser.h"
#define THERM_WIDTH 500
#define THERM_HEIGHT 18
#define FRAME_THICK 2
#define MARGIN_LEFT 5
#define MARGIN_RIGHT 5
#define MARGIN_TOP 6
#define MARGIN_BOTTOM (CharHeight+4)
#define FRAME_WIDTH (THERM_WIDTH+(2*FRAME_THICK)+MARGIN_LEFT+MARGIN_RIGHT)
#define FRAME_HEIGHT (THERM_HEIGHT+(2*FRAME_THICK)+MARGIN_TOP+MARGIN_BOTTOM)
#define FRAME_X ((640-FRAME_WIDTH)/2)
#define FRAME_Y 300
#define THERM_X (FRAME_X + FRAME_THICK + MARGIN_LEFT)
#define THERM_Y (FRAME_Y + FRAME_THICK + MARGIN_TOP)
#define FRAME_COLOR VGAPIX_LIGHT_GRAY
#define MARGIN_COLOR VGAPIX_BLUE
#define THERM_COLOR VGAPIX_LIGHT_YELLOW
ULONG TickCount;
ULONG TickedSoFar;
unsigned CurrentPercent;
unsigned CurrentThermWidth;
extern BYTE CharWidth;
extern BYTE CharHeight;
VOID
pGaugeDraw(
VOID
);
VOID
GaugeInit(
IN ULONG RangeMax
)
/*++
Routine Description:
Initialize the gas gauge. This includes drawing the gas gauge at 0%
and setting some global variables.
Arguments:
RangeMax - supplies maximum tick count that 100% represents.
Return Value:
None.
--*/
{
TickCount = RangeMax;
TickedSoFar = 0;
CurrentPercent = 0;
CurrentThermWidth = 0;
pGaugeDraw();
}
VOID
DnpRepaintGaugeTherm(
IN BOOL ForceRepaint
)
/*++
Routine Description:
Draw the entire gauge in its current state.
Arguments:
ForceRepaint - if TRUE, the gauge is redrawn even if the percentage
hasn't changed since the last time the gauge was redrawn.
Return Value:
None.
--*/
{
unsigned PercentComplete;
unsigned Width;
char text[10];
if(!TickCount) {
return;
}
//
// Figure out the percent complete and how many pixels
// of width the current tick count represents on-screen.
//
PercentComplete = (unsigned)(100L * TickedSoFar / TickCount);
Width = (unsigned)(THERM_WIDTH * TickedSoFar / TickCount);
if(ForceRepaint || (Width != CurrentThermWidth)) {
CurrentThermWidth = Width;
VgaClearRegion(THERM_X,THERM_Y,Width,THERM_HEIGHT,THERM_COLOR);
if(ForceRepaint || (CurrentPercent != PercentComplete)) {
CurrentPercent = PercentComplete;
Width = sprintf(text,"%u%%",CurrentPercent);
FontWriteString(
text,
(640-(CharWidth*Width))/2,
THERM_Y + THERM_HEIGHT + ((MARGIN_BOTTOM-CharHeight)/2) + 1,
VGAPIX_LIGHT_GRAY,
VGAPIX_BLUE
);
}
}
}
VOID
GaugeDelta(
IN ULONG Delta
)
/*++
Routine Description:
'Tick' the gas gauge by adding a given delta to the progress so far.
Adjust the thermometer and percent-complete readouts.
Arguments:
Delta - supplies additional progress units.
Return Value:
None.
--*/
{
TickedSoFar += Delta;
if(TickedSoFar > TickCount) {
TickedSoFar = TickCount;
}
DnpRepaintGaugeTherm(FALSE);
}
VOID
pGaugeDraw(
VOID
)
/*++
Routine Description:
Redraw the gas gauge in its current state.
Arguments:
None.
Return Value:
None.
--*/
{
VgaClearRegion(FRAME_X,FRAME_Y,FRAME_WIDTH,FRAME_HEIGHT,FRAME_COLOR);
VgaClearRegion(
FRAME_X + FRAME_THICK,
FRAME_Y + FRAME_THICK,
FRAME_WIDTH - (2*FRAME_THICK),
FRAME_HEIGHT - (2*FRAME_THICK),
MARGIN_COLOR
);
DnpRepaintGaugeTherm(TRUE);
}