--- a
+++ b/tools/PTLensDB.h
@@ -0,0 +1,265 @@
+/*
+' PTLens, Copyright (C) 2004, Thomas Niemann
+' email: thomasn@epaperpress.com, subject=ptlens
+'
+' Additional developers:
+'  Tim Jacobs twjacobs@gmail.com     
+'    conversion to ANSI C
+'
+'  Pablo d'Angelo pablo.dangelo@web.de
+'    code cleanup, removed global variables, standalone .c file
+'
+' This program is free software; you can redistribute
+' it and/or modify it under the terms of the GNU
+' General Public License as published by the Free
+' Software Foundation; either version 2 of the
+' License, or (at your option) any later version.
+'
+' This program is distributed in the hope that it will
+' be useful, but WITHOUT ANY WARRANTY; without even
+' the implied warranty of MERCHANTABILITY or FITNESS
+' FOR A PARTICULAR PURPOSE. See the GNU General Public
+' License for more details.
+'
+' You should have received a copy of the GNU General
+' Public License along with this program; if not,
+' write to the Free Software Foundation, Inc., 675
+' Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef PTLENSDB_H
+#define PTLENSDB_H
+
+#if defined(__cplusplus) && __cplusplus
+extern "C" {
+#endif
+
+/// version of the API. 
+#define PTLDB_VERSION 1
+
+// all these constants are not so nice.
+#define PTLDB_MAX_FILES  100
+#define PTLDB_MAX_PATH 512
+#define PTLDB_MAX_NAME_LEN 100
+#define PTLDB_MAX_COEFFS 10000
+
+// define the database structures
+typedef struct PTLDB_grp{
+    struct PTLDB_grp *nextGrp;
+    char name[256];
+}PTLDB_GrpNode;
+
+typedef struct PTLDB_cam{
+    struct PTLDB_cam *nextCam;
+    struct PTLDB_cam *firstModel;
+    long numMake;
+    long numModel;
+    PTLDB_GrpNode *group;
+    char menuMake[256];
+    char menuModel[256];
+    char exifMake[256];
+    char exifModel[256];
+    float multiplier;
+}PTLDB_CamNode;
+
+typedef struct PTLDB_lens{
+    struct PTLDB_lens *nextLns;
+    struct PTLDB_lens *firstLns;
+    long numLens;
+    char group[256];
+    char menuLens[256];
+    float converterFactor;
+    long converterDetected;
+    long coefLB;
+    long coefUB;
+    long vigCoefLB;
+    long vigCoefUB;
+    long tcaCoefLB;
+    long tcaCoefUB;
+    float multiplier;
+}PTLDB_LnsNode;
+
+
+// define other structures
+typedef struct
+{
+    float f;
+    float a;
+    float b;
+    float c;
+}PTLDB_CoefType;
+
+// define other structures
+typedef struct
+{
+    float f;    ///< focal length
+    float k;    ///< f stop
+    float coef[4];
+}PTLDB_VigCoefType;
+
+typedef struct
+{
+    float f;    ///< focal length
+    float coefRed[4];
+    float coefBlue[4];
+}PTLDB_TCACoefType;
+
+
+/*
+typedef struct {
+	char inputDir[256];
+	char stitcher[256];
+	char viewerPath[256];
+	char *profilePath;
+	char suffix[32];
+	char menuMake[256];
+	char menuModel[256];
+	char menuLens[256];
+	int format;
+	int jpegQuality;
+	int interpolation;
+	int beep;
+	int resize;
+	int converterDetected;
+}prefType;
+*/
+
+typedef struct
+{
+//    double hfov;
+    double a;
+    double b;
+    double c;
+    double d;
+} PTLDB_RadCoef;
+
+/** \brief This struct hold information about an image, and
+ *         is used to retrieve the coefficients for the current setup
+ */
+typedef struct
+{
+    PTLDB_CamNode *camera;
+    PTLDB_LnsNode *lens;
+    double focalLength;
+    double aperture;
+    unsigned width;
+    unsigned height;
+    int converterDetected;  ///< 1: a converter has been detected
+    int resize;             ///< 1: resize image to avoid black borders
+} PTLDB_ImageInfo;
+
+/** database with all lenses and cameras */
+typedef struct {
+//    CamNode *pCurCam;
+    PTLDB_CamNode *pCamHdr;
+    PTLDB_LnsNode *pLnsHdr;
+//    PTLDB_GrpNode *pCurCamGrp;
+    unsigned fileIndex;
+    // FIXME dangelo: this is not nice... but I'm lazy and not used to write C code.
+    char fileList[PTLDB_MAX_FILES][PTLDB_MAX_PATH];
+    long coefIndex;
+    long vigCoefIndex;
+    long tcaCoefIndex;
+    PTLDB_CoefType coef[PTLDB_MAX_COEFFS];
+    PTLDB_VigCoefType vigCoef[PTLDB_MAX_COEFFS];
+    PTLDB_TCACoefType tcaCoef[PTLDB_MAX_COEFFS];
+} PTLDB_DB;
+
+
+
+/**
+ * \brief Read lens calibration data from profile files.
+ * \return pointer to database if successfull, NULL otherwise
+ * \param profileFile filename of main profile (profile.txt)
+ *
+ *****************************************************/
+PTLDB_DB * PTLDB_readDB(const char * profileFile);
+
+
+/**
+ * \brief Free database
+ * \param db  Pointer to database
+ *
+ *****************************************************/
+void PTLDB_freeDB(PTLDB_DB * db);
+
+/**
+ * \brief Free a lens node linked list
+ * \param lens  Pointer to first lens
+ *
+ *****************************************************/
+void PTLDB_freeLnsList(PTLDB_LnsNode * lens);
+
+ /** \brief Look for a camera in the linked list of supported cameras.
+ * \return pointer to camera node if successfull, NULL otherwise
+ * \param db        Pointer to database
+ * \param exifMake  The camera make as found in the jpeg EXIF data
+ * \param exifModel The camera model as found in the jpeg EXIF data
+ *
+ *****************************************************/
+PTLDB_CamNode *PTLDB_findCamera(PTLDB_DB * db, const char *exifMake, const char *exifModel);
+
+/**
+ * \brief Look for a lens in the linked list of supported lenses.  
+ *        The lens is checked to make sure it has been calibrated
+ *        for the camera passed in.
+ * \param db        The lens database
+ * \param lens      The lens name to look for
+ * \param camera    The camera model as found in the jpeg EXIF data
+ * \return pointer to the lens node if successful, NULL otherwise
+ *
+ *****************************************************/
+PTLDB_LnsNode *PTLDB_findLens(PTLDB_DB * db, const char *lens, PTLDB_CamNode *camera);
+ 
+/**
+ * \brief Create a linked list of all calibrated lenses for
+ *        the input camera.
+ * \return pointer to the first lens node if lenses found,
+ *         NULL otherwise. The list should be freed using
+ *         PTLDB_freeLnsList().
+ * \param db     Pointer to the database
+ * \param camera A pointer to the camera node in the linked list
+ *
+ *****************************************************/
+PTLDB_LnsNode *PTLDB_findLenses(PTLDB_DB * db, PTLDB_CamNode *camera);
+
+/** \brief Display all information read from profile files.
+ * \return void.
+ */
+void PTLDB_printDB(PTLDB_DB * db);
+
+void PTLDB_printDBXML(PTLDB_DB * db);
+
+/**
+ * \brief Calculate the lens correction coefficients (a,b,c,d) for
+ *        a particular focal length of a particular lens by linear
+ *        interpolation of known coefficients for the lens.
+ * \param image    information about current image
+ * \param coef1    pointer to radial distortion coefficients.
+ *                 Will contain the coefficients
+ * \param 
+ * \return 0 if unsuccessful, 1 otherwise.
+ *
+ *****************************************************/
+int PTLDB_getRadCoefs(PTLDB_DB * db, PTLDB_ImageInfo * info, PTLDB_RadCoef * coef1);
+
+
+/**
+ * \brief Calculate the Horizontal Field Of View (HFOV) for
+ *        a given focal length, width, height, and multiplier.
+ * \return The HFOV.
+ * \param thisCamera The current camera
+ * \param foc The focal length of the lens when the picture was
+ *        taken. Read from EXIF data.
+ * \param width width of image
+ * \param height height of image
+ *
+ *****************************************************/
+double PTLDB_getHfov(PTLDB_CamNode * thisCamera, double foc, int width, int height);
+
+
+#if defined(__cplusplus) && __cplusplus
+}
+#endif
+
+#endif