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