Thanks to visit codestin.com
Credit goes to github.com

Skip to content

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)