view libinterp/dldfcn/__tiff__.cc @ 31092:a736190ce738

Added the Tiff classdef files to octave
author magedrifaat <magedrifaat@gmail.com>
date Fri, 17 Jun 2022 16:53:43 +0200
parents
children e2bed4daae82
line wrap: on
line source

#include <string>

#include "defun-dld.h"
#include "ov.h"
#include "ovl.h"

#include <tiffio.h>


// TODO(maged): Tidy up the formatting to be consistant with octave

DEFUN_DLD (__open_tiff__, args, nargout,
           "Open a Tiff file and return its handle")
{
    int nargin = args.length();

    if (nargin == 0 || nargin > 2)
    {
        // TODO(maged): return invalid object instead??
        error("No filename supplied\n");
    }

    std::string filename = args(0).string_value();
    std::string mode = "r";

    // TODO(maged): check valid mode
    if (nargin == 2)
        mode = args(1).string_value();
    
    TIFF *tif = TIFFOpen(filename.c_str(), mode.c_str());
    // TODO(maged): print a better error
    if (!tif)
        error("Failed to open Tiff file\n");

    octave_value tiff_ov = octave_value((uint64_t)tif);
    return octave_value_list (tiff_ov);
}


DEFUN_DLD (__close_tiff__, args, nargout,
           "Close a tiff file")
{
    int nargin = args.length();

    if (nargin == 0)
    {
        error("No handle provided\n");
    }
    
    TIFF *tif = (TIFF *)(args(0).uint64_value());
    TIFFClose(tif);

    return octave_value_list ();
}


DEFUN_DLD (__tiff_get_tag__, args, nargout,
           "Get the value of a tag from a tiff image")
{
    int nargin = args.length();

    if (nargin == 0)
    {
        error("No handle provided\n");
    }
    
    if (nargin < 2)
    {
        error("No tag name provided\n");
    }
    
    TIFF *tif = (TIFF *)(args(0).uint64_value());

    uint32_t tag_ID;
    if (args(1).type_name() == "string")
    {
        std::string tagName = args(1).string_value();
        const TIFFField *fip = TIFFFieldWithName(tif, tagName.c_str());
        if (!fip)
            error("Tiff tag not found\n");
        
        tag_ID = TIFFFieldTag(fip);
    }
    else
    {
        tag_ID = args(1).int_value();
        const TIFFField *fip = TIFFFieldWithTag(tif, tag_ID);
        // TODO(maged): Handle other types of errors
        if (!fip)
            error("Tiff tag not found\n");
    }

    // TODO(maged): Handle different data types/ multivalued tags.
    uint32_t tag_data;
    TIFFGetField(tif, tag_ID, &tag_data);

    return octave_value_list (octave_value(tag_data));
}