+IntrusiveList draw_clip;
+STATIC_INIT(draw_clip) { draw_clip = IL_NEW(); }
+CLASS(ClipFrame, Object)
+ ATTRIB(ClipFrame, clip_shift, vector, '0 0 0');
+ ATTRIB(ClipFrame, clip_scale, vector, '0 0 0');
+ENDCLASS(ClipFrame)
+
+void _draw_SetClip(vector o, vector s)
+{
+ ClipFrame prev = IL_PEEK(draw_clip);
+ if (prev) {
+ o.x = bound(prev.clip_shift.x, o.x, prev.clip_shift.x + prev.clip_scale.x);
+ o.y = bound(prev.clip_shift.y, o.y, prev.clip_shift.y + prev.clip_scale.y);
+ s.x = bound(0, s.x, prev.clip_scale.x - (o.x - prev.clip_shift.x));
+ s.y = bound(0, s.y, prev.clip_scale.y - (o.y - prev.clip_shift.y));
+ }
+ ClipFrame e = NEW(ClipFrame);
+ e.clip_shift = o;
+ e.clip_scale = s;
+ IL_PUSH(draw_clip, e);
+ drawsetcliparea(o.x, o.y, s.x, s.y);
+}
+