Beispiel #1
0
    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;
    }
Beispiel #2
0
 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;
 }
Beispiel #3
0
    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;
    }