| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- '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;
- };
|