diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/ui_shared.c | 89 | 
1 files changed, 26 insertions, 63 deletions
diff --git a/src/ui/ui_shared.c b/src/ui/ui_shared.c index 87dc7a6c..f03fb82e 100644 --- a/src/ui/ui_shared.c +++ b/src/ui/ui_shared.c @@ -2897,18 +2897,18 @@ int Item_Text_AutoWrapped_Lines( itemDef_t *item )  }  #define MAX_AUTOWRAP_CACHE  16 -#define MAX_AUTOWRAP_LINES  128 -#define MAX_AUTOWRAP_TEXT   8192 +#define MAX_AUTOWRAP_LINES  32 +#define MAX_AUTOWRAP_TEXT   512  typedef struct  { -  char      text[ MAX_AUTOWRAP_TEXT ]; +  //this is used purely for checking for cache hits +  char      text[ MAX_AUTOWRAP_TEXT * MAX_AUTOWRAP_LINES ];    rectDef_t rect;    int       textWidth, textHeight; -  int       skipLines; -  int       lineOffsets[ MAX_AUTOWRAP_LINES ]; -  int       lineLengths[ MAX_AUTOWRAP_LINES ]; -  char      lineColors[ MAX_AUTOWRAP_LINES ][ 2 ]; +  char      lines[ MAX_AUTOWRAP_LINES ][ MAX_AUTOWRAP_TEXT ]; +  int       lineOffsets[ MAX_AUTOWRAP_LINES ][ 2 ]; +  int       numLines;  } autoWrapCache_t;  static int              cacheIndex = 0; @@ -2947,11 +2947,11 @@ void Item_Text_AutoWrapped_Paint( itemDef_t *item )    char        buff[ 1024 ];    char        lastCMod[ 2 ] = { 0, 0 };    qboolean    forwardColor; -  int         width, height, len, offset, textWidth, newLine, newLineWidth; +  int         width, height, len, textWidth, newLine, newLineWidth;    int         skipLines, totalLines, lineNum = 0;    float       y, totalY, diffY;    vec4_t      color; -  int         cache, i = 0; +  int         cache, i;    textWidth = 0;    newLinePtr = NULL; @@ -2979,52 +2979,15 @@ void Item_Text_AutoWrapped_Paint( itemDef_t *item )    cache = checkCache( textPtr, &item->window.rect, width, height );    if( cache >= 0 )    { -    y = item->textaligny; -    i = awc[ cache ].skipLines; - -    len = awc[ cache ].lineLengths[ i ]; -    offset = awc[ cache ].lineOffsets[ i ]; +    lineNum = awc[ cache ].numLines; -    p = textPtr + offset; -     -    while( len >= 0 ) +    for( i = 0; i < lineNum; i++ )      { -      if( len >= 1 ) -      { -        if( awc[ cache ].lineColors[ i ][ 0 ] != 0 ) -        { -          buff[ 0 ] = awc[ cache ].lineColors[ i ][ 0 ]; -          buff[ 1 ] = awc[ cache ].lineColors[ i ][ 1 ]; -           -          len--; -          Q_strncpyz( &buff[ 2 ], &p[ 2 ], len ); -        } -        else -          Q_strncpyz( buff, p, len ); -         -        newLineWidth = DC->textWidth( buff, item->textscale, 0 ); -         -        if( item->textalignment == ITEM_ALIGN_LEFT ) -          item->textRect.x = item->textalignx; -        else if( item->textalignment == ITEM_ALIGN_RIGHT ) -          item->textRect.x = item->textalignx - newLineWidth; -        else if( item->textalignment == ITEM_ALIGN_CENTER ) -          item->textRect.x = item->textalignx - newLineWidth / 2; - -        item->textRect.y = y; -        ToWindowCoords( &item->textRect.x, &item->textRect.y, &item->window ); -         -        buff[ len ] = '\0'; -         -        DC->drawText( item->textRect.x, item->textRect.y, item->textscale, color, buff, 0, 0, item->textStyle ); -      } -         -      y += height + 5; -     -      i++; -      len = awc[ cache ].lineLengths[ i ]; -      offset = awc[ cache ].lineOffsets[ i ]; -      p = textPtr + offset; +      item->textRect.x = awc[ cache ].lineOffsets[ i ][ 0 ]; +      item->textRect.y = awc[ cache ].lineOffsets[ i ][ 1 ]; +       +      DC->drawText( item->textRect.x, item->textRect.y, item->textscale, color, +                    awc[ cache ].lines[ i ], 0, 0, item->textStyle );      }    }    else @@ -3054,7 +3017,6 @@ void Item_Text_AutoWrapped_Paint( itemDef_t *item )      awc[ cacheIndex ].rect.h = item->window.rect.h;      awc[ cacheIndex ].textWidth = width;      awc[ cacheIndex ].textHeight = height; -    awc[ cacheIndex ].skipLines = skipLines;      while( p )      { @@ -3105,12 +3067,16 @@ void Item_Text_AutoWrapped_Paint( itemDef_t *item )            buff[ newLine ] = '\0';            if( !skipLines ) +          {              DC->drawText( item->textRect.x, item->textRect.y, item->textscale, color, buff, 0, 0, item->textStyle ); + +            strcpy( awc[ cacheIndex ].lines[ lineNum ], buff ); +            awc[ cacheIndex ].lineOffsets[ lineNum ][ 0 ] = item->textRect.x; +            awc[ cacheIndex ].lineOffsets[ lineNum ][ 1 ] = item->textRect.y; + +            lineNum++; +          }          } -         -        awc[ cacheIndex ].lineOffsets[ lineNum ] = ( p - len ) - textPtr; -        awc[ cacheIndex ].lineLengths[ lineNum++ ] = newLine + 1; -                  if( *p == '\0' )            break; @@ -3132,9 +3098,6 @@ void Item_Text_AutoWrapped_Paint( itemDef_t *item )            buff[ len++ ] = lastCMod[ 1 ];            buff[ len ] = '\0'; -          awc[ cacheIndex ].lineColors[ lineNum ][ 0 ] = lastCMod[ 0 ]; -          awc[ cacheIndex ].lineColors[ lineNum ][ 1 ] = lastCMod[ 1 ]; -            forwardColor = qfalse;          } @@ -3145,8 +3108,8 @@ void Item_Text_AutoWrapped_Paint( itemDef_t *item )        buff[ len ] = '\0';      } -    //terminate the line length list -    awc[ cacheIndex ].lineLengths[ lineNum ] = -1; +    //mark the end of the lines list +    awc[ cacheIndex ].numLines = lineNum;      //increment cacheIndex      cacheIndex = ( cacheIndex + 1 ) % MAX_AUTOWRAP_CACHE;  | 
