Skip to content

Commit 554c1ef

Browse files
committed
New: PDFs are rendered to a blob image instead of a canvas
1 parent cb90771 commit 554c1ef

8 files changed

Lines changed: 117 additions & 128 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
99
##### 🚀 New Features
1010

1111
- Allow disabling `Do not enlarge more than its original size` in Webtoon mode [`7519ac5`](https://github.com/ollm/OpenComic/commit/7519ac5cd0ac4407a4d0edec7e7a3e2a76832f84)
12-
- Improved rotation and support for rotating in PDF
12+
- Improved rotation and support for rotating in PDF [`cb90771`](https://github.com/ollm/OpenComic/commit/cb907714ca7d713bcbf3471564e48a3e67c8ca40)
13+
- PDFs are rendered to a blob image instead of a canvas
1314

1415
##### 🐛 Bug Fixes
1516

scripts/file-manager.js

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,13 +1441,13 @@ var fileCompressed = function(path, _realPath = false, forceType = false, prefix
14411441

14421442
}
14431443

1444-
this.renderCanvas = async function(file, canvas, config = {}) {
1444+
this.renderBlob = async function(file, config = {}) {
14451445

14461446
this.updateConfig(config);
14471447
this.getFeatures();
14481448

14491449
if(this.features.pdf)
1450-
return this.renderCanvasPdf(file, canvas);
1450+
return this.renderBlobPdf(file);
14511451

14521452
}
14531453

@@ -2200,39 +2200,42 @@ var fileCompressed = function(path, _realPath = false, forceType = false, prefix
22002200

22012201
}
22022202

2203-
this.renderCanvasPdf = async function(file, canvas) {
2203+
this.renderBlobPdf = async function(file) {
22042204

22052205
let pdf = await this.openPdf();
22062206
let pages = pdf.numPages;
22072207

22082208
let status = this.getFileStatus(file);
22092209

2210-
if((status && (status.widthRendered !== this.config.width || status.canvasRendered !== canvas)) || this.config.force)
2210+
if((status && (status.widthRendered !== this.config.width)) || this.config.force)
22112211
{
2212-
console.log('renderCanvasPdf');
2212+
console.log('renderBlobPdf');
22132213

22142214
// Render page
22152215
let page = await pdf.getPage(status.page);
22162216

22172217
let scale = this.config.width / status.size.width;
22182218
let viewport = page.getViewport({scale: scale});
22192219

2220-
canvas.width = viewport.width = Math.round(viewport.width);
2221-
canvas.height = viewport.height = Math.round(viewport.height);
2220+
let canvas = document.createElement('canvas');
2221+
canvas.width = viewport.width = this.config.width;
2222+
canvas.height = viewport.height = this.config.height;
22222223
let context = canvas.getContext('2d');
22232224

22242225
await page.render({canvasContext: context, viewport: viewport}).promise;
22252226

2226-
this.setFileStatus(file, {rendered: true, widthRendered: this.config.width, canvasRendered: canvas});
2227+
const blob = await new Promise(function(resolve){
2228+
canvas.toBlob(resolve, 'image/png');
2229+
});
2230+
2231+
this.setFileStatus(file, {rendered: true, widthRendered: this.config.width});
22272232

2228-
return {width: viewport.width, height: viewport.height};
2233+
return {blob: URL.createObjectURL(blob), width: viewport.width, height: viewport.height};
22292234
}
22302235

22312236
return false;
22322237
}
22332238

2234-
2235-
22362239
// ePub
22372240
this.epub = false;
22382241

scripts/queue.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var processingTheQueue = {}, queued = {}, onEnd = {}, queueIsStop = {};
1+
var processingTheQueue = {}, queued = {}, queueIndex = {}, onEnd = {}, queueIsStop = {};
22

33
async function processTheQueue(key)
44
{
@@ -91,6 +91,7 @@ async function addToQueue(key, callback)
9191
function cleanQueue(key = false)
9292
{
9393
queued[key] = [];
94+
queueIndex[key] = 1 + (queueIndex[key] ?? 0);
9495
}
9596

9697
function checkEnd(key)
@@ -127,6 +128,7 @@ module.exports = {
127128
end: end,
128129
stop: stop,
129130
resume: resume,
131+
index: function(key){return queueIndex[key] ?? 0},
130132
get: function(key){return queued[key]},
131133
set: function(key, value){queued[key] = value},
132134
};

scripts/reading.js

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2447,35 +2447,33 @@ function resetZoom(animation = true, index = false, apply = true, center = true,
24472447
// Fix blur on zoom cause by tranform scale, still happening in vertical reader in some conditions
24482448
function fixBlurOnZoom(scale = 1, index = false)
24492449
{
2450-
let _scale = 1 / scale;
2450+
const _scale = 1 / scale;
24512451

2452-
let contentRight = template._contentRight();
2453-
let images = index !== false ? contentRight.querySelectorAll('.image-position'+index+' oc-img img, .image-position'+index+' oc-img canvas') : contentRight.querySelectorAll('.r-img oc-img img, .r-img oc-img canvas');
2452+
const contentRight = template._contentRight();
2453+
const images = index !== false ? contentRight.querySelectorAll('.image-position'+index+' oc-img img') : contentRight.querySelectorAll('.r-img oc-img img');
24542454

24552455
for(let i = 0, len = images.length; i < len; i++)
24562456
{
2457-
let img = images[i];
2458-
let image = imagesData[+img.dataset.index] || [];
2457+
const img = images[i];
2458+
const image = imagesData[+img.dataset.index] || [];
24592459

2460-
let ocImg = img.parentElement;
2460+
const ocImg = img.parentElement;
24612461

2462-
if(img.tagName != 'CANVAS')
2463-
{
2464-
let width = (image?.rotated == 1 || image?.rotated == 2) ? +ocImg.dataset.height : +ocImg.dataset.width;
2465-
let height = (image?.rotated == 1 || image?.rotated == 2) ? +ocImg.dataset.width : +ocImg.dataset.height;
2462+
let width, height;
24662463

2467-
let _width = Math.round(width * scale * window.devicePixelRatio);
2468-
let _height = Math.round(height * scale * window.devicePixelRatio);
2464+
width = +ocImg.dataset.width;
2465+
height = +ocImg.dataset.height;
24692466

2470-
img.style.width = (_width / window.devicePixelRatio)+'px';
2471-
img.style.height = (_height / window.devicePixelRatio)+'px';
2472-
}
2467+
width = Math.round(width * scale * window.devicePixelRatio);
2468+
height = Math.round(height * scale * window.devicePixelRatio);
2469+
2470+
width = (image?.rotated == 1 || image?.rotated == 2) ? height : width;
2471+
height = (image?.rotated == 1 || image?.rotated == 2) ? width : height;
24732472

2474-
console.log('scale('+_scale+') '+rotateImage(image?.rotated, 0.001, 0.001));
2473+
img.style.width = (width / window.devicePixelRatio)+'px';
2474+
img.style.height = (height / window.devicePixelRatio)+'px';
24752475

2476-
if(img.tagName == 'CANVAS')
2477-
img.style.transform = 'scale('+(_scale / window.devicePixelRatio)+') '+rotateImage(image?.rotated, 0.001, 0.001);
2478-
else if(img.classList.contains('blobRender') || img.classList.contains('zoomOriginalSize') || img.classList.contains('originalSize'))
2476+
if(img.classList.contains('blobRender') || img.classList.contains('zoomOriginalSize') || img.classList.contains('originalSize'))
24792477
img.style.transform = 'scale('+_scale+') '+rotateImage(image?.rotated, 0.001, 0.001);
24802478
else
24812479
img.style.transform = 'scale('+_scale+') '+rotateImage(image?.rotated);
@@ -2490,21 +2488,18 @@ function fixBlurOnZoom(scale = 1, index = false)
24902488

24912489
for(let i = 0, len = images.length; i < len; i++)
24922490
{
2493-
let img = images[i];
2494-
let image = imagesData[+img.dataset.index] || [];
2491+
const img = images[i];
2492+
const image = imagesData[+img.dataset.index] || [];
24952493

2496-
if(img.tagName != 'CANVAS' && !img.classList.contains('blobRender') && !img.classList.contains('zoomOriginalSize') && !img.classList.contains('originalSize'))
2497-
{
2498-
let rect = img.getBoundingClientRect();
2494+
const rect = img.getBoundingClientRect();
24992495

2500-
let left = -(rect.left - app.floorDPR(rect.left));
2501-
let top = -(rect.top - app.floorDPR(rect.top));
2496+
let left = -(rect.left - app.floorDPR(rect.left));
2497+
let top = -(rect.top - app.floorDPR(rect.top));
25022498

2503-
if(left < -0.5) left++;
2504-
if(top < -0.5) top++;
2499+
if(left < -0.5) left++;
2500+
if(top < -0.5) top++;
25052501

2506-
img.style.transform = 'scale('+_scale+') '+rotateImage(image?.rotated, left, top);
2507-
}
2502+
img.style.transform = 'scale('+_scale+') '+rotateImage(image?.rotated, left, top);
25082503
}
25092504

25102505
});

scripts/reading/page-transitions.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -401,14 +401,6 @@ function createPageTurnElement(original, toInsert, zIndex)
401401

402402
toInsert.insertAdjacentElement('beforeend', div);
403403

404-
const oCanvases = original.querySelectorAll('canvas');
405-
const cCanvases = cloned.querySelectorAll('canvas');
406-
407-
for(let i = 0, len = cCanvases.length; i < len; i++)
408-
{
409-
cCanvases[i].getContext('2d').drawImage(oCanvases[i], 0, 0);
410-
}
411-
412404
return div;
413405
}
414406

0 commit comments

Comments
 (0)