/* GIMP - The GNU Image Manipulation Program * Copyright (C) 1995 Spencer Kimball and Peter Mattis * * 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 3 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, see . */ #include "config.h" #include #include #include #include #include "libgimp/stdplugins-intl.h" #include "metadata-tags.h" /* The meaning of "single" and "multi" here denotes whether it is used in a * single line or a multi line edit field. * Depending on it's xmp type multi line can be saved as either: * - one tag of type text, possibly including newlines * - an array of tags of the same type for seq and bag, where each line in * the multi line edit will be one item in the array */ const metadata_tag default_metadata_tags[] = { /* Description */ { "Xmp.dc.title", "single", 16, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 0 { "Xmp.dc.creator", "single", 13, TAG_TYPE_XMP, GIMP_XMP_SEQ }, // 1 { "Xmp.dc.description", "multi", 14, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 2 { "Xmp.dc.subject", "multi", 15, TAG_TYPE_XMP, GIMP_XMP_BAG }, // 3 { "Xmp.dc.rights", "single", 17, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 4 { "Xmp.photoshop.AuthorsPosition", "single", 19, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 5 { "Xmp.photoshop.CaptionWriter", "single", 21, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 6 { "Xmp.xmp.Rating", "combo", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 7 { "Xmp.xmpRights.Marked", "combo", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 8 { "Xmp.xmpRights.WebStatement", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 9 /* IPTC */ { "Xmp.photoshop.DateCreated", "single", 0, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 10 { "Xmp.photoshop.Headline", "multi", 3, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 11 { "Xmp.photoshop.TransmissionReference", "single", 1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 12 { "Xmp.photoshop.Instructions", "multi", 2, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 13 { "Xmp.iptc.IntellectualGenre", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 14 { "Xmp.iptc.Scene", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_BAG }, // 15 { "Xmp.iptc.Location", "single", 18, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 16 { "Xmp.iptc.CountryCode", "single", 20, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 17 { "Xmp.iptc.SubjectCode", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_BAG }, // 18 { "Xmp.xmpRights.UsageTerms", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 19 { "Xmp.photoshop.City", "single", 5, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 20 { "Xmp.photoshop.State", "single", 6, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 21 { "Xmp.photoshop.Country", "single", 7, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 22 /* Xmp.photoshop.CaptionWriter here is a duplicate of #6 above. We keep it here to not have * to renumber the tag references. It seems it is not used on the IPTC tab. */ { "Xmp.photoshop.CaptionWriter", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 23 { "Xmp.photoshop.Credit", "single", 8, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 24 { "Xmp.photoshop.Source", "single", 9, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 25 { "Xmp.photoshop.Urgency", "combo", 11, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 26 /* IPTC Extension */ { "Xmp.iptcExt.PersonInImage", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_BAG }, // 27 { "Xmp.iptcExt.Sublocation", "single", 12, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 28 { "Xmp.iptcExt.City", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 29 { "Xmp.iptcExt.ProvinceState", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 30 { "Xmp.iptcExt.CountryName", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 31 { "Xmp.iptcExt.CountryCode", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 32 { "Xmp.iptcExt.WorldRegion", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 33 { "Xmp.iptcExt.LocationShown", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 34 { "Xmp.iptcExt.OrganisationInImageName", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 35 { "Xmp.iptcExt.OrganisationInImageCode", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 36 { "Xmp.iptcExt.Event", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 37 { "Xmp.iptcExt.RegistryId", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 38 { "Xmp.iptcExt.ArtworkOrObject", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 39 { "Xmp.iptcExt.AddlModelInfo", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 40 { "Xmp.iptcExt.ModelAge", "single", -1, TAG_TYPE_XMP, GIMP_XMP_BAG }, // 41 { "Xmp.iptcExt.MaxAvailWidth", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 42 { "Xmp.iptcExt.MaxAvailHeight", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 43 { "Xmp.iptcExt.DigitalSourceType", "combo", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 44 { "Xmp.plus.MinorModelAgeDisclosure", "combo", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 45 { "Xmp.plus.ModelReleaseStatus", "combo", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 46 { "Xmp.plus.ModelReleaseID", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 47 { "Xmp.plus.ImageSupplierName", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 48 { "Xmp.plus.ImageSupplierID", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 49 { "Xmp.plus.ImageSupplierImageID", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 50 { "Xmp.plus.ImageCreator", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 51 { "Xmp.plus.CopyrightOwner", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 52 { "Xmp.plus.Licensor", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 53 { "Xmp.plus.PropertyReleaseStatus", "combo", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 54 { "Xmp.plus.PropertyReleaseID", "list", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 55 /* Categories */ { "Xmp.photoshop.Category", "single", 4, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 56 { "Xmp.photoshop.SupplementalCategories", "multi", 10, TAG_TYPE_XMP, GIMP_XMP_BAG }, // 57 /* GPS */ { "Exif.GPSInfo.GPSLongitude", "single", -1, TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 58 { "Exif.GPSInfo.GPSLongitudeRef", "combo", -1, TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 59 { "Exif.GPSInfo.GPSLatitude", "single", -1, TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 60 { "Exif.GPSInfo.GPSLatitudeRef", "combo", -1, TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 61 { "Exif.GPSInfo.GPSAltitude", "single", -1, TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 62 { "Exif.GPSInfo.GPSAltitudeRef", "combo", -1, TAG_TYPE_EXIF, GIMP_XMP_NONE }, // 63 /* DICOM */ { "Xmp.DICOM.PatientName", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 64 { "Xmp.DICOM.PatientID", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 65 { "Xmp.DICOM.PatientDOB", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 66 { "Xmp.DICOM.PatientSex", "combo", -1, TAG_TYPE_XMP, GIMP_XMP_NONE }, // 67 { "Xmp.DICOM.StudyID", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 68 { "Xmp.DICOM.StudyPhysician", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 69 { "Xmp.DICOM.StudyDateTime", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 70 { "Xmp.DICOM.StudyDescription", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 71 { "Xmp.DICOM.SeriesNumber", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 72 { "Xmp.DICOM.SeriesModality", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 73 { "Xmp.DICOM.SeriesDateTime", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 74 { "Xmp.DICOM.SeriesDescription", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 75 { "Xmp.DICOM.EquipmentInstitution", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 76 { "Xmp.DICOM.EquipmentManufacturer", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 77 /* IPTC */ { "Xmp.iptc.CiAdrExtadr", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 78 { "Xmp.iptc.CiAdrCity", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 79 { "Xmp.iptc.CiAdrRegion", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 80 { "Xmp.iptc.CiAdrPcode", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 81 { "Xmp.iptc.CiAdrCtry", "single", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 82 { "Xmp.iptc.CiTelWork", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 83 { "Xmp.iptc.CiEmailWork", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT }, // 84 { "Xmp.iptc.CiUrlWork", "multi", -1, TAG_TYPE_XMP, GIMP_XMP_TEXT } // 85 }; const gint n_default_metadata_tags = G_N_ELEMENTS (default_metadata_tags); /* Then meaning of "single" and "multi" below is a little different than above. * "single" - for iptc tags that can appear only once, * "multi" - for iptc tags that are repeatable, i.e. can appear multiple times. */ const metadata_tag equivalent_metadata_tags[] = { { "Iptc.Application2.DateCreated", "single", 10, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 0 { "Iptc.Application2.TransmissionReference", "single", 12, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 1 { "Iptc.Application2.SpecialInstructions", "single", 13, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 2 { "Iptc.Application2.Headline", "single", 11, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 3 { "Iptc.Application2.Category", "single", 56, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 4 { "Iptc.Application2.City", "single", 20, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 5 { "Iptc.Application2.ProvinceState", "single", 21, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 6 { "Iptc.Application2.CountryName", "single", 22, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 7 { "Iptc.Application2.Credit", "single", 24, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 8 { "Iptc.Application2.Source", "single", 25, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 9 { "Iptc.Application2.SuppCategory", "multi", 57, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 10 { "Iptc.Application2.Urgency", "combo", 26, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 11 { "Iptc.Application2.SubLocation", "single", 28, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 12 { "Iptc.Application2.Byline", "single", 1, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 13 { "Iptc.Application2.Caption", "single", 2, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 14 { "Iptc.Application2.Keywords", "multi", 3, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 15 { "Iptc.Application2.ObjectName", "single", 0, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 16 { "Iptc.Application2.Copyright", "single", 4, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 17 { "Iptc.Application2.LocationName", "multi", 16, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 18 { "Iptc.Application2.BylineTitle", "multi", 5, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 19 { "Iptc.Application2.CountryCode", "single", 17, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 20 { "Iptc.Application2.Writer", "multi", 6, TAG_TYPE_IPTC, GIMP_XMP_NONE }, // 21 }; const gint n_equivalent_metadata_tags = G_N_ELEMENTS (equivalent_metadata_tags); /* Digital Source Type Combobox Items * http://cv.iptc.org/newscodes/digitalsourcetype/ */ const combobox_str_tag digitalsourcetype[] = { { "", N_("Select a value") }, { "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture", N_("Original digital capture of a real life scene") }, { "http://cv.iptc.org/newscodes/digitalsourcetype/negativeFilm", N_("Digitized from a negative on film") }, { "http://cv.iptc.org/newscodes/digitalsourcetype/positiveFilm", N_("Digitized from a positive on film") }, { "http://cv.iptc.org/newscodes/digitalsourcetype/print", N_("Digitized from a print on non-transparent medium") }, { "http://cv.iptc.org/newscodes/digitalsourcetype/softwareImage", N_("Created by software") } }; const gint n_digitalsourcetype = G_N_ELEMENTS (digitalsourcetype); /* Model Release Status Combobox Items * http://ns.useplus.org/LDF/ldf-XMPSpecification#ModelReleaseStatus */ const combobox_str_tag modelreleasestatus[] = { { "", N_("Select a value") }, { "http://ns.useplus.org/ldf/vocab/MR-NON", N_("None") }, { "http://ns.useplus.org/ldf/vocab/MR-NAP", N_("Not Applicable") }, { "http://ns.useplus.org/ldf/vocab/MR-UMR", N_("Unlimited Model Releases") }, { "http://ns.useplus.org/ldf/vocab/MR-LMR", N_("Limited or Incomplete Model Releases") } }; const gint n_modelreleasestatus = G_N_ELEMENTS (modelreleasestatus); /* Property Release Status Combobox Items * http://ns.useplus.org/LDF/ldf-XMPSpecification#PropertyReleaseStatus */ const combobox_str_tag propertyreleasestatus[] = { { "http://ns.useplus.org/ldf/vocab/PR-NON", N_("None") }, { "http://ns.useplus.org/ldf/vocab/PR-NAP", N_("Not Applicable") }, { "http://ns.useplus.org/ldf/vocab/PR-UPR", N_("Unlimited Property Releases") }, { "http://ns.useplus.org/ldf/vocab/PR-LPR", N_("Limited or Incomplete Property Releases") } }; const gint n_propertyreleasestatus = G_N_ELEMENTS (propertyreleasestatus); /* Minor Model Age Disclosure Combobox Items * http://ns.useplus.org/LDF/ldf-XMPSpecification#MinorModelAgeDisclosure */ const combobox_str_tag minormodelagedisclosure[] = { { "http://ns.useplus.org/ldf/vocab/AG-UNK", N_("Age Unknown") }, { "http://ns.useplus.org/ldf/vocab/AG-A25", N_("Age 25 or Over") }, { "http://ns.useplus.org/ldf/vocab/AG-A24", N_("Age 24") }, { "http://ns.useplus.org/ldf/vocab/AG-A23", N_("Age 23") }, { "http://ns.useplus.org/ldf/vocab/AG-A22", N_("Age 22") }, { "http://ns.useplus.org/ldf/vocab/AG-A21", N_("Age 21") }, { "http://ns.useplus.org/ldf/vocab/AG-A20", N_("Age 20") }, { "http://ns.useplus.org/ldf/vocab/AG-A19", N_("Age 19") }, { "http://ns.useplus.org/ldf/vocab/AG-A18", N_("Age 18") }, { "http://ns.useplus.org/ldf/vocab/AG-A17", N_("Age 17") }, { "http://ns.useplus.org/ldf/vocab/AG-A16", N_("Age 16") }, { "http://ns.useplus.org/ldf/vocab/AG-A15", N_("Age 15") }, { "http://ns.useplus.org/ldf/vocab/AG-U14", N_("Age 14 or Under") } }; const gint n_minormodelagedisclosure = G_N_ELEMENTS (minormodelagedisclosure); /* Urgency */ const gchar *urgency[] = { N_("None"), N_("High"), N_("2"), N_("3"), N_("4"), N_("Normal"), N_("6"), N_("7"), N_("Low") }; const gint n_urgency = G_N_ELEMENTS (urgency); /* Marked */ const combobox_int_tag marked[] = { { -1, N_("Unknown") }, // DO NOT SAVE { TRUE, N_("Copyrighted") }, // TRUE { FALSE, N_("Public Domain") }, // FALSE }; const gint n_marked = G_N_ELEMENTS (marked); /* Phone Types */ const combobox_str_tag phone_types[] = { { "", N_("Select a value") }, { "http://ns.useplus.org/ldf/vocab/work", N_("Work") }, { "http://ns.useplus.org/ldf/vocab/cell", N_("Cell") }, { "http://ns.useplus.org/ldf/vocab/fax", N_("Fax") }, { "http://ns.useplus.org/ldf/vocab/home", N_("Home") }, { "http://ns.useplus.org/ldf/vocab/pager", N_("Pager") } }; const gint n_phone_types = G_N_ELEMENTS (phone_types); /* DICOM Patient Sex * http://dicomlookup.com/lookup.asp?sw=Ttable&q=C.7-1 * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/XMP.html#DICOM * https://dicomiseasy.blogspot.ca/2011/11/introduction-to-dicom-chapter-iii-dicom.html * http://dicom.nema.org/standard.html */ const combobox_str_tag dicom[] = { { "", N_("Select a value") }, { "male", N_("Male") }, { "female", N_("Female") }, { "other", N_("Other") }, }; const gint n_dicom = G_N_ELEMENTS (dicom); /* GPS Altitude Ref */ const gchar *gpsaltref[] = { N_("Unknown"), N_("Above sea level"), N_("Below sea level") }; const gint n_gpsaltref = G_N_ELEMENTS (gpsaltref); /* GPS Latitude Ref */ const gchar *gpslatref[] = { N_("Unknown"), N_("North"), N_("South") }; const gint n_gpslatref = G_N_ELEMENTS (gpslatref); /* GPS Longitude Ref */ const gchar *gpslngref[] = { N_("Unknown"), N_("East"), N_("West") }; const gint n_gpslngref = G_N_ELEMENTS (gpslngref); /* GPS Measurement System */ const gchar *gpsaltsys[] = { "m", "ft" }; const gint n_gpsaltsys = G_N_ELEMENTS (gpsaltsys); const TranslateHeaderTag creatorContactInfoHeader = { "Xmp.iptc.CreatorContactInfo", "type=\"Struct\"", 8 }; const TranslateTag creatorContactInfoTags[] = { { "Xmp.iptc.CiAdrExtadr", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrExtadr", "multi", -1, TAG_TYPE_XMP }, { "Xmp.iptc.CiAdrCity", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrCity", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptc.CiAdrRegion", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrRegion", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptc.CiAdrPcode", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrPcode", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptc.CiAdrCtry", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiAdrCtry", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptc.CiTelWork", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiTelWork", "multi", -1, TAG_TYPE_XMP }, { "Xmp.iptc.CiEmailWork", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiEmailWork", "multi", -1, TAG_TYPE_XMP }, { "Xmp.iptc.CiUrlWork", "Xmp.iptc.CreatorContactInfo/Iptc4xmpCore:CiUrlWork", "multi", -1, TAG_TYPE_XMP } }; const TranslateHeaderTag locationCreationInfoHeader = { "Xmp.iptcExt.LocationCreated", "type=\"Bag\"", 6 }; const TranslateTag locationCreationInfoTags[] = { { "Xmp.iptcExt.Sublocation", "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:Sublocation", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptcExt.City", "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:City", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptcExt.ProvinceState", "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:ProvinceState", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptcExt.CountryName", "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:CountryName", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptcExt.CountryCode", "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:CountryCode", "single", -1, TAG_TYPE_XMP }, { "Xmp.iptcExt.WorldRegion", "Xmp.iptcExt.LocationCreated[1]/Iptc4xmpExt:WorldRegion", "single", -1, TAG_TYPE_XMP } }; const TranslateHeaderTag imageSupplierInfoHeader = { "Xmp.plus.ImageSupplier", "type=\"Seq\"", 2 }; const TranslateTag imageSupplierInfoTags[] = { { "Xmp.plus.ImageSupplierName", "Xmp.plus.ImageSupplier[1]/plus:ImageSupplierName", "multi", -1, TAG_TYPE_XMP }, { "Xmp.plus.ImageSupplierID", "Xmp.plus.ImageSupplier[1]/plus:ImageSupplierID", "single", -1, TAG_TYPE_XMP } }; /* Plus and IPTC extension tags */ const gchar *licensor[] = { "/plus:LicensorName", "/plus:LicensorID", "/plus:LicensorTelephone1", "/plus:LicensorTelephoneType1", "/plus:LicensorTelephone2", "/plus:LicensorTelephoneType2", "/plus:LicensorEmail", "/plus:LicensorURL" }; const gint n_licensor = G_N_ELEMENTS (licensor); const gint licensor_special_handling[] = { METADATA_NONE, METADATA_NONE, METADATA_NONE, METADATA_PHONETYPE, METADATA_NONE, METADATA_PHONETYPE, METADATA_NONE, METADATA_NONE }; #ifdef USE_TAGS const gchar *imagesupplier[] = { "/plus:ImageSupplierName", "/plus:ImageSupplierID" }; const gint n_imagesupplier = G_N_ELEMENTS (imagesupplier); #endif const gchar *imagecreator[] = { "/plus:ImageCreatorName", "/plus:ImageCreatorID" }; const gint n_imagecreator = G_N_ELEMENTS (imagecreator); const gchar *copyrightowner[] = { "/plus:CopyrightOwnerName", "/plus:CopyrightOwnerID" }; const gint n_copyrightowner = G_N_ELEMENTS (copyrightowner); const gchar *registryid[] = { "/Iptc4xmpExt:RegOrgId", "/Iptc4xmpExt:RegItemId" }; const gint n_registryid = G_N_ELEMENTS (registryid); const gchar *registryid_alternative[] = { "/iptcExt:RegOrgId", "/iptcExt:RegItemId" }; const gchar *artworkorobject[] = { "/Iptc4xmpExt:AOTitle", "/Iptc4xmpExt:AODateCreated", "/Iptc4xmpExt:AOCreator", "/Iptc4xmpExt:AOSource", "/Iptc4xmpExt:AOSourceInvNo", "/Iptc4xmpExt:AOCopyrightNotice", }; const gint n_artworkorobject = G_N_ELEMENTS (artworkorobject); const gchar *artworkorobject_alternative[] = { "/iptcExt:AOTitle", "/iptcExt:AODateCreated", "/iptcExt:AOCreator", "/iptcExt:AOSource", "/iptcExt:AOSourceInvNo", "/iptcExt:AOCopyrightNotice", }; const gchar *locationshown[] = { "/Iptc4xmpExt:Sublocation", "/Iptc4xmpExt:City", "/Iptc4xmpExt:ProvinceState", "/Iptc4xmpExt:CountryName", "/Iptc4xmpExt:CountryCode", "/Iptc4xmpExt:WorldRegion" }; const gint n_locationshown = G_N_ELEMENTS (locationshown); const gchar *locationshown_alternative[] = { "/iptcExt:Sublocation", "/iptcExt:City", "/iptcExt:ProvinceState", "/iptcExt:CountryName", "/iptcExt:CountryCode", "/iptcExt:WorldRegion" }; #ifdef USE_TAGS const gchar *locationcreated[] = { "/Iptc4xmpExt:Sublocation", "/Iptc4xmpExt:City", "/Iptc4xmpExt:ProvinceState", "/Iptc4xmpExt:CountryName", "/Iptc4xmpExt:CountryCode", "/Iptc4xmpExt:WorldRegion" }; const gint n_locationcreated = G_N_ELEMENTS (locationcreated); #endif gchar * metadata_format_gps_longitude_latitude (const gdouble value) { gint deg, min; gdouble sec; gdouble gps_value = value; if (gps_value < 0.f) gps_value *= -1.f; deg = (gint) gps_value; min = (gint) ((gps_value - (gdouble) deg) * 60.f); sec = ((gps_value - (gdouble) deg - (gdouble) (min / 60.f)) * 60.f * 60.f); return g_strdup_printf ("%ddeg %d' %.3f\"", deg, min, sec); } /* * use_meter: True return meters, False return feet * measurement_symbol: Should be "m", "ft", or empty string (not NULL) */ gchar * metadata_format_gps_altitude (const gdouble value, gboolean use_meter, gchar *measurement_symbol) { gdouble gps_value = value; if (gps_value < 0.f) gps_value *= -1.f; if (! use_meter) { gps_value *= 3.28; } return g_strdup_printf ("%.2f%s", gps_value, measurement_symbol); }