1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- 'use strict';
- function dePalette(indata, outdata, width, height, palette) {
- var pxPos = 0;
- // use values from palette
- for (var y = 0; y < height; y++) {
- for (var x = 0; x < width; x++) {
- var color = palette[indata[pxPos]];
- if (!color) {
- throw new Error('index ' + indata[pxPos] + ' not in palette');
- }
- for (var i = 0; i < 4; i++) {
- outdata[pxPos + i] = color[i];
- }
- pxPos += 4;
- }
- }
- }
- function replaceTransparentColor(indata, outdata, width, height, transColor) {
- var pxPos = 0;
- for (var y = 0; y < height; y++) {
- for (var x = 0; x < width; x++) {
- var makeTrans = false;
- if (transColor.length === 1) {
- if (transColor[0] === indata[pxPos]) {
- makeTrans = true;
- }
- }
- else if (transColor[0] === indata[pxPos] && transColor[1] === indata[pxPos + 1] && transColor[2] === indata[pxPos + 2]) {
- makeTrans = true;
- }
- if (makeTrans) {
- for (var i = 0; i < 4; i++) {
- outdata[pxPos + i] = 0;
- }
- }
- pxPos += 4;
- }
- }
- }
- function scaleDepth(indata, outdata, width, height, depth) {
- var maxOutSample = 255;
- var maxInSample = Math.pow(2, depth) - 1;
- var pxPos = 0;
- for (var y = 0; y < height; y++) {
- for (var x = 0; x < width; x++) {
- for (var i = 0; i < 4; i++) {
- outdata[pxPos + i] = Math.floor((indata[pxPos + i] * maxOutSample) / maxInSample + 0.5);
- }
- pxPos += 4;
- }
- }
- }
- module.exports = function(indata, imageData) {
- var depth = imageData.depth;
- var width = imageData.width;
- var height = imageData.height;
- var colorType = imageData.colorType;
- var transColor = imageData.transColor;
- var palette = imageData.palette;
- var outdata = indata; // only different for 16 bits
- if (colorType === 3) { // paletted
- dePalette(indata, outdata, width, height, palette);
- }
- else {
- if (transColor) {
- replaceTransparentColor(indata, outdata, width, height, transColor);
- }
- // if it needs scaling
- if (depth !== 8) {
- // if we need to change the buffer size
- if (depth === 16) {
- outdata = new Buffer(width * height * 4);
- }
- scaleDepth(indata, outdata, width, height, depth);
- }
- }
- return outdata;
- };
|