public static void FreeFlowRelocator(FlowReLocator flowRelocator)
 {
     flowRelocator.sourceLines            = null;
     flowRelocator.isMultiLine            = false;
     flowRelocator.currentRelocatorLineId = 0;
     flowRelocator.currentLine            = null;
     flowRelocator.isFirstRunOfLine       = true;
     FlowFeeder.FreeFlowFeeder(flowRelocator.feeder);
     flowRelocator.feeder = null;
     flowRelcatorStack.Push(flowRelocator);
 }
        static Size ReCalculateContentSizeHorizontalFlow(EditableTextFlowLayer layer)
        {
            if (layer.lineCollection == null)
            {
                return(Size.Empty);
            }

            FlowFeeder flowFeeder = FlowFeeder.GetNewFlowFeeder();

            flowFeeder.Load(layer);
            int         curX               = 0;
            int         curY               = 0;
            bool        lastestIsBlock     = false;
            int         maxHeightInRow     = 0;
            int         maxWidth           = 0;
            int         curY_fromTop       = 0;
            bool        isFirstRunOfLine   = true;
            int         childCount         = 0;
            EditableRun lastNotNullElement = null;

            while (flowFeeder.Read())
            {
                EditableRun currentRun = flowFeeder.CurrentRun;
                if (currentRun != null)
                {
#if DEBUG
                    vinv_dbug_BeginSetElementBound(currentRun);
#endif

                    lastNotNullElement = currentRun;
                    childCount++;
                    if (lastestIsBlock || currentRun.IsBlockElement)
                    {
                        curX = 0;
                        if (!isFirstRunOfLine)
                        {
                            if (maxWidth < curX)
                            {
                                maxWidth = curX;
                            }

                            curY           = curY_fromTop + maxHeightInRow;
                            curY_fromTop   = curY;
                            maxHeightInRow = 0;
                        }
                        lastestIsBlock = currentRun.IsBlockElement;
                        if (lastestIsBlock)
                        {
                        }
                        if (!currentRun.HasCalculatedSize)
                        {
                            EditableRun.InnerTextRunTopDownReCalculateContentSize(currentRun);
                        }
#if DEBUG
                        else
                        {
                            vinv_dbug_WriteInfo(dbugVisitorMessage.SKIP, currentRun);
                        }
#endif
                        int v_ds_height = currentRun.Height;
                        if (v_ds_height > maxHeightInRow)
                        {
                            maxHeightInRow = v_ds_height;
                        }
                        curX += currentRun.Width;
                        if (curX > maxWidth)
                        {
                            maxWidth = curX;
                        }
                        isFirstRunOfLine = false;
                    }
                    else
                    {
                        lastestIsBlock = currentRun.IsBlockElement;
                        if (!currentRun.HasCalculatedSize)
                        {
                            EditableRun.InnerTextRunTopDownReCalculateContentSize(currentRun);
                        }
#if DEBUG
                        else
                        {
                            vinv_dbug_WriteInfo(dbugVisitorMessage.SKIP, currentRun);
                        }
#endif
                        int v_ds_height = currentRun.Height;
                        if (v_ds_height > maxHeightInRow)
                        {
                            maxHeightInRow = v_ds_height;
                        }
                        curX += currentRun.Width;
                        if (curX > maxWidth)
                        {
                            maxWidth = curX;
                        }
                        isFirstRunOfLine = false;
                    }
#if DEBUG
                    vinv_dbug_EndSetElementBound(currentRun);
#endif
                }
                else
                {
                    if (flowFeeder.ReadState == 1)
                    {
                        curX           = 0;
                        curY           = curY_fromTop + maxHeightInRow;
                        curY_fromTop   = curY;
                        maxHeightInRow = 0;
                    }
                    else
                    {
                    }
                }
            }


            if (curX > maxWidth)
            {
                maxWidth = curX;
            }

            int finalHeight = curY_fromTop + maxHeightInRow;
            FlowFeeder.FreeFlowFeeder(flowFeeder);
            return(new Size(maxWidth, finalHeight));
        }