starting to port canvas drawing code

This commit is contained in:
Bala Clark 2015-07-16 23:33:46 +02:00
parent e6d46b593b
commit c6551102f8
13 changed files with 2708 additions and 14058 deletions

View file

@ -1,2 +1,9 @@
window.ComicBook = require('./comic-book') // let ComicBook = window.ComicBook = require('./comic-book')
let Canvas = require('./view/canvas')
let makeImages = require('../test/data/image')
makeImages((testImages) => {
let canvas = new Canvas()
canvas.drawImage(testImages.portrait1)
document.body.appendChild(canvas.canvas)
})

9
app/lib/make-image.js Normal file
View file

@ -0,0 +1,9 @@
module.exports = function makeImage (src, cb) {
let image = new window.Image()
image.onload = () => {
cb(image)
}
image.src = src
}

View file

@ -9,19 +9,84 @@ class Canvas extends EventEmitter {
// fitWidth, fitWindow, manua // fitWidth, fitWindow, manua
zoomMode: 'fitWidth', zoomMode: 'fitWidth',
// ltr, rtl // ltr, rtl
readDirection: 'ltr' readDirection: 'ltr',
// should two pages be rendered at a time?
doublePage: false
}, options) }, options)
this.canvas = document.createElement('canvas') this.canvas = document.createElement('canvas')
this.context = this.canvas.getContext('2d') this.context = this.canvas.getContext('2d')
this.on('draw:start', this.clearCanvas.bind(this))
} }
draw (image, doublePage, image2) { getScale () {
if (!(image instanceof window.Image) || (doublePage && !(image2 instanceof window.Image))) {
}
fitCanvasToImage (image) {
// make sure the canvas is always at least full screen, even if the page is more narrow than the screen
this.canvas.width = (this.canvas.width < window.innerWidth) ? window.innerWidth : this.canvas.width
this.canvas.height = (this.canvas.height < window.innerHeight) ? window.innerHeight : this.canvas.height
}
getDimensions (image) {
let dimensions = {
width: image.width,
height: image.height
}
return dimensions
}
getOffset (dimensions) {
let offset = {
width: 0,
height: 0
}
// always keep pages centered
if (this.options.zoomMode === 'manual' || this.options.zoomMode === 'fitWindow') {
// work out a horizontal position
if (this.canvas.width < window.innerWidth) {
offset.width = (window.innerWidth - dimensions.width) / 2
if (this.options.doublePage) {
offset.width = offset.width - dimensions.width / 2
}
}
// work out a vertical position
if (this.canvas.height < window.innerHeight) {
offset.height = (window.innerHeight - dimensions.height) / 2
}
}
return offset
}
clearCanvas () {
this.canvas.width = 0
this.canvas.height = 0
}
drawImage (image, image2) {
this.emit('draw:start')
if (!(image instanceof window.Image) || (this.options.doublePage && !(image2 instanceof window.Image))) {
throw new Error('Invalid image') throw new Error('Invalid image')
} }
this.emit('draw') this.fitCanvasToImage()
let dimensions = this.getDimensions(image)
let offset = this.getOffset(dimensions)
this.context.drawImage(image, offset.width, offset.height, dimensions.width, dimensions.height)
if (this.options.doublePage && image2) {
this.context.drawImage(image2, dimensions.width + offset.width, offset.height, dimensions.width, dimensions.height)
}
this.emit('draw:finish')
} }
} }

14088
dist/comicbook.js vendored

File diff suppressed because one or more lines are too long

254
dist/comicbook.js.map vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

11
examples/basic.html Normal file
View file

@ -0,0 +1,11 @@
<!doctype html>
<html>
<head>
<title>Basic Example</title>
<link rel="stylesheet" href="../dist/comicbook.css">
<script src='../dist/comicbook.js'></script>
</head>
<body>
</body>
</html>

View file

@ -12,10 +12,10 @@
"scripts": { "scripts": {
"build": "npm run buildjs ; npm run buildcss", "build": "npm run buildjs ; npm run buildcss",
"buildcss": "rm -f dist/*.css && cat assets/fonts/icomoon-toolbar/style.css app/css/reset.css app/css/styles.css app/css/toolbar.css > dist/comicbook.css && cssmin dist/comicbook.css > dist/comicbook.min.css", "buildcss": "rm -f dist/*.css && cat assets/fonts/icomoon-toolbar/style.css app/css/reset.css app/css/styles.css app/css/toolbar.css > dist/comicbook.css && cssmin dist/comicbook.css > dist/comicbook.min.css",
"buildjs": "rm -f dist/*.js && browserify --transform babelify --transform browserify-handlebars --require babelify/polyfill app/index.js --debug | exorcist dist/comicbook.js.map > dist/comicbook.js && uglifyjs --screw-ie8 --compress --mangle --source-map dist/comicbook.min.js.map --source-map-root ./ --output dist/comicbook.min.js -- dist/comicbook.js", "buildjs": "rm -f dist/*.js && browserify --transform [ babelify --optional runtime ] --transform browserify-handlebars app/index.js --debug | exorcist dist/comicbook.js.map > dist/comicbook.js && uglifyjs --screw-ie8 --compress --mangle --source-map dist/comicbook.min.js.map --source-map-root ./ --output dist/comicbook.min.js -- dist/comicbook.js",
"pretest": "standard", "pretest": "standard",
"test": "mochify --recursive --reporter spec --transform babelify --transform browserify-handlebars --require babelify/polyfill", "test": "mochify --recursive --reporter spec --transform babelify --transform browserify-handlebars --require babelify/polyfill",
"test-watch": "mochify --watch --recursive --reporter min --transform babelify --transform browserify-handlebars --require babelify/polyfill", "test-watch": "mochify --watch --recursive --reporter min --transform [ babelify --optional runtime ] --transform browserify-handlebars",
"wrap": "rm -f npm-shrinkwrap ; npm prune && npm shrinkwrap" "wrap": "rm -f npm-shrinkwrap ; npm prune && npm shrinkwrap"
}, },
"repository": { "repository": {
@ -45,12 +45,14 @@
}, },
"devDependencies": { "devDependencies": {
"babel-eslint": "^3.1.23", "babel-eslint": "^3.1.23",
"babel-runtime": "^5.7.0",
"babelify": "^6.1.3", "babelify": "^6.1.3",
"browserify": "^10.2.6", "browserify": "^10.2.6",
"browserify-handlebars": "^1.0.0", "browserify-handlebars": "^1.0.0",
"cssmin": "^0.4.3", "cssmin": "^0.4.3",
"exorcist": "^0.4.0", "exorcist": "^0.4.0",
"handlebars": "^3.0.3", "handlebars": "^3.0.3",
"imagediff": "^1.0.8",
"mochify": "^2.10.0", "mochify": "^2.10.0",
"phantomjs": "^1.9.17", "phantomjs": "^1.9.17",
"standard": "^4.5.3", "standard": "^4.5.3",

View file

@ -8,9 +8,9 @@ let srcs = [
'data:image/gif;base64,R0lGODlhAQABAPAAAO7u7v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==' 'data:image/gif;base64,R0lGODlhAQABAPAAAO7u7v///yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=='
] ]
describe('ComicBook', function () { describe('ComicBook', () => {
describe('preload images', function () { describe('preload images', () => {
it('should preload all given image srcs and emit preload:image, preload:finish events', done => { it('should preload all given image srcs and emit preload:image, preload:finish events', done => {
let comic = new ComicBook(srcs) let comic = new ComicBook(srcs)

455
test/data/image.js Normal file
View file

@ -0,0 +1,455 @@
let makeImage = require('../../app/lib/make-image')
let portrait1 =
`data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAAB
AAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAAB
AAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAA
ASygAwAEAAAAAQAAAbkAAAAA/+0AOFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAA
OEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv/iDFhJQ0NfUFJPRklMRQABAQAA
DEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElF
QyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rl
c2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdY
WVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1
ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl
Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRl
eHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55
AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0Ig
SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA
AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZ
WiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVj
LmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklF
QyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAA
AAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0g
c1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2Ug
Vmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVm
ZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwAD
XJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAA
AAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU
ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCL
AJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEH
AQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGp
AbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6
AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+
A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2
BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYn
BjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfS
B+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6
Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvh
C/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5J
DmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1
ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPl
FAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd
F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqe
GsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5q
HpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC
Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtybo
JxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSud
K9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCk
MNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9
Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq
O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGs
Qe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgF
SEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63
TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXC
Vg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0n
XXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTp
ZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20I
bWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWF
deF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i
fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4ef
iASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/
kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC
m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWp
phqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1
sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7Lrun
vCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dB
x7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE
08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v
4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG
7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH
+lf65/t3/Af8mP0p/br+S/7c/23////AABEIAbkBLAMBEgACEQEDEQH/xAAfAAAB
BQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0B
AgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygp
KjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImK
kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj
5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJ
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
1/bC+L2seJ9C8NeHMWlnBcafb6tex2V150ckkoJiG7CnCgMdpA5KnmgD5u1zULvV
dWutRv7g3F3czPPcTEAeZK7FnbgAcsSelUaACigAooAKKACigAooAKKACigAooAK
KACigAooAKKAFAyQM496SgD1PxlLZN8APBKW2oWtzP8A2nqb3EMbfPas23ajg9yP
m9MGvLixIAJ4HSgBtFABRQAUUAf/1vjeigAooAKKACigAooAKKACigAooAKKACig
AooAKKACigAooAKKACigAooAf5jZBG1SOhVQD+lMoA0vC76VH4hsH1yOeTTVuEN0
kJw7Rg/MARyCemRyM5HNZtAFrVZoLjUZ5raA28DyMYovNMnlpk7V3NyQFwMn0qrQ
AUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFKozn6E/pQAlbHjGxttN
8Q3VnaIUhjKhQWJIyinqfcmgDHooAKKACigD/9f43ooAKKACigAooAKKACigAooA
KKACigAooAKKACigAooAKKACigAooAKKACigAooAKKAHR7d67zhc802gDotc0zSn
0/TLnw9NdXmNMSbVsxsRa3HmOGXheE27CCeMk81X8H+Kde8Ja1HrHh/U7jT7yNWU
SQsMlSMFSCCrD2IIzz1oAx2Ur1wfcHIrqfEHidvGGprc+IIbGO+mZFm1G3txAWOQ
DJJHGMSEAHoATzQBylXtd09dL1SayS9tL5Yzhbi1k3xSDGdyt3H6g5B6UAUaKACi
gAooAKKACigAooAKKACigAooAKKAJry5nu52nuZXllfG52OSeAP5AVDQAUUAFFAB
RQB//9D43ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK
ACigAooAKKACigAooAKKAFJJJJ5J60lABRQAUUAFXtF0rUNYvPsemWkt1P5byeXG
MsVUZYgd8CgCjVi/s7mwupLW7hkgmjOHjkQo6n3VgCPxFAFeigAooAKKACigApyK
WYKOtADa1fEmg6joFxbW+pwiGW4tIbtULZYJKu5Nw/hOOx6UAZVFABRQAUUAFFAH
/9H43ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig
AooAKKACigAooAKKACigAooAKKAFU4PQH2IpKAOj8R+NfEniLTLbT9c1WfUo7Vi0
T3SpJKpIx/rSvmEY7FiO+M81zlABRQAUUAFFABSqdpDDHHPNAHR/DZdKXxtpEuuo
H0qK7jlvVMe8NCh3upHTnaFOeze9Q+KdSup30+0ka0X7Bp8dkptU2gplnw5H32zI
ct0PHpQA/wCIvia58YeM9V8R3ShH1C7kuBGFAEak4RAB2VFRfwrnqACigAooAKKA
CigD/9L43ooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKK
ACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACigAooAKKACig
AooAKKAP/9k=`
module.exports = function makeImages (cb) {
let images = {}
makeImage(portrait1, (image) => {
images.portrait1 = image
cb(images)
})
}

1826
test/fixture/image.js Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,18 +1,34 @@
let assert = require('assert') let assert = require('assert')
let imagediff = require('imagediff')
let Canvas = require('../../app/view/canvas') let Canvas = require('../../app/view/canvas')
let makeTestImages = require('../data/image')
let makeImageFixtures = require('../fixture/image')
describe('Canvas', function () { describe('Canvas', function () {
it('should draw only Image objects', function () { it('should draw only Image objects', () => {
let canvas = new Canvas() let canvas = new Canvas()
let image = new window.Image() let image = new window.Image()
assert.throws(canvas.draw, 'Invalid image') assert.throws(canvas.drawImage, 'Invalid image')
assert.throws(canvas.draw.bind(canvas, image, true), 'Invalid image')
assert.doesNotThrow(canvas.draw.bind(canvas, image, true, image), 'Invalid image') canvas.options.doublePage = true
assert.throws(canvas.drawImage.bind(canvas, image), 'Invalid image')
assert.doesNotThrow(canvas.drawImage.bind(canvas, image, image), 'Invalid image')
}) })
it('should draw a single page') it('should draw a single page', () => {
let canvas = new Canvas()
// TODO refactor how images are generated (do one at a time)
// TODO update fixture once centering is working again
makeTestImages((testImages) => {
makeImageFixtures((fixtureImages) => {
canvas.drawImage(testImages.portrait1)
assert(imagediff.equal(canvas.canvas, fixtureImages.singlePortrait))
})
})
})
it('should draw a double page') it('should draw a double page')
@ -28,5 +44,9 @@ describe('Canvas', function () {
it('should manual zoom') it('should manual zoom')
it('should always display the canvas 100% of window width, even when drawing smaller images')
it('should always center pages') it('should always center pages')
it('should prevent smaller images from being drawn on top of bigger ones')
}) })