public static bool HitTestCore(HitChain hitTestHint, HitTestHint layoutHint, IEnumerable <RenderElement> hitTestIter) { switch (layoutHint) { default: { foreach (RenderElement renderE in hitTestIter) { if (renderE.HitTestCore(hitTestHint)) { return(true); } } } return(false); case HitTestHint.HorizontalRowNonOverlap: { foreach (RenderElement renderE in hitTestIter) { if (renderE.HitTestCore(hitTestHint)) { return(true); } else if (renderE.Right < hitTestHint.TestPointX) { //hitTestIter iterates from right to left //so in this case (eg. we have whitespace between each elem) //this should be stop return(false); } } } return(false); case HitTestHint.VerticalColumnNonOverlap: { foreach (RenderElement renderE in hitTestIter) { if (renderE.HitTestCore(hitTestHint)) { return(true); } else if (renderE.Bottom < hitTestHint.TestPointY) { //hitTestIter iterates from bottom to top //so in this case (eg. we have whitespace between each elem) //this should be stop return(false); } } } return(false); } }
public static void DrawChildContent(HitTestHint hitTestHint, IEnumerable <RenderElement> drawingIter, DrawBoard d, UpdateArea updateArea) { int enter_canvas_x = d.OriginX; int enter_canvas_y = d.OriginY; switch (hitTestHint) { default: { foreach (RenderElement child in drawingIter) { if (child.IntersectsWith(updateArea) || !child.NeedClipArea) { //if the child not need clip //its children (if exist) may intersect int x = child.X; int y = child.Y; d.SetCanvasOrigin(enter_canvas_x + x, enter_canvas_y + y); updateArea.Offset(-x, -y); RenderElement.Render(child, d, updateArea); updateArea.Offset(x, y); } } //restore d.SetCanvasOrigin(enter_canvas_x, enter_canvas_y); } break; case HitTestHint.HorizontalRowNonOverlap: { bool found = false; foreach (RenderElement child in drawingIter) { if (child.IntersectsWith(updateArea)) { found = true; //if the child not need clip //its children (if exist) may intersect int x = child.X; int y = child.Y; d.SetCanvasOrigin(enter_canvas_x + x, enter_canvas_y + y); updateArea.Offset(-x, -y); RenderElement.Render(child, d, updateArea); updateArea.Offset(x, y); } else if (found) { break; } } //restore d.SetCanvasOrigin(enter_canvas_x, enter_canvas_y); } break; case HitTestHint.VerticalColumnNonOverlap: { bool found = false; foreach (RenderElement child in drawingIter) { if (child.IntersectsWith(updateArea)) { found = true; //if the child not need clip //its children (if exist) may intersect int x = child.X; int y = child.Y; d.SetCanvasOrigin(enter_canvas_x + x, enter_canvas_y + y); updateArea.Offset(-x, -y); RenderElement.Render(child, d, updateArea); updateArea.Offset(x, y); } else if (found) { break; } } d.SetCanvasOrigin(enter_canvas_x, enter_canvas_y); } break; } }