SDL中文论坛
标题:
操作矩形
[打印本页]
作者:
ancientcc
时间:
2017-3-16 21:40
标题:
操作矩形
本帖最后由 ancientcc 于 2017-3-16 21:41 编辑
(, 下载次数: 1775)
上传
点击文件名下载附件
生成一个clip_rect和(dstrect->x, dstrect->y, srcw, srch)的交叉矩形
SDL_Rect calculate_screen_clip_rect(int srcw, int srch, const SDL_Rect& clip_rect, SDL_Rect* dstrect)
复制代码
参数
srcw、srch
贴图宽度、高度。dstrect表标贴图,但那里只表示左上角。对应图中A、B、C的宽度、高度。
clip_rect
背景矩形。
dstrect
贴图左上角坐标。它和clip_rect属于同一个坐标系。未使用dstrect的w、h,原因是此函数代码抄自SDL_UpperBlit,后者未使用w、h。
返回值
一个clip_rect和(dstrect->x, dstrect->y, srcw, srch)的交叉矩形
范例
void tcanvas::blit(const tcontrol& widget, texture& surf, SDL_Rect rect, ...)
{
SDL_Rect r = rect;
SDL_RenderGetClipRect(get_renderer(), &clip_rect);
clip_rect = calculate_screen_clip_rect(w_, h_, clip_rect, &r);
......
}
复制代码
Rose使用的裁剪是逐片断操作中的Scissor,为减少片断着色器执行次数,给它的矩形要尽可能准确。代码中clip_rect、r都是窗口坐标系中的坐标。
注释
函数生成一个矩形,该矩形的宽度、高度来自clip_rect和贴图交叉部分,见图中划线部分。左上角是偏移(不是dstrect的左上角+偏移),像图中A是(dx, dy)。对贴图C,它不须要偏移,因而生成的左上角就(0, 0)。
此函数一般用块移,而且假设块移过程不会发生缩放。
欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/)
Powered by Discuz! X3.3