缩放功能主要是设置 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);
}
阅读(2720) | 评论(0) | 转发(0) |