Support for 16 bit

This commit is contained in:
Luke Page 2015-08-01 22:53:29 +01:00
parent d601f60c79
commit 2d91824d0c
4 changed files with 25 additions and 21 deletions

View file

@ -9,9 +9,12 @@ function bitRetriever(data, depth) {
default: default:
throw new Error("unrecognised depth"); throw new Error("unrecognised depth");
break; break;
/* case 8: case 16:
var byte2 = data[i];
i++;
byte = Math.floor((((byte << 8) + byte2) * 255) / (Math.pow(2, 16) - 1) + 0.5);
leftOver.push(byte); leftOver.push(byte);
break;*/ break;
case 4: case 4:
var byte2 = byte & 0x0f; var byte2 = byte & 0x0f;
var byte1 = byte >> 4; var byte1 = byte >> 4;
@ -39,32 +42,32 @@ function bitRetriever(data, depth) {
} }
return { return {
get: function(count) { get: function(count) {
var returner;
if (depth === 8) {
returner = data.slice(i, i + count);
i += count;
return returner;
}
while(leftOver.length < count) { while(leftOver.length < count) {
split(); split();
} }
returner = leftOver.slice(0, count); var returner = leftOver.slice(0, count);
leftOver = leftOver.slice(count); leftOver = leftOver.slice(count);
return returner; return returner;
}, },
resetAfterLine: function() { resetAfterLine: function() {
leftOver.length = 0; leftOver.length = 0;
},
end: function() {
if (i !== data.length) {
throw new Error("extra data found");
}
} }
}; };
} }
exports.dataToBitMap = function(data, width, height, bpp, depth) { exports.dataToBitMap = function(data, width, height, bpp, depth) {
if (depth !== 8) { if (depth !== 8) {
var bits = bitRetriever(data, depth); var bits = bitRetriever(data, depth);
} }
var pxData = new Buffer(width * height * 4); var pxData = new Buffer(width * height * 4);
var pxPos = 0; var pxPos = 0;
var maxBit = Math.pow(2, depth) - 1; var maxBit = depth >= 8 ? 255 : (Math.pow(2, depth) - 1);
var rawPos = 0; var rawPos = 0;
var pixelData; var pixelData;
@ -82,12 +85,20 @@ exports.dataToBitMap = function(data, width, height, bpp, depth) {
} }
pxPos++; pxPos++;
} }
//console.log("R", pxData[pxPos - 4], "G", pxData[pxPos - 3], "B", pxData[pxPos - 2], "A", pxData[pxPos - 1]);
rawPos += bpp; rawPos += bpp;
} }
if (depth !== 8) { if (depth !== 8) {
bits.resetAfterLine(); bits.resetAfterLine();
} }
} }
if (depth === 8) {
if (rawPos !== data.length) {
throw new Error("extra data found");
}
} else {
bits.end();
}
return pxData; return pxData;
}; };

View file

@ -68,7 +68,7 @@ Filter.prototype._reverseFilterLine = function(rawData) {
var filter = rawData[0]; var filter = rawData[0];
var xComparison = this._depth === 8 ? this._Bpp : 1; var xComparison = this._depth >= 8 ? ((this._depth === 16) ? this._Bpp * 2 : this._Bpp) : 1;
var xBiggerThan = xComparison - 1; var xBiggerThan = xComparison - 1;
for (var x = 0; x < this._byteWidth; x++) { for (var x = 0; x < this._byteWidth; x++) {

View file

@ -164,7 +164,7 @@ Parser.prototype._parseIHDR = function(data) {
// 'compr', compr, 'filter', filter, 'interlace', interlace // 'compr', compr, 'filter', filter, 'interlace', interlace
// ); // );
if (depth !== 8 && depth !== 4 && depth !== 2 && depth !== 1) { if (depth !== 8 && depth !== 4 && depth !== 2 && depth !== 1 && depth !== 16) {
this.error(new Error('Unsupported bit depth ' + depth)); this.error(new Error('Unsupported bit depth ' + depth));
return; return;
} }
@ -312,17 +312,11 @@ Parser.prototype.reverseFiltered = function(data, depth, width, height) {
var pxPos = pxRowPos + (x << 2), var pxPos = pxRowPos + (x << 2),
color = this._palette[data[pxPos]]; color = this._palette[data[pxPos]];
if (!color) {
console.error("data - " + data[pxPos] + " got no colour");
console.log("depth is ", depth);
return;
}
for (var i = 0; i < 4; i++) for (var i = 0; i < 4; i++)
data[pxPos + i] = color[i]; data[pxPos + i] = color[i];
} }
} }
} else if (depth !== 8) { } else if (depth < 8) {
//console.log("adjusting"); //console.log("adjusting");
var pxLineLength = width << 2; var pxLineLength = width << 2;
var maxOutSample = 255; var maxOutSample = 255;

View file

@ -12,8 +12,7 @@ fs.readdir(__dirname + '/in/', function(err, files) {
var expectedError = false; var expectedError = false;
if (file.match(/^x/) || if (file.match(/^x/) ||
file.match(/^...i/) ||// interlace file.match(/^...i/) // interlace
file.match(/^......(16)/) // 1/2/4/16 bit
) { ) {
expectedError = true; expectedError = true;
} }