-
-
Save jmurth1234/6162990 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Blur.js | |
* Copyright Jacob Kelley | |
* MIT License | |
*/ | |
(function ($) { | |
$.fn.blurjs = function (options) { | |
var canvas = document.createElement('canvas'); | |
var isCached = false; | |
var selector = ($(this).selector).replace(/[^a-zA-Z0-9]/g, ""); | |
if(!canvas.getContext) { | |
return; | |
} | |
options = $.extend({ | |
source: 'body', | |
radius: 5, | |
overlay: '', | |
offset: { | |
x: 0, | |
y: 0 | |
}, | |
optClass: '', | |
cache: false, | |
cacheKeyPrefix: 'blurjs-', | |
draggable: false, | |
debug: false | |
}, options); | |
// Stackblur, courtesy of Mario Klingemann: http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html | |
var mul_table = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259]; | |
var shg_table = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24]; | |
function stackBlurCanvasRGB(a, b, c, d, f, g) { | |
if(isNaN(g) || g < 1) return; | |
g |= 0; | |
var h = a.getContext("2d"); | |
var j; | |
try { | |
try { | |
j = h.getImageData(b, c, d, f) | |
} catch(e) { | |
try { | |
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); | |
j = h.getImageData(b, c, d, f) | |
} catch(e) { | |
alert("Cannot access local image"); | |
throw new Error("unable to access local image data: " + e); | |
} | |
} | |
} catch(e) { | |
alert("Cannot access image"); | |
throw new Error("unable to access image data: " + e); | |
} | |
var k = j.data; | |
var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, r_out_sum, g_out_sum, b_out_sum, r_in_sum, g_in_sum, b_in_sum, pr, pg, pb, rbs; | |
var l = g + g + 1; | |
var m = d << 2; | |
var n = d - 1; | |
var o = f - 1; | |
var q = g + 1; | |
var r = q * (q + 1) / 2; | |
var s = new BlurStack(); | |
var t = s; | |
for(i = 1; i < l; i++) { | |
t = t.next = new BlurStack(); | |
if(i == q) var u = t | |
} | |
t.next = s; | |
var v = null; | |
var w = null; | |
yw = yi = 0; | |
var z = mul_table[g]; | |
var A = shg_table[g]; | |
for(y = 0; y < f; y++) { | |
r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0; | |
r_out_sum = q * (pr = k[yi]); | |
g_out_sum = q * (pg = k[yi + 1]); | |
b_out_sum = q * (pb = k[yi + 2]); | |
r_sum += r * pr; | |
g_sum += r * pg; | |
b_sum += r * pb; | |
t = s; | |
for(i = 0; i < q; i++) { | |
t.r = pr; | |
t.g = pg; | |
t.b = pb; | |
t = t.next | |
} | |
for(i = 1; i < q; i++) { | |
p = yi + ((n < i ? n : i) << 2); | |
r_sum += (t.r = (pr = k[p])) * (rbs = q - i); | |
g_sum += (t.g = (pg = k[p + 1])) * rbs; | |
b_sum += (t.b = (pb = k[p + 2])) * rbs; | |
r_in_sum += pr; | |
g_in_sum += pg; | |
b_in_sum += pb; | |
t = t.next | |
} | |
v = s; | |
w = u; | |
for(x = 0; x < d; x++) { | |
k[yi] = (r_sum * z) >> A; | |
k[yi + 1] = (g_sum * z) >> A; | |
k[yi + 2] = (b_sum * z) >> A; | |
r_sum -= r_out_sum; | |
g_sum -= g_out_sum; | |
b_sum -= b_out_sum; | |
r_out_sum -= v.r; | |
g_out_sum -= v.g; | |
b_out_sum -= v.b; | |
p = (yw + ((p = x + g + 1) < n ? p : n)) << 2; | |
r_in_sum += (v.r = k[p]); | |
g_in_sum += (v.g = k[p + 1]); | |
b_in_sum += (v.b = k[p + 2]); | |
r_sum += r_in_sum; | |
g_sum += g_in_sum; | |
b_sum += b_in_sum; | |
v = v.next; | |
r_out_sum += (pr = w.r); | |
g_out_sum += (pg = w.g); | |
b_out_sum += (pb = w.b); | |
r_in_sum -= pr; | |
g_in_sum -= pg; | |
b_in_sum -= pb; | |
w = w.next; | |
yi += 4 | |
} | |
yw += d | |
} | |
for(x = 0; x < d; x++) { | |
g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0; | |
yi = x << 2; | |
r_out_sum = q * (pr = k[yi]); | |
g_out_sum = q * (pg = k[yi + 1]); | |
b_out_sum = q * (pb = k[yi + 2]); | |
r_sum += r * pr; | |
g_sum += r * pg; | |
b_sum += r * pb; | |
t = s; | |
for(i = 0; i < q; i++) { | |
t.r = pr; | |
t.g = pg; | |
t.b = pb; | |
t = t.next | |
} | |
yp = d; | |
for(i = 1; i <= g; i++) { | |
yi = (yp + x) << 2; | |
r_sum += (t.r = (pr = k[yi])) * (rbs = q - i); | |
g_sum += (t.g = (pg = k[yi + 1])) * rbs; | |
b_sum += (t.b = (pb = k[yi + 2])) * rbs; | |
r_in_sum += pr; | |
g_in_sum += pg; | |
b_in_sum += pb; | |
t = t.next; | |
if(i < o) { | |
yp += d | |
} | |
} | |
yi = x; | |
v = s; | |
w = u; | |
for(y = 0; y < f; y++) { | |
p = yi << 2; | |
k[p] = (r_sum * z) >> A; | |
k[p + 1] = (g_sum * z) >> A; | |
k[p + 2] = (b_sum * z) >> A; | |
r_sum -= r_out_sum; | |
g_sum -= g_out_sum; | |
b_sum -= b_out_sum; | |
r_out_sum -= v.r; | |
g_out_sum -= v.g; | |
b_out_sum -= v.b; | |
p = (x + (((p = y + q) < o ? p : o) * d)) << 2; | |
r_sum += (r_in_sum += (v.r = k[p])); | |
g_sum += (g_in_sum += (v.g = k[p + 1])); | |
b_sum += (b_in_sum += (v.b = k[p + 2])); | |
v = v.next; | |
r_out_sum += (pr = w.r); | |
g_out_sum += (pg = w.g); | |
b_out_sum += (pb = w.b); | |
r_in_sum -= pr; | |
g_in_sum -= pg; | |
b_in_sum -= pb; | |
w = w.next; | |
yi += d | |
} | |
} | |
h.putImageData(j, b, c) | |
} | |
function BlurStack() { | |
this.r = 0; | |
this.g = 0; | |
this.b = 0; | |
this.a = 0; | |
this.next = null | |
} | |
return this.each(function () { | |
var $glue = $(this); | |
var $source = $(options.source); | |
var formattedSource = ($source.css('backgroundImage')).replace(/"/g, "").replace(/url\(|\)$/ig, ""); | |
ctx = canvas.getContext('2d'); | |
tempImg = new Image(); | |
tempImg.onload = function () { | |
if(!isCached) { | |
canvas.style.display = "none"; | |
canvas.width = tempImg.width; | |
canvas.height = tempImg.height; | |
ctx.drawImage(tempImg, 0, 0); | |
stackBlurCanvasRGB(canvas, 0, 0, canvas.width, canvas.height, options.radius); | |
if(options.overlay != false) { | |
ctx.beginPath(); | |
ctx.rect(0, 0, tempImg.width, tempImg.width); | |
ctx.fillStyle = options.overlay; | |
ctx.fill(); | |
} | |
var blurredData = canvas.toDataURL(); | |
if(options.cache) { | |
try { | |
if(options.debug) { | |
console.log('Cache Set'); | |
} | |
localStorage.setItem(options.cacheKeyPrefix + selector + '-' + formattedSource + '-data-image', blurredData); | |
} catch(e) { | |
console.log(e); | |
} | |
} | |
} else { | |
var blurredData = tempImg.src; | |
} | |
var attachment = $source.css('backgroundAttachment'); | |
var position = (attachment == 'fixed') ? '' : '-' + (($glue.offset().left) - ($source.offset().left) - (options.offset.x)) + 'px -' + (($glue.offset().top) - ($source.offset().top) - (options.offset.y)) + 'px'; | |
$glue.css({ | |
'background-image': 'url("' + blurredData + '")', | |
'background-repeat': $source.css('backgroundRepeat'), | |
'background-position': position, | |
'background-attachment': attachment | |
}); | |
if(options.optClass != false) { | |
$glue.addClass(options.optClass); | |
} | |
if(options.draggable) { | |
$glue.css({ | |
'background-attachment': 'fixed', | |
'background-position': '0 0' | |
}); | |
$glue.draggable(); | |
} | |
}; | |
Storage.prototype.cacheChecksum = function (opts) { | |
var newData = ''; | |
for(var key in opts) { | |
var obj = opts[key]; | |
if(obj.toString() == '[object Object]') { | |
newData += ((obj.x).toString() + (obj.y).toString() + ",").replace(/[^a-zA-Z0-9]/g, ""); | |
} else { | |
newData += (obj + ",").replace(/[^a-zA-Z0-9]/g, ""); | |
} | |
} | |
var originalData = this.getItem(options.cacheKeyPrefix + selector + '-' + formattedSource + '-options-cache'); | |
if(originalData != newData) { | |
this.removeItem(options.cacheKeyPrefix + selector + '-' + formattedSource + '-options-cache'); | |
this.setItem(options.cacheKeyPrefix + selector + '-' + formattedSource + '-options-cache', newData); | |
if(options.debug) { | |
console.log('Settings Changed, Cache Emptied'); | |
} | |
} | |
}; | |
var cachedData = null; | |
if(options.cache) { | |
localStorage.cacheChecksum(options); | |
cachedData = localStorage.getItem(options.cacheKeyPrefix + selector + '-' + formattedSource + '-data-image'); | |
} | |
if(cachedData != null) { | |
if(options.debug) { | |
console.log('Cache Used'); | |
} | |
isCached = true; | |
tempImg.src = (cachedData); | |
} else { | |
if(options.debug) { | |
console.log('Source Used'); | |
} | |
tempImg.src = formattedSource; | |
} | |
}); | |
}; | |
})(jQuery); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$('#container').blurjs({source: 'body',radius: 10}); | |
[ | |
<div id="container">… | |
] | |
GET http://rymate.x10.mx/test/none 404 (Not Found) blur.min.js:285 | |
(anonymous function) blur.min.js:285 | |
jQuery.extend.each jquery-1.7.1.js:658 | |
jQuery.fn.jQuery.each jquery-1.7.1.js:271 | |
$.fn.blurjs blur.min.js:199 | |
(anonymous function) | |
InjectedScript._evaluateOn | |
InjectedScript._evaluateAndWrap | |
InjectedScript.evaluate |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<body> | |
<div id="page"> | |
<div id="container"> | |
<div id="post"> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam viverra eros id sem sagittis vulputate at sed arcu. Phasellus non nisl tortor. Praesent tristique mollis ultrices. Vestibulum eu sagittis turpis. Curabitur et congue ligula. Cras eget lacus quis mauris accumsan laoreet ut sit amet tortor. Vivamus vitae porttitor eros. Vivamus pretium dignissim fermentum. Aliquam lobortis lectus volutpat nulla congue eleifend. Fusce eget porta sem. | |
</p> | |
</div> | |
</div> | |
</div> | |
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.js"></script> | |
<script type="text/javascript" src="blur.min.js"></script> | |
<link rel="stylesheet" type="text/css" href="style.css"> | |
<script type="text/javascript"> | |
$(document).ready(function(){ | |
alert("test"); | |
$('#container').blurjs({ | |
source: 'body', | |
radius: 7, | |
overlay: 'rgba(255,255,255,0.4)' | |
}); | |
}); | |
</script> | |
</html> | |
</body> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#page { | |
background-image:url('http://www.onlinedesign4u.co.uk/LANDSCAPE_PHOTOS_FP/files/LANDSCAPE-ROBY-2000---75-OP.jpg'); | |
width:100%; | |
height:800px; | |
} | |
#container { | |
border-left: 0; | |
border-right: 0; | |
margin: 0 auto; | |
max-width: 1600px; | |
width: 80%; | |
height: 100%; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment