查看: 1858|回复: 0
打印 上一主题 下一主题

享_ZLGGUI字体放大_函数

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-24 08:53:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个的效果是字体放大。ZLGGUI里,如果要多做几种字体显示的话,就会有好几个字体库,程序代码会越来越大。又不想做外部存储,这样要单独的写专门烧写flash的代码。

我想把点阵数据当图片处理。然后用图片处理的办法来放大它。

先试了一下在函数上改。没有研究算法,直接改出来的。
出来的效果还可以用,虽然很粗糙,但实现简单。分享上来接受大家批评

原来显示方式://        GUI_PutString72_72(20, 100,"ABCD");//需要一个72×72的库
修改后显示:        GUI_PutString24_24_AMP(10, 80,3,"ABCD");//一个24×24的就够了

原来的调用函数:
/**
* @brief  显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及'若为其它值,则显示' ')。
* @param  x 指定显示位置,x坐标
* @param  y 指定显示位置,y坐标
* @param  ch 要显示的ASCII码值。
* @retval None
*/
unsigned char GUI_PutChar24_24( int x, int y, unsigned char ch )
{
        unsigned char        font_dat;
        unsigned char        i, j;
        unsigned char        get_color_back[2], get_color_disp[2];
        bit                color_back_disp = 0;
        get_color_2( back_color[0], back_color[1], back_color[2], get_color_back );
        get_color_2( disp_color[0], disp_color[1], disp_color[2], get_color_disp );
/* 参数过滤 */
        if ( x > (GUI_LCM_XMAX - 24) )
                return(0);
        if ( y > (GUI_LCM_YMAX - 24) )
                return(0);
        for ( i = 0; i < sizeof(FONT24x24_TAB); i++ )
        {
                if ( FONT24x24_TAB[i] == ch )
                        break;
        }
        ch = i;
        Set_xywh( x, y, 24, 24 );                                       /* 画图区域 */
        for ( i = 0; i < 24; i++ )                                      /* 显示共32行 */
        {
                for ( j = 0; j < 24; j++ )                              /* 每行共24点 */
                {                                                       /* 若当前点为0、8、16点,读取点阵数据 */
                        /*
                         * font_dat =  0xff;
                         *        if( (j&0x07)==0 ) font_dat = FONT24x32[ch][i*3+j>>3];//+j>>3
                         */
                        if ( j == 0 )
                                font_dat = FONT24x24[ch][i * 3];        /* +j>>3 */
                        if ( j == 8 )
                                font_dat = FONT24x24[ch][i * 3 + 1];    /* +j>>3 */
                        if ( j == 16 )
                                font_dat = FONT24x24[ch][i * 3 + 2];    /* +j>>3 */
                        /* 设置相应的点为color或为back_color */
                        if ( (font_dat & DCB2HEX_TAB[j % 8]) == 0 )
                                color_back_disp = 0;
                        else color_back_disp = 1;
                        if ( color_back_disp == 1 )
                        {
                                write_DISPdata_16( get_color_disp[0], get_color_disp[1] );
                        }else{
                                write_DISPdata_16( get_color_back[0], get_color_back[1] );
                        }
                }
                y++; /* 指向下一行 */
        }
        return(1);
}


/**
* @brief  输出显示字符串(没有自动换行功能)。
* @param  x 指定显示位置,x坐标
* @param  y 指定显示位置,y坐标
* @param  str 要显示的ASCII码串。
* @retval None
*/
void GUI_PutString24_24( int x, int y, char *str )
{
        while ( 1 )
        {
                if ( (*str) == '\0' )
                        break;
                if ( GUI_PutChar24_24( x, y, *str++ ) == 0 )
                        break;
                x += 25; /* 下一个字符显示位置,y不变(即不换行) */
        }
}
复制代码


修改后的函数:就是在原函数上增加了一个amp做乘数
/**
* @brief  显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及'若为其它值,则显示' ')。
* @param  x 指定显示位置,x坐标
* @param  y 指定显示位置,y坐标
* @param  amp 放大倍数
* @param  ch 要显示的ASCII码值。
* @retval None
*/
unsigned char GUI_PutChar24_24_AMP( int x, int y, int amp, unsigned char ch )
{
        unsigned char        font_dat;
        unsigned char        i, j;
        unsigned char        get_color_back[2], get_color_disp[2];
        bit                color_back_disp = 0;
        get_color_2( back_color[0], back_color[1], back_color[2], get_color_back );
        get_color_2( disp_color[0], disp_color[1], disp_color[2], get_color_disp );
        /* 参数过滤 */
        if ( x > (GUI_LCM_XMAX - 24) )
                return(0);
        if ( y > (GUI_LCM_YMAX - 24) )
                return(0);
        for ( i = 0; i < sizeof(FONT24x24_TAB); i++ )
        {
                if ( FONT24x24_TAB[i] == ch )
                        break;
        }
        ch = i;
        Set_xywh( x, y, 24 * amp, 24 * amp );                           /* 画图区域 */
        for ( i = 0; i < (24 * amp); i++ )                              /* 显示共32行*/
        {
                for(j=0; j<(24*amp); j++) /* 每行共24点 */
        {                                                               /* 若当前点为0、8、16点,读取点阵数据 */
                /*
                 * font_dat =  0xff;
                 *        if( (j&0x07)==0 ) font_dat = FONT24x32[ch][i*3+j>>3];//+j>>3
                 */
                if ( j / amp == 0 )
                        font_dat = FONT24x24[ch][i / amp * 3];          /* +j>>3 */
                if ( j / amp == 8 )
                        font_dat = FONT24x24[ch][i / amp * 3 + 1];      /* +j>>3 */
                if ( j / amp == 16 )
                        font_dat = FONT24x24[ch][i / amp * 3 + 2];      /* +j>>3 */
                /* 设置相应的点为color或为back_color */
                if ( (font_dat & DCB2HEX_TAB[(j / amp) % 8]) == 0 )
                        color_back_disp = 0;
                else color_back_disp = 1;
                if ( color_back_disp == 1 )
                {
                        write_DISPdata_16( get_color_disp[0], get_color_disp[1] );
                }else{
                        write_DISPdata_16( get_color_back[0], get_color_back[1] );
                }
        }
        y++; /* 指向下一行 */
}


return(1);
}


/**
* @brief  输出显示字符串(没有自动换行功能)。自动放大
* @param  x 指定显示位置,x坐标
* @param  y 指定显示位置,y坐标
* @param  amp 放大倍数
* @param  str 要显示的ASCII码串。
* @retval None
*/
void GUI_PutString24_24_AMP( int x, int y, int amp, char *str )
{
        while ( 1 )
        {
                if ( (*str) == '\0' )
                        break;
                if ( GUI_PutChar24_24_AMP( x, y, amp, *str++ ) == 0 )
                        break;
                x += 25 * amp; /* 下一个字符显示位置,y不变(即不换行) */
        }
}
复制代码


显示效果:3倍放大转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表