exiftool_vendored 9.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (864) hide show
  1. checksums.yaml +15 -0
  2. data/bin/Image-ExifTool-9.33/Changes +6241 -0
  3. data/bin/Image-ExifTool-9.33/MANIFEST +859 -0
  4. data/bin/Image-ExifTool-9.33/META.yml +27 -0
  5. data/bin/Image-ExifTool-9.33/Makefile.PL +41 -0
  6. data/bin/Image-ExifTool-9.33/README +227 -0
  7. data/bin/Image-ExifTool-9.33/arg_files/exif2iptc.args +24 -0
  8. data/bin/Image-ExifTool-9.33/arg_files/exif2xmp.args +38 -0
  9. data/bin/Image-ExifTool-9.33/arg_files/gps2xmp.args +20 -0
  10. data/bin/Image-ExifTool-9.33/arg_files/iptc2exif.args +17 -0
  11. data/bin/Image-ExifTool-9.33/arg_files/iptc2xmp.args +53 -0
  12. data/bin/Image-ExifTool-9.33/arg_files/iptcCore.args +172 -0
  13. data/bin/Image-ExifTool-9.33/arg_files/pdf2xmp.args +23 -0
  14. data/bin/Image-ExifTool-9.33/arg_files/xmp2exif.args +39 -0
  15. data/bin/Image-ExifTool-9.33/arg_files/xmp2gps.args +24 -0
  16. data/bin/Image-ExifTool-9.33/arg_files/xmp2iptc.args +62 -0
  17. data/bin/Image-ExifTool-9.33/arg_files/xmp2pdf.args +23 -0
  18. data/bin/Image-ExifTool-9.33/config_files/ExifTool_config +299 -0
  19. data/bin/Image-ExifTool-9.33/config_files/convert_regions.config +81 -0
  20. data/bin/Image-ExifTool-9.33/exiftool +5715 -0
  21. data/bin/Image-ExifTool-9.33/fmt_files/gpx.fmt +29 -0
  22. data/bin/Image-ExifTool-9.33/fmt_files/gpx_wpt.fmt +33 -0
  23. data/bin/Image-ExifTool-9.33/fmt_files/kml.fmt +53 -0
  24. data/bin/Image-ExifTool-9.33/html/ExifTool.html +1959 -0
  25. data/bin/Image-ExifTool-9.33/html/MIE1.1-20070121.pdf +0 -0
  26. data/bin/Image-ExifTool-9.33/html/Shift.html +173 -0
  27. data/bin/Image-ExifTool-9.33/html/TagNames/AFCP.html +53 -0
  28. data/bin/Image-ExifTool-9.33/html/TagNames/AIFF.html +146 -0
  29. data/bin/Image-ExifTool-9.33/html/TagNames/APE.html +149 -0
  30. data/bin/Image-ExifTool-9.33/html/TagNames/APP12.html +188 -0
  31. data/bin/Image-ExifTool-9.33/html/TagNames/ASF.html +1066 -0
  32. data/bin/Image-ExifTool-9.33/html/TagNames/BMP.html +110 -0
  33. data/bin/Image-ExifTool-9.33/html/TagNames/Canon.html +8062 -0
  34. data/bin/Image-ExifTool-9.33/html/TagNames/CanonCustom.html +2044 -0
  35. data/bin/Image-ExifTool-9.33/html/TagNames/CanonRaw.html +561 -0
  36. data/bin/Image-ExifTool-9.33/html/TagNames/CanonVRD.html +1222 -0
  37. data/bin/Image-ExifTool-9.33/html/TagNames/Casio.html +1569 -0
  38. data/bin/Image-ExifTool-9.33/html/TagNames/Composite.html +665 -0
  39. data/bin/Image-ExifTool-9.33/html/TagNames/DICOM.html +15762 -0
  40. data/bin/Image-ExifTool-9.33/html/TagNames/DNG.html +273 -0
  41. data/bin/Image-ExifTool-9.33/html/TagNames/DV.html +75 -0
  42. data/bin/Image-ExifTool-9.33/html/TagNames/DarwinCore.html +1445 -0
  43. data/bin/Image-ExifTool-9.33/html/TagNames/DjVu.html +313 -0
  44. data/bin/Image-ExifTool-9.33/html/TagNames/EXE.html +697 -0
  45. data/bin/Image-ExifTool-9.33/html/TagNames/EXIF.html +3244 -0
  46. data/bin/Image-ExifTool-9.33/html/TagNames/Extra.html +301 -0
  47. data/bin/Image-ExifTool-9.33/html/TagNames/FLAC.html +183 -0
  48. data/bin/Image-ExifTool-9.33/html/TagNames/FLIR.html +931 -0
  49. data/bin/Image-ExifTool-9.33/html/TagNames/Flash.html +419 -0
  50. data/bin/Image-ExifTool-9.33/html/TagNames/FlashPix.html +1435 -0
  51. data/bin/Image-ExifTool-9.33/html/TagNames/Font.html +485 -0
  52. data/bin/Image-ExifTool-9.33/html/TagNames/FotoStation.html +103 -0
  53. data/bin/Image-ExifTool-9.33/html/TagNames/FujiFilm.html +637 -0
  54. data/bin/Image-ExifTool-9.33/html/TagNames/GE.html +40 -0
  55. data/bin/Image-ExifTool-9.33/html/TagNames/GIF.html +116 -0
  56. data/bin/Image-ExifTool-9.33/html/TagNames/GIMP.html +140 -0
  57. data/bin/Image-ExifTool-9.33/html/TagNames/GPS.html +222 -0
  58. data/bin/Image-ExifTool-9.33/html/TagNames/GeoTiff.html +2177 -0
  59. data/bin/Image-ExifTool-9.33/html/TagNames/H264.html +393 -0
  60. data/bin/Image-ExifTool-9.33/html/TagNames/HP.html +155 -0
  61. data/bin/Image-ExifTool-9.33/html/TagNames/HTML.html +666 -0
  62. data/bin/Image-ExifTool-9.33/html/TagNames/ICC_Profile.html +710 -0
  63. data/bin/Image-ExifTool-9.33/html/TagNames/ID3.html +1473 -0
  64. data/bin/Image-ExifTool-9.33/html/TagNames/IPTC.html +895 -0
  65. data/bin/Image-ExifTool-9.33/html/TagNames/ITC.html +90 -0
  66. data/bin/Image-ExifTool-9.33/html/TagNames/JFIF.html +61 -0
  67. data/bin/Image-ExifTool-9.33/html/TagNames/JPEG.html +523 -0
  68. data/bin/Image-ExifTool-9.33/html/TagNames/JVC.html +56 -0
  69. data/bin/Image-ExifTool-9.33/html/TagNames/Jpeg2000.html +464 -0
  70. data/bin/Image-ExifTool-9.33/html/TagNames/Kodak.html +1759 -0
  71. data/bin/Image-ExifTool-9.33/html/TagNames/KyoceraRaw.html +92 -0
  72. data/bin/Image-ExifTool-9.33/html/TagNames/LNK.html +478 -0
  73. data/bin/Image-ExifTool-9.33/html/TagNames/Leaf.html +870 -0
  74. data/bin/Image-ExifTool-9.33/html/TagNames/M2TS.html +133 -0
  75. data/bin/Image-ExifTool-9.33/html/TagNames/MIE.html +1026 -0
  76. data/bin/Image-ExifTool-9.33/html/TagNames/MIFF.html +196 -0
  77. data/bin/Image-ExifTool-9.33/html/TagNames/MNG.html +847 -0
  78. data/bin/Image-ExifTool-9.33/html/TagNames/MPC.html +97 -0
  79. data/bin/Image-ExifTool-9.33/html/TagNames/MPEG.html +249 -0
  80. data/bin/Image-ExifTool-9.33/html/TagNames/MPF.html +199 -0
  81. data/bin/Image-ExifTool-9.33/html/TagNames/MWG.html +563 -0
  82. data/bin/Image-ExifTool-9.33/html/TagNames/MXF.html +6673 -0
  83. data/bin/Image-ExifTool-9.33/html/TagNames/Matroska.html +1069 -0
  84. data/bin/Image-ExifTool-9.33/html/TagNames/Microsoft.html +2066 -0
  85. data/bin/Image-ExifTool-9.33/html/TagNames/Minolta.html +2555 -0
  86. data/bin/Image-ExifTool-9.33/html/TagNames/MinoltaRaw.html +326 -0
  87. data/bin/Image-ExifTool-9.33/html/TagNames/Nikon.html +4467 -0
  88. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCapture.html +776 -0
  89. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCustom.html +3835 -0
  90. data/bin/Image-ExifTool-9.33/html/TagNames/OOXML.html +280 -0
  91. data/bin/Image-ExifTool-9.33/html/TagNames/Ogg.html +44 -0
  92. data/bin/Image-ExifTool-9.33/html/TagNames/Olympus.html +3386 -0
  93. data/bin/Image-ExifTool-9.33/html/TagNames/OpenEXR.html +222 -0
  94. data/bin/Image-ExifTool-9.33/html/TagNames/PDF.html +745 -0
  95. data/bin/Image-ExifTool-9.33/html/TagNames/PGF.html +80 -0
  96. data/bin/Image-ExifTool-9.33/html/TagNames/PICT.html +753 -0
  97. data/bin/Image-ExifTool-9.33/html/TagNames/PLIST.html +86 -0
  98. data/bin/Image-ExifTool-9.33/html/TagNames/PNG.html +515 -0
  99. data/bin/Image-ExifTool-9.33/html/TagNames/PSP.html +160 -0
  100. data/bin/Image-ExifTool-9.33/html/TagNames/Panasonic.html +1452 -0
  101. data/bin/Image-ExifTool-9.33/html/TagNames/PanasonicRaw.html +214 -0
  102. data/bin/Image-ExifTool-9.33/html/TagNames/Pentax.html +4332 -0
  103. data/bin/Image-ExifTool-9.33/html/TagNames/PhaseOne.html +258 -0
  104. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoCD.html +402 -0
  105. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoMechanic.html +196 -0
  106. data/bin/Image-ExifTool-9.33/html/TagNames/Photoshop.html +555 -0
  107. data/bin/Image-ExifTool-9.33/html/TagNames/PostScript.html +125 -0
  108. data/bin/Image-ExifTool-9.33/html/TagNames/PrintIM.html +31 -0
  109. data/bin/Image-ExifTool-9.33/html/TagNames/Qualcomm.html +4778 -0
  110. data/bin/Image-ExifTool-9.33/html/TagNames/QuickTime.html +3104 -0
  111. data/bin/Image-ExifTool-9.33/html/TagNames/RIFF.html +1164 -0
  112. data/bin/Image-ExifTool-9.33/html/TagNames/RSRC.html +74 -0
  113. data/bin/Image-ExifTool-9.33/html/TagNames/RTF.html +150 -0
  114. data/bin/Image-ExifTool-9.33/html/TagNames/Radiance.html +87 -0
  115. data/bin/Image-ExifTool-9.33/html/TagNames/Rawzor.html +45 -0
  116. data/bin/Image-ExifTool-9.33/html/TagNames/Real.html +780 -0
  117. data/bin/Image-ExifTool-9.33/html/TagNames/Reconyx.html +132 -0
  118. data/bin/Image-ExifTool-9.33/html/TagNames/Ricoh.html +456 -0
  119. data/bin/Image-ExifTool-9.33/html/TagNames/Samsung.html +419 -0
  120. data/bin/Image-ExifTool-9.33/html/TagNames/Sanyo.html +366 -0
  121. data/bin/Image-ExifTool-9.33/html/TagNames/Shortcuts.html +237 -0
  122. data/bin/Image-ExifTool-9.33/html/TagNames/Sigma.html +372 -0
  123. data/bin/Image-ExifTool-9.33/html/TagNames/SigmaRaw.html +403 -0
  124. data/bin/Image-ExifTool-9.33/html/TagNames/Sony.html +4279 -0
  125. data/bin/Image-ExifTool-9.33/html/TagNames/SonyIDC.html +267 -0
  126. data/bin/Image-ExifTool-9.33/html/TagNames/Stim.html +200 -0
  127. data/bin/Image-ExifTool-9.33/html/TagNames/Theora.html +102 -0
  128. data/bin/Image-ExifTool-9.33/html/TagNames/Unknown.html +31 -0
  129. data/bin/Image-ExifTool-9.33/html/TagNames/Vorbis.html +228 -0
  130. data/bin/Image-ExifTool-9.33/html/TagNames/XMP.html +7234 -0
  131. data/bin/Image-ExifTool-9.33/html/TagNames/ZIP.html +204 -0
  132. data/bin/Image-ExifTool-9.33/html/TagNames/iWork.html +49 -0
  133. data/bin/Image-ExifTool-9.33/html/TagNames/index.html +192 -0
  134. data/bin/Image-ExifTool-9.33/html/TagNames/style.css +31 -0
  135. data/bin/Image-ExifTool-9.33/html/ancient_history.html +6727 -0
  136. data/bin/Image-ExifTool-9.33/html/canon_raw.html +366 -0
  137. data/bin/Image-ExifTool-9.33/html/commentary.html +319 -0
  138. data/bin/Image-ExifTool-9.33/html/config.html +312 -0
  139. data/bin/Image-ExifTool-9.33/html/data_members.html +265 -0
  140. data/bin/Image-ExifTool-9.33/html/exiftool_pod.html +2338 -0
  141. data/bin/Image-ExifTool-9.33/html/faq.html +1434 -0
  142. data/bin/Image-ExifTool-9.33/html/filename.html +281 -0
  143. data/bin/Image-ExifTool-9.33/html/geotag.html +642 -0
  144. data/bin/Image-ExifTool-9.33/html/history.html +358 -0
  145. data/bin/Image-ExifTool-9.33/html/htmldump.html +732 -0
  146. data/bin/Image-ExifTool-9.33/html/idiosyncracies.html +251 -0
  147. data/bin/Image-ExifTool-9.33/html/index.html +1271 -0
  148. data/bin/Image-ExifTool-9.33/html/install.html +239 -0
  149. data/bin/Image-ExifTool-9.33/html/metafiles.html +266 -0
  150. data/bin/Image-ExifTool-9.33/html/overview.png +0 -0
  151. data/bin/Image-ExifTool-9.33/html/standards.html +277 -0
  152. data/bin/Image-ExifTool-9.33/html/struct.html +342 -0
  153. data/bin/Image-ExifTool-9.33/html/style.css +31 -0
  154. data/bin/Image-ExifTool-9.33/html/under.html +124 -0
  155. data/bin/Image-ExifTool-9.33/html/verbose.html +195 -0
  156. data/bin/Image-ExifTool-9.33/html/writing.html +239 -0
  157. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pm +378 -0
  158. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pod +231 -0
  159. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pm +6815 -0
  160. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pod +2385 -0
  161. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AES.pm +501 -0
  162. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AFCP.pm +284 -0
  163. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AIFF.pm +271 -0
  164. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APE.pm +262 -0
  165. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APP12.pm +322 -0
  166. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ASF.pm +884 -0
  167. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BMP.pm +179 -0
  168. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BZZ.pm +472 -0
  169. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BigTIFF.pm +282 -0
  170. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BuildTagLookup.pm +2400 -0
  171. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Canon.pm +7794 -0
  172. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonCustom.pm +2523 -0
  173. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonRaw.pm +931 -0
  174. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonVRD.pm +1481 -0
  175. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CaptureOne.pm +235 -0
  176. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Casio.pm +2013 -0
  177. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset.pm +396 -0
  178. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Arabic.pm +39 -0
  179. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Baltic.pm +35 -0
  180. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Cyrillic.pm +45 -0
  181. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Greek.pm +40 -0
  182. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Hebrew.pm +36 -0
  183. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/JIS.pm +1735 -0
  184. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin.pm +24 -0
  185. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin2.pm +36 -0
  186. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacArabic.pm +47 -0
  187. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseCN.pm +2088 -0
  188. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseTW.pm +3623 -0
  189. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCroatian.pm +43 -0
  190. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCyrillic.pm +47 -0
  191. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacGreek.pm +45 -0
  192. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacHebrew.pm +47 -0
  193. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacIceland.pm +42 -0
  194. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacJapanese.pm +1933 -0
  195. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacKorean.pm +2720 -0
  196. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacLatin2.pm +44 -0
  197. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRSymbol.pm +2087 -0
  198. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRoman.pm +42 -0
  199. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRomanian.pm +42 -0
  200. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacThai.pm +49 -0
  201. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacTurkish.pm +42 -0
  202. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/PDFDoc.pm +28 -0
  203. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/ShiftJIS.pm +1835 -0
  204. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Symbol.pm +54 -0
  205. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Thai.pm +41 -0
  206. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Turkish.pm +25 -0
  207. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Vietnam.pm +27 -0
  208. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DICOM.pm +3835 -0
  209. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DNG.pm +835 -0
  210. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DV.pm +319 -0
  211. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DarwinCore.pm +317 -0
  212. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DjVu.pm +376 -0
  213. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/EXE.pm +1228 -0
  214. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Exif.pm +4542 -0
  215. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLAC.pm +296 -0
  216. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLIR.pm +972 -0
  217. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Fixup.pm +354 -0
  218. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Flash.pm +755 -0
  219. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FlashPix.pm +1882 -0
  220. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Font.pm +643 -0
  221. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FotoStation.pm +258 -0
  222. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FujiFilm.pm +1020 -0
  223. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GE.pm +80 -0
  224. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIF.pm +542 -0
  225. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIMP.pm +258 -0
  226. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GPS.pm +511 -0
  227. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GeoTiff.pm +2187 -0
  228. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Geotag.pm +1173 -0
  229. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/H264.pm +1102 -0
  230. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HP.pm +262 -0
  231. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HTML.pm +576 -0
  232. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HtmlDump.pm +895 -0
  233. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ICC_Profile.pm +999 -0
  234. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ID3.pm +1532 -0
  235. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/IPTC.pm +1244 -0
  236. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ITC.pm +215 -0
  237. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Import.pm +308 -0
  238. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/InDesign.pm +277 -0
  239. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEG.pm +588 -0
  240. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEGDigest.pm +2511 -0
  241. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JVC.pm +130 -0
  242. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Jpeg2000.pm +881 -0
  243. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Kodak.pm +2014 -0
  244. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
  245. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/LNK.pm +723 -0
  246. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/cs.pm +1586 -0
  247. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/de.pm +7356 -0
  248. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_ca.pm +557 -0
  249. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_gb.pm +572 -0
  250. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/es.pm +4016 -0
  251. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fi.pm +2856 -0
  252. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fr.pm +4720 -0
  253. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/it.pm +7917 -0
  254. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ja.pm +5815 -0
  255. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ko.pm +2332 -0
  256. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/nl.pm +3220 -0
  257. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/pl.pm +1140 -0
  258. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ru.pm +769 -0
  259. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/sv.pm +639 -0
  260. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/tr.pm +544 -0
  261. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_cn.pm +1329 -0
  262. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_tw.pm +802 -0
  263. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Leaf.pm +515 -0
  264. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/M2TS.pm +729 -0
  265. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIE.pm +2561 -0
  266. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIEUnits.pod +377 -0
  267. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIFF.pm +279 -0
  268. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MNG.pm +684 -0
  269. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPC.pm +156 -0
  270. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPEG.pm +736 -0
  271. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPF.pm +289 -0
  272. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MWG.pm +736 -0
  273. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MXF.pm +3032 -0
  274. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MakerNotes.pm +1573 -0
  275. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Matroska.pm +891 -0
  276. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Microsoft.pm +879 -0
  277. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Minolta.pm +2833 -0
  278. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
  279. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Nikon.pm +6116 -0
  280. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCapture.pm +911 -0
  281. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCustom.pm +4405 -0
  282. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OOXML.pm +409 -0
  283. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ogg.pm +237 -0
  284. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Olympus.pm +3582 -0
  285. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OpenEXR.pm +324 -0
  286. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PDF.pm +2327 -0
  287. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PGF.pm +143 -0
  288. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PICT.pm +1260 -0
  289. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PLIST.pm +449 -0
  290. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PNG.pm +1100 -0
  291. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PPM.pm +169 -0
  292. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PSP.pm +305 -0
  293. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Panasonic.pm +1995 -0
  294. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PanasonicRaw.pm +535 -0
  295. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Pentax.pm +5489 -0
  296. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhaseOne.pm +557 -0
  297. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoCD.pm +507 -0
  298. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
  299. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Photoshop.pm +629 -0
  300. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PostScript.pm +693 -0
  301. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PrintIM.pm +125 -0
  302. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Qualcomm.pm +1344 -0
  303. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/QuickTime.pm +3519 -0
  304. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/README +944 -0
  305. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RIFF.pm +1322 -0
  306. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RSRC.pm +241 -0
  307. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RTF.pm +383 -0
  308. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Radiance.pm +144 -0
  309. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Rawzor.pm +190 -0
  310. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Real.pm +736 -0
  311. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Reconyx.pm +190 -0
  312. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ricoh.pm +741 -0
  313. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Samsung.pm +820 -0
  314. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sanyo.pm +439 -0
  315. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shift.pl +594 -0
  316. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shortcuts.pm +291 -0
  317. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sigma.pm +574 -0
  318. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SigmaRaw.pm +649 -0
  319. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sony.pm +5722 -0
  320. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SonyIDC.pm +330 -0
  321. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Stim.pm +196 -0
  322. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagInfoXML.pm +792 -0
  323. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagLookup.pm +8005 -0
  324. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagNames.pod +25950 -0
  325. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Theora.pm +145 -0
  326. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Unknown.pm +66 -0
  327. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Vorbis.pm +237 -0
  328. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
  329. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteExif.pl +3674 -0
  330. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteIPTC.pl +702 -0
  331. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePDF.pl +759 -0
  332. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePNG.pl +330 -0
  333. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
  334. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePostScript.pl +777 -0
  335. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteXMP.pl +1318 -0
  336. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Writer.pl +5779 -0
  337. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP.pm +3634 -0
  338. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP2.pl +1298 -0
  339. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMPStruct.pl +813 -0
  340. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ZIP.pm +623 -0
  341. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/iWork.pm +223 -0
  342. data/bin/Image-ExifTool-9.33/perl-Image-ExifTool.spec +104 -0
  343. data/bin/Image-ExifTool-9.33/t/AFCP.t +44 -0
  344. data/bin/Image-ExifTool-9.33/t/AFCP_2.out +37 -0
  345. data/bin/Image-ExifTool-9.33/t/AFCP_3.out +20 -0
  346. data/bin/Image-ExifTool-9.33/t/AIFF.t +28 -0
  347. data/bin/Image-ExifTool-9.33/t/AIFF_2.out +31 -0
  348. data/bin/Image-ExifTool-9.33/t/APE.t +38 -0
  349. data/bin/Image-ExifTool-9.33/t/APE_2.out +28 -0
  350. data/bin/Image-ExifTool-9.33/t/APE_3.out +57 -0
  351. data/bin/Image-ExifTool-9.33/t/ASF.t +28 -0
  352. data/bin/Image-ExifTool-9.33/t/ASF_2.out +54 -0
  353. data/bin/Image-ExifTool-9.33/t/BMP.t +28 -0
  354. data/bin/Image-ExifTool-9.33/t/BMP_2.out +21 -0
  355. data/bin/Image-ExifTool-9.33/t/BigTIFF.t +28 -0
  356. data/bin/Image-ExifTool-9.33/t/BigTIFF_2.out +19 -0
  357. data/bin/Image-ExifTool-9.33/t/Canon.t +41 -0
  358. data/bin/Image-ExifTool-9.33/t/CanonRaw.t +126 -0
  359. data/bin/Image-ExifTool-9.33/t/CanonRaw_2.out +165 -0
  360. data/bin/Image-ExifTool-9.33/t/CanonRaw_4.out +217 -0
  361. data/bin/Image-ExifTool-9.33/t/CanonRaw_5.out +207 -0
  362. data/bin/Image-ExifTool-9.33/t/CanonRaw_6.out +231 -0
  363. data/bin/Image-ExifTool-9.33/t/CanonRaw_7.out +247 -0
  364. data/bin/Image-ExifTool-9.33/t/CanonVRD.t +129 -0
  365. data/bin/Image-ExifTool-9.33/t/CanonVRD_11.out +118 -0
  366. data/bin/Image-ExifTool-9.33/t/CanonVRD_12.out +12 -0
  367. data/bin/Image-ExifTool-9.33/t/CanonVRD_2.out +116 -0
  368. data/bin/Image-ExifTool-9.33/t/CanonVRD_3.out +116 -0
  369. data/bin/Image-ExifTool-9.33/t/CanonVRD_4.out +2 -0
  370. data/bin/Image-ExifTool-9.33/t/CanonVRD_5.out +3 -0
  371. data/bin/Image-ExifTool-9.33/t/CanonVRD_6.out +3 -0
  372. data/bin/Image-ExifTool-9.33/t/CanonVRD_7.out +2 -0
  373. data/bin/Image-ExifTool-9.33/t/CanonVRD_8.out +2 -0
  374. data/bin/Image-ExifTool-9.33/t/CanonVRD_9.out +1 -0
  375. data/bin/Image-ExifTool-9.33/t/Canon_2.out +350 -0
  376. data/bin/Image-ExifTool-9.33/t/Canon_3.out +3 -0
  377. data/bin/Image-ExifTool-9.33/t/Casio.t +54 -0
  378. data/bin/Image-ExifTool-9.33/t/Casio_2.out +70 -0
  379. data/bin/Image-ExifTool-9.33/t/Casio_3.out +100 -0
  380. data/bin/Image-ExifTool-9.33/t/Casio_4.out +26 -0
  381. data/bin/Image-ExifTool-9.33/t/Casio_5.out +78 -0
  382. data/bin/Image-ExifTool-9.33/t/Casio_6.out +115 -0
  383. data/bin/Image-ExifTool-9.33/t/DICOM.t +28 -0
  384. data/bin/Image-ExifTool-9.33/t/DICOM_2.out +108 -0
  385. data/bin/Image-ExifTool-9.33/t/DNG.t +39 -0
  386. data/bin/Image-ExifTool-9.33/t/DNG_2.out +326 -0
  387. data/bin/Image-ExifTool-9.33/t/DNG_3.out +4 -0
  388. data/bin/Image-ExifTool-9.33/t/DV.t +27 -0
  389. data/bin/Image-ExifTool-9.33/t/DV_2.out +24 -0
  390. data/bin/Image-ExifTool-9.33/t/DjVu.t +28 -0
  391. data/bin/Image-ExifTool-9.33/t/DjVu_2.out +44 -0
  392. data/bin/Image-ExifTool-9.33/t/EXE.t +31 -0
  393. data/bin/Image-ExifTool-9.33/t/EXE_2.out +40 -0
  394. data/bin/Image-ExifTool-9.33/t/EXE_3.out +15 -0
  395. data/bin/Image-ExifTool-9.33/t/EXE_4.out +14 -0
  396. data/bin/Image-ExifTool-9.33/t/ExifTool.t +284 -0
  397. data/bin/Image-ExifTool-9.33/t/ExifTool_16.out +180 -0
  398. data/bin/Image-ExifTool-9.33/t/ExifTool_17.out +594 -0
  399. data/bin/Image-ExifTool-9.33/t/ExifTool_2.out +399 -0
  400. data/bin/Image-ExifTool-9.33/t/ExifTool_20.out +1 -0
  401. data/bin/Image-ExifTool-9.33/t/ExifTool_21.out +1 -0
  402. data/bin/Image-ExifTool-9.33/t/ExifTool_22.out +1 -0
  403. data/bin/Image-ExifTool-9.33/t/ExifTool_23.out +6 -0
  404. data/bin/Image-ExifTool-9.33/t/ExifTool_24.out +3 -0
  405. data/bin/Image-ExifTool-9.33/t/ExifTool_25.out +13 -0
  406. data/bin/Image-ExifTool-9.33/t/ExifTool_26.out +12 -0
  407. data/bin/Image-ExifTool-9.33/t/ExifTool_3.out +87 -0
  408. data/bin/Image-ExifTool-9.33/t/ExifTool_4.out +41 -0
  409. data/bin/Image-ExifTool-9.33/t/ExifTool_5.out +6 -0
  410. data/bin/Image-ExifTool-9.33/t/ExifTool_6.out +68 -0
  411. data/bin/Image-ExifTool-9.33/t/ExifTool_7.out +125 -0
  412. data/bin/Image-ExifTool-9.33/t/ExifTool_8.out +125 -0
  413. data/bin/Image-ExifTool-9.33/t/ExifTool_9.out +33 -0
  414. data/bin/Image-ExifTool-9.33/t/FLAC.t +37 -0
  415. data/bin/Image-ExifTool-9.33/t/FLAC_2.out +25 -0
  416. data/bin/Image-ExifTool-9.33/t/FLAC_3.out +19 -0
  417. data/bin/Image-ExifTool-9.33/t/FLIR.t +30 -0
  418. data/bin/Image-ExifTool-9.33/t/FLIR_2.out +104 -0
  419. data/bin/Image-ExifTool-9.33/t/FLIR_3.out +47 -0
  420. data/bin/Image-ExifTool-9.33/t/Flash.t +37 -0
  421. data/bin/Image-ExifTool-9.33/t/FlashPix.t +30 -0
  422. data/bin/Image-ExifTool-9.33/t/FlashPix_2.out +48 -0
  423. data/bin/Image-ExifTool-9.33/t/Flash_2.out +20 -0
  424. data/bin/Image-ExifTool-9.33/t/Flash_3.out +53 -0
  425. data/bin/Image-ExifTool-9.33/t/Font.t +30 -0
  426. data/bin/Image-ExifTool-9.33/t/Font_2.out +23 -0
  427. data/bin/Image-ExifTool-9.33/t/Font_3.out +35 -0
  428. data/bin/Image-ExifTool-9.33/t/Font_4.out +26 -0
  429. data/bin/Image-ExifTool-9.33/t/Font_5.out +26 -0
  430. data/bin/Image-ExifTool-9.33/t/Font_6.out +36 -0
  431. data/bin/Image-ExifTool-9.33/t/Font_7.out +36 -0
  432. data/bin/Image-ExifTool-9.33/t/FotoStation.t +38 -0
  433. data/bin/Image-ExifTool-9.33/t/FotoStation_2.out +39 -0
  434. data/bin/Image-ExifTool-9.33/t/FotoStation_3.out +3 -0
  435. data/bin/Image-ExifTool-9.33/t/FujiFilm.t +78 -0
  436. data/bin/Image-ExifTool-9.33/t/FujiFilm_2.out +87 -0
  437. data/bin/Image-ExifTool-9.33/t/FujiFilm_3.out +88 -0
  438. data/bin/Image-ExifTool-9.33/t/FujiFilm_4.out +117 -0
  439. data/bin/Image-ExifTool-9.33/t/FujiFilm_5.out +1 -0
  440. data/bin/Image-ExifTool-9.33/t/GE.t +46 -0
  441. data/bin/Image-ExifTool-9.33/t/GE_2.out +84 -0
  442. data/bin/Image-ExifTool-9.33/t/GE_3.out +84 -0
  443. data/bin/Image-ExifTool-9.33/t/GIF.t +83 -0
  444. data/bin/Image-ExifTool-9.33/t/GIF_2.out +40 -0
  445. data/bin/Image-ExifTool-9.33/t/GIF_3.out +41 -0
  446. data/bin/Image-ExifTool-9.33/t/GIF_4.out +16 -0
  447. data/bin/Image-ExifTool-9.33/t/GIMP.t +27 -0
  448. data/bin/Image-ExifTool-9.33/t/GIMP_2.out +63 -0
  449. data/bin/Image-ExifTool-9.33/t/GPS.t +42 -0
  450. data/bin/Image-ExifTool-9.33/t/GPS_2.out +94 -0
  451. data/bin/Image-ExifTool-9.33/t/GPS_3.out +96 -0
  452. data/bin/Image-ExifTool-9.33/t/GeoTiff.t +36 -0
  453. data/bin/Image-ExifTool-9.33/t/GeoTiff_2.out +36 -0
  454. data/bin/Image-ExifTool-9.33/t/GeoTiff_3.out +36 -0
  455. data/bin/Image-ExifTool-9.33/t/Geotag.t +164 -0
  456. data/bin/Image-ExifTool-9.33/t/Geotag_2.out +9 -0
  457. data/bin/Image-ExifTool-9.33/t/Geotag_3.out +6 -0
  458. data/bin/Image-ExifTool-9.33/t/Geotag_5.out +1 -0
  459. data/bin/Image-ExifTool-9.33/t/Geotag_6.out +9 -0
  460. data/bin/Image-ExifTool-9.33/t/Geotag_7.out +53 -0
  461. data/bin/Image-ExifTool-9.33/t/Geotag_8.out +15 -0
  462. data/bin/Image-ExifTool-9.33/t/HTML.t +28 -0
  463. data/bin/Image-ExifTool-9.33/t/HTML_2.out +68 -0
  464. data/bin/Image-ExifTool-9.33/t/IPTC.t +157 -0
  465. data/bin/Image-ExifTool-9.33/t/IPTC_2.out +58 -0
  466. data/bin/Image-ExifTool-9.33/t/IPTC_4.out +56 -0
  467. data/bin/Image-ExifTool-9.33/t/IPTC_5.out +1 -0
  468. data/bin/Image-ExifTool-9.33/t/IPTC_6.out +2 -0
  469. data/bin/Image-ExifTool-9.33/t/IPTC_7.out +1 -0
  470. data/bin/Image-ExifTool-9.33/t/IPTC_8.out +20 -0
  471. data/bin/Image-ExifTool-9.33/t/ITC.t +28 -0
  472. data/bin/Image-ExifTool-9.33/t/ITC_2.out +19 -0
  473. data/bin/Image-ExifTool-9.33/t/InDesign.t +61 -0
  474. data/bin/Image-ExifTool-9.33/t/InDesign_2.out +19 -0
  475. data/bin/Image-ExifTool-9.33/t/InDesign_3.out +21 -0
  476. data/bin/Image-ExifTool-9.33/t/InDesign_4.out +11 -0
  477. data/bin/Image-ExifTool-9.33/t/JVC.t +36 -0
  478. data/bin/Image-ExifTool-9.33/t/JVC_2.out +3 -0
  479. data/bin/Image-ExifTool-9.33/t/JVC_3.out +3 -0
  480. data/bin/Image-ExifTool-9.33/t/Jpeg2000.t +49 -0
  481. data/bin/Image-ExifTool-9.33/t/Jpeg2000_2.out +63 -0
  482. data/bin/Image-ExifTool-9.33/t/Jpeg2000_3.out +51 -0
  483. data/bin/Image-ExifTool-9.33/t/Jpeg2000_4.out +15 -0
  484. data/bin/Image-ExifTool-9.33/t/Kodak.t +40 -0
  485. data/bin/Image-ExifTool-9.33/t/Kodak_2.out +109 -0
  486. data/bin/Image-ExifTool-9.33/t/Kodak_3.out +119 -0
  487. data/bin/Image-ExifTool-9.33/t/KyoceraRaw.t +28 -0
  488. data/bin/Image-ExifTool-9.33/t/KyoceraRaw_2.out +27 -0
  489. data/bin/Image-ExifTool-9.33/t/LNK.t +28 -0
  490. data/bin/Image-ExifTool-9.33/t/LNK_2.out +45 -0
  491. data/bin/Image-ExifTool-9.33/t/Lang.t +40 -0
  492. data/bin/Image-ExifTool-9.33/t/Lang_1.out +1 -0
  493. data/bin/Image-ExifTool-9.33/t/Lang_10.out +46 -0
  494. data/bin/Image-ExifTool-9.33/t/Lang_11.out +46 -0
  495. data/bin/Image-ExifTool-9.33/t/Lang_12.out +46 -0
  496. data/bin/Image-ExifTool-9.33/t/Lang_13.out +46 -0
  497. data/bin/Image-ExifTool-9.33/t/Lang_14.out +46 -0
  498. data/bin/Image-ExifTool-9.33/t/Lang_15.out +46 -0
  499. data/bin/Image-ExifTool-9.33/t/Lang_16.out +46 -0
  500. data/bin/Image-ExifTool-9.33/t/Lang_17.out +46 -0
  501. data/bin/Image-ExifTool-9.33/t/Lang_18.out +46 -0
  502. data/bin/Image-ExifTool-9.33/t/Lang_2.out +46 -0
  503. data/bin/Image-ExifTool-9.33/t/Lang_3.out +46 -0
  504. data/bin/Image-ExifTool-9.33/t/Lang_4.out +46 -0
  505. data/bin/Image-ExifTool-9.33/t/Lang_5.out +46 -0
  506. data/bin/Image-ExifTool-9.33/t/Lang_6.out +46 -0
  507. data/bin/Image-ExifTool-9.33/t/Lang_7.out +46 -0
  508. data/bin/Image-ExifTool-9.33/t/Lang_8.out +46 -0
  509. data/bin/Image-ExifTool-9.33/t/Lang_9.out +46 -0
  510. data/bin/Image-ExifTool-9.33/t/M2TS.t +29 -0
  511. data/bin/Image-ExifTool-9.33/t/M2TS_2.out +27 -0
  512. data/bin/Image-ExifTool-9.33/t/MIE.t +82 -0
  513. data/bin/Image-ExifTool-9.33/t/MIE_2.out +67 -0
  514. data/bin/Image-ExifTool-9.33/t/MIE_3.out +134 -0
  515. data/bin/Image-ExifTool-9.33/t/MIE_5.out +1 -0
  516. data/bin/Image-ExifTool-9.33/t/MIE_6.out +1 -0
  517. data/bin/Image-ExifTool-9.33/t/MIFF.t +28 -0
  518. data/bin/Image-ExifTool-9.33/t/MIFF_2.out +108 -0
  519. data/bin/Image-ExifTool-9.33/t/MP3.t +29 -0
  520. data/bin/Image-ExifTool-9.33/t/MP3_2.out +45 -0
  521. data/bin/Image-ExifTool-9.33/t/MWG.t +72 -0
  522. data/bin/Image-ExifTool-9.33/t/MWG_2.out +13 -0
  523. data/bin/Image-ExifTool-9.33/t/MWG_3.out +8 -0
  524. data/bin/Image-ExifTool-9.33/t/MWG_4.out +5 -0
  525. data/bin/Image-ExifTool-9.33/t/MWG_5.out +22 -0
  526. data/bin/Image-ExifTool-9.33/t/MXF.t +27 -0
  527. data/bin/Image-ExifTool-9.33/t/MXF_2.out +78 -0
  528. data/bin/Image-ExifTool-9.33/t/Matroska.t +29 -0
  529. data/bin/Image-ExifTool-9.33/t/Matroska_2.out +64 -0
  530. data/bin/Image-ExifTool-9.33/t/Minolta.t +50 -0
  531. data/bin/Image-ExifTool-9.33/t/Minolta_2.out +133 -0
  532. data/bin/Image-ExifTool-9.33/t/Minolta_3.out +146 -0
  533. data/bin/Image-ExifTool-9.33/t/Minolta_4.out +148 -0
  534. data/bin/Image-ExifTool-9.33/t/Nikon.t +114 -0
  535. data/bin/Image-ExifTool-9.33/t/Nikon_2.out +82 -0
  536. data/bin/Image-ExifTool-9.33/t/Nikon_3.out +98 -0
  537. data/bin/Image-ExifTool-9.33/t/Nikon_4.out +174 -0
  538. data/bin/Image-ExifTool-9.33/t/Nikon_5.out +167 -0
  539. data/bin/Image-ExifTool-9.33/t/Nikon_7.out +260 -0
  540. data/bin/Image-ExifTool-9.33/t/Nikon_8.out +4 -0
  541. data/bin/Image-ExifTool-9.33/t/Olympus.t +85 -0
  542. data/bin/Image-ExifTool-9.33/t/Olympus_2.out +79 -0
  543. data/bin/Image-ExifTool-9.33/t/Olympus_3.out +81 -0
  544. data/bin/Image-ExifTool-9.33/t/Olympus_4.out +192 -0
  545. data/bin/Image-ExifTool-9.33/t/Olympus_5.out +264 -0
  546. data/bin/Image-ExifTool-9.33/t/Olympus_6.out +151 -0
  547. data/bin/Image-ExifTool-9.33/t/Olympus_7.out +482 -0
  548. data/bin/Image-ExifTool-9.33/t/OpenEXR.t +28 -0
  549. data/bin/Image-ExifTool-9.33/t/OpenEXR_2.out +23 -0
  550. data/bin/Image-ExifTool-9.33/t/PDF.t +295 -0
  551. data/bin/Image-ExifTool-9.33/t/PDF_10.out +10 -0
  552. data/bin/Image-ExifTool-9.33/t/PDF_11.out +10 -0
  553. data/bin/Image-ExifTool-9.33/t/PDF_12.out +9 -0
  554. data/bin/Image-ExifTool-9.33/t/PDF_14.out +5 -0
  555. data/bin/Image-ExifTool-9.33/t/PDF_15.out +6 -0
  556. data/bin/Image-ExifTool-9.33/t/PDF_16.out +4 -0
  557. data/bin/Image-ExifTool-9.33/t/PDF_17.out +4 -0
  558. data/bin/Image-ExifTool-9.33/t/PDF_18.out +5 -0
  559. data/bin/Image-ExifTool-9.33/t/PDF_19.out +6 -0
  560. data/bin/Image-ExifTool-9.33/t/PDF_2.out +117 -0
  561. data/bin/Image-ExifTool-9.33/t/PDF_20.out +4 -0
  562. data/bin/Image-ExifTool-9.33/t/PDF_22.out +3 -0
  563. data/bin/Image-ExifTool-9.33/t/PDF_4.out +12 -0
  564. data/bin/Image-ExifTool-9.33/t/PDF_5.out +8 -0
  565. data/bin/Image-ExifTool-9.33/t/PDF_6.out +9 -0
  566. data/bin/Image-ExifTool-9.33/t/PDF_7.out +11 -0
  567. data/bin/Image-ExifTool-9.33/t/PDF_8.out +9 -0
  568. data/bin/Image-ExifTool-9.33/t/PDF_9.out +9 -0
  569. data/bin/Image-ExifTool-9.33/t/PGF.t +28 -0
  570. data/bin/Image-ExifTool-9.33/t/PGF_2.out +32 -0
  571. data/bin/Image-ExifTool-9.33/t/PICT.t +28 -0
  572. data/bin/Image-ExifTool-9.33/t/PICT_2.out +15 -0
  573. data/bin/Image-ExifTool-9.33/t/PLIST.t +31 -0
  574. data/bin/Image-ExifTool-9.33/t/PLIST_2.out +20 -0
  575. data/bin/Image-ExifTool-9.33/t/PLIST_3.out +20 -0
  576. data/bin/Image-ExifTool-9.33/t/PNG.t +75 -0
  577. data/bin/Image-ExifTool-9.33/t/PNG_2.out +22 -0
  578. data/bin/Image-ExifTool-9.33/t/PNG_3.out +118 -0
  579. data/bin/Image-ExifTool-9.33/t/PNG_4.out +12 -0
  580. data/bin/Image-ExifTool-9.33/t/PPM.t +40 -0
  581. data/bin/Image-ExifTool-9.33/t/PPM_2.out +15 -0
  582. data/bin/Image-ExifTool-9.33/t/PPM_3.out +9 -0
  583. data/bin/Image-ExifTool-9.33/t/PSP.t +28 -0
  584. data/bin/Image-ExifTool-9.33/t/PSP_2.out +32 -0
  585. data/bin/Image-ExifTool-9.33/t/Panasonic.t +60 -0
  586. data/bin/Image-ExifTool-9.33/t/Panasonic_2.out +99 -0
  587. data/bin/Image-ExifTool-9.33/t/Panasonic_3.out +119 -0
  588. data/bin/Image-ExifTool-9.33/t/Panasonic_4.out +177 -0
  589. data/bin/Image-ExifTool-9.33/t/Panasonic_5.out +228 -0
  590. data/bin/Image-ExifTool-9.33/t/Pentax.t +50 -0
  591. data/bin/Image-ExifTool-9.33/t/Pentax_2.out +219 -0
  592. data/bin/Image-ExifTool-9.33/t/Pentax_3.out +262 -0
  593. data/bin/Image-ExifTool-9.33/t/Pentax_4.out +123 -0
  594. data/bin/Image-ExifTool-9.33/t/PhotoCD.t +28 -0
  595. data/bin/Image-ExifTool-9.33/t/PhotoCD_2.out +35 -0
  596. data/bin/Image-ExifTool-9.33/t/PhotoMechanic.t +38 -0
  597. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_2.out +81 -0
  598. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_3.out +2 -0
  599. data/bin/Image-ExifTool-9.33/t/Photoshop.t +42 -0
  600. data/bin/Image-ExifTool-9.33/t/Photoshop_2.out +96 -0
  601. data/bin/Image-ExifTool-9.33/t/Photoshop_3.out +108 -0
  602. data/bin/Image-ExifTool-9.33/t/PostScript.t +49 -0
  603. data/bin/Image-ExifTool-9.33/t/PostScript_2.out +64 -0
  604. data/bin/Image-ExifTool-9.33/t/PostScript_3.out +132 -0
  605. data/bin/Image-ExifTool-9.33/t/QuickTime.t +31 -0
  606. data/bin/Image-ExifTool-9.33/t/QuickTime_2.out +128 -0
  607. data/bin/Image-ExifTool-9.33/t/QuickTime_3.out +69 -0
  608. data/bin/Image-ExifTool-9.33/t/RIFF.t +31 -0
  609. data/bin/Image-ExifTool-9.33/t/RIFF_2.out +24 -0
  610. data/bin/Image-ExifTool-9.33/t/RIFF_3.out +52 -0
  611. data/bin/Image-ExifTool-9.33/t/RIFF_4.out +16 -0
  612. data/bin/Image-ExifTool-9.33/t/RTF.t +27 -0
  613. data/bin/Image-ExifTool-9.33/t/RTF_2.out +20 -0
  614. data/bin/Image-ExifTool-9.33/t/Radiance.t +28 -0
  615. data/bin/Image-ExifTool-9.33/t/Radiance_2.out +22 -0
  616. data/bin/Image-ExifTool-9.33/t/Real.t +46 -0
  617. data/bin/Image-ExifTool-9.33/t/Real_2.out +68 -0
  618. data/bin/Image-ExifTool-9.33/t/Real_3.out +18 -0
  619. data/bin/Image-ExifTool-9.33/t/Real_4.out +11 -0
  620. data/bin/Image-ExifTool-9.33/t/Ricoh.t +47 -0
  621. data/bin/Image-ExifTool-9.33/t/Ricoh_2.out +70 -0
  622. data/bin/Image-ExifTool-9.33/t/Ricoh_3.out +98 -0
  623. data/bin/Image-ExifTool-9.33/t/Ricoh_4.out +112 -0
  624. data/bin/Image-ExifTool-9.33/t/Sanyo.t +39 -0
  625. data/bin/Image-ExifTool-9.33/t/Sanyo_2.out +101 -0
  626. data/bin/Image-ExifTool-9.33/t/Sanyo_3.out +111 -0
  627. data/bin/Image-ExifTool-9.33/t/Sigma.t +60 -0
  628. data/bin/Image-ExifTool-9.33/t/Sigma_2.out +91 -0
  629. data/bin/Image-ExifTool-9.33/t/Sigma_3.out +94 -0
  630. data/bin/Image-ExifTool-9.33/t/Sigma_4.out +63 -0
  631. data/bin/Image-ExifTool-9.33/t/Sigma_5.out +192 -0
  632. data/bin/Image-ExifTool-9.33/t/Sony.t +62 -0
  633. data/bin/Image-ExifTool-9.33/t/Sony_2.out +84 -0
  634. data/bin/Image-ExifTool-9.33/t/Sony_3.out +85 -0
  635. data/bin/Image-ExifTool-9.33/t/Sony_5.out +32 -0
  636. data/bin/Image-ExifTool-9.33/t/TestLib.pm +417 -0
  637. data/bin/Image-ExifTool-9.33/t/Unknown.t +36 -0
  638. data/bin/Image-ExifTool-9.33/t/Unknown_2.out +90 -0
  639. data/bin/Image-ExifTool-9.33/t/Unknown_3.out +90 -0
  640. data/bin/Image-ExifTool-9.33/t/Vorbis.t +28 -0
  641. data/bin/Image-ExifTool-9.33/t/Vorbis_2.out +28 -0
  642. data/bin/Image-ExifTool-9.33/t/Writer.t +913 -0
  643. data/bin/Image-ExifTool-9.33/t/Writer_10.out +240 -0
  644. data/bin/Image-ExifTool-9.33/t/Writer_11.out +37 -0
  645. data/bin/Image-ExifTool-9.33/t/Writer_13.out +160 -0
  646. data/bin/Image-ExifTool-9.33/t/Writer_14.out +67 -0
  647. data/bin/Image-ExifTool-9.33/t/Writer_15.out +171 -0
  648. data/bin/Image-ExifTool-9.33/t/Writer_16.out +1 -0
  649. data/bin/Image-ExifTool-9.33/t/Writer_17.out +1 -0
  650. data/bin/Image-ExifTool-9.33/t/Writer_18.out +3 -0
  651. data/bin/Image-ExifTool-9.33/t/Writer_19.out +34 -0
  652. data/bin/Image-ExifTool-9.33/t/Writer_2.out +168 -0
  653. data/bin/Image-ExifTool-9.33/t/Writer_22.out +4 -0
  654. data/bin/Image-ExifTool-9.33/t/Writer_24.out +1 -0
  655. data/bin/Image-ExifTool-9.33/t/Writer_25.out +38 -0
  656. data/bin/Image-ExifTool-9.33/t/Writer_26.out +32 -0
  657. data/bin/Image-ExifTool-9.33/t/Writer_27.out +14 -0
  658. data/bin/Image-ExifTool-9.33/t/Writer_28.out +1 -0
  659. data/bin/Image-ExifTool-9.33/t/Writer_29.out +2 -0
  660. data/bin/Image-ExifTool-9.33/t/Writer_30.out +2 -0
  661. data/bin/Image-ExifTool-9.33/t/Writer_31.out +97 -0
  662. data/bin/Image-ExifTool-9.33/t/Writer_32.out +3 -0
  663. data/bin/Image-ExifTool-9.33/t/Writer_33.out +3 -0
  664. data/bin/Image-ExifTool-9.33/t/Writer_34.out +3 -0
  665. data/bin/Image-ExifTool-9.33/t/Writer_35.out +187 -0
  666. data/bin/Image-ExifTool-9.33/t/Writer_36.out +2 -0
  667. data/bin/Image-ExifTool-9.33/t/Writer_37.out +2 -0
  668. data/bin/Image-ExifTool-9.33/t/Writer_38.out +62 -0
  669. data/bin/Image-ExifTool-9.33/t/Writer_39.out +4 -0
  670. data/bin/Image-ExifTool-9.33/t/Writer_4.out +85 -0
  671. data/bin/Image-ExifTool-9.33/t/Writer_40.out +4 -0
  672. data/bin/Image-ExifTool-9.33/t/Writer_41.out +3 -0
  673. data/bin/Image-ExifTool-9.33/t/Writer_42.out +5 -0
  674. data/bin/Image-ExifTool-9.33/t/Writer_43.out +5 -0
  675. data/bin/Image-ExifTool-9.33/t/Writer_44.out +2 -0
  676. data/bin/Image-ExifTool-9.33/t/Writer_45.out +1 -0
  677. data/bin/Image-ExifTool-9.33/t/Writer_46.out +77 -0
  678. data/bin/Image-ExifTool-9.33/t/Writer_47.out +56 -0
  679. data/bin/Image-ExifTool-9.33/t/Writer_48.out +29 -0
  680. data/bin/Image-ExifTool-9.33/t/Writer_50.out +3 -0
  681. data/bin/Image-ExifTool-9.33/t/Writer_51.out +386 -0
  682. data/bin/Image-ExifTool-9.33/t/Writer_6.out +182 -0
  683. data/bin/Image-ExifTool-9.33/t/Writer_7.out +149 -0
  684. data/bin/Image-ExifTool-9.33/t/Writer_9.out +237 -0
  685. data/bin/Image-ExifTool-9.33/t/XMP.t +521 -0
  686. data/bin/Image-ExifTool-9.33/t/XMP_10.out +33 -0
  687. data/bin/Image-ExifTool-9.33/t/XMP_11.out +59 -0
  688. data/bin/Image-ExifTool-9.33/t/XMP_12.out +4 -0
  689. data/bin/Image-ExifTool-9.33/t/XMP_13.out +5 -0
  690. data/bin/Image-ExifTool-9.33/t/XMP_14.out +3 -0
  691. data/bin/Image-ExifTool-9.33/t/XMP_15.out +3 -0
  692. data/bin/Image-ExifTool-9.33/t/XMP_16.out +5 -0
  693. data/bin/Image-ExifTool-9.33/t/XMP_17.out +6 -0
  694. data/bin/Image-ExifTool-9.33/t/XMP_18.out +10 -0
  695. data/bin/Image-ExifTool-9.33/t/XMP_19.out +35 -0
  696. data/bin/Image-ExifTool-9.33/t/XMP_2.out +138 -0
  697. data/bin/Image-ExifTool-9.33/t/XMP_20.out +35 -0
  698. data/bin/Image-ExifTool-9.33/t/XMP_21.out +38 -0
  699. data/bin/Image-ExifTool-9.33/t/XMP_22.out +38 -0
  700. data/bin/Image-ExifTool-9.33/t/XMP_23.out +9 -0
  701. data/bin/Image-ExifTool-9.33/t/XMP_24.out +31 -0
  702. data/bin/Image-ExifTool-9.33/t/XMP_25.out +28 -0
  703. data/bin/Image-ExifTool-9.33/t/XMP_26.out +52 -0
  704. data/bin/Image-ExifTool-9.33/t/XMP_27.out +93 -0
  705. data/bin/Image-ExifTool-9.33/t/XMP_28.out +44 -0
  706. data/bin/Image-ExifTool-9.33/t/XMP_29.out +24 -0
  707. data/bin/Image-ExifTool-9.33/t/XMP_3.out +136 -0
  708. data/bin/Image-ExifTool-9.33/t/XMP_30.out +90 -0
  709. data/bin/Image-ExifTool-9.33/t/XMP_31.out +19 -0
  710. data/bin/Image-ExifTool-9.33/t/XMP_32.out +2 -0
  711. data/bin/Image-ExifTool-9.33/t/XMP_34.out +2 -0
  712. data/bin/Image-ExifTool-9.33/t/XMP_36.out +18 -0
  713. data/bin/Image-ExifTool-9.33/t/XMP_37.out +35 -0
  714. data/bin/Image-ExifTool-9.33/t/XMP_39.out +44 -0
  715. data/bin/Image-ExifTool-9.33/t/XMP_40.out +3 -0
  716. data/bin/Image-ExifTool-9.33/t/XMP_41.out +175 -0
  717. data/bin/Image-ExifTool-9.33/t/XMP_5.out +29 -0
  718. data/bin/Image-ExifTool-9.33/t/XMP_6.out +87 -0
  719. data/bin/Image-ExifTool-9.33/t/XMP_7.out +118 -0
  720. data/bin/Image-ExifTool-9.33/t/XMP_8.out +17 -0
  721. data/bin/Image-ExifTool-9.33/t/XMP_9.out +36 -0
  722. data/bin/Image-ExifTool-9.33/t/ZIP.t +69 -0
  723. data/bin/Image-ExifTool-9.33/t/ZIP_2.out +18 -0
  724. data/bin/Image-ExifTool-9.33/t/ZIP_3.out +17 -0
  725. data/bin/Image-ExifTool-9.33/t/ZIP_4.out +213 -0
  726. data/bin/Image-ExifTool-9.33/t/ZIP_5.out +134 -0
  727. data/bin/Image-ExifTool-9.33/t/ZIP_6.out +49 -0
  728. data/bin/Image-ExifTool-9.33/t/ZIP_7.out +28 -0
  729. data/bin/Image-ExifTool-9.33/t/images/AFCP.jpg +0 -0
  730. data/bin/Image-ExifTool-9.33/t/images/AIFF.aif +0 -0
  731. data/bin/Image-ExifTool-9.33/t/images/APE.ape +0 -0
  732. data/bin/Image-ExifTool-9.33/t/images/APE.mpc +0 -0
  733. data/bin/Image-ExifTool-9.33/t/images/ASF.wmv +0 -0
  734. data/bin/Image-ExifTool-9.33/t/images/BMP.bmp +0 -0
  735. data/bin/Image-ExifTool-9.33/t/images/BigTIFF.btf +0 -0
  736. data/bin/Image-ExifTool-9.33/t/images/Canon.jpg +0 -0
  737. data/bin/Image-ExifTool-9.33/t/images/Canon1DmkIII.jpg +0 -0
  738. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.cr2 +0 -0
  739. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.crw +0 -0
  740. data/bin/Image-ExifTool-9.33/t/images/CanonVRD.vrd +0 -0
  741. data/bin/Image-ExifTool-9.33/t/images/CaptureOne.eip +0 -0
  742. data/bin/Image-ExifTool-9.33/t/images/Casio.jpg +0 -0
  743. data/bin/Image-ExifTool-9.33/t/images/Casio2.jpg +0 -0
  744. data/bin/Image-ExifTool-9.33/t/images/CasioQVCI.jpg +0 -0
  745. data/bin/Image-ExifTool-9.33/t/images/DICOM.dcm +0 -0
  746. data/bin/Image-ExifTool-9.33/t/images/DNG.dng +0 -0
  747. data/bin/Image-ExifTool-9.33/t/images/DV.dv +0 -0
  748. data/bin/Image-ExifTool-9.33/t/images/DjVu.djvu +0 -0
  749. data/bin/Image-ExifTool-9.33/t/images/EXE.elf +0 -0
  750. data/bin/Image-ExifTool-9.33/t/images/EXE.exe +0 -0
  751. data/bin/Image-ExifTool-9.33/t/images/EXE.macho +0 -0
  752. data/bin/Image-ExifTool-9.33/t/images/ExifTool.jpg +0 -0
  753. data/bin/Image-ExifTool-9.33/t/images/ExifTool.tif +0 -0
  754. data/bin/Image-ExifTool-9.33/t/images/ExtendedXMP.jpg +0 -0
  755. data/bin/Image-ExifTool-9.33/t/images/FLAC.flac +0 -0
  756. data/bin/Image-ExifTool-9.33/t/images/FLAC.ogg +0 -0
  757. data/bin/Image-ExifTool-9.33/t/images/FLIR.fpf +0 -0
  758. data/bin/Image-ExifTool-9.33/t/images/FLIR.jpg +0 -0
  759. data/bin/Image-ExifTool-9.33/t/images/Flash.flv +0 -0
  760. data/bin/Image-ExifTool-9.33/t/images/Flash.swf +0 -0
  761. data/bin/Image-ExifTool-9.33/t/images/FlashPix.ppt +0 -0
  762. data/bin/Image-ExifTool-9.33/t/images/Font.afm +28 -0
  763. data/bin/Image-ExifTool-9.33/t/images/Font.dfont +0 -0
  764. data/bin/Image-ExifTool-9.33/t/images/Font.pfa +38 -0
  765. data/bin/Image-ExifTool-9.33/t/images/Font.pfb +0 -0
  766. data/bin/Image-ExifTool-9.33/t/images/Font.pfm +0 -0
  767. data/bin/Image-ExifTool-9.33/t/images/Font.ttf +0 -0
  768. data/bin/Image-ExifTool-9.33/t/images/FotoStation.jpg +0 -0
  769. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.jpg +0 -0
  770. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.raf +0 -0
  771. data/bin/Image-ExifTool-9.33/t/images/GE.jpg +0 -0
  772. data/bin/Image-ExifTool-9.33/t/images/GIF.gif +0 -0
  773. data/bin/Image-ExifTool-9.33/t/images/GIMP.xcf +0 -0
  774. data/bin/Image-ExifTool-9.33/t/images/GPS.jpg +0 -0
  775. data/bin/Image-ExifTool-9.33/t/images/GeoTiff.tif +0 -0
  776. data/bin/Image-ExifTool-9.33/t/images/Geotag.gpx +23 -0
  777. data/bin/Image-ExifTool-9.33/t/images/Geotag.igc +24 -0
  778. data/bin/Image-ExifTool-9.33/t/images/Geotag.log +13 -0
  779. data/bin/Image-ExifTool-9.33/t/images/Geotag.xml +23 -0
  780. data/bin/Image-ExifTool-9.33/t/images/Geotag2.log +7 -0
  781. data/bin/Image-ExifTool-9.33/t/images/HTML.html +77 -0
  782. data/bin/Image-ExifTool-9.33/t/images/IPTC.jpg +0 -0
  783. data/bin/Image-ExifTool-9.33/t/images/ITC.itc +0 -0
  784. data/bin/Image-ExifTool-9.33/t/images/InDesign.indd +0 -0
  785. data/bin/Image-ExifTool-9.33/t/images/JVC.jpg +0 -0
  786. data/bin/Image-ExifTool-9.33/t/images/JVC2.jpg +0 -0
  787. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.j2c +0 -0
  788. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.jp2 +0 -0
  789. data/bin/Image-ExifTool-9.33/t/images/Kodak.jpg +0 -0
  790. data/bin/Image-ExifTool-9.33/t/images/KyoceraRaw.raw +0 -0
  791. data/bin/Image-ExifTool-9.33/t/images/LNK.lnk +0 -0
  792. data/bin/Image-ExifTool-9.33/t/images/M2TS.mts +0 -0
  793. data/bin/Image-ExifTool-9.33/t/images/MIE.mie +0 -0
  794. data/bin/Image-ExifTool-9.33/t/images/MIFF.miff +0 -0
  795. data/bin/Image-ExifTool-9.33/t/images/MP3.mp3 +0 -0
  796. data/bin/Image-ExifTool-9.33/t/images/MWG.jpg +0 -0
  797. data/bin/Image-ExifTool-9.33/t/images/MXF.mxf +0 -0
  798. data/bin/Image-ExifTool-9.33/t/images/Matroska.mkv +0 -0
  799. data/bin/Image-ExifTool-9.33/t/images/Minolta.jpg +0 -0
  800. data/bin/Image-ExifTool-9.33/t/images/Minolta.mrw +0 -0
  801. data/bin/Image-ExifTool-9.33/t/images/Nikon.jpg +0 -0
  802. data/bin/Image-ExifTool-9.33/t/images/Nikon.nef +0 -0
  803. data/bin/Image-ExifTool-9.33/t/images/NikonD2Hs.jpg +0 -0
  804. data/bin/Image-ExifTool-9.33/t/images/NikonD70.jpg +0 -0
  805. data/bin/Image-ExifTool-9.33/t/images/OOXML.docx +0 -0
  806. data/bin/Image-ExifTool-9.33/t/images/Olympus.jpg +0 -0
  807. data/bin/Image-ExifTool-9.33/t/images/Olympus2.jpg +0 -0
  808. data/bin/Image-ExifTool-9.33/t/images/OlympusE1.jpg +0 -0
  809. data/bin/Image-ExifTool-9.33/t/images/OpenDoc.ods +0 -0
  810. data/bin/Image-ExifTool-9.33/t/images/OpenEXR.exr +0 -0
  811. data/bin/Image-ExifTool-9.33/t/images/PDF.pdf +0 -0
  812. data/bin/Image-ExifTool-9.33/t/images/PDF2.pdf +0 -0
  813. data/bin/Image-ExifTool-9.33/t/images/PGF.pgf +0 -0
  814. data/bin/Image-ExifTool-9.33/t/images/PICT.pict +0 -0
  815. data/bin/Image-ExifTool-9.33/t/images/PLIST-bin.plist +0 -0
  816. data/bin/Image-ExifTool-9.33/t/images/PLIST-xml.plist +35 -0
  817. data/bin/Image-ExifTool-9.33/t/images/PNG.png +0 -0
  818. data/bin/Image-ExifTool-9.33/t/images/PPM.ppm +5 -0
  819. data/bin/Image-ExifTool-9.33/t/images/PSP.psp +0 -0
  820. data/bin/Image-ExifTool-9.33/t/images/Panasonic.jpg +0 -0
  821. data/bin/Image-ExifTool-9.33/t/images/Panasonic.rw2 +0 -0
  822. data/bin/Image-ExifTool-9.33/t/images/Pentax.avi +0 -0
  823. data/bin/Image-ExifTool-9.33/t/images/Pentax.jpg +0 -0
  824. data/bin/Image-ExifTool-9.33/t/images/PhotoCD.pcd +0 -0
  825. data/bin/Image-ExifTool-9.33/t/images/PhotoMechanic.jpg +0 -0
  826. data/bin/Image-ExifTool-9.33/t/images/Photoshop.psd +0 -0
  827. data/bin/Image-ExifTool-9.33/t/images/PostScript.eps +108 -0
  828. data/bin/Image-ExifTool-9.33/t/images/QuickTime.m4a +0 -0
  829. data/bin/Image-ExifTool-9.33/t/images/QuickTime.mov +0 -0
  830. data/bin/Image-ExifTool-9.33/t/images/RIFF.avi +0 -0
  831. data/bin/Image-ExifTool-9.33/t/images/RIFF.wav +0 -0
  832. data/bin/Image-ExifTool-9.33/t/images/RIFF.webp +0 -0
  833. data/bin/Image-ExifTool-9.33/t/images/RTF.rtf +25 -0
  834. data/bin/Image-ExifTool-9.33/t/images/Radiance.hdr +0 -0
  835. data/bin/Image-ExifTool-9.33/t/images/Real.ra +0 -0
  836. data/bin/Image-ExifTool-9.33/t/images/Real.ram +1 -0
  837. data/bin/Image-ExifTool-9.33/t/images/Real.rm +0 -0
  838. data/bin/Image-ExifTool-9.33/t/images/Ricoh.jpg +0 -0
  839. data/bin/Image-ExifTool-9.33/t/images/Ricoh2.jpg +0 -0
  840. data/bin/Image-ExifTool-9.33/t/images/Sanyo.jpg +0 -0
  841. data/bin/Image-ExifTool-9.33/t/images/Sigma.jpg +0 -0
  842. data/bin/Image-ExifTool-9.33/t/images/Sigma.x3f +0 -0
  843. data/bin/Image-ExifTool-9.33/t/images/SigmaDP2.x3f +0 -0
  844. data/bin/Image-ExifTool-9.33/t/images/Sony.jpg +0 -0
  845. data/bin/Image-ExifTool-9.33/t/images/Sony.pmp +0 -0
  846. data/bin/Image-ExifTool-9.33/t/images/Unknown.jpg +0 -0
  847. data/bin/Image-ExifTool-9.33/t/images/Vorbis.ogg +0 -0
  848. data/bin/Image-ExifTool-9.33/t/images/Writer.jpg +0 -0
  849. data/bin/Image-ExifTool-9.33/t/images/XMP.inx +108 -0
  850. data/bin/Image-ExifTool-9.33/t/images/XMP.jpg +0 -0
  851. data/bin/Image-ExifTool-9.33/t/images/XMP.svg +33 -0
  852. data/bin/Image-ExifTool-9.33/t/images/XMP.xml +98 -0
  853. data/bin/Image-ExifTool-9.33/t/images/XMP.xmp +99 -0
  854. data/bin/Image-ExifTool-9.33/t/images/XMP2.xmp +25 -0
  855. data/bin/Image-ExifTool-9.33/t/images/XMP3.xmp +43 -0
  856. data/bin/Image-ExifTool-9.33/t/images/XMP4.xmp +93 -0
  857. data/bin/Image-ExifTool-9.33/t/images/XMP5.xmp +158 -0
  858. data/bin/Image-ExifTool-9.33/t/images/ZIP.gz +0 -0
  859. data/bin/Image-ExifTool-9.33/t/images/ZIP.zip +0 -0
  860. data/bin/Image-ExifTool-9.33/t/images/iWork.numbers +0 -0
  861. data/lib/exiftool_vendored.rb +10 -0
  862. data/lib/exiftool_vendored/version.rb +3 -0
  863. data/lib/exiftool_vendored/version_extractor.rb +17 -0
  864. metadata +977 -0
@@ -0,0 +1,449 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: PLIST.pm
3
+ #
4
+ # Description: Read Apple PLIST information
5
+ #
6
+ # Revisions: 2013-02-01 - P. Harvey Created
7
+ #
8
+ # References: 1) http://www.apple.com/DTDs/PropertyList-1.0.dtd
9
+ # 2) http://opensource.apple.com/source/CF/CF-550/CFBinaryPList.c
10
+ #
11
+ # Notes: - Sony MODD files also use XML PLIST format, but with a few quirks
12
+ #
13
+ # - Decodes both the binary and XML-based PLIST formats
14
+ #------------------------------------------------------------------------------
15
+
16
+ package Image::ExifTool::PLIST;
17
+
18
+ use strict;
19
+ use vars qw($VERSION);
20
+ use Image::ExifTool qw(:DataAccess :Utils);
21
+ use Image::ExifTool::XMP;
22
+
23
+ $VERSION = '1.02';
24
+
25
+ sub ExtractObject($$;$);
26
+ sub Get24u($$);
27
+
28
+ # access routines to read various-sized integer/real values (add 0x100 to size for reals)
29
+ my %readProc = (
30
+ 1 => \&Get8u,
31
+ 2 => \&Get16u,
32
+ 3 => \&Get24u,
33
+ 4 => \&Get32u,
34
+ 8 => \&Get64u,
35
+ 0x104 => \&GetFloat,
36
+ 0x108 => \&GetDouble,
37
+ );
38
+
39
+ # PLIST tags (generated on-the-fly for most tags)
40
+ %Image::ExifTool::PLIST::Main = (
41
+ PROCESS_PROC => \&ProcessPLIST,
42
+ GROUPS => { 0 => 'PLIST', 1 => 'XML', 2 => 'Document' },
43
+ VARS => { LONG_TAGS => 4 },
44
+ NOTES => q{
45
+ Apple Property List tags. ExifTool reads both XML and binary-format PLIST
46
+ files, and will extract any existing tags even if they aren't listed below.
47
+ These tags belong to the family 0 "PLIST" group, but family 1 group may be
48
+ either "XML" or "PLIST" depending on whether the format is XML or binary.
49
+ },
50
+ #
51
+ # tags found in PLIST information of QuickTime iTunesInfo iTunMOVI atom (ref PH)
52
+ #
53
+ 'cast//name' => { Name => 'Cast', List => 1 },
54
+ 'directors//name' => { Name => 'Directors', List => 1 },
55
+ 'producers//name' => { Name => 'Producers', List => 1 },
56
+ 'screenwriters//name' => { Name => 'Screenwriters', List => 1 },
57
+ 'codirectors//name' => { Name => 'Codirectors', List => 1 }, # (NC)
58
+ 'studio//name' => { Name => 'Studio', List => 1 }, # (NC)
59
+ #
60
+ # tags found in MODD files (ref PH)
61
+ #
62
+ 'MetaDataList//DateTimeOriginal' => {
63
+ Name => 'DateTimeOriginal',
64
+ Description => 'Date/Time Original',
65
+ Groups => { 2 => 'Time' },
66
+ # Sony uses a "real" here -- number of days since Dec 31, 1899
67
+ ValueConv => 'IsFloat($val) ? ConvertUnixTime(($val - 25569) * 24 * 3600 + 0.5) : $val',
68
+ PrintConv => '$self->ConvertDateTime($val)',
69
+ },
70
+ 'MetaDataList//Duration' => {
71
+ Name => 'Duration',
72
+ Groups => { 2 => 'Video' },
73
+ PrintConv => 'ConvertDuration($val)',
74
+ },
75
+ 'MetaDataList//Geolocation/Latitude' => {
76
+ Name => 'GPSLatitude',
77
+ Groups => { 2 => 'Location' },
78
+ PrintConv => q{
79
+ require Image::ExifTool::GPS;
80
+ Image::ExifTool::GPS::ToDMS($self, $val, 1, 'N');
81
+ },
82
+ },
83
+ 'MetaDataList//Geolocation/Longitude' => {
84
+ Name => 'GPSLongitude',
85
+ Groups => { 2 => 'Location' },
86
+ PrintConv => q{
87
+ require Image::ExifTool::GPS;
88
+ Image::ExifTool::GPS::ToDMS($self, $val, 1, 'E');
89
+ },
90
+ },
91
+ 'MetaDataList//Geolocation/MapDatum' => {
92
+ Name => 'GPSMapDatum',
93
+ Groups => { 2 => 'Location' },
94
+ },
95
+ XMLFileType => {
96
+ # recognize MODD files by their content
97
+ RawConv => q{
98
+ if ($val eq 'ModdXML' and $$self{FILE_TYPE} eq 'XMP') {
99
+ $self->OverrideFileType('MODD');
100
+ }
101
+ return $val;
102
+ },
103
+ },
104
+ );
105
+
106
+ #------------------------------------------------------------------------------
107
+ # We found a PLIST XML property name/value
108
+ # Inputs: 0) ExifTool object ref, 1) tag table ref
109
+ # 2) reference to array of XML property names (last is current property)
110
+ # 3) property value, 4) attribute hash ref (not used here)
111
+ # Returns: 1 if valid tag was found
112
+ sub FoundTag($$$$;$)
113
+ {
114
+ my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
115
+ return 0 unless @$props;
116
+ my $verbose = $exifTool->Options('Verbose');
117
+ my $keys = $$exifTool{PListKeys} || ( $$exifTool{PListKeys} = [] );
118
+
119
+ my $prop = $$props[-1];
120
+ if ($verbose > 1) {
121
+ $exifTool->VPrint(0, $$exifTool{INDENT}, '[', join('/',@$props), ' = ',
122
+ $exifTool->Printable($val), "]\n");
123
+ }
124
+ # un-escape XML character entities
125
+ $val = Image::ExifTool::XMP::UnescapeXML($val);
126
+
127
+ # handle the various PLIST properties
128
+ if ($prop eq 'data') {
129
+ if ($val =~ /^[0-9a-f]+$/ and not length($val) & 0x01) {
130
+ # MODD files use ASCII-hex encoded "data"...
131
+ my $buff = pack('H*', $val);
132
+ $val = \$buff;
133
+ } else {
134
+ # ...but the PLIST DTD specifies Base64 encoding
135
+ $val = Image::ExifTool::XMP::DecodeBase64($val);
136
+ }
137
+ } elsif ($prop eq 'date') {
138
+ $val = Image::ExifTool::XMP::ConvertXMPDate($val);
139
+ } elsif ($prop eq 'true' or $prop eq 'false') {
140
+ $val = ucfirst $prop;
141
+ } else {
142
+ # convert from UTF8 to ExifTool Charset
143
+ $val = $exifTool->Decode($val, 'UTF8');
144
+ if ($prop eq 'key') {
145
+ if (@$props <= 3) { # top-level key should be plist/dict/key
146
+ @$keys = ( $val );
147
+ } else {
148
+ # save key names to be used in tag name
149
+ push @$keys, '' while @$keys < @$props - 3;
150
+ pop @$keys while @$keys > @$props - 2;
151
+ $$keys[@$props - 3] = $val;
152
+ }
153
+ return 0;
154
+ }
155
+ }
156
+
157
+ return 0 unless @$keys; # can't store value if no associated key
158
+
159
+ my $tag = join '/', @$keys; # generate tag ID from 'key' values
160
+ my $tagInfo = $$tagTablePtr{$tag};
161
+ unless ($tagInfo) {
162
+ $exifTool->VPrint(0, $exifTool->{INDENT}, "[adding $tag]\n") if $verbose;
163
+ # generate tag name from ID
164
+ my $name = $tag;
165
+ $name =~ s{^MetaDataList//}{}; # shorten long MODD metadata tag names
166
+ $name =~ s{//name$}{}; # remove unnecessary MODD "name" property
167
+ $name =~ s/([^A-Za-z])([a-z])/$1\u$2/g; # capitalize words
168
+ $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
169
+ $tagInfo = { Name => ucfirst($name), List => 1 };
170
+ if ($prop eq 'date') {
171
+ $$tagInfo{Groups}{2} = 'Time';
172
+ $$tagInfo{PrintConv} = '$self->ConvertDateTime($val)';
173
+ }
174
+ AddTagToTable($tagTablePtr, $tag, $tagInfo);
175
+ }
176
+ # allow list-behaviour only for consecutive tags with the same ID
177
+ if ($$exifTool{LastPListTag} and $$exifTool{LastPListTag} ne $tagInfo) {
178
+ delete $$exifTool{LIST_TAGS}{$$exifTool{LastPListTag}};
179
+ }
180
+ $$exifTool{LastPListTag} = $tagInfo;
181
+ # save the tag
182
+ $exifTool->HandleTag($tagTablePtr, $tag, $val);
183
+
184
+ return 1;
185
+ }
186
+
187
+ #------------------------------------------------------------------------------
188
+ # Get big-endian 24-bit integer
189
+ # Inputs: 0) data ref, 1) offset
190
+ # Returns: integer value
191
+ sub Get24u($$)
192
+ {
193
+ my ($dataPt, $off) = @_;
194
+ return unpack 'N', "\0" . substr($$dataPt, $off, 3);
195
+ }
196
+
197
+ #------------------------------------------------------------------------------
198
+ # Extract object from binary PLIST file at the current file position (ref 2)
199
+ # Inputs: 0) ExifTool ref, 1) PLIST info ref, 2) parent tag ID (undef for top)
200
+ # Returns: the object, or undef on error
201
+ sub ExtractObject($$;$)
202
+ {
203
+ my ($exifTool, $plistInfo, $parent) = @_;
204
+ my $raf = $$plistInfo{RAF};
205
+ my ($buff, $val);
206
+
207
+ $raf->Read($buff, 1) == 1 or return undef;
208
+ my $type = ord($buff) >> 4;
209
+ my $size = ord($buff) & 0x0f;
210
+ if ($type == 0) { # null/bool/fill
211
+ $val = { 0x00=>'<null>', 0x08=>'True', 0x09=>'False', 0x0f=>'<fill>' }->{$size};
212
+ } elsif ($type == 1 or $type == 2 or $type == 3) { # int, float or date
213
+ $size = 1 << $size;
214
+ my $proc = ($type == 1 ? $readProc{$size} : $readProc{$size + 0x100}) or return undef;
215
+ $val = &$proc(\$buff, 0) if $raf->Read($buff, $size) == $size;
216
+ if ($type == 3 and defined $val) { # date
217
+ # dates are referenced to Jan 1, 2001 (11323 days from Unix time zero)
218
+ $val = Image::ExifTool::ConvertUnixTime($val + 11323 * 24 * 3600, 1);
219
+ $$plistInfo{DateFormat} = 1;
220
+ }
221
+ } elsif ($type == 8) { # UID
222
+ ++$size;
223
+ $raf->Read($buff, $size) == $size or return undef;
224
+ my $proc = $readProc{$size};
225
+ if ($proc) {
226
+ $val = &$proc(\$buff, 0);
227
+ } elsif ($size == 16) {
228
+ require Image::ExifTool::ASF;
229
+ $val = Image::ExifTool::ASF::GetGUID($buff);
230
+ } else {
231
+ $val = "0x" . unpack 'H*', $buff;
232
+ }
233
+ } else {
234
+ # $size is the size of the remaining types
235
+ if ($size == 0x0f) {
236
+ # size is stored in extra integer object
237
+ $size = ExtractObject($exifTool, $plistInfo);
238
+ return undef unless defined $size and $size =~ /^\d+$/;
239
+ }
240
+ if ($type == 4) { # data
241
+ if ($size < 1000000 or $exifTool->Options('Binary')) {
242
+ $raf->Read($buff, $size) == $size or return undef;
243
+ } else {
244
+ $buff = "Binary data $size bytes";
245
+ }
246
+ $val = \$buff; # (return reference for binary data)
247
+ } elsif ($type == 5) { # ASCII string
248
+ $raf->Read($val, $size) == $size or return undef;
249
+ } elsif ($type == 6) { # UCS-2BE string
250
+ $size *= 2;
251
+ $raf->Read($buff, $size) == $size or return undef;
252
+ $val = $exifTool->Decode($buff, 'UCS2');
253
+ } elsif ($type == 10 or $type == 12 or $type == 13) { # array, set or dict
254
+ # the remaining types store a list of references
255
+ my $refSize = $$plistInfo{RefSize};
256
+ my $refProc = $$plistInfo{RefProc};
257
+ my $num = $type == 13 ? $size * 2 : $size;
258
+ my $len = $num * $refSize;
259
+ $raf->Read($buff, $len) == $len or return undef;
260
+ my $table = $$plistInfo{Table};
261
+ my ($i, $ref, @refs, @array);
262
+ for ($i=0; $i<$num; ++$i) {
263
+ my $ref = &$refProc(\$buff, $i * $refSize);
264
+ return 0 if $ref >= @$table;
265
+ push @refs, $ref;
266
+ }
267
+ if ($type == 13) { # dict
268
+ # prevent infinite recursion
269
+ if (defined $parent and length $parent > 1000) {
270
+ $exifTool->WarnOnce('Possible deep recursion while parsing PLIST');
271
+ return undef;
272
+ }
273
+ my $tagTablePtr = $$plistInfo{TagTablePtr};
274
+ my $verbose = $exifTool->Options('Verbose');
275
+ for ($i=0; $i<$size; ++$i) {
276
+ # get the entry key
277
+ $raf->Seek($$table[$refs[$i]], 0) or return undef;
278
+ my $key = ExtractObject($exifTool, $plistInfo);
279
+ next unless defined $key and length $key; # silently ignore bad dict entries
280
+ # get the entry value
281
+ $raf->Seek($$table[$refs[$i+$size]], 0) or return undef;
282
+ # generate an ID for this tag
283
+ my $tag = defined $parent ? "$parent/$key" : $key;
284
+ undef $$plistInfo{DateFormat};
285
+ my $val = ExtractObject($exifTool, $plistInfo, $tag);
286
+ next if not defined $val or ref($val) eq 'HASH';
287
+ my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
288
+ unless ($tagInfo) {
289
+ $exifTool->VPrint(0, $exifTool->{INDENT}, "[adding $tag]\n") if $verbose;
290
+ my $name = $tag;
291
+ $name =~ s/([^A-Za-z])([a-z])/$1\u$2/g; # capitalize words
292
+ $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
293
+ $tagInfo = { Name => ucfirst($name), List => 1 };
294
+ if ($$plistInfo{DateFormat}) {
295
+ $$tagInfo{Groups}{2} = 'Time';
296
+ $$tagInfo{PrintConv} = '$self->ConvertDateTime($val)';
297
+ }
298
+ AddTagToTable($tagTablePtr, $tag, $tagInfo);
299
+ }
300
+ # allow list-behaviour only for consecutive tags with the same ID
301
+ if ($$exifTool{LastPListTag} and $$exifTool{LastPListTag} ne $tagInfo) {
302
+ delete $$exifTool{LIST_TAGS}{$$exifTool{LastPListTag}};
303
+ }
304
+ $$exifTool{LastPListTag} = $tagInfo;
305
+ $exifTool->HandleTag($tagTablePtr, $tag, $val);
306
+ }
307
+ $val = { }; # flag the value as a dictionary (ie. tags already saved)
308
+ } else {
309
+ # extract the referenced objects
310
+ foreach $ref (@refs) {
311
+ $raf->Seek($$table[$ref], 0) or return undef; # seek to this object
312
+ $val = ExtractObject($exifTool, $plistInfo, $parent);
313
+ next unless defined $val and ref $val ne 'HASH';
314
+ push @array, $val;
315
+ }
316
+ $val = \@array;
317
+ }
318
+ }
319
+ }
320
+ return $val;
321
+ }
322
+
323
+ #------------------------------------------------------------------------------
324
+ # Process binary PLIST file (ref 2)
325
+ # Inputs: 0) ExifTool object ref, 1) DirInfo ref, 2) tag table ref
326
+ # Returns: 1 on success
327
+ sub ProcessBinaryPLIST($$$)
328
+ {
329
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
330
+ my $raf = $$dirInfo{RAF};
331
+ my ($i, $buff, @table);
332
+
333
+ $exifTool->VerboseDir('Binary PLIST');
334
+ SetByteOrder('MM');
335
+
336
+ # read and parse the trailer
337
+ $raf->Seek(-32,2) and $raf->Read($buff,32)==32 or return 0;
338
+ my $intSize = Get8u(\$buff, 6);
339
+ my $refSize = Get8u(\$buff, 7);
340
+ my $numObj = Get64u(\$buff, 8);
341
+ my $topObj = Get64u(\$buff, 16);
342
+ my $tableOff = Get64u(\$buff, 24);
343
+
344
+ return 0 if $topObj >= $numObj;
345
+ my $intProc = $readProc{$intSize} or return 0;
346
+ my $refProc = $readProc{$refSize} or return 0;
347
+
348
+ # read and parse the offset table
349
+ my $tableSize = $intSize * $numObj;
350
+ $raf->Seek($tableOff, 0) and $raf->Read($buff, $tableSize) == $tableSize or return 0;
351
+ for ($i=0; $i<$numObj; ++$i) {
352
+ push @table, &$intProc(\$buff, $i * $intSize);
353
+ }
354
+ my %plistInfo = (
355
+ RAF => $raf,
356
+ RefSize => $refSize,
357
+ RefProc => $refProc,
358
+ Table => \@table,
359
+ TagTablePtr => $tagTablePtr,
360
+ );
361
+ # position file pointer at the top object, and extract it
362
+ $raf->Seek($table[$topObj], 0) or return 0;
363
+ my $result = ExtractObject($exifTool, \%plistInfo);
364
+ return defined $result ? 1 : 0;
365
+ }
366
+
367
+ #------------------------------------------------------------------------------
368
+ # Extract information from a PLIST file
369
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
370
+ # Returns: 1 on success, 0 if this wasn't valid PLIST
371
+ sub ProcessPLIST($$;$)
372
+ {
373
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
374
+
375
+ # process XML PLIST data using the XMP module
376
+ $$dirInfo{XMPParseOpts}{FoundProc} = \&FoundTag;
377
+ my $result = Image::ExifTool::XMP::ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
378
+ delete $$dirInfo{XMPParseOpts};
379
+
380
+ unless ($result) {
381
+ my $buff;
382
+ my $raf = $$dirInfo{RAF} or return 0;
383
+ $raf->Seek(0,0) and $raf->Read($buff, 64) or return 0;
384
+ if ($buff =~ /^bplist0/) {
385
+ # binary PLIST file
386
+ my $tagTablePtr = GetTagTable('Image::ExifTool::PLIST::Main');
387
+ $exifTool->SetFileType('PLIST', 'application/x-plist');
388
+ $$exifTool{SET_GROUP1} = 'PLIST';
389
+ unless (ProcessBinaryPLIST($exifTool, $dirInfo, $tagTablePtr)) {
390
+ $exifTool->Error('Error reading binary PLIST file');
391
+ }
392
+ delete $$exifTool{SET_GROUP1};
393
+ $result = 1;
394
+ } elsif ($$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} eq 'PLIST' and
395
+ $buff =~ /^\xfe\xff\x00/)
396
+ {
397
+ # (have seen very old PLIST files encoded as UCS-2BE with leading BOM)
398
+ $exifTool->Error('Old PLIST format currently not supported');
399
+ $result = 1;
400
+ }
401
+ }
402
+ return $result;
403
+ }
404
+
405
+ 1; # end
406
+
407
+ __END__
408
+
409
+ =head1 NAME
410
+
411
+ Image::ExifTool::PLIST - Read Apple PLIST information
412
+
413
+ =head1 SYNOPSIS
414
+
415
+ This module is used by Image::ExifTool
416
+
417
+ =head1 DESCRIPTION
418
+
419
+ This module contains the routines used by Image::ExifTool to extract
420
+ information from Apple Property List files.
421
+
422
+ =head1 NOTES
423
+
424
+ This module decodes both the binary and XML-based PLIST format.
425
+
426
+ =head1 AUTHOR
427
+
428
+ Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
429
+
430
+ This library is free software; you can redistribute it and/or modify it
431
+ under the same terms as Perl itself.
432
+
433
+ =head1 REFERENCES
434
+
435
+ =over 4
436
+
437
+ =item L<http://www.apple.com/DTDs/PropertyList-1.0.dtd>
438
+
439
+ =item L<http://opensource.apple.com/source/CF/CF-550/CFBinaryPList.c>
440
+
441
+ =back
442
+
443
+ =head1 SEE ALSO
444
+
445
+ L<Image::ExifTool::TagNames/PLIST Tags>,
446
+ L<Image::ExifTool(3pm)|Image::ExifTool>
447
+
448
+ =cut
449
+
@@ -0,0 +1,1100 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: PNG.pm
3
+ #
4
+ # Description: Read and write PNG meta information
5
+ #
6
+ # Revisions: 06/10/2005 - P. Harvey Created
7
+ # 06/23/2005 - P. Harvey Added MNG and JNG support
8
+ # 09/16/2005 - P. Harvey Added write support
9
+ #
10
+ # References: 1) http://www.libpng.org/pub/png/spec/1.2/
11
+ # 2) http://www.faqs.org/docs/png/
12
+ # 3) http://www.libpng.org/pub/mng/
13
+ # 4) http://www.libpng.org/pub/png/spec/register/
14
+ # 5) ftp://ftp.simplesystems.org/pub/png/documents/pngext-1.4.0-pdg.html
15
+ #
16
+ # Notes: Writing meta information in PNG images is a pain in the butt
17
+ # for a number of reasons: One biggie is that you have to
18
+ # decompress then decode the ASCII/hex profile information before
19
+ # you can edit it, then you have to ASCII/hex-encode, recompress
20
+ # and calculate a CRC before you can write it out again. gaaaak.
21
+ #------------------------------------------------------------------------------
22
+
23
+ package Image::ExifTool::PNG;
24
+
25
+ use strict;
26
+ use vars qw($VERSION $AUTOLOAD);
27
+ use Image::ExifTool qw(:DataAccess :Utils);
28
+
29
+ $VERSION = '1.27';
30
+
31
+ sub ProcessPNG_tEXt($$$);
32
+ sub ProcessPNG_iTXt($$$);
33
+ sub ProcessPNG_Compressed($$$);
34
+ sub CalculateCRC($;$$$);
35
+ sub HexEncode($);
36
+ sub AddChunks($$);
37
+ sub Add_iCCP($$);
38
+ sub GetLangInfo($$);
39
+ sub BuildTextChunk($$$$$);
40
+
41
+ my $noCompressLib;
42
+
43
+ # look up for file type, header chunk and end chunk, based on file signature
44
+ my %pngLookup = (
45
+ "\x89PNG\r\n\x1a\n" => ['PNG', 'IHDR', 'IEND' ],
46
+ "\x8aMNG\r\n\x1a\n" => ['MNG', 'MHDR', 'MEND' ],
47
+ "\x8bJNG\r\n\x1a\n" => ['JNG', 'JHDR', 'IEND' ],
48
+ );
49
+
50
+ # map for directories in PNG images
51
+ my %pngMap = (
52
+ IFD1 => 'IFD0',
53
+ EXIF => 'IFD0', # to write EXIF as a block
54
+ ExifIFD => 'IFD0',
55
+ GPS => 'IFD0',
56
+ SubIFD => 'IFD0',
57
+ GlobParamIFD => 'IFD0',
58
+ PrintIM => 'IFD0',
59
+ InteropIFD => 'ExifIFD',
60
+ MakerNotes => 'ExifIFD',
61
+ IFD0 => 'PNG',
62
+ XMP => 'PNG',
63
+ ICC_Profile => 'PNG',
64
+ Photoshop => 'PNG',
65
+ IPTC => 'Photoshop',
66
+ MakerNotes => 'ExifIFD',
67
+ );
68
+
69
+ # color type of current image
70
+ $Image::ExifTool::PNG::colorType = -1;
71
+
72
+ # PNG chunks
73
+ %Image::ExifTool::PNG::Main = (
74
+ WRITE_PROC => \&Image::ExifTool::DummyWriteProc,
75
+ GROUPS => { 2 => 'Image' },
76
+ PREFERRED => 1, # always add these tags when writing
77
+ NOTES => q{
78
+ Tags extracted from PNG images. See
79
+ L<http://www.libpng.org/pub/png/spec/1.2/> for the official PNG 1.2
80
+ specification.
81
+ },
82
+ bKGD => {
83
+ Name => 'BackgroundColor',
84
+ ValueConv => 'join(" ",unpack(length($val) < 2 ? "C" : "n*", $val))',
85
+ },
86
+ cHRM => {
87
+ Name => 'PrimaryChromaticities',
88
+ SubDirectory => { TagTable => 'Image::ExifTool::PNG::PrimaryChromaticities' },
89
+ },
90
+ dSIG => {
91
+ Name => 'DigitalSignature',
92
+ Binary => 1,
93
+ },
94
+ fRAc => {
95
+ Name => 'FractalParameters',
96
+ Binary => 1,
97
+ },
98
+ gAMA => {
99
+ Name => 'Gamma',
100
+ ValueConv => 'my $a=unpack("N",$val);$a ? int(1e9/$a+0.5)/1e4 : $val',
101
+ },
102
+ gIFg => {
103
+ Name => 'GIFGraphicControlExtension',
104
+ Binary => 1,
105
+ },
106
+ gIFt => {
107
+ Name => 'GIFPlainTextExtension',
108
+ Binary => 1,
109
+ },
110
+ gIFx => {
111
+ Name => 'GIFApplicationExtension',
112
+ Binary => 1,
113
+ },
114
+ hIST => {
115
+ Name => 'PaletteHistogram',
116
+ Binary => 1,
117
+ },
118
+ iCCP => {
119
+ Name => 'ICC_Profile',
120
+ SubDirectory => {
121
+ TagTable => 'Image::ExifTool::ICC_Profile::Main',
122
+ ProcessProc => \&ProcessPNG_Compressed,
123
+ },
124
+ },
125
+ # IDAT
126
+ # IEND
127
+ IHDR => {
128
+ Name => 'ImageHeader',
129
+ SubDirectory => { TagTable => 'Image::ExifTool::PNG::ImageHeader' },
130
+ },
131
+ iTXt => {
132
+ Name => 'InternationalText',
133
+ SubDirectory => {
134
+ TagTable => 'Image::ExifTool::PNG::TextualData',
135
+ ProcessProc => \&ProcessPNG_iTXt,
136
+ },
137
+ },
138
+ oFFs => {
139
+ Name => 'ImageOffset',
140
+ ValueConv => q{
141
+ my @a = unpack("NNC",$val);
142
+ $a[2] = ($a[2] ? "microns" : "pixels");
143
+ return "$a[0], $a[1] ($a[2])";
144
+ },
145
+ },
146
+ pCAL => {
147
+ Name => 'PixelCalibration',
148
+ Binary => 1,
149
+ },
150
+ pHYs => {
151
+ Name => 'PhysicalPixel',
152
+ SubDirectory => { TagTable => 'Image::ExifTool::PNG::PhysicalPixel' },
153
+ },
154
+ PLTE => {
155
+ Name => 'Palette',
156
+ ValueConv => 'length($val) <= 3 ? join(" ",unpack("C*",$val)) : \$val',
157
+ },
158
+ sBIT => {
159
+ Name => 'SignificantBits',
160
+ ValueConv => 'join(" ",unpack("C*",$val))',
161
+ },
162
+ sCAL => { # png 1.4.0
163
+ Name => 'SubjectScale',
164
+ SubDirectory => { TagTable => 'Image::ExifTool::PNG::SubjectScale' },
165
+ },
166
+ sPLT => {
167
+ Name => 'SuggestedPalette',
168
+ Binary => 1,
169
+ PrintConv => 'split("\0",$$val,1)', # extract palette name
170
+ },
171
+ sRGB => {
172
+ Name => 'SRGBRendering',
173
+ ValueConv => 'unpack("C",$val)',
174
+ PrintConv => {
175
+ 0 => 'Perceptual',
176
+ 1 => 'Relative Colorimetric',
177
+ 2 => 'Saturation',
178
+ 3 => 'Absolute Colorimetric',
179
+ },
180
+ },
181
+ sTER => { # png 1.4.0
182
+ Name => 'StereoImage',
183
+ SubDirectory => { TagTable => 'Image::ExifTool::PNG::StereoImage' },
184
+ },
185
+ tEXt => {
186
+ Name => 'TextualData',
187
+ SubDirectory => { TagTable => 'Image::ExifTool::PNG::TextualData' },
188
+ },
189
+ tIME => {
190
+ Name => 'ModifyDate',
191
+ Groups => { 2 => 'Time' },
192
+ Writable => 1,
193
+ Shift => 'Time',
194
+ ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", unpack("nC5", $val))',
195
+ ValueConvInv => q{
196
+ my @a = ($val=~/^(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)/);
197
+ @a == 6 or warn('Invalid date'), return undef;
198
+ return pack('nC5', @a);
199
+ },
200
+ PrintConv => '$self->ConvertDateTime($val)',
201
+ PrintConvInv => '$self->InverseDateTime($val)',
202
+ },
203
+ tRNS => {
204
+ Name => 'Transparency',
205
+ ValueConv => q{
206
+ return \$val if length($val) > 6;
207
+ join(" ",unpack($Image::ExifTool::PNG::colorType == 3 ? "C*" : "n*", $val));
208
+ },
209
+ },
210
+ tXMP => {
211
+ Name => 'XMP',
212
+ Notes => 'obsolete location specified by a September 2001 XMP draft',
213
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
214
+ },
215
+ vpAg => { # private imagemagick chunk
216
+ Name => 'VirtualPage',
217
+ SubDirectory => { TagTable => 'Image::ExifTool::PNG::VirtualPage' },
218
+ },
219
+ zTXt => {
220
+ Name => 'CompressedText',
221
+ SubDirectory => {
222
+ TagTable => 'Image::ExifTool::PNG::TextualData',
223
+ ProcessProc => \&ProcessPNG_Compressed,
224
+ },
225
+ },
226
+ );
227
+
228
+ # PNG IHDR chunk
229
+ %Image::ExifTool::PNG::ImageHeader = (
230
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
231
+ GROUPS => { 2 => 'Image' },
232
+ 0 => {
233
+ Name => 'ImageWidth',
234
+ Format => 'int32u',
235
+ },
236
+ 4 => {
237
+ Name => 'ImageHeight',
238
+ Format => 'int32u',
239
+ },
240
+ 8 => 'BitDepth',
241
+ 9 => {
242
+ Name => 'ColorType',
243
+ RawConv => '$Image::ExifTool::PNG::colorType = $val',
244
+ PrintConv => {
245
+ 0 => 'Grayscale',
246
+ 2 => 'RGB',
247
+ 3 => 'Palette',
248
+ 4 => 'Grayscale with Alpha',
249
+ 6 => 'RGB with Alpha',
250
+ },
251
+ },
252
+ 10 => {
253
+ Name => 'Compression',
254
+ PrintConv => { 0 => 'Deflate/Inflate' },
255
+ },
256
+ 11 => {
257
+ Name => 'Filter',
258
+ PrintConv => { 0 => 'Adaptive' },
259
+ },
260
+ 12 => {
261
+ Name => 'Interlace',
262
+ PrintConv => { 0 => 'Noninterlaced', 1 => 'Adam7 Interlace' },
263
+ },
264
+ );
265
+
266
+ # PNG cHRM chunk
267
+ %Image::ExifTool::PNG::PrimaryChromaticities = (
268
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
269
+ GROUPS => { 2 => 'Image' },
270
+ FORMAT => 'int32u',
271
+ 0 => { Name => 'WhitePointX', ValueConv => '$val / 100000' },
272
+ 1 => { Name => 'WhitePointY', ValueConv => '$val / 100000' },
273
+ 2 => { Name => 'RedX', ValueConv => '$val / 100000' },
274
+ 3 => { Name => 'RedY', ValueConv => '$val / 100000' },
275
+ 4 => { Name => 'GreenX', ValueConv => '$val / 100000' },
276
+ 5 => { Name => 'GreenY', ValueConv => '$val / 100000' },
277
+ 6 => { Name => 'BlueX', ValueConv => '$val / 100000' },
278
+ 7 => { Name => 'BlueY', ValueConv => '$val / 100000' },
279
+ );
280
+
281
+ # PNG pHYs chunk
282
+ %Image::ExifTool::PNG::PhysicalPixel = (
283
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
284
+ GROUPS => { 2 => 'Image' },
285
+ 0 => {
286
+ Name => 'PixelsPerUnitX',
287
+ Format => 'int32u',
288
+ },
289
+ 4 => {
290
+ Name => 'PixelsPerUnitY',
291
+ Format => 'int32u',
292
+ },
293
+ 8 => {
294
+ Name => 'PixelUnits',
295
+ PrintConv => { 0 => 'Unknown', 1 => 'Meters' },
296
+ },
297
+ );
298
+
299
+ # PNG sCAL chunk
300
+ %Image::ExifTool::PNG::SubjectScale = (
301
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
302
+ GROUPS => { 2 => 'Image' },
303
+ 0 => {
304
+ Name => 'SubjectUnits',
305
+ PrintConv => { 1 => 'Meters', 2 => 'Radians' },
306
+ },
307
+ 1 => {
308
+ Name => 'SubjectPixelWidth',
309
+ Format => 'var_string',
310
+ },
311
+ 2 => {
312
+ Name => 'SubjectPixelHeight',
313
+ Format => 'var_string',
314
+ },
315
+ );
316
+
317
+ # PNG vpAg chunk
318
+ %Image::ExifTool::PNG::VirtualPage = (
319
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
320
+ GROUPS => { 2 => 'Image' },
321
+ FORMAT => 'int32u',
322
+ 0 => 'VirtualImageWidth',
323
+ 1 => 'VirtualImageHeight',
324
+ 2 => {
325
+ Name => 'VirtualPageUnits',
326
+ Format => 'int8u',
327
+ # what is the conversion for this?
328
+ },
329
+ );
330
+
331
+ # PNG sTER chunk
332
+ %Image::ExifTool::PNG::StereoImage = (
333
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
334
+ GROUPS => { 2 => 'Image' },
335
+ 0 => {
336
+ Name => 'StereoMode',
337
+ PrintConv => {
338
+ 0 => 'Cross-fuse Layout',
339
+ 1 => 'Diverging-fuse Layout',
340
+ },
341
+ },
342
+ );
343
+
344
+ my %unreg = ( Notes => 'unregistered' );
345
+
346
+ # Tags for PNG tEXt zTXt and iTXt chunks
347
+ # (NOTE: ValueConv is set dynamically, so don't set it here!)
348
+ %Image::ExifTool::PNG::TextualData = (
349
+ PROCESS_PROC => \&ProcessPNG_tEXt,
350
+ WRITE_PROC => \&Image::ExifTool::DummyWriteProc,
351
+ WRITABLE => 'string',
352
+ PREFERRED => 1, # always add these tags when writing
353
+ GROUPS => { 2 => 'Image' },
354
+ LANG_INFO => \&GetLangInfo,
355
+ NOTES => q{
356
+ The PNG TextualData format allows arbitrary tag names to be used. The tags
357
+ listed below are the only ones that can be written (unless new user-defined
358
+ tags are added via the configuration file), however ExifTool will extract
359
+ any other TextualData tags that are found.
360
+
361
+ These tags may be stored as tEXt, zTXt or iTXt chunks in the PNG image. By
362
+ default ExifTool writes new string-value tags as as uncompressed tEXt, or
363
+ compressed zTXt if the Compress (-z) option is used and Compress::Zlib is
364
+ available. Alternate language tags and values containing special characters
365
+ (unless the Latin character set is used) are written as iTXt, and compressed
366
+ if the Compress option is used and Compress::Zlib is available. Raw profile
367
+ information is always created as compressed zTXt if Compress::Zlib is
368
+ available, or tEXt otherwise. Standard XMP is written as uncompressed iTXt.
369
+
370
+ Alternate languages are accessed by suffixing the tag name with a '-',
371
+ followed by an RFC 3066 language code (ie. "PNG:Comment-fr", or
372
+ "Title-en-US"). See L<http://www.ietf.org/rfc/rfc3066.txt> for the RFC 3066
373
+ specification.
374
+
375
+ Some of the tags below are not registered as part of the PNG specification,
376
+ but are included here because they are generated by other software such as
377
+ ImageMagick.
378
+ },
379
+ Title => { },
380
+ Author => { Groups => { 2 => 'Author' } },
381
+ Description => { },
382
+ Copyright => { Groups => { 2 => 'Author' } },
383
+ 'Creation Time' => {
384
+ Name => 'CreationTime',
385
+ Groups => { 2 => 'Time' },
386
+ Shift => 'Time',
387
+ },
388
+ Software => { },
389
+ Disclaimer => { },
390
+ # change name to differentiate from ExifTool Warning
391
+ Warning => { Name => 'PNGWarning', },
392
+ Source => { },
393
+ Comment => { },
394
+ #
395
+ # The following tags are not part of the original PNG specification,
396
+ # but are written by ImageMagick and other software
397
+ #
398
+ Artist => { %unreg, Groups => { 2 => 'Author' } },
399
+ Document => { %unreg },
400
+ Label => { %unreg },
401
+ Make => { %unreg, Groups => { 2 => 'Camera' } },
402
+ Model => { %unreg, Groups => { 2 => 'Camera' } },
403
+ 'create-date'=> {
404
+ Name => 'CreateDate',
405
+ Groups => { 2 => 'Time' },
406
+ Shift => 'Time',
407
+ %unreg,
408
+ ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)',
409
+ ValueConvInv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::FormatXMPDate($val)',
410
+ PrintConv => '$self->ConvertDateTime($val)',
411
+ PrintConvInv => '$self->InverseDateTime($val,undef,1)',
412
+ },
413
+ 'modify-date'=> {
414
+ Name => 'ModDate', # (to distinguish from tIME chunk "ModifyDate")
415
+ Groups => { 2 => 'Time' },
416
+ Shift => 'Time',
417
+ %unreg,
418
+ ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)',
419
+ ValueConvInv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::FormatXMPDate($val)',
420
+ PrintConv => '$self->ConvertDateTime($val)',
421
+ PrintConvInv => '$self->InverseDateTime($val,undef,1)',
422
+ },
423
+ TimeStamp => { %unreg, Groups => { 2 => 'Time' }, Shift => 'Time' },
424
+ URL => { %unreg },
425
+ 'XML:com.adobe.xmp' => {
426
+ Name => 'XMP',
427
+ Notes => q{
428
+ unregistered, but this is the location according to the June 2002 or later
429
+ XMP specification, and is where ExifTool will add a new XMP chunk if the
430
+ image didn't already contain XMP
431
+ },
432
+ SubDirectory => {
433
+ TagTable => 'Image::ExifTool::XMP::Main',
434
+ },
435
+ },
436
+ 'Raw profile type APP1' => [
437
+ {
438
+ # EXIF table must come first because we key on this in ProcessProfile()
439
+ # (No condition because this is just for BuildTagLookup)
440
+ Name => 'APP1_Profile',
441
+ %unreg,
442
+ SubDirectory => {
443
+ TagTable=>'Image::ExifTool::Exif::Main',
444
+ ProcessProc => \&ProcessProfile,
445
+ },
446
+ },
447
+ {
448
+ Name => 'APP1_Profile',
449
+ SubDirectory => {
450
+ TagTable=>'Image::ExifTool::XMP::Main',
451
+ ProcessProc => \&ProcessProfile,
452
+ },
453
+ },
454
+ ],
455
+ 'Raw profile type exif' => {
456
+ Name => 'EXIF_Profile',
457
+ %unreg,
458
+ SubDirectory => {
459
+ TagTable=>'Image::ExifTool::Exif::Main',
460
+ ProcessProc => \&ProcessProfile,
461
+ },
462
+ },
463
+ 'Raw profile type icc' => {
464
+ Name => 'ICC_Profile',
465
+ %unreg,
466
+ SubDirectory => {
467
+ TagTable => 'Image::ExifTool::ICC_Profile::Main',
468
+ ProcessProc => \&ProcessProfile,
469
+ },
470
+ },
471
+ 'Raw profile type icm' => {
472
+ Name => 'ICC_Profile',
473
+ %unreg,
474
+ SubDirectory => {
475
+ TagTable => 'Image::ExifTool::ICC_Profile::Main',
476
+ ProcessProc => \&ProcessProfile,
477
+ },
478
+ },
479
+ 'Raw profile type iptc' => {
480
+ Name => 'IPTC_Profile',
481
+ %unreg,
482
+ SubDirectory => {
483
+ TagTable => 'Image::ExifTool::Photoshop::Main',
484
+ ProcessProc => \&ProcessProfile,
485
+ },
486
+ },
487
+ 'Raw profile type xmp' => {
488
+ Name => 'XMP_Profile',
489
+ %unreg,
490
+ SubDirectory => {
491
+ TagTable => 'Image::ExifTool::XMP::Main',
492
+ ProcessProc => \&ProcessProfile,
493
+ },
494
+ },
495
+ );
496
+
497
+ #------------------------------------------------------------------------------
498
+ # AutoLoad our writer routines when necessary
499
+ #
500
+ sub AUTOLOAD
501
+ {
502
+ return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
503
+ }
504
+
505
+ #------------------------------------------------------------------------------
506
+ # Get standard case for language code (this routine copied from XMP.pm)
507
+ # Inputs: 0) Language code
508
+ # Returns: Language code in standard case
509
+ sub StandardLangCase($)
510
+ {
511
+ my $lang = shift;
512
+ # make 2nd subtag uppercase only if it is 2 letters
513
+ return lc($1) . uc($2) . lc($3) if $lang =~ /^([a-z]{2,3}|[xi])(-[a-z]{2})\b(.*)/i;
514
+ return lc($lang);
515
+ }
516
+
517
+ #------------------------------------------------------------------------------
518
+ # Get localized version of tagInfo hash
519
+ # Inputs: 0) tagInfo hash ref, 1) language code (ie. "x-default")
520
+ # Returns: new tagInfo hash ref, or undef if invalid
521
+ sub GetLangInfo($$)
522
+ {
523
+ my ($tagInfo, $lang) = @_;
524
+ $lang =~ tr/_/-/; # RFC 3066 specifies '-' as a separator
525
+ # no alternate languages for XMP or raw profile directories
526
+ return undef if $$tagInfo{SubDirectory};
527
+ # language code must normalized for use in tag ID
528
+ return Image::ExifTool::GetLangInfo($tagInfo, StandardLangCase($lang));
529
+ }
530
+
531
+ #------------------------------------------------------------------------------
532
+ # Found a PNG tag -- extract info from subdirectory or decompress data if necessary
533
+ # Inputs: 0) ExifTool object reference, 1) Pointer to tag table,
534
+ # 2) Tag ID, 3) Tag value, 4) [optional] compressed data flag:
535
+ # 0=not compressed, 1=unknown compression, 2-N=compression with type N-2
536
+ # 5) optional output buffer ref, 6) character encoding (tEXt/zTXt/iTXt only)
537
+ # 6) optional language code
538
+ # Returns: 1 on success
539
+ sub FoundPNG($$$$;$$$$)
540
+ {
541
+ my ($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, $enc, $lang) = @_;
542
+ return 0 unless defined $val;
543
+ my $verbose = $exifTool->Options('Verbose');
544
+ my $id = $tag; # generate tag ID which include language code
545
+ if ($lang) {
546
+ # case of language code must be normalized since they are case insensitive
547
+ $lang = StandardLangCase($lang);
548
+ $id .= '-' . $lang;
549
+ }
550
+ my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $id) ||
551
+ # (some software forgets to capitalize first letter)
552
+ $exifTool->GetTagInfo($tagTablePtr, ucfirst($id));
553
+ # create alternate language tag if necessary
554
+ if (not $tagInfo and $lang) {
555
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag) ||
556
+ $exifTool->GetTagInfo($tagTablePtr, ucfirst($tag));
557
+ $tagInfo = GetLangInfo($tagInfo, $lang) if $tagInfo;
558
+ }
559
+ #
560
+ # uncompress data if necessary
561
+ #
562
+ my ($wasCompressed, $deflateErr);
563
+ if ($compressed and $compressed > 1) {
564
+ if ($compressed == 2) { # Inflate/Deflate compression
565
+ if (eval 'require Compress::Zlib') {
566
+ my ($v2, $stat);
567
+ my $inflate = Compress::Zlib::inflateInit();
568
+ $inflate and ($v2, $stat) = $inflate->inflate($val);
569
+ if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
570
+ $val = $v2;
571
+ $compressed = 0;
572
+ $wasCompressed = 1;
573
+ } else {
574
+ $deflateErr = "Error inflating $tag";
575
+ }
576
+ } elsif (not $noCompressLib) {
577
+ $deflateErr = "Install Compress::Zlib to read compressed information";
578
+ } else {
579
+ $deflateErr = ''; # flag deflate error but no warning
580
+ }
581
+ } else {
582
+ $compressed -= 2;
583
+ $deflateErr = "Unknown compression method $compressed for $tag";
584
+ }
585
+ if ($compressed and $verbose and $tagInfo and $$tagInfo{SubDirectory}) {
586
+ $exifTool->VerboseDir("Unable to decompress $$tagInfo{Name}", 0, length($val));
587
+ }
588
+ # issue warning if relevant
589
+ if ($deflateErr and (not $outBuff or
590
+ ($tagInfo and $$tagInfo{SubDirectory} and $$exifTool{EDIT_DIRS}{$$tagInfo{Name}})))
591
+ {
592
+ $exifTool->Warn($deflateErr);
593
+ $noCompressLib = 1 if $deflateErr =~ /^Install/;
594
+ }
595
+ }
596
+ # translate character encoding if necessary (tEXt/zTXt/iTXt string values only)
597
+ if ($enc and not $compressed and not ($tagInfo and $$tagInfo{SubDirectory})) {
598
+ $val = $exifTool->Decode($val, $enc);
599
+ }
600
+ #
601
+ # extract information from subdirectory if available
602
+ #
603
+ if ($tagInfo) {
604
+ my $tagName = $$tagInfo{Name};
605
+ my $processed;
606
+ if ($$tagInfo{SubDirectory} and not $compressed) {
607
+ my $len = length $val;
608
+ if ($verbose and $exifTool->{INDENT} ne ' ') {
609
+ if ($wasCompressed and $verbose > 2) {
610
+ my $name = $tagName;
611
+ $wasCompressed and $name = "Decompressed $name";
612
+ $exifTool->VerboseDir($name, 0, $len);
613
+ $exifTool->VerboseDump(\$val);
614
+ }
615
+ # don't indent next directory (since it is really the same data)
616
+ $exifTool->{INDENT} =~ s/..$//;
617
+ }
618
+ my $subdir = $$tagInfo{SubDirectory};
619
+ my $processProc = $$subdir{ProcessProc};
620
+ # nothing more to do if writing and subdirectory is not writable
621
+ my $subTable = GetTagTable($$subdir{TagTable});
622
+ return 1 if $outBuff and not $$subTable{WRITE_PROC};
623
+ my %subdirInfo = (
624
+ DataPt => \$val,
625
+ DirStart => 0,
626
+ DataLen => $len,
627
+ DirLen => $len,
628
+ DirName => $tagName,
629
+ TagInfo => $tagInfo,
630
+ ReadOnly => 1, # (only used by WriteXMP)
631
+ OutBuff => $outBuff,
632
+ );
633
+ # no need to re-decompress if already done
634
+ undef $processProc if $wasCompressed and $processProc eq \&ProcessPNG_Compressed;
635
+ # rewrite this directory if necessary (but always process TextualData normally)
636
+ if ($outBuff and not $processProc and $subTable ne \%Image::ExifTool::PNG::TextualData) {
637
+ return 1 unless $exifTool->{EDIT_DIRS}->{$tagName};
638
+ $$outBuff = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
639
+ # if this was an XMP directory, we must make it read-only
640
+ $tagName eq 'XMP' and Image::ExifTool::XMP::ValidateXMP(\$outBuff,'r');
641
+ delete $exifTool->{ADD_DIRS}->{$tagName};
642
+ } else {
643
+ $processed = $exifTool->ProcessDirectory(\%subdirInfo, $subTable, $processProc);
644
+ }
645
+ $compressed = 1; # pretend this is compressed since it is binary data
646
+ }
647
+ if ($outBuff) {
648
+ my $writable = $tagInfo->{Writable};
649
+ my $isOverwriting;
650
+ if ($writable or ($$tagTablePtr{WRITABLE} and
651
+ not defined $writable and not $$tagInfo{SubDirectory}))
652
+ {
653
+ # write new value for this tag if necessary
654
+ my $newVal;
655
+ if ($exifTool->{DEL_GROUP}->{PNG}) {
656
+ # remove this tag now, but keep in ADD_PNG list to add back later
657
+ $isOverwriting = 1;
658
+ } else {
659
+ # remove this from the list of PNG tags to add
660
+ delete $exifTool->{ADD_PNG}->{$id};
661
+ # (also handle case of tEXt tags written with lowercase first letter)
662
+ delete $exifTool->{ADD_PNG}->{ucfirst($id)};
663
+ my $nvHash = $exifTool->GetNewValueHash($tagInfo);
664
+ $isOverwriting = $exifTool->IsOverwriting($nvHash);
665
+ if (defined $deflateErr) {
666
+ $newVal = $exifTool->GetNewValues($nvHash);
667
+ # can only write tag now if always overwriting
668
+ if ($isOverwriting > 0) {
669
+ $val = '<deflate error>';
670
+ } elsif ($isOverwriting) {
671
+ $isOverwriting = 0; # can't overwrite
672
+ $exifTool->Warn($deflateErr) if $deflateErr;
673
+ }
674
+ } else {
675
+ if ($isOverwriting < 0) {
676
+ $isOverwriting = $exifTool->IsOverwriting($nvHash, $val);
677
+ }
678
+ # (must get new value after IsOverwriting() in case it was shifted)
679
+ $newVal = $exifTool->GetNewValues($nvHash);
680
+ }
681
+ }
682
+ if ($isOverwriting) {
683
+ $$outBuff = (defined $newVal) ? $newVal : '';
684
+ ++$exifTool->{CHANGED};
685
+ $exifTool->VerboseValue("- PNG:$tagName", $val);
686
+ $exifTool->VerboseValue("+ PNG:$tagName", $newVal) if defined $newVal;
687
+ }
688
+ }
689
+ if (defined $$outBuff and length $$outBuff) {
690
+ if ($enc) { # must be tEXt/zTXt/iTXt if $enc is set
691
+ $$outBuff = BuildTextChunk($exifTool, $tag, $tagInfo, $$outBuff, $lang);
692
+ } elsif ($wasCompressed) {
693
+ # re-compress the output data
694
+ my $deflate;
695
+ if (eval 'require Compress::Zlib') {
696
+ my $deflate = Compress::Zlib::deflateInit();
697
+ if ($deflate) {
698
+ $$outBuff = $deflate->deflate($$outBuff);
699
+ $$outBuff .= $deflate->flush() if defined $$outBuff;
700
+ } else {
701
+ undef $$outBuff;
702
+ }
703
+ }
704
+ $$outBuff or $exifTool->Warn("PNG:$tagName not written (compress error)");
705
+ }
706
+ }
707
+ return 1;
708
+ }
709
+ return 1 if $processed;
710
+ } else {
711
+ my $name;
712
+ ($name = $tag) =~ s/\s+(.)/\u$1/g; # remove white space from tag name
713
+ $tagInfo = { Name => $name };
714
+ $$tagInfo{LangCode} = $lang if $lang;
715
+ # make unknown profiles binary data type
716
+ $$tagInfo{Binary} = 1 if $tag =~ /^Raw profile type /;
717
+ AddTagToTable($tagTablePtr, $tag, $tagInfo);
718
+ }
719
+ #
720
+ # store this tag information
721
+ #
722
+ if ($verbose) {
723
+ # temporarily remove subdirectory so it isn't printed in verbose information
724
+ # since we aren't decoding it anyway;
725
+ my $subdir = $$tagInfo{SubDirectory};
726
+ delete $$tagInfo{SubDirectory};
727
+ $exifTool->VerboseInfo($tag, $tagInfo,
728
+ Table => $tagTablePtr,
729
+ DataPt => \$val,
730
+ );
731
+ $$tagInfo{SubDirectory} = $subdir if $subdir;
732
+ }
733
+ # set the RawConv dynamically depending on whether this is binary or not
734
+ my $delRawConv;
735
+ if ($compressed and not defined $$tagInfo{ValueConv}) {
736
+ $$tagInfo{RawConv} = '\$val';
737
+ $delRawConv = 1;
738
+ }
739
+ $exifTool->FoundTag($tagInfo, $val);
740
+ delete $$tagInfo{RawConv} if $delRawConv;
741
+ return 1;
742
+ }
743
+
744
+ #------------------------------------------------------------------------------
745
+ # Process encoded PNG profile information
746
+ # Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
747
+ # Returns: 1 on success
748
+ sub ProcessProfile($$$)
749
+ {
750
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
751
+ my $dataPt = $$dirInfo{DataPt};
752
+ my $tagInfo = $$dirInfo{TagInfo};
753
+ my $outBuff = $$dirInfo{OutBuff};
754
+ my $tagName = $$tagInfo{Name};
755
+
756
+ # ImageMagick 5.3.6 writes profiles with the following headers:
757
+ # "\nICC Profile\n", "\nIPTC profile\n", "\n\xaa\x01{generic prof\n"
758
+ # and "\ngeneric profile\n"
759
+ return 0 unless $$dataPt =~ /^\n(.*?)\n\s*(\d+)\n(.*)/s;
760
+ my ($profileType, $len) = ($1, $2);
761
+ # data is encoded in hex, so change back to binary
762
+ my $buff = pack('H*', join('',split(' ',$3)));
763
+ my $actualLen = length $buff;
764
+ if ($len ne $actualLen) {
765
+ $exifTool->Warn("$tagName is wrong size (should be $len bytes but is $actualLen)");
766
+ $len = $actualLen;
767
+ }
768
+ my $verbose = $exifTool->Options('Verbose');
769
+ if ($verbose) {
770
+ if ($verbose > 2) {
771
+ $exifTool->VerboseDir("Decoded $tagName", 0, $len);
772
+ $exifTool->VerboseDump(\$buff);
773
+ }
774
+ # don't indent next directory (since it is really the same data)
775
+ $exifTool->{INDENT} =~ s/..$//;
776
+ }
777
+ my %dirInfo = (
778
+ Parent => 'PNG',
779
+ DataPt => \$buff,
780
+ DataLen => $len,
781
+ DirStart => 0,
782
+ DirLen => $len,
783
+ Base => 0,
784
+ OutFile => $outBuff,
785
+ );
786
+ my $processed = 0;
787
+ my $oldChanged = $exifTool->{CHANGED};
788
+ my $exifTable = GetTagTable('Image::ExifTool::Exif::Main');
789
+ my $editDirs = $exifTool->{EDIT_DIRS};
790
+ my $addDirs = $exifTool->{ADD_DIRS};
791
+ if ($tagTablePtr ne $exifTable) {
792
+ # process non-EXIF and non-APP1 profile as-is
793
+ if ($outBuff) {
794
+ # no need to rewrite this if not editing tags in this directory
795
+ my $dir = $tagName;
796
+ $dir =~ s/_Profile// unless $dir =~ /^ICC/;
797
+ return 1 unless $$editDirs{$dir};
798
+ $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
799
+ delete $$addDirs{$dir};
800
+ } else {
801
+ $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
802
+ }
803
+ } elsif ($buff =~ /^$Image::ExifTool::exifAPP1hdr/) {
804
+ # APP1 EXIF information
805
+ return 1 if $outBuff and not $$editDirs{IFD0};
806
+ my $hdrLen = length($Image::ExifTool::exifAPP1hdr);
807
+ $dirInfo{DirStart} += $hdrLen;
808
+ $dirInfo{DirLen} -= $hdrLen;
809
+ if ($outBuff) {
810
+ $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr,
811
+ \&Image::ExifTool::WriteTIFF);
812
+ $$outBuff = $Image::ExifTool::exifAPP1hdr . $$outBuff if $$outBuff;
813
+ delete $$addDirs{IFD0};
814
+ } else {
815
+ $processed = $exifTool->ProcessTIFF(\%dirInfo);
816
+ }
817
+ } elsif ($buff =~ /^$Image::ExifTool::xmpAPP1hdr/) {
818
+ # APP1 XMP information
819
+ my $hdrLen = length($Image::ExifTool::xmpAPP1hdr);
820
+ my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
821
+ $dirInfo{DirStart} += $hdrLen;
822
+ $dirInfo{DirLen} -= $hdrLen;
823
+ if ($outBuff) {
824
+ return 1 unless $$editDirs{XMP};
825
+ $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
826
+ $$outBuff and $$outBuff = $Image::ExifTool::xmpAPP1hdr . $$outBuff;
827
+ delete $$addDirs{XMP};
828
+ } else {
829
+ $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
830
+ }
831
+ } elsif ($buff =~ /^(MM\0\x2a|II\x2a\0)/) {
832
+ # TIFF information (haven't seen this, but what the heck...)
833
+ return 1 if $outBuff and not $$editDirs{IFD0};
834
+ if ($outBuff) {
835
+ $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr,
836
+ \&Image::ExifTool::WriteTIFF);
837
+ $$outBuff = $Image::ExifTool::exifAPP1hdr . $$outBuff if $$outBuff;
838
+ delete $$addDirs{IFD0};
839
+ } else {
840
+ $processed = $exifTool->ProcessTIFF(\%dirInfo);
841
+ }
842
+ } else {
843
+ my $profName = $profileType;
844
+ $profName =~ tr/\x00-\x1f\x7f-\xff/./;
845
+ $exifTool->Warn("Unknown raw profile '$profName'");
846
+ }
847
+ if ($outBuff and defined $$outBuff and length $$outBuff) {
848
+ if ($exifTool->{CHANGED} != $oldChanged) {
849
+ my $hdr = sprintf("\n%s\n%8d\n", $profileType, length($$outBuff));
850
+ # hex encode the data
851
+ $$outBuff = $hdr . HexEncode($outBuff);
852
+ } else {
853
+ undef $$outBuff;
854
+ }
855
+ }
856
+ return $processed;
857
+ }
858
+
859
+ #------------------------------------------------------------------------------
860
+ # Process PNG compressed zTXt or iCCP chunk
861
+ # Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
862
+ # Returns: 1 on success
863
+ # Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
864
+ sub ProcessPNG_Compressed($$$)
865
+ {
866
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
867
+ my ($tag, $val) = split /\0/, ${$$dirInfo{DataPt}}, 2;
868
+ return 0 unless defined $val;
869
+ # set compressed to 2 + compression method to decompress the data
870
+ my $compressed = 2 + unpack('C', $val);
871
+ my $hdr = $tag . "\0" . substr($val, 0, 1);
872
+ $val = substr($val, 1); # remove compression method byte
873
+ my $success;
874
+ my $outBuff = $$dirInfo{OutBuff};
875
+ # use the PNG chunk tag instead of the embedded tag name for iCCP chunks
876
+ if ($$dirInfo{TagInfo} and $$dirInfo{TagInfo}->{Name} eq 'ICC_Profile') {
877
+ $tag = 'iCCP';
878
+ $tagTablePtr = \%Image::ExifTool::PNG::Main;
879
+ $success = FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff);
880
+ $$outBuff = $hdr . $$outBuff if $outBuff and $$outBuff;
881
+ } else {
882
+ $success = FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'Latin');
883
+ }
884
+ return $success;
885
+ }
886
+
887
+ #------------------------------------------------------------------------------
888
+ # Process PNG tEXt chunk
889
+ # Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
890
+ # Returns: 1 on success
891
+ # Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
892
+ sub ProcessPNG_tEXt($$$)
893
+ {
894
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
895
+ my ($tag, $val) = split /\0/, ${$$dirInfo{DataPt}}, 2;
896
+ my $outBuff = $$dirInfo{OutBuff};
897
+ return FoundPNG($exifTool, $tagTablePtr, $tag, $val, undef, $outBuff, 'Latin');
898
+ }
899
+
900
+ #------------------------------------------------------------------------------
901
+ # Process PNG iTXt chunk
902
+ # Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
903
+ # Returns: 1 on success
904
+ # Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
905
+ sub ProcessPNG_iTXt($$$)
906
+ {
907
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
908
+ my ($tag, $dat) = split /\0/, ${$$dirInfo{DataPt}}, 2;
909
+ return 0 unless defined $dat and length($dat) >= 4;
910
+ my ($compressed, $meth) = unpack('CC', $dat);
911
+ my ($lang, $trans, $val) = split /\0/, substr($dat, 2), 3;
912
+ # set compressed flag so we will decompress it in FoundPNG()
913
+ $compressed and $compressed = 2 + $meth;
914
+ my $outBuff = $$dirInfo{OutBuff};
915
+ return FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'UTF8', $lang);
916
+ }
917
+
918
+ #------------------------------------------------------------------------------
919
+ # Extract meta information from a PNG image
920
+ # Inputs: 0) ExifTool object reference, 1) dirInfo reference
921
+ # Returns: 1 on success, 0 if this wasn't a valid PNG image, or -1 on write error
922
+ sub ProcessPNG($$)
923
+ {
924
+ my ($exifTool, $dirInfo) = @_;
925
+ my $outfile = $$dirInfo{OutFile};
926
+ my $raf = $$dirInfo{RAF};
927
+ my $datChunk = '';
928
+ my $datCount = 0;
929
+ my $datBytes = 0;
930
+ my ($sig, $err, $ok);
931
+
932
+ # check to be sure this is a valid PNG/MNG/JNG image
933
+ return 0 unless $raf->Read($sig,8) == 8 and $pngLookup{$sig};
934
+ if ($outfile) {
935
+ delete $$exifTool{TextChunkType};
936
+ Write($outfile, $sig) or $err = 1 if $outfile;
937
+ # can only add tags in Main and TextualData tables
938
+ $exifTool->{ADD_PNG} = $exifTool->GetNewTagInfoHash(
939
+ \%Image::ExifTool::PNG::Main,
940
+ \%Image::ExifTool::PNG::TextualData);
941
+ # initialize with same directories, with PNG tags taking priority
942
+ $exifTool->InitWriteDirs(\%pngMap,'PNG');
943
+ }
944
+ my ($fileType, $hdrChunk, $endChunk) = @{$pngLookup{$sig}};
945
+ $exifTool->SetFileType($fileType); # set the FileType tag
946
+ SetByteOrder('MM'); # PNG files are big-endian
947
+ my $tagTablePtr = GetTagTable('Image::ExifTool::PNG::Main');
948
+ my $mngTablePtr;
949
+ if ($fileType ne 'PNG') {
950
+ $mngTablePtr = GetTagTable('Image::ExifTool::MNG::Main');
951
+ }
952
+ my $verbose = $exifTool->Options('Verbose');
953
+ my $out = $exifTool->Options('TextOut');
954
+ my ($hbuf, $dbuf, $cbuf, $foundHdr);
955
+
956
+ # process the PNG/MNG/JNG chunks
957
+ undef $noCompressLib;
958
+ for (;;) {
959
+ $raf->Read($hbuf,8) == 8 or $exifTool->Warn("Truncated $fileType image"), last;
960
+ my ($len, $chunk) = unpack('Na4',$hbuf);
961
+ $len > 0x7fffffff and $exifTool->Warn("Invalid $fileType box size"), last;
962
+ if ($verbose) {
963
+ # don't dump image data chunks in verbose mode (only give count instead)
964
+ if ($datCount and $chunk ne $datChunk) {
965
+ my $s = $datCount > 1 ? 's' : '';
966
+ print $out "$fileType $datChunk ($datCount chunk$s, total $datBytes bytes)\n";
967
+ $datCount = $datBytes = 0;
968
+ $datChunk = '';
969
+ }
970
+ if ($chunk =~ /^(IDAT|JDAT|JDAA)$/) {
971
+ $datChunk = $chunk;
972
+ $datCount++;
973
+ $datBytes += $len;
974
+ }
975
+ }
976
+ if ($outfile) {
977
+ if ($chunk eq 'IEND') {
978
+ # add any new chunks immediately before the IEND chunk
979
+ AddChunks($exifTool, $outfile) or $err = 1;
980
+ } elsif ($chunk eq 'PLTE' or $chunk eq 'IDAT') {
981
+ # iCCP chunk must come before PLTE and IDAT
982
+ # (ignore errors -- will add later as text profile if this fails)
983
+ Add_iCCP($exifTool, $outfile);
984
+ }
985
+ }
986
+ if ($chunk eq $endChunk) {
987
+ if ($outfile) {
988
+ # copy over the rest of the file if necessary
989
+ Write($outfile, $hbuf) or $err = 1;
990
+ while ($raf->Read($hbuf, 65536)) {
991
+ Write($outfile, $hbuf) or $err = 1;
992
+ }
993
+ }
994
+ $verbose and print $out "$fileType $chunk (end of image)\n";
995
+ $ok = 1;
996
+ last;
997
+ }
998
+ # read chunk data and CRC
999
+ unless ($raf->Read($dbuf,$len)==$len and $raf->Read($cbuf, 4)==4) {
1000
+ $exifTool->Warn("Corrupted $fileType image");
1001
+ last;
1002
+ }
1003
+ unless ($foundHdr) {
1004
+ if ($chunk eq $hdrChunk) {
1005
+ $foundHdr = 1;
1006
+ } elsif ($hdrChunk eq 'IHDR' and $chunk eq 'CgBI') {
1007
+ $exifTool->Warn('Non-standard PNG image (Apple iPhone format)');
1008
+ } else {
1009
+ $exifTool->Warn("$fileType image did not start with $hdrChunk");
1010
+ last;
1011
+ }
1012
+ }
1013
+ if ($verbose) {
1014
+ # check CRC when in verbose mode (since we don't care about speed)
1015
+ my $crc = CalculateCRC(\$hbuf, undef, 4);
1016
+ $crc = CalculateCRC(\$dbuf, $crc);
1017
+ $crc == unpack('N',$cbuf) or $exifTool->Warn("Bad CRC for $chunk chunk");
1018
+ if ($datChunk) {
1019
+ Write($outfile, $hbuf, $dbuf, $cbuf) or $err = 1 if $outfile;
1020
+ next;
1021
+ }
1022
+ print $out "$fileType $chunk ($len bytes):\n";
1023
+ $exifTool->VerboseDump(\$dbuf, Addr => $raf->Tell() - $len - 4) if $verbose > 2;
1024
+ }
1025
+ # only extract information from chunks in our tables
1026
+ my ($theBuff, $outBuff);
1027
+ $outBuff = \$theBuff if $outfile;
1028
+ if ($$tagTablePtr{$chunk}) {
1029
+ FoundPNG($exifTool, $tagTablePtr, $chunk, $dbuf, undef, $outBuff);
1030
+ } elsif ($mngTablePtr and $$mngTablePtr{$chunk}) {
1031
+ FoundPNG($exifTool, $mngTablePtr, $chunk, $dbuf, undef, $outBuff);
1032
+ }
1033
+ if ($outfile) {
1034
+ if (defined $theBuff) {
1035
+ next unless length $theBuff; # empty if we deleted the information
1036
+ # change chunk type if necessary
1037
+ if ($$exifTool{TextChunkType}) {
1038
+ $chunk = $$exifTool{TextChunkType};
1039
+ delete $$exifTool{TextChunkType};
1040
+ }
1041
+ $hbuf = pack('Na4', length($theBuff), $chunk);
1042
+ $dbuf = $theBuff;
1043
+ my $crc = CalculateCRC(\$hbuf, undef, 4);
1044
+ $crc = CalculateCRC(\$dbuf, $crc);
1045
+ $cbuf = pack('N', $crc);
1046
+ }
1047
+ Write($outfile, $hbuf, $dbuf, $cbuf) or $err = 1;
1048
+ }
1049
+ }
1050
+ return -1 if $outfile and ($err or not $ok);
1051
+ return 1; # this was a valid PNG/MNG/JNG image
1052
+ }
1053
+
1054
+ 1; # end
1055
+
1056
+ __END__
1057
+
1058
+ =head1 NAME
1059
+
1060
+ Image::ExifTool::PNG - Read and write PNG meta information
1061
+
1062
+ =head1 SYNOPSIS
1063
+
1064
+ This module is used by Image::ExifTool
1065
+
1066
+ =head1 DESCRIPTION
1067
+
1068
+ This module contains routines required by Image::ExifTool to read and
1069
+ write PNG (Portable Network Graphics), MNG (Multi-image Network Graphics)
1070
+ and JNG (JPEG Network Graphics) images.
1071
+
1072
+ =head1 AUTHOR
1073
+
1074
+ Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
1075
+
1076
+ This library is free software; you can redistribute it and/or modify it
1077
+ under the same terms as Perl itself.
1078
+
1079
+ =head1 REFERENCES
1080
+
1081
+ =over 4
1082
+
1083
+ =item L<http://www.libpng.org/pub/png/spec/1.2/>
1084
+
1085
+ =item L<http://www.faqs.org/docs/png/>
1086
+
1087
+ =item L<http://www.libpng.org/pub/mng/>
1088
+
1089
+ =item L<http://www.libpng.org/pub/png/spec/register/>
1090
+
1091
+ =back
1092
+
1093
+ =head1 SEE ALSO
1094
+
1095
+ L<Image::ExifTool::TagNames/PNG Tags>,
1096
+ L<Image::ExifTool::TagNames/MNG Tags>,
1097
+ L<Image::ExifTool(3pm)|Image::ExifTool>
1098
+
1099
+ =cut
1100
+