|
本帖最后由 ancientcc 于 2017-3-16 21:41 编辑
生成一个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)。
此函数一般用块移,而且假设块移过程不会发生缩放。
|
|