diff --git a/lib/ComicBook.js b/lib/ComicBook.js index eab3853..f78b59b 100755 --- a/lib/ComicBook.js +++ b/lib/ComicBook.js @@ -12,6 +12,7 @@ - in double page mode the last page is not showing if it is a single page Nice 2 have: + - fix manga mode - jump to page? - enable menu items via config, allow for custom items - decouple controls from reader api @@ -89,7 +90,6 @@ function ComicBook(id, srcs, opts) { var pages = []; // array of preloaded Image objects var canvas; // the HTML5 canvas object var context; // the 2d drawing context - var buffer = 1; // image preload buffer level var loaded = []; // the images that have been loaded so far var scale = 1; // page zoom scale, 1 = 100% var is_double_page_spread = false; @@ -445,12 +445,7 @@ function ComicBook(id, srcs, opts) { this.showControl("loadingOverlay"); - //var srcs = this.srcs; - - if (no_pages < buffer) { buffer = no_pages; } // don't get stuck if the buffer level is higher than the number of pages - var i = pointer; // the current page counter for this method - //if (i - buffer >= 0) { i = i - buffer; } // start loading from the first requested page - buffer // I am using recursion instead of a forEach loop so that the next image is // only loaded when the previous one has completely finished @@ -479,14 +474,13 @@ function ComicBook(id, srcs, opts) { preload(i); } - //console.log(loaded[loaded.length-1]); - - // double page mode needs an extra page added to the buffer - padding = (options.displayMode === "double") ? 1 : 0; - - // start rendering the comic when the buffer level has been reached (FIXME: buggy, fails if trying to load the last couple of pages) - if (loaded[loaded.length-1] === pointer + buffer + padding || loaded[loaded.length-1] === page_requested) { + // double page mode needs an extra page added + var buffer = (options.displayMode === "double" && pointer < srcs.length-1) ? 1 : 0; + // start rendering the comic when the requested page is ready + if ($.inArray(pointer + buffer, loaded) !== -1 + || (typeof page_requested === "number" && $.inArray(page_requested + buffer, loaded)) + ) { // if the user is waiting for a page to be loaded, render that one instead of the default pointer if (typeof page_requested === "number") { pointer = page_requested-1; @@ -526,8 +520,11 @@ function ComicBook(id, srcs, opts) { var offsetW = 0, offsetH = 0; var page = ComicBook.prototype.getPage(pointer); - var page2 = ComicBook.prototype.getPage(pointer + 1); + var page2 = false; + if (options.displayMode === "double" && pointer < srcs.length-1) { + page2 = ComicBook.prototype.getPage(pointer + 1); + } if (typeof page !== "object") { throw new ComicBookException(ComicBookException.INVALID_PAGE_TYPE, typeof page); } @@ -539,7 +536,11 @@ function ComicBook(id, srcs, opts) { canvas.height = 0; // show double page spreads on a single page - is_double_page_spread = ((page.width > page.height || page2.width > page2.height) && options.displayMode === "double"); + is_double_page_spread = ( + typeof page2 === "object" + && (page.width > page.height || page2.width > page2.height) + && options.displayMode === "double" + ); if (is_double_page_spread) { options.displayMode = "single"; } if (options.displayMode === "double") { @@ -598,9 +599,9 @@ function ComicBook(id, srcs, opts) { } // in manga double page mode reverse the page(s) - if (options.manga && options.displayMode === "double") { + if (options.manga && options.displayMode === "double" && typeof page2 === "object") { var tmpPage = page; - var tmpPage2 = page2; // FIXME: check this exists before using + var tmpPage2 = page2; page = tmpPage2; page2 = tmpPage; }