[SignalingServer] Optimize dependent modules
[platform/framework/web/wrtjs.git] / device_home / node_modules / pngjs / lib / filter-pack.js
1 'use strict';
2
3 var paethPredictor = require('./paeth-predictor');
4
5 function filterNone(pxData, pxPos, byteWidth, rawData, rawPos) {
6
7   for (var x = 0; x < byteWidth; x++) {
8     rawData[rawPos + x] = pxData[pxPos + x];
9   }
10 }
11
12 function filterSumNone(pxData, pxPos, byteWidth) {
13
14   var sum = 0;
15   var length = pxPos + byteWidth;
16
17   for (var i = pxPos; i < length; i++) {
18     sum += Math.abs(pxData[i]);
19   }
20   return sum;
21 }
22
23 function filterSub(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {
24
25   for (var x = 0; x < byteWidth; x++) {
26
27     var left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
28     var val = pxData[pxPos + x] - left;
29
30     rawData[rawPos + x] = val;
31   }
32 }
33
34 function filterSumSub(pxData, pxPos, byteWidth, bpp) {
35
36   var sum = 0;
37   for (var x = 0; x < byteWidth; x++) {
38
39     var left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
40     var val = pxData[pxPos + x] - left;
41
42     sum += Math.abs(val);
43   }
44
45   return sum;
46 }
47
48 function filterUp(pxData, pxPos, byteWidth, rawData, rawPos) {
49
50   for (var x = 0; x < byteWidth; x++) {
51
52     var up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
53     var val = pxData[pxPos + x] - up;
54
55     rawData[rawPos + x] = val;
56   }
57 }
58
59 function filterSumUp(pxData, pxPos, byteWidth) {
60
61   var sum = 0;
62   var length = pxPos + byteWidth;
63   for (var x = pxPos; x < length; x++) {
64
65     var up = pxPos > 0 ? pxData[x - byteWidth] : 0;
66     var val = pxData[x] - up;
67
68     sum += Math.abs(val);
69   }
70
71   return sum;
72 }
73
74 function filterAvg(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {
75
76   for (var x = 0; x < byteWidth; x++) {
77
78     var left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
79     var up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
80     var val = pxData[pxPos + x] - ((left + up) >> 1);
81
82     rawData[rawPos + x] = val;
83   }
84 }
85
86 function filterSumAvg(pxData, pxPos, byteWidth, bpp) {
87
88   var sum = 0;
89   for (var x = 0; x < byteWidth; x++) {
90
91     var left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
92     var up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
93     var val = pxData[pxPos + x] - ((left + up) >> 1);
94
95     sum += Math.abs(val);
96   }
97
98   return sum;
99 }
100
101 function filterPaeth(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {
102
103   for (var x = 0; x < byteWidth; x++) {
104
105     var left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
106     var up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
107     var upleft = pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0;
108     var val = pxData[pxPos + x] - paethPredictor(left, up, upleft);
109
110     rawData[rawPos + x] = val;
111   }
112 }
113
114 function filterSumPaeth(pxData, pxPos, byteWidth, bpp) {
115   var sum = 0;
116   for (var x = 0; x < byteWidth; x++) {
117
118     var left = x >= bpp ? pxData[pxPos + x - bpp] : 0;
119     var up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;
120     var upleft = pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0;
121     var val = pxData[pxPos + x] - paethPredictor(left, up, upleft);
122
123     sum += Math.abs(val);
124   }
125
126   return sum;
127 }
128
129 var filters = {
130   0: filterNone,
131   1: filterSub,
132   2: filterUp,
133   3: filterAvg,
134   4: filterPaeth
135 };
136
137 var filterSums = {
138   0: filterSumNone,
139   1: filterSumSub,
140   2: filterSumUp,
141   3: filterSumAvg,
142   4: filterSumPaeth
143 };
144
145 module.exports = function(pxData, width, height, options, bpp) {
146
147   var filterTypes;
148   if (!('filterType' in options) || options.filterType === -1) {
149     filterTypes = [0, 1, 2, 3, 4];
150   }
151   else if (typeof options.filterType === 'number') {
152     filterTypes = [options.filterType];
153   }
154   else {
155     throw new Error('unrecognised filter types');
156   }
157
158   if (options.bitDepth === 16) {
159     bpp *= 2;
160   }
161   var byteWidth = width * bpp;
162   var rawPos = 0;
163   var pxPos = 0;
164   var rawData = new Buffer((byteWidth + 1) * height);
165
166   var sel = filterTypes[0];
167
168   for (var y = 0; y < height; y++) {
169
170     if (filterTypes.length > 1) {
171       // find best filter for this line (with lowest sum of values)
172       var min = Infinity;
173
174       for (var i = 0; i < filterTypes.length; i++) {
175         var sum = filterSums[filterTypes[i]](pxData, pxPos, byteWidth, bpp);
176         if (sum < min) {
177           sel = filterTypes[i];
178           min = sum;
179         }
180       }
181     }
182
183     rawData[rawPos] = sel;
184     rawPos++;
185     filters[sel](pxData, pxPos, byteWidth, rawData, rawPos, bpp);
186     rawPos += byteWidth;
187     pxPos += byteWidth;
188   }
189   return rawData;
190 };