void Ctrl::DoPaint() { LLOG("@ DoPaint"); if(!PaintLock) { bool scroll = false; if(desktop) desktop->SyncScroll(); for(int i = 0; i < topctrl.GetCount(); i++) topctrl[i]->SyncScroll(); if((invalid.GetCount() || scroll) && desktop) { RemoveCursor(); RemoveCaret(); for(int phase = 0; phase < 2; phase++) { LLOG("DoPaint invalid phase " << phase); LDUMPC(invalid); SystemDraw painter; painter.Begin(); for(int i = 0; i < invalid.GetCount(); i++) { painter.RectPath(invalid[i]); AddUpdate(invalid[i]); } painter.Painter::Clip(); for(int i = topctrl.GetCount() - 1; i >= 0; i--) { Rect r = topctrl[i]->GetRect(); Rect ri = GetClipBound(invalid, r); if(!IsNull(ri)) { painter.Clipoff(r); topctrl[i]->UpdateArea(painter, ri - r.TopLeft()); painter.End(); Subtract(invalid, r); painter.ExcludeClip(r); } } Rect ri = GetClipBound(invalid, framebuffer.GetSize()); if(!IsNull(ri)) desktop->UpdateArea(painter, ri); } } } DoUpdate(); }
void Ctrl::CtrlPaint(SystemDraw& w, const Rect& clip) { GuiLock __; LEVELCHECK(w, this); LTIMING("CtrlPaint"); Rect rect = GetRect().GetSize(); Rect orect = rect.Inflated(overpaint); if(!IsShown() || orect.IsEmpty() || clip.IsEmpty() || !clip.Intersects(orect)) return; Ctrl *q; Rect view = rect; for(int i = 0; i < frame.GetCount(); i++) { LEVELCHECK(w, NULL); frame[i].frame->FramePaint(w, view); view = frame[i].view; } Rect oview = view.Inflated(overpaint); bool hasviewctrls = false; bool viewexcluded = false; for(q = firstchild; q; q = q->next) if(q->IsShown()) if(q->InFrame()) { if(!viewexcluded && IsTransparent() && q->GetRect().Intersects(view)) { w.Begin(); w.ExcludeClip(view); viewexcluded = true; } LEVELCHECK(w, q); Point off = q->GetRect().TopLeft(); w.Offset(off); q->CtrlPaint(w, clip - off); w.End(); } else hasviewctrls = true; if(viewexcluded) w.End(); DOLEVELCHECK; if(!oview.IsEmpty()) { if(oview.Intersects(clip) && w.IsPainting(oview)) { LEVELCHECK(w, this); if(overpaint) { w.Clip(oview); w.Offset(view.left, view.top); Paint(w); PaintCaret(w); w.End(); w.End(); } else { w.Clipoff(view); Paint(w); PaintCaret(w); w.End(); } } } if(hasviewctrls && !view.IsEmpty()) { Rect cl = clip & view; w.Clip(cl); for(q = firstchild; q; q = q->next) if(q->IsShown() && q->InView()) { LEVELCHECK(w, q); Rect qr = q->GetRect(); Point off = qr.TopLeft() + view.TopLeft(); Rect ocl = cl - off; if(ocl.Intersects(Rect(qr.GetSize()).Inflated(overpaint))) { w.Offset(off); q->CtrlPaint(w, cl - off); w.End(); } } w.End(); } }