diff -r 000000000000 -r 6474c204b198 image/decoders/EXIF.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/image/decoders/EXIF.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_IMAGELIB_EXIF_H_ +#define MOZILLA_IMAGELIB_EXIF_H_ + +#include +#include "mozilla/TypedEnum.h" +#include "nsDebug.h" + +#include "Orientation.h" + +namespace mozilla { +namespace image { + +MOZ_BEGIN_ENUM_CLASS(ByteOrder, uint8_t) + Unknown, + LittleEndian, + BigEndian +MOZ_END_ENUM_CLASS(ByteOrder) + +struct EXIFData +{ + EXIFData() { } + explicit EXIFData(Orientation aOrientation) : orientation(aOrientation) { } + + const Orientation orientation; +}; + +class EXIFParser +{ +public: + static EXIFData + Parse(const uint8_t* aData, const uint32_t aLength) + { + EXIFParser parser; + return parser.ParseEXIF(aData, aLength); + } + +private: + EXIFParser() + : mStart(nullptr) + , mCurrent(nullptr) + , mLength(0) + , mRemainingLength(0) + , mByteOrder(ByteOrder::Unknown) + { } + + EXIFData ParseEXIF(const uint8_t* aData, const uint32_t aLength); + bool ParseEXIFHeader(); + bool ParseTIFFHeader(uint32_t& aIFD0OffsetOut); + bool ParseIFD0(Orientation& aOrientationOut); + bool ParseOrientation(uint16_t aType, uint32_t aCount, Orientation& aOut); + + bool Initialize(const uint8_t* aData, const uint32_t aLength); + void Advance(const uint32_t aDistance); + void JumpTo(const uint32_t aOffset); + + bool MatchString(const char* aString, const uint32_t aLength); + bool MatchUInt16(const uint16_t aValue); + bool ReadUInt16(uint16_t& aOut); + bool ReadUInt32(uint32_t& aOut); + + const uint8_t* mStart; + const uint8_t* mCurrent; + uint32_t mLength; + uint32_t mRemainingLength; + ByteOrder mByteOrder; +}; + +} +} + +#endif