From: Jan Schneider Date: Tue, 12 Oct 2010 13:38:39 +0000 (+0200) Subject: Cleanup, remove static usage. X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=710d056e6849dde87fe7f0fec7be7470b8aedabf;p=horde.git Cleanup, remove static usage. --- diff --git a/framework/Image/lib/Horde/Image/Exif/Bundled.php b/framework/Image/lib/Horde/Image/Exif/Bundled.php index ef1857d5a..de9fda2de 100644 --- a/framework/Image/lib/Horde/Image/Exif/Bundled.php +++ b/framework/Image/lib/Horde/Image/Exif/Bundled.php @@ -408,33 +408,38 @@ class Horde_Image_Exif_Bundled extends Horde_Image_Exif_Base switch ($tag_name) { case 'MakerNote': $make = Horde_String::lower($result['IFD0']['Make']); + $parser = null; if (strpos($make, 'nikon') !== false) { - Horde_Image_Exif_Parser_Nikon::parse($data, $result); + $parser = new Horde_Image_Exif_Parser_Nikon(); $result[$ifd_name]['KnownMaker'] = 1; } elseif (strpos($make, 'olympus') !== false) { - Horde_Image_Exif_Parser_Olympus::parse($data, $result, $seek, $globalOffset); + $parser = new Horde_Image_Exif_Parser_Olympus(); $result[$ifd_name]['KnownMaker'] = 1; } elseif (strpos($make, 'canon') !== false) { - Horde_Image_Exif_Parser_Canon::parse($data, $result, $seek, $globalOffset); + $parser = new Horde_Image_Exif_Parser_Canon(); $result[$ifd_name]['KnownMaker'] = 1; } elseif (strpos($make, 'fujifilm') !== false) { - Horde_Image_Exif_Parser_Fujifilm::parse($data, $result); + $parser = new Horde_Image_Exif_Parser_Fujifilm(); $result[$ifd_name]['KnownMaker'] = 1; } elseif (strpos($make, 'sanyo') !== false) { - Horde_Image_Exif_Parser_Sanyo::parse($data, $result, $seek, $globalOffset); + $parser = new Horde_Image_Exif_Parser_Sanyo(); $result[$ifd_name]['KnownMaker'] = 1; } elseif (strpos($make, 'panasonic') !== false) { - Horde_Image_Exif_Parser_Panasonic::parse($data, $result, $seek, $globalOffset); + $parser = new Horde_Image_Exif_Parser_Panasonic(); $result[$ifd_name]['KnownMaker'] = 1; } else { $result[$ifd_name]['KnownMaker'] = 0; } + if ($parser) { + $parser->parse($data, $result, $seek, $globalOffset); + } break; case 'GPSInfoOffset': $formated_data = $this->_formatData($type, $tag, $intel, $data); $result[$ifd_name]['GPSInfo'] = $formated_data; - Horde_Image_Exif_Parser_Gps::parse($data, $result, $formated_data, $seek, $globalOffset); + $parser = new Horde_Image_Exif_Parser_Gps(); + $parser->parse($data, $result, $formated_data, $seek, $globalOffset); break; default: diff --git a/framework/Image/lib/Horde/Image/Exif/Parser/Base.php b/framework/Image/lib/Horde/Image/Exif/Parser/Base.php index 9c887c2f2..529662637 100644 --- a/framework/Image/lib/Horde/Image/Exif/Parser/Base.php +++ b/framework/Image/lib/Horde/Image/Exif/Parser/Base.php @@ -1,8 +1,7 @@ + * @author Michael J. Rubinsky + * @author Jan Schneider * @category Horde - * @package Horde_Image + * @package Image */ /** - * Exifer - * Extracts EXIF information from digital photos. - * - * Copyright 2003 Jake Olefsky - * http://www.offsky.com/software/exif/index.php - * jake@olefsky.com + * Exifer + * Extracts EXIF information from digital photos. * - * Please see exif.php for the complete information about this software. + * Copyright © 2003 Jake Olefsky + * http://www.offsky.com/software/exif/index.php + * jake@olefsky.com * - * ------------ + * ------------ * - * This program is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. http://www.gnu.org/copyleft/gpl.html + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. http://www.gnu.org/copyleft/gpl.html */ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base { /** - *Looks up the name of the tag for the MakerNote (Depends on Manufacturer) + * Looks up the name of the tag for the MakerNote (Depends on Manufacturer) */ - static protected function _lookupTag($tag) + protected function _lookupTag($tag) { switch($tag) { case '0001': $tag = 'Settings 1'; break; @@ -42,7 +42,7 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base case '0009': $tag = 'OwnerName'; break; case '000c': $tag = 'CameraSerialNumber'; break; case '000f': $tag = 'CustomFunctions'; break; - default: $tag = sprintf(_("Unknown: (%s)"), $tag); break; + default: $tag = sprintf(_("Unknown: (%s)"), $tag); break; } return $tag; @@ -51,13 +51,17 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base /** * Formats Data for the data type */ - static protected function _formatData($type, $tag, $intel, $data, $exif, &$result) + protected function _formatData($type, $tag, $intel, $data, $exif, &$result) { $place = 0; - if ($type == 'ASCII') { + switch ($type) { + case 'ASCII': $result = $data = str_replace('\0', '', $data); - } elseif ($type == 'URATIONAL' || $type == 'SRATIONAL') { + break; + + case 'URATIONAL': + case 'SRATIONAL': $data = bin2hex($data); if ($intel == 1) { $data = Horde_Image_Exif::intel2Moto($data); @@ -72,20 +76,28 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base $data = $top . '/' . $bottom; } - if ($tag == '0204') { //DigitalZoom + if ($tag == '0204') { + //DigitalZoom $data = $data . 'x'; } - } elseif ($type == 'USHORT' || $type == 'SSHORT' || $type == 'ULONG' || - $type == 'SLONG' || $type == 'FLOAT' || $type == 'DOUBLE') { - + case 'USHORT': + case 'SSHORT': + case 'ULONG': + case 'SLONG': + case 'FLOAT': + case 'DOUBLE': $data = bin2hex($data); $result['RAWDATA'] = $data; - if ($tag == '0001') { //first chunk + // TODO: split this code up + switch ($tag) { + case '0001': + //first chunk $result['Bytes'] = hexdec(Horde_Image_Exif::intel2Moto(substr($data, $place, 4))); $place += 4; if ($result['Bytes'] != strlen($data) / 2) { - return $result; //Bad chunk + //Bad chunk + return $result; } $result['Macro'] = hexdec(Horde_Image_Exif::intel2Moto(substr($data, $place, 4))); $place += 4;//1 @@ -325,8 +337,10 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base default: $result['FocusMode'] = _("Unknown"); } } + break; - } elseif ($tag=='0004') { //second chunk + case '0004': + //second chunk $result['Bytes']=hexdec(Horde_Image_Exif::intel2Moto(substr($data, $place, 4))); $place += 4;//0 if ($result['Bytes'] != strlen($data) / 2) { @@ -424,38 +438,49 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base $result['SubjectDistance'] = hexdec(Horde_Image_Exif::intel2Moto(substr($data, $place, 4))); $place += 4;//19 $result['SubjectDistance'] .= '/100 m'; + break; - } elseif ($tag=='0008') { //image number + case '0008': + //image number if ($intel == 1) { $data = Horde_Image_Exif::intel2Moto($data); } $data = hexdec($data); $result = round($data / 10000) . '-' . $data % 10000; - } elseif ($tag == '000c') { //camera serial number + break; + + case '000c': + //camera serial number if ($intel == 1) { $data = Horde_Image_Exif::intel2Moto($data); } $data = hexdec($data); $result = '#' . bin2hex(substr($data, 0, 16)) . substr($data, 16, 16); + break; } + break; - } elseif ($type != 'UNDEFINED') { - $data = bin2hex($data); - if ($intel == 1) { - $data = Horde_Image_Exif::intel2Moto($data); + default: + if ($type != 'UNDEFINED') { + $data = bin2hex($data); + if ($intel == 1) { + $data = Horde_Image_Exif::intel2Moto($data); + } } + break; } return $data; } /** - * Cannon Special data section - * Useful: http://www.burren.cx/david/canon.html - * http://www.burren.cx/david/canon.html - * http://www.ozhiker.com/electronics/pjmt/jpeg_info/canon_mn.html + * Canon Special data section. + * + * @see http://www.burren.cx/david/canon.html + * @see http://www.burren.cx/david/canon.html + * @see http://www.ozhiker.com/electronics/pjmt/jpeg_info/canon_mn.html */ - static public function parse($block, &$result, $seek, $globalOffset) + public function parse($block, &$result, $seek, $globalOffset) { $place = 0; //current place if ($result['Endien'] == 'Intel') { @@ -476,13 +501,13 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base //loop thru all tags Each field is 12 bytes for ($i = 0; $i < hexdec($num); $i++) { - //2 byte tag + //2 byte tag $tag = bin2hex(substr($block, $place, 2)); $place += 2; if ($intel == 1) { $tag = Horde_Image_Exif::intel2Moto($tag); } - $tag_name = self::_lookupTag($tag); + $tag_name = $this->_lookupTag($tag); //2 byte type $type = bin2hex(substr($block, $place, 2)); @@ -490,7 +515,7 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base if ($intel == 1) { $type = Horde_Image_Exif::intel2Moto($type); } - self::_lookupType($type, $size); + $this->_lookupType($type, $size); //4 byte count of number of data units $count = bin2hex(substr($block, $place, 4)); @@ -504,7 +529,7 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base return; //if this value is 0 or less then we have read all the tags we can } - //4 byte value of data or pointer to data + //4 byte value of data or pointer to data $value = substr($block, $place, 4); $place += 4; @@ -515,7 +540,9 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base if ($intel == 1) { $value = Horde_Image_Exif::intel2Moto($value); } - $v = fseek($seek, $globalOffset+hexdec($value)); //offsets are from TIFF header which is 12 bytes from the start of the file + //offsets are from TIFF header which is 12 bytes from the start + //of the file + $v = fseek($seek, $globalOffset + hexdec($value)); $exiferFileSize = 0; if ($v == 0 && $bytesofdata < $exiferFileSize) { $data = fread($seek, $bytesofdata); @@ -526,11 +553,10 @@ class Horde_Image_Exif_Parser_Canon extends Horde_Image_Exif_Parser_Base $data = ''; } } - $result['SubIFD']['MakerNote'][$tag_name] = ''; // insure the index exists - $formated_data = self::_formatData($type, $tag, $intel, $data, $result, $result['SubIFD']['MakerNote'][$tag_name]); + // Ensure the index exists. + $result['SubIFD']['MakerNote'][$tag_name] = ''; + $formated_data = $this->_formatData($type, $tag, $intel, $data, $result, $result['SubIFD']['MakerNote'][$tag_name]); $result['SubIFD']['MakerNote'][$tag_name] = $formated_data; } - } - } diff --git a/framework/Image/lib/Horde/Image/Exif/Parser/Fujifilm.php b/framework/Image/lib/Horde/Image/Exif/Parser/Fujifilm.php index 3b7e92262..cf89f29f5 100644 --- a/framework/Image/lib/Horde/Image/Exif/Parser/Fujifilm.php +++ b/framework/Image/lib/Horde/Image/Exif/Parser/Fujifilm.php @@ -1,61 +1,59 @@ + * @author Michael J. Rubinsky + * @author Jan Schneider * @category Horde - * @package Horde_Image + * @package Image */ /** - * Exifer - * Extracts EXIF information from digital photos. + * Exifer + * Extracts EXIF information from digital photos. * - * Copyright � 2003 Jake Olefsky - * http://www.offsky.com/software/exif/index.php - * jake@olefsky.com + * Copyright © 2003 Jake Olefsky + * http://www.offsky.com/software/exif/index.php + * jake@olefsky.com * - * Please see exif.php for the complete information about this software. + * ------------ * - * ------------ + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * This program is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. http://www.gnu.org/copyleft/gpl.html + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. http://www.gnu.org/copyleft/gpl.html */ class Horde_Image_Exif_Parser_Fujifilm extends Horde_Image_Exif_Parser_Base { /** * Looks up the name of the tag for the MakerNote (Depends on Manufacturer) */ - static protected function _lookupTag($tag) { - + protected function _lookupTag($tag) + { switch($tag) { - case "0000": $tag = "Version";break; - case "1000": $tag = "Quality";break; - case "1001": $tag = "Sharpness";break; - case "1002": $tag = "WhiteBalance";break; - case "1003": $tag = "Color";break; - case "1004": $tag = "Tone";break; - case "1010": $tag = "FlashMode";break; - case "1011": $tag = "FlashStrength";break; - case "1020": $tag = "Macro";break; - case "1021": $tag = "FocusMode";break; - case "1030": $tag = "SlowSync";break; - case "1031": $tag = "PictureMode";break; - case "1032": $tag = "Unknown";break; - case "1100": $tag = "ContinuousTakingBracket";break; - case "1200": $tag = "Unknown";break; - case "1300": $tag = "BlurWarning";break; - case "1301": $tag = "FocusWarning";break; - case "1302": $tag = "AEWarning";break; - - default: $tag = "unknown:".$tag;break; + case '0000': return 'Version'; + case '1000': return 'Quality'; + case '1001': return 'Sharpness'; + case '1002': return 'WhiteBalance'; + case '1003': return 'Color'; + case '1004': return 'Tone'; + case '1010': return 'FlashMode'; + case '1011': return 'FlashStrength'; + case '1020': return 'Macro'; + case '1021': return 'FocusMode'; + case '1030': return 'SlowSync'; + case '1031': return 'PictureMode'; + case '1032': return 'Unknown'; + case '1100': return 'ContinuousTakingBracket'; + case '1200': return 'Unknown'; + case '1300': return 'BlurWarning'; + case '1301': return 'FocusWarning'; + case '1302': return 'AEWarning'; + default: return 'unknown:' . $tag; } - - return $tag; } /** @@ -66,121 +64,193 @@ class Horde_Image_Exif_Parser_Fujifilm extends Horde_Image_Exif_Parser_Base * @param $data * @return unknown_type */ - static protected function _formatData($type, $tag, $intel, $data) + protected function _formatData($type, $tag, $intel, $data) { - if($type=="ASCII") { - - - } else if($type=="URATIONAL" || $type=="SRATIONAL") { - $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; - - if($tag=="1011") { //FlashStrength - $data=$data." EV"; - } + switch ($type) { + case 'ASCII': + case 'UNDEFINED': + break; - } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { + case 'URATIONAL': + case 'SRATIONAL': $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - $data=hexdec($data); - - if($tag=="1001") { //Sharpness - if($data == 1) $data = _("Soft"); - else if($data == 2) $data = _("Soft"); - else if($data == 3) $data = _("Normal"); - else if($data == 4) $data = _("Hard"); - else if($data == 5) $data = _("Hard"); - else $data = _("Unknown").": ".$data; - } - if($tag=="1002") { //WhiteBalance - if($data == 0) $data = _("Auto"); - else if($data == 256) $data = _("Daylight"); - else if($data == 512) $data = _("Cloudy"); - else if($data == 768) $data = _("DaylightColor-fluorescence"); - else if($data == 769) $data = _("DaywhiteColor-fluorescence"); - else if($data == 770) $data = _("White-fluorescence"); - else if($data == 1024) $data = _("Incandescense"); - else if($data == 3840) $data = _("Custom"); - else $data = _("Unknown").": ".$data; - } - if($tag=="1003") { //Color - if($data == 0) $data = _("Chroma Saturation Normal(STD)"); - else if($data == 256) $data = _("Chroma Saturation High"); - else if($data == 512) $data = _("Chroma Saturation Low(ORG)"); - else $data = _("Unknown: ").$data; - } - if($tag=="1004") { //Tone - if($data == 0) $data = _("Contrast Normal(STD)"); - else if($data == 256) $data = _("Contrast High(HARD)"); - else if($data == 512) $data = _("Contrast Low(ORG)"); - else $data = _("Unknown: ").$data; - } - if($tag=="1010") { //FlashMode - if($data == 0) $data = _("Auto"); - else if($data == 1) $data = _("On"); - else if($data == 2) $data = _("Off"); - else if($data == 3) $data = _("Red-Eye Reduction"); - else $data = _("Unknown: ").$data; + if ($intel == 1) { + $data = Horde_Image_Exif::intel2Moto($data); } - if($tag=="1020") { //Macro - if($data == 0) $data = _("Off"); - else if($data == 1) $data = _("On"); - else $data = _("Unknown: ").$data; - } - if($tag=="1021") { //FocusMode - if($data == 0) $data = _("Auto"); - else if($data == 1) $data = _("Manual"); - else $data = _("Unknown: ").$data; - } - if($tag=="1030") { //SlowSync - if($data == 0) $data = _("Off"); - else if($data == 1) $data = _("On"); - else $data = _("Unknown: ").$data; - } - if($tag=="1031") { //PictureMode - if($data == 0) $data = _("Auto"); - else if($data == 1) $data = _("Portrait"); - else if($data == 2) $data = _("Landscape"); - else if($data == 4) $data = _("Sports"); - else if($data == 5) $data = _("Night"); - else if($data == 6) $data = _("Program AE"); - else if($data == 256) $data = _("Aperture Prority AE"); - else if($data == 512) $data = _("Shutter Priority"); - else if($data == 768) $data = _("Manual Exposure"); - else $data = _("Unknown: ").$data; - } - if($tag=="1100") { //ContinuousTakingBracket - if($data == 0) $data = _("Off"); - else if($data == 1) $data = _("On"); - else $data = _("Unknown: ").$data; - } - if($tag=="1300") { //BlurWarning - if($data == 0) $data = _("No Warning"); - else if($data == 1) $data = _("Warning"); - else $data = _("Unknown: ").$data; + $top = hexdec(substr($data, 8, 8)); + $bottom = hexdec(substr($data, 0, 8)); + if ($bottom) { + $data = $top / $bottom; + } elseif (!$top) { + $data = 0; + } else { + $data = $top . '/' . $bottom; } - if($tag=="1301") { //FocusWarning - if($data == 0) $data = _("Auto Focus Good"); - else if($data == 1) $data = _("Out of Focus"); - else $data = _("Unknown: ").$data; + + if ($tag == '1011') { + //FlashStrength + $data = $data . ' EV'; } - if($tag=="1302") { //AEWarning - if($data == 0) $data = _("AE Good"); - else if($data == 1) $data = _("Over Exposure"); - else $data = _("Unknown: ").$data; + break; + + case 'USHORT': + case 'SSHORT': + case 'ULONG': + case 'SLONG': + case 'FLOAT': + case 'DOUBLE': + $data = bin2hex($data); + if ($intel == 1) { + $data = Horde_Image_Exif::intel2Moto($data); } - } else if($type=="UNDEFINED") { + $data = hexdec($data); + + switch ($tag) { + case '1001': + //Sharpness + switch ($data) { + case 1: $data = _("Soft"); break; + case 2: $data = _("Soft"); break; + case 3: $data = _("Normal"); break; + case 4: $data = _("Hard"); break; + case 5: $data = _("Hard"); break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + + case '1002': + //WhiteBalance + switch ($data) { + case 0: $data = _("Auto"); break; + case 256: $data = _("Daylight"); break; + case 512: $data = _("Cloudy"); break; + case 768: $data = _("DaylightColor-fluorescence"); break; + case 769: $data = _("DaywhiteColor-fluorescence"); break; + case 770: $data = _("White-fluorescence"); break; + case 1024: $data = _("Incandescense"); break; + case 3840: $data = _("Custom"); break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + case '1003': + //Color + switch ($data) { + case 0: $data = _("Chroma Saturation Normal(STD)"); break; + case 256: $data = _("Chroma Saturation High"); break; + case 512: $data = _("Chroma Saturation Low(ORG)"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + case '1004': + //Tone + switch ($data) { + case 0: $data = _("Contrast Normal(STD)"); break; + case 256: $data = _("Contrast High(HARD)"); break; + case 512: $data = _("Contrast Low(ORG)"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; - } else { + case '1010': + //FlashMode + switch ($data) { + case 0: $data = _("Auto"); break; + case 1: $data = _("On"); break; + case 2: $data = _("Off"); break; + case 3: $data = _("Red-Eye Reduction"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + + case '1020': + //Macro + switch ($data) { + case 0: $data = _("Off"); break; + case 1: $data = _("On"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + + case '1021': + //FocusMode + switch ($data) { + case 0: $data = _("Auto"); break; + case 1: $data = _("Manual"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + + case '1030': + //SlowSync + switch ($data) { + case 0: $data = _("Off"); break; + case 1: $data = _("On"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + + case '1031': + //PictureMode + switch ($data) { + case 0: $data = _("Auto"); break; + case 1: $data = _("Portrait"); break; + case 2: $data = _("Landscape"); break; + case 4: $data = _("Sports"); break; + case 5: $data = _("Night"); break; + case 6: $data = _("Program AE"); break; + case 256: $data = _("Aperture Prority AE"); break; + case 512: $data = _("Shutter Priority"); break; + case 768: $data = _("Manual Exposure"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + + case '1100': + //ContinuousTakingBracket + switch ($data) { + case 0: $data = _("Off"); break; + case 1: $data = _("On"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + + case '1300': + //BlurWarning + switch ($data) { + case 0: $data = _("No Warning"); break; + case 1: $data = _("Warning"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + + case '1301': + //FocusWarning + switch ($data) { + case 0: $data = _("Auto Focus Good"); break; + case 1: $data = _("Out of Focus"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + + case '1302': + //AEWarning + switch ($data) { + case 0: $data = _("AE Good"); break; + case 1: $data = _("Over Exposure"); break; + default: $data = _("Unknown: ") . $data; break; + } + break; + } + break; + + default: $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); + if ($intel == 1) { + $data = Horde_Image_Exif::intel2Moto($data); + } + break; } return $data; @@ -192,58 +262,71 @@ class Horde_Image_Exif_Parser_Fujifilm extends Horde_Image_Exif_Parser_Base * @param $result * @return unknown_type */ - static public function parse($block, &$result) + public function parse($block, &$result) { - $intel=1; - + $intel = 1; $model = $result['IFD0']['Model']; - $place=8; //current place - $offset=8; - + //current place + $place = 8; + $offset = 8; - $num = bin2hex(substr($block,$place,4));$place+=4; - if($intel==1) $num = Horde_Image_Exif::intel2Moto($num); + $num = bin2hex(substr($block, $place, 4)); + $place += 4; + if ($intel == 1) { + $num = Horde_Image_Exif::intel2Moto($num); + } $result['SubIFD']['MakerNote']['Offset'] = hexdec($num); - //Get number of tags (2 bytes) - $num = bin2hex(substr($block,$place,2));$place+=2; - if($intel==1) $num = Horde_Image_Exif::intel2Moto($num); + //Get number of tags (2 bytes) + $num = bin2hex(substr($block, $place, 2)); + $place += 2; + if ($intel == 1) { + $num = Horde_Image_Exif::intel2Moto($num); + } $result['SubIFD']['MakerNote']['MakerNoteNumTags'] = hexdec($num); //loop thru all tags Each field is 12 bytes - for($i=0;$i_lookupTag($tag); - //4 byte count of number of data units - $count = bin2hex(substr($block,$place,4));$place+=4; - if($intel==1) $count = Horde_Image_Exif::intel2Moto($count); - $bytesofdata = $size*hexdec($count); + //2 byte type + $type = bin2hex(substr($block, $place, 2)); + $place += 2; + if ($intel == 1) { + $type = Horde_Image_Exif::intel2Moto($type); + } + $this->_lookupType($type, $size); - //4 byte value of data or pointer to data - $value = substr($block,$place,4);$place+=4; + //4 byte count of number of data units + $count = bin2hex(substr($block, $place, 4)); + $place += 4; + if ($intel == 1) { + $count = Horde_Image_Exif::intel2Moto($count); + } + $bytesofdata = $size * hexdec($count); + //4 byte value of data or pointer to data + $value = substr($block, $place, 4); + $place += 4; - if($bytesofdata<=4) { + if ($bytesofdata <= 4) { $data = $value; } else { $value = bin2hex($value); - if($intel==1) $value = Horde_Image_Exif::intel2Moto($value); - $data = substr($block,hexdec($value)-$offset,$bytesofdata*2); + if ($intel == 1) { + $value = Horde_Image_Exif::intel2Moto($value); + } + $data = substr($block, hexdec($value) - $offset, $bytesofdata * 2); } - $formated_data = self::_formatData($type,$tag,$intel,$data); + $formated_data = $this->_formatData($type, $tag, $intel, $data); $result['SubIFD']['MakerNote'][$tag_name] = $formated_data; } - } - -} \ No newline at end of file +} diff --git a/framework/Image/lib/Horde/Image/Exif/Parser/Gps.php b/framework/Image/lib/Horde/Image/Exif/Parser/Gps.php index 3c6e442ac..532f617f6 100644 --- a/framework/Image/lib/Horde/Image/Exif/Parser/Gps.php +++ b/framework/Image/lib/Horde/Image/Exif/Parser/Gps.php @@ -1,30 +1,31 @@ + * @author Michael J. Rubinsky + * @author Jan Schneider * @category Horde - * @package Horde_Image + * @package Image */ /** - Exifer - Extracts EXIF information from digital photos. - - Copyright © 2003 Jake Olefsky - http://www.offsky.com/software/exif/index.php - jake@olefsky.com - - Please see exif.php for the complete information about this software. - - ------------ - - This program is free software; you can redistribute it and/or modify it under the terms of - the GNU General Public License as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. http://www.gnu.org/copyleft/gpl.html -*/ + * Exifer + * Extracts EXIF information from digital photos. + * + * Copyright © 2003 Jake Olefsky + * http://www.offsky.com/software/exif/index.php + * jake@olefsky.com + * + * ------------ + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. http://www.gnu.org/copyleft/gpl.html + */ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base { /** @@ -33,55 +34,83 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base * @param unknown_type $tag * @return string */ - static protected function _lookupTag($tag) + protected function _lookupTag($tag) { switch($tag) { - case "0000": return "Version"; - case "0001": return "LatitudeRef"; //north or south - case "0002": return "Latitude"; //dd mm.mm or dd mm ss - case "0003": return "LongitudeRef"; //east or west - case "0004": return "Longitude"; //dd mm.mm or dd mm ss - case "0005": return "AltitudeRef"; //sea level or below sea level - case "0006": return "Altitude"; //positive rational number - case "0007": return "Time"; //three positive rational numbers - case "0008": return "Satellite"; //text string up to 999 bytes long - case "0009": return "ReceiveStatus"; //in progress or interop - case "000a": return "MeasurementMode"; //2D or 3D - case "000b": return "MeasurementPrecision"; //positive rational number - case "000c": return "SpeedUnit"; //KPH, MPH, knots - case "000d": return "ReceiverSpeed"; //positive rational number - case "000e": return "MovementDirectionRef"; //true or magnetic north - case "000f": return "MovementDirection"; //positive rational number - case "0010": return "ImageDirectionRef"; //true or magnetic north - case "0011": return "ImageDirection"; //positive rational number - case "0012": return "GeodeticSurveyData"; //text string up to 999 bytes long - case "0013": return "DestLatitudeRef"; //north or south - case "0014": return "DestinationLatitude"; //three positive rational numbers - case "0015": return "DestLongitudeRef"; //east or west - case "0016": return "DestinationLongitude"; //three positive rational numbers - case "0017": return "DestBearingRef"; //true or magnetic north - case "0018": return "DestinationBearing"; //positive rational number - case "0019": return "DestDistanceRef"; //km, miles, knots - case "001a": return "DestinationDistance"; //positive rational number - case "001b": return "ProcessingMethod"; - case "001c": return "AreaInformation"; - case "001d": return "Datestamp"; //text string 10 bytes long - case "001e": return "DifferentialCorrection"; //integer in range 0-65535 - default: return "unknown:".$tag; + case '0000': return 'Version'; + //north or south + case '0001': return 'LatitudeRef'; + //dd mm.mm or dd mm ss + case '0002': return 'Latitude'; + //east or west + case '0003': return 'LongitudeRef'; + //dd mm.mm or dd mm ss + case '0004': return 'Longitude'; + //sea level or below sea level + case '0005': return 'AltitudeRef'; + //positive rational number + case '0006': return 'Altitude'; + //three positive rational numbers + case '0007': return 'Time'; + //text string up to 999 bytes long + case '0008': return 'Satellite'; + //in progress or interop + case '0009': return 'ReceiveStatus'; + //2D or 3D + case '000a': return 'MeasurementMode'; + //positive rational number + case '000b': return 'MeasurementPrecision'; + //KPH, MPH, knots + case '000c': return 'SpeedUnit'; + //positive rational number + case '000d': return 'ReceiverSpeed'; + //true or magnetic north + case '000e': return 'MovementDirectionRef'; + //positive rational number + case '000f': return 'MovementDirection'; + //true or magnetic north + case '0010': return 'ImageDirectionRef'; + //positive rational number + case '0011': return 'ImageDirection'; + //text string up to 999 bytes long + case '0012': return 'GeodeticSurveyData'; + //north or south + case '0013': return 'DestLatitudeRef'; + //three positive rational numbers + case '0014': return 'DestinationLatitude'; + //east or west + case '0015': return 'DestLongitudeRef'; + //three positive rational numbers + case '0016': return 'DestinationLongitude'; + //true or magnetic north + case '0017': return 'DestBearingRef'; + //positive rational number + case '0018': return 'DestinationBearing'; + //km, miles, knots + case '0019': return 'DestDistanceRef'; + //positive rational number + case '001a': return 'DestinationDistance'; + case '001b': return 'ProcessingMethod'; + case '001c': return 'AreaInformation'; + //text string 10 bytes long + case '001d': return 'Datestamp'; + //integer in range 0-65535 + case '001e': return 'DifferentialCorrection'; + default: return 'unknown: ' . $tag; } - } /** * Formats a rational number */ - static protected function _rational($data, $intel) + protected function _rational($data, $intel) { - if ($intel == 1) { - $top = hexdec(substr($data, 8, 8)); //intel stores them bottom-top + //intel stores them bottom-top + $top = hexdec(substr($data, 8, 8)); } else { - $top = hexdec(substr($data, 0, 8)); //motorola stores them top-bottom + //motorola stores them top-bottom + $top = hexdec(substr($data, 0, 8)); } if ($intel == 1) { @@ -90,12 +119,12 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base $bottom = hexdec(substr($data, 8, 8)); } - if ($bottom!=0) { + if ($bottom != 0) { $data = $top / $bottom; } elseif ($top == 0) { $data = 0; } else { - $data = $top . "/" . $bottom; + $data = $top . '/' . $bottom; } return $data; @@ -104,23 +133,28 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base /** * Formats Data for the data type */ - static protected function _formatData($type, $tag, $intel, $data) + protected function _formatData($type, $tag, $intel, $data) { - - if($type == "ASCII") { + switch ($type) { + case 'ASCII': // Latitude Reference, Longitude Reference - if ($tag == "0001" || $tag == "0003") { + if ($tag == '0001' || $tag == '0003') { $data = ($data{1} == $data{2} && $data{1} == $data{3}) ? $data{0} : $data; } - } elseif ($type == "URATIONAL" || $type == "SRATIONAL") { + break; + + case 'URATIONAL': + case 'SRATIONAL': $data = bin2hex($data); - if ($intel ==1 ) { + if ($intel == 1) { $data = Horde_Image_Exif::intel2Moto($data); } if ($intel == 1) { - $top = hexdec(substr($data, 8, 8)); //intel stores them bottom-top + //intel stores them bottom-top + $top = hexdec(substr($data, 8, 8)); } else { - $top = hexdec(substr($data, 0, 8)); //motorola stores them top-bottom + //motorola stores them top-bottom + $top = hexdec(substr($data, 0, 8)); } if ($intel == 1) { @@ -129,70 +163,95 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base $bottom = hexdec(substr($data, 8, 8)); } - if ($type == "SRATIONAL" && $top > 2147483647) { - // make the number signed instead of unsigned + if ($type == 'SRATIONAL' && $top > 2147483647) { + // make the number signed instead of unsigned $top = $top - 4294967296; } - //Latitude, Longitude - if ($tag=="0002" || $tag=="0004") { + switch ($tag) { + case '0002': + case '0004': + //Latitude, Longitude if ($intel == 1) { - $seconds = self::_rational(substr($data, 0, 16), $intel); - $hour = self::_rational(substr($data, 32, 16), $intel); + $seconds = $this->_rational(substr($data, 0, 16), $intel); + $hour = $this->_rational(substr($data, 32, 16), $intel); } else { - $hour = self::_rational(substr($data, 0, 16), $intel); - $seconds = self::_rational(substr($data, 32, 16), $intel); + $hour = $this->_rational(substr($data, 0, 16), $intel); + $seconds = $this->_rational(substr($data, 32, 16), $intel); } - $minutes = self::_rational(substr($data, 16, 16), $intel); + $minutes = $this->_rational(substr($data, 16, 16), $intel); $data = array($hour, $minutes, $seconds); - } elseif ($tag == "0007") { //Time - $seconds = self::_rational(substr($data, 0, 16), $intel); - $minutes = self::_rational(substr($data, 16, 16), $intel); - $hour = self::_rational(substr($data, 32, 16), $intel); - $data = $hour . ":" . $minutes . ":" . $seconds; - } else { + break; + + case '0007': + //Time + $seconds = $this->_rational(substr($data, 0, 16), $intel); + $minutes = $this->_rational(substr($data, 16, 16), $intel); + $hour = $this->_rational(substr($data, 32, 16), $intel); + $data = $hour . ':' . $minutes . ':' . $seconds; + break; + + default: if ($bottom != 0) { $data = $top / $bottom; } elseif ($top == 0) { $data = 0; } else { - $data = $top . "/" . $bottom; + $data = $top . '/' . $bottom; } - if ($tag == "0006") { + if ($tag == '0006') { $data .= 'm'; } + break; } - } elseif ($type == "USHORT" || $type == "SSHORT" || $type == "ULONG" || - $type == "SLONG" || $type == "FLOAT" || $type == "DOUBLE") { + break; + case 'USHORT': + case 'SSHORT': + case 'ULONG': + case 'SLONG': + case 'FLOAT': + case 'DOUBLE': $data = bin2hex($data); if ($intel == 1) { $data = Horde_Image_Exif::intel2Moto($data); } $data = hexdec($data); - } elseif ($type == "UNDEFINED") { - } elseif ($type == "UBYTE") { + break; + + case 'UNDEFINED': + break; + + case 'UBYTE': $data = bin2hex($data); if ($intel == 1) { $num = Horde_Image_Exif::intel2Moto($data); } - if ($tag == "0000") { // VersionID - $data = hexdec(substr($data, 0, 2)) - . '.' . hexdec(substr($data, 2, 2)) - . '.' . hexdec(substr($data, 4, 2)) - . '.'. hexdec(substr($data, 6, 2)); - } elseif ($tag == "0005") { // Altitude Reference - if ($data == "00000000") { + switch ($tag) { + case '0000': + // VersionID + $data = hexdec(substr($data, 0, 2)) + . '.' . hexdec(substr($data, 2, 2)) + . '.' . hexdec(substr($data, 4, 2)) + . '.'. hexdec(substr($data, 6, 2)); + break; + case '0005': + // Altitude Reference + if ($data == '00000000') { $data = 'Above Sea Level'; - } elseif ($data == "01000000") { + } elseif ($data == '01000000') { $data = 'Below Sea Level'; } + break; } - } else { + break; + + default: $data = bin2hex($data); if ($intel == 1) { $data = Horde_Image_Exif::intel2Moto($data); } + break; } return $data; @@ -200,19 +259,20 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base /** * GPS Special data section - * Useful websites - * http://drewnoakes.com/code/exif/sampleOutput.html - * http://www.geosnapper.com + * + * @see http://drewnoakes.com/code/exif/sampleOutput.html + * @see http://www.geosnapper.com */ - static public function parse($block,&$result,$offset,$seek, $globalOffset) + public function parse($block, &$result, $offset, $seek, $globalOffset) { - if ($result['Endien'] == "Intel") { + if ($result['Endien'] == 'Intel') { $intel = 1; } else { $intel = 0; } - //offsets are from TIFF header which is 12 bytes from the start of the file + //offsets are from TIFF header which is 12 bytes from the start of the + //file $v = fseek($seek, $globalOffset + $offset); if ($v == -1) { $result['Errors'] = $result['Errors']++; @@ -235,7 +295,7 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base if ($intel == 1) { $tag = Horde_Image_Exif::intel2Moto($tag); } - $tag_name = self::_lookupTag($tag); + $tag_name = $this->_lookupTag($tag); //2 byte datatype $type = bin2hex(substr($block, $place, 2)); @@ -243,7 +303,7 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base if ($intel == 1) { $type = Horde_Image_Exif::intel2Moto($type); } - self::_lookupType($type, $size); + $this->_lookupType($type, $size); //4 byte number of elements $count = bin2hex(substr($block, $place, 4)); @@ -264,7 +324,8 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base if ($intel == 1) { $value = Horde_Image_Exif::intel2Moto($value); } - //offsets are from TIFF header which is 12 bytes from the start of the file + //offsets are from TIFF header which is 12 bytes from the start + //of the file $v = fseek($seek, $globalOffset + hexdec($value)); if ($v == 0) { $data = fread($seek, $bytesofdata); @@ -272,8 +333,7 @@ class Horde_Image_Exif_Parser_Gps extends Horde_Image_Exif_Parser_Base $result['Errors'] = $result['Errors']++; } } - $result['GPS' . $tag_name] = self::_formatData($type, $tag, $intel, $data); + $result['GPS' . $tag_name] = $this->_formatData($type, $tag, $intel, $data); } } - } diff --git a/framework/Image/lib/Horde/Image/Exif/Parser/Nikon.php b/framework/Image/lib/Horde/Image/Exif/Parser/Nikon.php index c87697f77..c7714aca7 100644 --- a/framework/Image/lib/Horde/Image/Exif/Parser/Nikon.php +++ b/framework/Image/lib/Horde/Image/Exif/Parser/Nikon.php @@ -1,30 +1,31 @@ + * @author Michael J. Rubinsky + * @author Jan Schneider * @category Horde - * @package Horde_Image + * @package Image */ -/* - Exifer - Extracts EXIF information from digital photos. - - Copyright � 2003 Jake Olefsky - http://www.offsky.com/software/exif/index.php - jake@olefsky.com - - Please see exif.php for the complete information about this software. - - ------------ - - This program is free software; you can redistribute it and/or modify it under the terms of - the GNU General Public License as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. http://www.gnu.org/copyleft/gpl.html -*/ +/** + * Exifer + * Extracts EXIF information from digital photos. + * + * Copyright © 2003 Jake Olefsky + * http://www.offsky.com/software/exif/index.php + * jake@olefsky.com + * + * ------------ + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. http://www.gnu.org/copyleft/gpl.html + */ class Horde_Image_Exif_Parser_Nikon extends Horde_Image_Exif_Parser_Base { /** @@ -33,52 +34,54 @@ class Horde_Image_Exif_Parser_Nikon extends Horde_Image_Exif_Parser_Base * @param $model * @return unknown_type */ - static protected function _lookupTag($tag,$model) + protected function _lookupTag($tag, $model) { - if($model==0) { + switch ($model) { + case 0: switch($tag) { - case "0003": $tag = "Quality";break; - case "0004": $tag = "ColorMode";break; - case "0005": $tag = "ImageAdjustment";break; - case "0006": $tag = "CCDSensitivity";break; - case "0007": $tag = "WhiteBalance";break; - case "0008": $tag = "Focus";break; - case "0009": $tag = "Unknown2";break; - case "000a": $tag = "DigitalZoom";break; - case "000b": $tag = "Converter";break; - - default: $tag = "unknown:".$tag;break; + case '0003': $tag = 'Quality'; break; + case '0004': $tag = 'ColorMode'; break; + case '0005': $tag = 'ImageAdjustment'; break; + case '0006': $tag = 'CCDSensitivity'; break; + case '0007': $tag = 'WhiteBalance'; break; + case '0008': $tag = 'Focus'; break; + case '0009': $tag = 'Unknown2'; break; + case '000a': $tag = 'DigitalZoom'; break; + case '000b': $tag = 'Converter'; break; + default: $tag = 'unknown: ' . $tag; break; } - } else if($model==1) { + break; + + case 1: switch($tag) { - case "0002": $tag = "ISOSetting";break; - case "0003": $tag = "ColorMode";break; - case "0004": $tag = "Quality";break; - case "0005": $tag = "Whitebalance";break; - case "0006": $tag = "ImageSharpening";break; - case "0007": $tag = "FocusMode";break; - case "0008": $tag = "FlashSetting";break; - case "0009": $tag = "FlashMode";break; - case "000b": $tag = "WhiteBalanceFine";break; - case "000f": $tag = "ISOSelection";break; - case "0013": $tag = "ISOSelection2";break; - case "0080": $tag = "ImageAdjustment";break; - case "0081": $tag = "ToneCompensation";break; - case "0082": $tag = "Adapter";break; - case "0083": $tag = "LensType";break; - case "0084": $tag = "LensInfo";break; - case "0085": $tag = "ManualFocusDistance";break; - case "0086": $tag = "DigitalZoom";break; - case "0087": $tag = "FlashUsed";break; - case "0088": $tag = "AFFocusPosition";break; - case "008d": $tag = "ColorMode";break; - case "0090": $tag = "LightType";break; - case "0094": $tag = "Saturation";break; - case "0095": $tag = "NoiseReduction";break; - case "0010": $tag = "DataDump";break; - - default: $tag = "unknown:".$tag;break; + case '0002': $tag = 'ISOSetting'; break; + case '0003': $tag = 'ColorMode'; break; + case '0004': $tag = 'Quality'; break; + case '0005': $tag = 'Whitebalance'; break; + case '0006': $tag = 'ImageSharpening'; break; + case '0007': $tag = 'FocusMode'; break; + case '0008': $tag = 'FlashSetting'; break; + case '0009': $tag = 'FlashMode'; break; + case '000b': $tag = 'WhiteBalanceFine'; break; + case '000f': $tag = 'ISOSelection'; break; + case '0013': $tag = 'ISOSelection2'; break; + case '0080': $tag = 'ImageAdjustment'; break; + case '0081': $tag = 'ToneCompensation'; break; + case '0082': $tag = 'Adapter'; break; + case '0083': $tag = 'LensType'; break; + case '0084': $tag = 'LensInfo'; break; + case '0085': $tag = 'ManualFocusDistance'; break; + case '0086': $tag = 'DigitalZoom'; break; + case '0087': $tag = 'FlashUsed'; break; + case '0088': $tag = 'AFFocusPosition'; break; + case '008d': $tag = 'ColorMode'; break; + case '0090': $tag = 'LightType'; break; + case '0094': $tag = 'Saturation'; break; + case '0095': $tag = 'NoiseReduction'; break; + case '0010': $tag = 'DataDump'; break; + default: $tag = 'unknown: ' . $tag; break; } + break; } return $tag; @@ -93,112 +96,186 @@ class Horde_Image_Exif_Parser_Nikon extends Horde_Image_Exif_Parser_Base * @param $data * @return unknown_type */ - static protected function _formatData($type,$tag,$intel,$model,$data) + protected function _formatData($type, $tag, $intel, $model, $data) { - if ($type != "ASCII" && ($type=="URATIONAL" || $type=="SRATIONAL")) { + switch ($type) { + case 'URATIONAL': + case 'SRATIONAL': $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; - - if($tag=="0085" && $model==1) { //ManualFocusDistance - $data=$data." m"; - } - if($tag=="0086" && $model==1) { //DigitalZoom - $data=$data."x"; + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); } - if($tag=="000a" && $model==0) { //DigitalZoom - $data=$data."x"; + $top = hexdec(substr($data, 8, 8)); + $bottom = hexdec(substr($data, 0, 8)); + if ($bottom != 0) { + $data = $top / $bottom; + } elseif ($top == 0) { + $data = 0; + } else { + $data = $top . '/' . $bottom; } - } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { - $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - $data=hexdec($data); - - if($tag=="0003" && $model==0) { //Quality - if($data == 1) $data = _("VGA Basic"); - else if($data == 2) $data = _("VGA Normal"); - else if($data == 3) $data = _("VGA Fine"); - else if($data == 4) $data = _("SXGA Basic"); - else if($data == 5) $data = _("SXGA Normal"); - else if($data == 6) $data = _("SXGA Fine"); - else $data = _("Unknown").": ".$data; + + if ($tag == '0085' && $model == 1) { + //ManualFocusDistance + $data = $data . ' m'; } - if($tag=="0004" && $model==0) { //Color - if($data == 1) $data = _("Color"); - else if($data == 2) $data = _("Monochrome"); - else $data = _("Unknown").": ".$data; + if ($tag == '0086' && $model == 1) { + //DigitalZoom + $data = $data . 'x'; } - if($tag=="0005" && $model==0) { //Image Adjustment - if($data == 0) $data = _("Normal"); - else if($data == 1) $data = _("Bright+"); - else if($data == 2) $data = _("Bright-"); - else if($data == 3) $data = _("Contrast+"); - else if($data == 4) $data = _("Contrast-"); - else $data = _("Unknown").": ".$data; + if ($tag == '000a' && $model == 0) { + //DigitalZoom + $data = $data . 'x'; } - if($tag=="0006" && $model==0) { //CCD Sensitivity - if($data == 0) $data = "ISO-80"; - else if($data == 2) $data = "ISO-160"; - else if($data == 4) $data = "ISO-320"; - else if($data == 5) $data = "ISO-100"; - else $data = _("Unknown").": ".$data; + break; + + case 'USHORT': + case 'SSHORT': + case 'ULONG': + case 'SLONG': + case 'FLOAT': + case 'DOUBLE': + $data = bin2hex($data); + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); } - if($tag=="0007" && $model==0) { //White Balance - if($data == 0) $data = _("Auto"); - else if($data == 1) $data = _("Preset"); - else if($data == 2) $data = _("Daylight"); - else if($data == 3) $data = _("Incandescense"); - else if($data == 4) $data = _("Flourescence"); - else if($data == 5) $data = _("Cloudy"); - else if($data == 6) $data = _("SpeedLight"); - else $data = _("Unknown").": ".$data; + $data = hexdec($data); + if ($model != 0) { + break; } - if($tag=="000b" && $model==0) { //Converter - if($data == 0) $data = _("None"); - else if($data == 1) $data = _("Fisheye"); - else $data = _("Unknown").": ".$data; + + switch ($tag) { + case '0003': + //Quality + switch ($data) { + case 1: $data = _("VGA Basic"); break; + case 2: $data = _("VGA Normal"); break; + case 3: $data = _("VGA Fine"); break; + case 4: $data = _("SXGA Basic"); break; + case 5: $data = _("SXGA Normal"); break; + case 6: $data = _("SXGA Fine"); break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + + case '0004': + //Color + switch ($data) { + case 1: $data = _("Color"); break; + case 2: $data = _("Monochrome"); break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + + case '0005': + //Image Adjustment + switch ($data) { + case 0: $data = _("Normal"); break; + case 1: $data = _("Bright+"); break; + case 2: $data = _("Bright-"); break; + case 3: $data = _("Contrast+"); break; + case 4: $data = _("Contrast-"); break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + + case '0006': + //CCD Sensitivity + switch ($data) { + case 0: $data = 'ISO-80'; break; + case 2: $data = 'ISO-160'; break; + case 4: $data = 'ISO-320'; break; + case 5: $data = 'ISO-100'; break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + + case '0007': + //White Balance + switch ($data) { + case 0: $data = _("Auto"); break; + case 1: $data = _("Preset"); break; + case 2: $data = _("Daylight"); break; + case 3: $data = _("Incandescense"); break; + case 4: $data = _("Flourescence"); break; + case 5: $data = _("Cloudy"); break; + case 6: $data = _("SpeedLight"); break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + + case '000b': + //Converter + switch ($data) { + case 0: $data = _("None"); break; + case 1: $data = _("Fisheye"); break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; } - } else if($type=="UNDEFINED") { - if($tag=="0001" && $model==1) { //Unknown (Version?) - $data=$data/100; + case 'UNDEFINED': + if ($model != 1) { + break; } - if($tag=="0088" && $model==1) { //AF Focus Position + + switch ($tag) { + case '0001': + $data = $data/100; + break; + case '0088': + //AF Focus Position $temp = _("Center"); $data = bin2hex($data); - $data = str_replace("01","Top",$data); - $data = str_replace("02","Bottom",$data); - $data = str_replace("03","Left",$data); - $data = str_replace("04","Right",$data); - $data = str_replace("00","",$data); - if(strlen($data)==0) $data = $temp; + $data = str_replace('01', 'Top', $data); + $data = str_replace('02', 'Bottom', $data); + $data = str_replace('03', 'Left', $data); + $data = str_replace('04', 'Right', $data); + $data = str_replace('00', '', $data); + if (!strlen($data)) { + $data = $temp; + } + break; } + break; - } else { + default: $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - - if($tag=="0083" && $model==1) { //Lens Type - $data = hexdec(substr($data,0,2)); - if($data == 0) $data = _("AF non D"); - else if($data == 1) $data = _("Manual"); - else if($data == 2) $data = "AF-D or AF-S"; - else if($data == 6) $data = "AF-D G"; - else if($data == 10) $data = "AF-D VR"; - else $data = _("Unknown").": ".$data; + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); } - if($tag=="0087" && $model==1) { //Flash type - $data = hexdec(substr($data,0,2)); - if($data == 0) $data = _("Did Not Fire"); - else if($data == 4) $data = _("Unknown"); - else if($data == 7) $data = _("External"); - else if($data == 9) $data = _("On Camera"); - else $data = _("Unknown").": ".$data; + if ($model != 1) { + break; } + + switch ($tag) { + case '0083': + //Lens Type + $data = hexdec(substr($data, 0, 2)); + switch ($data) { + case 0: $data = _("AF non D"); break; + case 1: $data = _("Manual"); break; + case 2: $data = 'AF-D or AF-S'; break; + case 6: $data = 'AF-D G'; break; + case 10: $data = 'AF-D VR'; break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + + case '0087': + //Flash type + $data = hexdec(substr($data,0,2)); + switch ($data) { + case 0: $data = _("Did Not Fire"); break; + case 4: $data = _("Unknown"); break; + case 7: $data = _("External"); break; + case 9: $data = _("On Camera"); break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + } + + break; } return $data; @@ -210,108 +287,151 @@ class Horde_Image_Exif_Parser_Nikon extends Horde_Image_Exif_Parser_Base * @param $result * @return unknown_type */ - static public function parse($block,&$result) + public function parse($block, &$result) { - if($result['Endien']=="Intel") $intel=1; - else $intel=0; - + $intel = $result['Endien'] == 'Intel'; $model = $result['IFD0']['Model']; //these 6 models start with "Nikon". Other models dont. - if($model=="E700\0" || $model=="E800\0" || $model=="E900\0" || $model=="E900S\0" || $model=="E910\0" || $model=="E950\0") { - $place=8; //current place + if ($model == "E700\0" || + $model == "E800\0" || + $model == "E900\0" || + $model == "E900S\0" || + $model == "E910\0" || + $model == "E950\0") { + //current place + $place = 8; $model = 0; //Get number of tags (2 bytes) - $num = bin2hex(substr($block,$place,2));$place+=2; - if($intel==1) $num = Horde_Image_Exif::intel2Moto($num); + $num = bin2hex(substr($block, $place, 2)); + $place += 2; + if ($intel) { + $num = Horde_Image_Exif::intel2Moto($num); + } $result['SubIFD']['MakerNote']['MakerNoteNumTags'] = hexdec($num); //loop thru all tags Each field is 12 bytes - for($i=0;$i_lookupTag($tag, $model); //2 byte type - $type = bin2hex(substr($block,$place,2));$place+=2; - if($intel==1) $type = Horde_Image_Exif::intel2Moto($type); - self::_lookupType($type,$size); + $type = bin2hex(substr($block, $place, 2)); + $place += 2; + if ($intel) { + $type = Horde_Image_Exif::intel2Moto($type); + } + $this->_lookupType($type, $size); //4 byte count of number of data units - $count = bin2hex(substr($block,$place,4));$place+=4; - if($intel==1) $count = Horde_Image_Exif::intel2Moto($count); - $bytesofdata = $size*hexdec($count); + $count = bin2hex(substr($block, $place, 4)); + $place += 4; + if ($intel) { + $count = Horde_Image_Exif::intel2Moto($count); + } + $bytesofdata = $size * hexdec($count); //4 byte value of data or pointer to data - $value = substr($block,$place,4);$place+=4; + $value = substr($block, $place, 4); + $place += 4; //if tag is 0002 then its the ASCII value which we know is at 140 so calc offset //THIS HACK ONLY WORKS WITH EARLY NIKON MODELS - if($tag=="0002") $offset = hexdec($value)-140; - if($bytesofdata<=4) { + if ($tag == '0002') { + $offset = hexdec($value) - 140; + } + if ($bytesofdata <= 4) { $data = $value; } else { $value = bin2hex($value); - if($intel==1) $value = Horde_Image_Exif::intel2Moto($value); - $data = substr($block,hexdec($value)-$offset,$bytesofdata*2); + if ($intel) { + $value = Horde_Image_Exif::intel2Moto($value); + } + $data = substr($block, hexdec($value) - $offset, $bytesofdata * 2); } - $formated_data = self::_formatData($type,$tag,$intel,$model,$data); + $formated_data = $this->_formatData($type, $tag, $intel, $model, $data); $result['SubIFD']['MakerNote'][$tag_name] = $formated_data; } - } else { - $place=0;//current place + //current place + $place = 0; $model = 1; - $nikon = substr($block,$place,8);$place+=8; - $endien = substr($block,$place,4);$place+=4; + $nikon = substr($block, $place, 8); + $place += 8; + $endien = substr($block, $place, 4); + $place += 4; //2 bytes of 0x002a - $tag = bin2hex(substr($block,$place,2));$place+=2; - - //Then 4 bytes of offset to IFD0 (usually 8 which includes all 8 bytes of TIFF header) - $offset = bin2hex(substr($block,$place,4));$place+=4; - if($intel==1) $offset = Horde_Image_Exif::intel2Moto($offset); - if(hexdec($offset)>8) $place+=$offset-8; + $tag = bin2hex(substr($block, $place, 2)); + $place += 2; + + //Then 4 bytes of offset to IFD0 (usually 8 which includes all 8 + //bytes of TIFF header) + $offset = bin2hex(substr($block, $place, 4)); + $place += 4; + if ($intel) { + $offset = Horde_Image_Exif::intel2Moto($offset); + } + if (hexdec($offset) > 8) { + $place += $offset - 8; + } //Get number of tags (2 bytes) - $num = bin2hex(substr($block,$place,2));$place+=2; - if($intel==1) $num = Horde_Image_Exif::intel2Moto($num); + $num = bin2hex(substr($block, $place, 2)); + $place += 2; + if ($intel) { + $num = Horde_Image_Exif::intel2Moto($num); + } //loop thru all tags Each field is 12 bytes - for($i=0;$i_lookupTag($tag, $model); //2 byte type - $type = bin2hex(substr($block,$place,2));$place+=2; - if($intel==1) $type = Horde_Image_Exif::intel2Moto($type); - self::_lookupType($type,$size); + $type = bin2hex(substr($block, $place, 2)); + $place += 2; + if ($intel) { + $type = Horde_Image_Exif::intel2Moto($type); + } + $this->_lookupType($type, $size); //4 byte count of number of data units - $count = bin2hex(substr($block,$place,4));$place+=4; - if($intel==1) $count = Horde_Image_Exif::intel2Moto($count); - $bytesofdata = $size*hexdec($count); + $count = bin2hex(substr($block, $place, 4)); + $place += 4; + if ($intel) { + $count = Horde_Image_Exif::intel2Moto($count); + } + $bytesofdata = $size * hexdec($count); //4 byte value of data or pointer to data - $value = substr($block,$place,4);$place+=4; + $value = substr($block, $place, 4); + $place += 4; - if($bytesofdata<=4) { + if ($bytesofdata <= 4) { $data = $value; } else { $value = bin2hex($value); - if($intel==1) $value = Horde_Image_Exif::intel2Moto($value); - $data = substr($block,hexdec($value)+hexdec($offset)+2,$bytesofdata); + if ($intel) { + $value = Horde_Image_Exif::intel2Moto($value); + } + $data = substr($block, hexdec($value) + hexdec($offset) + 2, $bytesofdata); } - $formated_data = self::_formatData($type,$tag,$intel,$model,$data); + $formated_data = $this->_formatData($type, $tag, $intel, $model, $data); $result['SubIFD']['MakerNote'][$tag_name] = $formated_data; } } - } - } \ No newline at end of file diff --git a/framework/Image/lib/Horde/Image/Exif/Parser/Olympus.php b/framework/Image/lib/Horde/Image/Exif/Parser/Olympus.php index 5da09e18b..4e633f54f 100644 --- a/framework/Image/lib/Horde/Image/Exif/Parser/Olympus.php +++ b/framework/Image/lib/Horde/Image/Exif/Parser/Olympus.php @@ -1,30 +1,31 @@ + * @author Michael J. Rubinsky + * @author Jan Schneider * @category Horde - * @package Horde_Image + * @package Image */ -/* - Exifer - Extracts EXIF information from digital photos. - - Copyright � 2003 Jake Olefsky - http://www.offsky.com/software/exif/index.php - jake@olefsky.com - - Please see exif.php for the complete information about this software. - - ------------ - - This program is free software; you can redistribute it and/or modify it under the terms of - the GNU General Public License as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. http://www.gnu.org/copyleft/gpl.html -*/ +/** + * Exifer + * Extracts EXIF information from digital photos. + * + * Copyright © 2003 Jake Olefsky + * http://www.offsky.com/software/exif/index.php + * jake@olefsky.com + * + * ------------ + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. http://www.gnu.org/copyleft/gpl.html + */ class Horde_Image_Exif_Parser_Olympus extends Horde_Image_Exif_Parser_Base { /** @@ -32,22 +33,21 @@ class Horde_Image_Exif_Parser_Olympus extends Horde_Image_Exif_Parser_Base * @param $tag * @return unknown_type */ - static protected function _lookupTag($tag) + protected function _lookupTag($tag) { switch($tag) { - case "0200": $tag = "SpecialMode";break; - case "0201": $tag = "JpegQual";break; - case "0202": $tag = "Macro";break; - case "0203": $tag = "Unknown1";break; - case "0204": $tag = "DigiZoom";break; - case "0205": $tag = "Unknown2";break; - case "0206": $tag = "Unknown3";break; - case "0207": $tag = "SoftwareRelease";break; - case "0208": $tag = "PictInfo";break; - case "0209": $tag = "CameraID";break; - case "0f00": $tag = "DataDump";break; - - default: $tag = "unknown:".$tag;break; + case '0200': $tag = 'SpecialMode'; break; + case '0201': $tag = 'JpegQual'; break; + case '0202': $tag = 'Macro'; break; + case '0203': $tag = 'Unknown1'; break; + case '0204': $tag = 'DigiZoom'; break; + case '0205': $tag = 'Unknown2'; break; + case '0206': $tag = 'Unknown3'; break; + case '0207': $tag = 'SoftwareRelease'; break; + case '0208': $tag = 'PictInfo'; break; + case '0209': $tag = 'CameraID'; break; + case '0f00': $tag = 'DataDump'; break; + default: $tag = 'unknown: ' . $tag; break; } return $tag; @@ -61,46 +61,80 @@ class Horde_Image_Exif_Parser_Olympus extends Horde_Image_Exif_Parser_Base * @param $data * @return unknown_type */ - static protected function _formatData($type,$tag,$intel,$data) + protected function _formatData($type, $tag, $intel, $data) { - if($type=="ASCII") { + switch ($type) { + case 'ASCII': + case 'UNDEFINED': + break; - } else if($type=="URATIONAL" || $type=="SRATIONAL") { + case 'URATIONAL': + case 'SRATIONAL': $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; - - if($tag=="0204") { //DigitalZoom - $data=$data."x"; + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); } - if($tag=="0205") { //Unknown2 - $data=$top."/".$bottom; + $top = hexdec(substr($data, 8, 8)); + $bottom = hexdec(substr($data, 0, 8)); + if ($bottom) { + $data = $top / $bottom; + } elseif (!$top) { + $data = 0; + } else { + $data = $top . '/' . $bottom; } - } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { + + switch ($tag) { + case '0204': + //DigitalZoom + $data .= 'x'; + break; + case '0205': + //Unknown2 + $data = $top . '/' . $bottom; + break; + } + break; + + case 'USHORT': + case 'SSHORT': + case 'ULONG': + case 'SLONG': + case 'FLOAT': + case 'DOUBLE': $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - $data=hexdec($data); - - if($tag=="0201") { //JPEGQuality - if($data == 1) $data = "SQ"; - else if($data == 2) $data = "HQ"; - else if($data == 3) $data = "SHQ"; - else $data = _("Unknown").": ".$data; + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); } - if($tag=="0202") { //Macro - if($data == 0) $data = "Normal"; - else if($data == 1) $data = "Macro"; - else $data = _("Unknown").": ".$data; + $data = hexdec($data); + + switch ($tag) { + case '0201': + //JPEGQuality + switch ($data) { + case 1: $data = 'SQ'; break; + case 2: $data = 'HQ'; break; + case 3: $data = 'SHQ'; break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; + case '0202': + //Macro + switch ($data) { + case 0: $data = 'Normal'; break; + case 1: $data = 'Macro'; break; + default: $data = _("Unknown") . ': ' . $data; break; + } + break; } - } else if($type=="UNDEFINED") { + break; - } else { + default: $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); + } + break; } return $data; @@ -114,21 +148,19 @@ class Horde_Image_Exif_Parser_Olympus extends Horde_Image_Exif_Parser_Base * @param $globalOffset * @return unknown_type */ - static public function parse($block, &$result, $seek, $globalOffset) + public function parse($block, &$result, $seek, $globalOffset) { - if($result['Endien']=="Intel") $intel = 1; - else $intel = 0; - + $intel = $result['Endien']=='Intel'; $model = $result['IFD0']['Model']; - // New header for new DSLRs - Check for it because the - // number of bytes that count the IFD fields differ in each case. - // Fixed by Zenphoto 2/24/08 + // New header for new DSLRs - Check for it because the number of bytes + // that count the IFD fields differ in each case. Fixed by Zenphoto + // 2/24/08 $new = false; if (substr($block, 0, 8) == "OLYMPUS\x00") { $new = true; - } else if (substr($block, 0, 7) == "OLYMP\x00\x01" - || substr($block, 0, 7) == "OLYMP\x00\x02") { + } elseif (substr($block, 0, 7) == "OLYMP\x00\x01" || + substr($block, 0, 7) == "OLYMP\x00\x02") { $new = false; } else { // Header does not match known Olympus headers. @@ -142,50 +174,61 @@ class Horde_Image_Exif_Parser_Olympus extends Horde_Image_Exif_Parser_Base // Get number of tags (1 or 2 bytes, depending on New or Old makernote) $countfieldbits = $new ? 1 : 2; - // New makernote repeats 1-byte value twice, so increment $place by 2 in either case. - $num = bin2hex(substr($block, $place, $countfieldbits)); $place += 2; - if ($intel == 1) $num = Horde_Image_Exif::intel2Moto($num); + // New makernote repeats 1-byte value twice, so increment $place by 2 + // in either case. + $num = bin2hex(substr($block, $place, $countfieldbits)); + $place += 2; + if ($intel) { + $num = Horde_Image_Exif::intel2Moto($num); + } $ntags = hexdec($num); $result['SubIFD']['MakerNote']['MakerNoteNumTags'] = $ntags; //loop thru all tags Each field is 12 bytes - for($i=0; $i < $ntags; $i++) { + for ($i = 0; $i < $ntags; $i++) { //2 byte tag - $tag = bin2hex(substr($block, $place,2)); + $tag = bin2hex(substr($block, $place, 2)); $place += 2; - if ($intel == 1) $tag = Horde_Image_Exif::intel2Moto($tag); - $tag_name = self::_lookupTag($tag); + if ($intel) { + $tag = Horde_Image_Exif::intel2Moto($tag); + } + $tag_name = $this->_lookupTag($tag); //2 byte type - $type = bin2hex(substr($block, $place,2)); + $type = bin2hex(substr($block, $place, 2)); $place += 2; - if ($intel == 1) $type = Horde_Image_Exif::intel2Moto($type); - self::_lookupType($type,$size); + if ($intel) { + $type = Horde_Image_Exif::intel2Moto($type); + } + $this->_lookupType($type, $size); //4 byte count of number of data units - $count = bin2hex(substr($block, $place,4)); - $place+=4; - if ($intel == 1) $count = Horde_Image_Exif::intel2Moto($count); + $count = bin2hex(substr($block, $place, 4)); + $place += 4; + if ($intel) { + $count = Horde_Image_Exif::intel2Moto($count); + } $bytesofdata = $size * hexdec($count); //4 byte value of data or pointer to data - $value = substr($block, $place,4); + $value = substr($block, $place, 4); $place += 4; - if ($bytesofdata <= 4) { $data = $value; } else { $value = bin2hex($value); - if($intel==1) $value = Horde_Image_Exif::intel2Moto($value); - $v = fseek($seek,$globalOffset+hexdec($value)); //offsets are from TIFF header which is 12 bytes from the start of the file + if ($intel) { + $value = Horde_Image_Exif::intel2Moto($value); + } + //offsets are from TIFF header which is 12 bytes from the start + //of the file + $v = fseek($seek, $globalOffset + hexdec($value)); $result['Errors'] = $result['Errors']++; $data = ''; - } - $formated_data = self::_formatData($type,$tag,$intel,$data); + $formated_data = $this->_formatData($type, $tag, $intel, $data); $result['SubIFD']['MakerNote'][$tag_name] = $formated_data; } } - } \ No newline at end of file diff --git a/framework/Image/lib/Horde/Image/Exif/Parser/Panasonic.php b/framework/Image/lib/Horde/Image/Exif/Parser/Panasonic.php index 4887a39bd..b2167bf71 100644 --- a/framework/Image/lib/Horde/Image/Exif/Parser/Panasonic.php +++ b/framework/Image/lib/Horde/Image/Exif/Parser/Panasonic.php @@ -1,36 +1,37 @@ + * @author Michael J. Rubinsky + * @author Jan Schneider * @category Horde - * @package Horde_Image + * @package Image */ /** - * Exifer - * Extracts EXIF information from digital photos. + * Exifer + * Extracts EXIF information from digital photos. * - * Copyright 2003 Jake Olefsky - * http://www.offsky.com/software/exif/index.php - * jake@olefsky.com + * Copyright © 2003 Jake Olefsky + * http://www.offsky.com/software/exif/index.php + * jake@olefsky.com * - * Please see exif.php for the complete information about this software. + * ------------ * - * ------------ + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. * - * This program is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. http://www.gnu.org/copyleft/gpl.html + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. http://www.gnu.org/copyleft/gpl.html */ class Horde_Image_Exif_Parser_Panasonic extends Horde_Image_Exif_Parser_Base { /** * Looks up the name of the tag for the MakerNote (Depends on Manufacturer) */ - static protected function _lookupTag($tag) + protected function _lookupTag($tag) { switch ($tag) { case '0001': $tag = 'Quality'; break; @@ -64,272 +65,424 @@ class Horde_Image_Exif_Parser_Panasonic extends Horde_Image_Exif_Parser_Base /** * Formats Data for the data type */ - static protected function _formatData($type,$tag,$intel,$data) + protected function _formatData($type, $tag, $intel, $data) { - if ($type == 'UBYTE' || $type == 'SBYTE') { + switch ($type) { + case 'UBYTE': + case 'SBYTE': $data = bin2hex($data); - if ($intel == 1) { + if ($intel) { $data = Horde_Image_Exif::intel2Moto($data); } $data = hexdec($data); - if ($tag == '000f') { //AFMode - if ($data == 256) { + if ($tag == '000f') { + //AFMode + switch ($data) { + case 256: $data = _("9-area-focusing"); - } elseif ($data == 16) { + break; + case 16: $data = _("1-area-focusing"); - } elseif ($data == 4096) { + break; + case 4096: $data = _("3-area-focusing (High speed)"); - } elseif ($data == 4112) { + break; + case 4112: $data = _("1-area-focusing (High speed)"); - } elseif ($data == 16) { + break; + case 16: $data = _("1-area-focusing"); - } elseif ($data == 1) { + break; + case 1: $data = _("Spot-focusing"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } } + break; - } elseif ($type == 'URATIONAL' || $type == 'SRATIONAL') { + case 'URATIONAL': + case 'SRATIONAL': $data = bin2hex($data); - if ($intel == 1) { + if ($intel) { $data = Horde_Image_Exif::intel2Moto($data); } $top = hexdec(substr($data, 8, 8)); $bottom = hexdec(substr($data, 0, 8)); - if ($bottom!=0) { + if ($bottom != 0) { $data = $top / $bottom; } elseif ($top == 0) { $data = 0; } else { $data = $top . '/' . $bottom; } + break; - } elseif ($type == 'USHORT' || $type == 'SSHORT' || $type == 'ULONG' || - $type == 'SLONG' || $type == 'FLOAT' || $type == 'DOUBLE') { - + case 'USHORT': + case 'SSHORT': + case 'ULONG': + case 'SLONG': + case 'FLOAT': + case 'DOUBLE': $data = bin2hex($data); - if ($intel == 1) { + if ($intel) { $data = Horde_Image_Exif::intel2Moto($data); } $data = hexdec($data); - if ($tag == '0001') { //Image Quality - if ($data == 2) { + switch ($tag) { + case '0001': + //Image Quality + switch ($data) { + case 2: $data = _("High"); - } elseif ($data == 3) { + break; + case 3: $data = _("Standard"); - } elseif ($data == 6) { + break; + case 6: $data = _("Very High"); - } elseif ($data == 7) { + break; + case 7: $data = _("RAW"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '0003') { //White Balance - if ($data == 1) { + break; + + case '0003': + //White Balance + switch ($data) { + case 1: $data = _("Auto"); - } elseif ($data == 2) { + break; + case 2: $data = _("Daylight"); - } elseif ($data == 3) { + break; + case 3: $data = _("Cloudy"); - } elseif ($data == 4) { + break; + case 4: $data = _("Halogen"); - } elseif ($data == 5) { + break; + case 5: $data = _("Manual"); - } elseif ($data == 8) { + break; + case 8: $data = _("Flash"); - } elseif ($data == 10) { + break; + case 10: $data = _("Black and White"); - } elseif ($data == 11) { + break; + case 11: $data = _("Manual"); - } else { + break; + default: $data = sprintf(_("Unknown(%s)"), $data); + break; } - } - if ($tag=='0007') { //Focus Mode - if ($data == 1) { + break; + + case '0007': + //Focus Mode + switch ($data) { + case 1: $data = _("Auto"); - } elseif ($data == 2) { + break; + case 2: $data = _("Manual"); - } elseif ($data == 4) { + break; + case 4: $data = _("Auto, Focus button"); - } elseif ($data == 5) { + break; + case 5: $data = _("Auto, Continuous"); - } else { + break; + default: $data = sprintf(_("Unknown(%s)"), $data); + break; } - } - if ($tag == '001a') { //Image Stabilizer - if ($data == 2) { + break; + + case '001a': + //Image Stabilizer + switch ($data) { + case 2: $data = _("Mode 1"); - } elseif ($data == 3) { + break; + case 3: $data = _("Off"); - } elseif ($data == 4) { + break; + case 4: $data = _("Mode 2"); - } else { + break; + default: $data = sprintf(_("Unknown(%s)"), $data); + break; } - } - if ($tag == '001c') { //Macro mode - if ($data == 1) { + break; + + case '001c': + //Macro mode + switch ($data) { + case 1: $data = _("On"); - } elseif ($data == 2) { + break; + case 2: $data = _("Off"); - } else { + break; + default: $data = sprintf(_("Unknown(%s)"), $data); + break; } - } - if ($tag == '001f') { //Shooting Mode - if ($data == 1) { + break; + + case '001f': + //Shooting Mode + switch ($data) { + case 1: $data = _("Normal"); - } elseif ($data == 2) { + break; + case 2: $data = _("Portrait"); - } elseif ($data == 3) { + break; + case 3: $data = _("Scenery"); - } elseif ($data == 4) { + break; + case 4: $data = _("Sports"); - } elseif ($data == 5) { + break; + case 5: $data = _("Night Portrait"); - } elseif ($data == 6) { + break; + case 6: $data = _("Program"); - } elseif ($data == 7) { + break; + case 7: $data = _("Aperture Priority"); - } elseif ($data == 8) { + break; + case 8: $data = _("Shutter Priority"); - } elseif ($data == 9) { + break; + case 9: $data = _("Macro"); - } elseif ($data == 11) { + break; + case 11: $data = _("Manual"); - } elseif ($data == 13) { + break; + case 13: $data = _("Panning"); - } elseif ($data == 14) { + break; + case 14: $data = _("Simple"); - } elseif ($data == 18) { + break; + case 18: $data = _("Fireworks"); - } elseif ($data == 19) { + break; + case 19: $data = _("Party"); - } elseif ($data == 20) { + break; + case 20: $data = _("Snow"); - } elseif ($data == 21) { + break; + case 21: $data = _("Night Scenery"); - } elseif ($data == 22) { + break; + case 22: $data = _("Food"); - } elseif ($data == 23) { + break; + case 23: $data = _("Baby"); - } elseif ($data == 27) { + break; + case 27: $data = _("High Sensitivity"); - } elseif ($data == 29) { + break; + case 29: $data = _("Underwater"); - } elseif ($data == 33) { + break; + case 33: $data = _("Pet"); - } else { + break; + default: $data = sprintf(_("Unknown(%s)"), $data); + break; } - } - if ($tag == '0020') { //Audio - if ($data == 1) { + break; + + case '0020': + //Audio + switch ($data) { + case 1: $data = _("Yes"); - } elseif ($data == 2) { + break; + case 2: $data = _("No"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '0023') { //White Balance Bias + break; + + case '0023': + //White Balance Bias $data = $data . ' EV'; - } - if ($tag == '0024') { //Flash Bias + break; + + case '0024': + //Flash Bias $data = $data; - } - if ($tag == '0028') { //Colour Effect - if ($data == 1) { + break; + + case '0028': + //Colour Effect + switch ($data) { + case 1: $data = _("Off"); - } elseif ($data == 2) { + break; + case 2: $data = _("Warm"); - } elseif ($data == 3) { + break; + case 3: $data = _("Cool"); - } elseif ($data == 4) { + break; + case 4: $data = _("Black and White"); - } elseif ($data == 5) { + break; + case 5: $data = _("Sepia"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '002a') { //Burst Mode - if ($data == 0) { + break; + + case '002a': + //Burst Mode + switch ($data) { + case 0: $data = _("Off"); - } elseif ($data == 1) { + break; + case 1: $data = _("Low/High Quality"); - } elseif ($data == 2) { + break; + case 2: $data = _("Infinite"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '002c') { //Contrast - if ($data == 0) { + break; + + case '002c': + //Contrast + switch ($data) { + case 0: $data = _("Standard"); - } elseif ($data == 1) { + break; + case 1: $data = _("Low"); - } elseif ($data == 2) { + break; + case 2: $data = _("High"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '002d') { //Noise Reduction - if ($data == 0) { + break; + + case '002d': + //Noise Reduction + switch ($data) { + case 0: $data = _("Standard"); - } elseif ($data == 1) { + break; + case 1: $data = _("Low"); - } elseif ($data == 2) { + break; + case 2: $data = _("High"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '002e') { //Self Timer - if ($data == 1) { + break; + + case '002e': + //Self Timer + switch ($data) { + case 1: $data = _("Off"); - } elseif ($data == 2) { + break; + case 2: $data = _("10s"); - } elseif ($data == 3) { + break; + case 3: $data = _("2s"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '0030') { //Rotation - if ($data == 1) { + break; + + case '0030': + //Rotation + switch ($data) { + case 1: $data = _("Horizontal (normal)"); - } elseif ($data == 6) { + break; + case 6: $data = _("Rotate 90 CW"); - } elseif ($data == 8) { + break; + case 8: $data = _("Rotate 270 CW"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '0032') { //Color Mode - if ($data == 0) { + break; + + case '0032': + //Color Mode + switch ($data) { + case 0: $data = _("Normal"); - } elseif ($data == 1) { + break; + case 1: $data = _("Natural"); - } else { + break; + default: $data = sprintf(_("Unknown (%s)"), $data); + break; } - } - if ($tag == '0036') { //Travel Day + break; + + case '0036': + //Travel Day $data = $data; + break; } - } elseif ($type != "UNDEFINED") { + break; + + case 'UNDEFINED': + break; + + default: $data = bin2hex($data); - if ($intel == 1) { + if ($intel) { $data = Horde_Image_Exif::intel2Moto($data); } + break; } return $data; @@ -338,52 +491,53 @@ class Horde_Image_Exif_Parser_Panasonic extends Horde_Image_Exif_Parser_Base /** * Panasonic Special data section */ - static public function parse($block, &$result) + public function parse($block, &$result) { - $intel = 1; + $intel = true; $model = $result['IFD0']['Model']; - $place = 8; //current place + //current place + $place = 8; $offset = 8; $num = bin2hex(substr($block, $place, 4)); $place += 4; - if ($intel == 1) { + if ($intel) { $num = Horde_Image_Exif::intel2Moto($num); } $result['SubIFD']['MakerNote']['Offset'] = hexdec($num); //Get number of tags (2 bytes) $num = bin2hex(substr($block, $place, 2)); - $place+=2; + $place += 2; - if ($intel == 1) { + if ($intel) { $num = Horde_Image_Exif::intel2Moto($num); } $result['SubIFD']['MakerNote']['MakerNoteNumTags'] = hexdec($num); //loop thru all tags Each field is 12 bytes - for($i = 0; $i < hexdec($num); $i++) { + for ($i = 0; $i < hexdec($num); $i++) { //2 byte tag $tag = bin2hex(substr($block, $place, 2)); $place += 2; - if ($intel == 1) { + if ($intel) { $tag = Horde_Image_Exif::intel2Moto($tag); } - $tag_name = self::_lookupTag($tag); + $tag_name = $this->_lookupTag($tag); //2 byte type $type = bin2hex(substr($block, $place, 2)); $place += 2; - if ($intel == 1) { + if ($intel) { $type = Horde_Image_Exif::intel2Moto($type); } - self::_lookupType($type, $size); + $this->_lookupType($type, $size); //4 byte count of number of data units $count = bin2hex(substr($block, $place, 4)); $place += 4; - if ($intel == 1) { + if ($intel) { $count = Horde_Image_Exif::intel2Moto($count); } $bytesofdata = $size * hexdec($count); @@ -396,15 +550,13 @@ class Horde_Image_Exif_Parser_Panasonic extends Horde_Image_Exif_Parser_Base $data = $value; } else { $value = bin2hex($value); - if ($intel == 1) { + if ($intel) { $value = Horde_Image_Exif::intel2Moto($value); } $data = substr($block, hexdec($value) - $offset, $bytesofdata * 2); } - $formated_data = self::_formatData($type, $tag, $intel, $data); + $formated_data = $this->_formatData($type, $tag, $intel, $data); $result['SubIFD']['MakerNote'][$tag_name] = $formated_data; } - } - } \ No newline at end of file diff --git a/framework/Image/lib/Horde/Image/Exif/Parser/Sanyo.php b/framework/Image/lib/Horde/Image/Exif/Parser/Sanyo.php index 65a5418cc..82ec86c12 100644 --- a/framework/Image/lib/Horde/Image/Exif/Parser/Sanyo.php +++ b/framework/Image/lib/Horde/Image/Exif/Parser/Sanyo.php @@ -1,30 +1,31 @@ + * @author Michael J. Rubinsky + * @author Jan Schneider * @category Horde - * @package Horde_Image + * @package Image */ -/* - Exifer - Extracts EXIF information from digital photos. - - Copyright � 2003 Jake Olefsky - http://www.offsky.com/software/exif/index.php - jake@olefsky.com - - Please see exif.php for the complete information about this software. - - ------------ - - This program is free software; you can redistribute it and/or modify it under the terms of - the GNU General Public License as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. http://www.gnu.org/copyleft/gpl.html -*/ +/** + * Exifer + * Extracts EXIF information from digital photos. + * + * Copyright © 2003 Jake Olefsky + * http://www.offsky.com/software/exif/index.php + * jake@olefsky.com + * + * ------------ + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. http://www.gnu.org/copyleft/gpl.html + */ class Horde_Image_Exif_Parser_Sanyo extends Horde_Image_Exif_Parser_Base { /** @@ -32,16 +33,16 @@ class Horde_Image_Exif_Parser_Sanyo extends Horde_Image_Exif_Parser_Base * @param $tag * @return unknown_type */ - static protected function _lookupTag($tag) + protected function _lookupTag($tag) { switch($tag) { - case "0200": $tag = "SpecialMode";break; - case "0201": $tag = "Quality";break; - case "0202": $tag = "Macro";break; - case "0203": $tag = "Unknown";break; - case "0204": $tag = "DigiZoom";break; - case "0f00": $tag = "DataDump";break; - default: $tag = "unknown:".$tag;break; + case '0200': $tag = 'SpecialMode'; break; + case '0201': $tag = 'Quality'; break; + case '0202': $tag = 'Macro'; break; + case '0203': $tag = 'Unknown'; break; + case '0204': $tag = 'DigiZoom'; break; + case '0f00': $tag = 'DataDump'; break; + default: $tag = 'unknown:' . $tag; break; } return $tag; @@ -55,45 +56,63 @@ class Horde_Image_Exif_Parser_Sanyo extends Horde_Image_Exif_Parser_Base * @param $data * @return unknown_type */ - static protected function _formatData($type,$tag,$intel,$data) + protected function _formatData($type, $tag, $intel, $data) { - if($type=="ASCII") { - + switch ($type) { + case 'ASCII': + case 'UNDEFINED': + break; - } else if($type=="URATIONAL" || $type=="SRATIONAL") { + case 'URATIONAL': + case 'SRATIONAL': $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; - - - } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { - $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); - $data=hexdec($data); - - if($tag=="0200") { //SpecialMode - if($data == 0) $data = _("Normal"); - else $data = _("Unknown").": ".$data; + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); } - if($tag=="0201") { //Quality - if($data == 2) $data = _("High"); - else $data = _("Unknown").": ".$data; + $top = hexdec(substr($data, 8, 8)); + $bottom = hexdec(substr($data, 0, 8)); + if ($bottom) { + $data = $top / $bottom; + } elseif (!$top) { + $data = 0; + } else { + $data = $top . '/' . $bottom; } - if($tag=="0202") { //Macro - if($data == 0) $data = _("Normal"); - else $data = _("Unknown").": ".$data; + break; + + case 'USHORT': + case 'SSHORT': + case 'ULONG': + case 'SLONG': + case 'FLOAT': + case 'DOUBLE': + $data = bin2hex($data); + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); } - } else if($type=="UNDEFINED") { - - + $data = hexdec($data); + + switch ($tag) { + case '0200': + //SpecialMode + $data = $data == 0 ? _("Normal") : _("Unknown") . ': ' . $data; + break; + case '0201': + //Quality + $data = $data == 2 ? _("High") : _("Unknown") . ': ' . $data; + break; + case '0202': + //Macro + $data = $data == 0 ? _("Normal") : _("Unknown") . ': ' . $data; + break; + } + break; - } else { + default: $data = bin2hex($data); - if($intel==1) $data = Horde_Image_Exif::intel2Moto($data); + if ($intel) { + $data = Horde_Image_Exif::intel2Moto($data); + } } return $data; @@ -107,58 +126,70 @@ class Horde_Image_Exif_Parser_Sanyo extends Horde_Image_Exif_Parser_Base * @param $globalOffset * @return unknown_type */ - static public function parse($block,&$result,$seek, $globalOffset) + public function parse($block, &$result, $seek, $globalOffset) { - if($result['Endien']=="Intel") $intel=1; - else $intel=0; - + $intel = $result['Endien']=='Intel'; $model = $result['IFD0']['Model']; - - $place=8; //current place - $offset=8; - - //Get number of tags (2 bytes) - $num = bin2hex(substr($block,$place,2));$place+=2; - if($intel==1) $num = Horde_Image_Exif::intel2Moto($num); + //current place + $place = 8; + $offset = 8; + + //Get number of tags (2 bytes) + $num = bin2hex(substr($block, $place, 2)); + $place += 2; + if ($intel) { + $num = Horde_Image_Exif::intel2Moto($num); + } $result['SubIFD']['MakerNote']['MakerNoteNumTags'] = hexdec($num); //loop thru all tags Each field is 12 bytes - for($i=0;$i_lookupTag($tag); - //4 byte count of number of data units - $count = bin2hex(substr($block,$place,4));$place+=4; - if($intel==1) $count = Horde_Image_Exif::intel2Moto($count); - $bytesofdata = $size*hexdec($count); + //2 byte type + $type = bin2hex(substr($block, $place, 2)); + $place += 2; + if ($intel) { + $type = Horde_Image_Exif::intel2Moto($type); + } + $this->_lookupType($type, $size); - //4 byte value of data or pointer to data - $value = substr($block,$place,4);$place+=4; + //4 byte count of number of data units + $count = bin2hex(substr($block, $place, 4)); + $place += 4; + if ($intel) { + $count = Horde_Image_Exif::intel2Moto($count); + } + $bytesofdata = $size * hexdec($count); + //4 byte value of data or pointer to data + $value = substr($block, $place, 4); + $place += 4; - if($bytesofdata<=4) { + if ($bytesofdata <= 4) { $data = $value; } else { $value = bin2hex($value); - if($intel==1) $value = Horde_Image_Exif::intel2Moto($value); - $v = fseek($seek,$globalOffset+hexdec($value)); //offsets are from TIFF header which is 12 bytes from the start of the file - if($v==0) { + if ($intel) { + $value = Horde_Image_Exif::intel2Moto($value); + } + //offsets are from TIFF header which is 12 bytes from the start + //of the file + $v = fseek($seek, $globalOffset + hexdec($value)); + if ($v == 0) { $data = fread($seek, $bytesofdata); - } else if($v==-1) { + } elseif ($v == -1) { $result['Errors'] = $result['Errors']++; } } - $formated_data = self::_formatData($type,$tag,$intel,$data); + $formated_data = $this->_formatData($type, $tag, $intel, $data); $result['SubIFD']['MakerNote'][$tag_name] = $formated_data; } } - -} \ No newline at end of file +}