| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 | 
							- 'use strict';
 
- var interlaceUtils = require('./interlace');
 
- var pixelBppMapper = [
 
-   // 0 - dummy entry
 
-   function() {},
 
-   // 1 - L
 
-   // 0: 0, 1: 0, 2: 0, 3: 0xff
 
-   function(pxData, data, pxPos, rawPos) {
 
-     if (rawPos === data.length) {
 
-       throw new Error('Ran out of data');
 
-     }
 
-     var pixel = data[rawPos];
 
-     pxData[pxPos] = pixel;
 
-     pxData[pxPos + 1] = pixel;
 
-     pxData[pxPos + 2] = pixel;
 
-     pxData[pxPos + 3] = 0xff;
 
-   },
 
-   // 2 - LA
 
-   // 0: 0, 1: 0, 2: 0, 3: 1
 
-   function(pxData, data, pxPos, rawPos) {
 
-     if (rawPos + 1 >= data.length) {
 
-       throw new Error('Ran out of data');
 
-     }
 
-     var pixel = data[rawPos];
 
-     pxData[pxPos] = pixel;
 
-     pxData[pxPos + 1] = pixel;
 
-     pxData[pxPos + 2] = pixel;
 
-     pxData[pxPos + 3] = data[rawPos + 1];
 
-   },
 
-   // 3 - RGB
 
-   // 0: 0, 1: 1, 2: 2, 3: 0xff
 
-   function(pxData, data, pxPos, rawPos) {
 
-     if (rawPos + 2 >= data.length) {
 
-       throw new Error('Ran out of data');
 
-     }
 
-     pxData[pxPos] = data[rawPos];
 
-     pxData[pxPos + 1] = data[rawPos + 1];
 
-     pxData[pxPos + 2] = data[rawPos + 2];
 
-     pxData[pxPos + 3] = 0xff;
 
-   },
 
-   // 4 - RGBA
 
-   // 0: 0, 1: 1, 2: 2, 3: 3
 
-   function(pxData, data, pxPos, rawPos) {
 
-     if (rawPos + 3 >= data.length) {
 
-       throw new Error('Ran out of data');
 
-     }
 
-     pxData[pxPos] = data[rawPos];
 
-     pxData[pxPos + 1] = data[rawPos + 1];
 
-     pxData[pxPos + 2] = data[rawPos + 2];
 
-     pxData[pxPos + 3] = data[rawPos + 3];
 
-   }
 
- ];
 
- var pixelBppCustomMapper = [
 
-   // 0 - dummy entry
 
-   function() {},
 
-   // 1 - L
 
-   // 0: 0, 1: 0, 2: 0, 3: 0xff
 
-   function(pxData, pixelData, pxPos, maxBit) {
 
-     var pixel = pixelData[0];
 
-     pxData[pxPos] = pixel;
 
-     pxData[pxPos + 1] = pixel;
 
-     pxData[pxPos + 2] = pixel;
 
-     pxData[pxPos + 3] = maxBit;
 
-   },
 
-   // 2 - LA
 
-   // 0: 0, 1: 0, 2: 0, 3: 1
 
-   function(pxData, pixelData, pxPos) {
 
-     var pixel = pixelData[0];
 
-     pxData[pxPos] = pixel;
 
-     pxData[pxPos + 1] = pixel;
 
-     pxData[pxPos + 2] = pixel;
 
-     pxData[pxPos + 3] = pixelData[1];
 
-   },
 
-   // 3 - RGB
 
-   // 0: 0, 1: 1, 2: 2, 3: 0xff
 
-   function(pxData, pixelData, pxPos, maxBit) {
 
-     pxData[pxPos] = pixelData[0];
 
-     pxData[pxPos + 1] = pixelData[1];
 
-     pxData[pxPos + 2] = pixelData[2];
 
-     pxData[pxPos + 3] = maxBit;
 
-   },
 
-   // 4 - RGBA
 
-   // 0: 0, 1: 1, 2: 2, 3: 3
 
-   function(pxData, pixelData, pxPos) {
 
-     pxData[pxPos] = pixelData[0];
 
-     pxData[pxPos + 1] = pixelData[1];
 
-     pxData[pxPos + 2] = pixelData[2];
 
-     pxData[pxPos + 3] = pixelData[3];
 
-   }
 
- ];
 
- function bitRetriever(data, depth) {
 
-   var leftOver = [];
 
-   var i = 0;
 
-   function split() {
 
-     if (i === data.length) {
 
-       throw new Error('Ran out of data');
 
-     }
 
-     var byte = data[i];
 
-     i++;
 
-     var byte8, byte7, byte6, byte5, byte4, byte3, byte2, byte1;
 
-     switch (depth) {
 
-       default:
 
-         throw new Error('unrecognised depth');
 
-       case 16:
 
-         byte2 = data[i];
 
-         i++;
 
-         leftOver.push(((byte << 8) + byte2));
 
-         break;
 
-       case 4:
 
-         byte2 = byte & 0x0f;
 
-         byte1 = byte >> 4;
 
-         leftOver.push(byte1, byte2);
 
-         break;
 
-       case 2:
 
-         byte4 = byte & 3;
 
-         byte3 = byte >> 2 & 3;
 
-         byte2 = byte >> 4 & 3;
 
-         byte1 = byte >> 6 & 3;
 
-         leftOver.push(byte1, byte2, byte3, byte4);
 
-         break;
 
-       case 1:
 
-         byte8 = byte & 1;
 
-         byte7 = byte >> 1 & 1;
 
-         byte6 = byte >> 2 & 1;
 
-         byte5 = byte >> 3 & 1;
 
-         byte4 = byte >> 4 & 1;
 
-         byte3 = byte >> 5 & 1;
 
-         byte2 = byte >> 6 & 1;
 
-         byte1 = byte >> 7 & 1;
 
-         leftOver.push(byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8);
 
-         break;
 
-     }
 
-   }
 
-   return {
 
-     get: function(count) {
 
-       while (leftOver.length < count) {
 
-         split();
 
-       }
 
-       var returner = leftOver.slice(0, count);
 
-       leftOver = leftOver.slice(count);
 
-       return returner;
 
-     },
 
-     resetAfterLine: function() {
 
-       leftOver.length = 0;
 
-     },
 
-     end: function() {
 
-       if (i !== data.length) {
 
-         throw new Error('extra data found');
 
-       }
 
-     }
 
-   };
 
- }
 
- function mapImage8Bit(image, pxData, getPxPos, bpp, data, rawPos) { // eslint-disable-line max-params
 
-   var imageWidth = image.width;
 
-   var imageHeight = image.height;
 
-   var imagePass = image.index;
 
-   for (var y = 0; y < imageHeight; y++) {
 
-     for (var x = 0; x < imageWidth; x++) {
 
-       var pxPos = getPxPos(x, y, imagePass);
 
-       pixelBppMapper[bpp](pxData, data, pxPos, rawPos);
 
-       rawPos += bpp; //eslint-disable-line no-param-reassign
 
-     }
 
-   }
 
-   return rawPos;
 
- }
 
- function mapImageCustomBit(image, pxData, getPxPos, bpp, bits, maxBit) { // eslint-disable-line max-params
 
-   var imageWidth = image.width;
 
-   var imageHeight = image.height;
 
-   var imagePass = image.index;
 
-   for (var y = 0; y < imageHeight; y++) {
 
-     for (var x = 0; x < imageWidth; x++) {
 
-       var pixelData = bits.get(bpp);
 
-       var pxPos = getPxPos(x, y, imagePass);
 
-       pixelBppCustomMapper[bpp](pxData, pixelData, pxPos, maxBit);
 
-     }
 
-     bits.resetAfterLine();
 
-   }
 
- }
 
- exports.dataToBitMap = function(data, bitmapInfo) {
 
-   var width = bitmapInfo.width;
 
-   var height = bitmapInfo.height;
 
-   var depth = bitmapInfo.depth;
 
-   var bpp = bitmapInfo.bpp;
 
-   var interlace = bitmapInfo.interlace;
 
-   if (depth !== 8) {
 
-     var bits = bitRetriever(data, depth);
 
-   }
 
-   var pxData;
 
-   if (depth <= 8) {
 
-     pxData = new Buffer(width * height * 4);
 
-   }
 
-   else {
 
-     pxData = new Uint16Array(width * height * 4);
 
-   }
 
-   var maxBit = Math.pow(2, depth) - 1;
 
-   var rawPos = 0;
 
-   var images;
 
-   var getPxPos;
 
-   if (interlace) {
 
-     images = interlaceUtils.getImagePasses(width, height);
 
-     getPxPos = interlaceUtils.getInterlaceIterator(width, height);
 
-   }
 
-   else {
 
-     var nonInterlacedPxPos = 0;
 
-     getPxPos = function() {
 
-       var returner = nonInterlacedPxPos;
 
-       nonInterlacedPxPos += 4;
 
-       return returner;
 
-     };
 
-     images = [{ width: width, height: height }];
 
-   }
 
-   for (var imageIndex = 0; imageIndex < images.length; imageIndex++) {
 
-     if (depth === 8) {
 
-       rawPos = mapImage8Bit(images[imageIndex], pxData, getPxPos, bpp, data, rawPos);
 
-     }
 
-     else {
 
-       mapImageCustomBit(images[imageIndex], pxData, getPxPos, bpp, bits, maxBit);
 
-     }
 
-   }
 
-   if (depth === 8) {
 
-     if (rawPos !== data.length) {
 
-       throw new Error('extra data found');
 
-     }
 
-   }
 
-   else {
 
-     bits.end();
 
-   }
 
-   return pxData;
 
- };
 
 
  |