1/*
2 * Copyright 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef IMG_UTILS_TIFF_ENTRY
18#define IMG_UTILS_TIFF_ENTRY
19
20#include <img_utils/TiffWritable.h>
21#include <img_utils/TiffHelpers.h>
22#include <img_utils/EndianUtils.h>
23
24#include <cutils/compiler.h>
25#include <utils/String8.h>
26#include <utils/Errors.h>
27#include <stdint.h>
28
29namespace android {
30namespace img_utils {
31
32#define COMPARE_DEF(op) \
33inline bool operator op (const TiffEntry& entry) const;
34
35/**
36 * This class holds a single TIFF IFD entry.
37 *
38 * Subclasses are expected to support assignment and copying operations.
39 */
40class ANDROID_API TiffEntry : public TiffWritable {
41    public:
42        virtual ~TiffEntry();
43
44        /**
45         * Write the 12-byte IFD entry to the output. The given offset will be
46         * set as the tag value if the size of the tag value exceeds the max
47         * size for the TIFF Value field (4 bytes), and should be word aligned.
48         *
49         * Returns OK on success, or a negative error code on failure.
50         */
51        virtual status_t writeTagInfo(uint32_t offset, /*out*/EndianOutput* out) const = 0;
52
53        /**
54         * Get the count set for this entry. This corresponds to the TIFF Count
55         * field.
56         */
57        virtual uint32_t getCount() const = 0;
58
59        /**
60         * Get the tag id set for this entry. This corresponds to the TIFF Tag
61         * field.
62         */
63        virtual uint16_t getTag() const = 0;
64
65        /**
66         * Get the type set for this entry.  This corresponds to the TIFF Type
67         * field.
68         */
69        virtual TagType getType() const = 0;
70
71        /**
72         * Get the defined endianness for this entry.  If this is defined,
73         * the tag value will be written with the given byte order.
74         */
75        virtual Endianness getEndianness() const = 0;
76
77        /**
78         * Get the value for this entry.  This corresponds to the TIFF Value
79         * field.
80         *
81         * Returns NULL if the value is NULL, or if the type used does not
82         * match the type of this tag.
83         */
84        template<typename T>
85        const T* getData() const;
86
87        virtual String8 toString() const;
88
89        /**
90         * Force the type used here to be a valid TIFF type.
91         *
92         * Returns NULL if the given value is NULL, or if the type given does
93         * not match the type of the value given.
94         */
95        template<typename T>
96        static const T* forceValidType(TagType type, const T* value);
97
98        virtual const void* getDataHelper() const = 0;
99
100        COMPARE_DEF(>)
101        COMPARE_DEF(<)
102
103    protected:
104        enum {
105            MAX_PRINT_STRING_LENGTH = 256
106        };
107};
108
109#define COMPARE(op) \
110bool TiffEntry::operator op (const TiffEntry& entry) const { \
111    return getComparableValue() op entry.getComparableValue(); \
112}
113
114COMPARE(>)
115COMPARE(<)
116
117
118template<typename T>
119const T* TiffEntry::getData() const {
120    const T* value = reinterpret_cast<const T*>(getDataHelper());
121    return forceValidType<T>(getType(), value);
122}
123
124#undef COMPARE
125#undef COMPARE_DEF
126
127} /*namespace img_utils*/
128} /*namespace android*/
129
130#endif /*IMG_UTILS_TIFF_ENTRY*/
131