| 1777 | } |
| 1778 | |
| 1779 | void DiffTextWindow::recalcWordWrapHelper(size_t wrapLineVectorSize, qint32 visibleTextWidth, size_t cacheListIdx) |
| 1780 | { |
| 1781 | if(d->m_bWordWrap) |
| 1782 | { |
| 1783 | if(ProgressProxy::wasCancelled()) |
| 1784 | return; |
| 1785 | if(visibleTextWidth < 0) |
| 1786 | visibleTextWidth = getVisibleTextAreaWidth(); |
| 1787 | else //TODO: Drop after line number area is converted to a QWidget. |
| 1788 | visibleTextWidth -= d->leftInfoWidth() * fontMetrics().horizontalAdvance('0'); |
| 1789 | LineType i; |
| 1790 | size_t wrapLineIdx = 0; |
| 1791 | size_t size = d->getDiff3LineVector()->size(); |
| 1792 | LineType firstD3LineIdx = SafeInt<LineType>(wrapLineVectorSize > 0 ? 0 : cacheListIdx * s_linesPerRunnable); |
| 1793 | LineType endIdx = SafeInt<LineType>(wrapLineVectorSize > 0 ? size : std::min<size_t>(firstD3LineIdx + s_linesPerRunnable, size)); |
| 1794 | std::vector<WrapLineCacheData>& wrapLineCache = d->m_wrapLineCacheList[cacheListIdx]; |
| 1795 | size_t cacheListIdx2 = 0; |
| 1796 | QTextLayout textLayout(QString(), font(), this); |
| 1797 | |
| 1798 | for(i = firstD3LineIdx; i < endIdx; ++i) |
| 1799 | { |
| 1800 | if(ProgressProxy::wasCancelled()) |
| 1801 | return; |
| 1802 | |
| 1803 | LineType linesNeeded = 0; |
| 1804 | if(wrapLineVectorSize == 0) |
| 1805 | { |
| 1806 | QString s = d->getString(i); |
| 1807 | textLayout.clearLayout(); |
| 1808 | textLayout.setText(s); |
| 1809 | d->prepareTextLayout(textLayout, visibleTextWidth); |
| 1810 | linesNeeded = textLayout.lineCount(); |
| 1811 | for(qint32 l = 0; l < linesNeeded; ++l) |
| 1812 | { |
| 1813 | QTextLine line = textLayout.lineAt(l); |
| 1814 | wrapLineCache.push_back(WrapLineCacheData(i, line.textStart(), line.textLength())); |
| 1815 | } |
| 1816 | } |
| 1817 | else if(wrapLineVectorSize > 0 && cacheListIdx2 < d->m_wrapLineCacheList.size()) |
| 1818 | { |
| 1819 | WrapLineCacheData* pWrapLineCache = d->m_wrapLineCacheList[cacheListIdx2].data(); |
| 1820 | size_t cacheIdx = 0; |
| 1821 | size_t clc = d->m_wrapLineCacheList.size() - 1; |
| 1822 | size_t cllc = d->m_wrapLineCacheList.back().size(); |
| 1823 | size_t curCount = d->m_wrapLineCacheList[cacheListIdx2].size() - 1; |
| 1824 | LineType l = 0; |
| 1825 | |
| 1826 | while(wrapLineIdx + l < d->m_diff3WrapLineVector.size() && (cacheListIdx2 < clc || (cacheListIdx2 == clc && cacheIdx < cllc)) && pWrapLineCache->d3LineIdx() <= i) |
| 1827 | { |
| 1828 | if(pWrapLineCache->d3LineIdx() == i) |
| 1829 | { |
| 1830 | Diff3WrapLine* pDiff3WrapLine = &d->m_diff3WrapLineVector[wrapLineIdx + l]; |
| 1831 | pDiff3WrapLine->wrapLineOffset = pWrapLineCache->textStart(); |
| 1832 | pDiff3WrapLine->wrapLineLength = pWrapLineCache->textLength(); |
| 1833 | ++l; |
| 1834 | } |
| 1835 | if(cacheIdx < curCount) |
| 1836 | { |
nothing calls this directly
no test coverage detected