fsGUIShowFont.c
上传用户:poi891205
上传日期:2013-07-15
资源大小:9745k
文件大小:8k
源码类别:

DVD

开发平台:

C/C++

  1. #ifndef _FSGUISHOWFONT_C_
  2. #define _FSGUISHOWFONT_C_
  3. #include "global.h"
  4. #include "graph.h"
  5. #include "LanguageUtil.h"
  6. #define DWORD_WIDTH_NORMAL      14
  7. #define SWORD_WIDTH_NORMAL      9
  8. #define DWORD_WIDTH_LARGE       26
  9. #define SWORD_WIDTH_LARGE       16
  10.     
  11. void EnlargeFontSizeToDouble( UINT8 *pDest, const UINT8 *pSrc, BYTE uiWidth, BYTE uiHeight )
  12. {
  13. BYTE i, j, k, m, n;
  14.     UINT16 my16bits=0;
  15. for (i=0;i<uiHeight;i++)
  16.         for(n=0;n<2;n++)
  17.             for(j=0;j<(uiWidth/8);j++)
  18.             {
  19.                 for(k=0;k<8;k++)
  20.                     for(m=0;m<2;m++)
  21.                         if((pSrc[i*2+j]>>(7-k))&0x01)
  22.                              my16bits |= (1<<(uiWidth-1-(k*2+m)));
  23.                 pDest[(i*2+n)*4+j*2]=(my16bits>>8);
  24.                 pDest[(i*2+n)*4+j*2+1]=my16bits&0xff;
  25.                 my16bits=0;
  26.             }
  27. }
  28. void ReduceFontSizeToHalf( UINT8 *pDest, const UINT8 *pSrc, BYTE uiWidth, BYTE uiHeight )
  29. {
  30.     UINT8  i, j;
  31.     uiHeight     = uiHeight >> 1;
  32.     for( i = 0; i < uiHeight; i++ )
  33.     {
  34.         const UINT8*    pData   = &pSrc[ (i<<2) ];
  35.         UINT16          uiData1 = ( pData[0] << 8 ) | pData[1];
  36.         UINT8           uiData2 = 0;
  37.         for( j = 0; j < 8; j++ )
  38.             uiData2 |= (UINT8) ( ( uiData1 & ( 0x01 << ( j << 1 ) ) ) >> j );
  39.         pDest[i]    = uiData2;
  40.     }
  41. }
  42. void ResampleWidthFrom12PixelTo16Pixel( UINT8* pDest, const UINT8* pSrc, UINT32 uiHeight )
  43. {
  44.     UINT8 i = 0, uiToggle = 0;
  45.     
  46.     for( ; i < ( uiHeight << 1 ); i += 2 )
  47.     {
  48.         if( uiToggle )
  49.         {
  50.             pDest[ i     ] = pSrc[1];
  51.             pDest[ i + 1 ] = (pSrc[0] & 0x0f ) << 4;
  52.             pSrc += 2;
  53.         }
  54.         else
  55.         {
  56.             pDest[ i     ] = pSrc[0];
  57.             pDest[ i + 1 ] = pSrc[1] & 0xf0;
  58.             pSrc += 1;
  59.         }
  60.         uiToggle = !uiToggle;
  61.     }
  62. }
  63. void FSGUI_DrawMonoBitmap( BYTE video_buf, const BYTE* pFont, UINT16 x, UINT16 y, UINT16 uiWidth, UINT16 uiHeight, UINT8 uiY, UINT16 uiCbCr, UINT8 uiScaleMode )
  64. {
  65.     // uiScaleMode == 0, Direct draw
  66.     // uiScaleMode == 1, Enlarge input bmp by 2 x 2
  67.     // uiScaleMode == 2, Reduce input bmp by 2 x 2
  68.     UINT8   i, j;
  69.     UINT8   aFont[96];    // 24 * 2 * 2
  70.     const BYTE* pDestFont;
  71.     switch( uiScaleMode )
  72.     {
  73.     case 2:
  74.         ReduceFontSizeToHalf( aFont, pFont, uiWidth, uiHeight );
  75.         uiWidth     = uiWidth   >> 1;
  76.         uiHeight    = uiHeight  >> 1;
  77.         pDestFont   = aFont;
  78.         break;
  79.     case 1:
  80.         EnlargeFontSizeToDouble( aFont, pFont, uiWidth, uiHeight );
  81.         uiWidth     = uiWidth   << 1;
  82.         uiHeight    = uiHeight  << 1;
  83.         pDestFont   = aFont;
  84.         break;
  85.     default:
  86.         pDestFont   = pFont;
  87.         break;
  88.     }
  89. for( j = 0; j < uiHeight; j++ )
  90. {
  91.     UINT8 uiOffset      = 0;
  92.         UINT8 uiCurWidth    = uiWidth;
  93.         
  94.     while( uiCurWidth > 0 )
  95.         {
  96.             UINT8 uiCount = uiCurWidth >= 8 ? 8 : uiCurWidth;
  97.             uiCurWidth -= uiCount;
  98.          UINT8 uiData = *pDestFont;
  99.          for( i = 0; i < uiCount; i++, uiOffset++ )
  100.             {
  101.                 if( uiData & ( 0x80 >> i ) )
  102.                 {
  103.                     UINT16 uiDestX = x + uiOffset;
  104.                     UINT16 uiDestY = y + j;
  105.                     
  106.                     if( video_buf == 0 )
  107.                     {
  108.                         *Y_XY( uiDestX, uiDestY ) = uiY;
  109.                         *C_XY( uiDestX, uiDestY ) = uiCbCr;
  110.                     }
  111.                     else if( video_buf == 1 )
  112.                     {
  113.                         *Y_XY1( uiDestX, uiDestY ) = uiY;
  114.                         *C_XY1( uiDestX, uiDestY ) = uiCbCr;
  115.                     }
  116.                     else if( video_buf == 2 )
  117.                     {
  118.                         *Y_XYB( uiDestX, uiDestY ) = uiY;
  119.                         *C_XYB( uiDestX, uiDestY ) = uiCbCr;
  120.                     }
  121.                 }
  122.             }
  123.             
  124.             pDestFont++;
  125.         }        
  126.     }
  127. }
  128. UINT32 FSGUI_ShowChar_Internal( BYTE video_buf, UINT16 x, UINT16 y, BYTE c, BYTE iY, UINT16 iCbCr, UINT8 uiMode ) //Jeff 20020823
  129. {
  130. // uiMode == 0, normal font size
  131. // uiMode == 1, large font size( double )
  132. BYTE* pFont = get_font_entry(0,c);
  133.     if( !pFont )
  134.         return 0;
  135.         
  136.     pFont += 3;
  137. #ifdef USE_SMALL_FONT
  138.     UINT8 aData[32];
  139.     ResampleWidthFrom12PixelTo16Pixel( aData, pFont, 16 );
  140.     FSGUI_DrawMonoBitmap( video_buf, aData, x, y, 16, 16, iY, iCbCr, uiMode ? 0 : 2 );    
  141. #else
  142.     FSGUI_DrawMonoBitmap( video_buf, pFont, x, y, 16, 24, iY, iCbCr, uiMode ? 0 : 2 );
  143. #endif
  144.     
  145.     return uiMode ? SWORD_WIDTH_LARGE : SWORD_WIDTH_NORMAL;
  146. }
  147. void FSGUI_ShowChar( BYTE video_buf, int x, int y, BYTE c, BYTE iY, UINT16 iCbCr ) //Jeff 20020823
  148. {
  149. #if defined (MP3_LARGE_GUI) || defined (FS_BMP_GUI)
  150.     FSGUI_ShowChar_Internal( video_buf, x, y, c, iY, iCbCr, 1 );
  151. #else
  152.     FSGUI_ShowChar_Internal( video_buf, x, y, c, iY, iCbCr, 0 );
  153. #endif
  154. }
  155. UINT32 FSGUI_FontShowChar( UINT16 x, UINT16 y, const BYTE* pBmp, UINT8 uiY, UINT16 uiCbCr, UINT8 uiMode )
  156. {
  157.     UINT8   aFont[ 48 ];
  158.     ENUM_FONT_TYPE enType = GetFontType();
  159.     if( enType == FONT_BIG5   || enType == FONT_BIG5_COMMON || 
  160.         enType == FONT_GB2312 || enType == FONT_JIS || 
  161.         enType == FONT_KSC    || enType == FONT_RUSSIAN )
  162.     {
  163.         ResampleWidthFrom12PixelTo16Pixel( aFont, pBmp, 12 );
  164.         FSGUI_DrawMonoBitmap( 0, aFont, x, y, 16, 12, uiY, uiCbCr, uiMode );
  165.         return uiMode ? DWORD_WIDTH_LARGE : DWORD_WIDTH_NORMAL;
  166.     }
  167.     else if( enType == FONT_ISO_8859_1 || enType == FONT_ISO_8859_2 || enType == FONT_ISO_8859_5|| enType == FONT_ISO_8859_9 )
  168.     {   
  169.         ResampleWidthFrom12PixelTo16Pixel( aFont, pBmp, 24 );
  170.         FSGUI_DrawMonoBitmap( 0, aFont, x, y, 16, 24, uiY, uiCbCr, ( uiMode ? 0 : 2 ) );
  171.         return uiMode ? SWORD_WIDTH_LARGE : SWORD_WIDTH_NORMAL;
  172.     }
  173.     return 0;
  174. }
  175. void FSGUI_ShowString_Internal( UINT16 x, UINT16 y, const UINT8 *pStr, BYTE uiY, UINT16 uiCbCr, UINT8 uiMode )
  176. {
  177. // uiMode == 0, normal font size
  178. // uiMode == 1, large font size( double )
  179. #ifdef FS_BMP_GUI
  180.     #define SENTENCE_LEN_NORMAL     300
  181. #else
  182.     #define SENTENCE_LEN_NORMAL     260
  183. #endif
  184.     #define SENTENCE_LEN_LARGE      540
  185.     UINT16 uiCount          = 0;
  186.     UINT16 uiSentenceLen    = uiMode ? SENTENCE_LEN_LARGE : SENTENCE_LEN_NORMAL;
  187. while( *pStr )
  188. {
  189.         const UINT8* pBmp   = NULL;
  190.         UINT32 uiRtnVal     = GetCharacterBmp( pStr, &pBmp );
  191.         ENUM_FONT_TYPE enType = GetFontType();
  192.         // 2004/01/19 yltseng, temporarily usage, should be removed after font size is unified
  193.         if( ( uiRtnVal != FONT_NOT_IN_RANGE ) &&
  194.             ( enType == FONT_BIG5 || enType == FONT_BIG5_COMMON || enType == FONT_GB2312 ) )
  195.         {
  196.             UINT32 uiOffset = FSGUI_FontShowChar( x + uiCount, y, pBmp, uiY, uiCbCr, uiMode );  // 2004/09/23 yltseng
  197.             if( uiRtnVal == FONT_ONE_BYTE )
  198.                 pStr++;
  199.             else 
  200.                 pStr += 2;
  201.      //liweihua mod 2004-11-23
  202.      //for display more Russian characters
  203. #ifdef ETON_DVD
  204.             if( GetFontType() == FONT_GB2312 && pStr[0] == 0xA7 )
  205.          uiCount += 10;
  206.      else
  207. #endif
  208.                 uiCount += uiOffset;
  209.         }
  210.         else
  211.         {
  212.     BYTE    c   = *pStr;
  213.             if ( (c < 32) || (c > 126) )
  214.                 c = '_';
  215.             uiCount += FSGUI_ShowChar_Internal( 0, x + uiCount, y, c, uiY, uiCbCr, uiMode );
  216.             pStr++;
  217.         }
  218. if( uiCount > uiSentenceLen )
  219. break;  // yhwang, for limiting the length of FSGUI_ShowString
  220. }
  221. }
  222. void FSGUI_ShowString(int x, int y, const UINT8 *s, BYTE iY, UINT16 iCbCr)
  223. {
  224. #if defined (MP3_LARGE_GUI) || defined (FS_BMP_GUI)
  225.     FSGUI_ShowString_Internal( x, y, s, iY, iCbCr, 1 );
  226. #else
  227.     FSGUI_ShowString_Internal( x, y, s, iY, iCbCr, 0 );
  228. #endif
  229. }
  230. #ifdef FS_BMP_GUI
  231. /*
  232.     Function:In order to show little string in Sunplus New GUI
  233.     Creator:Feeling
  234. */
  235. void FSGUI_ShowLittleString(int x, int y, const char *s, BYTE iY, UINT16 iCbCr)
  236. {
  237.     FSGUI_ShowString_Internal( x, y, s, iY, iCbCr, 0 );
  238. }
  239. #endif
  240. #endif