1. 缩放
CMD_SCALE –对目前的矩阵做一个缩放
#define ftCoCmdScale(sx, sy)\
{\
ftWrDispCmd(CMD_SCALE);\
ftWrDispCmd(sx);\
ftWrDispCmd(sy);\
}
参数sx、sy分别表示x轴、y轴方向上的缩放,等于缩放倍数乘以65536,例如X轴上放大为2倍,sx = 65536 * 2,Y轴上缩小到0.5倍,sy = 65536 * 0.5。
注意如果图片是要放大,定义handle时的BITMAP_SIZE和BITMAP_SIZE_H需要设置为放大后的大小,例如10x20的L 8格式图片,放大2倍,BITMAP_SIZE的值为10*2, 20*2。
在调用ftCoCmdScale前还需要写入命令CMD_LOADIDENTITY,后面还需要写入命令CMD_SETMATRIX。例程如下:
ftWrDispCmd(CMD_LOADIDENTITY);
ftCoCmdScale(0x10000 * 2, 0x10000);
ftWrDispCmd(CMD_SETMATRIX);
ftWrDispCmd(VERTEX2F(0 * 16 , 0 * 16));
下图中第一个对应上面代码的显示效果
第二张是Y轴放大2倍,这2张图片的handle定义时BITMAP_SIZE和BITMAP_SIZE_H是实际图片的大小,所以显示时有部分没有显示出来,第三张是X,Y轴都缩小为0.5,第四张是X,Y轴放大2倍。
如果显示完缩放图片后需要恢复原来的SCALE设定,可以增加命令SAVE_CONTEXT()和RESTORE_CONTEXT()实现,这样不会影响接下来的图片显示。
ftWrDispCmd(SAVE_CONTEXT());
ftWrDispCmd(CMD_LOADIDENTITY);
ftCoCmdScale(0x10000 * 2, 0x10000 * 2);
ftWrDispCmd(CMD_SETMATRIX);
ftWrDispCmd(VERTEX2F((LCD_WIDTH / 2 + 80) * 16, (LCD_HEIGHT / 2 - 30) * 16));
ftWrDispCmd(RESTORE_CONTEXT());
2. 旋转
CMD_ROTATE -将目前矩阵做旋转
#define ftCoCmdRotate(a)\
{\
ftWrDispCmd(CMD_ROTATE);\
ftWrDispCmd((int32_t)a * 65536 / 360)\
}
参数a是顺时针旋转的度数,旋转的原点是左顶点。其他使用方法和缩放类似。
ftWrDispCmd(SAVE_CONTEXT());
ftWrDispCmd(CMD_LOADIDENTITY);
ftCoCmdRotate(30);
ftWrDispCmd(CMD_SETMATRIX);
ftWrDispCmd(VERTEX2F((LCD_WIDTH / 2 - 150) * 16, (LCD_HEIGHT / 2 - 30) * 16));
ftWrDispCmd(RESTORE_CONTEXT());
如上图,图片旋转了30°,因为定义handle时是使用60x60的大小,所以部分显示丢失了。一般情况旋转并不是以左顶点旋转,应该是选择中心位置旋转,可以使用命令CMD_TRANSLATE重新设定旋转中心。
#define ftCoCmdTranslate(tx, ty)\
{\
ftWrDispCmd(CMD_TRANSLATE);\
ftWrDispCmd((int32_t)tx * 65536);\
ftWrDispCmd((int32_t)ty * 65536);\
}
上面的例子设定偏移后旋转,旋转完需要偏移回去,代码如下。
ftWrDispCmd(SAVE_CONTEXT());
ftWrDispCmd(CMD_LOADIDENTITY);
ftCoCmdTranslate(60 / 2, 60 / 2);
ftCoCmdRotate(30);
ftCoCmdTranslate(-60 / 2, -60 / 2);
ftWrDispCmd(CMD_SETMATRIX);
ftWrDispCmd(VERTEX2F((LCD_WIDTH / 2 + 80) * 16, (LCD_HEIGHT / 2 - 30) * 16));
ftWrDispCmd(RESTORE_CONTEXT());
这种方式适合本身图片是圆的情况,如果图片不是圆的还是会被切掉4个角,如下图
要解决这个问题,需要调整BITMAP_SIZE和BITMAP_SIZE_H的大小,并且要改变图片的坐标
ftWrDispCmd(BITMAP_HANDLE(HANDLE_HOME));
ftWrDispCmd(BITMAP_SOURCE(0));
ftWrDispCmd(BITMAP_LAYOUT(L4, 30, 60));
ftWrDispCmd(BITMAP_LAYOUT_H(30, 60));
ftWrDispCmd(BITMAP_SIZE(NEAREST, BORDER, BORDER, 60 * 2, 60 * 2));
ftWrDispCmd(BITMAP_SIZE_H(60 * 2, 60 * 2));
ftWrDispCmd(SAVE_CONTEXT());
ftWrDispCmd(CMD_LOADIDENTITY);
ftCoCmdTranslate(60, 60);
ftCoCmdRotate(45);
ftCoCmdTranslate(-30, -30);
ftWrDispCmd(CMD_SETMATRIX);
ftWrDispCmd(VERTEX2F((LCD_WIDTH / 2 + LCD_WIDTH / 8 - 20 - 30) * 16, (LCD_HEIGHT / 2 - 30 - 30) * 16));
ftWrDispCmd(RESTORE_CONTEXT());
还有一种方式是改变原图大小,让图片变为正方形,且宽度变为外切圆的直径,这样算法最简单,只是占用的存储空间变大。