From fb9f1ae3e8823d4cf8cacec22421ed5efeb5e06a Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Fri, 16 Aug 2013 15:01:02 -0700 Subject: [PATCH 1/2] Totally re-write favicon notifier - Black on white text - Larger font - Works with any size favicon (16, 32, 64) --- .../external/jquery.faviconNotify.js | 273 ++++-------------- 1 file changed, 50 insertions(+), 223 deletions(-) diff --git a/app/assets/javascripts/external/jquery.faviconNotify.js b/app/assets/javascripts/external/jquery.faviconNotify.js index e0c370b9d0c..984bd2dd0d3 100644 --- a/app/assets/javascripts/external/jquery.faviconNotify.js +++ b/app/assets/javascripts/external/jquery.faviconNotify.js @@ -1,226 +1,53 @@ /** - * jQuery Favicon Notify - * - * Updates the favicon to notify the user of changes. In the original tests I - * had an embedded font collection to allow any charachers - I decided that the - * ~130Kb and added complexity was overkill. As such it now uses a manual glyph - * set meaning that only numerical notifications are possible. - * - * Dual licensed under the MIT and GPL licenses: - * - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - * @author David King - * @copyright Copyright (c) 2011 + - * @url oodavid.com - */ +* jQuery Favicon Notify +* +* Updates the favicon with a number to notify the user of changes. +* +* iconUrl: Url of favicon image or icon +* count: Integer count to place above favicon +* +* $.faviconNotify(iconUrl, count) +*/ (function($){ - var canvas; - var bg = '#000000'; - var fg = '#FFFFFF'; - var pos = 'br'; - $.faviconNotify = function(icon, num, myPos, myBg, myFg){ - // Default the positions - myPos = myPos || pos; - myFg = myFg || fg; - myBg = myBg || bg; - // Create a canvas if we need one - canvas = canvas || $('')[0]; - if(canvas.getContext){ - // Load the icon - $('').load(function(e){ - // Load the icon into the canvas - canvas.height = canvas.width = 16; - var ctx = canvas.getContext('2d'); - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(this, 0, 0); - // We gots num? - if(num !== undefined){ - num = parseFloat(num, 10); - // Convert the num into a glyphs array - var myGlyphs = []; - if(num > 99){ - myGlyphs.push(glyphs['LOTS']); - } else { - num = num.toString().split(''); - $.each(num, function(k,v){ - myGlyphs.push(glyphs[v]); - }); - } - if(num>0) { - // Merge the glyphs together - var combined = []; - var glyphHeight = myGlyphs[0].length; - $.each(myGlyphs, function(k,v){ - for(y=0; y').attr('href', canvas.toDataURL('image/png'))); - }).attr('src', icon) - } - }; - var glyphs = { - '0': [ - ' --- ', - ' -@@@- ', - '-@---@-', - '-@- -@-', - '-@- -@-', - '-@- -@-', - '-@---@-', - ' -@@@- ', - ' --- ' ], - '1': [ - ' - ', - ' -@- ', - '-@@- ', - ' -@- ', - ' -@- ', - ' -@- ', - ' -@- ', - '-@@@-', - ' --- ' ], - '2': [ - ' --- ', - ' -@@@- ', - '-@---@-', - ' - --@-', - ' -@@- ', - ' -@-- ', - '-@---- ', - '-@@@@@-', - ' ----- ' ], - '3': [ - ' --- ', - ' -@@@- ', - '-@---@-', - ' - --@-', - ' -@@- ', - ' - --@-', - '-@---@-', - ' -@@@- ', - ' --- ' ], - '4': [ - ' -- ', - ' -@@-', - ' -@-@-', - ' -@--@-', - '-@---@-', - '-@@@@@-', - ' ----@-', - ' -@-', - ' - ' ], - '5': [ - ' ----- ', - '-@@@@@-', - '-@---- ', - '-@--- ', - '-@@@@- ', - ' ----@-', - '-@---@-', - ' -@@@- ', - ' --- ' ], - '6': [ - ' --- ', - ' -@@@- ', - '-@---@-', - '-@---- ', - '-@@@@- ', - '-@---@-', - '-@---@-', - ' -@@@- ', - ' --- ' ], - '7': [ - ' ----- ', - '-@@@@@-', - ' ----@-', - ' -@- ', - ' -@- ', - ' -@- ', - ' -@- ', - ' -@- ', - ' - ' ], - '8': [ - ' --- ', - ' -@@@- ', - '-@---@-', - '-@---@-', - ' -@@@- ', - '-@---@-', - '-@---@-', - ' -@@@- ', - ' --- ' ], - '9': [ - ' --- ', - ' -@@@- ', - '-@---@-', - '-@---@-', - ' -@@@@-', - ' ----@-', - '-@---@-', - ' -@@@- ', - ' --- ' ], - '!': [ - ' - ', - '-@-', - '-@-', - '-@-', - '-@-', - '-@-', - ' - ', - '-@-', - ' - ' ], - '.': [ - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' - ', - '-@-', - ' - ' ], - 'LOTS': [ - ' - -- --- -- ', - '-@- -@@-@@@--@@-', - '-@--@--@-@--@- ', - '-@--@--@-@--@- ', - '-@--@--@-@- -@- ', - '-@--@--@-@- -@-', - '-@--@--@-@----@-', - '-@@@-@@--@-@@@- ', - ' --- -- - --- ' - ] - }; + $.faviconNotify = function(iconUrl, count){ + var canvas = canvas || $('')[0], + img = $('')[0], + multiplier, fontSize, context, xOffset, yOffset; + + if (canvas.getContext) { + if (count < 1) { count = '' } + else if (count < 10) { count = ' ' + count } + else if (count > 99) { count = '99' } + + img.onload = function () { + canvas.height = canvas.width = this.width; + multiplier = (this.width / 16); + + fontSize = multiplier * 11; + xOffset = multiplier; + yOffset = multiplier * 11; + + context = canvas.getContext('2d'); + context.drawImage(this, 0, 0); + context.font = 'bold ' + fontSize + 'px "helvetica", sans-serif'; + + context.fillStyle = '#FFF'; + context.fillText(count, xOffset, yOffset); + context.fillText(count, xOffset + 2, yOffset); + context.fillText(count, xOffset, yOffset + 2); + context.fillText(count, xOffset + 2, yOffset + 2); + + context.fillStyle = '#000'; + context.fillText(count, xOffset + 1, yOffset + 1); + + $('link[rel$=icon]').remove(); + $('head').append( + $('').attr( + 'href', canvas.toDataURL('image/png') + ) + ); + }; + img.src = iconUrl; + } + }; })(jQuery); From ef7231a66ff25b96bfd4230a670f7832f6250beb Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Fri, 16 Aug 2013 18:05:19 -0700 Subject: [PATCH 2/2] Add 32px image to default favicons (for retina) --- app/assets/images/default-favicon.ico | Bin 1342 -> 6518 bytes app/assets/images/favicon.ico | Bin 1150 -> 6518 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/assets/images/default-favicon.ico b/app/assets/images/default-favicon.ico index d20ae8eeded413f3de968472303a4dbc2a63409c..cab552a232024bfa1a894103544d0fdee3c377f1 100644 GIT binary patch literal 6518 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 literal 1342 zcmZQzU}Ruq5D);-3Je;o3=Con3=A3!3=9Gc3=9ek5OD?&U804YiZVU_zHmt0y5ef-QwV2w>c^*YPN%e!(1mPr(SDo>wH;R**FFU23rOO1`jy} zg<2sYA!#`|xmpGW26vEtWo6|Q1_lNxUS8f9IXStM(9lp$4-XF+0RaIYb93`FYisLb zIXO9y-#~sW)YsRKR!~qVgZfoPS68>(%*;$5+4%)YinD}&(9C?pRI_9 zNVvSbd?f<|gA)S-gM^KZRkyUXbSk=D7{9c%RNdLxxm!a+BanfCL578e#YRp}4&;Al z1_owlZ*T7v3=9m8F!k8zh=_EufYip~xrKM>rG`vH2cz8nO<>f79 zWMtMbFfb@HGc$);SeVYNudgp?Zf;f#4Gm?68PeF;Xr7jqmdC)r5CjdQJOu>>a9p{% zx;Aoha<(xrFz~Rjuwv6(Na)Q5GC(o(LUmY006ay_5c6? diff --git a/app/assets/images/favicon.ico b/app/assets/images/favicon.ico index db5a23d7592ff5b62294d55b8fdba26fc5d1edbd..ac54b34b9fa7b6f5ad080a759aefda2c445e6dd5 100644 GIT binary patch literal 6518 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 literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?u1_lQf1_ohn2nO*%SV3O- zKaqI7g1mA7NDne5QZKR{`xWGsK~4i3gV3-4-@!==uFlF({(p6x$p4OXAutW%Bh)IN zhnWErQcEh zUJzSJw&lOF$6JE>L17At7myxg46P