| 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 |