?? xktv_ft.cpp
字號:
#ifndef XKTV_FT_CPP
#define XKTV_FT_CPP
//-----------------------------------------------------------------------------
#include "xktv_ft.hpp"//-----------------------------------------------------------------------------
xfont_ft::xfont_ft()
{
m_siz[0] = 32;
m_siz[1] = 0;
m_siz[2] = 16;
m_siz[3] = 0;
zflag = -1;
iflag = -1; m_hv = 'h';
m_err = FT_Init_FreeType(&m_lib);
}
xfont_ft::~xfont_ft()
{
FT_Done_FreeType( m_lib);
}
//-----------------------------------------------------------------------------
void xfont_ft::free_font()
{
int i;
for(i = 0; i < 8; i ++)
{
if(m_ffn[i] != "")
{
FT_Done_Face(m_fac[i]);
m_ffn[i] = "";
}
}
m_ok = 0;
zflag = -1;
iflag = -1;
}
long xfont_ft::load_file(char * font_file)
{
int i;
for(i = 0; i < 8; i ++)
{
if(m_ffn[i] == "")
{
m_err =
FT_New_Face(m_lib, font_file,
0, (m_fac + i));
if(m_err == 0)
{
m_ffn[i] = font_file;
zflag = -1;
iflag = -1;
return(++ m_ok);
}
}
}
return(0);
}
void xfont_ft::draw_orie(char * Draw_Orie)
{
switch(*Draw_Orie)
{
case 'h':
case 'H':
m_hv = 'h';
m_mat.xx = 0x10000L;
m_mat.xy = 0;
m_mat.yx = 0;
m_mat.yy = 0x10000L;
break;
case 'v':
case 'V':
m_hv = 'v';
m_mat.xx = 0;
m_mat.xy = 0 + 0x10000L;
m_mat.yx = 0 - 0x10000L;
m_mat.yy = 0;
break;
}
}
//-----------------------------------------------------------------------------
void xfont_ft::draw_text(wchar_t * text, long color, xrect * rect)
{ if(text_init_size()== 0)
return;
if(draw_init_rect(rect))
return;
if(g_vga->get_b() == 2)
draw_text_cb16(text, color);
else
if(g_vga->get_b() == 4)
draw_text_cb32(text, color);
}
void xfont_ft::draw_tiny(wchar_t * text, long color, xrect * rect)
{
if(tiny_init_size()== 0)
return;
if(draw_init_rect(rect))
return;
if(g_vga->get_b() == 2)
draw_text_cb16(text, color);
else
if(g_vga->get_b() == 4)
draw_text_cb32(text, color);
}
//-----------------------------------------------------------------------------
void xfont_ft::draw_text(wchar_t * text, long color, xrect * rect,
long dx, long dy)
{
trect = * rect;
trect.lx += dx;
trect.ty += dy;
xfont_ft::draw_text(text, color, &trect);
}
void xfont_ft::draw_tiny(wchar_t * text, long color, xrect * rect,
long dx, long dy)
{
trect = * rect;
trect.lx += dx;
trect.ty += dy;
xfont_ft::draw_tiny(text, color, &trect);
}
//-----------------------------------------------------------------------------
void xfont_ft::char_size(long wsize, long hsize)
{
m_siz[0] = wsize;
m_siz[1] = hsize;
zflag = -1;
iflag = -1;
}
void xfont_ft::tiny_size(long wsize, long hsize)
{
m_siz[2] = wsize;
m_siz[3] = hsize;
zflag = -1;
iflag = -1;
}
//-----------------------------------------------------------------------------
long xfont_ft::text_init_size()
{
if(zflag != 0)
{
int i;
for(i = 0; i < m_ok; i ++)
{
if(m_ffn[i] != "")
{
FT_Set_Pixel_Sizes(m_fac[i],
m_siz[0], m_siz[1]);
}
}
if(m_siz[0] == 0)
{
m_siz[4] = m_siz[1];
m_siz[5] = m_siz[1];
}
else
if(m_siz[1] == 0)
{
m_siz[4] = m_siz[0];
m_siz[5] = m_siz[0];
}
else
{ m_siz[4] = m_siz[0];
m_siz[5] = m_siz[1];
}
zflag = 0;
}
return(1);
}
long xfont_ft::tiny_init_size()
{
if(zflag != 1)
{
int i;
for(i = 0; i < m_ok; i ++)
{
if(m_ffn[i] != "")
{
FT_Set_Pixel_Sizes(m_fac[i],
m_siz[2], m_siz[3]);
}
}
if(m_siz[2] == 0)
{
m_siz[4] = m_siz[3];
m_siz[5] = m_siz[3];
}
else
if(m_siz[3] == 0)
{
m_siz[4] = m_siz[2];
m_siz[5] = m_siz[2];
}
else
{ m_siz[4] = m_siz[2];
m_siz[5] = m_siz[3];
}
zflag = 1;
}
return(1);
}
//-----------------------------------------------------------------------------
long xfont_ft::find_char_code( wchar_t wchr)
{
int i;
if((i = FT_Get_Char_Index(m_fac[iflag],wchr)) != 0)
return(i);
for(iflag = 0; iflag < m_ok; iflag ++)
if((i = FT_Get_Char_Index(m_fac[iflag],wchr)) != 0)
return(i);
return(iflag = 0);
}
long xfont_ft::draw_init_rect( xrect * rect )
{
mrect.ty = (rect->ty < 0) ? 0 : rect->ty;
mrect.lx = (rect->lx < 0) ? 0 : rect->lx;
mrect.by = (rect->by < (g_vga->get_h() - 1))
? rect->by : (g_vga->get_h() - 1);
mrect.rx = (rect->rx < (g_vga->get_w() - 1))
? rect->rx : (g_vga->get_w() - 1);
if(mrect.ty >= mrect.by)
return(1);
if(mrect.lx >= mrect.rx)
return(1);
if(m_hv == 'h')
{
m_vec.x = (rect->lx << 6);
m_vec.y = (g_vga->get_h() - rect->by) << 6; m_vec.y += (m_siz[5] << 3);
}
else
{ m_vec.x = (rect->lx << 6);
m_vec.y = (g_vga->get_h() - rect->ty) << 6; m_vec.x += (m_siz[5] << 3);
}
return(0);
}
//-----------------------------------------------------------------------------
void xfont_ft::draw_text_cb16( wchar_t *ptext, long vcolor )
{
#ifdef XKTV_FB_555
color = CL_AF | rgb_888TO555(vcolor);
#endif//XKTV_FB_555
#ifdef XKTV_FB_565
color = CL_AF | rgb_888TO565(vcolor);
#endif//XKTV_FB_565
int ichar;
for(iflag = 0; *ptext != 0; ptext ++)
{
ichar = find_char_code(*ptext);
FT_Set_Transform(
m_fac[iflag],&m_mat,&m_vec);
FT_Load_Glyph(m_fac[iflag],ichar,0);
FT_Render_Glyph(m_fac[iflag]->glyph,
FT_RENDER_MODE_NORMAL);
draw_char_cb16();
m_vec.x += m_fac[iflag]->glyph->advance.x;
m_vec.y += m_fac[iflag]->glyph->advance.y;
}
}
void xfont_ft::draw_text_cb32( wchar_t *ptext, long vcolor )
{
r = ((vcolor & 0x00ff0000)>> 16);
g = ((vcolor & 0x0000ff00)>> 8);
b = ((vcolor & 0x000000ff)>> 0);
color = vcolor;
int ichar;
for(iflag = 0; *ptext != 0; ptext ++)
{
ichar = find_char_code(*ptext);
FT_Set_Transform(
m_fac[iflag],&m_mat,&m_vec);
FT_Load_Glyph(m_fac[iflag],ichar,0);
FT_Render_Glyph(m_fac[iflag]->glyph,
FT_RENDER_MODE_NORMAL);
draw_char_cb32();
m_vec.x += m_fac[iflag]->glyph->advance.x;
m_vec.y += m_fac[iflag]->glyph->advance.y;
}
}
//-----------------------------------------------------------------------------
void xfont_ft::draw_char_cb16()
{ int t = m_fac[iflag]->glyph->bitmap_top; int l = m_fac[iflag]->glyph->bitmap_left; int h = m_fac[iflag]->glyph->bitmap.rows; int w = m_fac[iflag]->glyph->bitmap.width; int n = g_vga->get_l(); t = g_vga->get_h() - t; unsigned char * p_dst = g_vga->get_cache(l,t); unsigned char * p_src = m_fac[iflag]->glyph-> bitmap.buffer; unsigned char * t_dst; unsigned char * t_src;
unsigned long a_key;
unsigned long b_key; int dy, dx; int sy, sx; for(dy = t, sy = 0; sy < h; dy ++, sy ++) { t_dst = p_dst; t_src = p_src; p_dst += n; p_src += w; if(dy < mrect.ty || dy > mrect.by) continue; for(dx = l, sx = 0; sx < w; dx ++, sx ++) { if(dx < mrect.lx || dx > mrect.rx) { t_src += 1; t_dst += 2; continue; } if(*t_src < 16) { t_src += 1; t_dst += 2; } else
if(*t_dst < 64)
{
*((short *)t_dst) =
rgb565_1m3(color,*((short*)t_dst));
t_src += 1; t_dst += 2;
}
else
if(*t_dst < 128)
{
*((short *)t_dst) =
rgb565_mix(color,*((short*)t_dst));
t_src += 1; t_dst += 2;
}
else
{ *((short *)t_dst) = color;
t_src += 1; t_dst += 2;
} } }
}
//-----------------------------------------------------------------------------
void xfont_ft::draw_char_cb32()
{ int t = m_fac[iflag]->glyph->bitmap_top; int l = m_fac[iflag]->glyph->bitmap_left; int h = m_fac[iflag]->glyph->bitmap.rows; int w = m_fac[iflag]->glyph->bitmap.width; int n = g_vga->get_l(); t = g_vga->get_h() - t; unsigned char * p_dst = g_vga->get_cache(l,t); unsigned char * p_src = m_fac[iflag]->glyph-> bitmap.buffer; unsigned char * t_dst; unsigned char * t_src; int dy, dx; int sy, sx; for(dy = t, sy = 0; sy < h; dy ++, sy ++) { t_dst = p_dst; t_src = p_src; p_dst += n; p_src += w; if(dy < mrect.ty || dy > mrect.by) continue; for(dx = l, sx = 0; sx < w; dx ++, sx ++) { if(dx < mrect.lx || dx > mrect.rx) { t_src += 1; t_dst += 4; continue; } if(*t_src < 5) { t_src += 1; t_dst += 4; } else { *t_dst += (*t_src *(b - *t_dst)) >> 8;
t_dst += 1;
*t_dst += (*t_src *(g - *t_dst)) >> 8;
t_dst += 1;
*t_dst += (*t_src *(r - *t_dst)) >> 8;
t_dst += 2; t_src += 1; } } }
}
//-----------------------------------------------------------------------------
#endif//XKTV_FT_CPP
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -