blob: 91bcd9c237aed8fbdb449e95794e98debbe7aeb4 [file] [edit]
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef THIRD_PARTY_CREDENTIO_FORMATS_TIFF_CONSTANTS_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_TIFF_CONSTANTS_H_
#include <cstdint>
#include "absl/strings/string_view.h"
namespace credentio {
// The size of an IFD Entry: tag (2) + type (2) + count (4) + value/offset (4)
constexpr int64_t kTiffIfdEntrySize = 12;
// The size of an IFD: count (2) + next offset (4) + with a single entry.
constexpr int64_t kTiffIdfOneEntrySize = 6 + kTiffIfdEntrySize;
constexpr uint16_t kTiffBigEndian = 0x4d4d;
constexpr uint16_t kTiffLittleEndian = 0x4949;
constexpr uint16_t kTiffMarker = 0x002a;
constexpr uint32_t kTiffBigEndianHeader = 0x4d4d002a;
// This is for quick asset checking in BigEndian order if the asset is a valid
// LittleEndian TIFF.
constexpr uint32_t kTiffLittleEndianHeader = 0x49492a00;
// This is the tag for the C2PA IFD Entry.
constexpr uint16_t kTiffTagC2pa = 0xcd41;
// These are the tag pairs that are used for offsets and byte counts.
constexpr uint16_t kTiffTagStripOffsets = 0x0111;
constexpr uint16_t kTiffTagStripByteCounts = 0x0117;
constexpr uint16_t kTiffTagFreeOffsets = 0x0120;
constexpr uint16_t kTiffTagFreeByteCounts = 0x0121;
constexpr uint16_t kTiffTagTileOffsets = 0x0144;
constexpr uint16_t kTiffTagTileByteCounts = 0x0145;
// The hex codes for IFD Entry Tags which contain Sub-IFDs.
constexpr uint16_t kTiffTagSubIfd = 0x014a;
constexpr uint16_t kTiffTagExifIfd = 0x8769;
constexpr uint16_t kTiffTagGpsInfo = 0x8825;
constexpr uint16_t kTiffTagInteroptabilityIfd = 0xA005;
// This is the decimal tag for the GPS Info Sub-IFD converted to a string.
constexpr absl::string_view kTiffGpsInfoIdentifier = "34853";
// The maximum valid tag ID in the GPS Info Sub-IFD according to EXIF 2.32.
constexpr uint16_t kMaxGpsTag = 0x001f;
// The hex codes for each of the IFD Entry Types.
constexpr uint16_t kTiffTypeByte = 0x0001; // uint8_t
constexpr uint16_t kTiffTypeAscii = 0x0002; // char
constexpr uint16_t kTiffTypeShort = 0x0003; // uint16_t
constexpr uint16_t kTiffTypeLong = 0x0004; // uint32_t
constexpr uint16_t kTiffTypeRational = 0x0005; // uint32_t/uint32_t
constexpr uint16_t kTiffTypeSByte = 0x0006; // int8_t
constexpr uint16_t kTiffTypeUndefined = 0x0007; // uint8_t (arbitrary data)
constexpr uint16_t kTiffTypeSShort = 0x0008; // int16_t
constexpr uint16_t kTiffTypeSLong = 0x0009; // int32_t
constexpr uint16_t kTiffTypeSRational = 0x000a; // int32_t/int32_t
constexpr uint16_t kTiffTypeFloat = 0x000b; // float (4-byte)
constexpr uint16_t kTiffTypeDouble = 0x000c; // double (8-byte)
constexpr uint64_t SizeOfTiffType(uint16_t field_type) {
switch (field_type) {
case kTiffTypeByte:
return 1;
case kTiffTypeAscii:
return 1;
case kTiffTypeShort:
return 2;
case kTiffTypeLong:
return 4;
case kTiffTypeRational:
return 8;
case kTiffTypeSByte:
return 1;
case kTiffTypeUndefined:
return 1;
case kTiffTypeSShort:
return 2;
case kTiffTypeSLong:
return 4;
case kTiffTypeSRational:
return 8;
case kTiffTypeFloat:
return 4;
case kTiffTypeDouble:
return 8;
default:
return 1;
}
}
constexpr uint64_t ByteSizeOfImageFileDirectory(uint16_t entry_count) {
return sizeof(uint16_t) + entry_count * kTiffIfdEntrySize + sizeof(uint32_t);
}
} // namespace credentio
#endif // THIRD_PARTY_CREDENTIO_FORMATS_TIFF_CONSTANTS_H_