Blame samples/tiffaddpath-test.cpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
// tiffaddpath-test.cpp
Packit 01d647
// Test driver to test adding new tags to a TIFF composite structure
Packit 01d647
Packit 01d647
Packit 01d647
#include <exiv2/exiv2.hpp>
Packit 01d647
Packit 01d647
#include "tiffcomposite_int.hpp"
Packit 01d647
#include "makernote2_int.hpp"
Packit 01d647
#include "tiffimage_int.hpp"
Packit 01d647
Packit 01d647
#include <iostream>
Packit 01d647
#include <iomanip>
Packit 01d647
#include <sstream>
Packit 01d647
Packit 01d647
#include <cstdlib>
Packit 01d647
Packit 01d647
using namespace Exiv2;
Packit 01d647
Packit 01d647
void addPath(TiffComponent* pRootDir,
Packit 01d647
             uint16_t       tag,
Packit 01d647
             TiffPath&      tiffPath);
Packit 01d647
Packit 01d647
void printPath(TiffPath tiffPath,
Packit 01d647
               uint32_t tag,
Packit 01d647
               uint16_t grp);
Packit 01d647
Packit 01d647
struct TiffTagInfo {
Packit 01d647
    bool operator==(const uint32_t& tag) const;
Packit 01d647
Packit 01d647
    uint32_t    tag_;
Packit 01d647
    const char* name_;
Packit 01d647
};
Packit 01d647
Packit 01d647
extern const TiffTagInfo tiffTagInfo[] = {
Packit 01d647
    {   0x10000, "none" },
Packit 01d647
    {   0x20000, "root" },
Packit 01d647
    {   0x30000, "next" },
Packit 01d647
    {   0x40000, "all"  }
Packit 01d647
};
Packit 01d647
Packit 01d647
bool TiffTagInfo::operator==(const uint32_t& tag) const
Packit 01d647
{
Packit 01d647
    return tag_ == tag;
Packit 01d647
}
Packit 01d647
Packit 01d647
std::string tiffTagName(uint32_t tag)
Packit 01d647
{
Packit 01d647
    const TiffTagInfo* gi = find(tiffTagInfo, tag);
Packit 01d647
    std::string name;
Packit 01d647
    if (gi != 0) {
Packit 01d647
        name = gi->name_;
Packit 01d647
    }
Packit 01d647
    else {
Packit 01d647
        std::ostringstream os;
Packit 01d647
        os << "0x"  << std::hex << std::setw(4)
Packit 01d647
           << std::setfill('0') << std::right << tag;
Packit 01d647
        name = os.str();
Packit 01d647
    }
Packit 01d647
    return name;
Packit 01d647
}
Packit 01d647
Packit 01d647
// -----------------------------------------------------------------------------
Packit 01d647
// Main program
Packit 01d647
int main(int argc, char* const argv[])
Packit 01d647
{
Packit 01d647
    if (argc != 3) {
Packit 01d647
        std::cout << "Usage: " << argv[0] << " tag group\n"
Packit 01d647
                  << "Print the TIFF path for a tag and group (decimal numbers)\n";
Packit 01d647
        return 1;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    uint32_t tag = atol(argv[1]);
Packit 01d647
    uint16_t grp = atol(argv[2]);
Packit 01d647
Packit 01d647
    TiffComponent* pRootDir = new TiffDirectory(0, 1);
Packit 01d647
Packit 01d647
    TiffPath tiffPath1;
Packit 01d647
    TiffCreator::getPath(tiffPath1, tag, grp);
Packit 01d647
    printPath(tiffPath1, tag, grp);
Packit 01d647
    addPath(pRootDir, tag, tiffPath1);
Packit 01d647
Packit 01d647
    ++tag;
Packit 01d647
    TiffPath tiffPath2;
Packit 01d647
    TiffCreator::getPath(tiffPath2, tag, grp);
Packit 01d647
    printPath(tiffPath2, tag, grp);
Packit 01d647
    addPath(pRootDir, tag, tiffPath2);
Packit 01d647
Packit 01d647
    return 0;
Packit 01d647
}
Packit 01d647
Packit 01d647
// -----------------------------------------------------------------------------
Packit 01d647
void addPath(TiffComponent* pRootDir,
Packit 01d647
             uint16_t       tag,
Packit 01d647
             TiffPath&      tiffPath)
Packit 01d647
{
Packit 01d647
    TiffComponent* tc = pRootDir->addPath(tag, tiffPath);
Packit 01d647
Packit 01d647
    TiffPrinter tiffPrinter(std::cout);
Packit 01d647
    pRootDir->accept(tiffPrinter);
Packit 01d647
Packit 01d647
    std::cout << std::endl;
Packit 01d647
    if (tc) {
Packit 01d647
        std::cout << "Added tag " << tiffTagName(tc->tag())
Packit 01d647
                  << ", group " << tiffGroupName(tc->group()) << "\n";
Packit 01d647
    }
Packit 01d647
    else {
Packit 01d647
        std::cout << "No tag added\n";
Packit 01d647
    }
Packit 01d647
    std::cout << std::endl;
Packit 01d647
}
Packit 01d647
Packit 01d647
// -----------------------------------------------------------------------------
Packit 01d647
void printPath(TiffPath tiffPath,
Packit 01d647
               uint32_t tag,
Packit 01d647
               uint16_t grp)
Packit 01d647
{
Packit 01d647
    std::cout << "\nTiff path for tag "
Packit 01d647
              << std::setw(6) << std::setfill(' ') << std::left
Packit 01d647
              << tiffTagName(tag)
Packit 01d647
              << ", group " << tiffGroupName(grp)
Packit 01d647
              << " (id = " << std::dec << grp << "):\n\n"
Packit 01d647
              << "ext. tag group        new group   \n"
Packit 01d647
              << "-------- ------------ ------------\n";
Packit 01d647
Packit 01d647
    while (!tiffPath.empty())
Packit 01d647
    {
Packit 01d647
        const TiffStructure* ts = tiffPath.top();
Packit 01d647
        tiffPath.pop();
Packit 01d647
        std::cout << std::setw(8) << std::setfill(' ') << std::left
Packit 01d647
                  << tiffTagName(ts->extendedTag_)
Packit 01d647
                  << " " << std::setw(12) << std::setfill(' ') << std::left
Packit 01d647
                  << tiffGroupName(ts->group_)
Packit 01d647
                  << " " << std::setw(12) << std::setfill(' ') << std::left
Packit 01d647
                  << tiffGroupName(ts->newGroup_)
Packit 01d647
                  << "\n";
Packit 01d647
    }
Packit 01d647
    std::cout << std::endl;
Packit 01d647
}