Imports the current Win32 source for the pod-racing game 'Red Planet', built on the MUNGA engine and its L4 (Win32/DirectX) platform layer: - MUNGA / MUNGA_L4: cross-platform engine core and Win32 backend - RP / RP_L4: Red Planet game logic and Win32 application - DivLoader, Setup1: asset loader and installer project - lib, MUNGA_L4/openal, MUNGA_L4/sos: third-party audio dependencies Removed stale Subversion metadata and added .gitignore/.gitattributes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5162 lines
131 KiB
C++
5162 lines
131 KiB
C++
#include "mungal4.h"
|
|
#pragma hdrstop
|
|
|
|
#define PRELOAD_ART
|
|
|
|
#include "..\munga\player.h"
|
|
#include "l4app.h"
|
|
#include "l4gauge.h"
|
|
#include "l4grend.h"
|
|
|
|
// #define LOCAL_TEST
|
|
|
|
#if defined(LOCAL_TEST)
|
|
# define Test_Tell(n) std::cout << n
|
|
#else
|
|
# define Test_Tell(n)
|
|
#endif
|
|
|
|
|
|
LookupTable
|
|
configureChannels[] =
|
|
{
|
|
{"red", L4GraphicsPort::RedChannel},
|
|
{"green", L4GraphicsPort::GreenChannel},
|
|
{"blue", L4GraphicsPort::BlueChannel},
|
|
{"rgb", L4GraphicsPort::AllChannels},
|
|
|
|
{"direct", L4GraphicsPort::DirectColor},
|
|
{"blank", L4GraphicsPort::BlankColor},
|
|
|
|
{"redtransparent", L4GraphicsPort::RedChannelTransparentZero},
|
|
{"greentransparent", L4GraphicsPort::GreenChannelTransparentZero},
|
|
{"bluetransparent", L4GraphicsPort::BlueChannelTransparentZero},
|
|
{"rgbtransparent", L4GraphicsPort::AllChannelsTransparentZero},
|
|
{NULL, -1}
|
|
};
|
|
|
|
LookupTable
|
|
configurePalettes[] =
|
|
{
|
|
{"native", SVGA16::NativePalette},
|
|
{"clut0", SVGA16::SecondaryPalette},
|
|
{"clut1", SVGA16::AuxiliaryPalette1},
|
|
{"clut2", SVGA16::AuxiliaryPalette2},
|
|
{NULL, -1}
|
|
};
|
|
|
|
LookupTable
|
|
configureFormat[] =
|
|
{
|
|
{"unsigned", NumericDisplay::unsignedFormat},
|
|
{"signed", NumericDisplay::signedFormat},
|
|
{"signedBlankedZeros", NumericDisplay::signedBlankedZerosFormat},
|
|
{"absolute", NumericDisplay::absoluteFormat},
|
|
{"time", NumericDisplay::timeFormat},
|
|
{NULL, -1}
|
|
};
|
|
|
|
LookupTable
|
|
configureDirection[] =
|
|
{
|
|
{"left", WipeGaugeScalar::wipeLeft},
|
|
{"down", WipeGaugeScalar::wipeDown},
|
|
{"right", WipeGaugeScalar::wipeRight},
|
|
{"up", WipeGaugeScalar::wipeUp},
|
|
{NULL, -1}
|
|
};
|
|
|
|
char
|
|
*nameCopy(const char *old_name)
|
|
{
|
|
Check_Pointer(old_name);
|
|
|
|
char
|
|
*copy = strdup(old_name);
|
|
Register_Pointer(copy);
|
|
|
|
return copy;
|
|
}
|
|
|
|
//###########################################################################
|
|
// NumericDisplay
|
|
//###########################################################################
|
|
NumericDisplay::NumericDisplay(
|
|
L4Warehouse *the_warehouse,
|
|
int x_position, int y_position,
|
|
const char *font_name,
|
|
int number_of_digits,
|
|
NumericDisplay::NumericFormat requested_format,
|
|
int background_color, int foreground_color
|
|
)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
//------------------------------------------------------------
|
|
// Save the font name
|
|
//------------------------------------------------------------
|
|
digitMapName = nameCopy(font_name);
|
|
//------------------------------------------------------------
|
|
// Order the font from the warehouse (pre-load for future use)
|
|
//------------------------------------------------------------
|
|
Check(the_warehouse);
|
|
warehouse = the_warehouse;
|
|
|
|
Check_Pointer(digitMapName);
|
|
|
|
BitMap
|
|
*digit_map = warehouse->bitMapBin.Get(digitMapName);
|
|
//-----------------------------------------------------------
|
|
// Calculate font-specific values
|
|
//-----------------------------------------------------------
|
|
if (digit_map == NULL)
|
|
{
|
|
digitWidth = 0;
|
|
digitHeight = 0;
|
|
}
|
|
else
|
|
{
|
|
Check(digit_map);
|
|
digitWidth = (digit_map->Data.Size.x+1)/totalDigitsPerFont;
|
|
digitHeight = digit_map->Data.Size.y;
|
|
}
|
|
//-----------------------------------------------------------
|
|
// Set internal values
|
|
//-----------------------------------------------------------
|
|
if (number_of_digits < 1)
|
|
{
|
|
number_of_digits = 1;
|
|
}
|
|
|
|
if (format == timeFormat)
|
|
{
|
|
if (number_of_digits > 8)
|
|
{
|
|
number_of_digits = 8;
|
|
}
|
|
largestValue = (Scalar) (99*60*60);
|
|
}
|
|
else
|
|
{
|
|
if (number_of_digits > maxDigits)
|
|
{
|
|
number_of_digits = maxDigits;
|
|
}
|
|
largestValue = (Scalar) (pow(10.0f, number_of_digits)-1.0);
|
|
}
|
|
|
|
numberOfDigits = number_of_digits;
|
|
format = requested_format;
|
|
backgroundColor = background_color;
|
|
foregroundColor = foreground_color;
|
|
offsetX = x_position;
|
|
offsetY = y_position;
|
|
erased = True;
|
|
|
|
ForceUpdate(); // ensure initialization
|
|
|
|
//------------------------------------------------------------
|
|
// Done with the font, release it
|
|
//------------------------------------------------------------
|
|
# if !defined(PRELOAD_ART)
|
|
Check_Pointer(warehouse);
|
|
warehouse->bitMapBin.Release(digitMapName);
|
|
# endif
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
NumericDisplay::~NumericDisplay()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Unlock preloaded art
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
warehouse->bitMapBin.Release(digitMapName);
|
|
# endif
|
|
//------------------------------------------------------------
|
|
// Delete the font name
|
|
//------------------------------------------------------------
|
|
Unregister_Pointer(digitMapName);
|
|
delete[] digitMapName;
|
|
digitMapName = NULL;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
NumericDisplay::TestInstance() const
|
|
{
|
|
return True;
|
|
}
|
|
|
|
void
|
|
NumericDisplay::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "NumericDisplay:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
std::cout << temp << "backgroundColor=" << backgroundColor << "\n";
|
|
std::cout << temp << "foregroundColor=" << foregroundColor << "\n";
|
|
std::cout << temp << "numberOfDigits =" << numberOfDigits << "\n";
|
|
std::cout << temp << "format =";
|
|
switch(format)
|
|
{
|
|
case unsignedFormat: std::cout << "unsignedFormat\n"; break;
|
|
case signedFormat: std::cout << "signedFormat\n"; break;
|
|
case signedBlankedZerosFormat: std::cout << "signedBlankedZerosFormat\n"; break;
|
|
case absoluteFormat: std::cout << "absoluteFormat\n"; break;
|
|
case timeFormat: std::cout << "timeFormat\n"; break;
|
|
default:
|
|
std::cout << "**OUT OF RANGE**\n";
|
|
}
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplay::ForceUpdate()
|
|
{
|
|
Check(this);
|
|
//-----------------------------------------------------------
|
|
// Force update by clearing previous value and digits
|
|
//-----------------------------------------------------------
|
|
previousValue = -1.2345f;
|
|
|
|
for(int i=0; i<maxDigits; ++i)
|
|
{
|
|
previousDigit[i] = -1;
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplay::SetColors(int bg_color, int fg_color)
|
|
{
|
|
Check(this);
|
|
backgroundColor = bg_color;
|
|
foregroundColor = fg_color;
|
|
ForceUpdate();
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplay::Draw(
|
|
GraphicsView *graphics_view,
|
|
Scalar current_value
|
|
)
|
|
{
|
|
Check(this);
|
|
|
|
if (erased)
|
|
{
|
|
erased = False;
|
|
ForceUpdate();
|
|
}
|
|
//-----------------------------------------------------------
|
|
// Get and lock the font so that we may use it
|
|
//-----------------------------------------------------------
|
|
Check(warehouse);
|
|
|
|
BitMap
|
|
*digit_map = warehouse->bitMapBin.Get(digitMapName);
|
|
|
|
if (digit_map != NULL)
|
|
{
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Get absolute value if required
|
|
//-----------------------------------------------------------
|
|
//
|
|
if(format == absoluteFormat)
|
|
{
|
|
if (current_value < 0.0)
|
|
{
|
|
current_value = - current_value;
|
|
}
|
|
}
|
|
Check_Fpu();
|
|
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Draw only if value has changed
|
|
//-----------------------------------------------------------
|
|
//
|
|
if (previousValue != current_value)
|
|
{
|
|
previousValue = current_value;
|
|
|
|
int
|
|
test_value((int) (current_value+.5)),
|
|
digit_height(digit_map->Data.Size.y),
|
|
i,
|
|
x,
|
|
sx;
|
|
Check_Fpu();
|
|
|
|
char
|
|
buffer[maxDigits+1],
|
|
*buffer_pointer;
|
|
|
|
//
|
|
//--------------------------------------------------------
|
|
// Get absolute value, limit to maximum
|
|
//--------------------------------------------------------
|
|
//
|
|
if (test_value < 0)
|
|
{
|
|
test_value = - test_value;
|
|
}
|
|
|
|
if (test_value > (int) largestValue)
|
|
{
|
|
test_value = (int) largestValue;
|
|
}
|
|
Check_Fpu();
|
|
|
|
//
|
|
//--------------------------------------------------------
|
|
// Build buffer
|
|
//--------------------------------------------------------
|
|
//
|
|
buffer_pointer = &buffer[numberOfDigits-1];
|
|
|
|
switch (format)
|
|
{
|
|
case absoluteFormat:
|
|
case unsignedFormat:
|
|
case signedBlankedZerosFormat:
|
|
for(i=numberOfDigits-1; i>=0; --i)
|
|
{
|
|
*buffer_pointer-- = (char) (test_value % 10);
|
|
test_value /= 10;
|
|
}
|
|
Check_Fpu();
|
|
break;
|
|
|
|
case signedFormat:
|
|
for(i=numberOfDigits-2; i>=0; --i)
|
|
{
|
|
*buffer_pointer-- = (char) (test_value % 10);
|
|
test_value /= 10;
|
|
}
|
|
*buffer_pointer = (char)
|
|
((current_value >= 0.0) ? plusDigit : minusDigit);
|
|
Check_Fpu();
|
|
break;
|
|
|
|
case timeFormat:
|
|
{
|
|
int
|
|
n,
|
|
state;
|
|
|
|
state = 0;
|
|
for(i=numberOfDigits; i>0; )
|
|
{
|
|
switch(state++)
|
|
{
|
|
case 0: // seconds
|
|
case 1: // minutes
|
|
n = test_value % 60;
|
|
test_value /= 60;
|
|
break;
|
|
|
|
case 2: // hours
|
|
n = test_value % 24;
|
|
test_value /= 24;
|
|
break;
|
|
|
|
case 3: // days
|
|
n = test_value % 100;
|
|
break;
|
|
|
|
default: // Oh, come on now!
|
|
n = 0;
|
|
break;
|
|
}
|
|
Check_Fpu();
|
|
if (--i >= 0)
|
|
{
|
|
*buffer_pointer-- = (char) (n % 10);
|
|
}
|
|
if (--i >= 0)
|
|
{
|
|
*buffer_pointer-- = (char) (n / 10);
|
|
}
|
|
if (--i >= 0)
|
|
{
|
|
*buffer_pointer-- = (char) colonDigit;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
Check_Fpu();
|
|
|
|
//
|
|
//--------------------------------------------------------
|
|
// Draw digits from buffer
|
|
//--------------------------------------------------------
|
|
//
|
|
Logical
|
|
blanked = True;
|
|
|
|
char
|
|
this_digit;
|
|
|
|
for(
|
|
i=0, x=offsetX, buffer_pointer=buffer;
|
|
i<numberOfDigits;
|
|
++i, x+=digitWidth, ++buffer_pointer
|
|
)
|
|
{
|
|
//-----------------------------------------------------
|
|
// Get 'new' digit
|
|
//-----------------------------------------------------
|
|
this_digit = *buffer_pointer;
|
|
|
|
//-----------------------------------------------------
|
|
// Special processing for blanked leading zeros
|
|
//-----------------------------------------------------
|
|
if (format == signedBlankedZerosFormat)
|
|
{
|
|
if (blanked)
|
|
{
|
|
//-----------------------------------------------------
|
|
// If negative, and next digit non-zero, draw (-)
|
|
//-----------------------------------------------------
|
|
if ((current_value < 0.0) && (*(buffer_pointer+1) != 0))
|
|
{
|
|
this_digit= minusDigit;
|
|
blanked = False;
|
|
}
|
|
//-----------------------------------------------------
|
|
// Else if non-zero, turn off blanking
|
|
//-----------------------------------------------------
|
|
else if (this_digit != 0)
|
|
{
|
|
blanked = False;
|
|
}
|
|
//-----------------------------------------------------
|
|
// Else if last character, turn off blanking
|
|
//-----------------------------------------------------
|
|
else if (i==(numberOfDigits-1))
|
|
{
|
|
blanked = False;
|
|
}
|
|
//-----------------------------------------------------
|
|
// Else blank the leading zero
|
|
//-----------------------------------------------------
|
|
else
|
|
{
|
|
this_digit = blankedDigit;
|
|
}
|
|
}
|
|
}
|
|
Check_Fpu();
|
|
|
|
//-----------------------------------------------------
|
|
// Draw only changed digits
|
|
//-----------------------------------------------------
|
|
if (previousDigit[i] != this_digit)
|
|
{
|
|
previousDigit[i] = this_digit;
|
|
|
|
//-----------------------------------------------------
|
|
// Move to digit location
|
|
//-----------------------------------------------------
|
|
graphics_view->MoveToAbsolute(x, offsetY);
|
|
//-----------------------------------------------------
|
|
// If blanked, draw filled rectangle
|
|
//-----------------------------------------------------
|
|
if (this_digit == blankedDigit)
|
|
{
|
|
graphics_view->SetColor(backgroundColor);
|
|
graphics_view->DrawFilledRectangleToRelative(
|
|
digitWidth,
|
|
digit_height
|
|
);
|
|
}
|
|
//-----------------------------------------------------
|
|
// Else draw character
|
|
//-----------------------------------------------------
|
|
else
|
|
{
|
|
sx = digitWidth*this_digit;
|
|
|
|
graphics_view->SetColor(foregroundColor);
|
|
graphics_view->DrawBitMapOpaque(
|
|
backgroundColor,
|
|
0, //rotation
|
|
digit_map,
|
|
sx, 0, sx+digitWidth-1, digit_height
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//-----------------------------------------------------------
|
|
// Unlock the font: we're done
|
|
//-----------------------------------------------------------
|
|
Check(warehouse);
|
|
warehouse->bitMapBin.Release(digitMapName);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplay::Erase(
|
|
GraphicsView *graphics_view
|
|
)
|
|
{
|
|
Check(this);
|
|
|
|
if (!erased)
|
|
{
|
|
erased = True;
|
|
|
|
graphics_view->SetColor(backgroundColor);
|
|
graphics_view->MoveToAbsolute(offsetX, offsetY);
|
|
graphics_view->DrawFilledRectangleToRelative(
|
|
digitWidth*numberOfDigits,
|
|
digitHeight
|
|
);
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
|
|
//###########################################################################
|
|
// NumericDisplayScalar
|
|
//###########################################################################
|
|
MethodDescription
|
|
NumericDisplayScalar::methodDescription =
|
|
{
|
|
"numeric",
|
|
NumericDisplayScalar::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeString, NULL }, // font name
|
|
{ ParameterDescription::typeInteger, NULL }, // # of digits
|
|
{ ParameterDescription::typeString, NULL }, // format
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeColor, NULL }, // foreground
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
NumericDisplayScalar::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeString); // font name
|
|
parameterList[4].CheckIt(ParameterDescription::typeInteger); // # of digs
|
|
parameterList[5].CheckIt(ParameterDescription::typeString); // format
|
|
parameterList[6].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[7].CheckIt(ParameterDescription::typeColor); // foreground
|
|
parameterList[8].CheckIt(ParameterDescription::typeAttribute); // value name
|
|
# endif
|
|
|
|
Test_Tell("NumericDisplayScalar::Make\n");
|
|
Check(gauge_renderer);
|
|
|
|
int
|
|
number_format = configureFormat[0].Search(
|
|
parameterList[5].data.string
|
|
);
|
|
|
|
if (number_format < 0)
|
|
{
|
|
Test_Tell("NumericDisplayScalar::Make format NOT FOUND\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
NumericDisplayScalar
|
|
*numeric_display =
|
|
# endif
|
|
new NumericDisplayScalar(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.string, //font name
|
|
parameterList[4].data.integer, //int number_of_chars
|
|
(NumericDisplay::NumericFormat) number_format,
|
|
parameterList[6].data.integer, //int background_color
|
|
parameterList[7].data.integer, //int foreground_color
|
|
(Scalar *) parameterList[8].data.attributePointer
|
|
|
|
// HACK!!!! The (Scalar *) is VERY dangerous!
|
|
);
|
|
Register_Object(numeric_display);
|
|
|
|
//--------------------------------------------------------
|
|
// Make sure the font was properly placed in the warehouse
|
|
//--------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[3].data.string) == NULL)
|
|
{
|
|
Test_Tell("NumericDisplayScalar::Missing font\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[3].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("NumericDisplayScalar::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
NumericDisplayScalar::NumericDisplayScalar(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
const char *font_name, //BitMap *font,
|
|
int number_of_digits,
|
|
NumericDisplay::NumericFormat requested_format,
|
|
int background_color, int foreground_color,
|
|
Scalar *value_pointer,
|
|
const char *identification_string
|
|
):
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Check_Pointer(this);
|
|
// graphics_port may be NULL!
|
|
Check_Pointer(value_pointer);
|
|
//-----------------------------------------------------------
|
|
// Set internal values
|
|
//-----------------------------------------------------------
|
|
numericDisplay = new NumericDisplay(
|
|
(L4Warehouse *) renderer->warehousePointer,
|
|
0,0,
|
|
font_name,
|
|
number_of_digits,
|
|
requested_format,
|
|
background_color,
|
|
foreground_color
|
|
);
|
|
Register_Object(numericDisplay);
|
|
|
|
localView.SetPositionWithinPort(left, bottom, right, top);
|
|
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Build connection to value
|
|
//-----------------------------------------------------------
|
|
//
|
|
GaugeConnection
|
|
*connection;
|
|
|
|
connection = new
|
|
GaugeConnectionDirectOf<Scalar>(0, ¤tValue, value_pointer);
|
|
Register_Object(connection);
|
|
AddConnection(connection);
|
|
Check_Fpu();
|
|
}
|
|
|
|
NumericDisplayScalar::~NumericDisplayScalar()
|
|
{
|
|
Check(this);
|
|
|
|
//-------------------------------------------------
|
|
// Destroy the numeric display
|
|
//-------------------------------------------------
|
|
if (numericDisplay != NULL)
|
|
{
|
|
Unregister_Object(numericDisplay);
|
|
delete numericDisplay;
|
|
numericDisplay = NULL;
|
|
}
|
|
|
|
// base class deletes all connections in Gauge::~Gauge
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
NumericDisplayScalar::TestInstance() const
|
|
{
|
|
return GraphicGauge::TestInstance();
|
|
}
|
|
|
|
void
|
|
NumericDisplayScalar::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "NumericDisplayScalar:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
GraphicGauge::ShowInstance(temp);
|
|
Check(numericDisplay);
|
|
numericDisplay->ShowInstance(temp);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplayScalar::BecameActive()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplay);
|
|
numericDisplay->ForceUpdate();
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplayScalar::SetColors(int bg_color, int fg_color)
|
|
{
|
|
Check(this);
|
|
numericDisplay->SetColors(bg_color, fg_color);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplayScalar::Execute()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplay);
|
|
numericDisplay->Draw(&localView, currentValue);
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// NumericDisplaySpeed
|
|
//
|
|
// - Converts input in meters per second to display as kilometers per hour
|
|
//###########################################################################
|
|
MethodDescription
|
|
NumericDisplaySpeed::methodDescription =
|
|
{
|
|
"numericSpeed",
|
|
NumericDisplaySpeed::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeString, NULL }, // font name
|
|
{ ParameterDescription::typeInteger, NULL }, // # of digits
|
|
{ ParameterDescription::typeString, NULL }, // format
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeColor, NULL }, // foreground
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
NumericDisplaySpeed::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeString); // font name
|
|
parameterList[4].CheckIt(ParameterDescription::typeInteger); // # of digs
|
|
parameterList[5].CheckIt(ParameterDescription::typeString); // format
|
|
parameterList[6].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[7].CheckIt(ParameterDescription::typeColor); // foreground
|
|
parameterList[8].CheckIt(ParameterDescription::typeAttribute); // value name
|
|
# endif
|
|
|
|
Test_Tell("NumericDisplaySpeed::Make\n");
|
|
|
|
int
|
|
number_format = configureFormat[0].Search(
|
|
parameterList[5].data.string
|
|
);
|
|
|
|
if (number_format < 0)
|
|
{
|
|
Test_Tell("NumericDisplaySpeed::Make format NOT FOUND\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
NumericDisplaySpeed
|
|
*numeric_display =
|
|
# endif
|
|
new NumericDisplaySpeed(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.string, //font name
|
|
parameterList[4].data.integer, //int number_of_chars
|
|
(NumericDisplay::NumericFormat) number_format,
|
|
parameterList[6].data.integer, //int background_color
|
|
parameterList[7].data.integer, //int foreground_color
|
|
(Scalar *) parameterList[8].data.attributePointer
|
|
|
|
// HACK!!!! The (Scalar *) is VERY dangerous!
|
|
);
|
|
|
|
Register_Object(numeric_display);
|
|
|
|
//--------------------------------------------------------
|
|
// Make sure the font was properly placed in the warehouse
|
|
//--------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[3].data.string) == NULL)
|
|
{
|
|
Test_Tell("NumericDisplaySpeed::Missing font\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[3].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("NumericDisplaySpeed::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
NumericDisplaySpeed::NumericDisplaySpeed(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
const char *font_name,
|
|
int number_of_digits,
|
|
NumericDisplay::NumericFormat requested_format,
|
|
int background_color, int foreground_color,
|
|
Scalar *value_pointer
|
|
):
|
|
NumericDisplayScalar(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
left, bottom, right, top,
|
|
font_name,
|
|
number_of_digits,
|
|
requested_format,
|
|
background_color, foreground_color,
|
|
value_pointer
|
|
)
|
|
{
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplaySpeed::Execute()
|
|
{
|
|
Check(this);
|
|
|
|
Scalar
|
|
value = currentValue*(Scalar)3.6;
|
|
|
|
Check(numericDisplay);
|
|
numericDisplay->Draw(&localView, fabs(value));
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// NumericDisplayInteger
|
|
//###########################################################################
|
|
MethodDescription
|
|
NumericDisplayInteger::methodDescription =
|
|
{
|
|
"numericInteger",
|
|
NumericDisplayInteger::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeString, NULL }, // font name
|
|
{ ParameterDescription::typeInteger, NULL }, // # of digits
|
|
{ ParameterDescription::typeString, NULL }, // format
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeColor, NULL }, // foreground
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
NumericDisplayInteger::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeString); // font
|
|
parameterList[4].CheckIt(ParameterDescription::typeInteger); // # of digs
|
|
parameterList[5].CheckIt(ParameterDescription::typeString); // format
|
|
parameterList[6].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[7].CheckIt(ParameterDescription::typeColor); // foreground
|
|
parameterList[8].CheckIt(ParameterDescription::typeAttribute); // value name
|
|
# endif
|
|
|
|
Test_Tell("NumericDisplayInteger::Make\n");
|
|
|
|
int
|
|
number_format = configureFormat[0].Search(
|
|
parameterList[5].data.string
|
|
);
|
|
|
|
if (number_format < 0)
|
|
{
|
|
Test_Tell("NumericDisplayInteger::Make format NOT FOUND\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
NumericDisplayInteger
|
|
*numeric_display =
|
|
# endif
|
|
new NumericDisplayInteger(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.string, //font name
|
|
parameterList[4].data.integer, //int number_of_chars
|
|
(NumericDisplay::NumericFormat) number_format,
|
|
parameterList[6].data.integer, //int background_color
|
|
parameterList[7].data.integer, //int foreground_color
|
|
(int *) parameterList[8].data.attributePointer
|
|
|
|
// HACK!!!! The (int *) is VERY dangerous!
|
|
);
|
|
Register_Object(numeric_display);
|
|
|
|
//--------------------------------------------------------
|
|
// Make sure the font was properly placed in the warehouse
|
|
//--------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[3].data.string) == NULL)
|
|
{
|
|
Test_Tell("NumericDisplayInteger::Missing font\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[3].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("NumericDisplayInteger::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
NumericDisplayInteger::NumericDisplayInteger(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
const char *font_name,
|
|
int number_of_digits,
|
|
NumericDisplay::NumericFormat requested_format,
|
|
int background_color, int foreground_color,
|
|
int *value_pointer,
|
|
const char *identification_string
|
|
):
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Check_Pointer(this);
|
|
// graphics_port may be NULL!
|
|
Check_Pointer(value_pointer);
|
|
Check(renderer);
|
|
//-----------------------------------------------------------
|
|
// Set internal values
|
|
//-----------------------------------------------------------
|
|
numericDisplay = new NumericDisplay(
|
|
(L4Warehouse *) renderer->warehousePointer,
|
|
0,0,
|
|
font_name,
|
|
number_of_digits,
|
|
requested_format,
|
|
background_color,
|
|
foreground_color
|
|
);
|
|
Register_Object(numericDisplay);
|
|
|
|
localView.SetPositionWithinPort(left, bottom, right, top);
|
|
//-----------------------------------------------------------
|
|
// Build connection to value
|
|
//-----------------------------------------------------------
|
|
GaugeConnection
|
|
*connection;
|
|
|
|
connection = new
|
|
GaugeConnectionDirectOf<int>(0, ¤tValue, value_pointer);
|
|
Register_Object(connection);
|
|
AddConnection(connection);
|
|
Check_Fpu();
|
|
}
|
|
|
|
NumericDisplayInteger::~NumericDisplayInteger()
|
|
{
|
|
Check(this);
|
|
|
|
if (numericDisplay != NULL)
|
|
{
|
|
Unregister_Object(numericDisplay);
|
|
delete numericDisplay;
|
|
numericDisplay = NULL;
|
|
}
|
|
|
|
// base class deletes all connections in Gauge::~Gauge
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
NumericDisplayInteger::TestInstance() const
|
|
{
|
|
return GraphicGauge::TestInstance();
|
|
}
|
|
|
|
void
|
|
NumericDisplayInteger::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "NumericDisplayInteger:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
GraphicGauge::ShowInstance(temp);
|
|
Check(numericDisplay);
|
|
numericDisplay->ShowInstance(temp);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplayInteger::BecameActive()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplay);
|
|
numericDisplay->ForceUpdate();
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplayInteger::SetColors(int bg_color, int fg_color)
|
|
{
|
|
Check(this);
|
|
numericDisplay->SetColors(bg_color, fg_color);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplayInteger::Execute()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplay);
|
|
numericDisplay->Draw(&localView, (Scalar) currentValue);
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// DigitalClock
|
|
//###########################################################################
|
|
MethodDescription
|
|
DigitalClock::methodDescription =
|
|
{
|
|
"digitalClock",
|
|
DigitalClock::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeString, NULL }, // font name
|
|
{ ParameterDescription::typeInteger, NULL }, // # of digits
|
|
{ ParameterDescription::typeString, NULL }, // format
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeColor, NULL }, // foreground
|
|
//{ ParameterDescription::typeEmpty, NULL },
|
|
{ ParameterDescription::typeEmpty, NULL }
|
|
}
|
|
};
|
|
|
|
Logical
|
|
DigitalClock::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeString); // font name
|
|
parameterList[4].CheckIt(ParameterDescription::typeInteger); // # of digs
|
|
parameterList[5].CheckIt(ParameterDescription::typeString); // format
|
|
parameterList[6].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[7].CheckIt(ParameterDescription::typeColor); // foreground
|
|
# endif
|
|
|
|
Test_Tell("DigitalClock::Make\n");
|
|
|
|
int
|
|
number_format = configureFormat[0].Search(
|
|
parameterList[5].data.string
|
|
);
|
|
|
|
if (number_format < 0)
|
|
{
|
|
Test_Tell("DigitalClock::Make format NOT FOUND\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
DigitalClock
|
|
*digital_clock =
|
|
# endif
|
|
new DigitalClock(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.string, //font name
|
|
parameterList[4].data.integer, //int number_of_chars
|
|
(NumericDisplay::NumericFormat) number_format,
|
|
parameterList[6].data.integer, //int background_color
|
|
parameterList[7].data.integer //int foreground_color
|
|
);
|
|
|
|
Register_Object(digital_clock);
|
|
|
|
//--------------------------------------------------------
|
|
// Make sure the font was properly placed in the warehouse
|
|
//--------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[3].data.string) == NULL)
|
|
{
|
|
Test_Tell("DigitalClock::Missing font\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[3].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("DigitalClock::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
DigitalClock::DigitalClock(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
const char *font_name,
|
|
int number_of_digits,
|
|
NumericDisplay::NumericFormat requested_format,
|
|
int background_color, int foreground_color,
|
|
const char *identification_string
|
|
):
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Check_Pointer(this);
|
|
// graphics_port may be NULL!
|
|
Check(renderer);
|
|
|
|
Verify((right - left - 1) >= 0);
|
|
Verify((top - bottom - 1) >= 0);
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Set internal values
|
|
//-----------------------------------------------------------
|
|
//
|
|
numericDisplay = new NumericDisplay(
|
|
(L4Warehouse *) renderer->warehousePointer,
|
|
0,0,
|
|
font_name,
|
|
number_of_digits,
|
|
requested_format,
|
|
background_color,
|
|
foreground_color
|
|
);
|
|
Register_Object(numericDisplay);
|
|
|
|
localView.SetPositionWithinPort(left, bottom, right, top);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
DigitalClock::~DigitalClock()
|
|
{
|
|
Check(this);
|
|
|
|
if (numericDisplay != NULL)
|
|
{
|
|
Unregister_Object(numericDisplay);
|
|
delete numericDisplay;
|
|
numericDisplay = NULL;
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
DigitalClock::TestInstance() const
|
|
{
|
|
return GraphicGauge::TestInstance();
|
|
}
|
|
|
|
void
|
|
DigitalClock::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "DigitalClock:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
std::cout << temp << "numericDisplay=" << numericDisplay << "\n";
|
|
Gauge::ShowInstance(temp);
|
|
Check(numericDisplay);
|
|
numericDisplay->ShowInstance(temp);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
DigitalClock::BecameActive()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplay);
|
|
numericDisplay->ForceUpdate();
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
DigitalClock::Execute()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplay);
|
|
Check(application);
|
|
|
|
// HACK!!!
|
|
// Something subtle and mysterious is happening here...
|
|
//...and ONLY in the OPT version (which won't show source in the debugger!)
|
|
//
|
|
// If I try to fold the 'GetSecondsRemainingInGame()' call
|
|
// into the 'Draw' method, the clock will show an extra
|
|
// 60 seconds in the game!
|
|
// Perhaps some invisible type conversion is occurring.
|
|
|
|
Scalar
|
|
seconds_remaining = application->GetSecondsRemainingInGame();
|
|
numericDisplay->Draw(&localView, seconds_remaining);
|
|
Check_Fpu();
|
|
}
|
|
|
|
|
|
//###########################################################################
|
|
// BackgroundConfig
|
|
//###########################################################################
|
|
Logical
|
|
MakeConfig(
|
|
int /*display_port_index*/,
|
|
Vector2DOf<int> /*position*/,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = MakeConfigMethodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeInteger);// port
|
|
parameterList[1].CheckIt(ParameterDescription::typeString); // name
|
|
parameterList[2].CheckIt(ParameterDescription::typeInteger);// rotation
|
|
parameterList[3].CheckIt(ParameterDescription::typeInteger);// bits
|
|
parameterList[4].CheckIt(ParameterDescription::typeString); // palette ID
|
|
parameterList[5].CheckIt(ParameterDescription::typeString); // channel ID
|
|
parameterList[6].CheckIt(ParameterDescription::typeString); // palette name
|
|
# endif
|
|
|
|
Test_Tell("BackgroundConfig::Make\n");
|
|
|
|
char
|
|
*palette_type = parameterList[4].data.string,
|
|
*enable_type = parameterList[5].data.string,
|
|
*palette_name = parameterList[6].data.string;
|
|
|
|
//-------------------------------------------------
|
|
// Get palette ID type
|
|
//-------------------------------------------------
|
|
int
|
|
palette_ID = configurePalettes[0].Search(palette_type);
|
|
|
|
if (palette_ID < 0)
|
|
{
|
|
DEBUG_STREAM <<
|
|
"configure palette_ID '" << palette_type << "' NOT FOUND\n";
|
|
return False;
|
|
}
|
|
|
|
//-------------------------------------------------
|
|
// Get channel enable type
|
|
//-------------------------------------------------
|
|
int
|
|
enable_ID = configureChannels[0].Search(enable_type);
|
|
|
|
if (enable_ID < 0)
|
|
{
|
|
DEBUG_STREAM <<
|
|
"configure enable_ID '" << enable_type << "' NOT FOUND\n";
|
|
return False;
|
|
}
|
|
|
|
int
|
|
port_number = parameterList[0].data.integer;
|
|
const char
|
|
*port_name = parameterList[1].data.string;
|
|
int
|
|
rotation = parameterList[2].data.integer;
|
|
int
|
|
new_bits = parameterList[3].data.integer;
|
|
|
|
Logical
|
|
ignore_palette_flag = (stricmp(palette_name, "NULL") == 0);
|
|
//------------------------------------------------------------
|
|
// Get, lock pixelmap from warehouse
|
|
//------------------------------------------------------------
|
|
//Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
Palette8
|
|
*palette;
|
|
|
|
if (ignore_palette_flag)
|
|
{
|
|
palette = NULL;
|
|
}
|
|
else
|
|
{
|
|
palette = warehouse->palette8Bin.Get(palette_name);
|
|
if (palette == NULL)
|
|
{
|
|
DEBUG_STREAM <<
|
|
"MakeConfig missing palette '" << palette_name << "'\n";
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
Check(palette);
|
|
}
|
|
//-------------------------------------------------
|
|
// Build the port
|
|
//-------------------------------------------------
|
|
//Check(renderer);
|
|
((L4GaugeRenderer *)gauge_renderer)->BuildGraphicsPort(
|
|
port_number,
|
|
port_name,
|
|
rotation,
|
|
new_bits,
|
|
(SVGA16::PaletteID) palette_ID,
|
|
(L4GraphicsPort::ChannelEnableID) enable_ID,
|
|
palette
|
|
);
|
|
//-------------------------------------------------
|
|
// Release the palette (we're done with it)
|
|
//-------------------------------------------------
|
|
if (!ignore_palette_flag)
|
|
{
|
|
warehouse->palette8Bin.Release(palette_name);
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("MakeConfig OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
MethodDescription
|
|
MakeConfigMethodDescription =
|
|
{
|
|
"configure",
|
|
MakeConfig,
|
|
{
|
|
{ ParameterDescription::typeInteger, NULL }, // graphicsPort #
|
|
{ ParameterDescription::typeString, NULL }, // name
|
|
{ ParameterDescription::typeInteger, NULL }, // rotation
|
|
{ ParameterDescription::typeInteger, NULL }, // bits
|
|
{ ParameterDescription::typeString, NULL }, // palette ID
|
|
{ ParameterDescription::typeString, NULL }, // channel ID
|
|
{ ParameterDescription::typeString, NULL }, // palette name
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
//###########################################################################
|
|
// MakeExternConfig
|
|
//###########################################################################
|
|
Logical
|
|
MakeExternConfig(
|
|
int /*display_port_index*/,
|
|
Vector2DOf<int> /*position*/,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = MakeExternConfigMethodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeInteger);// port #
|
|
parameterList[1].CheckIt(ParameterDescription::typeString); // name
|
|
parameterList[2].CheckIt(ParameterDescription::typeInteger);// bits
|
|
# endif
|
|
|
|
Test_Tell("MakeExternConfig\n");
|
|
|
|
//-------------------------------------------------
|
|
// Build the port
|
|
//-------------------------------------------------
|
|
//Check(renderer);
|
|
((L4GaugeRenderer *)gauge_renderer)->BuildExternalGraphicsPort(
|
|
parameterList[0].data.integer, // int port_number,
|
|
parameterList[1].data.string, // const char *name,
|
|
parameterList[2].data.integer // int bitAllocation
|
|
);
|
|
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("MakeExternConfig OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
MethodDescription
|
|
MakeExternConfigMethodDescription =
|
|
{
|
|
"externalConfigure",
|
|
MakeExternConfig,
|
|
{
|
|
{ ParameterDescription::typeInteger, NULL }, // graphicsPort #
|
|
{ ParameterDescription::typeString, NULL }, // name
|
|
{ ParameterDescription::typeInteger, NULL }, // bits
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
//###########################################################################
|
|
// BackgroundReconfig
|
|
//###########################################################################
|
|
MethodDescription
|
|
BackgroundReconfig::methodDescription =
|
|
{
|
|
"reconfigure",
|
|
BackgroundReconfig::Make,
|
|
{
|
|
{ ParameterDescription::typeModeMask, NULL },// mode mask
|
|
{ ParameterDescription::typeInteger, NULL }, // graphicsPort #
|
|
{ ParameterDescription::typeString, NULL }, // palette ID
|
|
{ ParameterDescription::typeString, NULL }, // channel ID
|
|
{ ParameterDescription::typeString, NULL }, // palette
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BackgroundReconfig::Make(
|
|
int /*display_port_index*/,
|
|
Vector2DOf<int> /*position*/,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeModeMask);// mode mask
|
|
parameterList[1].CheckIt(ParameterDescription::typeInteger);// port #
|
|
parameterList[2].CheckIt(ParameterDescription::typeString); // palette ID
|
|
parameterList[3].CheckIt(ParameterDescription::typeString); // channel ID
|
|
parameterList[4].CheckIt(ParameterDescription::typeString); // palette name
|
|
# endif
|
|
|
|
Test_Tell("BackgroundReconfig::Make\n");
|
|
|
|
char
|
|
*palette_type = parameterList[2].data.string,
|
|
*enable_type = parameterList[3].data.string,
|
|
*palette_name = parameterList[4].data.string;
|
|
|
|
//-------------------------------------------------
|
|
// Get palette ID type
|
|
//-------------------------------------------------
|
|
int
|
|
palette_ID = configurePalettes[0].Search(palette_type);
|
|
|
|
if (palette_ID < 0)
|
|
{
|
|
DEBUG_STREAM <<
|
|
"reconfigure palette_ID '" << palette_type << "' NOT FOUND\n";
|
|
return False;
|
|
}
|
|
|
|
//-------------------------------------------------
|
|
// Get channel enable type
|
|
//-------------------------------------------------
|
|
int
|
|
enable_ID = configureChannels[0].Search(enable_type);
|
|
|
|
if (enable_ID < 0)
|
|
{
|
|
DEBUG_STREAM <<
|
|
"reconfigure enable_ID '" << enable_type << "' NOT FOUND\n";
|
|
return False;
|
|
}
|
|
|
|
//-------------------------------------------------
|
|
// Create object
|
|
//-------------------------------------------------
|
|
BackgroundReconfig
|
|
*bg =
|
|
new BackgroundReconfig(
|
|
parameterList[0].data.modeMask, // mode mask
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
parameterList[1].data.integer, // port #
|
|
palette_ID,
|
|
enable_ID,
|
|
palette_name // palette name
|
|
);
|
|
|
|
Register_Object(bg);
|
|
|
|
//-----------------------------------------------------------
|
|
// Make sure the palette was properly placed in the warehouse
|
|
//-----------------------------------------------------------
|
|
if (!bg->ignorePaletteFlag)
|
|
{
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(palette_name) == NULL)
|
|
{
|
|
DEBUG_STREAM <<
|
|
"BackgroundReconfig missing palette '" << palette_name << "'\n";
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(palette_name);
|
|
}
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("BackgroundReconfig::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BackgroundReconfig::BackgroundReconfig(
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
int port_number,
|
|
int palette_ID,
|
|
int enable_ID,
|
|
const char *palette_name,
|
|
const char *identification_string
|
|
):
|
|
GaugeBackground(
|
|
mode_mask,
|
|
renderer,
|
|
0,
|
|
identification_string
|
|
)
|
|
{
|
|
portNumber = port_number;
|
|
paletteID = palette_ID;
|
|
enableID = enable_ID;
|
|
paletteName = nameCopy(palette_name);
|
|
ignorePaletteFlag = (stricmp(paletteName, "NULL") == 0);
|
|
|
|
//----------------------------------------------------------
|
|
// Preload the palette
|
|
//----------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
if (!ignorePaletteFlag)
|
|
{
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
warehouse->palette8Bin.Get(paletteName);
|
|
}
|
|
# endif
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
BackgroundReconfig::~BackgroundReconfig()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Unlock preloaded art
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
if (!ignorePaletteFlag)
|
|
{
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
warehouse->palette8Bin.Release(paletteName);
|
|
}
|
|
# endif
|
|
//------------------------------------------------------------
|
|
// Delete the names
|
|
//------------------------------------------------------------
|
|
Unregister_Pointer(paletteName);
|
|
delete[] paletteName;
|
|
paletteName = NULL;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BackgroundReconfig::BecameActive()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Get, lock pixelmap from warehouse
|
|
//------------------------------------------------------------
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
Palette8
|
|
*palette;
|
|
|
|
if (ignorePaletteFlag)
|
|
{
|
|
palette = NULL;
|
|
}
|
|
else
|
|
{
|
|
palette = warehouse->palette8Bin.Get(paletteName);
|
|
Check(palette);
|
|
}
|
|
//-------------------------------------------------
|
|
// Remap the port
|
|
//-------------------------------------------------
|
|
Check(renderer);
|
|
((L4GaugeRenderer *)renderer)->RemapGraphicsPort(
|
|
portNumber, // int port_number,
|
|
(SVGA16::PaletteID) paletteID,
|
|
(L4GraphicsPort::ChannelEnableID) enableID,
|
|
palette
|
|
);
|
|
//-------------------------------------------------
|
|
// Release the palette (we're done with it)
|
|
//-------------------------------------------------
|
|
if (!ignorePaletteFlag)
|
|
{
|
|
warehouse->palette8Bin.Release(paletteName);
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// BackgroundLine
|
|
//###########################################################################
|
|
MethodDescription
|
|
BackgroundLine::methodDescription =
|
|
{
|
|
"bgLine",
|
|
BackgroundLine::Make,
|
|
{
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeInteger, NULL }, // 1=thick
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeColor, NULL }, // color
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BackgroundLine::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[1].CheckIt(ParameterDescription::typeInteger); // thick
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeColor); // color
|
|
# endif
|
|
|
|
Test_Tell("BackgroundLine::Make\n");
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
BackgroundLine
|
|
*bg =
|
|
# endif
|
|
new BackgroundLine(
|
|
parameterList[0].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
parameterList[1].data.integer, // thick
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.color
|
|
);
|
|
|
|
Register_Object(bg);
|
|
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("BackgroundLine::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BackgroundLine::BackgroundLine(
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int thick_flag,
|
|
int left, int bottom, int right, int top,
|
|
int color,
|
|
const char *identification_string
|
|
):
|
|
GraphicGaugeBackground(
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
|
|
endpoints.bottomLeft.x = left;
|
|
endpoints.bottomLeft.y = bottom;
|
|
endpoints.topRight.x = right;
|
|
endpoints.topRight.y = top;
|
|
|
|
thickFlag = thick_flag;
|
|
|
|
localView.SetColor(color);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BackgroundLine::BecameActive()
|
|
{
|
|
Check(this);
|
|
//---------------------------------------------
|
|
// Draw it
|
|
//---------------------------------------------
|
|
localView.MoveToAbsolute(endpoints.bottomLeft.x, endpoints.bottomLeft.y);
|
|
|
|
if (thickFlag)
|
|
{
|
|
localView.DrawThickLineToAbsolute(
|
|
endpoints.topRight.x, endpoints.topRight.y
|
|
);
|
|
}
|
|
else
|
|
{
|
|
localView.DrawLineToAbsolute(
|
|
endpoints.topRight.x, endpoints.topRight.y
|
|
);
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// BackgroundRect
|
|
//###########################################################################
|
|
MethodDescription
|
|
BackgroundRect::methodDescription =
|
|
{
|
|
"bgRect",
|
|
BackgroundRect::Make,
|
|
{
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeColor, NULL }, // color
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BackgroundRect::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[1].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[2].CheckIt(ParameterDescription::typeColor); // color
|
|
# endif
|
|
|
|
Test_Tell("BackgroundRect::Make\n");
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
BackgroundRect
|
|
*bg =
|
|
# endif
|
|
new BackgroundRect(
|
|
parameterList[0].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[1].data.vector.x,
|
|
position.y + parameterList[1].data.vector.y,
|
|
parameterList[2].data.color
|
|
);
|
|
|
|
Register_Object(bg);
|
|
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("BackgroundRect::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BackgroundRect::BackgroundRect(
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int top, int right,
|
|
int color,
|
|
const char *identification_string
|
|
):
|
|
GraphicGaugeBackground(
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
|
|
endpoints.bottomLeft.x = left;
|
|
endpoints.bottomLeft.y = bottom;
|
|
endpoints.topRight.x = right;
|
|
endpoints.topRight.y = top;
|
|
|
|
localView.SetColor(color);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BackgroundRect::BecameActive()
|
|
{
|
|
Check(this);
|
|
//---------------------------------------------
|
|
// Draw it
|
|
//---------------------------------------------
|
|
localView.MoveToAbsolute(
|
|
endpoints.bottomLeft.x, endpoints.bottomLeft.y
|
|
);
|
|
localView.DrawRectangleToAbsolute(
|
|
endpoints.topRight.x, endpoints.topRight.y
|
|
);
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// BackgroundFilledRect
|
|
//###########################################################################
|
|
MethodDescription
|
|
BackgroundFilledRect::methodDescription =
|
|
{
|
|
"bgFilledRect",
|
|
BackgroundFilledRect::Make,
|
|
{
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeColor, NULL }, // color
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BackgroundFilledRect::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[1].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[2].CheckIt(ParameterDescription::typeColor); // color
|
|
# endif
|
|
|
|
Test_Tell("BackgroundFilledRect::Make\n");
|
|
|
|
BackgroundFilledRect
|
|
*bg =
|
|
new BackgroundFilledRect(
|
|
parameterList[0].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[1].data.vector.x,
|
|
position.y + parameterList[1].data.vector.y,
|
|
parameterList[2].data.color
|
|
);
|
|
|
|
Register_Object(bg);
|
|
|
|
//---------------------------------------------------------------
|
|
// Everything's ok: if 'always active', run once and then kill it
|
|
//---------------------------------------------------------------
|
|
if (
|
|
parameterList[0].data.modeMask ==
|
|
(ModeMask) ModeManager::ModeAlwaysActive
|
|
)
|
|
{
|
|
bg->BecameActive();
|
|
|
|
Unregister_Object(bg);
|
|
delete bg;
|
|
}
|
|
Test_Tell("BackgroundFilledRect::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BackgroundFilledRect::BackgroundFilledRect(
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int top, int right,
|
|
int color,
|
|
const char *identification_string
|
|
):
|
|
GraphicGaugeBackground(
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
|
|
endpoints.bottomLeft.x = left;
|
|
endpoints.bottomLeft.y = bottom;
|
|
endpoints.topRight.x = right;
|
|
endpoints.topRight.y = top;
|
|
|
|
localView.SetColor(color);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BackgroundFilledRect::BecameActive()
|
|
{
|
|
Check(this);
|
|
//---------------------------------------------
|
|
// Draw it
|
|
//---------------------------------------------
|
|
localView.MoveToAbsolute(
|
|
endpoints.bottomLeft.x, endpoints.bottomLeft.y
|
|
);
|
|
localView.DrawFilledRectangleToAbsolute(
|
|
endpoints.topRight.x, endpoints.topRight.y
|
|
);
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// BackgroundPixelMap
|
|
//###########################################################################
|
|
MethodDescription
|
|
BackgroundPixelmap::methodDescription =
|
|
{
|
|
"bgPixelMap",
|
|
BackgroundPixelmap::Make,
|
|
{
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeString, NULL }, // pixelmap name
|
|
{ ParameterDescription::typeInteger, NULL }, // 1=opaque
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BackgroundPixelmap::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[1].CheckIt(ParameterDescription::typeString); // map name
|
|
parameterList[2].CheckIt(ParameterDescription::typeInteger); // opaque
|
|
# endif
|
|
|
|
Test_Tell("BackgroundPixelmap::Make\n");
|
|
|
|
const char
|
|
*name = parameterList[1].data.string;
|
|
|
|
BackgroundPixelmap
|
|
*bg =
|
|
new BackgroundPixelmap(
|
|
parameterList[0].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
name, //font name
|
|
parameterList[2].data.integer
|
|
);
|
|
|
|
Register_Object(bg);
|
|
|
|
//--------------------------------------------------------
|
|
// Make sure the map was properly placed in the warehouse
|
|
//--------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->pixelMap8Bin.Get(name) == NULL)
|
|
{
|
|
DEBUG_STREAM <<
|
|
"BackgroundPixelmap::Missing image '" << name << "\n";
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->pixelMap8Bin.Release(name);
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
// Everything's ok: if 'always active', run once and then kill it
|
|
//---------------------------------------------------------------
|
|
if (
|
|
parameterList[0].data.modeMask ==
|
|
(ModeMask) ModeManager::ModeAlwaysActive
|
|
)
|
|
{
|
|
bg->BecameActive();
|
|
|
|
Unregister_Object(bg);
|
|
delete bg;
|
|
}
|
|
Test_Tell("BackgroundPixelmap::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BackgroundPixelmap::BackgroundPixelmap(
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom,
|
|
const char *pixelmap_name,
|
|
int opaque_flag,
|
|
const char *identification_string
|
|
):
|
|
GraphicGaugeBackground(
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
//------------------------------------------------------------
|
|
// Save the map name
|
|
//------------------------------------------------------------
|
|
pixelMapName = nameCopy(pixelmap_name);
|
|
opaqueFlag = opaque_flag;
|
|
//------------------------------------------------------------
|
|
// Set origin
|
|
//------------------------------------------------------------
|
|
localView.SetOrigin(left, bottom);
|
|
//------------------------------------------------------------
|
|
// Order the font from the warehouse (pre-load for future use)
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
Check_Pointer(pixelMapName);
|
|
warehouse->pixelMap8Bin.Get(pixelMapName);
|
|
# endif
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
BackgroundPixelmap::~BackgroundPixelmap()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Unlock preloaded art
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
Check_Pointer(pixelMapName);
|
|
warehouse->pixelMap8Bin.Release(pixelMapName);
|
|
# endif
|
|
//------------------------------------------------------------
|
|
// Delete the map name
|
|
//------------------------------------------------------------
|
|
Unregister_Pointer(pixelMapName);
|
|
delete[] pixelMapName;
|
|
pixelMapName = NULL;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
BackgroundPixelmap::TestInstance() const
|
|
{
|
|
Check_Pointer(pixelMapName);
|
|
return GraphicGaugeBackground::TestInstance();
|
|
}
|
|
|
|
void
|
|
BackgroundPixelmap::BecameActive()
|
|
{
|
|
Check(this);
|
|
//---------------------------------------------
|
|
// Get the image
|
|
//---------------------------------------------
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
PixelMap8
|
|
*map = warehouse->pixelMap8Bin.Get(pixelMapName);
|
|
|
|
//---------------------------------------------
|
|
// Draw it
|
|
//---------------------------------------------
|
|
if (map != NULL)
|
|
{
|
|
Check(map);
|
|
localView.MoveToAbsolute(0,0);
|
|
localView.DrawPixelMap8(opaqueFlag, 0, map);
|
|
}
|
|
//---------------------------------------------
|
|
// Release the image
|
|
//---------------------------------------------
|
|
Check(warehouse);
|
|
warehouse->pixelMap8Bin.Release(pixelMapName);
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// BackgroundBitMap
|
|
//###########################################################################
|
|
MethodDescription
|
|
BackgroundBitmap::methodDescription =
|
|
{
|
|
"bgBitMap",
|
|
BackgroundBitmap::Make,
|
|
{
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeString, NULL }, // bitmap name
|
|
{ ParameterDescription::typeInteger, NULL }, // 1=opaque
|
|
{ ParameterDescription::typeColor, NULL }, // fg color
|
|
{ ParameterDescription::typeColor, NULL }, // bg color(opaque)
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BackgroundBitmap::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[1].CheckIt(ParameterDescription::typeString); // map name
|
|
parameterList[2].CheckIt(ParameterDescription::typeInteger); // opaque
|
|
parameterList[3].CheckIt(ParameterDescription::typeColor); // fg color
|
|
parameterList[4].CheckIt(ParameterDescription::typeColor); // bg color
|
|
# endif
|
|
|
|
Test_Tell("BackgroundBitMap::Make\n");
|
|
|
|
const char
|
|
*name = parameterList[1].data.string;
|
|
|
|
BackgroundBitmap
|
|
*bg =
|
|
new BackgroundBitmap(
|
|
parameterList[0].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
name, //font name
|
|
parameterList[2].data.integer,
|
|
parameterList[3].data.color,
|
|
parameterList[4].data.color
|
|
);
|
|
|
|
Register_Object(bg);
|
|
|
|
//--------------------------------------------------------
|
|
// Make sure the map was properly placed in the warehouse
|
|
//--------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(name) == NULL)
|
|
{
|
|
DEBUG_STREAM <<
|
|
"BackgroundBitmap::Missing image '" << name << "\n";
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(name);
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
// Everything's ok: if 'always active', run once and then kill it
|
|
//---------------------------------------------------------------
|
|
if (
|
|
parameterList[0].data.modeMask ==
|
|
(ModeMask) ModeManager::ModeAlwaysActive
|
|
)
|
|
{
|
|
bg->BecameActive();
|
|
|
|
Unregister_Object(bg);
|
|
delete bg;
|
|
}
|
|
Test_Tell("BackgroundBitmap::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BackgroundBitmap::BackgroundBitmap(
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom,
|
|
const char *bitmap_name,
|
|
int opaque_flag,
|
|
int fg_color,
|
|
int bg_color,
|
|
const char *identification_string
|
|
):
|
|
GraphicGaugeBackground(
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
//------------------------------------------------------------
|
|
// Save the map name
|
|
//------------------------------------------------------------
|
|
bitMapName = nameCopy(bitmap_name);
|
|
opaqueFlag = opaque_flag;
|
|
foregroundColor = fg_color;
|
|
backgroundColor = bg_color;
|
|
//------------------------------------------------------------
|
|
// Set origin
|
|
//------------------------------------------------------------
|
|
localView.SetOrigin(left, bottom);
|
|
//------------------------------------------------------------
|
|
// Order the map from the warehouse (pre-load for future use)
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
Check_Pointer(bitMapName);
|
|
warehouse->bitMapBin.Get(bitMapName);
|
|
# endif
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
BackgroundBitmap::~BackgroundBitmap()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Unlock preloaded art
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
Check_Pointer(bitMapName);
|
|
warehouse->bitMapBin.Release(bitMapName);
|
|
# endif
|
|
//------------------------------------------------------------
|
|
// Delete the map name
|
|
//------------------------------------------------------------
|
|
Unregister_Pointer(bitMapName);
|
|
delete[] bitMapName;
|
|
bitMapName = NULL;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
BackgroundBitmap::TestInstance() const
|
|
{
|
|
Check_Pointer(bitMapName);
|
|
return GraphicGaugeBackground::TestInstance();
|
|
}
|
|
|
|
void
|
|
BackgroundBitmap::BecameActive()
|
|
{
|
|
Check(this);
|
|
//---------------------------------------------
|
|
// Get the image
|
|
//---------------------------------------------
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
BitMap
|
|
*map = warehouse->bitMapBin.Get(bitMapName);
|
|
|
|
//---------------------------------------------
|
|
// Draw it
|
|
//---------------------------------------------
|
|
if (map != NULL)
|
|
{
|
|
Check(map);
|
|
localView.MoveToAbsolute(0,0);
|
|
localView.SetColor(foregroundColor);
|
|
|
|
if (opaqueFlag)
|
|
{
|
|
localView.DrawBitMapOpaque(backgroundColor, 0, map);
|
|
}
|
|
else
|
|
{
|
|
localView.DrawBitMap(0, map);
|
|
}
|
|
}
|
|
//---------------------------------------------
|
|
// Release the image
|
|
//---------------------------------------------
|
|
Check(warehouse);
|
|
warehouse->pixelMap8Bin.Release(bitMapName);
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// RankAndScore
|
|
//###########################################################################
|
|
|
|
#define RNSCHARWIDTH 6
|
|
#define RNSCHARHEIGHT 8
|
|
#define RNSSCOREDIGITS 8
|
|
#define RNSRANK_X 2
|
|
#define RNSLINE_X (RNSRANK_X+RNSCHARWIDTH+2)
|
|
#define RNSSCORE_X (RNSLINE_X+2)
|
|
#define RNS_Y 2
|
|
#define RNSWIDTH (2+RNSCHARWIDTH+5+(RNSCHARWIDTH*RNSSCOREDIGITS)+2)
|
|
#define RNSHEIGHT (2+RNSCHARHEIGHT+2)
|
|
|
|
MethodDescription
|
|
RankAndScore::methodDescription =
|
|
{
|
|
"rankAndScore",
|
|
RankAndScore::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeString, NULL }, // font name
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeColor, NULL }, // foreground
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
RankAndScore::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeString); // font
|
|
parameterList[3].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[4].CheckIt(ParameterDescription::typeColor); // foreground
|
|
# endif
|
|
|
|
Test_Tell("RankAndScore::Make\n");
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
RankAndScore
|
|
*rank_and_score =
|
|
# endif
|
|
new RankAndScore(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
parameterList[2].data.string, //font name
|
|
parameterList[3].data.integer, //int background_color
|
|
parameterList[4].data.integer //int foreground_color
|
|
);
|
|
|
|
Register_Object(rank_and_score);
|
|
|
|
//--------------------------------------------------------
|
|
// Make sure the font was properly placed in the warehouse
|
|
//--------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[2].data.string) == NULL)
|
|
{
|
|
Test_Tell("RankAndScore::Missing font\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[2].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("RankAndScore::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
RankAndScore::RankAndScore(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom,
|
|
const char *font_name,
|
|
int foreground_color, int background_color,
|
|
const char *identification_string
|
|
):
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Check_Pointer(this);
|
|
Check(renderer);
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Set internal values
|
|
//-----------------------------------------------------------
|
|
//
|
|
numericDisplayRank = new NumericDisplay(
|
|
(L4Warehouse *) renderer->warehousePointer,
|
|
RNSRANK_X,RNS_Y,
|
|
font_name,
|
|
1,
|
|
NumericDisplay::unsignedFormat,
|
|
background_color,
|
|
foreground_color
|
|
);
|
|
Register_Object(numericDisplayRank);
|
|
|
|
numericDisplayScore = new NumericDisplay(
|
|
(L4Warehouse *) renderer->warehousePointer,
|
|
RNSSCORE_X,RNS_Y,
|
|
font_name,
|
|
RNSSCOREDIGITS,
|
|
NumericDisplay::signedBlankedZerosFormat,
|
|
background_color,
|
|
foreground_color
|
|
);
|
|
Register_Object(numericDisplayScore);
|
|
|
|
localView.SetPositionWithinPort(
|
|
left,bottom,
|
|
left+RNSWIDTH+1,bottom+RNSHEIGHT+1
|
|
);
|
|
|
|
linkedEntity = NULL;
|
|
foregroundColor = foreground_color;
|
|
backgroundColor = background_color;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
RankAndScore::~RankAndScore()
|
|
{
|
|
Check(this);
|
|
|
|
if (linkedEntity != NULL)
|
|
{
|
|
Player
|
|
*player;
|
|
|
|
Check(linkedEntity);
|
|
player = linkedEntity->GetPlayerLink();
|
|
Check(player);
|
|
//---------------------------------------
|
|
// Truncate the score (no rounding)
|
|
//---------------------------------------
|
|
DEBUG_STREAM <<
|
|
"~RankAndScore: I think my score is " <<
|
|
(int)(player->currentScore) << "\n";
|
|
}
|
|
|
|
if (numericDisplayRank != NULL)
|
|
{
|
|
Unregister_Object(numericDisplayRank);
|
|
delete numericDisplayRank;
|
|
numericDisplayRank = NULL;
|
|
}
|
|
if (numericDisplayScore != NULL)
|
|
{
|
|
Unregister_Object(numericDisplayScore);
|
|
delete numericDisplayScore;
|
|
numericDisplayScore = NULL;
|
|
}
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
RankAndScore::TestInstance() const
|
|
{
|
|
return GraphicGauge::TestInstance();
|
|
}
|
|
|
|
void
|
|
RankAndScore::ShowInstance(char */*indent*/)
|
|
{
|
|
}
|
|
|
|
void
|
|
RankAndScore::BecameActive()
|
|
{
|
|
Check(this);
|
|
|
|
previousState = False;
|
|
|
|
Check(numericDisplayRank);
|
|
Check(numericDisplayScore);
|
|
|
|
numericDisplayRank->ForceUpdate();
|
|
numericDisplayScore->ForceUpdate();
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
RankAndScore::LinkToEntity(Entity *entity)
|
|
{
|
|
Test_Tell("RankAndScore::LinkToEntity\n" << std::flush);
|
|
Check(this);
|
|
|
|
linkedEntity = entity;
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
RankAndScore::Execute()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplayRank);
|
|
Check(numericDisplayScore);
|
|
|
|
Check(application);
|
|
Logical
|
|
currentState =
|
|
(application->GetApplicationState() == Application::RunningMission);
|
|
|
|
if (previousState != currentState)
|
|
{
|
|
previousState = currentState;
|
|
|
|
if (currentState == True)
|
|
{
|
|
//-------------------------------------------
|
|
// Draw background
|
|
//-------------------------------------------
|
|
localView.SetColor(backgroundColor);
|
|
localView.MoveToAbsolute(1,1);
|
|
localView.DrawFilledRectangleToAbsolute(RNSWIDTH-1,RNSHEIGHT-1);
|
|
|
|
localView.SetColor(foregroundColor);
|
|
localView.MoveToAbsolute(0,0);
|
|
localView.DrawRectangleToAbsolute(RNSWIDTH,RNSHEIGHT);
|
|
localView.MoveToAbsolute(RNSLINE_X,0);
|
|
localView.DrawLineToAbsolute(RNSLINE_X,RNSHEIGHT);
|
|
}
|
|
}
|
|
|
|
if (currentState == True)
|
|
{
|
|
//-------------------------------------------
|
|
// Get 'our' placement
|
|
//-------------------------------------------
|
|
if (linkedEntity != NULL)
|
|
{
|
|
Player
|
|
*player;
|
|
|
|
Check(linkedEntity);
|
|
player = linkedEntity->GetPlayerLink();
|
|
Check(player);
|
|
//---------------------------------------
|
|
// Truncate the score (no rounding)
|
|
//---------------------------------------
|
|
int
|
|
integer_score = (int)(player->currentScore);
|
|
//---------------------------------------
|
|
// Update displays
|
|
//---------------------------------------
|
|
numericDisplayRank->Draw(
|
|
&localView,
|
|
player->playerRanking+1
|
|
);
|
|
numericDisplayScore->Draw(
|
|
&localView,
|
|
(Scalar) integer_score
|
|
);
|
|
}
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// WipeGaugeScalar
|
|
//###########################################################################
|
|
WipeGaugeScalar::WipeGaugeScalar(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
Direction direction,
|
|
Scalar min,
|
|
Scalar max,
|
|
const char *identification_string
|
|
):
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Check_Pointer(this);
|
|
// graphics_port may be NULL!
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Initialize internal values
|
|
//-----------------------------------------------------------
|
|
//
|
|
width = right - left - 1;
|
|
height = top - bottom - 1;
|
|
Verify(width >= 0);
|
|
Verify(height >= 0);
|
|
|
|
previousValue = -1234;
|
|
previousSize.MakeEmpty();
|
|
|
|
wipeDirection = direction;
|
|
minimumValue = min;
|
|
maximumValue = max - min;
|
|
Verify(maximumValue != 0);
|
|
|
|
localView.SetPositionWithinPort(left, bottom, right, top);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
|
|
WipeGaugeScalar::~WipeGaugeScalar()
|
|
{
|
|
Check(this);
|
|
|
|
// base class deletes all connections in Gauge::~Gauge
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
WipeGaugeScalar::TestInstance() const
|
|
{
|
|
return GraphicGauge::TestInstance();
|
|
}
|
|
|
|
void
|
|
WipeGaugeScalar::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "WipeGaugeScalar:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
std::cout << temp << "previousSize =" << previousSize << "\n";
|
|
GraphicGauge::ShowInstance(temp);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
WipeGaugeScalar::BecameActive()
|
|
{
|
|
Check(this);
|
|
forceUpdateFlag = True;
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
WipeGaugeScalar::Execute()
|
|
{
|
|
Check(this);
|
|
|
|
int
|
|
new_value;
|
|
|
|
Scalar
|
|
q;
|
|
|
|
Rectangle2D
|
|
rectangle;
|
|
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Calculate new_value
|
|
//-----------------------------------------------------------
|
|
//
|
|
if (currentValue < minimumValue)
|
|
{
|
|
currentValue = minimumValue;
|
|
}
|
|
|
|
currentValue -= minimumValue;
|
|
|
|
if (currentValue > maximumValue)
|
|
{
|
|
currentValue = maximumValue;
|
|
}
|
|
|
|
Verify(maximumValue != 0);
|
|
q = currentValue / maximumValue;
|
|
|
|
if (q > 1.0)
|
|
{
|
|
q = 1.0;
|
|
}
|
|
else if (q < -1.0)
|
|
{
|
|
q = -1.0;
|
|
}
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Update display
|
|
//-----------------------------------------------------------
|
|
//
|
|
switch(wipeDirection)
|
|
{
|
|
case wipeLeft:
|
|
new_value = width - (int) (width*q + .5);
|
|
|
|
if (forceUpdateFlag)
|
|
{
|
|
forceUpdateFlag = False;
|
|
|
|
rectangle.topRight.x = width;
|
|
rectangle.topRight.y = height;
|
|
rectangle.bottomLeft.x = new_value;
|
|
rectangle.bottomLeft.y = 0;
|
|
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawActive(&rectangle);
|
|
}
|
|
|
|
rectangle.topRight.x = new_value-1;
|
|
rectangle.bottomLeft.x = 0;
|
|
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawInactive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
else if (new_value > previousValue)
|
|
{
|
|
rectangle.topRight.x = new_value-1;
|
|
rectangle.topRight.y = height;
|
|
rectangle.bottomLeft.x = previousValue;
|
|
rectangle.bottomLeft.y = 0;
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawInactive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
else if (previousValue > new_value)
|
|
{
|
|
rectangle.topRight.x = previousValue-1;
|
|
rectangle.topRight.y = height;
|
|
rectangle.bottomLeft.x = new_value;
|
|
rectangle.bottomLeft.y = 0;
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawActive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
break;
|
|
|
|
case wipeDown:
|
|
new_value = height - (int) (height*q + .5);
|
|
|
|
if (forceUpdateFlag)
|
|
{
|
|
forceUpdateFlag = False;
|
|
|
|
rectangle.topRight.x = width;
|
|
rectangle.topRight.y = height;
|
|
rectangle.bottomLeft.x = 0;
|
|
rectangle.bottomLeft.y = new_value;
|
|
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawActive(&rectangle);
|
|
}
|
|
|
|
rectangle.topRight.y = new_value-1;
|
|
rectangle.bottomLeft.y = 0;
|
|
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawInactive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
else if (new_value > previousValue)
|
|
{
|
|
rectangle.topRight.x = width;
|
|
rectangle.topRight.y = new_value+1;
|
|
rectangle.bottomLeft.x = 0;
|
|
rectangle.bottomLeft.y = previousValue;
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawInactive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
else if (previousValue > new_value)
|
|
{
|
|
rectangle.topRight.x = width;
|
|
rectangle.topRight.y = previousValue+1;
|
|
rectangle.bottomLeft.x = 0;
|
|
rectangle.bottomLeft.y = new_value;
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawActive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
break;
|
|
|
|
case wipeRight:
|
|
new_value = (int) (width*q + .5);
|
|
|
|
if (forceUpdateFlag)
|
|
{
|
|
forceUpdateFlag = False;
|
|
|
|
rectangle.topRight.x = new_value;
|
|
rectangle.topRight.y = height;
|
|
rectangle.bottomLeft.x = 0;
|
|
rectangle.bottomLeft.y = 0;
|
|
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawActive(&rectangle);
|
|
}
|
|
|
|
rectangle.topRight.x = width;
|
|
rectangle.bottomLeft.x = new_value+1;
|
|
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawInactive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
else if (new_value > previousValue)
|
|
{
|
|
rectangle.topRight.x = new_value;
|
|
rectangle.topRight.y = height;
|
|
rectangle.bottomLeft.x = previousValue+1;
|
|
rectangle.bottomLeft.y = 0;
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawActive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
else if (previousValue > new_value)
|
|
{
|
|
rectangle.topRight.x = previousValue;
|
|
rectangle.topRight.y = height;
|
|
rectangle.bottomLeft.x = new_value+1;
|
|
rectangle.bottomLeft.y = 0;
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawInactive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
break;
|
|
|
|
case wipeUp:
|
|
new_value = (int) (height*q + .5);
|
|
|
|
if (forceUpdateFlag)
|
|
{
|
|
forceUpdateFlag = False;
|
|
|
|
rectangle.topRight.x = width;
|
|
rectangle.topRight.y = new_value;
|
|
rectangle.bottomLeft.x = 0;
|
|
rectangle.bottomLeft.y = 0;
|
|
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawActive(&rectangle);
|
|
}
|
|
|
|
rectangle.topRight.y = height;
|
|
rectangle.bottomLeft.y = new_value+1;
|
|
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawInactive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
else if (previousValue < new_value)
|
|
{
|
|
rectangle.topRight.x = width;
|
|
rectangle.topRight.y = new_value;
|
|
rectangle.bottomLeft.x = 0;
|
|
rectangle.bottomLeft.y = previousValue;
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawActive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
else if (previousValue > new_value)
|
|
{
|
|
rectangle.topRight.x = width;
|
|
rectangle.topRight.y = previousValue;
|
|
rectangle.bottomLeft.x = 0;
|
|
rectangle.bottomLeft.y = new_value;
|
|
if (!rectangle.IsEmpty())
|
|
{
|
|
DrawInactive(&rectangle);
|
|
}
|
|
previousValue = new_value;
|
|
}
|
|
break;
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
WipeGaugeScalar::DrawActive(
|
|
Rectangle2D */*rectangle*/
|
|
)
|
|
{
|
|
Fail("WipeGaugeScalar::DrawActive is not overridden");
|
|
}
|
|
|
|
void
|
|
WipeGaugeScalar::DrawInactive(
|
|
Rectangle2D */*rectangle*/
|
|
)
|
|
{
|
|
Fail("WipeGaugeScalar::DrawInactive is not overridden");
|
|
}
|
|
|
|
//###########################################################################
|
|
// BarGraphSolidScalar
|
|
//###########################################################################
|
|
MethodDescription
|
|
BarGraphSolidScalar::methodDescription =
|
|
{
|
|
"solidbar",
|
|
BarGraphSolidScalar::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeColor, NULL }, // foreground
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeString, NULL }, // direction
|
|
{ ParameterDescription::typeScalar, NULL }, // min
|
|
{ ParameterDescription::typeScalar, NULL }, // max
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BarGraphSolidScalar::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeColor); // foreground
|
|
parameterList[4].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[5].CheckIt(ParameterDescription::typeString); // direction
|
|
parameterList[6].CheckIt(ParameterDescription::typeScalar); // min
|
|
parameterList[7].CheckIt(ParameterDescription::typeScalar); // max
|
|
parameterList[8].CheckIt(ParameterDescription::typeAttribute); // attribute
|
|
# endif
|
|
|
|
Test_Tell("BarGraphSolidScalar::Make\n");
|
|
|
|
int
|
|
direction = configureDirection[0].Search(
|
|
parameterList[5].data.string
|
|
);
|
|
|
|
if (direction < 0)
|
|
{
|
|
Test_Tell("BarGraphSolidScalar::Make direction NOT FOUND\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
BarGraphSolidScalar
|
|
*bar_graph =
|
|
# endif
|
|
new BarGraphSolidScalar(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, // unsigned int owner_ID
|
|
display_port_index, // int graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.color, // int foreground_color
|
|
parameterList[4].data.color, // int background_color
|
|
(WipeGaugeScalar::Direction) direction,
|
|
parameterList[6].data.scalar, // Scalar min,
|
|
parameterList[7].data.scalar, // Scalar max,
|
|
(Scalar *) parameterList[8].data.attributePointer // Scalar *valptr
|
|
// HACK!!!! The (Scalar *) is VERY dangerous!
|
|
);
|
|
|
|
Register_Object(bar_graph);
|
|
|
|
Test_Tell("BarGraphSolidScalar::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BarGraphSolidScalar::BarGraphSolidScalar(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
int foreground_color, int background_color,
|
|
WipeGaugeScalar::Direction direction,
|
|
Scalar min,
|
|
Scalar max,
|
|
Scalar *value_pointer,
|
|
const char *identification_string
|
|
):
|
|
WipeGaugeScalar(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
left, bottom, right, top,
|
|
direction,
|
|
min,
|
|
max,
|
|
identification_string
|
|
)
|
|
{
|
|
backgroundColor = background_color;
|
|
foregroundColor = foreground_color;
|
|
|
|
//
|
|
//-----------------------------------------------------------
|
|
// Build connection to value
|
|
// (if NULL, it's assumed that a derived object built the
|
|
// connection for us)
|
|
//-----------------------------------------------------------
|
|
//
|
|
if (value_pointer != NULL)
|
|
{
|
|
GaugeConnection
|
|
*connection = new
|
|
GaugeConnectionDirectOf<Scalar>(0, ¤tValue, value_pointer);
|
|
Register_Object(connection);
|
|
AddConnection(connection);
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
BarGraphSolidScalar::~BarGraphSolidScalar()
|
|
{
|
|
Check(this);
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
BarGraphSolidScalar::TestInstance() const
|
|
{
|
|
return WipeGaugeScalar::TestInstance();
|
|
}
|
|
|
|
void
|
|
BarGraphSolidScalar::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "BarGraphSolidScalar:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
std::cout << temp << "foregroundColor=" << foregroundColor << "\n";
|
|
std::cout << temp << "backgroundColor=" << backgroundColor << "\n";
|
|
WipeGaugeScalar::ShowInstance(temp);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BarGraphSolidScalar::DrawActive(
|
|
Rectangle2D *rectangle
|
|
)
|
|
{
|
|
localView.SetColor(foregroundColor);
|
|
localView.MoveToAbsolute(
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y
|
|
);
|
|
localView.DrawFilledRectangleToAbsolute(
|
|
rectangle->topRight.x,
|
|
rectangle->topRight.y
|
|
);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BarGraphSolidScalar::DrawInactive(
|
|
Rectangle2D *rectangle
|
|
)
|
|
{
|
|
localView.SetColor(backgroundColor);
|
|
localView.MoveToAbsolute(
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y
|
|
);
|
|
localView.DrawFilledRectangleToAbsolute(
|
|
rectangle->topRight.x,
|
|
rectangle->topRight.y
|
|
);
|
|
Check_Fpu();
|
|
}
|
|
|
|
|
|
//###########################################################################
|
|
// BarGraphBitMapScalar
|
|
//###########################################################################
|
|
MethodDescription
|
|
BarGraphBitMapScalar::methodDescription =
|
|
{
|
|
"bitmapbar",
|
|
BarGraphBitMapScalar::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeString, NULL }, // bit map name
|
|
{ ParameterDescription::typeColor, NULL }, // foreground
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeString, NULL }, // direction
|
|
{ ParameterDescription::typeScalar, NULL }, // min
|
|
{ ParameterDescription::typeScalar, NULL }, // max
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BarGraphBitMapScalar::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeString); // image name
|
|
parameterList[4].CheckIt(ParameterDescription::typeColor); // foreground
|
|
parameterList[5].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[6].CheckIt(ParameterDescription::typeString); // direction
|
|
parameterList[7].CheckIt(ParameterDescription::typeScalar); // min
|
|
parameterList[8].CheckIt(ParameterDescription::typeScalar); // max
|
|
parameterList[9].CheckIt(ParameterDescription::typeAttribute);
|
|
# endif
|
|
|
|
Test_Tell("BarGraphBitMapScalar::Make\n");
|
|
|
|
int
|
|
direction = configureDirection[0].Search(
|
|
parameterList[6].data.string
|
|
);
|
|
|
|
if (direction < 0)
|
|
{
|
|
Test_Tell("BarGraphBitMapScalar::Make direction NOT FOUND\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
BarGraphBitMapScalar
|
|
*bar_graph =
|
|
# endif
|
|
new BarGraphBitMapScalar(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, // owner_ID*/
|
|
display_port_index, // graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.string, // BitMap name
|
|
parameterList[4].data.color, // int fg_color
|
|
parameterList[5].data.color, // int bg_color
|
|
(WipeGaugeScalar::Direction) direction,
|
|
parameterList[7].data.scalar, // Scalar min,
|
|
parameterList[8].data.scalar, // Scalar max,
|
|
(Scalar *) parameterList[9].data.attributePointer// Scalar *val_ptr
|
|
// HACK!!!! The (Scalar *) is VERY dangerous!
|
|
);
|
|
|
|
Register_Object(bar_graph);
|
|
//---------------------------------------------------------
|
|
// Make sure the image was properly placed in the warehouse
|
|
//---------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[3].data.string) == NULL)
|
|
{
|
|
Test_Tell("BarGraphBitMapScalar::Missing bitmap\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[3].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("BarGraphBitMapScalar::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BarGraphBitMapScalar::BarGraphBitMapScalar(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
const char *bitmap_name, //BitMap *bit_map,
|
|
int foreground_color, int background_color,
|
|
WipeGaugeScalar::Direction direction,
|
|
Scalar min,
|
|
Scalar max,
|
|
Scalar *value_pointer,
|
|
const char *identification_string
|
|
):
|
|
WipeGaugeScalar(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
left, bottom, right, top,
|
|
direction,
|
|
min,
|
|
max,
|
|
identification_string
|
|
)
|
|
{
|
|
//------------------------------------------------------------
|
|
// Save the bitmap name
|
|
//------------------------------------------------------------
|
|
bitMapName = nameCopy(bitmap_name);
|
|
//-------------------------------------------------------------
|
|
// Save colors
|
|
//-------------------------------------------------------------
|
|
backgroundColor = background_color;
|
|
foregroundColor = foreground_color;
|
|
//-------------------------------------------------------------
|
|
// Order the image from the warehouse (pre-load for future use)
|
|
//-------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
Check(renderer->warehousePointer);
|
|
Check_Pointer(bitMapName);
|
|
|
|
((L4Warehouse *)renderer->warehousePointer)->bitMapBin.Get(bitMapName);
|
|
# endif
|
|
//-----------------------------------------------------------
|
|
// Build connection to value
|
|
// (if NULL, it's assumed that a derived object built the
|
|
// connection for us)
|
|
//-----------------------------------------------------------
|
|
if (value_pointer != NULL)
|
|
{
|
|
GaugeConnection
|
|
*connection = new
|
|
GaugeConnectionDirectOf<Scalar>(0, ¤tValue, value_pointer);
|
|
Register_Object(connection);
|
|
AddConnection(connection);
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
BarGraphBitMapScalar::~BarGraphBitMapScalar()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Unlock preloaded art
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
Check(renderer->warehousePointer);
|
|
Check_Pointer(bitMapName);
|
|
((L4Warehouse *)renderer->warehousePointer)->
|
|
bitMapBin.Release(bitMapName);
|
|
# endif
|
|
//------------------------------------------------------------
|
|
// Delete the bitmap name
|
|
//------------------------------------------------------------
|
|
Unregister_Pointer(bitMapName);
|
|
delete[] bitMapName;
|
|
bitMapName = NULL;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
BarGraphBitMapScalar::TestInstance() const
|
|
{
|
|
return WipeGaugeScalar::TestInstance();
|
|
}
|
|
|
|
void
|
|
BarGraphBitMapScalar::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "BarGraphBitMapScalar:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
std::cout << temp << "bitMapName= " << bitMapName << "\n";
|
|
std::cout << temp << "backgroundColor=" << backgroundColor << "\n";
|
|
WipeGaugeScalar::ShowInstance(temp);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BarGraphBitMapScalar::DrawActive(
|
|
Rectangle2D *rectangle
|
|
)
|
|
{
|
|
//-----------------------------------------------------------
|
|
// Get and lock the image so that we may use it
|
|
//-----------------------------------------------------------
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
|
|
Check_Pointer(bitMapName);
|
|
BitMap
|
|
*bit_map = renderer->warehousePointer->bitMapBin.Get(bitMapName);
|
|
//-----------------------------------------------------------
|
|
// Draw the image
|
|
//-----------------------------------------------------------
|
|
if (bit_map != NULL)
|
|
{
|
|
Check(bit_map);
|
|
localView.SetColor(foregroundColor);
|
|
|
|
localView.MoveToAbsolute(
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y
|
|
);
|
|
|
|
localView.DrawBitMapOpaque(
|
|
backgroundColor,
|
|
0, // rotation
|
|
bit_map,
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y,
|
|
rectangle->topRight.x,
|
|
rectangle->topRight.y
|
|
);
|
|
}
|
|
//-----------------------------------------------------------
|
|
// Unlock the image: we're done
|
|
//-----------------------------------------------------------
|
|
Check(warehouse);
|
|
warehouse->bitMapBin.Release(bitMapName);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BarGraphBitMapScalar::DrawInactive(
|
|
Rectangle2D *rectangle
|
|
)
|
|
{
|
|
Check(this);
|
|
|
|
localView.SetColor(backgroundColor);
|
|
|
|
localView.MoveToAbsolute(
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y
|
|
);
|
|
|
|
localView.DrawFilledRectangleToAbsolute(
|
|
rectangle->topRight.x,
|
|
rectangle->topRight.y
|
|
);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// BarGraphPixelMapScalar
|
|
//###########################################################################
|
|
MethodDescription
|
|
BarGraphPixelMapScalar::methodDescription =
|
|
{
|
|
"pixelbar",
|
|
BarGraphPixelMapScalar::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeString, NULL }, // pixel map name
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeString, NULL }, // direction
|
|
{ ParameterDescription::typeScalar, NULL }, // min
|
|
{ ParameterDescription::typeScalar, NULL }, // max
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
BarGraphPixelMapScalar::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeString); // foreground
|
|
parameterList[4].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[5].CheckIt(ParameterDescription::typeString); // direction
|
|
parameterList[6].CheckIt(ParameterDescription::typeScalar); // min
|
|
parameterList[7].CheckIt(ParameterDescription::typeScalar); // max
|
|
parameterList[8].CheckIt(ParameterDescription::typeAttribute);
|
|
# endif
|
|
|
|
Test_Tell("BarGraphPixelMapScalar::Make\n");
|
|
|
|
int
|
|
direction = configureDirection[0].Search(
|
|
parameterList[5].data.string
|
|
);
|
|
|
|
if (direction < 0)
|
|
{
|
|
Test_Tell("BarGraphPixelMapScalar::Make direction NOT FOUND\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
BarGraphPixelMapScalar
|
|
*bar_graph =
|
|
# endif
|
|
new BarGraphPixelMapScalar(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, // owner_ID*/
|
|
display_port_index, // graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.string, // PixelMap name
|
|
parameterList[4].data.color, // int bg_color
|
|
(WipeGaugeScalar::Direction) direction,
|
|
parameterList[6].data.scalar, // Scalar min,
|
|
parameterList[7].data.scalar, // Scalar max,
|
|
(Scalar *) parameterList[8].data.attributePointer //Scalar *valptr
|
|
// HACK!!!! The (Scalar *) is VERY dangerous!
|
|
);
|
|
|
|
Register_Object(bar_graph);
|
|
//---------------------------------------------------------
|
|
// Make sure the image was properly placed in the warehouse
|
|
//---------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[3].data.string) == NULL)
|
|
{
|
|
Test_Tell("BarGraphPixelMapScalar::Missing pixelmap\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[3].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("BarGraphPixelMapScalar::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
BarGraphPixelMapScalar::BarGraphPixelMapScalar(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
const char *pixelmap_name, //PixelMap8 *pixel_map,
|
|
int background_color,
|
|
WipeGaugeScalar::Direction direction,
|
|
Scalar min,
|
|
Scalar max,
|
|
Scalar *value_pointer,
|
|
const char *identification_string
|
|
):
|
|
WipeGaugeScalar(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
left, bottom, right, top,
|
|
direction,
|
|
min,
|
|
max,
|
|
identification_string
|
|
)
|
|
{
|
|
//-------------------------------------------------------------
|
|
// Make local copy of map name
|
|
//-------------------------------------------------------------
|
|
Check_Pointer(pixelmap_name);
|
|
pixelMapName = nameCopy(pixelmap_name);
|
|
Check_Pointer(pixelMapName);
|
|
//-------------------------------------------------------------
|
|
// Save background color
|
|
//-------------------------------------------------------------
|
|
backgroundColor = background_color;
|
|
//-------------------------------------------------------------
|
|
// Order the image from the warehouse (pre-load for future use)
|
|
//-------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
Check(renderer->warehousePointer);
|
|
|
|
((L4Warehouse *) renderer->warehousePointer)->
|
|
pixelMap8Bin.Get(pixelMapName);
|
|
# endif
|
|
//-----------------------------------------------------------
|
|
// Build connection to value
|
|
// (if NULL, it's assumed that a derived object built the
|
|
// connection for us)
|
|
//-----------------------------------------------------------
|
|
//
|
|
if (value_pointer != NULL)
|
|
{
|
|
GaugeConnection
|
|
*connection = new
|
|
GaugeConnectionDirectOf<Scalar>(0, ¤tValue, value_pointer);
|
|
Register_Object(connection);
|
|
AddConnection(connection);
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
BarGraphPixelMapScalar::~BarGraphPixelMapScalar()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Unlock preloaded image
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
Check(renderer->warehousePointer);
|
|
Check_Pointer(pixelMapName);
|
|
|
|
((L4Warehouse *) renderer->warehousePointer)->
|
|
pixelMap8Bin.Get(pixelMapName);
|
|
# endif
|
|
//------------------------------------------------------------
|
|
// Delete the map name
|
|
//------------------------------------------------------------
|
|
Unregister_Pointer(pixelMapName);
|
|
delete[] pixelMapName;
|
|
pixelMapName = NULL;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
BarGraphPixelMapScalar::TestInstance() const
|
|
{
|
|
return WipeGaugeScalar::TestInstance();
|
|
}
|
|
|
|
void
|
|
BarGraphPixelMapScalar::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "BarGraphPixelMapScalar:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
std::cout << temp << "pixelMapName= " << pixelMapName << "\n";
|
|
std::cout << temp << "backgroundColor=" << backgroundColor << "\n";
|
|
WipeGaugeScalar::ShowInstance(temp);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BarGraphPixelMapScalar::DrawActive(
|
|
Rectangle2D *rectangle
|
|
)
|
|
{
|
|
//-----------------------------------------------------------
|
|
// Get and lock the image so that we may use it
|
|
//-----------------------------------------------------------
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
|
|
Check_Pointer(pixelMapName);
|
|
PixelMap8
|
|
*pixel_map = renderer->warehousePointer->pixelMap8Bin.Get(pixelMapName);
|
|
//-----------------------------------------------------------
|
|
// Draw the image
|
|
//-----------------------------------------------------------
|
|
if (pixel_map != NULL)
|
|
{
|
|
Check(pixel_map);
|
|
|
|
localView.MoveToAbsolute(
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y
|
|
);
|
|
|
|
localView.DrawPixelMap8(
|
|
False, // opaque,
|
|
0, // rotation
|
|
pixel_map,
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y,
|
|
rectangle->topRight.x,
|
|
rectangle->topRight.y
|
|
);
|
|
}
|
|
//-----------------------------------------------------------
|
|
// Unlock the image: we're done
|
|
//-----------------------------------------------------------
|
|
Check(warehouse);
|
|
warehouse->pixelMap8Bin.Release(pixelMapName);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
BarGraphPixelMapScalar::DrawInactive(
|
|
Rectangle2D *rectangle
|
|
)
|
|
{
|
|
//-----------------------------------------------------------
|
|
// Get and lock the image so that we may use it
|
|
//-----------------------------------------------------------
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
|
|
Check_Pointer(pixelMapName);
|
|
PixelMap8
|
|
*pixel_map = renderer->warehousePointer->pixelMap8Bin.Get(pixelMapName);
|
|
//-----------------------------------------------------------
|
|
// Draw the image
|
|
//-----------------------------------------------------------
|
|
if (pixel_map != NULL)
|
|
{
|
|
Check(pixel_map);
|
|
|
|
localView.SetColor(backgroundColor);
|
|
|
|
localView.MoveToAbsolute(
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y
|
|
);
|
|
|
|
localView.DrawPixelMap8SingleColor(
|
|
0, // rotation
|
|
pixel_map,
|
|
rectangle->bottomLeft.x,
|
|
rectangle->bottomLeft.y,
|
|
rectangle->topRight.x,
|
|
rectangle->topRight.y
|
|
);
|
|
}
|
|
//-----------------------------------------------------------
|
|
// Unlock the image: we're done
|
|
//-----------------------------------------------------------
|
|
Check(warehouse);
|
|
warehouse->pixelMap8Bin.Release(pixelMapName);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
//#######################################################################
|
|
// ColorState
|
|
//#######################################################################
|
|
MethodDescription
|
|
ColorState::methodDescription=
|
|
{
|
|
"colorState",
|
|
ColorState::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeString, NULL }, // bitmap name
|
|
{ ParameterDescription::typeColor, NULL }, // color 0
|
|
{ ParameterDescription::typeScalar, NULL }, // 0...a
|
|
{ ParameterDescription::typeColor, NULL }, // color 1
|
|
{ ParameterDescription::typeScalar, NULL }, // a...b
|
|
{ ParameterDescription::typeColor, NULL }, // color 2
|
|
{ ParameterDescription::typeScalar, NULL }, // b...c
|
|
{ ParameterDescription::typeColor, NULL }, // color 3
|
|
{ ParameterDescription::typeScalar, NULL }, // c...d
|
|
{ ParameterDescription::typeColor, NULL }, // color 4 (+)
|
|
{ ParameterDescription::typeInteger, NULL }, // zone #
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
ColorState::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeString); // bitmap name
|
|
parameterList[3].CheckIt(ParameterDescription::typeColor); // first color
|
|
parameterList[4].CheckIt(ParameterDescription::typeScalar); // first range
|
|
parameterList[5].CheckIt(ParameterDescription::typeColor); // second color
|
|
parameterList[6].CheckIt(ParameterDescription::typeScalar); // second range
|
|
parameterList[7].CheckIt(ParameterDescription::typeColor); // third color
|
|
parameterList[8].CheckIt(ParameterDescription::typeScalar); // third range
|
|
parameterList[9].CheckIt(ParameterDescription::typeColor); // fourth color
|
|
parameterList[10].CheckIt(ParameterDescription::typeScalar);// fourth range
|
|
parameterList[11].CheckIt(ParameterDescription::typeColor); // fifth color
|
|
parameterList[12].CheckIt(ParameterDescription::typeInteger); // zone #
|
|
parameterList[13].CheckIt(ParameterDescription::typeAttribute);
|
|
# endif
|
|
|
|
Test_Tell("ColorState::Make\n");
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
ColorState
|
|
*color_state =
|
|
# endif
|
|
new ColorState(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, // unsigned int owner_ID
|
|
display_port_index, // int graphics_port_number
|
|
position.x, position.y,
|
|
parameterList[2].data.string,
|
|
parameterList[3].data.color,
|
|
parameterList[4].data.scalar,
|
|
parameterList[5].data.color,
|
|
parameterList[6].data.scalar,
|
|
parameterList[7].data.color,
|
|
parameterList[8].data.scalar,
|
|
parameterList[9].data.color,
|
|
parameterList[10].data.scalar,
|
|
parameterList[11].data.color,
|
|
parameterList[12].data.integer,
|
|
(DamageZone ***) parameterList[13].data.attributePointer
|
|
// HACK!!!! The cast above is VERY dangerous!
|
|
);
|
|
|
|
Register_Object(color_state);
|
|
//---------------------------------------------------------
|
|
// Make sure the image was properly placed in the warehouse
|
|
//---------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[2].data.string) == NULL)
|
|
{
|
|
Test_Tell("ColorState::Missing pixelmap\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[2].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("ColorState::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
ColorState::ColorState(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom,
|
|
const char *bitmap_name,
|
|
int first_color,
|
|
Scalar first_bin,
|
|
int second_color,
|
|
Scalar second_bin,
|
|
int third_color,
|
|
Scalar third_bin,
|
|
int fourth_color,
|
|
Scalar fourth_bin,
|
|
int fifth_color,
|
|
int zone_number,
|
|
DamageZone ***value_pointer,
|
|
const char *identification_string
|
|
):
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Test_Tell("ColorState creator\n" << std::flush);
|
|
Check(renderer);
|
|
//------------------------------------------------------------
|
|
// Save the map name
|
|
//------------------------------------------------------------
|
|
bitMapName = nameCopy(bitmap_name);
|
|
//-------------------------------------------------------------
|
|
// Order the image from the warehouse (pre-load for future use)
|
|
//-------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
Check(renderer->warehousePointer);
|
|
Check_Pointer(bitMapName);
|
|
|
|
((L4Warehouse *)renderer->warehousePointer)->
|
|
bitMapBin.Get(bitMapName);
|
|
# endif
|
|
//-------------------------------------------------------------
|
|
// Initialize values
|
|
//-------------------------------------------------------------
|
|
localView.SetOrigin(left, bottom);
|
|
|
|
color[0] = first_color;
|
|
color[1] = second_color;
|
|
color[2] = third_color;
|
|
color[3] = fourth_color;
|
|
color[4] = fifth_color;
|
|
|
|
bin[0] = first_bin;
|
|
bin[1] = second_bin;
|
|
bin[2] = third_bin;
|
|
bin[3] = fourth_bin;
|
|
|
|
Test_Tell("value_pointer=" << value_pointer << "\n" << std::flush);
|
|
Check_Pointer(value_pointer);
|
|
DamageZone
|
|
**array_pointer = *value_pointer;
|
|
Test_Tell("array_pointer=" << array_pointer << "\n" << std::flush);
|
|
Check_Pointer(array_pointer);
|
|
|
|
Test_Tell("zone_number=" << zone_number << "\n" << std::flush);
|
|
damagePointer = array_pointer[zone_number];
|
|
Test_Tell("damagePointer=" << damagePointer << "\n" << std::flush);
|
|
Check(damagePointer);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
ColorState::~ColorState()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Unlock preloaded art
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
Check(renderer->warehousePointer);
|
|
Check_Pointer(bitMapName);
|
|
((L4Warehouse *)renderer->warehousePointer)->
|
|
bitMapBin.Release(bitMapName);
|
|
# endif
|
|
//------------------------------------------------------------
|
|
// Delete the map name
|
|
//------------------------------------------------------------
|
|
Unregister_Pointer(bitMapName);
|
|
delete[] bitMapName;
|
|
bitMapName = NULL;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
ColorState::TestInstance() const
|
|
{
|
|
return True;
|
|
}
|
|
|
|
void
|
|
ColorState::ShowInstance(char */*indent*/)
|
|
{
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
ColorState::BecameActive()
|
|
{
|
|
Check(this);
|
|
|
|
previousState = -1;
|
|
}
|
|
|
|
void
|
|
ColorState::Execute()
|
|
{
|
|
Check(this);
|
|
|
|
//-----------------------------------------------------------
|
|
// Get and lock the image so that we may use it
|
|
//-----------------------------------------------------------
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
|
|
Check_Pointer(bitMapName);
|
|
BitMap
|
|
*bit_map = renderer->warehousePointer->bitMapBin.Get(bitMapName);
|
|
//-----------------------------------------------------------
|
|
// Draw the image
|
|
//-----------------------------------------------------------
|
|
if (bit_map != NULL)
|
|
{
|
|
Check(bit_map);
|
|
Check(damagePointer);
|
|
Scalar
|
|
value(damagePointer->damageLevel);
|
|
int
|
|
i;
|
|
//----------------------------------------
|
|
// Find current bin
|
|
//----------------------------------------
|
|
for(i=0; i<4; ++i)
|
|
{
|
|
if (value < bin[i])
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
//----------------------------------------
|
|
// If different, draw it
|
|
//----------------------------------------
|
|
if (i != previousState)
|
|
{
|
|
previousState = i;
|
|
|
|
localView.SetColor(color[i]);
|
|
localView.DrawBitMap(0, bit_map);
|
|
}
|
|
}
|
|
//-----------------------------------------------------------
|
|
// Unlock the image: we're done
|
|
//-----------------------------------------------------------
|
|
Check(warehouse);
|
|
warehouse->bitMapBin.Release(bitMapName);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
//#######################################################################
|
|
// TwoState
|
|
//#######################################################################
|
|
MethodDescription
|
|
TwoState::methodDescription=
|
|
{
|
|
"twoState",
|
|
TwoState::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeString, NULL }, // bitmap name
|
|
{ ParameterDescription::typeColor, NULL }, // color 0
|
|
{ ParameterDescription::typeColor, NULL }, // color 1
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
TwoState::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeString); // bitmap name
|
|
parameterList[3].CheckIt(ParameterDescription::typeColor); // first color
|
|
parameterList[4].CheckIt(ParameterDescription::typeColor); // second color
|
|
parameterList[5].CheckIt(ParameterDescription::typeAttribute);
|
|
# endif
|
|
|
|
Test_Tell("TwoState::Make\n");
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
TwoState
|
|
*two_state =
|
|
# endif
|
|
new TwoState(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
parameterList[2].data.string, //bitmap name
|
|
parameterList[3].data.color,
|
|
parameterList[4].data.color,
|
|
(int *) parameterList[5].data.attributePointer
|
|
// HACK!!!! The cast above is VERY dangerous!
|
|
);
|
|
|
|
Register_Object(two_state);
|
|
//---------------------------------------------------------
|
|
// Make sure the image was properly placed in the warehouse
|
|
//---------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[2].data.string) == NULL)
|
|
{
|
|
Test_Tell("TwoState::Missing bitmap\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[2].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("TwoState::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
TwoState::TwoState(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom,
|
|
const char *bitmap_name,
|
|
int first_color,
|
|
int second_color,
|
|
int *value_pointer,
|
|
const char *identification_string
|
|
):
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Test_Tell("TwoState creator\n" << std::flush);
|
|
Check_Pointer(this);
|
|
|
|
//------------------------------------------------------------
|
|
// Save the bitmap name
|
|
//------------------------------------------------------------
|
|
bitMapName = nameCopy(bitmap_name);
|
|
//-------------------------------------------------------------
|
|
// Order the image from the warehouse (pre-load for future use)
|
|
//-------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
Check(renderer->warehousePointer);
|
|
Check_Pointer(bitMapName);
|
|
|
|
((L4Warehouse *)renderer->warehousePointer)->
|
|
bitMapBin.Get(bitMapName);
|
|
# endif
|
|
//-----------------------------------------------------------
|
|
// Initialize values
|
|
//-----------------------------------------------------------
|
|
localView.SetOrigin(left, bottom);
|
|
|
|
color[0] = first_color;
|
|
color[1] = second_color;
|
|
//-----------------------------------------------------------
|
|
// Build connection to value
|
|
//-----------------------------------------------------------
|
|
GaugeConnection
|
|
*connection;
|
|
|
|
connection = new
|
|
GaugeConnectionDirectOf<int>(0, ¤tValue, value_pointer);
|
|
Register_Object(connection);
|
|
AddConnection(connection);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
TwoState::~TwoState()
|
|
{
|
|
Check(this);
|
|
//------------------------------------------------------------
|
|
// Unlock preloaded art
|
|
//------------------------------------------------------------
|
|
# if defined(PRELOAD_ART)
|
|
Check(renderer);
|
|
Check(renderer->warehousePointer);
|
|
Check_Pointer(bitMapName);
|
|
((L4Warehouse *)renderer->warehousePointer)->
|
|
bitMapBin.Release(bitMapName);
|
|
# endif
|
|
//------------------------------------------------------------
|
|
// Delete the bitmap name
|
|
//------------------------------------------------------------
|
|
Unregister_Pointer(bitMapName);
|
|
delete[] bitMapName;
|
|
bitMapName = NULL;
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
TwoState::TestInstance() const
|
|
{
|
|
return True;
|
|
}
|
|
|
|
void
|
|
TwoState::ShowInstance(char */*indent*/)
|
|
{
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
TwoState::BecameActive()
|
|
{
|
|
Check(this);
|
|
previousState = -1;
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
TwoState::Execute()
|
|
{
|
|
Check(this);
|
|
//-----------------------------------------------------------
|
|
// Get and lock the image so that we may use it
|
|
//-----------------------------------------------------------
|
|
Check(renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) renderer->warehousePointer;
|
|
|
|
Check_Pointer(bitMapName);
|
|
BitMap
|
|
*bit_map = renderer->warehousePointer->bitMapBin.Get(bitMapName);
|
|
//-----------------------------------------------------------
|
|
// Draw the image
|
|
//-----------------------------------------------------------
|
|
if (bit_map != NULL)
|
|
{
|
|
Check(bit_map);
|
|
|
|
int
|
|
new_value;
|
|
|
|
if (currentValue > 0)
|
|
{
|
|
new_value = 1;
|
|
}
|
|
else
|
|
{
|
|
new_value = 0;
|
|
}
|
|
|
|
if (new_value != previousState)
|
|
{
|
|
previousState = new_value;
|
|
|
|
localView.SetColor(color[new_value]);
|
|
localView.DrawBitMap(0, bit_map);
|
|
}
|
|
}
|
|
//-----------------------------------------------------------
|
|
// Unlock the image: we're done
|
|
//-----------------------------------------------------------
|
|
Check(warehouse);
|
|
warehouse->bitMapBin.Release(bitMapName);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
//###########################################################################
|
|
// NumericDisplayScalarTwoState
|
|
//###########################################################################
|
|
MethodDescription
|
|
NumericDisplayScalarTwoState ::methodDescription =
|
|
{
|
|
"numericIntegerTwoState",
|
|
NumericDisplayScalarTwoState::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeVector, NULL }, // size
|
|
{ ParameterDescription::typeString, NULL }, // font name
|
|
{ ParameterDescription::typeInteger, NULL }, // # of digits
|
|
{ ParameterDescription::typeString, NULL }, // format
|
|
{ ParameterDescription::typeColor, NULL }, // background
|
|
{ ParameterDescription::typeColor, NULL }, // foreground
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute for number
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute for logical
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
NumericDisplayScalarTwoState::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeVector); // size
|
|
parameterList[3].CheckIt(ParameterDescription::typeString); // font
|
|
parameterList[4].CheckIt(ParameterDescription::typeInteger); // # of digs
|
|
parameterList[5].CheckIt(ParameterDescription::typeString); // format
|
|
parameterList[6].CheckIt(ParameterDescription::typeColor); // background
|
|
parameterList[7].CheckIt(ParameterDescription::typeColor); // foreground
|
|
parameterList[8].CheckIt(ParameterDescription::typeAttribute); // value name
|
|
parameterList[9].CheckIt(ParameterDescription::typeAttribute); // second value name
|
|
# endif
|
|
|
|
Test_Tell("NumericDisplayScalarTwoState::Make\n");
|
|
|
|
int
|
|
number_format = configureFormat[0].Search(
|
|
parameterList[5].data.string
|
|
);
|
|
|
|
if (number_format < 0)
|
|
{
|
|
Test_Tell("NumericDisplayScalarTwoState::Make format NOT FOUND\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
NumericDisplayScalarTwoState
|
|
*numeric_display =
|
|
# endif
|
|
new NumericDisplayScalarTwoState(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, //unsigned int owner_ID
|
|
display_port_index, //int graphics_port_number
|
|
position.x, position.y,
|
|
position.x + parameterList[2].data.vector.x,
|
|
position.y + parameterList[2].data.vector.y,
|
|
parameterList[3].data.string, //font name
|
|
parameterList[4].data.integer, //int number_of_chars
|
|
(NumericDisplay::NumericFormat) number_format,
|
|
parameterList[6].data.integer, //int background_color
|
|
parameterList[7].data.integer, //int foreground_color
|
|
(Scalar *) parameterList[8].data.attributePointer,
|
|
(int *) parameterList[9].data.attributePointer // second (logical) value
|
|
// HACK!!!! The (Scalar *) is VERY dangerous!
|
|
// HACK!!!! The (int *) is VERY dangerous!
|
|
);
|
|
Register_Object(numeric_display);
|
|
|
|
//--------------------------------------------------------
|
|
// Make sure the font was properly placed in the warehouse
|
|
//--------------------------------------------------------
|
|
Check(gauge_renderer);
|
|
L4Warehouse
|
|
*warehouse = (L4Warehouse *) gauge_renderer->warehousePointer;
|
|
Check(warehouse);
|
|
|
|
if (warehouse->bitMapBin.Get(parameterList[3].data.string) == NULL)
|
|
{
|
|
Test_Tell("NumericDisplayScalarTwoState::Missing font\n");
|
|
Check_Fpu();
|
|
return False;
|
|
}
|
|
else
|
|
{
|
|
warehouse->bitMapBin.Release(parameterList[3].data.string);
|
|
}
|
|
//--------------------------------------------------------
|
|
// Everything's ok
|
|
//--------------------------------------------------------
|
|
Test_Tell("NumericDisplayScalarTwoState::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
NumericDisplayScalarTwoState::NumericDisplayScalarTwoState(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int left, int bottom, int right, int top,
|
|
const char *font_name,
|
|
int number_of_digits,
|
|
NumericDisplay::NumericFormat requested_format,
|
|
int background_color, int foreground_color,
|
|
Scalar *value_pointer,
|
|
int *logical_pointer,
|
|
const char *identification_string
|
|
):
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Check_Pointer(this);
|
|
// graphics_port may be NULL!
|
|
Check_Pointer(value_pointer);
|
|
Check(renderer);
|
|
//-----------------------------------------------------------
|
|
// Set internal values
|
|
//-----------------------------------------------------------
|
|
numericDisplay = new NumericDisplay(
|
|
(L4Warehouse *) renderer->warehousePointer,
|
|
0,0,
|
|
font_name,
|
|
number_of_digits,
|
|
requested_format,
|
|
background_color,
|
|
foreground_color
|
|
);
|
|
Register_Object(numericDisplay);
|
|
|
|
localView.SetPositionWithinPort(left, bottom, right, top);
|
|
|
|
color[0] = background_color;
|
|
color[1] = foreground_color;
|
|
//-----------------------------------------------------------
|
|
// Build connection to value
|
|
//-----------------------------------------------------------
|
|
GaugeConnection
|
|
*value_connection;
|
|
|
|
GaugeConnection
|
|
*logical_connection;
|
|
|
|
value_connection = new
|
|
GaugeConnectionDirectOf<Scalar>(0, ¤tValue, value_pointer);
|
|
Register_Object(value_connection);
|
|
AddConnection(value_connection);
|
|
|
|
|
|
logical_connection = new
|
|
GaugeConnectionDirectOf<int>(0, ¤tLogical, logical_pointer);
|
|
Register_Object(logical_connection);
|
|
AddConnection(logical_connection);
|
|
|
|
previousValue = currentValue;
|
|
Check_Fpu();
|
|
}
|
|
|
|
NumericDisplayScalarTwoState::~NumericDisplayScalarTwoState()
|
|
{
|
|
Check(this);
|
|
|
|
if (numericDisplay != NULL)
|
|
{
|
|
Unregister_Object(numericDisplay);
|
|
delete numericDisplay;
|
|
numericDisplay = NULL;
|
|
}
|
|
|
|
// base class deletes all connections in Gauge::~Gauge
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
NumericDisplayScalarTwoState::TestInstance() const
|
|
{
|
|
return GraphicGauge::TestInstance();
|
|
}
|
|
|
|
void
|
|
NumericDisplayScalarTwoState::ShowInstance(char *indent)
|
|
{
|
|
Check(this);
|
|
|
|
std::cout << indent << "NumericDisplayScalarTwoState:\n";
|
|
|
|
char
|
|
temp[80];
|
|
|
|
Str_Copy(temp,indent, 80);
|
|
Str_Cat(temp,"...", 80);
|
|
|
|
GraphicGauge::ShowInstance(temp);
|
|
Check(numericDisplay);
|
|
numericDisplay->ShowInstance(temp);
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
NumericDisplayScalarTwoState::BecameActive()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplay);
|
|
previousState = -1;
|
|
numericDisplay->ForceUpdate();
|
|
Check_Fpu();
|
|
}
|
|
|
|
#if 0
|
|
void
|
|
NumericDisplayScalarTwoState::SetColors(int bg_color, int fg_color)
|
|
{
|
|
Check(this);
|
|
numericDisplay->SetColors(bg_color, fg_color);
|
|
Check_Fpu();
|
|
}
|
|
#endif
|
|
|
|
void
|
|
NumericDisplayScalarTwoState::Execute()
|
|
{
|
|
Check(this);
|
|
Check(numericDisplay);
|
|
|
|
int new_logical;
|
|
if (currentLogical > 0)
|
|
{
|
|
new_logical = 1;
|
|
}
|
|
else
|
|
{
|
|
new_logical = 0;
|
|
}
|
|
|
|
// Draw if state has changed. NumericDisplay only redraws if value has changed
|
|
if (new_logical != previousState || currentValue != previousValue)
|
|
{
|
|
previousState = new_logical;
|
|
previousValue = currentValue;
|
|
if (currentLogical > 0)
|
|
{
|
|
numericDisplay->Draw(&localView,currentValue);
|
|
}
|
|
else
|
|
{
|
|
numericDisplay->Erase(&localView);
|
|
}
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
|
|
|
|
//#######################################################################
|
|
// SegmentArc
|
|
//#######################################################################
|
|
SegmentArc::SegmentArc(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int center_x, int center_y,
|
|
Scalar inner0, Scalar outer0,
|
|
Scalar inner1, Scalar outer1,
|
|
Scalar deg0, Scalar deg1,
|
|
int number_of_segs_and_direction,
|
|
int background_color,
|
|
int foreground_color,
|
|
Logical use_thick_lines,
|
|
const char *identification_string
|
|
) :
|
|
GraphicGauge(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
identification_string
|
|
)
|
|
{
|
|
Test_Tell("SegmentArc creator\n" << std::flush);
|
|
Check_Pointer(this);
|
|
|
|
|
|
backgroundColor = background_color;
|
|
foregroundColor = foreground_color;
|
|
numberOfSegments = number_of_segs_and_direction;
|
|
startAngle = deg0*(2.0*M_PI)/360;
|
|
innerRadius = inner0;
|
|
outerRadius = outer0;
|
|
useThickLines = use_thick_lines;
|
|
|
|
if (numberOfSegments < 0)
|
|
{
|
|
numberOfSegments = - numberOfSegments;
|
|
}
|
|
Verify(numberOfSegments > 0);
|
|
|
|
Scalar
|
|
total_angle = (deg1*(2.0*M_PI)/360) - startAngle;
|
|
|
|
if (number_of_segs_and_direction > 0)
|
|
{
|
|
if (total_angle < 0.0)
|
|
{
|
|
total_angle += (2.0*M_PI);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (total_angle > 0.0)
|
|
{
|
|
total_angle -= (2.0*M_PI);
|
|
}
|
|
}
|
|
deltaAngle = (total_angle)/numberOfSegments;
|
|
deltaInnerRadius = (inner1 - inner0)/numberOfSegments;
|
|
deltaOuterRadius = (outer1 - outer0)/numberOfSegments;
|
|
|
|
localView.SetOrigin(center_x, center_y);
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
SegmentArc::~SegmentArc()
|
|
{
|
|
|
|
// base class deletes all connections in Gauge::~Gauge
|
|
Check_Fpu();
|
|
}
|
|
|
|
Logical
|
|
SegmentArc::TestInstance() const
|
|
{
|
|
return True;
|
|
}
|
|
|
|
void
|
|
SegmentArc::ShowInstance(char */*indent*/)
|
|
{
|
|
|
|
std::cout << "SegmentArc\n";
|
|
std::cout << " backgroundColor = " << backgroundColor << "\n";
|
|
std::cout << " foregroundColor = " << foregroundColor << "\n";
|
|
std::cout << " numberOfSegments = " << numberOfSegments << "\n";
|
|
std::cout << " startAngle = " << startAngle << "\n";
|
|
std::cout << " deltaAngle = " << deltaAngle << "\n";
|
|
std::cout << " deltaInnerRadius = " << deltaInnerRadius << "\n";
|
|
std::cout << " deltaOuterRadius = " << deltaOuterRadius << "\n";
|
|
std::cout << " previousSegment = " << previousSegment << "\n";
|
|
Check_Fpu();
|
|
}
|
|
|
|
void
|
|
SegmentArc::BecameActive()
|
|
{
|
|
Check(this);
|
|
|
|
previousSegment = 0;
|
|
}
|
|
|
|
void
|
|
SegmentArc::Execute()
|
|
{
|
|
Check(this);
|
|
|
|
if (currentValue < (Scalar) 0)
|
|
{
|
|
currentValue = (Scalar) 0;
|
|
}
|
|
else if (currentValue > (Scalar) 1)
|
|
{
|
|
currentValue = (Scalar) 1;
|
|
}
|
|
|
|
Verify(numberOfSegments > 0);
|
|
|
|
int
|
|
i,
|
|
new_segment = (int) (currentValue * numberOfSegments + .5);
|
|
Scalar
|
|
inner_radius,
|
|
delta_inner,
|
|
outer_radius,
|
|
delta_outer,
|
|
segment_angle,
|
|
delta_angle,
|
|
segment_sin,
|
|
segment_cos;
|
|
|
|
if (new_segment != previousSegment)
|
|
{
|
|
if (new_segment > previousSegment)
|
|
{
|
|
localView.SetColor(foregroundColor);
|
|
|
|
i = new_segment - previousSegment; // how many segments
|
|
|
|
inner_radius = innerRadius + (previousSegment * deltaInnerRadius);
|
|
outer_radius = outerRadius + (previousSegment * deltaOuterRadius);
|
|
segment_angle = startAngle + (previousSegment * deltaAngle);
|
|
}
|
|
else
|
|
{
|
|
localView.SetColor(backgroundColor);
|
|
|
|
i = previousSegment - new_segment; // how many segments
|
|
|
|
inner_radius = innerRadius + (new_segment * deltaInnerRadius);
|
|
outer_radius = outerRadius + (new_segment * deltaOuterRadius);
|
|
segment_angle = startAngle + (new_segment * deltaAngle);
|
|
}
|
|
|
|
delta_outer = deltaOuterRadius;
|
|
delta_inner = deltaInnerRadius;
|
|
delta_angle = deltaAngle;
|
|
|
|
for(; i>=0; --i)
|
|
{
|
|
segment_sin = sin(segment_angle);
|
|
segment_cos = cos(segment_angle);
|
|
|
|
localView.MoveToAbsolute(
|
|
(int)(segment_sin*inner_radius + .5),
|
|
(int)(segment_cos*inner_radius + .5)
|
|
);
|
|
|
|
if (useThickLines)
|
|
{
|
|
localView.DrawThickLineToAbsolute(
|
|
(int)(segment_sin*outer_radius + .5),
|
|
(int)(segment_cos*outer_radius + .5)
|
|
);
|
|
}
|
|
else
|
|
{
|
|
localView.DrawLineToAbsolute(
|
|
(int)(segment_sin*outer_radius + .5),
|
|
(int)(segment_cos*outer_radius + .5)
|
|
);
|
|
}
|
|
|
|
inner_radius += delta_inner;
|
|
outer_radius += delta_outer;
|
|
segment_angle += delta_angle;
|
|
}
|
|
|
|
previousSegment = new_segment;
|
|
}
|
|
Check_Fpu();
|
|
}
|
|
|
|
//#######################################################################
|
|
// SegmentArcNormalized
|
|
//#######################################################################
|
|
MethodDescription
|
|
SegmentArcNormalized::methodDescription =
|
|
{
|
|
"segmentArc",
|
|
SegmentArcNormalized::Make,
|
|
{
|
|
{ ParameterDescription::typeRate, NULL }, // rate ID
|
|
{ ParameterDescription::typeModeMask, NULL }, // mode mask
|
|
{ ParameterDescription::typeScalar, NULL }, // inner 0
|
|
{ ParameterDescription::typeScalar, NULL }, // outer 0
|
|
{ ParameterDescription::typeScalar, NULL }, // inner 1
|
|
{ ParameterDescription::typeScalar, NULL }, // outer 1
|
|
{ ParameterDescription::typeScalar, NULL }, // deg 0
|
|
{ ParameterDescription::typeScalar, NULL }, // deg 1
|
|
{ ParameterDescription::typeInteger, NULL }, // segs
|
|
{ ParameterDescription::typeColor, NULL }, // fg
|
|
{ ParameterDescription::typeColor, NULL }, // bg
|
|
{ ParameterDescription::typeAttribute, NULL }, // attribute
|
|
PARAMETER_DESCRIPTION_END
|
|
}
|
|
};
|
|
|
|
Logical
|
|
SegmentArcNormalized::Make(
|
|
int display_port_index,
|
|
Vector2DOf<int> position,
|
|
Entity */*entity*/,
|
|
GaugeRenderer * gauge_renderer
|
|
)
|
|
{
|
|
ParameterDescription
|
|
*parameterList = methodDescription.parameterList;
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
parameterList[0].CheckIt(ParameterDescription::typeRate); // rate ID
|
|
parameterList[1].CheckIt(ParameterDescription::typeModeMask); // mode mask
|
|
parameterList[2].CheckIt(ParameterDescription::typeScalar); // inner0
|
|
parameterList[3].CheckIt(ParameterDescription::typeScalar); // outer0
|
|
parameterList[4].CheckIt(ParameterDescription::typeScalar); // inner1
|
|
parameterList[5].CheckIt(ParameterDescription::typeScalar); // outer1
|
|
parameterList[6].CheckIt(ParameterDescription::typeScalar); // deg0
|
|
parameterList[7].CheckIt(ParameterDescription::typeScalar); // deg1
|
|
parameterList[8].CheckIt(ParameterDescription::typeInteger); // segs&dir
|
|
parameterList[9].CheckIt(ParameterDescription::typeColor); // bg color
|
|
parameterList[10].CheckIt(ParameterDescription::typeColor); // fg color
|
|
parameterList[11].CheckIt(ParameterDescription::typeAttribute);
|
|
# endif
|
|
|
|
Test_Tell("SegmentArcNormalized::Make\n");
|
|
|
|
# if DEBUG_LEVEL > 0
|
|
SegmentArcNormalized
|
|
*arc =
|
|
# endif
|
|
new SegmentArcNormalized(
|
|
parameterList[0].data.rate,
|
|
parameterList[1].data.modeMask,
|
|
(L4GaugeRenderer *) gauge_renderer,
|
|
0, // unsigned int owner_ID
|
|
display_port_index, // int graphics_port_number
|
|
position.x, position.y,
|
|
parameterList[2].data.scalar, // inner0
|
|
parameterList[3].data.scalar, // outer0
|
|
parameterList[4].data.scalar, // inner1
|
|
parameterList[5].data.scalar, // outer1
|
|
parameterList[6].data.scalar, // deg0
|
|
parameterList[7].data.scalar, // deg1
|
|
parameterList[8].data.integer, // segs & dir
|
|
parameterList[9].data.color, // bg
|
|
parameterList[10].data.color, // fg
|
|
(Scalar *) parameterList[11].data.attributePointer,
|
|
True // use thick lines
|
|
|
|
// HACK - cast is VERY DANGEROUS!
|
|
);
|
|
|
|
Register_Object(arc);
|
|
|
|
Test_Tell("SegmentArcNormalized::Make OK\n");
|
|
Check_Fpu();
|
|
return True;
|
|
}
|
|
|
|
SegmentArcNormalized::SegmentArcNormalized(
|
|
GaugeRate rate,
|
|
ModeMask mode_mask,
|
|
L4GaugeRenderer *renderer,
|
|
unsigned int owner_ID,
|
|
int graphics_port_number,
|
|
int center_x, int center_y,
|
|
Scalar inner0, Scalar outer0,
|
|
Scalar inner1, Scalar outer1,
|
|
Scalar deg0, Scalar deg1,
|
|
int number_of_segs_and_direction,
|
|
int background_color,
|
|
int foreground_color,
|
|
Scalar *value_pointer,
|
|
Logical use_thick_lines,
|
|
const char *identification_string
|
|
) :
|
|
SegmentArc(
|
|
rate,
|
|
mode_mask,
|
|
renderer,
|
|
owner_ID,
|
|
graphics_port_number,
|
|
center_x, center_y,
|
|
inner0, outer0,
|
|
inner1, outer1,
|
|
deg0, deg1,
|
|
number_of_segs_and_direction,
|
|
background_color,
|
|
foreground_color,
|
|
use_thick_lines,
|
|
identification_string
|
|
)
|
|
{
|
|
Test_Tell("SegmentArcNormalized creator\n" << std::flush);
|
|
Check_Pointer(this);
|
|
|
|
//-----------------------------------------------------------
|
|
// Build connection to value
|
|
//-----------------------------------------------------------
|
|
GaugeConnection
|
|
*connection;
|
|
|
|
connection = new
|
|
GaugeConnectionDirectOf<Scalar>(0, ¤tValue, value_pointer);
|
|
Check(connection);
|
|
Register_Object(connection);
|
|
|
|
AddConnection(connection);
|
|
|
|
Check_Fpu();
|
|
}
|