Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Side by Side Diff: chrome/browser/resources/file_manager/js/byte_reader.js

Issue 8748004: More accurate EXIF parsing (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/resources/file_manager/js/exif_parser.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 ByteReader = function(arrayBuffer) { 5 ByteReader = function(arrayBuffer, opt_offset, opt_length) {
6 this.buf_ = arrayBuffer; 6 opt_offset = opt_offset || 0;
7 this.view_ = new DataView(arrayBuffer); 7 opt_length = opt_length || (arrayBuffer.byteLength - opt_offset);
8 this.view_ = new DataView(arrayBuffer, opt_offset, opt_length);
8 this.pos_ = 0; 9 this.pos_ = 0;
9 this.seekStack_ = []; 10 this.seekStack_ = [];
10 this.setByteOrder(ByteReader.BIG_ENDIAN); 11 this.setByteOrder(ByteReader.BIG_ENDIAN);
11 }; 12 };
12 13
13 // Static const and methods. 14 // Static const and methods.
14 15
15 ByteReader.LITTLE_ENDIAN = 0; // Intel, 0x1234 is [0x34, 0x12] 16 ByteReader.LITTLE_ENDIAN = 0; // Intel, 0x1234 is [0x34, 0x12]
16 ByteReader.BIG_ENDIAN = 1; // Motorola, 0x1234 is [0x12, 0x34] 17 ByteReader.BIG_ENDIAN = 1; // Motorola, 0x1234 is [0x12, 0x34]
17 18
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 format = 'unknown'; 138 format = 'unknown';
138 } 139 }
139 140
140 var b64 = ByteReader.readBase64(dataView, pos, size, opt_end); 141 var b64 = ByteReader.readBase64(dataView, pos, size, opt_end);
141 return 'data:image/' + format + ';base64,' + b64; 142 return 'data:image/' + format + ';base64,' + b64;
142 }; 143 };
143 144
144 // Instance methods. 145 // Instance methods.
145 146
146 /** 147 /**
148 * Return true if the requested number of bytes can be read from the buffer.
149 */
150 ByteReader.prototype.canRead = function(size) {
151 return this.pos_ + size <= this.view_.byteLength;
152 },
153
154 /**
147 * Return true if the current position is past the end of the buffer. 155 * Return true if the current position is past the end of the buffer.
148 */ 156 */
149 ByteReader.prototype.eof = function() { 157 ByteReader.prototype.eof = function() {
150 return this.pos_ >= this.view_.byteLength; 158 return this.pos_ >= this.view_.byteLength;
151 }; 159 };
152 160
153 /** 161 /**
154 * Return true if the current position is before the beginning of the buffer. 162 * Return true if the current position is before the beginning of the buffer.
155 */ 163 */
156 ByteReader.prototype.bof = function() { 164 ByteReader.prototype.bof = function() {
157 return this.pos_ < 0; 165 return this.pos_ < 0;
158 }; 166 };
159 167
160 /** 168 /**
161 * Return true if the current position is oustide the buffer. 169 * Return true if the current position is outside the buffer.
162 */ 170 */
163 ByteReader.prototype.beof = function() { 171 ByteReader.prototype.beof = function() {
164 return this.pos_ >= this.view_.byteLength || this.pos_ < 0; 172 return this.pos_ >= this.view_.byteLength || this.pos_ < 0;
165 }; 173 };
166 174
167 /** 175 /**
168 * Set the expected byte ordering for future reads. 176 * Set the expected byte ordering for future reads.
169 */ 177 */
170 ByteReader.prototype.setByteOrder = function(order) { 178 ByteReader.prototype.setByteOrder = function(order) {
171 this.littleEndian_ = order == ByteReader.LITTLE_ENDIAN; 179 this.littleEndian_ = order == ByteReader.LITTLE_ENDIAN;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 * Read as an array of numbers. 264 * Read as an array of numbers.
257 * 265 *
258 * Adjusts the current position on success. Throws an exception if the 266 * Adjusts the current position on success. Throws an exception if the
259 * read would go past the end of the buffer. 267 * read would go past the end of the buffer.
260 */ 268 */
261 ByteReader.prototype.readSlice = function(size, opt_end, 269 ByteReader.prototype.readSlice = function(size, opt_end,
262 opt_arrayConstructor) { 270 opt_arrayConstructor) {
263 this.validateRead(width, opt_end); 271 this.validateRead(width, opt_end);
264 272
265 var arrayConstructor = opt_arrayConstructor || Uint8Array; 273 var arrayConstructor = opt_arrayConstructor || Uint8Array;
266 var slice = new arrayConstructor(this.buf_, this.pos_, size); 274 var slice = new arrayConstructor(
275 this.view_.buffer, this.view_.byteOffset + this.pos, size);
267 this.pos_ += size; 276 this.pos_ += size;
268 277
269 return slice; 278 return slice;
270 }; 279 };
271 280
272 /** 281 /**
273 * Read as a sequence of bytes, returning them as a single base64 encoded 282 * Read as a sequence of bytes, returning them as a single base64 encoded
274 * string. 283 * string.
275 * 284 *
276 * Adjusts the current position on success. Throws an exception if the 285 * Adjusts the current position on success. Throws an exception if the
(...skipping 25 matching lines...) Expand all
302 311
303 var newPos; 312 var newPos;
304 if (opt_seekStart == ByteReader.SEEK_CUR) { 313 if (opt_seekStart == ByteReader.SEEK_CUR) {
305 newPos = this.pos_ + pos; 314 newPos = this.pos_ + pos;
306 } else if (opt_seekStart == ByteReader.SEEK_END) { 315 } else if (opt_seekStart == ByteReader.SEEK_END) {
307 newPos = opt_end + pos; 316 newPos = opt_end + pos;
308 } else { 317 } else {
309 newPos = pos; 318 newPos = pos;
310 } 319 }
311 320
312 if (newPos < 0 || newPos >= this.view_.byteLength) 321 if (newPos < 0 || newPos > this.view_.byteLength)
313 throw new Error('Seek outside of buffer: ' + (newPos - opt_end)); 322 throw new Error('Seek outside of buffer: ' + (newPos - opt_end));
314 323
315 this.pos_ = newPos; 324 this.pos_ = newPos;
316 }; 325 };
317 326
318 /** 327 /**
319 * Seek to a given position relative to opt_seekStart, saving the current 328 * Seek to a given position relative to opt_seekStart, saving the current
320 * position. 329 * position.
321 * 330 *
322 * Recover the current position with a call to seekPop. 331 * Recover the current position with a call to seekPop.
(...skipping 11 matching lines...) Expand all
334 ByteReader.prototype.popSeek = function() { 343 ByteReader.prototype.popSeek = function() {
335 this.seek(this.seekStack_.pop()); 344 this.seek(this.seekStack_.pop());
336 }; 345 };
337 346
338 /** 347 /**
339 * Return the current read position. 348 * Return the current read position.
340 */ 349 */
341 ByteReader.prototype.tell = function() { 350 ByteReader.prototype.tell = function() {
342 return this.pos_; 351 return this.pos_;
343 }; 352 };
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/resources/file_manager/js/exif_parser.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698