mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
Hard reset
This commit is contained in:
commit
09bed43f97
1594 changed files with 892326 additions and 0 deletions
352
code/uilib/uifont.cpp
Normal file
352
code/uilib/uifont.cpp
Normal file
|
@ -0,0 +1,352 @@
|
|||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 2015 the OpenMoHAA team
|
||||
|
||||
This file is part of OpenMoHAA source code.
|
||||
|
||||
OpenMoHAA source code is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
OpenMoHAA source code is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenMoHAA source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#include "ui_local.h"
|
||||
|
||||
UIFont::UIFont()
|
||||
{
|
||||
m_font = uii.Rend_LoadFont( "verdana-14" );
|
||||
if( !m_font ) {
|
||||
uii.Sys_Error( ERR_DROP, "Couldn't load font Verdana\n" );
|
||||
}
|
||||
|
||||
color = UBlack;
|
||||
setColor( color );
|
||||
}
|
||||
|
||||
UIFont::UIFont
|
||||
(
|
||||
const char *fn
|
||||
)
|
||||
|
||||
{
|
||||
setFont( fn );
|
||||
}
|
||||
|
||||
void UIFont::Print
|
||||
(
|
||||
float x,
|
||||
float y,
|
||||
const char *text,
|
||||
int maxlen,
|
||||
qboolean bVirtualScreen
|
||||
)
|
||||
|
||||
{
|
||||
uii.Rend_SetColor( color );
|
||||
uii.Rend_DrawString( m_font, text, x, y, maxlen, bVirtualScreen );
|
||||
}
|
||||
|
||||
void UIFont::PrintJustified
|
||||
(
|
||||
const UIRect2D& rect,
|
||||
fonthorzjustify_t horz,
|
||||
fontvertjustify_t vert,
|
||||
const char *text,
|
||||
float *vVirtualScale
|
||||
)
|
||||
|
||||
{
|
||||
float newx, newy;
|
||||
int textwidth, textheight;
|
||||
UIRect2D sizedRect;
|
||||
const char *source;
|
||||
char *dest;
|
||||
char string[ 2048 ];
|
||||
|
||||
if( vVirtualScale )
|
||||
{
|
||||
sizedRect.pos.x = rect.pos.x / vVirtualScale[ 0 ];
|
||||
sizedRect.pos.y = rect.pos.y / vVirtualScale[ 1 ];
|
||||
sizedRect.size.width = rect.size.width / vVirtualScale[ 2 ];
|
||||
sizedRect.size.height = rect.size.height / vVirtualScale[ 3 ];
|
||||
}
|
||||
else
|
||||
{
|
||||
sizedRect = rect;
|
||||
}
|
||||
|
||||
if( horz == FONT_JUSTHORZ_LEFT && vert == FONT_JUSTVERT_TOP )
|
||||
{
|
||||
// no need to justify
|
||||
Print( sizedRect.pos.x, sizedRect.pos.y, text, -1, vVirtualScale != NULL );
|
||||
return;
|
||||
}
|
||||
|
||||
textheight = getHeight( text, -1, qfalse );
|
||||
|
||||
switch( vert )
|
||||
{
|
||||
case FONT_JUSTVERT_TOP:
|
||||
newy = sizedRect.pos.y;
|
||||
break;
|
||||
case FONT_JUSTVERT_CENTER:
|
||||
newy = ( sizedRect.size.height - textheight ) * 0.5 + sizedRect.pos.y;
|
||||
break;
|
||||
case FONT_JUSTVERT_BOTTOM:
|
||||
newy = sizedRect.pos.y - textheight;
|
||||
break;
|
||||
default:
|
||||
newy = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
source = text;
|
||||
while( *source )
|
||||
{
|
||||
while( *source == '\n' )
|
||||
source++;
|
||||
|
||||
if( !*source )
|
||||
return;
|
||||
|
||||
dest = string;
|
||||
|
||||
do
|
||||
*dest++ = *source++;
|
||||
while( *source && *source != '\n' );
|
||||
|
||||
*dest = 0;
|
||||
|
||||
textwidth = getWidth( string, -1 );
|
||||
|
||||
switch( horz )
|
||||
{
|
||||
case FONT_JUSTHORZ_CENTER:
|
||||
newx = ( sizedRect.size.width - textwidth ) * 0.5 + sizedRect.pos.x;
|
||||
break;
|
||||
case FONT_JUSTHORZ_LEFT:
|
||||
newx = sizedRect.pos.x;
|
||||
break;
|
||||
case FONT_JUSTHORZ_RIGHT:
|
||||
newx = sizedRect.pos.x + sizedRect.size.width - textwidth;
|
||||
break;
|
||||
default:
|
||||
newx = 0.0;
|
||||
break;
|
||||
}
|
||||
|
||||
Print( newx, newy, string, -1, vVirtualScale != NULL );
|
||||
|
||||
// expand for newline
|
||||
newy += getHeight( " ", -1, qfalse );
|
||||
}
|
||||
}
|
||||
|
||||
void UIFont::setColor
|
||||
(
|
||||
UColor col
|
||||
)
|
||||
|
||||
{
|
||||
color = col;
|
||||
}
|
||||
|
||||
void UIFont::setAlpha
|
||||
(
|
||||
float alpha
|
||||
)
|
||||
|
||||
{
|
||||
color.a = alpha;
|
||||
}
|
||||
|
||||
void UIFont::setFont
|
||||
(
|
||||
const char *fontname
|
||||
)
|
||||
|
||||
{
|
||||
m_font = uii.Rend_LoadFont( fontname );
|
||||
if( !m_font ) {
|
||||
uii.Sys_Error( ERR_DROP, "Couldn't load font %s\n", fontname );
|
||||
}
|
||||
}
|
||||
|
||||
int UIFont::getWidth
|
||||
(
|
||||
const char *text,
|
||||
int maxlen
|
||||
)
|
||||
|
||||
{
|
||||
return UI_FontStringWidth( m_font, text, maxlen );
|
||||
}
|
||||
|
||||
int UIFont::getCharWidth
|
||||
(
|
||||
char ch
|
||||
)
|
||||
|
||||
{
|
||||
int indirected = m_font->indirection[ 32 ];
|
||||
|
||||
if( ch == '\t' )
|
||||
{
|
||||
indirected = m_font->indirection[ 32 ];
|
||||
|
||||
if( indirected > 255 ) {
|
||||
Com_Printf( "getCharWidth: no space-character in font!\n" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
return m_font->locations[ indirected ].size[ 0 ] * 256.0 * 3.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
indirected = m_font->indirection[ ch ];
|
||||
|
||||
if( indirected > 255 ) {
|
||||
Com_Printf( "getCharWidth: no 0x%02x-character in font!\n", ch );
|
||||
return 0;
|
||||
}
|
||||
|
||||
return m_font->locations[ indirected ].size[ 0 ] * 256.0;
|
||||
}
|
||||
}
|
||||
|
||||
int UIFont::getHeight
|
||||
(
|
||||
const char *text,
|
||||
int maxlen,
|
||||
qboolean bVirtual
|
||||
)
|
||||
|
||||
{
|
||||
float height;
|
||||
int i;
|
||||
|
||||
if( !m_font ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
height = getHeight( bVirtual );
|
||||
|
||||
i = 0;
|
||||
while( text[ i ] )
|
||||
{
|
||||
if( maxlen != -1 && i > maxlen ) {
|
||||
break;
|
||||
}
|
||||
|
||||
if( text[ i ] == '\n' )
|
||||
{
|
||||
height += getHeight( bVirtual );
|
||||
}
|
||||
}
|
||||
|
||||
return height;
|
||||
}
|
||||
|
||||
int UIFont::getHeight
|
||||
(
|
||||
qboolean bVirtual
|
||||
)
|
||||
|
||||
{
|
||||
if( bVirtual )
|
||||
{
|
||||
if( m_font )
|
||||
{
|
||||
return ( m_font->height * uid.vidHeight / 480.0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
return ( 16.0 * uid.vidHeight / 480.0 );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( m_font )
|
||||
{
|
||||
return m_font->height;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int UI_FontStringWidth
|
||||
(
|
||||
fontheader_t *pFont,
|
||||
const char *pszString,
|
||||
int iMaxLen
|
||||
)
|
||||
|
||||
{
|
||||
float widths = 0.0;
|
||||
float maxwidths = 0.0;
|
||||
int indirected;
|
||||
int i;
|
||||
|
||||
if( !pFont ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( iMaxLen == -1 ) {
|
||||
iMaxLen = strlen( pszString ) + 1;
|
||||
}
|
||||
|
||||
for( i = 0; i < iMaxLen; i++ )
|
||||
{
|
||||
unsigned char c = pszString[ i ];
|
||||
|
||||
if( c == 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if( c == '\t' )
|
||||
{
|
||||
indirected = pFont->indirection[ 32 ];
|
||||
|
||||
if( indirected > 255 ) {
|
||||
Com_Printf( "UIFont::getWidth: no space-character in font!\n" );
|
||||
continue;
|
||||
} else {
|
||||
widths += pFont->locations[ indirected ].size[ 0 ] * 3.0;
|
||||
}
|
||||
}
|
||||
else if( c == '\n' )
|
||||
{
|
||||
widths = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
indirected = pFont->indirection[ c ];
|
||||
|
||||
if( indirected > 255 ) {
|
||||
Com_Printf( "UIFont::getWidth: no 0x%02x-character in font!\n", c );
|
||||
continue;
|
||||
} else {
|
||||
widths += pFont->locations[ indirected ].size[ 0 ];
|
||||
}
|
||||
}
|
||||
|
||||
if( maxwidths < widths ) {
|
||||
maxwidths = widths;
|
||||
}
|
||||
}
|
||||
|
||||
return maxwidths * 256.0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue