| 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 'use strict'; | 5 'use strict'; |
| 6 | 6 |
| 7 /* Base class for image metadata parsers that only need to look at a short | 7 /* Base class for image metadata parsers that only need to look at a short |
| 8 fragment at the start of the file */ | 8 fragment at the start of the file */ |
| 9 function SimpleImageParser(parent, type, urlFilter, headerSize) { | 9 function SimpleImageParser(parent, type, urlFilter, headerSize) { |
| 10 ImageParser.call(this, parent, type, urlFilter); | 10 ImageParser.call(this, parent, type, urlFilter); |
| 11 this.headerSize = headerSize; | 11 this.headerSize = headerSize; |
| 12 } | 12 } |
| 13 | 13 |
| 14 SimpleImageParser.prototype = {__proto__: ImageParser.prototype}; | 14 SimpleImageParser.prototype = {__proto__: ImageParser.prototype}; |
| 15 | 15 |
| 16 /** | 16 /** |
| 17 * @param {File} file File to be parses. | 17 * @param {File} file File to be parses. |
| 18 * @param {Object} metadata Metadata object of the file. | 18 * @param {Object} metadata Metadata object of the file. |
| 19 * @param {function(Object)} callback Success callback. | 19 * @param {function(Object)} callback Success callback. |
| 20 * @param {function(string)} errorCallback Error callback. | 20 * @param {function(string)} errorCallback Error callback. |
| 21 */ | 21 */ |
| 22 SimpleImageParser.prototype.parse = function( | 22 SimpleImageParser.prototype.parse = function( |
| 23 file, metadata, callback, errorCallback) { | 23 file, metadata, callback, errorCallback) { |
| 24 var self = this; | 24 var self = this; |
| 25 util.readFileBytes(file, 0, this.headerSize, | 25 util.readFileBytes( |
| 26 function(file, br) { | 26 file, 0, this.headerSize, |
| 27 try { | 27 function(file, br) { |
| 28 self.parseHeader(metadata, br); | 28 try { |
| 29 callback(metadata); | 29 self.parseHeader(metadata, br); |
| 30 } catch (e) { | 30 callback(metadata); |
| 31 errorCallback(e.toString()); | 31 } catch (e) { |
| 32 } | 32 errorCallback(e.toString()); |
| 33 }, | 33 } |
| 34 errorCallback); | 34 }, |
| 35 errorCallback); |
| 35 }; | 36 }; |
| 36 | 37 |
| 37 | 38 |
| 38 function PngParser(parent) { | 39 function PngParser(parent) { |
| 39 SimpleImageParser.call(this, parent, 'png', /\.png$/i, 24); | 40 SimpleImageParser.call(this, parent, 'png', /\.png$/i, 24); |
| 40 } | 41 } |
| 41 | 42 |
| 42 PngParser.prototype = {__proto__: SimpleImageParser.prototype}; | 43 PngParser.prototype = {__proto__: SimpleImageParser.prototype}; |
| 43 | 44 |
| 44 /** | 45 /** |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 throw new Error('Invalid WEBP signature: ' + webpSignature); | 137 throw new Error('Invalid WEBP signature: ' + webpSignature); |
| 137 | 138 |
| 138 var chunkFormat = br.readString(4); | 139 var chunkFormat = br.readString(4); |
| 139 switch (chunkFormat) { | 140 switch (chunkFormat) { |
| 140 // VP8 lossy bitstream format. | 141 // VP8 lossy bitstream format. |
| 141 case 'VP8 ': | 142 case 'VP8 ': |
| 142 br.seek(23); | 143 br.seek(23); |
| 143 var lossySignature = br.readScalar(2) | (br.readScalar(1) << 16); | 144 var lossySignature = br.readScalar(2) | (br.readScalar(1) << 16); |
| 144 if (lossySignature != 0x2a019d) { | 145 if (lossySignature != 0x2a019d) { |
| 145 throw new Error('Invalid VP8 lossy bitstream signature: ' + | 146 throw new Error('Invalid VP8 lossy bitstream signature: ' + |
| 146 lossySignature); | 147 lossySignature); |
| 147 } | 148 } |
| 148 var dimensionBits = br.readScalar(4); | 149 var dimensionBits = br.readScalar(4); |
| 149 metadata.width = dimensionBits & 0x3fff; | 150 metadata.width = dimensionBits & 0x3fff; |
| 150 metadata.height = (dimensionBits >> 16) & 0x3fff; | 151 metadata.height = (dimensionBits >> 16) & 0x3fff; |
| 151 break; | 152 break; |
| 152 | 153 |
| 153 // VP8 lossless bitstream format. | 154 // VP8 lossless bitstream format. |
| 154 case 'VP8L': | 155 case 'VP8L': |
| 155 br.seek(20); | 156 br.seek(20); |
| 156 var losslessSignature = br.readScalar(1); | 157 var losslessSignature = br.readScalar(1); |
| 157 if (losslessSignature != 0x2f) { | 158 if (losslessSignature != 0x2f) { |
| 158 throw new Error('Invalid VP8 lossless bitstream signature: ' + | 159 throw new Error('Invalid VP8 lossless bitstream signature: ' + |
| 159 losslessSignature); | 160 losslessSignature); |
| 160 } | 161 } |
| 161 var dimensionBits = br.readScalar(4); | 162 var dimensionBits = br.readScalar(4); |
| 162 metadata.width = (dimensionBits & 0x3fff) + 1; | 163 metadata.width = (dimensionBits & 0x3fff) + 1; |
| 163 metadata.height = ((dimensionBits >> 14) & 0x3fff) + 1; | 164 metadata.height = ((dimensionBits >> 14) & 0x3fff) + 1; |
| 164 break; | 165 break; |
| 165 | 166 |
| 166 // VP8 extended file format. | 167 // VP8 extended file format. |
| 167 case 'VP8X': | 168 case 'VP8X': |
| 168 br.seek(20); | 169 br.seek(20); |
| 169 // Read 24-bit value. ECMAScript assures left-to-right evaluation order. | 170 // Read 24-bit value. ECMAScript assures left-to-right evaluation order. |
| 170 metadata.width = (br.readScalar(2) | (br.readScalar(1) << 16)) + 1; | 171 metadata.width = (br.readScalar(2) | (br.readScalar(1) << 16)) + 1; |
| 171 metadata.height = (br.readScalar(2) | (br.readScalar(1) << 16)) + 1; | 172 metadata.height = (br.readScalar(2) | (br.readScalar(1) << 16)) + 1; |
| 172 break; | 173 break; |
| 173 | 174 |
| 174 default: | 175 default: |
| 175 throw new Error('Invalid chunk format: ' + chunkFormat); | 176 throw new Error('Invalid chunk format: ' + chunkFormat); |
| 176 } | 177 } |
| 177 }; | 178 }; |
| 178 | 179 |
| 179 MetadataDispatcher.registerParserClass(WebpParser); | 180 MetadataDispatcher.registerParserClass(WebpParser); |
| 180 | 181 |
| 181 /** | 182 /** |
| 182 * Parser for the header of .ico icon files. | 183 * Parser for the header of .ico icon files. |
| 183 * @param {MetadataDispatcher} parent Parent metadata dispatcher object. | 184 * @param {MetadataDispatcher} parent Parent metadata dispatcher object. |
| 184 * @constructor | 185 * @constructor |
| 185 * @extends SimpleImageParser | 186 * @extends {SimpleImageParser} |
| 186 */ | 187 */ |
| 187 function IcoParser(parent) { | 188 function IcoParser(parent) { |
| 188 SimpleImageParser.call(this, parent, 'ico', /\.ico$/i, 8); | 189 SimpleImageParser.call(this, parent, 'ico', /\.ico$/i, 8); |
| 189 } | 190 } |
| 190 | 191 |
| 191 IcoParser.prototype = {__proto__: SimpleImageParser.prototype}; | 192 IcoParser.prototype = {__proto__: SimpleImageParser.prototype}; |
| 192 | 193 |
| 193 /** | 194 /** |
| 194 * Parse the binary data as a ico header and stores to metadata. | 195 * Parse the binary data as a ico header and stores to metadata. |
| 195 * @param {Object} metadata Dictionary to store the parser metadata. | 196 * @param {Object} metadata Dictionary to store the parser metadata. |
| 196 * @param {ByteReader} byteReader Reader for header binary data. | 197 * @param {ByteReader} byteReader Reader for header binary data. |
| 197 */ | 198 */ |
| 198 IcoParser.prototype.parseHeader = function(metadata, byteReader) { | 199 IcoParser.prototype.parseHeader = function(metadata, byteReader) { |
| 199 byteReader.setByteOrder(ByteReader.LITTLE_ENDIAN); | 200 byteReader.setByteOrder(ByteReader.LITTLE_ENDIAN); |
| 200 | 201 |
| 201 var signature = byteReader.readString(4); | 202 var signature = byteReader.readString(4); |
| 202 if (signature !== '\x00\x00\x00\x01') | 203 if (signature !== '\x00\x00\x00\x01') |
| 203 throw new Error('Invalid ICO signature: ' + signature); | 204 throw new Error('Invalid ICO signature: ' + signature); |
| 204 | 205 |
| 205 byteReader.seek(2); | 206 byteReader.seek(2); |
| 206 metadata.width = byteReader.readScalar(1); | 207 metadata.width = byteReader.readScalar(1); |
| 207 metadata.height = byteReader.readScalar(1); | 208 metadata.height = byteReader.readScalar(1); |
| 208 }; | 209 }; |
| 209 | 210 |
| 210 MetadataDispatcher.registerParserClass(IcoParser); | 211 MetadataDispatcher.registerParserClass(IcoParser); |
| OLD | NEW |