|
3 | 3 | * BackgroundCheck |
4 | 4 | * http://kennethcachia.com/background-check |
5 | 5 | * |
6 | | - * v1.0.0 |
| 6 | + * v1.1.0 |
7 | 7 | */ |
8 | 8 |
|
9 | 9 | (function (root, factory) { |
|
40 | 40 | attrs.images = getElements(a.images || 'img'); |
41 | 41 | attrs.changeParent = a.changeParent || false; |
42 | 42 | attrs.threshold = a.threshold || 50; |
| 43 | + attrs.minComplexity = a.minComplexity || 30; |
43 | 44 | attrs.minOverlap = a.minOverlap || 50; |
44 | | - attrs.classes = a.classes || { dark: 'background--dark', light: 'background--light' }; |
45 | 45 | attrs.windowEvents = a.windowEvents || true; |
46 | 46 | attrs.maxDuration = a.maxDuration || 500; |
47 | 47 | attrs.mask = a.mask || { r: 0, g: 255, b: 0 }; |
48 | 48 | attrs.debug = a.debug || false; |
| 49 | + attrs.classes = a.classes || { |
| 50 | + dark: 'background--dark', |
| 51 | + light: 'background--light', |
| 52 | + complex: 'background--complex' |
| 53 | + }; |
49 | 54 |
|
50 | 55 | if (supported === undefined) { |
51 | 56 | checkSupport(); |
|
183 | 188 | for (var t = 0; t < targets.length; t++) { |
184 | 189 | target = targets[t]; |
185 | 190 | target = get('changeParent') ? target.parentNode : target; |
186 | | - target.className = target.className.replace(' ' + get('classes').light, ''); |
187 | | - target.className = target.className.replace(' ' + get('classes').dark, ''); |
| 191 | + target.classList.remove(get('classes').light); |
| 192 | + target.classList.remove(get('classes').dark); |
| 193 | + target.classList.remove(get('classes').complex); |
188 | 194 | } |
189 | 195 | } |
190 | 196 |
|
|
195 | 201 | */ |
196 | 202 | function calculatePixelBrightness(target) { |
197 | 203 | var dims = target.getBoundingClientRect(), |
198 | | - pixels, |
199 | | - lum = 0, |
| 204 | + brightness, |
| 205 | + data, |
| 206 | + pixels = 0, |
| 207 | + delta, |
| 208 | + deltaSqr = 0, |
| 209 | + mean = 0, |
| 210 | + variance, |
200 | 211 | minOverlap = 0, |
201 | 212 | mask = get('mask'); |
202 | 213 |
|
203 | 214 | if (dims.width > 0 && dims.height > 0) { |
204 | 215 | removeClasses(target); |
205 | 216 |
|
206 | 217 | target = get('changeParent') ? target.parentNode : target; |
207 | | - pixels = context.getImageData(dims.left, dims.top, dims.width, dims.height).data; |
| 218 | + data = context.getImageData(dims.left, dims.top, dims.width, dims.height).data; |
208 | 219 |
|
209 | | - for (var p = 0; p < pixels.length; p += 4) { |
| 220 | + for (var p = 0; p < data.length; p += 4) { |
210 | 221 |
|
211 | | - if (pixels[p] === mask.r && pixels[p + 1] === mask.g && pixels[p + 2] === mask.b) { |
| 222 | + if (data[p] === mask.r && data[p + 1] === mask.g && data[p + 2] === mask.b) { |
212 | 223 | minOverlap++; |
| 224 | + } else { |
| 225 | + pixels++; |
| 226 | + brightness = (0.2126 * data[p]) + (0.7152 * data[p + 1]) + (0.0722 * data[p + 2]); |
| 227 | + delta = brightness - mean; |
| 228 | + deltaSqr += delta * delta; |
| 229 | + mean = mean + delta / pixels; |
213 | 230 | } |
214 | | - |
215 | | - lum += (0.2126 * pixels[p]) + (0.7152 * pixels[p + 1]) + (0.0722 * pixels[p + 2]); |
216 | 231 | } |
217 | 232 |
|
218 | | - pixels = ((pixels.length / 4) + 1); |
219 | | - lum = lum / pixels / 255; |
| 233 | + if (minOverlap <= (data.length / 4) * (1 - (get('minOverlap') / 100))) { |
| 234 | + variance = Math.sqrt(deltaSqr / pixels) / 255; |
| 235 | + mean = mean / 255; |
| 236 | + log('Target: ' + target.className + ' lum: ' + mean + ' var: ' + variance); |
| 237 | + target.classList.add(mean <= (get('threshold') / 100) ? get('classes').dark : get('classes').light); |
220 | 238 |
|
221 | | - if (minOverlap <= pixels * (1 - (get('minOverlap') / 100))) { |
222 | | - log('Target: ' + target.className + ' lum: ' + lum); |
223 | | - target.className += ' ' + (lum <= (get('threshold') / 100) ? get('classes').dark : get('classes').light); |
| 239 | + if (variance > get('minComplexity') / 100) { |
| 240 | + target.classList.add(get('classes').complex); |
| 241 | + } |
224 | 242 | } |
225 | 243 | } |
226 | 244 | } |
|
0 commit comments