From c03b131ea91ba2c5a794ff8bf1c29f44132f4a39 Mon Sep 17 00:00:00 2001 From: Aditya Date: Thu, 4 Jul 2013 02:19:48 +0200 Subject: [PATCH] webp stub --- lib/detector.js | 9 ++++++++- lib/index.js | 2 +- lib/types/webp.js | 10 ++++++++++ specs/.jshintrc | 9 +++++++++ specs/images.spec.js | 2 +- specs/images/sample.webp | Bin 0 -> 17578 bytes 6 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 lib/types/webp.js create mode 100644 specs/.jshintrc create mode 100644 specs/images/sample.webp diff --git a/lib/detector.js b/lib/detector.js index 4a234b4a..a22045a8 100644 --- a/lib/detector.js +++ b/lib/detector.js @@ -30,13 +30,20 @@ function isJPG (buffer) { return ('ffd8' === buffer.toString('hex', 0, 2)); } +function isWebP (buffer) { + return ('RIFF' === buffer.toString('ascii', 0, 4) && + 'WEBP' === buffer.toString('ascii', 8, 12) && + 'VP8' === buffer.toString('ascii', 12, 15)); +} + var typeMap = { 'bmp': isBMP, 'gif': isGIF, 'jpg': isJPG, 'png': isPNG, 'psd': isPSD, - 'tiff': isTIFF + 'tiff': isTIFF, + 'webp': isWebP }; module.exports = function (buffer) { diff --git a/lib/index.js b/lib/index.js index 02540570..2cc41bbe 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,7 +5,7 @@ var libpath = process.env.TEST_COV ? '../lib-cov/' : '../lib/'; var detector = require(libpath + 'detector'); var handlers = {}; -['png', 'gif', 'bmp', 'psd', 'jpg'].forEach(function (type) { +['png', 'gif', 'bmp', 'psd', 'jpg', 'webp'].forEach(function (type) { handlers[type] = require(libpath + 'types/' + type); }); diff --git a/lib/types/webp.js b/lib/types/webp.js new file mode 100644 index 00000000..22a55e5a --- /dev/null +++ b/lib/types/webp.js @@ -0,0 +1,10 @@ +module.exports = function (buffer) { + var lossless = ('L' === buffer.toString('ascii', 15, 16)); + if (lossless) { + + } else { + + } + + return {}; +}; \ No newline at end of file diff --git a/specs/.jshintrc b/specs/.jshintrc new file mode 100644 index 00000000..b0ac9a8e --- /dev/null +++ b/specs/.jshintrc @@ -0,0 +1,9 @@ +{ + "predef": [ + "module", + "require", + "describe", + "beforeEach", + "it" + ] +} \ No newline at end of file diff --git a/specs/images.spec.js b/specs/images.spec.js index 797c45a5..973b1bd0 100644 --- a/specs/images.spec.js +++ b/specs/images.spec.js @@ -3,7 +3,7 @@ var expect = require('expect.js'); var libpath = process.env.TEST_COV ? '../lib-cov/' : '../lib/'; var imageSize = require(libpath); -['png', 'gif', 'bmp', 'psd', 'jpg'].forEach(function (type) { +['png', 'gif', 'bmp', 'psd', 'jpg', 'webp'].forEach(function (type) { describe(type.toUpperCase(), function() { diff --git a/specs/images/sample.webp b/specs/images/sample.webp new file mode 100644 index 0000000000000000000000000000000000000000..b1ec7ba39f313d07af405411cb43d3956f523500 GIT binary patch literal 17578 zcmV(jK=!{uS zv5o+IA|y%_I1H-4cV^$;Uh)6Gq@{g)`IkS&ciQx~{g=`Aq;ER6n|}W9Lv2?E{IL=A zkGFr@>mzBuh42sir_b+Q-{kj;`)`OZ?BBorH9tqN*Z_A}{e|Fhw@_Xq#` zL9>Z@nfT+QpI+&$RwQev)Mtwg^;n6k+l7fQZN3+oy=2-;$!dikEi;BU1yZ z)(_3{+7qCr$G+NV+MWyDJEg$VOns2~HL3uqO}G!n0`uiaL_2H2(i{5+F-m1G><^s( z_LmKEnBD_!(~d@3lF||%RGm@v*K`U44315H*X?&bKHpmdf~rAt`#)Dm3Xb2)jb)5D zKuwpzO+=Y_I&Z`>a+G8iwgk^f_Su0I*O#n>Pl3rVeFk|Ch@dyd0_eyHqf0_^vIH4psb zCOIp#9n~KH8<;)jg}Cl$UJjmCZ-tzJ3d4{O|G#fZhUXmGBCuM5s$CG4^2N88e}KM8 z_`egUHly()|Su2ds3I5?Q`3{Ew^tyQ?QA!m7d%236d=fXuwGV&VpUb(!2 z;=$kw82gwj}MsJv3HGOol7z_oU<^gnbeqM9{Z%I!*yJ~DsHT$aV$+5NzTl_{7+4W)1{<}_HJ&U5JEc5(EcS~6^en91DY?P z^+{`l`AOA)sv;|C?Y1s{(^ze|9KOAMxRazzXZvH_6qh_-1`ZV4Zh4TGMAFVWL1QFL zucW(HesoepH|(zaV$IqEOUCckskmPHNwpEHJ0cJ0ujgyCTE=inzX>mGO#Lfc<-N0v zW!v^=SMRM|v6y;%wO?n>R`EE+B+B8ED1(LmWyFPm85XN9TEa>AF@R`6$)?VhwR38$ zi7Q(QQr#nf%3U|#(bx;%A7FP|o%M5pcBooc?I%Mf1Wqnar8V~^X0*H-&&c4chH!yx zx1cYbNUt;;9z)|@+h|4vMVf=obAgli?|mehM5-@riaG0u^}m~bz9brU-cuJ$chbf# zp4VR%#H7>jYVZ%789Ug*uCU!p9viA4LH-ko1IQ;8?l4Q`jM&J>wARY_>munBr|{>6 zs?5^7(B%X^CNY+Y7%v?bp}z&bd$`;pbf)6WOhdE)*!8nxB|j^^@G>g?YYIVL(kC*( z@1A3Mg2qaFSU)?K7o2Seg{=aWN1DT)ax97(N;Rj zmuSy@vw*5K4F8TYM3B4;O`byBAJw*%st*!vUQuX)l zV4jd5od^mp#`zlLP8%2j8VnflkyRI^$W=Wbs*`@T`!2A6nX{3A1rfFNRssS2CPDPc zQkWBaK+hJ5W2o$T1)WTR=BoY=SBBAwe@3w-7rTH1`E@u~`=UbYp zF4TRk!bs^7ooScn6o}h04ctmeoT2<_QOxQFW1T^Zz<>|Ds02+T4=Be8K)@tR?B9$R z*Wo?uiB>U!kk<2N5X7O+Cz%fC55_%NEo?U2@7sqd`_wkX)Um@=Wm!patfyzVWlHv5 z84x?KYJZd}-v~B(aRth_^y&#;*eS~ukaZRUa-(jdtw�IoX8+=0%a3#bw3OYY9X4 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 R002({;7Q3S&Anj&0081vDS7|^ literal 0 HcmV?d00001