diff --git a/Makefile b/Makefile
index 1556b31b0..ce64f0778 100644
--- a/Makefile
+++ b/Makefile
@@ -63,12 +63,13 @@ THIRDPARTYLIBS := $(MUPDFLIBDIR)/libfreetype.a \
LUALIB := $(LUADIR)/src/liblua.a
-kpdfview: kpdfview.o einkfb.o pdf.o blitbuffer.o input.o util.o ft.o lfs.o $(MUPDFLIBS) $(THIRDPARTYLIBS) $(LUALIB) $(DJVULIBS) djvu.o
+kpdfview: kpdfview.o einkfb.o pdf.o blitbuffer.o drawcontext.o input.o util.o ft.o lfs.o $(MUPDFLIBS) $(THIRDPARTYLIBS) $(LUALIB) $(DJVULIBS) djvu.o
$(CC) -lm -ldl -lpthread $(EMU_LDFLAGS) -lstdc++ \
kpdfview.o \
einkfb.o \
pdf.o \
blitbuffer.o \
+ drawcontext.o \
input.o \
util.o \
ft.o \
@@ -86,7 +87,7 @@ einkfb.o input.o: %.o: %.c
ft.o: %.o: %.c
$(CC) -c $(KPDFREADER_CFLAGS) -I$(FREETYPEDIR)/include $< -o $@
-kpdfview.o pdf.o blitbuffer.o util.o: %.o: %.c
+kpdfview.o pdf.o blitbuffer.o util.o drawcontext.o: %.o: %.c
$(CC) -c $(KPDFREADER_CFLAGS) -I$(LFSDIR)/src $< -o $@
djvu.o: %.o: %.c
diff --git a/filechooser.lua b/filechooser.lua
index ae24642c2..9e909198d 100644
--- a/filechooser.lua
+++ b/filechooser.lua
@@ -52,8 +52,11 @@ function FileChooser:readdir()
if lfs.attributes(self.path.."/"..f, "mode") == "directory" and f ~= "." and not (f==".." and self.path=="/") and not string.match(f, "^%.[^.]") then
--print(self.path.." -> adding: '"..f.."'")
table.insert(self.dirs, f)
- elseif string.match(f, ".+%.[pP][dD][fF]$") or string.match(f, ".+%.[dD][jJ][vV][uU]$") then
- table.insert(self.files, f)
+ else
+ local file_type = string.lower(string.match(f, ".+%.([^.]+)") or "")
+ if file_type == "djvu" or file_type == "pdf" or file_type == "xps" or file_type == "cbz" then
+ table.insert(self.files, f)
+ end
end
end
--@TODO make sure .. is sortted to the first item 16.02 2012
diff --git a/pdf.c b/pdf.c
index 33c8b0720..9f4935420 100644
--- a/pdf.c
+++ b/pdf.c
@@ -16,14 +16,13 @@
along with this program. If not, see .
*/
#include
-#include
#include "blitbuffer.h"
#include "drawcontext.h"
#include "pdf.h"
typedef struct PdfDocument {
- pdf_document *xref;
+ fz_document *xref;
fz_context *context;
int pages;
} PdfDocument;
@@ -33,39 +32,48 @@ typedef struct PdfPage {
#ifdef USE_DISPLAY_LIST
fz_display_list *list;
#endif
- pdf_page *page;
+ fz_page *page;
PdfDocument *doc;
} PdfPage;
static int openDocument(lua_State *L) {
- const char *filename = luaL_checkstring(L, 1);
- const char *password = luaL_checkstring(L, 2);
+ char *filename = strdup(luaL_checkstring(L, 1));
+ char *password = strdup(luaL_checkstring(L, 2));
+ int cachesize = luaL_optint(L, 3, 64 << 20); // 64 MB limit default
+
PdfDocument *doc = (PdfDocument*) lua_newuserdata(L, sizeof(PdfDocument));
luaL_getmetatable(L, "pdfdocument");
lua_setmetatable(L, -2);
- doc->context = fz_new_context(NULL, NULL, 64 << 20); // 64MB limit
+ doc->context = fz_new_context(NULL, NULL, cachesize);
fz_try(doc->context) {
- doc->xref = pdf_open_document(doc->context, filename);
+ doc->xref = fz_open_document(doc->context, filename);
}
fz_catch(doc->context) {
+ free(filename);
+ free(password);
return luaL_error(L, "cannot open PDF file <%s>", filename);
}
- if(pdf_needs_password(doc->xref)) {
- if (!pdf_authenticate_password(doc->xref, password))
+ if(fz_needs_password(doc->xref)) {
+ if (!fz_authenticate_password(doc->xref, password)) {
+ free(filename);
+ free(password);
return luaL_error(L, "cannot authenticate");
+ }
}
- doc->pages = pdf_count_pages(doc->xref);
+ doc->pages = fz_count_pages(doc->xref);
+ free(filename);
+ free(password);
return 1;
}
static int closeDocument(lua_State *L) {
PdfDocument *doc = (PdfDocument*) luaL_checkudata(L, 1, "pdfdocument");
if(doc->xref != NULL) {
- pdf_close_document(doc->xref);
+ fz_close_document(doc->xref);
doc->xref = NULL;
}
if(doc->context != NULL) {
@@ -126,7 +134,7 @@ static int getTableOfContent(lua_State *L) {
int count = 1;
PdfDocument *doc = (PdfDocument*) luaL_checkudata(L, 1, "pdfdocument");
- ol = pdf_load_outline(doc->xref);
+ ol = fz_load_outline(doc->xref);
lua_newtable(L);
walkTableOfContent(L, ol, &count, 0);
@@ -150,7 +158,7 @@ static int openPage(lua_State *L) {
lua_setmetatable(L, -2);
fz_try(doc->context) {
- page->page = pdf_load_page(doc->xref, pageno - 1);
+ page->page = fz_load_page(doc->xref, pageno - 1);
}
fz_catch(doc->context) {
return luaL_error(L, "cannot open page #%d", pageno);
@@ -190,7 +198,7 @@ static int getUsedBBox(lua_State *L) {
fz_try(page->doc->context) {
dev = fz_new_bbox_device(page->doc->context, &result);
- pdf_run_page(page->doc->xref, page->page, dev, ctm, NULL);
+ fz_run_page(page->doc->xref, page->page, dev, ctm, NULL);
}
fz_always(page->doc->context) {
fz_free_device(dev);
@@ -210,7 +218,7 @@ static int getUsedBBox(lua_State *L) {
static int closePage(lua_State *L) {
PdfPage *page = (PdfPage*) luaL_checkudata(L, 1, "pdfpage");
if(page->page != NULL) {
- pdf_free_page(page->doc->xref, page->page);
+ fz_free_page(page->doc->xref, page->page);
page->page = NULL;
}
return 0;
@@ -241,13 +249,13 @@ static int drawPage(lua_State *L) {
fz_device *tdev;
fz_try(page->doc->context) {
tdev = fz_new_trace_device(page->doc->context);
- pdf_run_page(page->doc->xref, page->page, tdev, ctm, NULL);
+ fz_run_page(page->doc->xref, page->page, tdev, ctm, NULL);
}
fz_always(page->doc->context) {
fz_free_device(tdev);
}
#endif
- pdf_run_page(page->doc->xref, page->page, dev, ctm, NULL);
+ fz_run_page(page->doc->xref, page->page, dev, ctm, NULL);
fz_free_device(dev);
if(dc->gamma >= 0.0) {
@@ -263,7 +271,7 @@ static int drawPage(lua_State *L) {
bbptr[x] = (((pmptr[x*2 + 1] & 0xF0) >> 4) | (pmptr[x*2] & 0xF0)) ^ 0xFF;
}
if(bb->w & 1) {
- bbptr[x] = pmptr[x*2] & 0xF0;
+ bbptr[x] = (pmptr[x*2] & 0xF0) ^ 0xF0;
}
bbptr += bb->pitch;
pmptr += bb->w;
diff --git a/reader.lua b/reader.lua
index 0d1ad86fc..382177ab9 100755
--- a/reader.lua
+++ b/reader.lua
@@ -36,7 +36,7 @@ longopts = {
}
function openFile(filename)
- local file_type = string.lower(string.match(filename, ".+%.(.+)"))
+ local file_type = string.lower(string.match(filename, ".+%.([^.]+)"))
if file_type == "djvu" then
if DJVUReader:open(filename) then
page_num = DJVUReader.settings:readsetting("last_page") or 1
@@ -44,7 +44,7 @@ function openFile(filename)
reader_settings:savesetting("lastfile", filename)
return DJVUReader:inputloop()
end
- elseif file_type == "pdf" then
+ elseif file_type == "pdf" or file_type == "xps" or file_type == "cbz" then
if PDFReader:open(filename,"") then -- TODO: query for password
page_num = PDFReader.settings:readsetting("last_page") or 1
PDFReader:goto(tonumber(page_num))