Blame src/tags_int.hpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
/*
Packit 01d647
 * Copyright (C) 2004-2018 Exiv2 authors
Packit 01d647
 * This program is part of the Exiv2 distribution.
Packit 01d647
 *
Packit 01d647
 * This program is free software; you can redistribute it and/or
Packit 01d647
 * modify it under the terms of the GNU General Public License
Packit 01d647
 * as published by the Free Software Foundation; either version 2
Packit 01d647
 * of the License, or (at your option) any later version.
Packit 01d647
 *
Packit 01d647
 * This program is distributed in the hope that it will be useful,
Packit 01d647
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 01d647
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 01d647
 * GNU General Public License for more details.
Packit 01d647
 *
Packit 01d647
 * You should have received a copy of the GNU General Public License
Packit 01d647
 * along with this program; if not, write to the Free Software
Packit 01d647
 * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
Packit 01d647
 */
Packit 01d647
/*!
Packit 01d647
  @file    tags_int.hpp
Packit 01d647
  @brief   Internal Exif tag and type information
Packit 01d647
  @author  Andreas Huggel (ahu)
Packit 01d647
           ahuggel@gmx.net
Packit 01d647
  @date    15-Jan-04, ahu: created
Packit 01d647
           11-Feb-04, ahu: isolated as a component
Packit 01d647
 */
Packit 01d647
#ifndef TAGS_INT_HPP_
Packit 01d647
#define TAGS_INT_HPP_
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
// included header files
Packit 01d647
#include "types.hpp"
Packit 01d647
#include "tags.hpp"
Packit 01d647
#include "value.hpp"
Packit 01d647
Packit 01d647
// + standard includes
Packit 01d647
#include <string>
Packit 01d647
#include <iostream>
Packit 01d647
#include <memory>
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
// namespace extensions
Packit 01d647
Packit 01d647
namespace Exiv2 {
Packit 01d647
    class ExifData;
Packit 01d647
Packit 01d647
    namespace Internal {
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
// class definitions
Packit 01d647
Packit 01d647
    //! Type to specify the IFD to which a metadata belongs
Packit 01d647
    enum IfdId {
Packit 01d647
        ifdIdNotSet,
Packit 01d647
        ifd0Id,
Packit 01d647
        ifd1Id,
Packit 01d647
        ifd2Id,
Packit 01d647
        ifd3Id,
Packit 01d647
        exifId,
Packit 01d647
        gpsId,
Packit 01d647
        iopId,
Packit 01d647
        mpfId,
Packit 01d647
        subImage1Id,
Packit 01d647
        subImage2Id,
Packit 01d647
        subImage3Id,
Packit 01d647
        subImage4Id,
Packit 01d647
        subImage5Id,
Packit 01d647
        subImage6Id,
Packit 01d647
        subImage7Id,
Packit 01d647
        subImage8Id,
Packit 01d647
        subImage9Id,
Packit 01d647
        subThumb1Id,
Packit 01d647
        panaRawId,
Packit 01d647
        mnId,
Packit 01d647
        canonId,
Packit 01d647
        canonCsId,
Packit 01d647
        canonSiId,
Packit 01d647
        canonCfId,
Packit 01d647
        canonPiId,
Packit 01d647
        canonPaId,
Packit 01d647
        canonTiId,
Packit 01d647
        canonFiId,
Packit 01d647
        canonPrId,
Packit 01d647
        casioId,
Packit 01d647
        casio2Id,
Packit 01d647
        fujiId,
Packit 01d647
        minoltaId,
Packit 01d647
        minoltaCs5DId,
Packit 01d647
        minoltaCs7DId,
Packit 01d647
        minoltaCsOldId,
Packit 01d647
        minoltaCsNewId,
Packit 01d647
        nikon1Id,
Packit 01d647
        nikon2Id,
Packit 01d647
        nikon3Id,
Packit 01d647
        nikonPvId,
Packit 01d647
        nikonVrId,
Packit 01d647
        nikonPcId,
Packit 01d647
        nikonWtId,
Packit 01d647
        nikonIiId,
Packit 01d647
        nikonAfId,
Packit 01d647
        nikonAf21Id,
Packit 01d647
        nikonAf22Id,
Packit 01d647
        nikonAFTId,
Packit 01d647
        nikonFiId,
Packit 01d647
        nikonMeId,
Packit 01d647
        nikonFl1Id,
Packit 01d647
        nikonFl2Id,
Packit 01d647
        nikonFl3Id,
Packit 01d647
        nikonSi1Id,
Packit 01d647
        nikonSi2Id,
Packit 01d647
        nikonSi3Id,
Packit 01d647
        nikonSi4Id,
Packit 01d647
        nikonSi5Id,
Packit 01d647
        nikonSi6Id,
Packit 01d647
        nikonLd1Id,
Packit 01d647
        nikonLd2Id,
Packit 01d647
        nikonLd3Id,
Packit 01d647
        nikonCb1Id,
Packit 01d647
        nikonCb2Id,
Packit 01d647
        nikonCb2aId,
Packit 01d647
        nikonCb2bId,
Packit 01d647
        nikonCb3Id,
Packit 01d647
        nikonCb4Id,
Packit 01d647
        olympusId,
Packit 01d647
        olympus2Id,
Packit 01d647
        olympusCsId,
Packit 01d647
        olympusEqId,
Packit 01d647
        olympusRdId,
Packit 01d647
        olympusRd2Id,
Packit 01d647
        olympusIpId,
Packit 01d647
        olympusFiId,
Packit 01d647
        olympusFe1Id,
Packit 01d647
        olympusFe2Id,
Packit 01d647
        olympusFe3Id,
Packit 01d647
        olympusFe4Id,
Packit 01d647
        olympusFe5Id,
Packit 01d647
        olympusFe6Id,
Packit 01d647
        olympusFe7Id,
Packit 01d647
        olympusFe8Id,
Packit 01d647
        olympusFe9Id,
Packit 01d647
        olympusRiId,
Packit 01d647
        panasonicId,
Packit 01d647
        pentaxId,
Packit 01d647
        pentaxDngId,
Packit 01d647
        samsung2Id,
Packit 01d647
        samsungPvId,
Packit 01d647
        samsungPwId,
Packit 01d647
        sigmaId,
Packit 01d647
        sony1Id,
Packit 01d647
        sony2Id,
Packit 01d647
        sonyMltId,
Packit 01d647
        sony1CsId,
Packit 01d647
        sony1Cs2Id,
Packit 01d647
        sony2CsId,
Packit 01d647
        sony2Cs2Id,
Packit 01d647
        sony2FpId,
Packit Service fb147c
        sony2010eId,
Packit 01d647
        sony1MltCs7DId,
Packit 01d647
        sony1MltCsOldId,
Packit 01d647
        sony1MltCsNewId,
Packit 01d647
        sony1MltCsA100Id,
Packit 01d647
        lastId,
Packit 01d647
        ignoreId = lastId
Packit 01d647
    };
Packit 01d647
Packit 01d647
    /*!
Packit 01d647
      @brief Section identifiers to logically group tags. A section consists
Packit 01d647
             of nothing more than a name, based on the Exif standard.
Packit 01d647
     */
Packit 01d647
    enum SectionId { sectionIdNotSet,
Packit 01d647
                     imgStruct, recOffset, imgCharacter, otherTags, exifFormat,
Packit 01d647
                     exifVersion, imgConfig, userInfo, relatedFile, dateTime,
Packit 01d647
                     captureCond, gpsTags, iopTags, mpfTags, makerTags, dngTags, panaRaw,
Packit 01d647
                     tiffEp, tiffPm6, adobeOpi,
Packit 01d647
                     lastSectionId };
Packit 01d647
Packit 01d647
    //! The details of a section.
Packit 01d647
    struct SectionInfo {
Packit 01d647
        SectionId sectionId_;                   //!< Section id
Packit 01d647
        const char* name_;                      //!< Section name (one word)
Packit 01d647
        const char* desc_;                      //!< Section description
Packit 01d647
    };
Packit 01d647
Packit 01d647
    /*!
Packit 01d647
      @brief Helper structure for lookup tables for translations of numeric
Packit 01d647
             tag values to human readable labels.
Packit 01d647
     */
Packit 01d647
    struct TagDetails {
Packit 01d647
        int64_t val_;                           //!< Tag value
Packit 01d647
        const char* label_;                     //!< Translation of the tag value
Packit 01d647
Packit 01d647
        //! Comparison operator for use with the find template
Packit 01d647
       bool operator==(long key) const { return val_ == key; }
Packit 01d647
    }; // struct TagDetails
Packit 01d647
Packit 01d647
    /*!
Packit 01d647
      @brief Helper structure for lookup tables for translations of bitmask
Packit 01d647
             values to human readable labels.
Packit 01d647
     */
Packit 01d647
    struct TagDetailsBitmask {
Packit 01d647
        uint32_t mask_;                         //!< Bitmask value
Packit 01d647
        const char* label_;                     //!< Description of the tag value
Packit 01d647
    }; // struct TagDetailsBitmask
Packit 01d647
Packit 01d647
    /*!
Packit 01d647
      @brief Helper structure for lookup tables for translations of controlled
Packit 01d647
             vocabulary strings to their descriptions.
Packit 01d647
     */
Packit 01d647
    struct TagVocabulary {
Packit 01d647
        const char* voc_;                       //!< Vocabulary string
Packit 01d647
        const char* label_;                     //!< Description of the vocabulary string
Packit 01d647
Packit 01d647
        /*!
Packit 01d647
          @brief Comparison operator for use with the find template
Packit 01d647
Packit 01d647
          Compare vocabulary strings like "PR-NON" with keys like
Packit 01d647
          "http://ns.useplus.org/ldf/vocab/PR-NON" and return true if the vocabulary
Packit 01d647
          string matches the end of the key.
Packit 01d647
         */
Packit 01d647
        bool operator==(const std::string& key) const;
Packit 01d647
    }; // struct TagDetails
Packit 01d647
Packit 01d647
    /*!
Packit 01d647
      @brief Generic pretty-print function to translate a long value to a description
Packit 01d647
             by looking up a reference table.
Packit 01d647
     */
Packit 01d647
    template <int N, const TagDetails (&array)[N]>
Packit 01d647
    std::ostream& printTag(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        const TagDetails* td = find(array, value.toLong());
Packit 01d647
        if (td) {
Packit 01d647
            os << exvGettext(td->label_);
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << "(" << value << ")";
Packit 01d647
        }
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
//! Shortcut for the printTag template which requires typing the array name only once.
Packit 01d647
#define EXV_PRINT_TAG(array) printTag<EXV_COUNTOF(array), array>
Packit 01d647
Packit 01d647
    /*!
Packit 01d647
      @brief Generic print function to translate a long value to a description
Packit 01d647
             by looking up bitmasks in a reference table.
Packit 01d647
     */
Packit 01d647
    template <int N, const TagDetailsBitmask (&array)[N]>
Packit 01d647
    std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        const uint32_t val = static_cast<uint32_t>(value.toLong());
Packit 01d647
        if (val == 0 && N > 0) {
Packit 01d647
            const TagDetailsBitmask* td = *(&array);
Packit 01d647
            if (td->mask_ == 0) return os << exvGettext(td->label_);
Packit 01d647
        }
Packit 01d647
        bool sep = false;
Packit 01d647
        for (int i = 0; i < N; ++i) {
Packit 01d647
            // *& acrobatics is a workaround for a MSVC 7.1 bug
Packit 01d647
            const TagDetailsBitmask* td = *(&array) + i;
Packit 01d647
Packit 01d647
            if (val & td->mask_) {
Packit 01d647
                if (sep) {
Packit 01d647
                    os << ", " << exvGettext(td->label_);
Packit 01d647
                }
Packit 01d647
                else {
Packit 01d647
                    os << exvGettext(td->label_);
Packit 01d647
                    sep = true;
Packit 01d647
                }
Packit 01d647
            }
Packit 01d647
        }
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
//! Shortcut for the printTagBitmask template which requires typing the array name only once.
Packit 01d647
#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<EXV_COUNTOF(array), array>
Packit 01d647
Packit 01d647
    /*!
Packit 01d647
      @brief Generic pretty-print function to translate a controlled vocabulary value (string)
Packit 01d647
             to a description by looking up a reference table.
Packit 01d647
     */
Packit 01d647
    template <int N, const TagVocabulary (&array)[N]>
Packit 01d647
    std::ostream& printTagVocabulary(std::ostream& os, const Value& value, const ExifData*)
Packit 01d647
    {
Packit 01d647
        const TagVocabulary* td = find(array, value.toString());
Packit 01d647
        if (td) {
Packit 01d647
            os << exvGettext(td->label_);
Packit 01d647
        }
Packit 01d647
        else {
Packit 01d647
            os << "(" << value << ")";
Packit 01d647
        }
Packit 01d647
        return os;
Packit 01d647
    }
Packit 01d647
Packit 01d647
//! Shortcut for the printTagVocabulary template which requires typing the array name only once.
Packit 01d647
#define EXV_PRINT_VOCABULARY(array) printTagVocabulary<EXV_COUNTOF(array), array>
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
// free functions
Packit 01d647
Packit 01d647
    //! Return read-only list of built-in IFD0/1 tags
Packit 01d647
    const TagInfo* ifdTagList();
Packit 01d647
    //! Return read-only list of built-in Exif IFD tags
Packit 01d647
    const TagInfo* exifTagList();
Packit 01d647
    //! Return read-only list of built-in IOP tags
Packit 01d647
    const TagInfo* iopTagList();
Packit 01d647
    //! Return read-only list of built-in GPS tags
Packit 01d647
    const TagInfo* gpsTagList();
Packit 01d647
    //! Return read-only list of built-in Exiv2 Makernote info tags
Packit 01d647
    const TagInfo* mnTagList();
Packit 01d647
    //! Return read-only list of built-in mfp Tags http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/MPF.html
Packit 01d647
    const TagInfo* mpfTagList();
Packit 01d647
Packit 01d647
    const GroupInfo* groupList();
Packit 01d647
    const TagInfo* tagList(const std::string& groupName);
Packit 01d647
Packit 01d647
    //! Return the group id for a group name
Packit 01d647
    IfdId groupId(const std::string& groupName);
Packit 01d647
    //! Return the name of the IFD
Packit 01d647
    const char* ifdName(IfdId ifdId);
Packit 01d647
    //! Return the group name for a group id
Packit 01d647
    const char* groupName(IfdId ifdId);
Packit 01d647
Packit 01d647
    //! Return true if \em ifdId is a makernote IFD id. (Note: returns false for makerIfd)
Packit 01d647
    bool isMakerIfd(IfdId ifdId);
Packit 01d647
    //! Return true if \em ifdId is an %Exif IFD id.
Packit 01d647
    bool isExifIfd(IfdId ifdId);
Packit 01d647
Packit 01d647
    //! Print the list of tags for \em ifdId to the output stream \em os
Packit 01d647
    void taglist(std::ostream& os, IfdId ifdId);
Packit 01d647
    //! Return the tag list for \em ifdId
Packit 01d647
    const TagInfo* tagList(IfdId ifdId);
Packit 01d647
    //! Return the tag info for \em tag and \em ifdId
Packit 01d647
    const TagInfo* tagInfo(uint16_t tag, IfdId ifdId);
Packit 01d647
    //! Return the tag info for \em tagName and \em ifdId
Packit 01d647
    const TagInfo* tagInfo(const std::string& tagName, IfdId ifdId);
Packit 01d647
    /*!
Packit 01d647
      @brief Return the tag number for one combination of IFD id and tagName.
Packit 01d647
             If the tagName is not known, it expects tag names in the
Packit 01d647
             form "0x01ff" and converts them to unsigned integer.
Packit 01d647
Packit 01d647
      @throw Error if the tagname or ifdId is invalid
Packit 01d647
     */
Packit 01d647
    uint16_t tagNumber(const std::string& tagName, IfdId ifdId);
Packit 01d647
Packit 01d647
    //! @name Functions printing interpreted tag values
Packit 01d647
    //@{
Packit 01d647
    //! Default print function, using the Value output operator
Packit 01d647
    std::ostream& printValue(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print the value converted to a long
Packit 01d647
    std::ostream& printLong(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print a Rational or URational value in floating point format
Packit 01d647
    std::ostream& printFloat(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print a longitude or latitude value
Packit 01d647
    std::ostream& printDegrees(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print function converting from UCS-2LE to UTF-8
Packit 01d647
    std::ostream& printUcs2(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print function for Exif units
Packit 01d647
    std::ostream& printExifUnit(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS version
Packit 01d647
    std::ostream& print0x0000(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS altitude ref
Packit 01d647
    std::ostream& print0x0005(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS altitude
Packit 01d647
    std::ostream& print0x0006(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS timestamp
Packit 01d647
    std::ostream& print0x0007(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS status
Packit 01d647
    std::ostream& print0x0009(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS measurement mode
Packit 01d647
    std::ostream& print0x000a(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS speed ref
Packit 01d647
    std::ostream& print0x000c(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS destination distance ref
Packit 01d647
    std::ostream& print0x0019(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS differential correction
Packit 01d647
    std::ostream& print0x001e(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print orientation
Packit 01d647
    std::ostream& print0x0112(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print YCbCrPositioning
Packit 01d647
    std::ostream& print0x0213(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print the copyright
Packit 01d647
    std::ostream& print0x8298(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print the exposure time
Packit 01d647
    std::ostream& print0x829a(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print the f-number
Packit 01d647
    std::ostream& print0x829d(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print exposure program
Packit 01d647
    std::ostream& print0x8822(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print ISO speed ratings
Packit 01d647
    std::ostream& print0x8827(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print components configuration specific to compressed data
Packit 01d647
    std::ostream& print0x9101(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print exposure time converted from APEX shutter speed value
Packit 01d647
    std::ostream& print0x9201(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print f-number converted from APEX aperture value
Packit 01d647
    std::ostream& print0x9202(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print the exposure bias value
Packit 01d647
    std::ostream& print0x9204(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print the subject distance
Packit 01d647
    std::ostream& print0x9206(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print metering mode
Packit 01d647
    std::ostream& print0x9207(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print light source
Packit 01d647
    std::ostream& print0x9208(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print the actual focal length of the lens
Packit 01d647
    std::ostream& print0x920a(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print color space
Packit 01d647
    std::ostream& print0xa001(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print sensing method
Packit 01d647
    std::ostream& print0xa217(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print file source
Packit 01d647
    std::ostream& print0xa300(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print scene type
Packit 01d647
    std::ostream& print0xa301(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print custom rendered
Packit 01d647
    std::ostream& print0xa401(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print exposure mode
Packit 01d647
    std::ostream& print0xa402(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print white balance
Packit 01d647
    std::ostream& print0xa403(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print digital zoom ratio
Packit 01d647
    std::ostream& print0xa404(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print 35mm equivalent focal length
Packit 01d647
    std::ostream& print0xa405(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print scene capture type
Packit 01d647
    std::ostream& print0xa406(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print gain control
Packit 01d647
    std::ostream& print0xa407(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print saturation
Packit 01d647
    std::ostream& print0xa409(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print subject distance range
Packit 01d647
    std::ostream& print0xa40c(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print GPS direction ref
Packit 01d647
    std::ostream& printGPSDirRef(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print contrast, sharpness (normal, soft, hard)
Packit 01d647
    std::ostream& printNormalSoftHard(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print any version packed in 4 Bytes format : major major minor minor
Packit 01d647
    std::ostream& printExifVersion(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print any version encoded in the ASCII string majormajorminorminor
Packit 01d647
    std::ostream& printXmpVersion(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //! Print a date following the format YYYY-MM-DDTHH:MM:SSZ
Packit 01d647
    std::ostream& printXmpDate(std::ostream& os, const Value& value, const ExifData*);
Packit Service fb147c
    //! Print a bitmask as (none) | n | n,m... where: (none) = no bits set | n = bit n from left (0=left-most) | n,m.. = multiple bits "
Packit Service fb147c
    std::ostream& printBitmask(std::ostream& os, const Value& value, const ExifData*);
Packit 01d647
    //@}
Packit 01d647
Packit 01d647
    //! Calculate F number from an APEX aperture value
Packit 01d647
    float fnumber(float apertureValue);
Packit 01d647
Packit 01d647
    //! Calculate the exposure time from an APEX shutter speed value
Packit 01d647
    URational exposureTime(float shutterSpeedValue);
Packit 01d647
Packit 01d647
}}                                      // namespace Internal, Exiv2
Packit 01d647
Packit 01d647
#endif                                  // #ifndef TAGS_INT_HPP_