(arrayBuffer)
| 318 | } |
| 319 | |
| 320 | function getOrientation(arrayBuffer) { |
| 321 | var dataView = new DataView(arrayBuffer); |
| 322 | var length = dataView.byteLength; |
| 323 | var orientation; |
| 324 | var exifIDCode; |
| 325 | var tiffOffset; |
| 326 | var firstIFDOffset; |
| 327 | var littleEndian; |
| 328 | var endianness; |
| 329 | var app1Start; |
| 330 | var ifdStart; |
| 331 | var offset; |
| 332 | var i; |
| 333 | |
| 334 | // Only handle JPEG image (start by 0xFFD8) |
| 335 | if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) { |
| 336 | offset = 2; |
| 337 | |
| 338 | while (offset < length) { |
| 339 | if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) { |
| 340 | app1Start = offset; |
| 341 | break; |
| 342 | } |
| 343 | |
| 344 | offset++; |
| 345 | } |
| 346 | } |
| 347 | |
| 348 | if (app1Start) { |
| 349 | exifIDCode = app1Start + 4; |
| 350 | tiffOffset = app1Start + 10; |
| 351 | |
| 352 | if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') { |
| 353 | endianness = dataView.getUint16(tiffOffset); |
| 354 | littleEndian = endianness === 0x4949; |
| 355 | |
| 356 | if (littleEndian || endianness === 0x4D4D /* bigEndian */) { |
| 357 | if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) { |
| 358 | firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian); |
| 359 | |
| 360 | if (firstIFDOffset >= 0x00000008) { |
| 361 | ifdStart = tiffOffset + firstIFDOffset; |
| 362 | } |
| 363 | } |
| 364 | } |
| 365 | } |
| 366 | } |
| 367 | |
| 368 | if (ifdStart) { |
| 369 | length = dataView.getUint16(ifdStart, littleEndian); |
| 370 | |
| 371 | for (i = 0; i < length; i++) { |
| 372 | offset = ifdStart + i * 12 + 2; |
| 373 | |
| 374 | if (dataView.getUint16(offset, littleEndian) === 0x0112 /* Orientation */) { |
| 375 | |
| 376 | // 8 is the offset of the current tag's value |
| 377 | offset += 8; |
no test coverage detected