blob: 1f006ceb6975607d2f2725e0b60864db2e635c0a [file] [log] [blame]
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -06001/*
2 * Copyright 2017 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#include <ui/DebugUtils.h>
Marin Shalamanovf5de90d2019-10-08 10:57:25 +020018#include <ui/DeviceProductInfo.h>
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -060019#include <ui/PixelFormat.h>
Kalle Raitaa099a242017-01-11 11:17:29 -080020#include <ui/Rect.h>
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060021
22#include <android-base/stringprintf.h>
23#include <string>
24
Marin Shalamanovf5de90d2019-10-08 10:57:25 +020025using android::base::StringAppendF;
Kalle Raitaa099a242017-01-11 11:17:29 -080026using android::base::StringPrintf;
Peiyong Linfd997e02018-03-28 15:29:00 -070027using android::ui::ColorMode;
Peiyong Lin0e7a7912018-04-05 14:36:36 -070028using android::ui::RenderIntent;
Kalle Raitaa099a242017-01-11 11:17:29 -080029
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060030std::string decodeStandard(android_dataspace dataspace) {
31 const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK);
32 switch (dataspaceSelect) {
33 case HAL_DATASPACE_STANDARD_BT709:
34 return std::string("BT709");
35
36 case HAL_DATASPACE_STANDARD_BT601_625:
37 return std::string("BT601_625");
38
39 case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
40 return std::string("BT601_625_UNADJUSTED");
41
42 case HAL_DATASPACE_STANDARD_BT601_525:
43 return std::string("BT601_525");
44
45 case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
46 return std::string("BT601_525_UNADJUSTED");
47
48 case HAL_DATASPACE_STANDARD_BT2020:
49 return std::string("BT2020");
50
51 case HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE:
52 return std::string("BT2020 (constant luminance)");
53
54 case HAL_DATASPACE_STANDARD_BT470M:
55 return std::string("BT470M");
56
57 case HAL_DATASPACE_STANDARD_FILM:
58 return std::string("FILM");
59
60 case HAL_DATASPACE_STANDARD_DCI_P3:
61 return std::string("DCI-P3");
62
63 case HAL_DATASPACE_STANDARD_ADOBE_RGB:
64 return std::string("AdobeRGB");
65
66 case 0:
67 switch (dataspace & 0xffff) {
68 case HAL_DATASPACE_JFIF:
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060069 return std::string("(deprecated) JFIF (BT601_625)");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060070
71 case HAL_DATASPACE_BT601_625:
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060072 return std::string("(deprecated) BT601_625");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060073
74 case HAL_DATASPACE_BT601_525:
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060075 return std::string("(deprecated) BT601_525");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060076
77 case HAL_DATASPACE_SRGB_LINEAR:
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060078 case HAL_DATASPACE_SRGB:
79 return std::string("(deprecated) sRGB");
80
Yiwei Zhang8cf697c2018-03-01 17:27:39 -080081 case HAL_DATASPACE_BT709:
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060082 return std::string("(deprecated) BT709");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060083
84 case HAL_DATASPACE_ARBITRARY:
85 return std::string("ARBITRARY");
86
87 case HAL_DATASPACE_UNKNOWN:
88 // Fallthrough
89 default:
Marin Shalamanovf5de90d2019-10-08 10:57:25 +020090 return StringPrintf("Unknown deprecated dataspace code %d", dataspace);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060091 }
92 }
93
Marin Shalamanovf5de90d2019-10-08 10:57:25 +020094 return StringPrintf("Unknown dataspace code %d", dataspaceSelect);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -060095}
96
97std::string decodeTransfer(android_dataspace dataspace) {
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -060098 const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK);
99 if (dataspaceSelect == 0) {
100 switch (dataspace & 0xffff) {
101 case HAL_DATASPACE_JFIF:
102 case HAL_DATASPACE_BT601_625:
103 case HAL_DATASPACE_BT601_525:
Yiwei Zhang8cf697c2018-03-01 17:27:39 -0800104 case HAL_DATASPACE_BT709:
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -0600105 return std::string("SMPTE_170M");
106
107 case HAL_DATASPACE_SRGB_LINEAR:
108 case HAL_DATASPACE_ARBITRARY:
109 return std::string("Linear");
110
111 case HAL_DATASPACE_SRGB:
112 return std::string("sRGB");
113
114 case HAL_DATASPACE_UNKNOWN:
115 // Fallthrough
116 default:
117 return std::string("");
118 }
119 }
120
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600121 const uint32_t dataspaceTransfer = (dataspace & HAL_DATASPACE_TRANSFER_MASK);
122 switch (dataspaceTransfer) {
123 case HAL_DATASPACE_TRANSFER_UNSPECIFIED:
124 return std::string("Unspecified");
125
126 case HAL_DATASPACE_TRANSFER_LINEAR:
127 return std::string("Linear");
128
129 case HAL_DATASPACE_TRANSFER_SRGB:
130 return std::string("sRGB");
131
132 case HAL_DATASPACE_TRANSFER_SMPTE_170M:
133 return std::string("SMPTE_170M");
134
135 case HAL_DATASPACE_TRANSFER_GAMMA2_2:
136 return std::string("gamma 2.2");
137
138 case HAL_DATASPACE_TRANSFER_GAMMA2_6:
139 return std::string("gamma 2.6");
140
141 case HAL_DATASPACE_TRANSFER_GAMMA2_8:
142 return std::string("gamma 2.8");
143
144 case HAL_DATASPACE_TRANSFER_ST2084:
145 return std::string("SMPTE 2084");
146
147 case HAL_DATASPACE_TRANSFER_HLG:
148 return std::string("STD-B67");
149 }
150
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200151 return StringPrintf("Unknown dataspace transfer %d", dataspaceTransfer);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600152}
153
154std::string decodeRange(android_dataspace dataspace) {
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -0600155 const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK);
156 if (dataspaceSelect == 0) {
157 switch (dataspace & 0xffff) {
158 case HAL_DATASPACE_JFIF:
159 case HAL_DATASPACE_SRGB_LINEAR:
160 case HAL_DATASPACE_SRGB:
161 return std::string("Full range");
162
163 case HAL_DATASPACE_BT601_625:
164 case HAL_DATASPACE_BT601_525:
Yiwei Zhang8cf697c2018-03-01 17:27:39 -0800165 case HAL_DATASPACE_BT709:
166 return std::string("Limited range");
Courtney Goeltzenleuchter039eb242017-05-31 17:51:45 -0600167
168 case HAL_DATASPACE_ARBITRARY:
169 case HAL_DATASPACE_UNKNOWN:
170 // Fallthrough
171 default:
172 return std::string("unspecified range");
173 }
174 }
175
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600176 const uint32_t dataspaceRange = (dataspace & HAL_DATASPACE_RANGE_MASK);
177 switch (dataspaceRange) {
178 case HAL_DATASPACE_RANGE_UNSPECIFIED:
179 return std::string("Range Unspecified");
180
181 case HAL_DATASPACE_RANGE_FULL:
182 return std::string("Full range");
183
184 case HAL_DATASPACE_RANGE_LIMITED:
185 return std::string("Limited range");
186
187 case HAL_DATASPACE_RANGE_EXTENDED:
188 return std::string("Extended range");
189 }
190
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200191 return StringPrintf("Unknown dataspace range %d", dataspaceRange);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600192}
193
194std::string dataspaceDetails(android_dataspace dataspace) {
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600195 if (dataspace == 0) {
Courtney Goeltzenleuchter9f484642017-07-14 12:14:28 -0600196 return "Default";
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600197 }
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200198 return StringPrintf("%s %s %s", decodeStandard(dataspace).c_str(),
199 decodeTransfer(dataspace).c_str(), decodeRange(dataspace).c_str());
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600200}
201
Peiyong Lina52f0292018-03-14 17:26:31 -0700202std::string decodeColorMode(ColorMode colorMode) {
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600203 switch (colorMode) {
Peiyong Lina52f0292018-03-14 17:26:31 -0700204 case ColorMode::NATIVE:
205 return std::string("ColorMode::NATIVE");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600206
Peiyong Lina52f0292018-03-14 17:26:31 -0700207 case ColorMode::STANDARD_BT601_625:
208 return std::string("ColorMode::BT601_625");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600209
Peiyong Lina52f0292018-03-14 17:26:31 -0700210 case ColorMode::STANDARD_BT601_625_UNADJUSTED:
211 return std::string("ColorMode::BT601_625_UNADJUSTED");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600212
Peiyong Lina52f0292018-03-14 17:26:31 -0700213 case ColorMode::STANDARD_BT601_525:
214 return std::string("ColorMode::BT601_525");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600215
Peiyong Lina52f0292018-03-14 17:26:31 -0700216 case ColorMode::STANDARD_BT601_525_UNADJUSTED:
217 return std::string("ColorMode::BT601_525_UNADJUSTED");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600218
Peiyong Lina52f0292018-03-14 17:26:31 -0700219 case ColorMode::STANDARD_BT709:
220 return std::string("ColorMode::BT709");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600221
Peiyong Lina52f0292018-03-14 17:26:31 -0700222 case ColorMode::DCI_P3:
223 return std::string("ColorMode::DCI_P3");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600224
Peiyong Lina52f0292018-03-14 17:26:31 -0700225 case ColorMode::SRGB:
226 return std::string("ColorMode::SRGB");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600227
Peiyong Lina52f0292018-03-14 17:26:31 -0700228 case ColorMode::ADOBE_RGB:
229 return std::string("ColorMode::ADOBE_RGB");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600230
Peiyong Lina52f0292018-03-14 17:26:31 -0700231 case ColorMode::DISPLAY_P3:
232 return std::string("ColorMode::DISPLAY_P3");
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700233
234 case ColorMode::BT2020:
235 return std::string("ColorMode::BT2020");
236
Valerie Hau9758ae02018-10-09 16:05:09 -0700237 case ColorMode::DISPLAY_BT2020:
238 return std::string("ColorMode::DISPLAY_BT2020");
239
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700240 case ColorMode::BT2100_PQ:
241 return std::string("ColorMode::BT2100_PQ");
242
243 case ColorMode::BT2100_HLG:
244 return std::string("ColorMode::BT2100_HLG");
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600245 }
246
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200247 return StringPrintf("Unknown color mode %d", colorMode);
Courtney Goeltzenleuchtere06ad182017-03-22 13:09:12 -0600248}
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600249
Yiwei Zhang7c64f172018-03-07 14:52:28 -0800250std::string decodeColorTransform(android_color_transform colorTransform) {
251 switch (colorTransform) {
252 case HAL_COLOR_TRANSFORM_IDENTITY:
253 return std::string("Identity");
254
255 case HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX:
256 return std::string("Arbitrary matrix");
257
258 case HAL_COLOR_TRANSFORM_VALUE_INVERSE:
259 return std::string("Inverse value");
260
261 case HAL_COLOR_TRANSFORM_GRAYSCALE:
262 return std::string("Grayscale");
263
264 case HAL_COLOR_TRANSFORM_CORRECT_PROTANOPIA:
265 return std::string("Correct protanopia");
266
267 case HAL_COLOR_TRANSFORM_CORRECT_DEUTERANOPIA:
268 return std::string("Correct deuteranopia");
269
270 case HAL_COLOR_TRANSFORM_CORRECT_TRITANOPIA:
271 return std::string("Correct tritanopia");
272 }
273
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200274 return StringPrintf("Unknown color transform %d", colorTransform);
Yiwei Zhang7c64f172018-03-07 14:52:28 -0800275}
276
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600277// Converts a PixelFormat to a human-readable string. Max 11 chars.
278// (Could use a table of prefab String8 objects.)
279std::string decodePixelFormat(android::PixelFormat format) {
280 switch (format) {
281 case android::PIXEL_FORMAT_UNKNOWN:
282 return std::string("Unknown/None");
283 case android::PIXEL_FORMAT_CUSTOM:
284 return std::string("Custom");
285 case android::PIXEL_FORMAT_TRANSLUCENT:
286 return std::string("Translucent");
287 case android::PIXEL_FORMAT_TRANSPARENT:
288 return std::string("Transparent");
289 case android::PIXEL_FORMAT_OPAQUE:
290 return std::string("Opaque");
291 case android::PIXEL_FORMAT_RGBA_8888:
292 return std::string("RGBA_8888");
293 case android::PIXEL_FORMAT_RGBX_8888:
294 return std::string("RGBx_8888");
295 case android::PIXEL_FORMAT_RGBA_FP16:
296 return std::string("RGBA_FP16");
297 case android::PIXEL_FORMAT_RGBA_1010102:
298 return std::string("RGBA_1010102");
299 case android::PIXEL_FORMAT_RGB_888:
300 return std::string("RGB_888");
301 case android::PIXEL_FORMAT_RGB_565:
302 return std::string("RGB_565");
303 case android::PIXEL_FORMAT_BGRA_8888:
304 return std::string("BGRA_8888");
305 default:
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200306 return StringPrintf("Unknown %#08x", format);
Courtney Goeltzenleuchter4f8f3712017-04-14 09:18:26 -0600307 }
308}
Kalle Raitaa099a242017-01-11 11:17:29 -0800309
Peiyong Lin0e7a7912018-04-05 14:36:36 -0700310std::string decodeRenderIntent(RenderIntent renderIntent) {
311 switch(renderIntent) {
312 case RenderIntent::COLORIMETRIC:
313 return std::string("RenderIntent::COLORIMETRIC");
314 case RenderIntent::ENHANCE:
315 return std::string("RenderIntent::ENHANCE");
316 case RenderIntent::TONE_MAP_COLORIMETRIC:
317 return std::string("RenderIntent::TONE_MAP_COLORIMETRIC");
318 case RenderIntent::TONE_MAP_ENHANCE:
319 return std::string("RenderIntent::TONE_MAP_ENHANCE");
320 }
321 return std::string("Unknown RenderIntent");
322}
323
Marin Shalamanovf5de90d2019-10-08 10:57:25 +0200324std::string toString(const android::DeviceProductInfo::ManufactureOrModelDate& date) {
325 using ModelYear = android::DeviceProductInfo::ModelYear;
326 using ManufactureYear = android::DeviceProductInfo::ManufactureYear;
327 using ManufactureWeekAndYear = android::DeviceProductInfo::ManufactureWeekAndYear;
328
329 if (const auto* model = std::get_if<ModelYear>(&date)) {
330 return StringPrintf("ModelYear{%d}", model->year);
331 } else if (const auto* manufacture = std::get_if<ManufactureYear>(&date)) {
332 return StringPrintf("ManufactureDate{year=%d}", manufacture->year);
333 } else if (const auto* manufacture = std::get_if<ManufactureWeekAndYear>(&date)) {
334 return StringPrintf("ManufactureDate{week=%d, year=%d}", manufacture->week,
335 manufacture->year);
336 } else {
337 LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate");
338 return {};
339 }
340}
341
342std::string toString(const android::DeviceProductInfo& info) {
343 return StringPrintf("DeviceProductInfo{name=%s, productId=%s, manufacturerPnpId=%s, "
344 "manufactureOrModelDate=%s}",
345 info.name.data(), info.productId.data(), info.manufacturerPnpId.data(),
346 toString(info.manufactureOrModelDate).c_str());
347}