Chinaunix首页 | 论坛 | 博客
  • 博客访问: 195221
  • 博文数量: 30
  • 博客积分: 1571
  • 博客等级: 上尉
  • 技术积分: 363
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-28 11:42
文章分类

全部博文(30)

文章存档

2012年(6)

2011年(11)

2010年(13)

我的朋友

分类: LINUX

2010-05-08 15:56:47

缩放功能主要是设置 X_INCR、Y_INCR和通过 CMDR_1 发送bitblt指令的时候 CMDR_1 要设为2。
6410手册616~617页介绍line drawing的时候有介绍。也就是
 X_INCR = src_width/dst_width, Y_INCR = src_heigth/dst_heigth.
然后存储的格式是:   高 11位为整数部分,低11为小数部分。

具体计算X_INCR和Y_INCR的代码直接使用的wince驱动只的函数
u32 s3c_g2d_calculate_XY_incr_format(u32 uDividend, u32 uDivisor)
{
    int i;
    u32 uQuotient;
    u32 uUnderPoint=0;

//    printf("\nuDivend:%x(%d), uDivisor:%x(%d), uUnderPoint:%x(%d)", uDividend, uDividend, uDivisor, uDivisor,uUnderPoint, uUnderPoint);   

    if(uDivisor == 0)
    {
        uDivisor = 1;    //< this will prevent data abort. but result is incorrect.
    }

    uQuotient = (u32)(uDividend/uDivisor);

    uDividend -= (uQuotient * uDivisor);

    /// Now under point is calculated.
    for (i=0; i<12; i++)
    {
        uDividend <<= 1;
        uUnderPoint <<= 1;
       
        if (uDividend >= uDivisor)
        {
            uUnderPoint = uUnderPoint | 1;
            uDividend -= uDivisor;
        }
//        printf("\nuDivend:%x(%d), uDivisor:%x(%d), uUnderPoint:%x(%d)", uDividend, uDividend, uDivisor, uDivisor,uUnderPoint, uUnderPoint);
    }

    uUnderPoint = (uUnderPoint + 1) >> 1;

    return ( uUnderPoint | (uQuotient<<11) );
}

此外:要是缩放的倍率过小,也就是最后绘制的图片小于目的窗口的大小时,6410会用最右边或者最下边的像素点填充剩下的点。

旋转和alpha直接配置寄存器就OK了。代码如下:
void s3c_g2d_set_rotationmode(struct fb_info *info, S3C_G2D_ROT_TYPE rot_type)
{
    u32 tmp;
    s3c_g2d_check_fifo(1);

    tmp = __raw_readl(s3c_g2d_base + S3C_G2D_ROTATE_REG);
    tmp = (tmp&~0x3f) | rot_type;
    s3c_g2d_debug_reg(tmp, s3c_g2d_base + S3C_G2D_ROTATE_REG);
}

void s3c_g2d_set_alphamode(struct fb_info *info, int is_alpha, u8 alpha_val)
{
    u32 tmp;
    s3c_g2d_check_fifo(2);

    tmp = __raw_readl(s3c_g2d_base + S3C_G2D_ROP_REG);
    tmp &= ~S3C_G2D_ROP_REG_ABM_BITS;
    if (is_alpha)
    {
        tmp |= S3C_G2D_ROP_REG_ABM_REGISTER;
    }
    s3c_g2d_debug_reg(tmp, s3c_g2d_base + S3C_G2D_ROP_REG);

    tmp = __raw_readl(s3c_g2d_base + S3C_G2D_ALPHA_REG);
    tmp &= ~0xff;
    tmp |= (alpha_val&0xff);
    s3c_g2d_debug_reg(tmp, s3c_g2d_base + S3C_G2D_ALPHA_REG); 
}
阅读(2704) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~