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