private static void ProcessPotentialMergeBlock(ref int i) { if (TryClassifyAsSymbol(blocks[i])) { return; } TextBlock mergePreviousBlock = null; bool isPreviousMergeValid = TryMergeToPreviousBlock(i, ref mergePreviousBlock); TextBlock mergeNextBlock = null; bool isNextMergeValid = TryMergeToNextBlock(i, ref mergeNextBlock, ref isPreviousMergeValid); if (isPreviousMergeValid && isNextMergeValid) { DetermineMergeDirection(i, mergePreviousBlock, ref isPreviousMergeValid, mergeNextBlock, ref isNextMergeValid); } if (isPreviousMergeValid) { JoinPreviousMergeBlockToListBlock(ref i, mergePreviousBlock); return; } if (isNextMergeValid) { JoinNextMergeBlockToListBlock(i, mergeNextBlock); return; } if (!isHorizontalText) { if (VerticalTextProjection.GetMaxWidthPostionPercentToNeightbor(blocks, i) > VerticalTextProjection.MARK_WIDTH_POSITION_PERCENT) { var lineIndex = blocks[i].LineIndex; var avgGapIntra = VerticalTextProjection.AvgGapIntraChars[lineIndex]; if (lineIndex == blocks[i - 1].LineIndex && blocks[i].Top - blocks[i - 1].Bottom <= avgGapIntra && mergePreviousBlock != null) { JoinPreviousMergeBlockToListBlock(ref i, mergePreviousBlock); return; } else if (lineIndex == blocks[i + 1].LineIndex && blocks[i + 1].Top - blocks[i].Bottom <= avgGapIntra && mergeNextBlock != null) { JoinNextMergeBlockToListBlock(i, mergeNextBlock); return; } } } isPreviousMerge = false; }
private static float CaluculateValidGap(int blockIndex, char text) { if (isHorizontalText) { float avgGap = HorizontalTextProjection.AvgGapBlocks[blocks[blockIndex].LineIndex]; float percent = HorizontalTextProjection.GetMaxHeightPostionPercentToNeightbor(blocks, blockIndex); if (text == '、' || text == 'l' || text == 'ノ') { if (percent > HorizontalTextProjection.MARK_HEIGH_POSITION_PERCENT) { return(2f * avgGap); } } else if (text == 'し') { return((float)Math.Ceiling(avgGap * 2f)); } else if (percent > HorizontalTextProjection.MARK_HEIGH_POSITION_PERCENT) { return(1.5f * avgGap); } return(avgGap); } else { float percent = VerticalTextProjection.GetMaxWidthPostionPercentToNeightbor(blocks, blockIndex); if (percent > VerticalTextProjection.MARK_WIDTH_POSITION_PERCENT) { return(VerticalTextProjection.AvgGapBlocks[blocks[blockIndex].LineIndex] * 1.5f); } else { return(VerticalTextProjection.AvgGapBlocks[blocks[blockIndex].LineIndex]); } } }