TiffEntry.cpp revision ca73159becc0fc0098530929e467a3d92e470571
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 Brunk
36e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunktemplate<>
37e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkconst sp<TiffIfd>* TiffEntry::forceValidType<sp<TiffIfd> >(TagType type, const sp<TiffIfd>* value) {
38e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == LONG) {
39e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
40e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
41e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'ifd' 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 uint8_t* TiffEntry::forceValidType<uint8_t>(TagType type, const uint8_t* value) {
48e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == BYTE || type == ASCII || type == UNDEFINED) {
49e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
50e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
51e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'uint8_t' 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 int8_t* TiffEntry::forceValidType<int8_t>(TagType type, const int8_t* value) {
58e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == SBYTE || type == ASCII || type == UNDEFINED) {
59e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
60e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
61e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'int8_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 uint16_t* TiffEntry::forceValidType<uint16_t>(TagType type, const uint16_t* value) {
68e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == SHORT) {
69e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
70e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
71e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'uint16_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 int16_t* TiffEntry::forceValidType<int16_t>(TagType type, const int16_t* value) {
78e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == SSHORT) {
79e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
80e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
81e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'int16_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 uint32_t* TiffEntry::forceValidType<uint32_t>(TagType type, const uint32_t* value) {
88e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == LONG || type == RATIONAL) {
89e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
90e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
91e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'uint32_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 int32_t* TiffEntry::forceValidType<int32_t>(TagType type, const int32_t* value) {
98e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == SLONG || type == SRATIONAL) {
99e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
100e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
101e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'int32_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 double* TiffEntry::forceValidType<double>(TagType type, const double* value) {
108e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == DOUBLE) {
109e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
110e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
111e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'double' 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 float* TiffEntry::forceValidType<float>(TagType type, const float* value) {
118e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (type == FLOAT) {
119e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        return value;
120e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
121e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    ALOGE("%s: Value of type 'float' is not valid for tag with TIFF type %d.",
122e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            __FUNCTION__, type);
123e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return NULL;
124e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
125e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
126e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben BrunkString8 TiffEntry::toString() const {
127e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    String8 output;
128e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    uint32_t count = getCount();
129e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    output.appendFormat("[id: %x, type: %d, count: %u, value: '", getTag(), getType(), count);
130e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
131e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    size_t cappedCount = count;
132e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (count > MAX_PRINT_STRING_LENGTH) {
133e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        cappedCount = MAX_PRINT_STRING_LENGTH;
134e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
135e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
136e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    TagType type = getType();
137e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    switch (type) {
138e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case UNDEFINED:
139e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case BYTE: {
140e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const uint8_t* typed_data = getData<uint8_t>();
141e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
142e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%u ", typed_data[i]);
143e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
144e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
145e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
146e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case ASCII: {
147e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const char* typed_data = reinterpret_cast<const char*>(getData<uint8_t>());
148e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            size_t len = count;
149e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            if (count > MAX_PRINT_STRING_LENGTH) {
150e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                 len = MAX_PRINT_STRING_LENGTH;
151e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
152e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            output.append(typed_data, len);
153e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
154e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
155e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SHORT: {
156e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const uint16_t* typed_data = getData<uint16_t>();
157e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
158e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%u ", typed_data[i]);
159e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
160e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
161e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
162e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case LONG: {
163e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const uint32_t* typed_data = getData<uint32_t>();
164e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
165e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%u ", typed_data[i]);
166e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
167e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
168e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
169e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case RATIONAL: {
170e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const uint32_t* typed_data = getData<uint32_t>();
171e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            cappedCount <<= 1;
172e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; i+=2) {
173e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%u/%u ", typed_data[i], typed_data[i + 1]);
174e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
175e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
176e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
177e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SBYTE: {
178e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const int8_t* typed_data = getData<int8_t>();
179e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
180e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%d ", typed_data[i]);
181e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
182e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
183e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
184e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SSHORT: {
185e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const int16_t* typed_data = getData<int16_t>();
186e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
187e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%d ", typed_data[i]);
188e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
189e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
190e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
191e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SLONG: {
192e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const int32_t* typed_data = getData<int32_t>();
193e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
194e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%d ", typed_data[i]);
195e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
196e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
197e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
198e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        case SRATIONAL: {
199e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const int32_t* typed_data = getData<int32_t>();
200e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            cappedCount <<= 1;
201e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; i+=2) {
202e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%d/%d ", typed_data[i], typed_data[i + 1]);
203e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
204e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
205e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
206ca73159becc0fc0098530929e467a3d92e470571Ruben Brunk        case FLOAT: {
207e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            const float* typed_data = getData<float>();
208e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
209e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk                output.appendFormat("%f ", typed_data[i]);
210e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            }
211e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
212e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
213ca73159becc0fc0098530929e467a3d92e470571Ruben Brunk        case DOUBLE: {
214ca73159becc0fc0098530929e467a3d92e470571Ruben Brunk            const double* typed_data = getData<double>();
215ca73159becc0fc0098530929e467a3d92e470571Ruben Brunk            for (size_t i = 0; i < cappedCount; ++i) {
216ca73159becc0fc0098530929e467a3d92e470571Ruben Brunk                output.appendFormat("%f ", typed_data[i]);
217ca73159becc0fc0098530929e467a3d92e470571Ruben Brunk            }
218ca73159becc0fc0098530929e467a3d92e470571Ruben Brunk            break;
219ca73159becc0fc0098530929e467a3d92e470571Ruben Brunk        }
220e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        default: {
221e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            output.append("unknown type ");
222e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk            break;
223e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        }
224e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
225e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
226e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    if (count > MAX_PRINT_STRING_LENGTH) {
227e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk        output.append("...");
228e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    }
229e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    output.append("']");
230e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk    return output;
231e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}
232e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk
233e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk} /*namespace img_utils*/
234e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk} /*namespace android*/
235