public void InvalidateGraphicArea(RenderElement fromElement, ref Rectangle elemClientRect, bool passSourceElem = false) { //total bounds = total bounds at level if (this.IsInRenderPhase) { return; } //-------------------------------------- //bubble up ,find global rect coord //and then merge to accumulate rect //int globalX = 0; //int globalY = 0; _hasRenderTreeInvalidateAccumRect = true;//*** Point globalPoint = new Point(); #if DEBUG //if (fromElement.dbug_ObjectNote == "panel") //{ //} int dbug_ncount = 0; dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, dbug_ncount, ">> :" + elemClientRect.ToString()); #endif for (; ;) { if (!fromElement.Visible) { #if DEBUG dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, 0, "EARLY-RET: "); #endif return; } else if (fromElement.BlockGraphicUpdateBubble) { #if DEBUG dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, 0, "BLOCKED2: "); #endif return; } #if DEBUG dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, dbug_ncount, ">> "); #endif globalPoint.Offset(fromElement.X, fromElement.Y); if (fromElement.MayHasViewport && passSourceElem) { elemClientRect.Offset(globalPoint); //**** #if DEBUG //TODO: review here if (fromElement.HasDoubleScrollableSurface) { //container.VisualScrollableSurface.WindowRootNotifyInvalidArea(elementClientRect); } #endif Rectangle elementRect = fromElement.RectBounds; elementRect.Offset(fromElement.ViewportLeft, fromElement.ViewportTop); if (fromElement.NeedClipArea) { elemClientRect.Intersect(elementRect); } globalPoint.X = -fromElement.ViewportLeft; //reset ? globalPoint.Y = -fromElement.ViewportTop; //reset ? } #if DEBUG //System.Diagnostics.Debug.WriteLine(elemClientRect.ToString()); #endif if (fromElement.IsTopWindow) { break; } else { #if DEBUG if (fromElement.dbugParentVisualElement == null) { dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, 0, "BLOCKED3: "); } #endif if (RenderElement.RequestInvalidateGraphicsNoti(fromElement)) { RenderElement.InvokeInvalidateGraphicsNoti(fromElement, !passSourceElem, elemClientRect); } IParentLink parentLink = fromElement.MyParentLink; if (parentLink == null) { return; } parentLink.AdjustLocation(ref globalPoint); //move up fromElement = parentLink.ParentRenderElement; if (fromElement == null) { return; } } passSourceElem = true; } #if DEBUG var dbugMyroot = this; if (dbugMyroot.dbugEnableGraphicInvalidateTrace && dbugMyroot.dbugGraphicInvalidateTracer != null) { while (dbug_ncount > 0) { dbugMyroot.dbugGraphicInvalidateTracer.PopElement(); dbug_ncount--; } } #endif //---------------------------------------- elemClientRect.Offset(globalPoint); if (elemClientRect.Top > this.Height || elemClientRect.Left > this.Width || elemClientRect.Bottom < 0 || elemClientRect.Right < 0) { //no intersect with #if DEBUG if (dbugMyroot.dbugEnableGraphicInvalidateTrace && dbugMyroot.dbugGraphicInvalidateTracer != null) { dbugMyroot.dbugGraphicInvalidateTracer.WriteInfo("ZERO-EEX"); dbugMyroot.dbugGraphicInvalidateTracer.WriteInfo("\r\n"); } #endif return; } //-------------------------------------------------------------------------------------------------- if (!_hasAccumRect) { _accumulateInvalidRect = elemClientRect; _hasAccumRect = true; } else { _accumulateInvalidRect = Rectangle.Union(_accumulateInvalidRect, elemClientRect); } #if DEBUG if (dbugMyroot.dbugEnableGraphicInvalidateTrace && dbugMyroot.dbugGraphicInvalidateTracer != null) { string state_str = "ACC: "; if (this.dbugNeedContentArrangement || this.dbugNeedReCalculateContentSize) { state_str = "!!" + state_str; } dbugMyroot.dbugGraphicInvalidateTracer.WriteInfo("ACC: " + _accumulateInvalidRect.ToString()); dbugMyroot.dbugGraphicInvalidateTracer.WriteInfo("\r\n"); } #endif }
internal static void InternalBubbleUpInvalidateGraphicArea(InvalidateGfxArgs args)//RenderElement fromElement, ref Rectangle elemClientRect, bool passSourceElem) { //total bounds = total bounds at level if (IsInRenderPhase) { ReleaseInvalidateGfxArgs(args); return; } //-------------------------------------- bool hasviewportOffset = args.Reason == InvalidateReason.ViewportChanged; int viewport_diffLeft = args.LeftDiff; int viewport_diffTop = args.TopDiff; //bubble up ,find global rect coord //and then merge to accumulate rect RenderElement fromElement = args.SrcRenderElement; Rectangle elemClientRect = args.Rect; bool passSourceElem = args.PassSrcElement; //HasViewportOffset = false; int globalPoint_X = 0; int globalPoint_Y = 0; #if DEBUG //if (fromElement.dbug_ObjectNote == "panel") //{ //} int dbug_ncount = 0; //dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, dbug_ncount, ">> :" + elemClientRect.ToString()); #endif for (; ;) { if (!fromElement.Visible) { #if DEBUG //dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, 0, "EARLY-RET: "); #endif ReleaseInvalidateGfxArgs(args); return; } else if (fromElement.BlockGraphicUpdateBubble) { #if DEBUG //dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, 0, "BLOCKED2: "); #endif ReleaseInvalidateGfxArgs(args); return; } #if DEBUG //dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, dbug_ncount, ">> "); #endif globalPoint_X += fromElement.X; globalPoint_Y += fromElement.Y; if (fromElement.MayHasViewport && passSourceElem) { elemClientRect.Offset(globalPoint_X, globalPoint_Y); //**** #if DEBUG //TODO: review here if (fromElement.HasDoubleScrollableSurface) { //container.VisualScrollableSurface.WindowRootNotifyInvalidArea(elementClientRect); } #endif Rectangle elementRect = fromElement.RectBounds; elementRect.Offset(fromElement.ViewportLeft, fromElement.ViewportTop); if (fromElement.NeedClipArea) { elemClientRect.Intersect(elementRect); } globalPoint_X = -fromElement.ViewportLeft; //reset ? globalPoint_Y = -fromElement.ViewportTop; //reset ? } #if DEBUG //System.Diagnostics.Debug.WriteLine(elemClientRect.ToString()); #endif if (fromElement.IsTopWindow) { break; } else { #if DEBUG if (fromElement.dbugParentVisualElement == null) { //dbugWriteStopGfxBubbleUp(fromElement, ref dbug_ncount, 0, "BLOCKED3: "); } #endif if (RenderElement.RequestInvalidateGraphicsNoti(fromElement)) { RenderElement.InvokeInvalidateGraphicsNoti(fromElement, !passSourceElem, elemClientRect); } IParentLink parentLink = fromElement.MyParentLink; if (parentLink == null) { ReleaseInvalidateGfxArgs(args); return; } parentLink.AdjustLocation(ref globalPoint_X, ref globalPoint_Y); //move up if ((fromElement = parentLink.ParentRenderElement) == null) { ReleaseInvalidateGfxArgs(args); return; } } passSourceElem = true; } //---------- //now we are on the top of root RootGraphic root = fromElement.GetRoot(); #if DEBUG RootGraphic dbugMyroot = root; if (dbugMyroot.dbugEnableGraphicInvalidateTrace && dbugMyroot.dbugGraphicInvalidateTracer != null) { while (dbug_ncount > 0) { dbugMyroot.dbugGraphicInvalidateTracer.PopElement(); dbug_ncount--; } } #endif //---------------------------------------- elemClientRect.Offset(globalPoint_X, globalPoint_Y); if (elemClientRect.Top > root.Height || elemClientRect.Left > root.Width || elemClientRect.Bottom < 0 || elemClientRect.Right < 0) { #if DEBUG if (dbugMyroot.dbugEnableGraphicInvalidateTrace && dbugMyroot.dbugGraphicInvalidateTracer != null) { dbugMyroot.dbugGraphicInvalidateTracer.WriteInfo("ZERO-EEX"); dbugMyroot.dbugGraphicInvalidateTracer.WriteInfo("\r\n"); } #endif ReleaseInvalidateGfxArgs(args); return; } //-------------------------------------------------------------------------------------------------- args.GlobalRect = elemClientRect; //if (root.HasViewportOffset = hasviewportOffset) //{ // root.ViewportDiffLeft = viewport_diffLeft; // root.ViewportDiffTop = viewport_diffTop; //} root.AddAccumRect(args); }