1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 02:39:23 +02:00
git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@988 6a642e6f-84f6-412e-ac94-c4a38d5a04b0
This commit is contained in:
Nikolay Pultsin 2009-06-12 23:51:34 +00:00
parent 4a7b74d9b4
commit f89c7c64a0
13 changed files with 202 additions and 46 deletions

View file

@ -1 +1 @@
<!ENTITY FBReaderVersion "0.5.6">
<!ENTITY FBReaderVersion "0.5.7">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.geometerplus.zlibrary.ui.android" android:versionCode="506" android:versionName="0.5.6">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.geometerplus.zlibrary.ui.android" android:versionCode="507" android:versionName="0.5.7">
<uses-sdk android:minSdkVersion="1"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

View file

@ -32,7 +32,7 @@ import org.geometerplus.zlibrary.text.model.*;
public class BookReader {
public final BookModel Model;
private ZLTextModel myCurrentTextModel = null;
private ZLTextWritableModel myCurrentTextModel = null;
private boolean myTextParagraphExists = false;
@ -111,7 +111,7 @@ public class BookReader {
}
public final void beginParagraph(byte kind) {
final ZLTextModel textModel = myCurrentTextModel;
final ZLTextWritableModel textModel = myCurrentTextModel;
if (textModel != null) {
textModel.createParagraph(kind);
final byte[] stack = myKindStack;
@ -139,7 +139,7 @@ public class BookReader {
}
private final void insertEndParagraph(byte kind) {
final ZLTextModel textModel = myCurrentTextModel;
final ZLTextWritableModel textModel = myCurrentTextModel;
if ((textModel != null) && mySectionContainsRegularContents) {
int size = textModel.getParagraphsNumber();
if ((size > 0) && (textModel.getParagraph(size-1).getKind() != kind)) {
@ -170,11 +170,11 @@ public class BookReader {
}
public final void setMainTextModel() {
myCurrentTextModel = Model.BookTextModel;
myCurrentTextModel = (ZLTextWritableModel)Model.BookTextModel;
}
public final void setFootnoteTextModel(String id) {
myCurrentTextModel = Model.getFootnoteModel(id);
myCurrentTextModel = (ZLTextWritableModel)Model.getFootnoteModel(id);
}
public final void addData(char[] data) {
@ -268,7 +268,7 @@ public class BookReader {
}
public final void addHyperlinkLabel(String label) {
final ZLTextModel textModel = myCurrentTextModel;
final ZLTextWritableModel textModel = myCurrentTextModel;
if (textModel != null) {
int paragraphNumber = textModel.getParagraphsNumber();
if (myTextParagraphExists) {
@ -338,7 +338,7 @@ public class BookReader {
setReference(contentsParagraphNumber, myCurrentTextModel, referenceNumber);
}
public final void setReference(int contentsParagraphNumber, ZLTextModel textModel, int referenceNumber) {
public final void setReference(int contentsParagraphNumber, ZLTextWritableModel textModel, int referenceNumber) {
final TOCTree contentsTree = Model.TOCTree;
if (contentsParagraphNumber < contentsTree.getSize()) {
contentsTree.getTree(contentsParagraphNumber).setReference(
@ -364,7 +364,7 @@ public class BookReader {
}
public final void addImageReference(String ref, short vOffset) {
final ZLTextModel textModel = myCurrentTextModel;
final ZLTextWritableModel textModel = myCurrentTextModel;
if (textModel != null) {
mySectionContainsRegularContents = true;
if (myTextParagraphExists) {

View file

@ -136,7 +136,7 @@ public final class FBReader extends ZLApplication {
if (book == null) {
book = Library.Instance().getRecentBook();
}
if (book == null) {
if ((book == null) || !book.File.exists()) {
book = Book.getByFile(Library.Instance().getHelpFile());
}
openBookInternal(book, null);

View file

@ -25,6 +25,7 @@ import org.geometerplus.zlibrary.core.application.ZLApplication;
import org.geometerplus.zlibrary.core.util.ZLColor;
import org.geometerplus.zlibrary.core.view.ZLPaintContext;
import org.geometerplus.zlibrary.core.library.ZLibrary;
import org.geometerplus.zlibrary.text.model.ZLTextModel;
import org.geometerplus.zlibrary.text.view.*;
import org.geometerplus.fbreader.bookmodel.FBTextKind;
@ -38,6 +39,11 @@ public final class FBView extends ZLTextView {
myReader = reader;
}
public void setModel(ZLTextModel model) {
myIsManualScrollingActive = false;
super.setModel(model);
}
final void doShortScroll(boolean forward) {
if (!moveHyperlinkPointer(forward)) {
scrollPage(forward, ZLTextView.ScrollingMode.SCROLL_LINES, 1);

View file

@ -0,0 +1,113 @@
/*
* Copyright (C) 2007-2009 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.fbreader.formats.pdb;
import java.io.*;
public abstract class HuffdicDecompressor {
public static int decompress(InputStream stream, byte[] targetBuffer, int compressedSize) throws IOException {
final byte[] sourceBuffer = new byte[compressedSize];
if (stream.read(sourceBuffer) != compressedSize) {
return 0;
}
int sourceIndex = 0;
int targetIndex = 0;
int count0 = 0;
int count1 = 0;
int count2 = 0;
int count3 = 0;
try {
while (true) {
final byte token = sourceBuffer[sourceIndex++];
switch (token) {
default:
++count0;
targetBuffer[targetIndex++] = token;
break;
case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8:
++count1;
System.arraycopy(sourceBuffer, sourceIndex, targetBuffer, targetIndex, token);
sourceIndex += token;
targetIndex += token;
break;
case -64: case -63: case -62: case -61:
case -60: case -59: case -58: case -57:
case -56: case -55: case -54: case -53:
case -52: case -51: case -50: case -49:
case -48: case -47: case -46: case -45:
case -44: case -43: case -42: case -41:
case -40: case -39: case -38: case -37:
case -36: case -35: case -34: case -33:
case -32: case -31: case -30: case -29:
case -28: case -27: case -26: case -25:
case -24: case -23: case -22: case -21:
case -20: case -19: case -18: case -17:
case -16: case -15: case -14: case -13:
case -12: case -11: case -10: case -9:
case -8: case -7: case -6: case -5:
case -4: case -3: case -2: case -1:
++count2;
targetBuffer[targetIndex++] = ' ';
targetBuffer[targetIndex++] = (byte)(token ^ 0x80);
break;
case -128: case -127: case -126: case -125:
case -124: case -123: case -122: case -121:
case -120: case -119: case -118: case -117:
case -116: case -115: case -114: case -113:
case -112: case -111: case -110: case -109:
case -108: case -107: case -106: case -105:
case -104: case -103: case -102: case -101:
case -100: case -99: case -98: case -97:
case -96: case -95: case -94: case -93:
case -92: case -91: case -90: case -89:
case -88: case -87: case -86: case -85:
case -84: case -83: case -82: case -81:
case -80: case -79: case -78: case -77:
case -76: case -75: case -74: case -73:
case -72: case -71: case -70: case -69:
case -68: case -67: case -66: case -65:
++count3;
final int N = ((token & 0x3F) << 8) + (sourceBuffer[sourceIndex++] & 0xFF);
int copyLength = (N & 7) + 3;
int srcIndex = targetIndex - (N >> 3);
if (targetIndex >= srcIndex + copyLength) {
System.arraycopy(targetBuffer, srcIndex, targetBuffer, targetIndex, copyLength);
targetIndex += copyLength;
} else {
while (copyLength-- > 0) {
targetBuffer[targetIndex++] = targetBuffer[srcIndex++];
}
}
break;
}
}
} catch (Exception e) {
if (targetIndex > targetBuffer.length) {
targetIndex = targetBuffer.length;
}
}
return targetIndex;
}
}

View file

@ -30,17 +30,7 @@ class MobipocketStream extends PalmDocLikeStream {
super(file);
myFileSize = (int)file.size();
final int version = PdbUtil.readShort(myBase);
switch (version) {
case 1:
myIsCompressed = false;
break;
case 2:
myIsCompressed = true;
break;
default:
throw new IOException("Unsupported compression type: " + version);
}
myCompressionType = PdbUtil.readShort(myBase);
PdbUtil.skip(myBase, 6);
myMaxRecordIndex = Math.min(PdbUtil.readShort(myBase), myHeader.Offsets.length - 1);
final int maxRecordSize = PdbUtil.readShort(myBase);

View file

@ -26,7 +26,12 @@ import org.geometerplus.zlibrary.core.filesystem.ZLFile;
abstract class PalmDocLikeStream extends PdbStream {
protected int myMaxRecordIndex;
protected int myRecordIndex;
protected boolean myIsCompressed;
protected interface CompressionType {
int NONE = 1;
int DOC = 2;
int HUFFDIC = 17480;
}
protected int myCompressionType;
private final long myFileSize;
@ -54,11 +59,20 @@ abstract class PalmDocLikeStream extends PdbStream {
}
final short recordSize = (short)(nextOffset - currentOffset);
if (myIsCompressed) {
myBufferLength = (short)DocDecompressor.decompress(myBase, myBuffer, recordSize);
} else {
switch (myCompressionType) {
case CompressionType.NONE:
myBase.read(myBuffer, 0, recordSize);
myBufferLength = recordSize;
break;
case CompressionType.DOC:
myBufferLength = (short)DocDecompressor.decompress(myBase, myBuffer, recordSize);
break;
//case CompressionType.HUFFDIC:
// myBufferLength = (short)HuffdicDecompressor.decompress(myBase, myBuffer, recordSize);
// break;
default:
// Unsupported compression type
return false;
}
} catch (IOException e) {
return false;

View file

@ -61,7 +61,7 @@ abstract public class ZLView {
public abstract int getScrollbarThumbPosition(int viewPage);
public abstract int getScrollbarThumbLength(int viewPage);
final public void scrollTo(int viewPage, int shift) {
public final void scrollTo(int viewPage, int shift) {
ZLViewWidget viewWidget = ZLApplication.Instance().getViewWidget();
if (viewWidget != null) {
viewWidget.scrollTo(viewPage, shift);

View file

@ -21,25 +21,12 @@ package org.geometerplus.zlibrary.text.model;
import java.util.ArrayList;
import org.geometerplus.zlibrary.core.image.ZLImageMap;
public interface ZLTextModel {
String getId();
int getParagraphsNumber();
ZLTextParagraph getParagraph(int index);
void createParagraph(byte kind);
void addControl(byte textKind, boolean isStart);
void addText(char[] text);
void addText(char[] text, int offset, int length);
void addControl(ZLTextForcedControlEntry entry);
void addHyperlinkControl(byte textKind, byte hyperlinkType, String id);
void addImage(String id, ZLImageMap imageMap, short vOffset);
void addFixedHSpace(short length);
void removeAllMarks();
ZLTextMark getFirstMark();
ZLTextMark getLastMark();

View file

@ -24,7 +24,7 @@ import org.geometerplus.zlibrary.core.util.*;
import org.geometerplus.zlibrary.core.image.ZLImageMap;
public final class ZLTextPlainModel implements ZLTextModel {
public final class ZLTextPlainModel implements ZLTextWritableModel {
private final String myId;
private int[] myStartEntryIndices;

View file

@ -0,0 +1,35 @@
/*
* Copyright (C) 2007-2009 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.zlibrary.text.model;
import org.geometerplus.zlibrary.core.image.ZLImageMap;
public interface ZLTextWritableModel extends ZLTextModel {
void createParagraph(byte kind);
void addControl(byte textKind, boolean isStart);
void addText(char[] text);
void addText(char[] text, int offset, int length);
void addControl(ZLTextForcedControlEntry entry);
void addHyperlinkControl(byte textKind, byte hyperlinkType, String id);
void addImage(String id, ZLImageMap imageMap, short vOffset);
void addFixedHSpace(short length);
}

View file

@ -61,10 +61,14 @@ public abstract class ZLTextView extends ZLTextViewBase {
mySelectionModel = new ZLTextSelectionModel(this);
}
public final void setModel(ZLTextModel model) {
public void setModel(ZLTextModel model) {
ZLTextParagraphCursorCache.clear();
myModel = model;
myCurrentPage.reset();
myPreviousPage.reset();
myNextPage.reset();
setScrollingActive(false);
if (myModel != null) {
final int paragraphsNumber = myModel.getParagraphsNumber();
if (paragraphsNumber > 0) {
@ -74,8 +78,6 @@ public abstract class ZLTextView extends ZLTextViewBase {
myTextSize[i + 1] = myTextSize[i] + myModel.getParagraphTextLength(i);
}
myCurrentPage.moveStartCursor(ZLTextParagraphCursor.cursor(myModel, 0));
myPreviousPage.reset();
myNextPage.reset();
}
}
}
@ -500,6 +502,9 @@ public abstract class ZLTextView extends ZLTextViewBase {
do {
resetTextStyle();
final ZLTextParagraphCursor paragraphCursor = result.getParagraphCursor();
if (paragraphCursor == null) {
break;
}
final int wordIndex = result.getElementIndex();
applyControls(paragraphCursor, 0, wordIndex);
ZLTextLineInfo info = new ZLTextLineInfo(paragraphCursor, wordIndex, result.getCharIndex(), getTextStyle());
@ -996,6 +1001,9 @@ public abstract class ZLTextView extends ZLTextViewBase {
private int paragraphSize(ZLTextWordCursor cursor, boolean beforeCurrentPosition, int unit) {
final ZLTextParagraphCursor paragraphCursor = cursor.getParagraphCursor();
if (paragraphCursor == null) {
return 0;
}
final int endElementIndex =
beforeCurrentPosition ? cursor.getElementIndex() : paragraphCursor.getParagraphLength();
@ -1017,6 +1025,9 @@ public abstract class ZLTextView extends ZLTextViewBase {
private void skip(ZLTextWordCursor cursor, int unit, int size) {
final ZLTextParagraphCursor paragraphCursor = cursor.getParagraphCursor();
if (paragraphCursor == null) {
return;
}
final int endElementIndex = paragraphCursor.getParagraphLength();
resetTextStyle();