Blame samples/tiffaddpath-test.cpp

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