| 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 /** | 5 /** |
| 6 * Base class for image metadata parsers that only need to look at a short | 6 * Base class for image metadata parsers that only need to look at a short |
| 7 * fragment at the start of the file. | 7 * fragment at the start of the file. |
| 8 * @param {MetadataDispatcher} parent Parent object. | 8 * @param {MetadataParserLogger} parent Parent object. |
| 9 * @param {string} type Image type. | 9 * @param {string} type Image type. |
| 10 * @param {RegExp} urlFilter RegExp to match URLs. | 10 * @param {RegExp} urlFilter RegExp to match URLs. |
| 11 * @param {number} headerSize Size of header. | 11 * @param {number} headerSize Size of header. |
| 12 * @constructor | 12 * @constructor |
| 13 * @struct | 13 * @struct |
| 14 * @extends {ImageParser} | 14 * @extends {ImageParser} |
| 15 */ | 15 */ |
| 16 function SimpleImageParser(parent, type, urlFilter, headerSize) { | 16 function SimpleImageParser(parent, type, urlFilter, headerSize) { |
| 17 ImageParser.call(this, parent, type, urlFilter); | 17 ImageParser.call(this, parent, type, urlFilter); |
| 18 this.headerSize = headerSize; | 18 this.headerSize = headerSize; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 44 | 44 |
| 45 /** | 45 /** |
| 46 * Parse header of an image. Inherited class must implement this. | 46 * Parse header of an image. Inherited class must implement this. |
| 47 * @param {Object} metadata Dictionary to store the parsed metadata. | 47 * @param {Object} metadata Dictionary to store the parsed metadata. |
| 48 * @param {ByteReader} byteReader Reader for header binary data. | 48 * @param {ByteReader} byteReader Reader for header binary data. |
| 49 */ | 49 */ |
| 50 SimpleImageParser.prototype.parseHeader = function(metadata, byteReader) {}; | 50 SimpleImageParser.prototype.parseHeader = function(metadata, byteReader) {}; |
| 51 | 51 |
| 52 /** | 52 /** |
| 53 * Parser for the header of png files. | 53 * Parser for the header of png files. |
| 54 * @param {MetadataDispatcher} parent Parent object. | 54 * @param {MetadataParserLogger} parent Parent object. |
| 55 * @extends {SimpleImageParser} | 55 * @extends {SimpleImageParser} |
| 56 * @constructor | 56 * @constructor |
| 57 * @struct | 57 * @struct |
| 58 */ | 58 */ |
| 59 function PngParser(parent) { | 59 function PngParser(parent) { |
| 60 SimpleImageParser.call(this, parent, 'png', /\.png$/i, 24); | 60 SimpleImageParser.call(this, parent, 'png', /\.png$/i, 24); |
| 61 } | 61 } |
| 62 | 62 |
| 63 PngParser.prototype = {__proto__: SimpleImageParser.prototype}; | 63 PngParser.prototype = {__proto__: SimpleImageParser.prototype}; |
| 64 | 64 |
| 65 /** | 65 /** |
| 66 * @override | 66 * @override |
| 67 */ | 67 */ |
| 68 PngParser.prototype.parseHeader = function(metadata, br) { | 68 PngParser.prototype.parseHeader = function(metadata, br) { |
| 69 br.setByteOrder(ByteReader.BIG_ENDIAN); | 69 br.setByteOrder(ByteReader.BIG_ENDIAN); |
| 70 | 70 |
| 71 var signature = br.readString(8); | 71 var signature = br.readString(8); |
| 72 if (signature != '\x89PNG\x0D\x0A\x1A\x0A') | 72 if (signature != '\x89PNG\x0D\x0A\x1A\x0A') |
| 73 throw new Error('Invalid PNG signature: ' + signature); | 73 throw new Error('Invalid PNG signature: ' + signature); |
| 74 | 74 |
| 75 br.seek(12); | 75 br.seek(12); |
| 76 var ihdr = br.readString(4); | 76 var ihdr = br.readString(4); |
| 77 if (ihdr != 'IHDR') | 77 if (ihdr != 'IHDR') |
| 78 throw new Error('Missing IHDR chunk'); | 78 throw new Error('Missing IHDR chunk'); |
| 79 | 79 |
| 80 metadata.width = br.readScalar(4); | 80 metadata.width = br.readScalar(4); |
| 81 metadata.height = br.readScalar(4); | 81 metadata.height = br.readScalar(4); |
| 82 }; | 82 }; |
| 83 | 83 |
| 84 MetadataDispatcher.registerParserClass(PngParser); | 84 registerParserClass(PngParser); |
| 85 | 85 |
| 86 /** | 86 /** |
| 87 * Parser for the header of bmp files. | 87 * Parser for the header of bmp files. |
| 88 * @param {MetadataDispatcher} parent Parent object. | 88 * @param {MetadataParserLogger} parent Parent object. |
| 89 * @constructor | 89 * @constructor |
| 90 * @extends {SimpleImageParser} | 90 * @extends {SimpleImageParser} |
| 91 * @struct | 91 * @struct |
| 92 */ | 92 */ |
| 93 function BmpParser(parent) { | 93 function BmpParser(parent) { |
| 94 SimpleImageParser.call(this, parent, 'bmp', /\.bmp$/i, 28); | 94 SimpleImageParser.call(this, parent, 'bmp', /\.bmp$/i, 28); |
| 95 } | 95 } |
| 96 | 96 |
| 97 BmpParser.prototype = {__proto__: SimpleImageParser.prototype}; | 97 BmpParser.prototype = {__proto__: SimpleImageParser.prototype}; |
| 98 | 98 |
| 99 /** | 99 /** |
| 100 * @override | 100 * @override |
| 101 */ | 101 */ |
| 102 BmpParser.prototype.parseHeader = function(metadata, br) { | 102 BmpParser.prototype.parseHeader = function(metadata, br) { |
| 103 br.setByteOrder(ByteReader.LITTLE_ENDIAN); | 103 br.setByteOrder(ByteReader.LITTLE_ENDIAN); |
| 104 | 104 |
| 105 var signature = br.readString(2); | 105 var signature = br.readString(2); |
| 106 if (signature != 'BM') | 106 if (signature != 'BM') |
| 107 throw new Error('Invalid BMP signature: ' + signature); | 107 throw new Error('Invalid BMP signature: ' + signature); |
| 108 | 108 |
| 109 br.seek(18); | 109 br.seek(18); |
| 110 metadata.width = br.readScalar(4); | 110 metadata.width = br.readScalar(4); |
| 111 metadata.height = br.readScalar(4); | 111 metadata.height = br.readScalar(4); |
| 112 }; | 112 }; |
| 113 | 113 |
| 114 MetadataDispatcher.registerParserClass(BmpParser); | 114 registerParserClass(BmpParser); |
| 115 | 115 |
| 116 /** | 116 /** |
| 117 * Parser for the header of gif files. | 117 * Parser for the header of gif files. |
| 118 * @param {MetadataDispatcher} parent Parent object. | 118 * @param {MetadataParserLogger} parent Parent object. |
| 119 * @constructor | 119 * @constructor |
| 120 * @extends {SimpleImageParser} | 120 * @extends {SimpleImageParser} |
| 121 * @struct | 121 * @struct |
| 122 */ | 122 */ |
| 123 function GifParser(parent) { | 123 function GifParser(parent) { |
| 124 SimpleImageParser.call(this, parent, 'gif', /\.Gif$/i, 10); | 124 SimpleImageParser.call(this, parent, 'gif', /\.Gif$/i, 10); |
| 125 } | 125 } |
| 126 | 126 |
| 127 GifParser.prototype = {__proto__: SimpleImageParser.prototype}; | 127 GifParser.prototype = {__proto__: SimpleImageParser.prototype}; |
| 128 | 128 |
| 129 /** | 129 /** |
| 130 * @override | 130 * @override |
| 131 */ | 131 */ |
| 132 GifParser.prototype.parseHeader = function(metadata, br) { | 132 GifParser.prototype.parseHeader = function(metadata, br) { |
| 133 br.setByteOrder(ByteReader.LITTLE_ENDIAN); | 133 br.setByteOrder(ByteReader.LITTLE_ENDIAN); |
| 134 | 134 |
| 135 var signature = br.readString(6); | 135 var signature = br.readString(6); |
| 136 if (!signature.match(/GIF8(7|9)a/)) | 136 if (!signature.match(/GIF8(7|9)a/)) |
| 137 throw new Error('Invalid GIF signature: ' + signature); | 137 throw new Error('Invalid GIF signature: ' + signature); |
| 138 | 138 |
| 139 metadata.width = br.readScalar(2); | 139 metadata.width = br.readScalar(2); |
| 140 metadata.height = br.readScalar(2); | 140 metadata.height = br.readScalar(2); |
| 141 }; | 141 }; |
| 142 | 142 |
| 143 MetadataDispatcher.registerParserClass(GifParser); | 143 registerParserClass(GifParser); |
| 144 | 144 |
| 145 /** | 145 /** |
| 146 * Parser for the header of webp files. | 146 * Parser for the header of webp files. |
| 147 * @param {MetadataDispatcher} parent Parent object. | 147 * @param {MetadataParserLogger} parent Parent object. |
| 148 * @constructor | 148 * @constructor |
| 149 * @extends {SimpleImageParser} | 149 * @extends {SimpleImageParser} |
| 150 * @struct | 150 * @struct |
| 151 */ | 151 */ |
| 152 function WebpParser(parent) { | 152 function WebpParser(parent) { |
| 153 SimpleImageParser.call(this, parent, 'webp', /\.webp$/i, 30); | 153 SimpleImageParser.call(this, parent, 'webp', /\.webp$/i, 30); |
| 154 } | 154 } |
| 155 | 155 |
| 156 WebpParser.prototype = {__proto__: SimpleImageParser.prototype}; | 156 WebpParser.prototype = {__proto__: SimpleImageParser.prototype}; |
| 157 | 157 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 // Read 24-bit value. ECMAScript assures left-to-right evaluation order. | 204 // Read 24-bit value. ECMAScript assures left-to-right evaluation order. |
| 205 metadata.width = (br.readScalar(2) | (br.readScalar(1) << 16)) + 1; | 205 metadata.width = (br.readScalar(2) | (br.readScalar(1) << 16)) + 1; |
| 206 metadata.height = (br.readScalar(2) | (br.readScalar(1) << 16)) + 1; | 206 metadata.height = (br.readScalar(2) | (br.readScalar(1) << 16)) + 1; |
| 207 break; | 207 break; |
| 208 | 208 |
| 209 default: | 209 default: |
| 210 throw new Error('Invalid chunk format: ' + chunkFormat); | 210 throw new Error('Invalid chunk format: ' + chunkFormat); |
| 211 } | 211 } |
| 212 }; | 212 }; |
| 213 | 213 |
| 214 MetadataDispatcher.registerParserClass(WebpParser); | 214 registerParserClass(WebpParser); |
| 215 | 215 |
| 216 /** | 216 /** |
| 217 * Parser for the header of .ico icon files. | 217 * Parser for the header of .ico icon files. |
| 218 * @param {MetadataDispatcher} parent Parent metadata dispatcher object. | 218 * @param {MetadataParserLogger} parent Parent metadata dispatcher object. |
| 219 * @constructor | 219 * @constructor |
| 220 * @extends {SimpleImageParser} | 220 * @extends {SimpleImageParser} |
| 221 */ | 221 */ |
| 222 function IcoParser(parent) { | 222 function IcoParser(parent) { |
| 223 SimpleImageParser.call(this, parent, 'ico', /\.ico$/i, 8); | 223 SimpleImageParser.call(this, parent, 'ico', /\.ico$/i, 8); |
| 224 } | 224 } |
| 225 | 225 |
| 226 IcoParser.prototype = {__proto__: SimpleImageParser.prototype}; | 226 IcoParser.prototype = {__proto__: SimpleImageParser.prototype}; |
| 227 | 227 |
| 228 /** | 228 /** |
| 229 * @override | 229 * @override |
| 230 */ | 230 */ |
| 231 IcoParser.prototype.parseHeader = function(metadata, byteReader) { | 231 IcoParser.prototype.parseHeader = function(metadata, byteReader) { |
| 232 byteReader.setByteOrder(ByteReader.LITTLE_ENDIAN); | 232 byteReader.setByteOrder(ByteReader.LITTLE_ENDIAN); |
| 233 | 233 |
| 234 var signature = byteReader.readString(4); | 234 var signature = byteReader.readString(4); |
| 235 if (signature !== '\x00\x00\x00\x01') | 235 if (signature !== '\x00\x00\x00\x01') |
| 236 throw new Error('Invalid ICO signature: ' + signature); | 236 throw new Error('Invalid ICO signature: ' + signature); |
| 237 | 237 |
| 238 byteReader.seek(2); | 238 byteReader.seek(2); |
| 239 metadata.width = byteReader.readScalar(1); | 239 metadata.width = byteReader.readScalar(1); |
| 240 metadata.height = byteReader.readScalar(1); | 240 metadata.height = byteReader.readScalar(1); |
| 241 }; | 241 }; |
| 242 | 242 |
| 243 MetadataDispatcher.registerParserClass(IcoParser); | 243 registerParserClass(IcoParser); |
| OLD | NEW |