TiffEntry.cpp revision e507721000647a7d8afe44c63ef7fd04ef8971b1
1e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/*
2e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Copyright 2014 The Android Open Source Project
3e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *
4e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License");
5e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * you may not use this file except in compliance with the License.
6e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * You may obtain a copy of the License at
7e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *
8e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *      http://www.apache.org/licenses/LICENSE-2.0
9e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *
10e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Unless required by applicable law or agreed to in writing, software
11e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS,
12e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * See the License for the specific language governing permissions and
14e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * limitations under the License.
15e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */
16e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
17e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <img_utils/TiffIfd.h>
18e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <img_utils/TiffHelpers.h>
19e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <img_utils/TiffEntry.h>
20e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
21e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <utils/Errors.h>
22e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <utils/StrongPointer.h>
23e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <utils/Vector.h>
24e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
25e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunknamespace android {
26e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunknamespace img_utils {
27e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
28e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben BrunkTiffEntry::~TiffEntry() {}
29e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
30e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/**
31e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Specialize for each valid type, including sub-IFDs.
32e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk *
33e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Values with types other than the ones given here should not compile.
34e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */
35e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
36e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst Vector<sp<TiffIfd> >* TiffEntry::forceValidType<Vector<sp<TiffIfd> > >(TagType type,
37e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk          const Vector<sp<TiffIfd> >* value) {
38e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == LONG) {
39e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
40e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
41e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'ifd vector' is not valid for tag with TIFF type %d.",
42e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
43e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
44e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
45e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
46e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
47e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst sp<TiffIfd>* TiffEntry::forceValidType<sp<TiffIfd> >(TagType type, const sp<TiffIfd>* value) {
48e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == LONG) {
49e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
50e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
51e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'ifd' is not valid for tag with TIFF type %d.",
52e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
53e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
54e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
55e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
56e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
57e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst uint8_t* TiffEntry::forceValidType<uint8_t>(TagType type, const uint8_t* value) {
58e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == BYTE || type == ASCII || type == UNDEFINED) {
59e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
60e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
61e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'uint8_t' is not valid for tag with TIFF type %d.",
62e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
63e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
64e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
65e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
66e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
67e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst int8_t* TiffEntry::forceValidType<int8_t>(TagType type, const int8_t* value) {
68e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == SBYTE || type == ASCII || type == UNDEFINED) {
69e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
70e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
71e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'int8_t' is not valid for tag with TIFF type %d.",
72e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
73e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
74e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
75e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
76e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
77e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst uint16_t* TiffEntry::forceValidType<uint16_t>(TagType type, const uint16_t* value) {
78e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == SHORT) {
79e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
80e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
81e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'uint16_t' is not valid for tag with TIFF type %d.",
82e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
83e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
84e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
85e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
86e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
87e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst int16_t* TiffEntry::forceValidType<int16_t>(TagType type, const int16_t* value) {
88e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == SSHORT) {
89e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
90e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
91e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'int16_t' is not valid for tag with TIFF type %d.",
92e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
93e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
94e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
95e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
96e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
97e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst uint32_t* TiffEntry::forceValidType<uint32_t>(TagType type, const uint32_t* value) {
98e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == LONG || type == RATIONAL) {
99e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
100e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
101e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'uint32_t' is not valid for tag with TIFF type %d.",
102e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
103e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
104e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
105e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
106e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
107e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst int32_t* TiffEntry::forceValidType<int32_t>(TagType type, const int32_t* value) {
108e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == SLONG || type == SRATIONAL) {
109e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
110e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
111e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'int32_t' is not valid for tag with TIFF type %d.",
112e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
113e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
114e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
115e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
116e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
117e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst double* TiffEntry::forceValidType<double>(TagType type, const double* value) {
118e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == DOUBLE) {
119e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
120e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
121e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'double' is not valid for tag with TIFF type %d.",
122e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
123e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
124e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
125e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
126e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
127e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst float* TiffEntry::forceValidType<float>(TagType type, const float* value) {
128e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == FLOAT) {
129e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
130e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
131e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'float' is not valid for tag with TIFF type %d.",
132e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
133e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
134e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
135e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
136e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben BrunkString8 TiffEntry::toString() const {
137e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    String8 output;
138e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    uint32_t count = getCount();
139e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    output.appendFormat("[id: %x, type: %d, count: %u, value: '", getTag(), getType(), count);
140e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
141e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    size_t cappedCount = count;
142e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (count > MAX_PRINT_STRING_LENGTH) {
143e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        cappedCount = MAX_PRINT_STRING_LENGTH;
144e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
145e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
146e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    TagType type = getType();
147e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    switch (type) {
148e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case UNDEFINED:
149e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case BYTE: {
150e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const uint8_t* typed_data = getData<uint8_t>();
151e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
152e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%u ", typed_data[i]);
153e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
154e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
155e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
156e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case ASCII: {
157e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const char* typed_data = reinterpret_cast<const char*>(getData<uint8_t>());
158e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            size_t len = count;
159e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            if (count > MAX_PRINT_STRING_LENGTH) {
160e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                 len = MAX_PRINT_STRING_LENGTH;
161e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
162e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            output.append(typed_data, len);
163e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
164e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
165e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SHORT: {
166e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const uint16_t* typed_data = getData<uint16_t>();
167e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
168e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%u ", typed_data[i]);
169e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
170e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
171e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
172e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case LONG: {
173e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const uint32_t* typed_data = getData<uint32_t>();
174e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
175e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%u ", typed_data[i]);
176e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
177e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
178e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
179e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case RATIONAL: {
180e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const uint32_t* typed_data = getData<uint32_t>();
181e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            cappedCount <<= 1;
182e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; i+=2) {
183e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%u/%u ", typed_data[i], typed_data[i + 1]);
184e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
185e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
186e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
187e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SBYTE: {
188e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const int8_t* typed_data = getData<int8_t>();
189e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
190e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%d ", typed_data[i]);
191e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
192e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
193e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
194e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SSHORT: {
195e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const int16_t* typed_data = getData<int16_t>();
196e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
197e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%d ", typed_data[i]);
198e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
199e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
200e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
201e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SLONG: {
202e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const int32_t* typed_data = getData<int32_t>();
203e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
204e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%d ", typed_data[i]);
205e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
206e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
207e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
208e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SRATIONAL: {
209e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const int32_t* typed_data = getData<int32_t>();
210e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            cappedCount <<= 1;
211e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; i+=2) {
212e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%d/%d ", typed_data[i], typed_data[i + 1]);
213e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
214e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
215e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
216e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case FLOAT:
217e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case DOUBLE: {
218e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const float* typed_data = getData<float>();
219e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
220e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%f ", typed_data[i]);
221e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
222e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
223e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
224e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        default: {
225e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            output.append("unknown type ");
226e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
227e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
228e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
229e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
230e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (count > MAX_PRINT_STRING_LENGTH) {
231e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        output.append("...");
232e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
233e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    output.append("']");
234e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return output;
235e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
236e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
237e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk} /*namespace img_utils*/
238e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk} /*namespace android*/
239