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))