blob: d63cfc3c3a40b221039111386c8780a7a9ba46b7 [file] [log] [blame]
var Promise = require('bluebird')
module.exports.read = function parseBanner(out) {
var tryRead
return new Promise(function(resolve, reject) {
var readBannerBytes = 0
var needBannerBytes = 2
var banner = out.banner = {
version: 0
, length: 0
, pid: 0
, realWidth: 0
, realHeight: 0
, virtualWidth: 0
, virtualHeight: 0
, orientation: 0
, quirks: {
dumb: false
, alwaysUpright: false
, tear: false
}
}
tryRead = function() {
for (var chunk; (chunk = out.read(needBannerBytes - readBannerBytes));) {
for (var cursor = 0, len = chunk.length; cursor < len;) {
if (readBannerBytes < needBannerBytes) {
switch (readBannerBytes) {
case 0:
// version
banner.version = chunk[cursor]
break
case 1:
// length
banner.length = needBannerBytes = chunk[cursor]
break
case 2:
case 3:
case 4:
case 5:
// pid
banner.pid +=
(chunk[cursor] << ((readBannerBytes - 2) * 8)) >>> 0
break
case 6:
case 7:
case 8:
case 9:
// real width
banner.realWidth +=
(chunk[cursor] << ((readBannerBytes - 6) * 8)) >>> 0
break
case 10:
case 11:
case 12:
case 13:
// real height
banner.realHeight +=
(chunk[cursor] << ((readBannerBytes - 10) * 8)) >>> 0
break
case 14:
case 15:
case 16:
case 17:
// virtual width
banner.virtualWidth +=
(chunk[cursor] << ((readBannerBytes - 14) * 8)) >>> 0
break
case 18:
case 19:
case 20:
case 21:
// virtual height
banner.virtualHeight +=
(chunk[cursor] << ((readBannerBytes - 18) * 8)) >>> 0
break
case 22:
// orientation
banner.orientation += chunk[cursor] * 90
break
case 23:
// quirks
banner.quirks.dumb = (chunk[cursor] & 1) === 1
banner.quirks.alwaysUpright = (chunk[cursor] & 2) === 2
banner.quirks.tear = (chunk[cursor] & 4) === 4
break
}
cursor += 1
readBannerBytes += 1
if (readBannerBytes === needBannerBytes) {
return resolve(banner)
}
}
else {
reject(new Error(
'Supposedly impossible error parsing banner'
))
}
}
}
}
tryRead()
out.on('readable', tryRead)
})
.finally(function() {
out.removeListener('readable', tryRead)
})
}