mirror of
https://github.com/danbulant/pngjs
synced 2026-06-20 06:51:46 +00:00
split out bitmapper
This commit is contained in:
parent
adf5216a49
commit
3ddd3f11a3
1 changed files with 44 additions and 29 deletions
|
|
@ -96,6 +96,45 @@ function bitRetriever(data, depth) {
|
|||
};
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
for (var i = 0; i < 4; i++) {
|
||||
var idx = pixelBppMap[bpp][i];
|
||||
if (i === data.length) {
|
||||
throw new Error('Ran out of data');
|
||||
}
|
||||
pxData[pxPos + i] = idx !== 0xff ? data[idx + rawPos] : 0xff;
|
||||
}
|
||||
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);
|
||||
|
||||
for (var i = 0; i < 4; i++) {
|
||||
var idx = pixelBppMap[bpp][i];
|
||||
pxData[pxPos + i] = idx !== 0xff ? pixelData[idx] : maxBit;
|
||||
}
|
||||
}
|
||||
bits.resetAfterLine();
|
||||
}
|
||||
}
|
||||
|
||||
exports.dataToBitMap = function(data, width, height, bpp, depth, interlace) {
|
||||
|
||||
if (depth !== 8) {
|
||||
|
|
@ -110,7 +149,6 @@ exports.dataToBitMap = function(data, width, height, bpp, depth, interlace) {
|
|||
}
|
||||
var maxBit = Math.pow(2, depth) - 1;
|
||||
var rawPos = 0;
|
||||
var pixelData;
|
||||
var images;
|
||||
var getPxPos;
|
||||
|
||||
|
|
@ -129,34 +167,11 @@ exports.dataToBitMap = function(data, width, height, bpp, depth, interlace) {
|
|||
}
|
||||
|
||||
for (var imageIndex = 0; imageIndex < images.length; imageIndex++) {
|
||||
var imageWidth = images[imageIndex].width;
|
||||
var imageHeight = images[imageIndex].height;
|
||||
var imagePass = images[imageIndex].index;
|
||||
for (var y = 0; y < imageHeight; y++) {
|
||||
for (var x = 0; x < imageWidth; x++) {
|
||||
if (depth !== 8) {
|
||||
pixelData = bits.get(bpp);
|
||||
}
|
||||
var pxPos = getPxPos(x, y, imagePass);
|
||||
//console.log(x,y,imageIndex, pxPos);
|
||||
for (var i = 0; i < 4; i++) {
|
||||
var idx = pixelBppMap[bpp][i];
|
||||
if (depth === 8) {
|
||||
if (i === data.length) {
|
||||
throw new Error('Ran out of data');
|
||||
}
|
||||
pxData[pxPos + i] = idx !== 0xff ? data[idx + rawPos] : maxBit;
|
||||
}
|
||||
else {
|
||||
pxData[pxPos + i] = idx !== 0xff ? pixelData[idx] : maxBit;
|
||||
}
|
||||
}
|
||||
//console.log("R", pxData[pxPos], "G", pxData[pxPos + 1], "B", pxData[pxPos + 2], "A", pxData[pxPos + 3]);
|
||||
rawPos += bpp;
|
||||
}
|
||||
if (depth !== 8) {
|
||||
bits.resetAfterLine();
|
||||
}
|
||||
if (depth === 8) {
|
||||
rawPos = mapImage8Bit(images[imageIndex], pxData, getPxPos, bpp, data, rawPos);
|
||||
}
|
||||
else {
|
||||
mapImageCustomBit(images[imageIndex], pxData, getPxPos, bpp, bits, maxBit);
|
||||
}
|
||||
}
|
||||
if (depth === 8) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue