Skip to content
This repository was archived by the owner on Nov 10, 2025. It is now read-only.

Commit 9f7c87c

Browse files
committed
Fix rendering with maximum zoom
Improve fit policies Make setSwipeVertical() private Update PdfiumAndroid Update README and CHANGELOG Update version
1 parent 624bcea commit 9f7c87c

File tree

9 files changed

+67
-48
lines changed

9 files changed

+67
-48
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 3.0.0-beta.2 (2017-11-15)
2+
* Fix rendering with maximum zoom
3+
* Improve fit policies
4+
* Update PdfiumAndroid to 1.8.1
5+
16
## 3.0.0-beta.1 (2017-11-12)
27
* Add support for documents with different page sizes
38
* Add support for links

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,20 @@ Licensed under Apache License 2.0.
1616
* Add support for defining page fit policy (fit width, height or both)
1717
* Update sample.pdf to contain different page sizes
1818

19+
3.0.0-beta.2 fixes rendering with maximum zoom, improves fit policies and updates PdfiumAndroid to 1.8.1
20+
1921
## Changes in 3.0 API
2022
* Replaced `Contants.PRELOAD_COUNT` with `PRELOAD_OFFSET`
2123
* Removed `PDFView#fitToWidth()` (variant without arguments)
2224
* Removed `Configurator#invalidPageColor(int)` method as invalid pages are not rendered
2325
* Removed page size parameters from `OnRenderListener#onInitiallyRendered(int)` method, as document may have different page sizes
26+
* Removed `PDFView#setSwipeVertical()` method
2427

2528
## Installation
2629

2730
Add to _build.gradle_:
2831

29-
`compile 'com.github.barteksc:android-pdf-viewer:3.0.0-beta.1'`
32+
`compile 'com.github.barteksc:android-pdf-viewer:3.0.0-beta.2'`
3033

3134
or if you want to use more stable version:
3235

android-pdf-viewer/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ ext {
1313
siteUrl = 'https://github.com/barteksc/AndroidPdfViewer'
1414
gitUrl = 'https://github.com/barteksc/AndroidPdfViewer.git'
1515

16-
libraryVersion = '3.0.0-beta.1'
16+
libraryVersion = '3.0.0-beta.2'
1717

1818
developerId = 'barteksc'
1919
developerName = 'Bartosz Schiller'
@@ -32,13 +32,13 @@ android {
3232
minSdkVersion 11
3333
targetSdkVersion 25
3434
versionCode 1
35-
versionName "3.0.0-beta.1"
35+
versionName "3.0.0-beta.2"
3636
}
3737

3838
}
3939

4040
dependencies {
41-
compile 'com.github.barteksc:pdfium-android:1.8.0'
41+
compile 'com.github.barteksc:pdfium-android:1.8.1'
4242
}
4343

4444
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/DragPinchManager.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,10 @@ private boolean checkLinkTapped(float x, float y) {
8888
SizeF pageSize = pdfFile.getScaledPageSize(page, pdfView.getZoom());
8989
int pageX, pageY;
9090
if (pdfView.isSwipeVertical()) {
91-
pageX = (int) getSecondaryOffset(pageSize);
91+
pageX = (int) pdfFile.getSecondaryPageOffset(page, pdfView.getZoom());
9292
pageY = (int) pdfFile.getPageOffset(page, pdfView.getZoom());
9393
} else {
94-
pageY = (int) getSecondaryOffset(pageSize);
94+
pageY = (int) pdfFile.getSecondaryPageOffset(page, pdfView.getZoom());
9595
pageX = (int) pdfFile.getPageOffset(page, pdfView.getZoom());
9696
}
9797
for (PdfDocument.Link link : pdfFile.getPageLinks(page)) {
@@ -105,16 +105,6 @@ private boolean checkLinkTapped(float x, float y) {
105105
return false;
106106
}
107107

108-
private float getSecondaryOffset(SizeF pageSize) {
109-
if (pdfView.isSwipeVertical()) {
110-
float maxWidth = pdfView.pdfFile.getMaxPageWidth();
111-
return (pdfView.toCurrentScale(maxWidth) - pageSize.getWidth()) / 2; //x
112-
} else {
113-
float maxHeight = pdfView.pdfFile.getMaxPageHeight();
114-
return (pdfView.toCurrentScale(maxHeight) - pageSize.getHeight()) / 2; //y
115-
}
116-
}
117-
118108
@Override
119109
public boolean onDoubleTap(MotionEvent e) {
120110
if (!pdfView.isDoubletapEnabled()) {

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,7 @@ public boolean isSwipeEnabled() {
10141014
return enableSwipe;
10151015
}
10161016

1017-
public void setSwipeVertical(boolean swipeVertical) {
1017+
private void setSwipeVertical(boolean swipeVertical) {
10181018
this.swipeVertical = swipeVertical;
10191019
}
10201020

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PagesLoader.java

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,24 @@ private void getPageColsRows(GridSize grid, int pageIndex) {
6969
grid.cols = MathUtils.ceil(1f / partWidth);
7070
}
7171

72-
private Holder getPageAndCoordsByOffset(Holder holder, GridSize grid, float offset, boolean endOffset) {
73-
float fixOffset = -MathUtils.max(offset, 0);
74-
holder.page = pdfView.pdfFile.getPageAtOffset(fixOffset, pdfView.getZoom());
72+
private Holder getPageAndCoordsByOffset(Holder holder, GridSize grid, float localXOffset,
73+
float localYOffset, boolean endOffset) {
74+
float fixedXOffset = -MathUtils.max(localXOffset, 0);
75+
float fixedYOffset = -MathUtils.max(localYOffset, 0);
76+
float offset = pdfView.isSwipeVertical() ? fixedYOffset : fixedXOffset;
77+
holder.page = pdfView.pdfFile.getPageAtOffset(offset, pdfView.getZoom());
7578
getPageColsRows(grid, holder.page);
7679
SizeF scaledPageSize = pdfView.pdfFile.getScaledPageSize(holder.page, pdfView.getZoom());
7780
float rowHeight = scaledPageSize.getHeight() / grid.rows;
7881
float colWidth = scaledPageSize.getWidth() / grid.cols;
7982
float row, col;
83+
float secondaryOffset = pdfView.pdfFile.getSecondaryPageOffset(holder.page, pdfView.getZoom());
8084
if (pdfView.isSwipeVertical()) {
81-
row = Math.abs(fixOffset - pdfView.pdfFile.getPageOffset(holder.page, pdfView.getZoom())) / rowHeight;
82-
col = xOffset / colWidth;
85+
row = Math.abs(fixedYOffset - pdfView.pdfFile.getPageOffset(holder.page, pdfView.getZoom())) / rowHeight;
86+
col = MathUtils.min(fixedXOffset - secondaryOffset, 0) / colWidth;
8387
} else {
84-
col = Math.abs(fixOffset - pdfView.pdfFile.getPageOffset(holder.page, pdfView.getZoom())) / colWidth;
85-
row = yOffset / rowHeight;
88+
col = Math.abs(fixedXOffset - pdfView.pdfFile.getPageOffset(holder.page, pdfView.getZoom())) / colWidth;
89+
row = MathUtils.min(fixedYOffset - secondaryOffset, 0) / rowHeight;
8690
}
8791

8892
if (endOffset) {
@@ -104,17 +108,14 @@ private void calculatePartSize(GridSize grid) {
104108

105109
private void loadVisible() {
106110
int parts = 0;
107-
float firstOffset, lastOffset;
108-
if (pdfView.isSwipeVertical()) {
109-
firstOffset = -yOffset;
110-
lastOffset = -yOffset - pdfView.getHeight();
111-
} else {
112-
firstOffset = -xOffset;
113-
lastOffset = -xOffset - pdfView.getWidth();
114-
}
115111
float scaledPreloadOffset = preloadOffset * pdfView.getZoom();
116-
getPageAndCoordsByOffset(firstHolder, firstGrid, firstOffset + scaledPreloadOffset, false);
117-
getPageAndCoordsByOffset(lastHolder, lastGrid, lastOffset - scaledPreloadOffset + 1, true);
112+
float firstXOffset = -xOffset + scaledPreloadOffset;
113+
float lastXOffset = -xOffset - pdfView.getWidth() - scaledPreloadOffset;
114+
float firstYOffset = -yOffset + scaledPreloadOffset;
115+
float lastYOffset = -yOffset - pdfView.getHeight() - scaledPreloadOffset;
116+
117+
getPageAndCoordsByOffset(firstHolder, firstGrid, firstXOffset, firstYOffset, false);
118+
getPageAndCoordsByOffset(lastHolder, lastGrid, lastXOffset, lastYOffset, true);
118119

119120
for (int i = firstHolder.page; i <= lastHolder.page; i++) {
120121
loadThumbnail(i);
@@ -127,6 +128,8 @@ private void loadVisible() {
127128
parts += loadPageEnd(firstHolder, firstGrid, CACHE_SIZE - parts);
128129
} else if (page == lastHolder.page && pagesCount > 1) {
129130
parts += loadPageStart(lastHolder, lastGrid, CACHE_SIZE - parts);
131+
} else if(pagesCount == 1) {
132+
parts += loadPageCenter(firstHolder, lastHolder, firstGrid, CACHE_SIZE - parts);
130133
} else {
131134
getPageColsRows(middleGrid, page);
132135
parts += loadWholePage(page, middleGrid, CACHE_SIZE - parts);
@@ -145,6 +148,16 @@ private int loadWholePage(int page, GridSize grid, int nbOfPartsLoadable) {
145148
return loadPage(page, 0, grid.rows - 1, 0, grid.cols - 1, nbOfPartsLoadable);
146149
}
147150

151+
/**
152+
* When only part of one page is visible
153+
*
154+
* @return loaded parts count
155+
*/
156+
private int loadPageCenter(Holder firstHolder, Holder lastHolder, GridSize grid, int nbOfPartsLoadable) {
157+
calculatePartSize(grid);
158+
return loadPage(firstHolder.page, firstHolder.row, lastHolder.row, firstHolder.col, lastHolder.col, nbOfPartsLoadable);
159+
}
160+
148161
/**
149162
* When only end of page is visible
150163
*

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ public float getDocLen(float zoom) {
175175
return documentLength * zoom;
176176
}
177177

178+
/** Get primary page offset, that is Y for vertical scroll and X for horizontal scroll */
178179
public float getPageOffset(int pageIndex, float zoom) {
179180
int docPage = documentPage(pageIndex);
180181
if (docPage < 0) {
@@ -183,6 +184,18 @@ public float getPageOffset(int pageIndex, float zoom) {
183184
return pageOffsets.get(pageIndex) * zoom;
184185
}
185186

187+
/** Get secondary page offset, that is X for vertical scroll and Y for horizontal scroll */
188+
public float getSecondaryPageOffset(int pageIndex, float zoom) {
189+
SizeF pageSize = getPageSize(pageIndex);
190+
if (isVertical) {
191+
float maxWidth = getMaxPageWidth();
192+
return zoom * (maxWidth - pageSize.getWidth()) / 2; //x
193+
} else {
194+
float maxHeight = getMaxPageHeight();
195+
return zoom * (maxHeight - pageSize.getHeight()) / 2; //y
196+
}
197+
}
198+
186199
public int getPageAtOffset(float offset, float zoom) {
187200
int currentPage = 0;
188201
for (float off : pageOffsets) {
@@ -216,18 +229,15 @@ public boolean openPage(int pageIndex) throws PageRenderingException {
216229
}
217230
}
218231

219-
public boolean isVertical() {
220-
return isVertical;
232+
public boolean pageHasError(int pageIndex) {
233+
int docPage = documentPage(pageIndex);
234+
return !openedPages.get(docPage, false);
221235
}
222236

223-
public boolean renderPageBitmap(Bitmap bitmap, int pageIndex, Rect bounds, boolean annotationRendering) {
237+
public void renderPageBitmap(Bitmap bitmap, int pageIndex, Rect bounds, boolean annotationRendering) {
224238
int docPage = documentPage(pageIndex);
225-
if (!openedPages.get(docPage, false)) {
226-
return false;
227-
}
228239
pdfiumCore.renderPageBitmap(pdfDocument, bitmap, docPage,
229240
bounds.left, bounds.top, bounds.width(), bounds.height(), annotationRendering);
230-
return true;
231241
}
232242

233243
public PdfDocument.Meta getMetaData() {

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/RenderingHandler.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ private PagePart proceed(RenderingTask renderingTask) throws PageRenderingExcept
9393
int w = Math.round(renderingTask.width);
9494
int h = Math.round(renderingTask.height);
9595

96-
if (w == 0 || h == 0) {
96+
if (w == 0 || h == 0 || pdfFile.pageHasError(renderingTask.page)) {
9797
return null;
9898
}
9999

@@ -106,10 +106,8 @@ private PagePart proceed(RenderingTask renderingTask) throws PageRenderingExcept
106106
}
107107
calculateBounds(w, h, renderingTask.bounds);
108108

109-
boolean success = pdfFile.renderPageBitmap(render, renderingTask.page, roundedRenderBounds, renderingTask.annotationRendering);
110-
if (!success) {
111-
render.eraseColor(Color.GRAY);
112-
}
109+
pdfFile.renderPageBitmap(render, renderingTask.page, roundedRenderBounds, renderingTask.annotationRendering);
110+
113111
return new PagePart(renderingTask.page, render,
114112
renderingTask.bounds, renderingTask.thumbnail,
115113
renderingTask.cacheOrder);

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ public SizeF getOptimalMaxHeightPageSize() {
6363
private void calculateMaxPages() {
6464
switch (fitPolicy) {
6565
case HEIGHT:
66-
optimalMaxWidthPageSize = fitHeight(originalMaxWidthPageSize, viewSize.getHeight());
6766
optimalMaxHeightPageSize = fitHeight(originalMaxHeightPageSize, viewSize.getHeight());
6867
heightRatio = optimalMaxHeightPageSize.getHeight() / originalMaxHeightPageSize.getHeight();
68+
optimalMaxWidthPageSize = fitHeight(originalMaxWidthPageSize, originalMaxWidthPageSize.getHeight() * heightRatio);
6969
break;
7070
case BOTH:
7171
SizeF localOptimalMaxWidth = fitBoth(originalMaxWidthPageSize, viewSize.getWidth(), viewSize.getHeight());
@@ -77,9 +77,9 @@ private void calculateMaxPages() {
7777
widthRatio = optimalMaxWidthPageSize.getWidth() / originalMaxWidthPageSize.getWidth();
7878
break;
7979
default:
80-
optimalMaxHeightPageSize = fitWidth(originalMaxHeightPageSize, viewSize.getWidth());
8180
optimalMaxWidthPageSize = fitWidth(originalMaxWidthPageSize, viewSize.getWidth());
8281
widthRatio = optimalMaxWidthPageSize.getWidth() / originalMaxWidthPageSize.getWidth();
82+
optimalMaxHeightPageSize = fitWidth(originalMaxHeightPageSize, originalMaxHeightPageSize.getWidth() * widthRatio);
8383
break;
8484
}
8585
}

0 commit comments

Comments
 (0)