can now set the font used for a menu
set default font using glutSetOption(GLUT_MENU_FONT,...) and set font of current menu using glutSetMenuFont() git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1582 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
parent
58a343f2e3
commit
75dcd74677
@ -88,6 +88,8 @@
|
|||||||
|
|
||||||
#define GLUT_GEOMETRY_VISUALIZE_NORMALS 0x0205
|
#define GLUT_GEOMETRY_VISUALIZE_NORMALS 0x0205
|
||||||
|
|
||||||
|
#define GLUT_MENU_FONT 0x0206 /* TOOD: now glutSetOption only */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* New tokens for glutInitDisplayMode.
|
* New tokens for glutInitDisplayMode.
|
||||||
* Only one GLUT_AUXn bit may be used at a time.
|
* Only one GLUT_AUXn bit may be used at a time.
|
||||||
@ -135,6 +137,11 @@ FGAPI void FGAPIENTRY glutExit ( void );
|
|||||||
FGAPI void FGAPIENTRY glutFullScreenToggle( void );
|
FGAPI void FGAPIENTRY glutFullScreenToggle( void );
|
||||||
FGAPI void FGAPIENTRY glutLeaveFullScreen( void );
|
FGAPI void FGAPIENTRY glutLeaveFullScreen( void );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Menu functions
|
||||||
|
*/
|
||||||
|
FGAPI void FGAPIENTRY glutSetMenuFont( void* font );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Window-specific callback functions, see freeglut_callbacks.c
|
* Window-specific callback functions, see freeglut_callbacks.c
|
||||||
*/
|
*/
|
||||||
|
@ -640,6 +640,8 @@ main(int argc, char *argv[])
|
|||||||
* what we demonstrate here.
|
* what we demonstrate here.
|
||||||
*/
|
*/
|
||||||
glutSetKeyRepeat(GLUT_KEY_REPEAT_ON);
|
glutSetKeyRepeat(GLUT_KEY_REPEAT_ON);
|
||||||
|
/* global setting: default font for any menus created after this call (we call it again below to demo) */
|
||||||
|
glutSetOption(GLUT_MENU_FONT,(int)GLUT_BITMAP_HELVETICA_12);
|
||||||
|
|
||||||
/* Set other global callback (global as in not associated with any specific menu or window) */
|
/* Set other global callback (global as in not associated with any specific menu or window) */
|
||||||
glutIdleFunc ( Idle );
|
glutIdleFunc ( Idle );
|
||||||
@ -664,6 +666,9 @@ main(int argc, char *argv[])
|
|||||||
glutAddMenuEntry( "Sub menu A3 (03)", 13 );
|
glutAddMenuEntry( "Sub menu A3 (03)", 13 );
|
||||||
glutMenuDestroyFunc ( MenuDestroy ); /* callback specific to this menu */
|
glutMenuDestroyFunc ( MenuDestroy ); /* callback specific to this menu */
|
||||||
|
|
||||||
|
/* change font for any menus created after this call */
|
||||||
|
glutSetOption(GLUT_MENU_FONT,(int)GLUT_BITMAP_8_BY_13);
|
||||||
|
|
||||||
subMenuB = glutCreateMenu( MenuCallback );
|
subMenuB = glutCreateMenu( MenuCallback );
|
||||||
glutAddMenuEntry( "Sub menu B1 (04)", 14 );
|
glutAddMenuEntry( "Sub menu B1 (04)", 14 );
|
||||||
glutAddMenuEntry( "Sub menu B2 (05)", 15 );
|
glutAddMenuEntry( "Sub menu B2 (05)", 15 );
|
||||||
@ -682,6 +687,8 @@ main(int argc, char *argv[])
|
|||||||
glutMenuDestroyFunc ( MenuDestroy ); /* callback specific to this menu */
|
glutMenuDestroyFunc ( MenuDestroy ); /* callback specific to this menu */
|
||||||
|
|
||||||
glutAttachMenu( GLUT_LEFT_BUTTON );
|
glutAttachMenu( GLUT_LEFT_BUTTON );
|
||||||
|
/* You can also change the font of the current menu: */
|
||||||
|
glutSetMenuFont(GLUT_BITMAP_TIMES_ROMAN_10);
|
||||||
|
|
||||||
|
|
||||||
/* Position second window right next to the first */
|
/* Position second window right next to the first */
|
||||||
|
@ -172,6 +172,7 @@ static GLUTproc fghGetGLUTProcAddress( const char* procName )
|
|||||||
CHECK_NAME(glutMenuDestroyFunc);
|
CHECK_NAME(glutMenuDestroyFunc);
|
||||||
CHECK_NAME(glutFullScreenToggle);
|
CHECK_NAME(glutFullScreenToggle);
|
||||||
CHECK_NAME(glutLeaveFullScreen);
|
CHECK_NAME(glutLeaveFullScreen);
|
||||||
|
CHECK_NAME(glutSetMenuFont);
|
||||||
CHECK_NAME(glutSetOption);
|
CHECK_NAME(glutSetOption);
|
||||||
CHECK_NAME(glutGetModeValues);
|
CHECK_NAME(glutGetModeValues);
|
||||||
CHECK_NAME(glutSetWindowData);
|
CHECK_NAME(glutSetWindowData);
|
||||||
|
@ -56,7 +56,7 @@ extern SFG_StrokeFont fgStrokeMonoRoman;
|
|||||||
* Matches a font ID with a SFG_Font structure pointer.
|
* Matches a font ID with a SFG_Font structure pointer.
|
||||||
* This was changed to match the GLUT header style.
|
* This was changed to match the GLUT header style.
|
||||||
*/
|
*/
|
||||||
static SFG_Font* fghFontByID( void* font )
|
SFG_Font* fghFontByID( void* font )
|
||||||
{
|
{
|
||||||
if( font == GLUT_BITMAP_8_BY_13 )
|
if( font == GLUT_BITMAP_8_BY_13 )
|
||||||
return &fgFontFixed8x13;
|
return &fgFontFixed8x13;
|
||||||
@ -73,7 +73,6 @@ static SFG_Font* fghFontByID( void* font )
|
|||||||
if( font == GLUT_BITMAP_TIMES_ROMAN_24 )
|
if( font == GLUT_BITMAP_TIMES_ROMAN_24 )
|
||||||
return &fgFontTimesRoman24;
|
return &fgFontTimesRoman24;
|
||||||
|
|
||||||
fgWarning( "font 0x%08x not found", font );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +87,6 @@ static SFG_StrokeFont* fghStrokeByID( void* font )
|
|||||||
if( font == GLUT_STROKE_MONO_ROMAN )
|
if( font == GLUT_STROKE_MONO_ROMAN )
|
||||||
return &fgStrokeMonoRoman;
|
return &fgStrokeMonoRoman;
|
||||||
|
|
||||||
fgWarning( "stroke font 0x%08x not found", font );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,8 +102,12 @@ void FGAPIENTRY glutBitmapCharacter( void* fontID, int character )
|
|||||||
SFG_Font* font;
|
SFG_Font* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapCharacter" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapCharacter" );
|
||||||
font = fghFontByID( fontID );
|
font = fghFontByID( fontID );
|
||||||
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutBitmapCharacter: bitmap font 0x%08x not found. Make sure you're not passing a stroke font.\n",fontID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
freeglut_return_if_fail( ( character >= 1 )&&( character < 256 ) );
|
freeglut_return_if_fail( ( character >= 1 )&&( character < 256 ) );
|
||||||
freeglut_return_if_fail( font );
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find the character we want to draw (???)
|
* Find the character we want to draw (???)
|
||||||
@ -135,7 +137,11 @@ void FGAPIENTRY glutBitmapString( void* fontID, const unsigned char *string )
|
|||||||
SFG_Font* font;
|
SFG_Font* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapString" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapString" );
|
||||||
font = fghFontByID( fontID );
|
font = fghFontByID( fontID );
|
||||||
freeglut_return_if_fail( font );
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutBitmapString: bitmap font 0x%08x not found. Make sure you're not passing a stroke font.\n",fontID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if ( !string || ! *string )
|
if ( !string || ! *string )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -182,9 +188,13 @@ int FGAPIENTRY glutBitmapWidth( void* fontID, int character )
|
|||||||
{
|
{
|
||||||
SFG_Font* font;
|
SFG_Font* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapWidth" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapWidth" );
|
||||||
font = fghFontByID( fontID );
|
|
||||||
freeglut_return_val_if_fail( character > 0 && character < 256, 0 );
|
freeglut_return_val_if_fail( character > 0 && character < 256, 0 );
|
||||||
freeglut_return_val_if_fail( font, 0 );
|
font = fghFontByID( fontID );
|
||||||
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutBitmapWidth: bitmap font 0x%08x not found. Make sure you're not passing a stroke font.\n",fontID);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return *( font->Characters[ character ] );
|
return *( font->Characters[ character ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,7 +208,11 @@ int FGAPIENTRY glutBitmapLength( void* fontID, const unsigned char* string )
|
|||||||
SFG_Font* font;
|
SFG_Font* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapLength" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapLength" );
|
||||||
font = fghFontByID( fontID );
|
font = fghFontByID( fontID );
|
||||||
freeglut_return_val_if_fail( font, 0 );
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutBitmapLength: bitmap font 0x%08x not found. Make sure you're not passing a stroke font.\n",fontID);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if ( !string || ! *string )
|
if ( !string || ! *string )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -227,7 +241,11 @@ int FGAPIENTRY glutBitmapHeight( void* fontID )
|
|||||||
SFG_Font* font;
|
SFG_Font* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapHeight" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapHeight" );
|
||||||
font = fghFontByID( fontID );
|
font = fghFontByID( fontID );
|
||||||
freeglut_return_val_if_fail( font, 0 );
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutBitmapHeight: bitmap font 0x%08x not found. Make sure you're not passing a stroke font.\n",fontID);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return font->Height;
|
return font->Height;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,9 +260,13 @@ void FGAPIENTRY glutStrokeCharacter( void* fontID, int character )
|
|||||||
SFG_StrokeFont* font;
|
SFG_StrokeFont* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeCharacter" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeCharacter" );
|
||||||
font = fghStrokeByID( fontID );
|
font = fghStrokeByID( fontID );
|
||||||
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutStrokeCharacter: stroke font 0x%08x not found. Make sure you're not passing a bitmap font.\n",fontID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
freeglut_return_if_fail( character >= 0 );
|
freeglut_return_if_fail( character >= 0 );
|
||||||
freeglut_return_if_fail( character < font->Quantity );
|
freeglut_return_if_fail( character < font->Quantity );
|
||||||
freeglut_return_if_fail( font );
|
|
||||||
|
|
||||||
schar = font->Characters[ character ];
|
schar = font->Characters[ character ];
|
||||||
freeglut_return_if_fail( schar );
|
freeglut_return_if_fail( schar );
|
||||||
@ -272,7 +294,11 @@ void FGAPIENTRY glutStrokeString( void* fontID, const unsigned char *string )
|
|||||||
SFG_StrokeFont* font;
|
SFG_StrokeFont* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeString" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeString" );
|
||||||
font = fghStrokeByID( fontID );
|
font = fghStrokeByID( fontID );
|
||||||
freeglut_return_if_fail( font );
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutStrokeString: stroke font 0x%08x not found. Make sure you're not passing a bitmap font.\n",fontID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if ( !string || ! *string )
|
if ( !string || ! *string )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -322,11 +348,15 @@ int FGAPIENTRY glutStrokeWidth( void* fontID, int character )
|
|||||||
SFG_StrokeFont* font;
|
SFG_StrokeFont* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeWidth" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeWidth" );
|
||||||
font = fghStrokeByID( fontID );
|
font = fghStrokeByID( fontID );
|
||||||
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutStrokeWidth: stroke font 0x%08x not found. Make sure you're not passing a bitmap font.\n",fontID);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
freeglut_return_val_if_fail( ( character >= 0 ) &&
|
freeglut_return_val_if_fail( ( character >= 0 ) &&
|
||||||
( character < font->Quantity ),
|
( character < font->Quantity ),
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
freeglut_return_val_if_fail( font, 0 );
|
|
||||||
schar = font->Characters[ character ];
|
schar = font->Characters[ character ];
|
||||||
freeglut_return_val_if_fail( schar, 0 );
|
freeglut_return_val_if_fail( schar, 0 );
|
||||||
|
|
||||||
@ -344,7 +374,11 @@ int FGAPIENTRY glutStrokeLength( void* fontID, const unsigned char* string )
|
|||||||
SFG_StrokeFont* font;
|
SFG_StrokeFont* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeLength" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeLength" );
|
||||||
font = fghStrokeByID( fontID );
|
font = fghStrokeByID( fontID );
|
||||||
freeglut_return_val_if_fail( font, 0 );
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutStrokeLength: stroke font 0x%08x not found. Make sure you're not passing a bitmap font.\n",fontID);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if ( !string || ! *string )
|
if ( !string || ! *string )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -377,7 +411,11 @@ GLfloat FGAPIENTRY glutStrokeHeight( void* fontID )
|
|||||||
SFG_StrokeFont* font;
|
SFG_StrokeFont* font;
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeHeight" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeHeight" );
|
||||||
font = fghStrokeByID( fontID );
|
font = fghStrokeByID( fontID );
|
||||||
freeglut_return_val_if_fail( font, 0.0 );
|
if (!font)
|
||||||
|
{
|
||||||
|
fgWarning("glutStrokeHeight: stroke font 0x%08x not found. Make sure you're not passing a bitmap font.\n",fontID);
|
||||||
|
return 0.f;
|
||||||
|
}
|
||||||
return font->Height;
|
return font->Height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +73,7 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */
|
|||||||
0, /* ActiveMenus */
|
0, /* ActiveMenus */
|
||||||
NULL, /* MenuStateCallback */
|
NULL, /* MenuStateCallback */
|
||||||
NULL, /* MenuStatusCallback */
|
NULL, /* MenuStatusCallback */
|
||||||
|
FREEGLUT_MENU_FONT,
|
||||||
{ -1, -1, GL_TRUE }, /* GameModeSize */
|
{ -1, -1, GL_TRUE }, /* GameModeSize */
|
||||||
-1, /* GameModeDepth */
|
-1, /* GameModeDepth */
|
||||||
-1, /* GameModeRefresh */
|
-1, /* GameModeRefresh */
|
||||||
|
@ -306,6 +306,7 @@ struct tagSFG_State
|
|||||||
int ActiveMenus; /* Num. of currently active menus */
|
int ActiveMenus; /* Num. of currently active menus */
|
||||||
FGCBMenuState MenuStateCallback; /* Menu callbacks are global */
|
FGCBMenuState MenuStateCallback; /* Menu callbacks are global */
|
||||||
FGCBMenuStatus MenuStatusCallback;
|
FGCBMenuStatus MenuStatusCallback;
|
||||||
|
void* MenuFont; /* Font to be used for newly created menus */
|
||||||
|
|
||||||
SFG_XYUse GameModeSize; /* Game mode screen's dimensions */
|
SFG_XYUse GameModeSize; /* Game mode screen's dimensions */
|
||||||
int GameModeDepth; /* The pixel depth for game mode */
|
int GameModeDepth; /* The pixel depth for game mode */
|
||||||
@ -640,6 +641,7 @@ struct tagSFG_Menu
|
|||||||
FGCBMenu Callback; /* The menu callback */
|
FGCBMenu Callback; /* The menu callback */
|
||||||
FGCBDestroy Destroy; /* Destruction callback */
|
FGCBDestroy Destroy; /* Destruction callback */
|
||||||
GLboolean IsActive; /* Is the menu selected? */
|
GLboolean IsActive; /* Is the menu selected? */
|
||||||
|
void* Font; /* Font to be used for displaying this menu */
|
||||||
int Width; /* Menu box width in pixels */
|
int Width; /* Menu box width in pixels */
|
||||||
int Height; /* Menu box height in pixels */
|
int Height; /* Menu box height in pixels */
|
||||||
int X, Y; /* Menu box raster position */
|
int X, Y; /* Menu box raster position */
|
||||||
|
@ -43,8 +43,8 @@
|
|||||||
* GLUT apparently uses host-system menus rather than building its own.
|
* GLUT apparently uses host-system menus rather than building its own.
|
||||||
* freeglut is building its own menus from scratch.)
|
* freeglut is building its own menus from scratch.)
|
||||||
*
|
*
|
||||||
* FREEGLUT_MENU_HEIGHT gives the height of ONE menu box. This should be
|
* FREEGLUT_MENUENTRY_HEIGHT gives the height of ONE menu box. This should
|
||||||
* the distances between two adjacent menu entries. It should scale
|
* be the distances between two adjacent menu entries. It should scale
|
||||||
* automatically with the font choice, so you needn't alter it---unless you
|
* automatically with the font choice, so you needn't alter it---unless you
|
||||||
* use a stroked font.
|
* use a stroked font.
|
||||||
*
|
*
|
||||||
@ -56,7 +56,7 @@
|
|||||||
*/
|
*/
|
||||||
/* See platform-specific header files for menu font and color definitions */
|
/* See platform-specific header files for menu font and color definitions */
|
||||||
|
|
||||||
#define FREEGLUT_MENU_HEIGHT (glutBitmapHeight(FREEGLUT_MENU_FONT) + \
|
#define FREEGLUT_MENUENTRY_HEIGHT(font) (glutBitmapHeight(font) + \
|
||||||
FREEGLUT_MENU_BORDER)
|
FREEGLUT_MENU_BORDER)
|
||||||
#define FREEGLUT_MENU_BORDER 2
|
#define FREEGLUT_MENU_BORDER 2
|
||||||
|
|
||||||
@ -77,6 +77,7 @@ static float menu_pen_hback [4] = FREEGLUT_MENU_PEN_HBACK_COLORS;
|
|||||||
|
|
||||||
extern GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y );
|
extern GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y );
|
||||||
extern void fghPlatformGetCursorPos(const SFG_Window *window, GLboolean client, SFG_XYUse *mouse_pos);
|
extern void fghPlatformGetCursorPos(const SFG_Window *window, GLboolean client, SFG_XYUse *mouse_pos);
|
||||||
|
extern SFG_Font* fghFontByID( void* font );
|
||||||
|
|
||||||
/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
|
/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
|
||||||
|
|
||||||
@ -187,7 +188,7 @@ static GLboolean fghCheckMenuStatus( SFG_Menu* menu )
|
|||||||
( y >= FREEGLUT_MENU_BORDER ) &&
|
( y >= FREEGLUT_MENU_BORDER ) &&
|
||||||
( y < menu->Height - FREEGLUT_MENU_BORDER ) )
|
( y < menu->Height - FREEGLUT_MENU_BORDER ) )
|
||||||
{
|
{
|
||||||
int menuID = ( y - FREEGLUT_MENU_BORDER ) / FREEGLUT_MENU_HEIGHT;
|
int menuID = ( y - FREEGLUT_MENU_BORDER ) / FREEGLUT_MENUENTRY_HEIGHT(menu->Font);
|
||||||
|
|
||||||
/* The mouse cursor is somewhere over our box, check it out. */
|
/* The mouse cursor is somewhere over our box, check it out. */
|
||||||
menuEntry = fghFindMenuEntry( menu, menuID + 1 );
|
menuEntry = fghFindMenuEntry( menu, menuID + 1 );
|
||||||
@ -235,7 +236,7 @@ static GLboolean fghCheckMenuStatus( SFG_Menu* menu )
|
|||||||
fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y);
|
fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y);
|
||||||
menuEntry->SubMenu->X = menu->X + menu->Width;
|
menuEntry->SubMenu->X = menu->X + menu->Width;
|
||||||
menuEntry->SubMenu->Y = menu->Y +
|
menuEntry->SubMenu->Y = menu->Y +
|
||||||
menuEntry->Ordinal * FREEGLUT_MENU_HEIGHT;
|
menuEntry->Ordinal * FREEGLUT_MENUENTRY_HEIGHT(menu->Font);
|
||||||
|
|
||||||
if( menuEntry->SubMenu->X + menuEntry->SubMenu->Width > max_x )
|
if( menuEntry->SubMenu->X + menuEntry->SubMenu->Width > max_x )
|
||||||
menuEntry->SubMenu->X = menu->X - menuEntry->SubMenu->Width;
|
menuEntry->SubMenu->X = menu->X - menuEntry->SubMenu->Width;
|
||||||
@ -243,7 +244,7 @@ static GLboolean fghCheckMenuStatus( SFG_Menu* menu )
|
|||||||
if( menuEntry->SubMenu->Y + menuEntry->SubMenu->Height > max_y )
|
if( menuEntry->SubMenu->Y + menuEntry->SubMenu->Height > max_y )
|
||||||
{
|
{
|
||||||
menuEntry->SubMenu->Y -= ( menuEntry->SubMenu->Height -
|
menuEntry->SubMenu->Y -= ( menuEntry->SubMenu->Height -
|
||||||
FREEGLUT_MENU_HEIGHT -
|
FREEGLUT_MENUENTRY_HEIGHT(menu->Font) -
|
||||||
2 * FREEGLUT_MENU_BORDER );
|
2 * FREEGLUT_MENU_BORDER );
|
||||||
if( menuEntry->SubMenu->Y < 0 )
|
if( menuEntry->SubMenu->Y < 0 )
|
||||||
menuEntry->SubMenu->Y = 0;
|
menuEntry->SubMenu->Y = 0;
|
||||||
@ -348,13 +349,13 @@ static void fghDisplayMenuBox( SFG_Menu* menu )
|
|||||||
glColor4fv( menu_pen_hback );
|
glColor4fv( menu_pen_hback );
|
||||||
glBegin( GL_QUADS );
|
glBegin( GL_QUADS );
|
||||||
glVertex2i( border,
|
glVertex2i( border,
|
||||||
(menuID + 0)*FREEGLUT_MENU_HEIGHT + border );
|
(menuID + 0)*FREEGLUT_MENUENTRY_HEIGHT(menu->Font) + border );
|
||||||
glVertex2i( menu->Width - border,
|
glVertex2i( menu->Width - border,
|
||||||
(menuID + 0)*FREEGLUT_MENU_HEIGHT + border );
|
(menuID + 0)*FREEGLUT_MENUENTRY_HEIGHT(menu->Font) + border );
|
||||||
glVertex2i( menu->Width - border,
|
glVertex2i( menu->Width - border,
|
||||||
(menuID + 1)*FREEGLUT_MENU_HEIGHT + border );
|
(menuID + 1)*FREEGLUT_MENUENTRY_HEIGHT(menu->Font) + border );
|
||||||
glVertex2i( border,
|
glVertex2i( border,
|
||||||
(menuID + 1)*FREEGLUT_MENU_HEIGHT + border );
|
(menuID + 1)*FREEGLUT_MENUENTRY_HEIGHT(menu->Font) + border );
|
||||||
glEnd( );
|
glEnd( );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -375,25 +376,25 @@ static void fghDisplayMenuBox( SFG_Menu* menu )
|
|||||||
/* Try to center the text - JCJ 31 July 2003*/
|
/* Try to center the text - JCJ 31 July 2003*/
|
||||||
glRasterPos2i(
|
glRasterPos2i(
|
||||||
2 * border,
|
2 * border,
|
||||||
( i + 1 )*FREEGLUT_MENU_HEIGHT -
|
( i + 1 )*FREEGLUT_MENUENTRY_HEIGHT(menu->Font) -
|
||||||
( int )( FREEGLUT_MENU_HEIGHT*0.3 - border )
|
( int )( FREEGLUT_MENUENTRY_HEIGHT(menu->Font)*0.3 - border )
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Have the label drawn, character after character: */
|
/* Have the label drawn, character after character: */
|
||||||
glutBitmapString( FREEGLUT_MENU_FONT,
|
glutBitmapString( menu->Font,
|
||||||
(unsigned char *)menuEntry->Text);
|
(unsigned char *)menuEntry->Text);
|
||||||
|
|
||||||
/* If it's a submenu, draw a right arrow */
|
/* If it's a submenu, draw a right arrow */
|
||||||
if( menuEntry->SubMenu )
|
if( menuEntry->SubMenu )
|
||||||
{
|
{
|
||||||
int width = glutBitmapWidth( FREEGLUT_MENU_FONT, '_' );
|
int width = glutBitmapWidth( menu->Font, '_' );
|
||||||
int x_base = menu->Width - 2 - width;
|
int x_base = menu->Width - 2 - width;
|
||||||
int y_base = i*FREEGLUT_MENU_HEIGHT + border;
|
int y_base = i*FREEGLUT_MENUENTRY_HEIGHT(menu->Font) + border;
|
||||||
glBegin( GL_TRIANGLES );
|
glBegin( GL_TRIANGLES );
|
||||||
glVertex2i( x_base, y_base + 2*border);
|
glVertex2i( x_base, y_base + 2*border);
|
||||||
glVertex2i( menu->Width - 2, y_base +
|
glVertex2i( menu->Width - 2, y_base +
|
||||||
( FREEGLUT_MENU_HEIGHT + border) / 2 );
|
( FREEGLUT_MENUENTRY_HEIGHT(menu->Font) + border) / 2 );
|
||||||
glVertex2i( x_base, y_base + FREEGLUT_MENU_HEIGHT - border );
|
glVertex2i( x_base, y_base + FREEGLUT_MENUENTRY_HEIGHT(menu->Font) - border );
|
||||||
glEnd( );
|
glEnd( );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -771,7 +772,7 @@ void fghCalculateMenuBoxSize( void )
|
|||||||
{
|
{
|
||||||
/* Update the menu entry's width value */
|
/* Update the menu entry's width value */
|
||||||
menuEntry->Width = glutBitmapLength(
|
menuEntry->Width = glutBitmapLength(
|
||||||
FREEGLUT_MENU_FONT,
|
fgStructure.CurrentMenu->Font,
|
||||||
(unsigned char *)menuEntry->Text
|
(unsigned char *)menuEntry->Text
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -781,7 +782,7 @@ void fghCalculateMenuBoxSize( void )
|
|||||||
*/
|
*/
|
||||||
if (menuEntry->SubMenu )
|
if (menuEntry->SubMenu )
|
||||||
menuEntry->Width += glutBitmapLength(
|
menuEntry->Width += glutBitmapLength(
|
||||||
FREEGLUT_MENU_FONT,
|
fgStructure.CurrentMenu->Font,
|
||||||
(unsigned char *)"_"
|
(unsigned char *)"_"
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -789,7 +790,7 @@ void fghCalculateMenuBoxSize( void )
|
|||||||
if( menuEntry->Width > width )
|
if( menuEntry->Width > width )
|
||||||
width = menuEntry->Width;
|
width = menuEntry->Width;
|
||||||
|
|
||||||
height += FREEGLUT_MENU_HEIGHT;
|
height += FREEGLUT_MENUENTRY_HEIGHT(fgStructure.CurrentMenu->Font);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store the menu's box size now: */
|
/* Store the menu's box size now: */
|
||||||
@ -907,6 +908,27 @@ void FGAPIENTRY glutAddSubMenu( const char *label, int subMenuID )
|
|||||||
fghCalculateMenuBoxSize( );
|
fghCalculateMenuBoxSize( );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Changes the current menu's font
|
||||||
|
*/
|
||||||
|
void FGAPIENTRY glutSetMenuFont( void* fontID )
|
||||||
|
{
|
||||||
|
SFG_Font* font;
|
||||||
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetMenuFont" );
|
||||||
|
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
||||||
|
|
||||||
|
if (fgGetActiveMenu())
|
||||||
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
|
font = fghFontByID( fontID );
|
||||||
|
if (!font)
|
||||||
|
fgWarning("glutChangeMenuFont: bitmap font 0x%08x not found. Make sure you're not passing a stroke font. Ignoring...\n",fontID);
|
||||||
|
freeglut_return_if_fail( font );
|
||||||
|
|
||||||
|
fgStructure.CurrentMenu->Font = fontID;
|
||||||
|
fghCalculateMenuBoxSize( );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Changes the specified menu item in the current menu into a menu entry
|
* Changes the specified menu item in the current menu into a menu entry
|
||||||
*/
|
*/
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
extern int fgPlatformGlutGet ( GLenum eWhat );
|
extern int fgPlatformGlutGet ( GLenum eWhat );
|
||||||
extern int fgPlatformGlutDeviceGet ( GLenum eWhat );
|
extern int fgPlatformGlutDeviceGet ( GLenum eWhat );
|
||||||
extern int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size);
|
extern int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size);
|
||||||
|
extern SFG_Font* fghFontByID( void* font );
|
||||||
|
|
||||||
|
|
||||||
/* -- LOCAL DEFINITIONS ---------------------------------------------------- */
|
/* -- LOCAL DEFINITIONS ---------------------------------------------------- */
|
||||||
@ -120,6 +121,18 @@ void FGAPIENTRY glutSetOption( GLenum eWhat, int value )
|
|||||||
fgStructure.CurrentWindow->State.VisualizeNormals = value;
|
fgStructure.CurrentWindow->State.VisualizeNormals = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GLUT_MENU_FONT:
|
||||||
|
{
|
||||||
|
void* fontID = (void*)value;
|
||||||
|
SFG_Font* font;
|
||||||
|
font = fghFontByID( fontID );
|
||||||
|
if (!font)
|
||||||
|
fgWarning("glutSetOption(GLUT_MENU_FONT,...): bitmap font 0x%08x not found. Make sure you're not passing a stroke font. Ignoring...\n",fontID);
|
||||||
|
else
|
||||||
|
fgState.MenuFont = fontID;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fgWarning( "glutSetOption(): missing enum handle %d", eWhat );
|
fgWarning( "glutSetOption(): missing enum handle %d", eWhat );
|
||||||
break;
|
break;
|
||||||
|
@ -132,6 +132,7 @@ SFG_Menu* fgCreateMenu( FGCBMenu menuCallback )
|
|||||||
menu->ID = ++fgStructure.MenuID;
|
menu->ID = ++fgStructure.MenuID;
|
||||||
menu->Callback = menuCallback;
|
menu->Callback = menuCallback;
|
||||||
menu->ActiveEntry = NULL;
|
menu->ActiveEntry = NULL;
|
||||||
|
menu->Font = fgState.MenuFont;
|
||||||
|
|
||||||
fgListInit( &menu->Entries );
|
fgListInit( &menu->Entries );
|
||||||
fgListAppend( &fgStructure.Menus, &menu->Node );
|
fgListAppend( &fgStructure.Menus, &menu->Node );
|
||||||
|
@ -144,6 +144,7 @@ EXPORTS
|
|||||||
glutExit
|
glutExit
|
||||||
glutFullScreenToggle
|
glutFullScreenToggle
|
||||||
glutLeaveFullScreen
|
glutLeaveFullScreen
|
||||||
|
glutSetMenuFont
|
||||||
glutGetModeValues
|
glutGetModeValues
|
||||||
glutInitContextFlags
|
glutInitContextFlags
|
||||||
glutInitContextVersion
|
glutInitContextVersion
|
||||||
|
Reference in New Issue
Block a user