diff --git a/uppsrc/CtrlCore/UtilX11.cpp b/uppsrc/CtrlCore/UtilX11.cpp index 8b03de89f..c7bda9ca3 100644 --- a/uppsrc/CtrlCore/UtilX11.cpp +++ b/uppsrc/CtrlCore/UtilX11.cpp @@ -33,7 +33,6 @@ Vector Subtract(const Vector& r1, const Vector& r2) return q; } - Vector Xor(const Vector& r1, const Vector& r2) { Vector is = Intersect(r1, r2); diff --git a/uppsrc/CtrlCore/X11Wnd.cpp b/uppsrc/CtrlCore/X11Wnd.cpp index ebf82dc9d..04c6c80f0 100644 --- a/uppsrc/CtrlCore/X11Wnd.cpp +++ b/uppsrc/CtrlCore/X11Wnd.cpp @@ -964,27 +964,7 @@ void Ctrl::Invalidate(XWindow& xw, const Rect& _r) GuiLock __; LTIMING("Invalidate"); LLOG("Invalidate " << UPP::Name(xw.ctrl) << " " << _r); - Vector inv; - Rect r = _r; - int ra = r.Width() * r.Height(); - for(int i = 0; i < xw.invalid.GetCount(); i++) { - const Rect& ir = xw.invalid[i]; - Rect ur = r | ir; - if(ur.Width() * ur.Height() < 2 * (ir.Width() * ir.Height() + ra)) - r = ur; - else - if(!r.Contains(xw.invalid[i])) - inv.Add(xw.invalid[i]); - } - Vector rs; - rs.Add(r); - for(int i = 0; i < inv.GetCount(); i++) { - bool ch = false; - Vector rs1 = Subtract(rs, inv[i], ch); - if(ch) rs = rs1; - } - inv.AppendPick(rs); - xw.invalid = inv; + AddRefreshRect(xw.invalid, _r); } void Ctrl::AddGlobalRepaint() diff --git a/uppsrc/Draw/Draw.h b/uppsrc/Draw/Draw.h index b6d8d1e6c..bdc4a78a5 100644 --- a/uppsrc/Draw/Draw.h +++ b/uppsrc/Draw/Draw.h @@ -792,6 +792,9 @@ Vector Intersect(const Vector& b, const Rect& a, bool& changed); void Subtract(Vector& rr, const Rect& sub); void Union(Vector& rr, const Rect& add); +void AddRefreshRect(Vector& invalid, const Rect& _r); + + void DrawRect(Draw& w, const Rect& rect, const Image& img, bool ralgn = false); //??? TODO void DrawRect(Draw& w, int x, int y, int cx, int cy, const Image& img, bool ra = false); diff --git a/uppsrc/Draw/DrawUtil.cpp b/uppsrc/Draw/DrawUtil.cpp index 218fa97dc..2359ea787 100644 --- a/uppsrc/Draw/DrawUtil.cpp +++ b/uppsrc/Draw/DrawUtil.cpp @@ -88,6 +88,31 @@ Vector Intersect(const Vector& b, const Rect& a, bool& changed) return result; } +void AddRefreshRect(Vector& invalid, const Rect& _r) +{ + Vector inv; + Rect r = _r; + int ra = r.Width() * r.Height(); + for(int i = 0; i < invalid.GetCount(); i++) { + const Rect& ir = invalid[i]; + Rect ur = r | ir; + if(ur.Width() * ur.Height() < 2 * (ir.Width() * ir.Height() + ra)) + r = ur; + else + if(!r.Contains(ir)) + inv.Add(ir); + } + Vector rs; + rs.Add(r); + for(int i = 0; i < inv.GetCount(); i++) { + bool ch = false; + Vector rs1 = Subtract(rs, inv[i], ch); + if(ch) rs = rs1; + } + inv.AppendPick(rs); + invalid = inv; +} + void DrawFatFrame(Draw& w, int x, int y, int cx, int cy, Color color, int n) { if(n < 0) { x += n;