std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) { const uint32_t val = static_cast<uint32_t>(value.toLong()); bool sep = false; for (int i = 0; i < N; i++) { // *& acrobatics is a workaround for a MSVC 7.1 bug const TagDetailsBitmask* td = *(&array) + i; if (val & td->mask_) { if (sep) { os << ", " << exvGettext(td->label_); } else { os << exvGettext(td->label_); sep = true; } } } return os; }
std::ostream& printTagVocabulary(std::ostream& os, const Value& value, const ExifData*) { const TagVocabulary* td = find(array, value.toString()); if (td) { os << exvGettext(td->label_); } else { os << "(" << value << ")"; } return os; }
std::ostream& printCombiTag(std::ostream& os, const Value& value, const ExifData* metadata) { if ((value.count() != count && (value.count() < (count + ignoredcount) || value.count() > (count + ignoredcountmax))) || count > 4) { return printValue(os, value, metadata); } unsigned long l = 0; for (int c = 0; c < count; ++c) { if (value.toLong(c) < 0 || value.toLong(c) > 255) { return printValue(os, value, metadata); } l += (value.toLong(c) << ((count - c - 1) * 8)); } const TagDetails* td = find(array, l); if (td) { os << exvGettext(td->label_); } else { os << exvGettext("Unknown") << " (0x" << std::setw(2 * count) << std::setfill('0') << std::hex << l << std::dec << ")"; } return os; }