/*
** Command & Conquer Generals Zero Hour(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see .
*/
////////////////////////////////////////////////////////////////////////////////
// //
// (c) 2001-2003 Electronic Arts Inc. //
// //
////////////////////////////////////////////////////////////////////////////////
// FILE: W3DProgressBar.cpp ///////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//
// Westwood Studios Pacific.
//
// Confidential Information
// Copyright (C) 2001 - All Rights Reserved
//
//-----------------------------------------------------------------------------
//
// Project: RTS3
//
// File name: W3DProgressBar.cpp
//
// Created: Colin Day, June 2001
//
// Desc: W3D implementation for the progress bar GUI control
//
//-----------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////
// SYSTEM INCLUDES ////////////////////////////////////////////////////////////
#include
// USER INCLUDES //////////////////////////////////////////////////////////////
#include "GameClient/GameWindowGlobal.h"
#include "GameClient/GameWindowManager.h"
#include "GameClient/GadgetProgressBar.h"
#include "W3DDevice/GameClient/W3DGadget.h"
#include "W3DDevice/GameClient/W3DDisplay.h"
// DEFINES ////////////////////////////////////////////////////////////////////
// PRIVATE TYPES //////////////////////////////////////////////////////////////
// PRIVATE DATA ///////////////////////////////////////////////////////////////
// PUBLIC DATA ////////////////////////////////////////////////////////////////
// PRIVATE PROTOTYPES /////////////////////////////////////////////////////////
// PRIVATE FUNCTIONS //////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// PUBLIC FUNCTIONS ///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// W3DGadgetProgressBarDraw ===================================================
/** Draw colored Progress Bar using standard graphics */
//=============================================================================
void W3DGadgetProgressBarDraw( GameWindow *window, WinInstanceData *instData )
{
ICoord2D origin, size, start, end;
Color backColor, backBorder, barColor, barBorder;
Int progress = (Int)window->winGetUserData();
// get window size and position
window->winGetScreenPosition( &origin.x, &origin.y );
window->winGetSize( &size.x, &size.y );
// get the right colors to use
if( BitTest( window->winGetStatus(), WIN_STATUS_ENABLED ) == FALSE )
{
backColor = GadgetProgressBarGetDisabledColor( window );
backBorder = GadgetProgressBarGetDisabledBorderColor( window );
barColor = GadgetProgressBarGetDisabledBarColor( window );
barBorder = GadgetProgressBarGetDisabledBarBorderColor( window );
} // end if, disabled
else if( BitTest( instData->getState(), WIN_STATE_HILITED ) )
{
backColor = GadgetProgressBarGetHiliteColor( window );
backBorder = GadgetProgressBarGetHiliteBorderColor( window );
barColor = GadgetProgressBarGetHiliteBarColor( window );
barBorder = GadgetProgressBarGetHiliteBarBorderColor( window );
} // end else if, hilited
else
{
backColor = GadgetProgressBarGetEnabledColor( window );
backBorder = GadgetProgressBarGetEnabledBorderColor( window );
barColor = GadgetProgressBarGetEnabledBarColor( window );
barBorder = GadgetProgressBarGetEnabledBarBorderColor( window );
} // end else, enabled
// draw background border
if( backBorder != WIN_COLOR_UNDEFINED )
{
start.x = origin.x;
start.y = origin.y;
end.x = start.x + size.x;
end.y = start.y + size.y;
TheWindowManager->winOpenRect( backBorder, WIN_DRAW_LINE_WIDTH,
start.x, start.y, end.x, end.y );
} // end if
// draw background fill
if( backColor != WIN_COLOR_UNDEFINED )
{
start.x = origin.x + 1;
start.y = origin.y + 1;
end.x = start.x + size.x - 2;
end.y = start.y + size.y - 2;
TheWindowManager->winFillRect( backColor, WIN_DRAW_LINE_WIDTH,
start.x, start.y, end.x, end.y );
} // end if
// draw the progress so far
if( progress )
{
// draw bar border
if( barBorder != WIN_COLOR_UNDEFINED )
{
start.x = origin.x;
start.y = origin.y;
end.x = start.x + (size.x * progress) / 100;
end.y = start.y + size.y;
if(end.x- start.x > 1 )
{
TheWindowManager->winOpenRect( barBorder, WIN_DRAW_LINE_WIDTH,
start.x, start.y, end.x, end.y );
}
} // end if
// draw bar fill
if( barColor != WIN_COLOR_UNDEFINED )
{
start.x = origin.x + 1;
start.y = origin.y + 1;
end.x = start.x + (size.x * progress) / 100 - 2;
end.y = start.y + size.y - 2;
// TheWindowManager->winOpenRect( barColor, WIN_DRAW_LINE_WIDTH,
// start.x, start.y, end.x, end.y );
if(end.x- start.x > 1 )
{
TheWindowManager->winFillRect( barColor,WIN_DRAW_LINE_WIDTH,
start.x, start.y, end.x, end.y );
TheWindowManager->winDrawLine(GameMakeColor(255,255,255,255),WIN_DRAW_LINE_WIDTH, start.x, start.y, end.x, start.y);
TheWindowManager->winDrawLine(GameMakeColor(200,200,200,255),WIN_DRAW_LINE_WIDTH, start.x, start.y, start.x, end.y);
}
} // end if
} // end if
} // end W3DGadgetProgressBarDraw
// W3DGadgetProgressBarImageDraw ==============================================
/** Draw Progress Bar with user supplied images */
//=============================================================================
void W3DGadgetProgressBarImageDrawA( GameWindow *window, WinInstanceData *instData )
{
ICoord2D origin, size;
const Image *barCenter, *barRight, *left, *right, *center;
Int progress = (Int)window->winGetUserData();
Int xOffset, yOffset;
Int i;
// get window size and position
window->winGetScreenPosition( &origin.x, &origin.y );
window->winGetSize( &size.x, &size.y );
// get offset
xOffset = instData->m_imageOffset.x;
yOffset = instData->m_imageOffset.y;
barCenter = GadgetProgressBarGetEnabledBarImageCenter( window );
barRight = GadgetProgressBarGetEnabledBarImageRight( window );
left = GadgetProgressBarGetEnabledImageLeft( window );
right = GadgetProgressBarGetEnabledImageRight( window );
center = GadgetProgressBarGetEnabledImageCenter( window );
if(!barCenter || !barRight || !left || !right || !center)
return;
Int width = barCenter->getImageWidth();
// Int height = barCenter->getImageHeight();
Int drawWidth = (size.x * progress) / 100;
Int pieces = drawWidth / width;
Int x = origin.x;
for( i = 0; i < pieces; i ++)
{
TheWindowManager->winDrawImage( barCenter,
x, origin.y,
x + width, origin.y + size.y );
x += width;
}
}
void W3DGadgetProgressBarImageDraw( GameWindow *window, WinInstanceData *instData )
{
ICoord2D origin, size, start, end;
const Image *backLeft, *backRight, *backCenter,
*barRight, *barCenter;//*backSmallCenter,*barLeft,, *barSmallCenter;
Int progress = (Int)window->winGetUserData();
Int xOffset, yOffset;
Int i;
// get window size and position
window->winGetScreenPosition( &origin.x, &origin.y );
window->winGetSize( &size.x, &size.y );
// get offset
xOffset = instData->m_imageOffset.x;
yOffset = instData->m_imageOffset.y;
// get the right images to use
if( BitTest( window->winGetStatus(), WIN_STATUS_ENABLED ) == FALSE )
{
backLeft = GadgetProgressBarGetDisabledImageLeft( window );
//barLeft = GadgetProgressBarGetDisabledBarImageLeft( window );
backRight = GadgetProgressBarGetDisabledImageRight( window );
barRight = GadgetProgressBarGetDisabledBarImageRight( window );
backCenter = GadgetProgressBarGetDisabledImageCenter( window );
barCenter = GadgetProgressBarGetDisabledBarImageCenter( window );
//backSmallCenter = GadgetProgressBarGetDisabledImageSmallCenter( window );
//barSmallCenter = GadgetProgressBarGetDisabledBarImageSmallCenter( window );
} // end if, disabled
else if( BitTest( instData->getState(), WIN_STATE_HILITED ) )
{
backLeft = GadgetProgressBarGetHiliteImageLeft( window );
//barLeft = GadgetProgressBarGetHiliteBarImageLeft( window );
backRight = GadgetProgressBarGetHiliteImageRight( window );
barRight = GadgetProgressBarGetHiliteBarImageRight( window );
backCenter = GadgetProgressBarGetHiliteImageCenter( window );
barCenter = GadgetProgressBarGetHiliteBarImageCenter( window );
//backSmallCenter = GadgetProgressBarGetHiliteImageSmallCenter( window );
//barSmallCenter = GadgetProgressBarGetHiliteBarImageSmallCenter( window );
} // end else if, hilited
else
{
backLeft = GadgetProgressBarGetEnabledImageLeft( window );
//barLeft = GadgetProgressBarGetEnabledBarImageLeft( window );
backRight = GadgetProgressBarGetEnabledImageRight( window );
barRight = GadgetProgressBarGetEnabledBarImageRight( window );
backCenter = GadgetProgressBarGetEnabledImageCenter( window );
barCenter = GadgetProgressBarGetEnabledBarImageCenter( window );
//backSmallCenter = GadgetProgressBarGetEnabledImageSmallCenter( window );
//barSmallCenter = GadgetProgressBarGetEnabledBarImageSmallCenter( window );
} // end else, enabled
// sanity
if( backLeft == NULL || backRight == NULL ||
backCenter == NULL ||
barRight == NULL)
// backSmallCenter == NULL ||barLeft == NULL ||barCenter == NULL || barSmallCenter == NULL )
return;
// get image sizes for the ends
ICoord2D leftSize, rightSize;
leftSize.x = backLeft->getImageWidth();
leftSize.y = backLeft->getImageHeight();
rightSize.x = backRight->getImageWidth();
rightSize.y = backRight->getImageHeight();
// get two key points used in the end drawing
ICoord2D leftEnd, rightStart;
leftEnd.x = origin.x + leftSize.x + xOffset;
leftEnd.y = origin.y + size.y + yOffset;
rightStart.x = origin.x + size.x - rightSize.x + xOffset;
rightStart.y = origin.y + yOffset;
// draw the center repeating bar
Int centerWidth, pieces;
// get width we have to draw our repeating center in
centerWidth = rightStart.x - leftEnd.x;
// how many whole repeating pieces will fit in that width
pieces = centerWidth / backCenter->getImageWidth();
// draw the pieces
start.x = leftEnd.x;
start.y = origin.y + yOffset;
end.y = start.y + size.y;
for( i = 0; i < pieces; i++ )
{
end.x = start.x + backCenter->getImageWidth();
TheWindowManager->winDrawImage( backCenter,
start.x, start.y,
end.x, end.y );
start.x += backCenter->getImageWidth();
} // end for i
//
// how many small repeating pieces will fit in the gap from where the
// center repeating bar stopped and the right image, draw them
// and overlapping underneath where the right end will go
//
// centerWidth = rightStart.x - start.x;
// pieces = centerWidth / backCenter->getImageWidth() + 1;
// end.y = start.y + size.y;
// IRegion2D clipRegion;
//
// TheDisplay->setClipRegion()
// for( i = 0; i < pieces; i++ )
// {
//
// end.x = start.x + backCenter->getImageWidth();
// TheWindowManager->winDrawImage( backCenter,
// start.x, start.y,
// end.x, end.y );
// start.x += backCenter->getImageWidth();
//
// } // end for i
//
IRegion2D reg;
reg.lo.x = start.x;
reg.lo.y = start.y;
reg.hi.x = rightStart.x;
reg.hi.y = end.y;
centerWidth = rightStart.x - start.x;
if( centerWidth > 0)
{
TheDisplay->setClipRegion(®);
end.x = start.x + backCenter->getImageWidth();
TheWindowManager->winDrawImage( backCenter,
start.x, start.y,
end.x, end.y );
TheDisplay->enableClipping(FALSE);
}
// draw left end
start.x = origin.x + xOffset;
start.y = origin.y + yOffset;
end = leftEnd;
TheWindowManager->winDrawImage(backLeft, start.x, start.y, end.x, end.y);
// draw right end
start = rightStart;
end.x = start.x + rightSize.x;
end.y = start.y + size.y;
TheWindowManager->winDrawImage(backRight, start.x, start.y, end.x, end.y);
ICoord2D barWindowSize; // end point of bar from window origin
barWindowSize.x = ((size.x - 20) * progress) / 100;
barWindowSize.y = size.y;
pieces = barWindowSize.x / barCenter->getImageWidth();
// draw the pieces
start.x = origin.x +10;
start.y = origin.y + yOffset +5;
end.y = start.y + size.y - 10;
for( i = 0; i < pieces; i++ )
{
end.x = start.x + barCenter->getImageWidth();
TheWindowManager->winDrawImage( barCenter,
start.x, start.y,
end.x, end.y );
start.x += barCenter->getImageWidth();
} // end for i
start.x = origin.x + 10 + barCenter->getImageWidth() * pieces;
//pieces = (size.x - barWindowSize.x -20) / barRight->getImageWidth();
//Changed By Saad for flashing grey piece
pieces = ((size.x - 20) / barCenter->getImageWidth()) - pieces;
for( i = 0; i < pieces; i++ )
{
end.x = start.x + barRight->getImageWidth();
TheWindowManager->winDrawImage( barRight,
start.x, start.y,
end.x, end.y );
start.x += barRight->getImageWidth();
} // end for i
} // end W3DGadgetProgressBarImageDraw