UNPKG

2.24 kBJavaScriptView Raw
1'use strict';
2
3/* eslint-disable no-bitwise */
4
5var ParserStream = require('../common').ParserStream;
6var str2arr = require('../common').str2arr;
7var sliceEq = require('../common').sliceEq;
8
9
10var SIG_RIFF = str2arr('RIFF');
11var SIG_WEBPVP8 = str2arr('WEBPVP8');
12
13
14function parseVP8(parser) {
15 parser._bytes(14, function (data) {
16 parser._skipBytes(Infinity);
17
18 if (data[7] !== 0x9D || data[8] !== 0x01 || data[9] !== 0x2A) {
19 // bad code block signature
20 parser.push(null);
21 return;
22 }
23
24 parser.push({
25 width: data.readUInt16LE(10) & 0x3FFF,
26 height: data.readUInt16LE(12) & 0x3FFF,
27 type: 'webp',
28 mime: 'image/webp',
29 wUnits: 'px',
30 hUnits: 'px'
31 });
32
33 parser.push(null);
34 });
35}
36
37
38function parseVP8L(parser) {
39 parser._bytes(9, function (data) {
40 parser._skipBytes(Infinity);
41
42 if (data[4] !== 0x2F) {
43 // bad code block signature
44 parser.push(null);
45 return;
46 }
47
48 var bits = data.readUInt32LE(5);
49
50 parser.push({
51 width: (bits & 0x3FFF) + 1,
52 height: ((bits >> 14) & 0x3FFF) + 1,
53 type: 'webp',
54 mime: 'image/webp',
55 wUnits: 'px',
56 hUnits: 'px'
57 });
58
59 parser.push(null);
60 });
61}
62
63
64function parseVP8X(parser) {
65 parser._bytes(14, function (data) {
66 parser._skipBytes(Infinity);
67
68 parser.push({
69 // TODO: replace with `data.readUIntLE(8, 3) + 1`
70 // when 0.10 support is dropped
71 width: ((data[10] << 16) | (data[9] << 8) | data[8]) + 1,
72 height: ((data[13] << 16) | (data[12] << 8) | data[11]) + 1,
73 type: 'webp',
74 mime: 'image/webp',
75 wUnits: 'px',
76 hUnits: 'px'
77 });
78
79 parser.push(null);
80 });
81}
82
83
84module.exports = function () {
85 var parser = new ParserStream();
86
87 parser._bytes(16, function (data) {
88
89 // check /^RIFF....WEBPVP8([ LX])$/ signature
90
91 if (sliceEq(data, 0, SIG_RIFF) && sliceEq(data, 8, SIG_WEBPVP8)) {
92 switch (data[15]) {
93 case 32/*' '*/: parseVP8(parser); return;
94 case 76/* L */: parseVP8L(parser); return;
95 case 88/* X */: parseVP8X(parser); return;
96 }
97 } else {
98 parser._skipBytes(Infinity);
99 parser.push(null);
100 }
101 });
102
103 return parser;
104};