blob: 4d672b244c074cae46fdc43b4058bd8b5a876dce [file] [log] [blame]
/*
* Copyright 2014 The Android Open Source Project
*
* 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
*
* http://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 IMG_UTILS_TIFF_ENTRY
#define IMG_UTILS_TIFF_ENTRY
#include <img_utils/TiffWritable.h>
#include <img_utils/TiffHelpers.h>
#include <img_utils/EndianUtils.h>
#include <cutils/compiler.h>
#include <utils/String8.h>
#include <utils/Errors.h>
#include <stdint.h>
namespace android {
namespace img_utils {
#define COMPARE_DEF(op) \
inline bool operator op (const TiffEntry& entry) const;
/**
* This class holds a single TIFF IFD entry.
*
* Subclasses are expected to support assignment and copying operations.
*/
class ANDROID_API TiffEntry : public TiffWritable {
public:
virtual ~TiffEntry();
/**
* Write the 12-byte IFD entry to the output. The given offset will be
* set as the tag value if the size of the tag value exceeds the max
* size for the TIFF Value field (4 bytes), and should be word aligned.
*
* Returns OK on success, or a negative error code on failure.
*/
virtual status_t writeTagInfo(uint32_t offset, /*out*/EndianOutput* out) const = 0;
/**
* Get the count set for this entry. This corresponds to the TIFF Count
* field.
*/
virtual uint32_t getCount() const = 0;
/**
* Get the tag id set for this entry. This corresponds to the TIFF Tag
* field.
*/
virtual uint16_t getTag() const = 0;
/**
* Get the type set for this entry. This corresponds to the TIFF Type
* field.
*/
virtual TagType getType() const = 0;
/**
* Get the defined endianness for this entry. If this is defined,
* the tag value will be written with the given byte order.
*/
virtual Endianness getEndianness() const = 0;
/**
* Get the value for this entry. This corresponds to the TIFF Value
* field.
*
* Returns NULL if the value is NULL, or if the type used does not
* match the type of this tag.
*/
template<typename T>
const T* getData() const;
virtual String8 toString() const;
/**
* Force the type used here to be a valid TIFF type.
*
* Returns NULL if the given value is NULL, or if the type given does
* not match the type of the value given.
*/
template<typename T>
static const T* forceValidType(TagType type, const T* value);
virtual const void* getDataHelper() const = 0;
COMPARE_DEF(>)
COMPARE_DEF(<)
protected:
enum {
MAX_PRINT_STRING_LENGTH = 256
};
};
#define COMPARE(op) \
bool TiffEntry::operator op (const TiffEntry& entry) const { \
return getComparableValue() op entry.getComparableValue(); \
}
COMPARE(>)
COMPARE(<)
template<typename T>
const T* TiffEntry::getData() const {
const T* value = reinterpret_cast<const T*>(getDataHelper());
return forceValidType<T>(getType(), value);
}
#undef COMPARE
#undef COMPARE_DEF
} /*namespace img_utils*/
} /*namespace android*/
#endif /*IMG_UTILS_TIFF_ENTRY*/