public PdfSourceRect GetUnionRectangleWithNeighbour(int pageNumber) { CalculateCanvas(); PdfSourceRect pageRect = documentManager.GetPageRectGuess(pageNumber); PdfSourceRect pageRect2; if (PdfUtils.HorizontalPagePosition(PageLayoutMode, pageNumber) == 1) { pageRect2 = documentManager.GetPageRectGuess(pageNumber - 1); pageRect = pageRect.unionDouble(pageRect2); } else if (PdfUtils.HorizontalPagePosition(PageLayoutMode, pageNumber) == -1 && pageNumber + 1 < PageCount) { //unify with right neighbour if it exists pageRect2 = documentManager.GetPageRectGuess(pageNumber + 1); pageRect = pageRect.unionDouble(pageRect2); } else { pageRect = pageRect.Clone(); } pageRect.dX -= BorderSize; pageRect.dWidth += 2.0 * BorderSize; pageRect.dY -= BorderSize; pageRect.dHeight += 2.0 * BorderSize; return(pageRect); }
private void CalculateCanvas() { if (canvasDirty == TCanvasDirtyness.Clean) { return; } int start = 1, end = PageCount; //If we are in a mode which doesnt show all pages, we only need to go through the shown ones if (!PdfUtils.PageLayoutScrollingEnabled(PageLayoutMode)) { switch (PdfUtils.HorizontalPagePosition(PageLayoutMode, PageNo)) { case -1: { start = PageNo; end = Math.Min(PageNo + 1, end); //because PageNo + 1 doesn't necessarily exist in this case break; } case 0: { start = PageNo; end = PageNo; break; } case 1: { start = PageNo - 1; //pageNo-1 always exists in this case end = PageNo; break; } } } int changedPage = int.MaxValue; PdfSourceRect oldCanvasRect = _canvasRect.Clone(); bool entireCanvasDirty = (canvasDirty == TCanvasDirtyness.CanvasDirty); canvasDirty = TCanvasDirtyness.Clean; if (entireCanvasDirty) { _canvasRect.dWidth = 0.0; _canvasRect.dX = 0.0; } double offset = 0.0; int page = entireCanvasDirty ? start : Math.Max(start, GetNextRelevantPage(start, end)); for (; page <= end; page++) { PdfSourceRect rect = null; if (pagesToLoadExactly.Remove(page)) { Logger.LogInfo("page " + page + " was loaded exactly"); //load page exactly rect = documentManager.GetPageRect(page); } else { rect = documentManager.GetPageRectGuess(page); } int nPage; lock (newlyLoadedPagesLock) { nPage = newlyLoadedPages.FirstOrDefault(number => number >= start && number <= end); } if (!entireCanvasDirty && nPage > 1 && nPage < page) { //maybe the getting of pages has getted a page before this one (due to predictionAlgorithm). In this case, consider this page first page = nPage; rect = documentManager.GetPageRectGuess(page); } bool removed = false; lock (newlyLoadedPagesLock) { removed = newlyLoadedPages.Remove(page); } if (removed || entireCanvasDirty)//If the page is newly loaded, calculate its position exactly. Also if the entire canvas is dirty, calculate always { changedPage = Math.Min(changedPage, page); //position the page newly, knowing that its the first time we know its exact size switch (PdfUtils.HorizontalPagePosition(PageLayoutMode, page)) { case 0: { //place 1 page rect.dCenterX = 0.0; rect.dY = GetPreviousBottom(page, start, end) + _borderSize; if (rect.dX - _borderSize < _canvasRect.dX) { _canvasRect.dWidth += _canvasRect.dX - (rect.dX - _borderSize); _canvasRect.dX = rect.dX - _borderSize; } if (rect.dRight + _borderSize > _canvasRect.dRight) { _canvasRect.dWidth += rect.dRight + _borderSize - _canvasRect.dRight; } offset = rect.dBottom + _borderSize - GetNextTop(page, start, end); break; } case -1: { //place left page rect.dRight = 0.0 - _borderSize / 2.0; rect.dY = Math.Max(GetPreviousBottom(page, start, end), GetPreviousBottom(page - 1, start, end)) + _borderSize; if (rect.dX - _borderSize < _canvasRect.dX) { _canvasRect.dWidth += _canvasRect.dX - (rect.dX - _borderSize); _canvasRect.dX = rect.dX - _borderSize; } offset = rect.dY - GetNextTop(page, start, end); break; } default: { //place right page rect.dX = 0.0 + _borderSize / 2.0; rect.dY = documentManager.GetPageRectGuess(page - 1).dY; if (rect.dRight + _borderSize > _canvasRect.dRight) { _canvasRect.dWidth += rect.dRight + _borderSize - _canvasRect.dRight; } offset = Math.Max(GetPreviousBottom(page, start, end), rect.dBottom) + _borderSize - GetNextTop(page, start, end); break; } } } else { //Only pages that are not newly loaded make it here. Adjust their offset if (offset == 0.0) { //if there is no offset, we dont need to do anything until we hit a page that needs to be loaded anew page = GetNextRelevantPage(start, end); if (page == int.MaxValue) { break;//there is no more page to load -> stop iterating through pages } page--; continue; } rect.Offset(0.0, offset); } }//end for-loop //we have loaded and positioned all pages, now we only need to resize the canvas lock (newlyLoadedPagesLock) { if (newlyLoadedPages.Count == 0 && pagesToLoadExactly.Count == 0) { canvasDirty = TCanvasDirtyness.Clean; } } if (PdfUtils.HorizontalPagePosition(PageLayoutMode, end) == -1) { offset = documentManager.GetPageRectGuess(end).dBottom + _borderSize - _canvasRect.dBottom; } if (offset != 0.0) { _canvasRect.dHeight += offset; CanvasRectChanged(oldCanvasRect, _canvasRect, changedPage); } return; }