OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /* Base class for image metadata parsers that only need to look at a short | 5 /* Base class for image metadata parsers that only need to look at a short |
6 fragment at the start of the file */ | 6 fragment at the start of the file */ |
7 function SimpleImageParser(parent, type, urlFilter, headerSize) { | 7 function SimpleImageParser(parent, type, urlFilter, headerSize) { |
8 ImageParser.call(this, parent, type, urlFilter); | 8 ImageParser.call(this, parent, type, urlFilter); |
9 this.headerSize = headerSize; | 9 this.headerSize = headerSize; |
10 } | 10 } |
11 | 11 |
12 SimpleImageParser.prototype = {__proto__: ImageParser.prototype}; | 12 SimpleImageParser.prototype = {__proto__: ImageParser.prototype}; |
13 | 13 |
| 14 /** |
| 15 * @param {File} file //TODO(JSDOC). |
| 16 * @param {Object} metadata //TODO(JSDOC). |
| 17 * @param {function(Object)} callback //TODO(JSDOC). |
| 18 * @param {function(string)} errorCallback //TODO(JSDOC). |
| 19 */ |
14 SimpleImageParser.prototype.parse = function( | 20 SimpleImageParser.prototype.parse = function( |
15 file, metadata, callback, errorCallback) { | 21 file, metadata, callback, errorCallback) { |
16 var self = this; | 22 var self = this; |
17 util.readFileBytes(file, 0, this.headerSize, | 23 util.readFileBytes(file, 0, this.headerSize, |
18 function(file, br) { | 24 function(file, br) { |
19 try { | 25 try { |
20 self.parseHeader(metadata, br); | 26 self.parseHeader(metadata, br); |
21 callback(metadata); | 27 callback(metadata); |
22 } catch (e) { | 28 } catch (e) { |
23 errorCallback(e.toString()); | 29 errorCallback(e.toString()); |
24 } | 30 } |
25 }, | 31 }, |
26 errorCallback); | 32 errorCallback); |
27 }; | 33 }; |
28 | 34 |
29 | 35 |
30 function PngParser(parent) { | 36 function PngParser(parent) { |
31 SimpleImageParser.call(this, parent, 'png', /\.png$/i, 24); | 37 SimpleImageParser.call(this, parent, 'png', /\.png$/i, 24); |
32 } | 38 } |
33 | 39 |
34 PngParser.prototype = {__proto__: SimpleImageParser.prototype}; | 40 PngParser.prototype = {__proto__: SimpleImageParser.prototype}; |
35 | 41 |
| 42 /** |
| 43 * @param {Object} metadata //TODO(JSDOC). |
| 44 * @param {ByteReader} br //TODO(JSDOC). |
| 45 */ |
36 PngParser.prototype.parseHeader = function(metadata, br) { | 46 PngParser.prototype.parseHeader = function(metadata, br) { |
37 br.setByteOrder(ByteReader.BIG_ENDIAN); | 47 br.setByteOrder(ByteReader.BIG_ENDIAN); |
38 | 48 |
39 var signature = br.readString(8); | 49 var signature = br.readString(8); |
40 if (signature != '\x89PNG\x0D\x0A\x1A\x0A') | 50 if (signature != '\x89PNG\x0D\x0A\x1A\x0A') |
41 throw new Error('Invalid PNG signature: ' + signature); | 51 throw new Error('Invalid PNG signature: ' + signature); |
42 | 52 |
43 br.seek(12); | 53 br.seek(12); |
44 var ihdr = br.readString(4); | 54 var ihdr = br.readString(4); |
45 if (ihdr != 'IHDR') | 55 if (ihdr != 'IHDR') |
46 throw new Error('Missing IHDR chunk'); | 56 throw new Error('Missing IHDR chunk'); |
47 | 57 |
48 metadata.width = br.readScalar(4); | 58 metadata.width = br.readScalar(4); |
49 metadata.height = br.readScalar(4); | 59 metadata.height = br.readScalar(4); |
50 }; | 60 }; |
51 | 61 |
52 MetadataDispatcher.registerParserClass(PngParser); | 62 MetadataDispatcher.registerParserClass(PngParser); |
53 | 63 |
54 | 64 |
55 function BmpParser(parent) { | 65 function BmpParser(parent) { |
56 SimpleImageParser.call(this, parent, 'bmp', /\.bmp$/i, 28); | 66 SimpleImageParser.call(this, parent, 'bmp', /\.bmp$/i, 28); |
57 } | 67 } |
58 | 68 |
59 BmpParser.prototype = {__proto__: SimpleImageParser.prototype}; | 69 BmpParser.prototype = {__proto__: SimpleImageParser.prototype}; |
60 | 70 |
| 71 /** |
| 72 * @param {Object} metadata //TODO(JSDOC). |
| 73 * @param {ByteReader} br //TODO(JSDOC). |
| 74 */ |
61 BmpParser.prototype.parseHeader = function(metadata, br) { | 75 BmpParser.prototype.parseHeader = function(metadata, br) { |
62 br.setByteOrder(ByteReader.LITTLE_ENDIAN); | 76 br.setByteOrder(ByteReader.LITTLE_ENDIAN); |
63 | 77 |
64 var signature = br.readString(2); | 78 var signature = br.readString(2); |
65 if (signature != 'BM') | 79 if (signature != 'BM') |
66 throw new Error('Invalid BMP signature: ' + signature); | 80 throw new Error('Invalid BMP signature: ' + signature); |
67 | 81 |
68 br.seek(18); | 82 br.seek(18); |
69 metadata.width = br.readScalar(4); | 83 metadata.width = br.readScalar(4); |
70 metadata.height = br.readScalar(4); | 84 metadata.height = br.readScalar(4); |
71 }; | 85 }; |
72 | 86 |
73 MetadataDispatcher.registerParserClass(BmpParser); | 87 MetadataDispatcher.registerParserClass(BmpParser); |
74 | 88 |
75 | 89 |
76 function GifParser(parent) { | 90 function GifParser(parent) { |
77 SimpleImageParser.call(this, parent, 'gif', /\.Gif$/i, 10); | 91 SimpleImageParser.call(this, parent, 'gif', /\.Gif$/i, 10); |
78 } | 92 } |
79 | 93 |
80 GifParser.prototype = {__proto__: SimpleImageParser.prototype}; | 94 GifParser.prototype = {__proto__: SimpleImageParser.prototype}; |
81 | 95 |
| 96 /** |
| 97 * @param {Object} metadata //TODO(JSDOC). |
| 98 * @param {ByteReader} br //TODO(JSDOC). |
| 99 */ |
82 GifParser.prototype.parseHeader = function(metadata, br) { | 100 GifParser.prototype.parseHeader = function(metadata, br) { |
83 br.setByteOrder(ByteReader.LITTLE_ENDIAN); | 101 br.setByteOrder(ByteReader.LITTLE_ENDIAN); |
84 | 102 |
85 var signature = br.readString(6); | 103 var signature = br.readString(6); |
86 if (!signature.match(/GIF8(7|9)a/)) | 104 if (!signature.match(/GIF8(7|9)a/)) |
87 throw new Error('Invalid GIF signature: ' + signature); | 105 throw new Error('Invalid GIF signature: ' + signature); |
88 | 106 |
89 metadata.width = br.readScalar(2); | 107 metadata.width = br.readScalar(2); |
90 metadata.height = br.readScalar(2); | 108 metadata.height = br.readScalar(2); |
91 }; | 109 }; |
92 | 110 |
93 MetadataDispatcher.registerParserClass(GifParser); | 111 MetadataDispatcher.registerParserClass(GifParser); |
OLD | NEW |