X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=freeglut-1.3%2Ffreeglut_font.c;h=20bbed41770cfea213dc5436b00092aef801e074;hb=a82e219413778d1fd55d270af98e9ad6a97e25a0;hp=26f7d6303cf356562481984b881a4e7496c59ae5;hpb=c90e3f21e02020232054f78029ef9071c7359cfb;p=freeglut diff --git a/freeglut-1.3/freeglut_font.c b/freeglut-1.3/freeglut_font.c index 26f7d63..20bbed4 100644 --- a/freeglut-1.3/freeglut_font.c +++ b/freeglut-1.3/freeglut_font.c @@ -37,8 +37,7 @@ /* * TODO BEFORE THE STABLE RELEASE: * - * glutStrokeCharacter() -- stroke fonts not implemented, uses a bitmap font instead - * glutStrokeWidth() -- stroke fonts not implemented, uses a bitmap font instead + * Test things out ... */ /* -- IMPORT DECLARATIONS -------------------------------------------------- */ @@ -53,20 +52,22 @@ extern SFG_Font fgFontHelvetica12; extern SFG_Font fgFontHelvetica18; extern SFG_Font fgFontTimesRoman10; extern SFG_Font fgFontTimesRoman24; +extern SFG_StrokeFont fgStrokeRoman; +extern SFG_StrokeFont fgStrokeMonoRoman; /* * This is for GLUT binary compatibility, as suggested by Steve Baker */ #if TARGET_HOST_UNIX_X11 - void* glutStrokeRoman; - void* glutStrokeMonoRoman; - void* glutBitmap9By15; - void* glutBitmap8By13; - void* glutBitmapTimesRoman10; - void* glutBitmapTimesRoman24; - void* glutBitmapHelvetica10; - void* glutBitmapHelvetica12; - void* glutBitmapHelvetica18; + void* glutStrokeRoman; + void* glutStrokeMonoRoman; + void* glutBitmap9By15; + void* glutBitmap8By13; + void* glutBitmapTimesRoman10; + void* glutBitmapTimesRoman24; + void* glutBitmapHelvetica10; + void* glutBitmapHelvetica12; + void* glutBitmapHelvetica18; #endif @@ -78,21 +79,43 @@ extern SFG_Font fgFontTimesRoman24; */ static SFG_Font* fghFontByID( void* font ) { - /* - * Try matching the font ID and the font data structure - */ - if( font == GLUT_BITMAP_8_BY_13 ) return( &fgFontFixed8x13 ); - if( font == GLUT_BITMAP_9_BY_15 ) return( &fgFontFixed9x15 ); - if( font == GLUT_BITMAP_HELVETICA_10 ) return( &fgFontHelvetica10 ); - if( font == GLUT_BITMAP_HELVETICA_12 ) return( &fgFontHelvetica12 ); - if( font == GLUT_BITMAP_HELVETICA_18 ) return( &fgFontHelvetica18 ); - if( font == GLUT_BITMAP_TIMES_ROMAN_10 ) return( &fgFontTimesRoman10 ); - if( font == GLUT_BITMAP_TIMES_ROMAN_24 ) return( &fgFontTimesRoman24 ); + /* + * Try matching the font ID and the font data structure + */ + if( font == GLUT_BITMAP_8_BY_13 ) return( &fgFontFixed8x13 ); + if( font == GLUT_BITMAP_9_BY_15 ) return( &fgFontFixed9x15 ); + if( font == GLUT_BITMAP_HELVETICA_10 ) return( &fgFontHelvetica10 ); + if( font == GLUT_BITMAP_HELVETICA_12 ) return( &fgFontHelvetica12 ); + if( font == GLUT_BITMAP_HELVETICA_18 ) return( &fgFontHelvetica18 ); + if( font == GLUT_BITMAP_TIMES_ROMAN_10 ) return( &fgFontTimesRoman10 ); + if( font == GLUT_BITMAP_TIMES_ROMAN_24 ) return( &fgFontTimesRoman24 ); + + /* + * This probably is the library user's fault + */ + fgError( "font 0x%08x not found", font ); + + return 0; +} - /* - * This probably is the library user's fault - */ - g_error( "font 0x%08x not found", font ); +/* + * Matches a font ID with a SFG_StrokeFont structure pointer. + * This was changed to match the GLUT header style. + */ +static SFG_StrokeFont* fghStrokeByID( void* font ) +{ + /* + * Try matching the font ID and the font data structure + */ + if( font == GLUT_STROKE_ROMAN ) return( &fgStrokeRoman ); + if( font == GLUT_STROKE_MONO_ROMAN ) return( &fgStrokeMonoRoman ); + + /* + * This probably is the library user's fault + */ + fgError( "stroke font 0x%08x not found", font ); + + return 0; } @@ -103,52 +126,117 @@ static SFG_Font* fghFontByID( void* font ) */ void FGAPIENTRY glutBitmapCharacter( void* fontID, int character ) { - const guchar* face; - - /* - * First of all we'll need a font to use - */ - SFG_Font* font = fghFontByID( fontID ); - - /* - * Make sure the character we want to output is valid - */ - freeglut_return_if_fail( character > 0 && character < 256 ); - - /* - * Then find the character we want to draw - */ - face = font->Characters[ character - 1 ]; - - /* - * Save the old pixel store settings - */ - glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT ); - - /* - * Set up the pixel unpacking ways - */ - glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); - glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE ); - glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); - glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); - glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - - /* - * We'll use a glBitmap call to draw the font. - */ - glBitmap( - face[ 0 ], font->Height, /* The bitmap's width and height */ - 0, 0, /* The origin -- what the hell? */ - face[ 0 ] + 1, 0, /* The raster advance -- inc. x */ - (face + 1) /* The packed bitmap data... */ - ); + const GLubyte* face; + + /* + * First of all we'll need a font to use + */ + SFG_Font* font = fghFontByID( fontID ); + + /* + * Make sure the character we want to output is valid + */ + freeglut_return_if_fail( character >= 0 && character < 256 ); + + /* + * Then find the character we want to draw + */ + face = font->Characters[ character - 1 ]; + + /* + * Save the old pixel store settings + */ + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT ); + + /* + * Set up the pixel unpacking ways + */ + glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); + glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE ); + glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); + glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); + glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + + /* + * We'll use a glBitmap call to draw the font. + */ + glBitmap( + face[ 0 ], font->Height, /* The bitmap's width and height */ + font->xorig, font->yorig, /* The origin -- what on earth? */ + (float)(face[ 0 ] + 1), 0.0, /* The raster advance -- inc. x */ + (face + 1) /* The packed bitmap data... */ + ); + + /* + * Restore the old pixel store settings + */ + glPopClientAttrib(); +} - /* - * Restore the old pixel store settings - */ - glPopClientAttrib(); +void FGAPIENTRY glutBitmapString( void* fontID, const char *string ) +{ + int c; + int numchar = strlen ( string ) ; + + /* + * First of all we'll need a font to use + */ + SFG_Font* font = fghFontByID( fontID ); + + float raster_position[4] ; + glGetFloatv ( GL_CURRENT_RASTER_POSITION, raster_position ) ; + + /* + * Save the old pixel store settings + */ + glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT ); + + /* + * Set up the pixel unpacking ways + */ + glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); + glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE ); + glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); + glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); + glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + + /* + * Step through the string, drawing each character. + * A carriage return will simply translate the next character's insertion point back to the + * start of the line and down one line. + */ + for( c = 0; c < numchar; c++ ) + { + if ( ( string[ c ] >= 0 ) && ( string[ c ] < 256 ) ) + { + if ( string[c] == '\n' ) + { + raster_position[1] -= (float)font->Height ; + glRasterPos4fv ( raster_position ) ; + } + else /* Not a carriage return, draw the bitmap character */ + { + const GLubyte* face = font->Characters[ string[ c ] - 1 ] ; + + /* + * We'll use a glBitmap call to draw the font. + */ + glBitmap( + face[ 0 ], font->Height, /* The bitmap's width and height */ + font->xorig, font->yorig, /* The origin -- what on earth? */ + (float)(face[ 0 ] + 1), 0.0, /* The raster advance -- inc. x */ + (face + 1) /* The packed bitmap data... */ + ) ; + } + } + } + + /* + * Restore the old pixel store settings + */ + glPopClientAttrib(); } /* @@ -156,20 +244,74 @@ void FGAPIENTRY glutBitmapCharacter( void* fontID, int character ) */ int FGAPIENTRY glutBitmapWidth( void* fontID, int character ) { - /* - * First of all, grab the font we need - */ - SFG_Font* font = fghFontByID( fontID ); + /* + * First of all, grab the font we need + */ + SFG_Font* font = fghFontByID( fontID ); + + /* + * Make sure the character we want to output is valid + */ + freeglut_return_val_if_fail( character > 0 && character < 256, 0 ); + + /* + * Scan the font looking for the specified character + */ + return( *(font->Characters[ character - 1 ]) + 1 ); +} - /* - * Make sure the character we want to output is valid - */ - freeglut_return_val_if_fail( character > 0 && character < 256, 0 ); +/* + * Return the width of a string drawn using a bitmap font + */ +int FGAPIENTRY glutBitmapLength( void* fontID, const char* string ) +{ + int c, length = 0, this_line_length = 0; + + /* + * First of all, grab the font we need + */ + SFG_Font* font = fghFontByID( fontID ); + + /* + * Step through the characters in the string, adding up the width of each one + */ + int numchar = strlen ( string ) ; + for( c = 0; c < numchar; c++ ) + { + if ( ( string[ c ] >= 0 ) && ( string[ c ] < 256 ) ) + { + if ( string[ c ] == '\n' ) /* Carriage return, reset the length of this line */ + { + if ( length < this_line_length ) length = this_line_length ; + this_line_length = 0 ; + } + else /* Not a carriage return, increment the length of this line */ + this_line_length += *(font->Characters[ string[ c ] - 1 ]) + 1 ; + } + } + + if ( length < this_line_length ) length = this_line_length ; + + /* + * Return the result now + */ + return( length ); +} - /* - * Scan the font looking for the specified character - */ - return( *(font->Characters[ character - 1 ]) + 1 ); +/* + * Returns the height of a bitmap font + */ +int FGAPIENTRY glutBitmapHeight( void* fontID ) +{ + /* + * See which font are we queried about + */ + SFG_Font* font = fghFontByID( fontID ); + + /* + * Return the character set's height + */ + return( font->Height ); } /* @@ -177,40 +319,108 @@ int FGAPIENTRY glutBitmapWidth( void* fontID, int character ) */ void FGAPIENTRY glutStrokeCharacter( void* fontID, int character ) { - /* - * Stroke fonts are not supported yet, use a bitmap font instead - */ - glutBitmapCharacter( GLUT_BITMAP_8_BY_13, character ); + const SFG_StrokeChar *schar; + const SFG_StrokeStrip *strip; + int i, j; + + /* + * First of all we'll need a font to use + */ + SFG_StrokeFont* font = fghStrokeByID( fontID ); + + /* + * Make sure the character we want to output is valid + */ + freeglut_return_if_fail( character >= 0 && character < font->Quantity ); + + schar = font->Characters[character]; + + freeglut_return_if_fail( schar ); + + strip = schar->Strips; + + for (i = 0; i < schar->Number; i++, strip++) + { + glBegin(GL_LINE_STRIP); + for(j = 0; j < strip->Number; j++) + { + glVertex2f(strip->Vertices[j].X, strip->Vertices[j].Y); + } + glEnd(); + } + glTranslatef(schar->Right, 0.0, 0.0); } -/* - * Return the width in pixels of a stroke character - */ -int FGAPIENTRY glutStrokeWidth( void* fontID, int character ) +void FGAPIENTRY glutStrokeString( void* fontID, const char *string ) { - /* - * Stroke fonts are not supported yet, use a bitmap font instead - */ - return( glutBitmapWidth( GLUT_BITMAP_8_BY_13, character ) ); + int c, i, j; + int numchar = strlen ( string ) ; + float length = 0.0 ; + + /* + * First of all we'll need a font to use + */ + SFG_StrokeFont* font = fghStrokeByID( fontID ); + + /* + * Step through the string, drawing each character. + * A carriage return will simply translate the next character's insertion point back to the + * start of the line and down one line. + */ + for( c = 0; c < numchar; c++ ) + { + if ( ( string[ c ] >= 0 ) && ( string[ c ] < font->Quantity ) ) + { + if ( string[c] == '\n' ) + { + glTranslatef ( -length, -(float)(font->Height), 0.0 ) ; + length = 0.0 ; + } + else /* Not a carriage return, draw the bitmap character */ + { + const SFG_StrokeChar *schar = font->Characters[string[c]]; + if ( schar != NULL ) + { + const SFG_StrokeStrip *strip = schar->Strips; + + for (i = 0; i < schar->Number; i++, strip++) + { + glBegin(GL_LINE_STRIP); + for(j = 0; j < strip->Number; j++) + glVertex2f(strip->Vertices[j].X, strip->Vertices[j].Y); + + glEnd(); + } + + length += schar->Right ; + glTranslatef(schar->Right, 0.0, 0.0); + } + } + } + } } /* - * Return the width of a string drawn using a bitmap font + * Return the width in pixels of a stroke character */ -int FGAPIENTRY glutBitmapLength( void* fontID, const char* string ) +int FGAPIENTRY glutStrokeWidth( void* fontID, int character ) { - gint i, length = 0; + const SFG_StrokeChar *schar; + /* + * First of all we'll need a font to use + */ + SFG_StrokeFont* font = fghStrokeByID( fontID ); - /* - * Using glutBitmapWidth() function to calculate the result - */ - for( i=0; i<(gint) strlen( string ); i++ ) - length += glutBitmapWidth( fontID, string[ i ] ); + /* + * Make sure the character we want to output is valid + */ + freeglut_return_val_if_fail( character >= 0 && character < font->Quantity, 0 ); - /* - * Return the result now - */ - return( length ); + schar = font->Characters[character]; + + freeglut_return_val_if_fail( schar, 0 ); + + return ((int)(schar->Right + 0.5)); } /* @@ -218,29 +428,54 @@ int FGAPIENTRY glutBitmapLength( void* fontID, const char* string ) */ int FGAPIENTRY glutStrokeLength( void* fontID, const char* string ) { - gint i, length = 0; - - /* - * Using glutStrokeWidth() function to calculate the result - */ - for( i=0; i<(gint) strlen( string ); i++ ) - length += glutStrokeWidth( fontID, string[ i ] ); - - /* - * Return the result now - */ - return( length ); + int c; + float length = 0.0; + float this_line_length = 0.0 ; + + /* + * First of all we'll need a font to use + */ + SFG_StrokeFont* font = fghStrokeByID( fontID ); + + /* + * Step through the characters in the string, adding up the width of each one + */ + int numchar = strlen ( string ) ; + for( c = 0; c < numchar; c++ ) + { + if ( ( string[ c ] >= 0 ) && ( string[ c ] < font->Quantity ) ) + { + if ( string[ c ] == '\n' ) /* Carriage return, reset the length of this line */ + { + if ( length < this_line_length ) length = this_line_length ; + this_line_length = 0.0 ; + } + else /* Not a carriage return, increment the length of this line */ + { + const SFG_StrokeChar *schar = font->Characters[string[c]]; + if ( schar != NULL ) + this_line_length += schar->Right ; + } + } + } + + if ( length < this_line_length ) length = this_line_length ; + + /* + * Return the result now + */ + return( (int)(length+0.5) ); } /* - * Returns the height of a bitmap font + * Returns the height of a stroke font */ -int FGAPIENTRY glutBitmapHeight( void* fontID ) +GLfloat FGAPIENTRY glutStrokeHeight( void* fontID ) { /* * See which font are we queried about */ - SFG_Font* font = fghFontByID( fontID ); + SFG_StrokeFont* font = fghStrokeByID( fontID ); /* * Return the character set's height @@ -248,16 +483,4 @@ int FGAPIENTRY glutBitmapHeight( void* fontID ) return( font->Height ); } -/* - * Returns the height of a stroke font - */ -int FGAPIENTRY glutStrokeHeight( void* font ) -{ - /* - * Stroke fonts are currently not implemented. - * Using GLUT_BITMAP_8_BY_13 bitmap font instead - */ - return( glutBitmapHeight( GLUT_BITMAP_8_BY_13 ) ); -} - /*** END OF FILE ***/