char *lfDatabase::Save (const lfMount *const *mounts, const lfCamera *const *cameras, const lfLens *const *lenses) { int i, j; GString *output = g_string_sized_new (1024); g_string_append (output, "<lensdatabase>\n\n"); if (mounts) for (i = 0; mounts [i]; i++) { g_string_append (output, "\t<mount>\n"); _lf_xml_printf_mlstr (output, "\t\t", "name", mounts [i]->Name); if (mounts [i]->Compat) for (j = 0; mounts [i]->Compat [j]; j++) _lf_xml_printf (output, "\t\t<compat>%s</compat>\n", mounts [i]->Compat [j]); g_string_append (output, "\t</mount>\n\n"); } if (cameras) for (i = 0; cameras [i]; i++) { g_string_append (output, "\t<camera>\n"); _lf_xml_printf_mlstr (output, "\t\t", "maker", cameras [i]->Maker); _lf_xml_printf_mlstr (output, "\t\t", "model", cameras [i]->Model); _lf_xml_printf_mlstr (output, "\t\t", "variant", cameras [i]->Variant); _lf_xml_printf (output, "\t\t<mount>%s</mount>\n", cameras [i]->Mount); _lf_xml_printf (output, "\t\t<cropfactor>%g</cropfactor>\n", cameras [i]->CropFactor); g_string_append (output, "\t</camera>\n\n"); } if (lenses) for (i = 0; lenses [i]; i++) { g_string_append (output, "\t<lens>\n"); _lf_xml_printf_mlstr (output, "\t\t", "maker", lenses [i]->Maker); _lf_xml_printf_mlstr (output, "\t\t", "model", lenses [i]->Model); if (lenses [i]->MinFocal) { if (lenses [i]->MinFocal == lenses [i]->MaxFocal) _lf_xml_printf (output, "\t\t<focal value=\"%g\" />\n", lenses [i]->MinFocal); else _lf_xml_printf (output, "\t\t<focal min=\"%g\" max=\"%g\" />\n", lenses [i]->MinFocal, lenses [i]->MaxFocal); } if (lenses [i]->MinAperture) { if (lenses [i]->MinAperture == lenses [i]->MaxAperture) _lf_xml_printf (output, "\t\t<aperture value=\"%g\" />\n", lenses [i]->MinAperture); else _lf_xml_printf (output, "\t\t<aperture min=\"%g\" max=\"%g\" />\n", lenses [i]->MinAperture, lenses [i]->MaxAperture); } if (lenses [i]->Mounts) for (j = 0; lenses [i]->Mounts [j]; j++) _lf_xml_printf (output, "\t\t<mount>%s</mount>\n", lenses [i]->Mounts [j]); if (lenses [i]->Type != LF_RECTILINEAR) _lf_xml_printf (output, "\t\t<type>%s</type>\n", lenses [i]->Type == LF_FISHEYE ? "fisheye" : lenses [i]->Type == LF_PANORAMIC ? "panoramic" : lenses [i]->Type == LF_EQUIRECTANGULAR ? "equirectangular" : "rectilinear"); if (lenses [i]->CenterX || lenses [i]->CenterY) _lf_xml_printf (output, "\t\t<center x=\"%g\" y=\"%g\" />\n", lenses [i]->CenterX, lenses [i]->CenterY); if (lenses [i]->RedCCI != 0 || lenses [i]->GreenCCI != 5 || lenses [i]->BlueCCI != 4) _lf_xml_printf (output, "\t\t<cci red=\"%g\" green=\"%g\" blue=\"%g\" />\n", lenses [i]->RedCCI, lenses [i]->GreenCCI, lenses [i]->BlueCCI); _lf_xml_printf (output, "\t\t<cropfactor>%g</cropfactor>\n", lenses [i]->CropFactor); if (lenses [i]->CalibDistortion || lenses [i]->CalibTCA || lenses [i]->CalibVignetting) g_string_append (output, "\t\t<calibration>\n"); if (lenses [i]->CalibDistortion) { for (j = 0; lenses [i]->CalibDistortion [j]; j++) { lfLensCalibDistortion *cd = lenses [i]->CalibDistortion [j]; _lf_xml_printf (output, "\t\t\t<distortion focal=\"%g\" ", cd->Focal); switch (cd->Model) { case LF_DIST_MODEL_POLY3: _lf_xml_printf ( output, "model=\"poly3\" k1=\"%g\" />\n", cd->Terms [0]); break; case LF_DIST_MODEL_POLY5: _lf_xml_printf ( output, "model=\"poly5\" k1=\"%g\" k2=\"%g\" />\n", cd->Terms [0], cd->Terms [1]); break; case LF_DIST_MODEL_FOV1: _lf_xml_printf ( output, "model=\"fov1\" omega=\"%g\" />\n", cd->Terms [0]); break; case LF_DIST_MODEL_PTLENS: _lf_xml_printf ( output, "model=\"ptlens\" a=\"%g\" b=\"%g\" c=\"%g\" />\n", cd->Terms [0], cd->Terms [1], cd->Terms [2]); break; default: _lf_xml_printf (output, "model=\"none\" />\n"); break; } } } if (lenses [i]->CalibTCA) { for (j = 0; lenses [i]->CalibTCA [j]; j++) { lfLensCalibTCA *ctca = lenses [i]->CalibTCA [j]; _lf_xml_printf (output, "\t\t\t<tca focal=\"%g\" ", ctca->Focal); switch (ctca->Model) { case LF_TCA_MODEL_LINEAR: _lf_xml_printf (output, "model=\"linear\" kr=\"%g\" kb=\"%g\" />\n", ctca->Terms [0], ctca->Terms [1]); break; default: _lf_xml_printf (output, "model=\"none\" />\n"); break; } } } if (lenses [i]->CalibVignetting) { for (j = 0; lenses [i]->CalibVignetting [j]; j++) { lfLensCalibVignetting *cv = lenses [i]->CalibVignetting [j]; _lf_xml_printf (output, "\t\t\t<vignetting focal=\"%g\" aperture=\"%g\" distance=\"%g\" ", cv->Focal, cv->Aperture, cv->Distance); switch (cv->Model) { case LF_VIGNETTING_MODEL_PA: _lf_xml_printf (output, "model=\"pa\" k1=\"%g\" k2=\"%g\" k3=\"%g\" />\n", cv->Terms [0], cv->Terms [1], cv->Terms [2]); break; default: _lf_xml_printf (output, "model=\"none\" />\n"); break; } } } if (lenses [i]->CalibDistortion || lenses [i]->CalibTCA || lenses [i]->CalibVignetting) g_string_append (output, "\t\t</calibration>\n"); g_string_append (output, "\t</lens>\n\n"); } g_string_append (output, "</lensdatabase>\n"); return g_string_free (output, FALSE); }
char *lfDatabase::Save (const lfMount *const *mounts, const lfCamera *const *cameras, const lfLens *const *lenses) { /* Temporarily drop numeric format to "C" */ char *old_numeric = setlocale (LC_NUMERIC, NULL); old_numeric = strdup(old_numeric); setlocale(LC_NUMERIC,"C"); int i, j; GString *output = g_string_sized_new (1024); g_string_append (output, "<lensdatabase>\n\n"); if (mounts) for (i = 0; mounts [i]; i++) { g_string_append (output, "\t<mount>\n"); _lf_xml_printf_mlstr (output, "\t\t", "name", mounts [i]->Name); if (mounts [i]->Compat) for (j = 0; mounts [i]->Compat [j]; j++) _lf_xml_printf (output, "\t\t<compat>%s</compat>\n", mounts [i]->Compat [j]); g_string_append (output, "\t</mount>\n\n"); } if (cameras) for (i = 0; cameras [i]; i++) { g_string_append (output, "\t<camera>\n"); _lf_xml_printf_mlstr (output, "\t\t", "maker", cameras [i]->Maker); _lf_xml_printf_mlstr (output, "\t\t", "model", cameras [i]->Model); _lf_xml_printf_mlstr (output, "\t\t", "variant", cameras [i]->Variant); _lf_xml_printf (output, "\t\t<mount>%s</mount>\n", cameras [i]->Mount); _lf_xml_printf (output, "\t\t<cropfactor>%g</cropfactor>\n", cameras [i]->CropFactor); g_string_append (output, "\t</camera>\n\n"); } if (lenses) for (i = 0; lenses [i]; i++) { g_string_append (output, "\t<lens>\n"); _lf_xml_printf_mlstr (output, "\t\t", "maker", lenses [i]->Maker); _lf_xml_printf_mlstr (output, "\t\t", "model", lenses [i]->Model); if (lenses [i]->MinFocal) { if (lenses [i]->MinFocal == lenses [i]->MaxFocal) _lf_xml_printf (output, "\t\t<focal value=\"%g\" />\n", lenses [i]->MinFocal); else _lf_xml_printf (output, "\t\t<focal min=\"%g\" max=\"%g\" />\n", lenses [i]->MinFocal, lenses [i]->MaxFocal); } if (lenses [i]->MinAperture) { if (lenses [i]->MinAperture == lenses [i]->MaxAperture) _lf_xml_printf (output, "\t\t<aperture value=\"%g\" />\n", lenses [i]->MinAperture); else _lf_xml_printf (output, "\t\t<aperture min=\"%g\" max=\"%g\" />\n", lenses [i]->MinAperture, lenses [i]->MaxAperture); } if (lenses [i]->Mounts) for (j = 0; lenses [i]->Mounts [j]; j++) _lf_xml_printf (output, "\t\t<mount>%s</mount>\n", lenses [i]->Mounts [j]); if (lenses [i]->Type != LF_RECTILINEAR) _lf_xml_printf (output, "\t\t<type>%s</type>\n", lenses [i]->Type == LF_FISHEYE ? "fisheye" : lenses [i]->Type == LF_PANORAMIC ? "panoramic" : lenses [i]->Type == LF_EQUIRECTANGULAR ? "equirectangular" : lenses [i]->Type == LF_FISHEYE_ORTHOGRAPHIC ? "orthographic" : lenses [i]->Type == LF_FISHEYE_STEREOGRAPHIC ? "stereographic" : lenses [i]->Type == LF_FISHEYE_EQUISOLID ? "equisolid" : lenses [i]->Type == LF_FISHEYE_THOBY ? "fisheye_thoby" : "rectilinear"); if (lenses [i]->CenterX || lenses [i]->CenterY) _lf_xml_printf (output, "\t\t<center x=\"%g\" y=\"%g\" />\n", lenses [i]->CenterX, lenses [i]->CenterY); if (lenses [i]->RedCCI != 0 || lenses [i]->GreenCCI != 5 || lenses [i]->BlueCCI != 4) _lf_xml_printf (output, "\t\t<cci red=\"%g\" green=\"%g\" blue=\"%g\" />\n", lenses [i]->RedCCI, lenses [i]->GreenCCI, lenses [i]->BlueCCI); _lf_xml_printf (output, "\t\t<cropfactor>%g</cropfactor>\n", lenses [i]->CropFactor); if (lenses [i]->CalibDistortion || lenses [i]->CalibTCA || lenses [i]->CalibVignetting || lenses [i]->CalibCrop || lenses [i]->CalibFov ) g_string_append (output, "\t\t<calibration>\n"); if (lenses [i]->CalibDistortion) { for (j = 0; lenses [i]->CalibDistortion [j]; j++) { lfLensCalibDistortion *cd = lenses [i]->CalibDistortion [j]; _lf_xml_printf (output, "\t\t\t<distortion focal=\"%g\" ", cd->Focal); switch (cd->Model) { case LF_DIST_MODEL_POLY3: _lf_xml_printf ( output, "model=\"poly3\" k1=\"%g\" />\n", cd->Terms [0]); break; case LF_DIST_MODEL_POLY5: _lf_xml_printf ( output, "model=\"poly5\" k1=\"%g\" k2=\"%g\" />\n", cd->Terms [0], cd->Terms [1]); break; case LF_DIST_MODEL_FOV1: _lf_xml_printf ( output, "model=\"fov1\" omega=\"%g\" />\n", cd->Terms [0]); break; case LF_DIST_MODEL_PTLENS: _lf_xml_printf ( output, "model=\"ptlens\" a=\"%g\" b=\"%g\" c=\"%g\" />\n", cd->Terms [0], cd->Terms [1], cd->Terms [2]); break; default: _lf_xml_printf (output, "model=\"none\" />\n"); break; } } } if (lenses [i]->CalibTCA) { for (j = 0; lenses [i]->CalibTCA [j]; j++) { lfLensCalibTCA *ctca = lenses [i]->CalibTCA [j]; _lf_xml_printf (output, "\t\t\t<tca focal=\"%g\" ", ctca->Focal); switch (ctca->Model) { case LF_TCA_MODEL_LINEAR: _lf_xml_printf (output, "model=\"linear\" kr=\"%g\" kb=\"%g\" />\n", ctca->Terms [0], ctca->Terms [1]); break; default: _lf_xml_printf (output, "model=\"none\" />\n"); break; } } } if (lenses [i]->CalibVignetting) { for (j = 0; lenses [i]->CalibVignetting [j]; j++) { lfLensCalibVignetting *cv = lenses [i]->CalibVignetting [j]; _lf_xml_printf (output, "\t\t\t<vignetting focal=\"%g\" aperture=\"%g\" distance=\"%g\" ", cv->Focal, cv->Aperture, cv->Distance); switch (cv->Model) { case LF_VIGNETTING_MODEL_PA: _lf_xml_printf (output, "model=\"pa\" k1=\"%g\" k2=\"%g\" k3=\"%g\" />\n", cv->Terms [0], cv->Terms [1], cv->Terms [2]); break; default: _lf_xml_printf (output, "model=\"none\" />\n"); break; } } } if (lenses [i]->CalibCrop) { for (j = 0; lenses [i]->CalibCrop [j]; j++) { lfLensCalibCrop *lcc = lenses [i]->CalibCrop [j]; _lf_xml_printf (output, "\t\t\t<crop focal=\"%g\" ", lcc->Focal); switch (lcc->CropMode) { case LF_CROP_RECTANGLE: _lf_xml_printf ( output, "mode=\"crop_rectangle\" left=\"%g\" right=\"%g\" top=\"%g\" bottom=\"%g\" />\n", lcc->Crop [0], lcc->Crop [1], lcc->Crop [2], lcc->Crop [3]); break; case LF_CROP_CIRCLE: _lf_xml_printf ( output, "mode=\"crop_circle\" left=\"%g\" right=\"%g\" top=\"%g\" bottom=\"%g\" />\n", lcc->Crop [0], lcc->Crop [1], lcc->Crop [2], lcc->Crop [3]); break; case LF_NO_CROP: default: _lf_xml_printf (output, "mode=\"no_crop\" />\n"); break; } } } if (lenses [i]->CalibFov) { for (j = 0; lenses [i]->CalibFov [j]; j++) { lfLensCalibFov *lcf = lenses [i]->CalibFov [j]; if (lcf->FieldOfView>0) { _lf_xml_printf (output, "\t\t\t<field_of_view focal=\"%g\" fov=\"%g\" />\n", lcf->Focal, lcf->FieldOfView); }; } } if (lenses [i]->CalibDistortion || lenses [i]->CalibTCA || lenses [i]->CalibVignetting || lenses [i]->CalibCrop || lenses [i]->CalibFov ) g_string_append (output, "\t\t</calibration>\n"); g_string_append (output, "\t</lens>\n\n"); } g_string_append (output, "</lensdatabase>\n"); /* Restore numeric format */ setlocale (LC_NUMERIC, old_numeric); free(old_numeric); return g_string_free (output, FALSE); }