summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorTim Almdal <tnalmdal@shaw.ca>2010-06-07 05:11:09 -0700
committerTim Almdal <tnalmdal@shaw.ca>2010-06-07 05:11:09 -0700
commit4a6775f5d34d1f26eac7e7c70e12c54cf2d330ec (patch)
treeda5285eb79ce80e2d134ec8f6a7f6cc9530656a5 /modules
parent097ef934c6fe188cc368905ee72b7cca6ad2f755 (diff)
parent1d91e1b2dc8456681f9e38baaca1d191cff1ac7a (diff)
Merge branch 'master' into talmdal_dev
Diffstat (limited to 'modules')
-rw-r--r--modules/exif/lib/exif.php602
-rw-r--r--modules/exif/lib/makers/canon.php15
-rw-r--r--modules/exif/lib/makers/fujifilm.php13
-rw-r--r--modules/exif/lib/makers/gps.php128
-rw-r--r--modules/exif/lib/makers/nikon.php301
-rw-r--r--modules/exif/lib/makers/olympus.php13
-rw-r--r--modules/exif/lib/makers/panasonic.php12
-rw-r--r--modules/exif/lib/makers/sanyo.php13
-rw-r--r--modules/gallery/helpers/gallery_block.php4
-rw-r--r--modules/gallery/helpers/gallery_event.php2
10 files changed, 587 insertions, 516 deletions
diff --git a/modules/exif/lib/exif.php b/modules/exif/lib/exif.php
index 189f61b5..8ba85c8e 100644
--- a/modules/exif/lib/exif.php
+++ b/modules/exif/lib/exif.php
@@ -140,6 +140,8 @@
+ Fixed bug with newer Olympus cameras where number of fields was miscalculated leading to bad performance.
+ More logical fraction calculation for shutter speed.
+
+2009: For all further changes, see the Zenphoto change logs.
*/
@@ -160,13 +162,11 @@ function intel2Moto($intel) {
$cache[$intel] = '';
$len = strlen($intel);
- if ($len > 1000) {
- debugLogBacktrace('intel2Moto called with unreasonable data string: length='.$len);
- trigger_error(sprintf((string) t('intel2Moto called with unreasonable data string: length=%s. See debug log for details. (Setting DEBUG_EXIF to true might help locate problem images.)'),$len));
- } else {
- for($i = 0; $i <= $len; $i += 2) {
- $cache[$intel] .= substr($intel, $len-$i, 2);
- }
+ if ($len > 1000) { // an unreasonable length, override it.
+ $len = 1000;
+ }
+ for($i = 0; $i <= $len; $i += 2) {
+ $cache[$intel] .= substr($intel, $len-$i, 2);
}
return $cache[$intel];
}
@@ -212,7 +212,7 @@ function lookup_tag($tag) {
case '8827': $tag = 'ISOSpeedRatings'; break; // integer 0-65535
case '9000': $tag = 'ExifVersion'; break; // ??
case '9003': $tag = 'DateTimeOriginal'; break; // YYYY:MM:DD HH:MM:SS
- case '9004': $tag = 'DateTimedigitized'; break; // YYYY:MM:DD HH:MM:SS
+ case '9004': $tag = 'DateTimeDigitized'; break; // YYYY:MM:DD HH:MM:SS
case '9101': $tag = 'ComponentsConfiguration'; break; // ??
case '9102': $tag = 'CompressedBitsPerPixel'; break; // positive rational number
case '9201': $tag = 'ShutterSpeedValue'; break; // seconds or fraction of seconds 1/x
@@ -348,258 +348,321 @@ function lookup_type(&$type,&$size) {
}
//================================================================================================
-// Formats Data for the data type
+// processes a irrational number
//================================================================================================
-function formatData($type,$tag,$intel,$data) {
-
- if ($type == 'ASCII') {
- // Search for a null byte and stop there.
- if (($pos = strpos($data, chr(0))) !== false) {
- $data = substr($data, 0, $pos);
- }
- // Format certain kinds of strings nicely (Camera make etc.)
- if ($tag == '010f') $data = ucwords(strtolower(trim($data)));
-
- } else if ($type == 'URATIONAL' || $type == 'SRATIONAL') {
+function unRational($data, $type, $intel) {
$data = bin2hex($data);
- if ($intel == 1) $data = intel2Moto($data);
-
- if ($intel == 1) $top = hexdec(substr($data,8,8)); // intel stores them bottom-top
- else $top = hexdec(substr($data,0,8)); // motorola stores them top-bottom
-
- if ($intel == 1) $bottom = hexdec(substr($data,0,8)); // intel stores them bottom-top
- else $bottom = hexdec(substr($data,8,8)); // motorola stores them top-bottom
+ if ($intel == 1) {
+ $data = intel2Moto($data);
+ $top = hexdec(substr($data,8,8)); // intel stores them bottom-top
+ $bottom = hexdec(substr($data,0,8)); // intel stores them bottom-top
+ } else {
+ $top = hexdec(substr($data,0,8)); // motorola stores them top-bottom
+ $bottom = hexdec(substr($data,8,8)); // motorola stores them top-bottom
+ }
if ($type == 'SRATIONAL' && $top > 2147483647) $top = $top - 4294967296; // this makes the number signed instead of unsigned
- if ($bottom != 0) $data=$top/$bottom;
- else if ($top == 0) $data = 0;
- else $data = $top.'/'.$bottom;
-
- if (($tag == '011a' || $tag == '011b') && $bottom == 1) { // XResolution YResolution
- $data = $top.' dots per ResolutionUnit';
- } else if ($tag == '829a') { // Exposure Time
- if ($bottom != 0) {
- $data = $top / $bottom;
- } else {
+ if ($bottom != 0)
+ $data=$top/$bottom;
+ else
+ if ($top == 0)
$data = 0;
+ else
+ $data = $top.'/'.$bottom;
+ return $data;
+}
+
+//================================================================================================
+// processes a rational number
+//================================================================================================
+function rational($data,$type,$intel) {
+ if (($type == 'USHORT' || $type == 'SSHORT')) {
+ $data = substr($data,0,2);
+ }
+ $data = bin2hex($data);
+ if ($intel == 1) {
+ $data = intel2Moto($data);
+ }
+ $data = hexdec($data);
+ if ($type == 'SSHORT' && $data > 32767) $data = $data - 65536; // this makes the number signed instead of unsigned
+ if ($type == 'SLONG' && $data > 2147483647) $data = $data - 4294967296; // this makes the number signed instead of unsigned
+ return $data;
+}
+
+//================================================================================================
+// Formats Data for the data type
+//================================================================================================
+function formatData($type,$tag,$intel,$data) {
+ switch ($type) {
+ case 'ASCII':
+ if (($pos = strpos($data, chr(0))) !== false) { // Search for a null byte and stop there.
+ $data = substr($data, 0, $pos);
}
- $data = formatExposure($data);
- } else if ($tag == '829d') { // FNumber
- $data = 'f/'.$data;
- } else if ($tag == '9204') { // ExposureBiasValue
- $data = round($data, 2) . ' EV';
- } else if ($tag == '9205' || $tag == '9202') { // ApertureValue and MaxApertureValue
- // ApertureValue is given in the APEX Mode. Many thanks to Matthieu Froment for this code
- // The formula is : Aperture = 2*log2(FNumber) <=> FNumber = e((Aperture.ln(2))/2)
- $data = exp(($data*log(2))/2);
- $data = round($data, 1);// Focal is given with a precision of 1 digit.
- $data='f/'.$data;
- } else if ($tag == '920a') { // FocalLength
- $data = $data.' mm';
- } else if ($tag == '9201') { // ShutterSpeedValue
- // The ShutterSpeedValue is given in the APEX mode. Many thanks to Matthieu Froment for this code
- // The formula is : Shutter = - log2(exposureTime) (Appendix C of EXIF spec.)
- // Where shutter is in APEX, log2(exposure) = ln(exposure)/ln(2)
- // So final formula is : exposure = exp(-ln(2).shutter)
- // The formula can be developed : exposure = 1/(exp(ln(2).shutter))
- $data = exp($data * log(2));
- if ($data != 0) $data = 1/$data;
- $data = formatExposure($data);
- }
-
- } else if ($type == 'USHORT' || $type == 'SSHORT' || $type == 'ULONG' || $type == 'SLONG' || $type == 'FLOAT' || $type == 'DOUBLE') {
- $data = bin2hex($data);
- if ($intel == 1) $data = intel2Moto($data);
- if ($intel == 0 && ($type == 'USHORT' || $type == 'SSHORT')) $data = substr($data,0,4);
- $data = hexdec($data);
-
- if ($type == 'SSHORT' && $data > 32767) $data = $data - 65536; // this makes the number signed instead of unsigned
- if ($type == 'SLONG' && $data > 2147483647) $data = $data - 4294967296; // this makes the number signed instead of unsigned
-
- if ($tag == '0112') { // Orientation
- // Example of how all of these tag formatters should be...
- switch ($data) {
- case 1 : $data = (string) t('1: Normal (0 deg)'); break;
- case 2 : $data = (string) t('2: Mirrored'); break;
- case 3 : $data = (string) t('3: Upsidedown'); break;
- case 4 : $data = (string) t('4: Upsidedown Mirrored'); break;
- case 5 : $data = (string) t('5: 90 deg CW Mirrored'); break;
- case 6 : $data = (string) t('6: 90 deg CCW'); break;
- case 7 : $data = (string) t('7: 90 deg CCW Mirrored'); break;
- case 8 : $data = (string) t('8: 90 deg CW'); break;
- default : $data = (string) t('Unknown').': '.$data;
+ if ($tag == '010f') $data = ucwords(strtolower(trim($data))); // Format certain kinds of strings nicely (Camera make etc.)
+ break;
+ case 'URATIONAL':
+ case 'SRATIONAL':
+ switch ($tag) {
+ case '011a': // XResolution
+ case '011b': // YResolution
+ $data = round(unRational($data,$type,$intel)).' dots per ResolutionUnit';
+ break;
+ case '829a': // Exposure Time
+ $data = formatExposure(unRational($data,$type,$intel));
+ break;
+ case '829d': // FNumber
+ $data = 'f/'.unRational($data,$type,$intel);
+ break;
+ case '9204': // ExposureBiasValue
+ $data = round(unRational($data,$type,$intel), 2) . ' EV';
+ break;
+ case '9205': // ApertureValue
+ case '9202': // MaxApertureValue
+ // ApertureValue is given in the APEX Mode. Many thanks to Matthieu Froment for this code
+ // The formula is : Aperture = 2*log2(FNumber) <=> FNumber = e((Aperture.ln(2))/2)
+ $datum = exp((unRational($data,$type,$intel)*log(2))/2);
+ $data = round($datum, 1);// Focal is given with a precision of 1 digit.
+ $data='f/'.$datum;
+ break;
+ case '920a': // FocalLength
+ $data = unRational($data,$type,$intel).' mm';
+ break;
+ case '9201': // ShutterSpeedValue
+ // The ShutterSpeedValue is given in the APEX mode. Many thanks to Matthieu Froment for this code
+ // The formula is : Shutter = - log2(exposureTime) (Appendix C of EXIF spec.)
+ // Where shutter is in APEX, log2(exposure) = ln(exposure)/ln(2)
+ // So final formula is : exposure = exp(-ln(2).shutter)
+ // The formula can be developed : exposure = 1/(exp(ln(2).shutter))
+ $datum = exp(unRational($data,$type,$intel) * log(2));
+ if ($datum != 0) $datum = 1/$datum;
+ $data = formatExposure($datum);
+ break;
+ default:
+ $data = unRational($data,$type,$intel);
+ break;
}
-
- } else if ($tag == '0128' || $tag == 'a210' || $tag == '0128') { // ResolutionUnit and FocalPlaneResolutionUnit and ThumbnailResolutionUnit
- if ($data == 1) $data = (string) t('No Unit');
- else if ($data == 2) $data = (string) t('Inch');
- else if ($data == 3) $data = (string) t('Centimeter');
-
- } else if ($tag == '0213') { // YCbCrPositioning
- if ($data == 1) $data = (string) t('Center of Pixel Array');
- else if ($data == 2) $data = (string) t('Datum Point');
-
- } else if ($tag == '8822') { // ExposureProgram
- if ($data == 1) $data = (string) t('Manual');
- else if ($data == 2) $data = (string) t('Program');
- else if ($data == 3) $data = (string) t('Aperture Priority');
- else if ($data == 4) $data = (string) t('Shutter Priority');
- else if ($data == 5) $data = (string) t('Program Creative');
- else if ($data == 6) $data = (string) t('Program Action');
- else if ($data == 7) $data = (string) t('Portrat');
- else if ($data == 8) $data = (string) t('Landscape');
- else $data = (string) t('Unknown').': '.$data;
-
- } else if ($tag == '9207') { // MeteringMode
- if ($data == 0) $data = (string) t('Unknown');
- else if ($data == 1) $data = (string) t('Average');
- else if ($data == 2) $data = (string) t('Center Weighted Average');
- else if ($data == 3) $data = (string) t('Spot');
- else if ($data == 4) $data = (string) t('Multi-Spot');
- else if ($data == 5) $data = (string) t('Multi-Segment');
- else if ($data == 6) $data = (string) t('Partial');
- else if ($data == 255) $data = (string) t('Other');
- else $data = (string) t('Unknown').': '.$data;
-
- } else if ($tag == '9208') { // LightSource
- if ($data == 0) $data = (string) t('Unknown or Auto');
- else if ($data == 1) $data = (string) t('Daylight');
- else if ($data == 2) $data = (string) t('Flourescent');
- else if ($data == 3) $data = (string) t('Tungsten'); // 3 Tungsten (Incandescent light)
- // 4 Flash
- // 9 Fine Weather
- else if ($data == 10) $data = (string) t('Flash'); // 10 Cloudy Weather
- // 11 Shade
- // 12 Daylight Fluorescent (D 5700 - 7100K)
- // 13 Day White Fluorescent (N 4600 - 5400K)
- // 14 Cool White Fluorescent (W 3900 -4500K)
- // 15 White Fluorescent (WW 3200 - 3700K)
- // 10 Flash
- else if ($data == 17) $data = (string) t('Standard Light A');
- else if ($data == 18) $data = (string) t('Standard Light B');
- else if ($data == 19) $data = (string) t('Standard Light C');
- else if ($data == 20) $data = (string) t('D55');
- else if ($data == 21) $data = (string) t('D65');
- else if ($data == 22) $data = (string) t('D75');
- else if ($data == 23) $data = (string) t('D50');
- else if ($data == 24) $data = (string) t('ISO Studio Tungsten');
- else if ($data == 255) $data = (string) t('Other');
- else $data = (string) t('Unknown').': '.$data;
-
- } else if ($tag == '9209') { // Flash
- if ($data == 0) $data = (string) t('No Flash');
- else if ($data == 1) $data = (string) t('Flash');
- else if ($data == 5) $data = (string) t('Flash, strobe return light not detected');
- else if ($data == 7) $data = (string) t('Flash, strobe return light detected');
- else if ($data == 9) $data = (string) t('Compulsory Flash');
- else if ($data == 13) $data = (string) t('Compulsory Flash, Return light not detected');
- else if ($data == 15) $data = (string) t('Compulsory Flash, Return light detected');
- else if ($data == 16) $data = (string) t('No Flash');
- else if ($data == 24) $data = (string) t('No Flash');
- else if ($data == 25) $data = (string) t('Flash, Auto-Mode');
- else if ($data == 29) $data = (string) t('Flash, Auto-Mode, Return light not detected');
- else if ($data == 31) $data = (string) t('Flash, Auto-Mode, Return light detected');
- else if ($data == 32) $data = (string) t('No Flash');
- else if ($data == 65) $data = (string) t('Red Eye');
- else if ($data == 69) $data = (string) t('Red Eye, Return light not detected');
- else if ($data == 71) $data = (string) t('Red Eye, Return light detected');
- else if ($data == 73) $data = (string) t('Red Eye, Compulsory Flash');
- else if ($data == 77) $data = (string) t('Red Eye, Compulsory Flash, Return light not detected');
- else if ($data == 79) $data = (string) t('Red Eye, Compulsory Flash, Return light detected');
- else if ($data == 89) $data = (string) t('Red Eye, Auto-Mode');
- else if ($data == 93) $data = (string) t('Red Eye, Auto-Mode, Return light not detected');
- else if ($data == 95) $data = (string) t('Red Eye, Auto-Mode, Return light detected');
- else $data = (string) t('Unknown').': '.$data;
-
- } else if ($tag == 'a001') { // ColorSpace
- if ($data == 1) $data = (string) t('sRGB');
- else $data = (string) t('Uncalibrated');
-
- } else if ($tag == 'a002' || $tag == 'a003') { // ExifImageWidth/Height
- $data = $data. ' '.(string) t('pixels');
-
- } else if ($tag == '0103') { // Compression
- if ($data == 1) $data = (string) t('No Compression');
- else if ($data == 6) $data = (string) t('Jpeg Compression');
- else $data = (string) t('Unknown').': '.$data;
-
- } else if ($tag == 'a217') { // SensingMethod
- if ($data == 1) $data = (string) t('Not defined');
- if ($data == 2) $data = (string) t('One Chip Color Area Sensor');
- if ($data == 3) $data = (string) t('Two Chip Color Area Sensor');
- if ($data == 4) $data = (string) t('Three Chip Color Area Sensor');
- if ($data == 5) $data = (string) t('Color Sequential Area Sensor');
- if ($data == 7) $data = (string) t('Trilinear Sensor');
- if ($data == 8) $data = (string) t('Color Sequential Linear Sensor');
- else $data = (string) t('Unknown').': '.$data;
-
- } else if ($tag == '0106') { // PhotometricInterpretation
- if ($data == 1) $data = (string) t('Monochrome');
- else if ($data == 2) $data = (string) t('RGB');
- else if ($data == 6) $data = (string) t('YCbCr');
- else $data = (string) t('Unknown').': '.$data;
- }
- //} else if($tag=="a408" || $tag=="a40a") { // Contrast, Sharpness
- // switch($data) {
- // case 0: $data="Normal"; break;
- // case 1: $data="Soft"; break;
- // case 2: $data="Hard"; break;
- // default: $data="Unknown"; break;
- // }
- //} else if($tag=="a409") { // Saturation
- // switch($data) {
- // case 0: $data="Normal"; break;
- // case 1: $data="Low saturation"; break;
- // case 2: $data="High saturation"; break;
- // default: $data="Unknown"; break;
- // }
- //} else if($tag=="a402") { // Exposure Mode
- // switch($data) {
- // case 0: $data="Auto exposure"; break;
- // case 1: $data="Manual exposure"; break;
- // case 2: $data="Auto bracket"; break;
- // default: $data="Unknown"; break;
- // }
-
- } else if ($type == 'UNDEFINED') {
-
- if ($tag == '9000' || $tag == 'a000' || $tag == '0002') { // ExifVersion,FlashPixVersion,InteroperabilityVersion
- $data=(string) t('version').' '.$data/100;
- }
- if ($tag == 'a300') { // FileSource
- $data = bin2hex($data);
- $data = str_replace('00','',$data);
- $data = str_replace('03',(string) t('Digital Still Camera'),$data);
- }
- if ($tag == 'a301') { // SceneType
- $data = bin2hex($data);
- $data = str_replace('00','',$data);
- $data = str_replace('01',(string) t('Directly Photographed'),$data);
- }
- if ($tag == '9101') { // ComponentsConfiguration
+ break;
+ case 'USHORT':
+ case 'SSHORT':
+ case 'ULONG':
+ case 'SLONG':
+ case 'FLOAT':
+ case 'DOUBLE':
+ $data = rational($data,$type,$intel);
+ switch ($tag) {
+ case '0112': // Orientation
+ // Example of how all of these tag formatters should be...
+ switch ($data) {
+ case 0 : // not set, presume normal
+ case 1 : $data = (string) t('1: Normal (0 deg)'); break;
+ case 2 : $data = (string) t('2: Mirrored'); break;
+ case 3 : $data = (string) t('3: Upside-down'); break;
+ case 4 : $data = (string) t('4: Upside-down Mirrored'); break;
+ case 5 : $data = (string) t('5: 90 deg CW Mirrored'); break;
+ case 6 : $data = (string) t('6: 90 deg CCW'); break;
+ case 7 : $data = (string) t('7: 90 deg CCW Mirrored'); break;
+ case 8 : $data = (string) t('8: 90 deg CW'); break;
+ default : $data = sprintf((string) t('%d: Unknown'),$data); break;
+ }
+ break;
+ case '0128': // ResolutionUnit
+ case 'a210': // FocalPlaneResolutionUnit
+ case '0128': // ThumbnailResolutionUnit
+ switch ($data) {
+ case 1: $data = (string) t('No Unit'); break;
+ case 2: $data = (string) t('Inch'); break;
+ case 3: $data = (string) t('Centimeter'); break;
+ }
+ break;
+ case '0213': // YCbCrPositioning
+ switch ($data) {
+ case 1: $data = (string) t('Center of Pixel Array'); break;
+ case 2: $data = (string) t('Datum Point'); break;
+ }
+ break;
+ case '8822': // ExposureProgram
+ switch ($data) {
+ case 1: $data = (string) t('Manual'); break;
+ case 2: $data = (string) t('Program'); break;
+ case 3: $data = (string) t('Aperture Priority'); break;
+ case 4: $data = (string) t('Shutter Priority'); break;
+ case 5: $data = (string) t('Program Creative'); break;
+ case 6: $data = (string) t('Program Action'); break;
+ case 7: $data = (string) t('Portrait'); break;
+ case 8: $data = (string) t('Landscape'); break;
+ default: $data = (string) t('Unknown').': '.$data; break;
+ }
+ break;
+ case '9207': // MeteringMode
+ switch ($data) {
+ case 1: $data = (string) t('Average'); break;
+ case 2: $data = (string) t('Center Weighted Average'); break;
+ case 3: $data = (string) t('Spot'); break;
+ case 4: $data = (string) t('Multi-Spot'); break;
+ case 5: $data = (string) t('Pattern'); break;
+ case 6: $data = (string) t('Partial'); break;
+ case 255: $data = (string) t('Other'); break;
+ default: $data = (string) t('Unknown').': '.$data; break;
+ }
+ break;
+ case '9208': // LightSource
+ switch ($data) {
+ case 1: $data = (string) t('Daylight'); break;
+ case 2: $data = (string) t('Fluorescent'); break;
+ case 3: $data = (string) t('Tungsten'); break; // 3 Tungsten (Incandescent light)
+ // 4 Flash
+ // 9 Fine Weather
+ case 10: $data = (string) t('Flash'); break; // 10 Cloudy Weather
+ // 11 Shade
+ // 12 Daylight Fluorescent (D 5700 - 7100K)
+ // 13 Day White Fluorescent (N 4600 - 5400K)
+ // 14 Cool White Fluorescent (W 3900 -4500K)
+ // 15 White Fluorescent (WW 3200 - 3700K)
+ // 10 Flash
+ case 17: $data = (string) t('Standard Light A'); break;
+ case 18: $data = (string) t('Standard Light B'); break;
+ case 19: $data = (string) t('Standard Light C'); break;
+ case 20: $data = (string) t('D55'); break;
+ case 21: $data = (string) t('D65'); break;
+ case 22: $data = (string) t('D75'); break;
+ case 23: $data = (string) t('D50'); break;
+ case 24: $data = (string) t('ISO Studio Tungsten'); break;
+ case 255: $data = (string) t('Other'); break;
+ default: $data = (string) t('Unknown').': '.$data; break;
+ }
+ break;
+ case '9209': // Flash
+ switch ($data) {
+ case 0: $data = (string) t('No Flash'); break;
+ case 1: $data = (string) t('Flash'); break;
+ case 5: $data = (string) t('Flash, strobe return light not detected'); break;
+ case 7: $data = (string) t('Flash, strobe return light detected'); break;
+ case 9: $data = (string) t('Compulsory Flash'); break;
+ case 13: $data = (string) t('Compulsory Flash, Return light not detected'); break;
+ case 15: $data = (string) t('Compulsory Flash, Return light detected'); break;
+ case 16: $data = (string) t('No Flash'); break;
+ case 24: $data = (string) t('No Flash'); break;
+ case 25: $data = (string) t('Flash, Auto-Mode'); break;
+ case 29: $data = (string) t('Flash, Auto-Mode, Return light not detected'); break;
+ case 31: $data = (string) t('Flash, Auto-Mode, Return light detected'); break;
+ case 32: $data = (string) t('No Flash'); break;
+ case 65: $data = (string) t('Red Eye'); break;
+ case 69: $data = (string) t('Red Eye, Return light not detected'); break;
+ case 71: $data = (string) t('Red Eye, Return light detected'); break;
+ case 73: $data = (string) t('Red Eye, Compulsory Flash'); break;
+ case 77: $data = (string) t('Red Eye, Compulsory Flash, Return light not detected'); break;
+ case 79: $data = (string) t('Red Eye, Compulsory Flash, Return light detected'); break;
+ case 89: $data = (string) t('Red Eye, Auto-Mode'); break;
+ case 93: $data = (string) t('Red Eye, Auto-Mode, Return light not detected'); break;
+ case 95: $data = (string) t('Red Eye, Auto-Mode, Return light detected'); break;
+ default: $data = (string) t('Unknown').': '.$data; break;
+ }
+ break;
+ case 'a001': // ColorSpace
+ if ($data == 1) $data = (string) t('sRGB');
+ else $data = (string) t('Uncalibrated');
+ break;
+ case 'a002': // ExifImageWidth
+ case 'a003': // ExifImageHeight
+ $data = $data. ' '.(string) t('pixels');
+ break;
+ case '0103': // Compression
+ switch ($data) {
+ case 1: $data = (string) t('No Compression'); break;
+ case 6: $data = (string) t('Jpeg Compression'); break;
+ default: $data = (string) t('Unknown').': '.$data; break;
+ }
+ break;
+ case 'a217': // SensingMethod
+ switch ($data) {
+ case 1: $data = (string) t('Not defined'); break;
+ case 2: $data = (string) t('One Chip Color Area Sensor'); break;
+ case 3: $data = (string) t('Two Chip Color Area Sensor'); break;
+ case 4: $data = (string) t('Three Chip Color Area Sensor'); break;
+ case 5: $data = (string) t('Color Sequential Area Sensor'); break;
+ case 7: $data = (string) t('Trilinear Sensor'); break;
+ case 8: $data = (string) t('Color Sequential Linear Sensor'); break;
+ default: $data = (string) t('Unknown').': '.$data; break;
+ }
+ break;
+ case '0106': // PhotometricInterpretation
+ switch ($data) {
+ case 1: $data = (string) t('Monochrome'); break;
+ case 2: $data = (string) t('RGB'); break;
+ case 6: $data = (string) t('YCbCr'); break;
+ default: $data = (string) t('Unknown').': '.$data; break;
+ }
+ break;
+ //case "a408": // Contrast
+ //case "a40a": //Sharpness
+ // switch($data) {
+ // case 0: $data="Normal"; break;
+ // case 1: $data="Soft"; break;
+ // case 2: $data="Hard"; break;
+ // default: $data="Unknown"; break;
+ // }
+ // break;
+ //case "a409": // Saturation
+ // switch($data) {
+ // case 0: $data="Normal"; break;
+ // case 1: $data="Low saturation"; break;
+ // case 2: $data="High saturation"; break;
+ // default: $data="Unknown"; break;
+ // }
+ // break;
+ //case "a402": // Exposure Mode
+ // switch($data) {
+ // case 0: $data="Auto exposure"; break;
+ // case 1: $data="Manual exposure"; break;
+ // case 2: $data="Auto bracket"; break;
+ // default: $data="Unknown"; break;
+ // }
+ // break;
+ }
+ break;
+ case 'UNDEFINED':
+ switch ($tag) {
+ case '9000': // ExifVersion
+ case 'a000': // FlashPixVersion
+ case '0002': // InteroperabilityVersion
+ $data=(string) t('version').' '.$data/100;
+ break;
+ case 'a300': // FileSource
+ $data = bin2hex($data);
+ $data = str_replace('00','',$data);
+ $data = str_replace('03',(string) t('Digital Still Camera'),$data);
+ break;
+ case 'a301': // SceneType
+ $data = bin2hex($data);
+ $data = str_replace('00','',$data);
+ $data = str_replace('01',(string) t('Directly Photographed'),$data);
+ break;
+ case '9101': // ComponentsConfiguration
+ $data = bin2hex($data);
+ $data = str_replace('01','Y',$data);
+ $data = str_replace('02','Cb',$data);
+ $data = str_replace('03','Cr',$data);
+ $data = str_replace('04','R',$data);
+ $data = str_replace('05','G',$data);
+ $data = str_replace('06','B',$data);
+ $data = str_replace('00','',$data);
+ break;
+ //case "9286": //UserComment
+ // $encoding = rtrim(substr($data, 0, 8));
+ // $data = rtrim(substr($data, 8));
+ // break;
+ }
+ break;
+ default:
$data = bin2hex($data);
- $data = str_replace('01','Y',$data);
- $data = str_replace('02','Cb',$data);
- $data = str_replace('03','Cr',$data);
- $data = str_replace('04','R',$data);
- $data = str_replace('05','G',$data);
- $data = str_replace('06','B',$data);
- $data = str_replace('00','',$data);
- }
- //if($tag=="9286") { //UserComment
- // $encoding = rtrim(substr($data, 0, 8));
- // $data = rtrim(substr($data, 8));
- //}
- } else {
- $data = bin2hex($data);
- if ($intel == 1) $data = intel2Moto($data);
+ if ($intel == 1) $data = intel2Moto($data);
+ break;
}
-
return $data;
}
function formatExposure($data) {
- if ($data > 0) {
+ if (strpos($data,'/')===false) {
if ($data > 1) {
return round($data, 2).' '.(string) t('sec');
} else {
@@ -666,30 +729,30 @@ function read_entry(&$result,$in,$seek,$intel,$ifd_name,$globalOffset) {
if ($result['VerboseOutput'] == 1) {
$result[$ifd_name]['MakerNote']['RawData'] = $data;
}
- if (eregi('NIKON',$make)) {
+ if (preg_match('/NIKON/i',$make)) {
require_once(dirname(__FILE__).'/makers/nikon.php');
parseNikon($data,$result);
$result[$ifd_name]['KnownMaker'] = 1;
- } else if (eregi('OLYMPUS',$make)) {
+ } else if (preg_match('/OLYMPUS/i',$make)) {
require_once(dirname(__FILE__).'/makers/olympus.php');
parseOlympus($data,$result,$seek,$globalOffset);
$result[$ifd_name]['KnownMaker'] = 1;
- } else if (eregi('Canon',$make)) {
+ } else if (preg_match('/Canon/i',$make)) {
require_once(dirname(__FILE__).'/makers/canon.php');
parseCanon($data,$result,$seek,$globalOffset);
$result[$ifd_name]['KnownMaker'] = 1;
- } else if (eregi('FUJIFILM',$make)) {
+ } else if (preg_match('/FUJIFILM/i',$make)) {
require_once(dirname(__FILE__).'/makers/fujifilm.php');
parseFujifilm($data,$result);
$result[$ifd_name]['KnownMaker'] = 1;
- } else if (eregi('SANYO',$make)) {
+ } else if (preg_match('/SANYO/i',$make)) {
require_once(dirname(__FILE__).'/makers/sanyo.php');
parseSanyo($data,$result,$seek,$globalOffset);
$result[$ifd_name]['KnownMaker'] = 1;
- } else if (eregi('Panasonic',$make)) {
- require_once(dirname(__FILE__).'/makers/panasonic.php');
- parsePanasonic($data,$result,$seek,$globalOffset);
- $result[$ifd_name]['KnownMaker'] = 1;
+ } else if (preg_match('/Panasonic/i',$make)) {
+ require_once(dirname(__FILE__).'/makers/panasonic.php');
+ parsePanasonic($data,$result,$seek,$globalOffset);
+ $result[$ifd_name]['KnownMaker'] = 1;
} else {
$result[$ifd_name]['KnownMaker'] = 0;
}
@@ -709,9 +772,9 @@ function read_entry(&$result,$in,$seek,$intel,$ifd_name,$globalOffset) {
$data = bin2hex($data);
if ($intel == 1) $data = intel2Moto($data);
}
- $result[$ifd_name][$tag_name.'_Verbose']['RawData'] = $data;
+ $result[$ifd_name][$tag_name.'_Verbose']['RawData'] = $data;
$result[$ifd_name][$tag_name.'_Verbose']['Type'] = $type;
- $result[$ifd_name][$tag_name.'_Verbose']['Bytes'] = $bytesofdata;
+ $result[$ifd_name][$tag_name.'_Verbose']['Bytes'] = $bytesofdata;
}
}
}
@@ -912,7 +975,7 @@ if ($result['ValidJpeg'] == 1) {
$v = fseek($in,$globalOffset+$ExitOffset);
if ($v == -1) {
$result['Errors'] = $result['Errors']+1;
- $result['Error'][$result['Errors']] = (string) t('Couldnt Find SubIFD');
+ $result['Error'][$result['Errors']] = (string) t('Could not Find SubIFD');
}
//===========================================================
@@ -932,7 +995,12 @@ if ($result['ValidJpeg'] == 1) {
}
// Add the 35mm equivalent focal length:
- $result['SubIFD']['FocalLength35mmEquiv'] = get35mmEquivFocalLength($result);
+ if (isset($result['IFD0']['FocalLengthIn35mmFilm']) && !isset($result['SubIFD']['FocalLengthIn35mmFilm'])) { // found in the wrong place
+ $result['SubIFD']['FocalLengthIn35mmFilm'] = $result['IFD0']['FocalLengthIn35mmFilm'];
+ }
+ if (!isset($result['SubIFD']['FocalLengthIn35mmFilm'])) {
+ $result['SubIFD']['FocalLengthIn35mmFilm'] = get35mmEquivFocalLength($result);
+ }
// Check for IFD1
if (!isset($result['IFD1Offset']) || $result['IFD1Offset'] == 0) {
@@ -944,7 +1012,7 @@ if ($result['ValidJpeg'] == 1) {
$v = fseek($in,$globalOffset+$result['IFD1Offset']);
if ($v == -1) {
$result['Errors'] = $result['Errors']+1;
- $result['Error'][$result['Errors']] = (string) t('Couldnt Find IFD1');
+ $result['Error'][$result['Errors']] = (string) t('Could not Find IFD1');
}
//===========================================================
@@ -984,7 +1052,7 @@ if ($result['ValidJpeg'] == 1) {
$v = fseek($in,$globalOffset+$result['SubIFD']['ExifInteroperabilityOffset']);
if ($v == -1) {
$result['Errors'] = $result['Errors']+1;
- $result['Error'][$result['Errors']] = (string) t('Couldnt Find InteroperabilityIFD');
+ $result['Error'][$result['Errors']] = (string) t('Could not Find InteroperabilityIFD');
}
//===========================================================
@@ -1029,7 +1097,7 @@ function ConvertToFraction($v, &$n, &$d)
//================================================================================================
function get35mmEquivFocalLength(&$result) {
if (isset($result['SubIFD']['ExifImageWidth'])) {
- $width = $result['SubIFD']['ExifImageWidth'];
+ $width = $result['SubIFD']['ExifImageWidth'];
} else {
$width = 0;
}
@@ -1055,7 +1123,7 @@ function get35mmEquivFocalLength(&$result) {
} else {
$fl = 0;
}
-
+
if (($width != 0) && !empty($units) && !empty($xres) && !empty($fl) && !empty($width)) {
$ccdwidth = ($width * $unitfactor) / $xres;
$equivfl = $fl / $ccdwidth*36+0.5;
@@ -1064,10 +1132,4 @@ function get35mmEquivFocalLength(&$result) {
return null;
}
-if (!function_exists('debugLogBacktrace')) {
- // define this function for stand-alone uses if exifier
- function debugLogBacktrace($msg) {
- }
-}
-
?>
diff --git a/modules/exif/lib/makers/canon.php b/modules/exif/lib/makers/canon.php
index 75cf0b7b..aecd266d 100644
--- a/modules/exif/lib/makers/canon.php
+++ b/modules/exif/lib/makers/canon.php
@@ -40,6 +40,7 @@ function lookup_Canon_tag($tag) {
case "0009": $tag = "OwnerName";break;
case "000c": $tag = "CameraSerialNumber";break;
case "000f": $tag = "CustomFunctions";break;
+ case "0095": $tag = "LensInfo";break;
default: $tag = "unknown:".$tag;break;
}
@@ -57,13 +58,7 @@ function formatCanonData($type,$tag,$intel,$data,$exif,&$result) {
if($type=="ASCII") {
$result = $data = str_replace("\0", "", $data);
} else if($type=="URATIONAL" || $type=="SRATIONAL") {
- $data = bin2hex($data);
- if($intel==1) $data = 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;
+ $data = unRational($data,$type,$intel);
if($tag=="0204") { //DigitalZoom
$data=$data."x";
@@ -71,7 +66,7 @@ function formatCanonData($type,$tag,$intel,$data,$exif,&$result) {
} else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") {
- $data = bin2hex($data);
+ $data = rational($data,$type,$intel);
$result['RAWDATA'] = $data;
if($tag=="0001") { //first chunk
@@ -377,20 +372,18 @@ function parseCanon($block,&$result,$seek, $globalOffset) {
//2 byte type
$type = bin2hex(substr($block,$place,2));$place+=2;
if($intel==1) $type = intel2Moto($type);
- lookup_type($type,$size);
+ lookup_type($type,$size);
//4 byte count of number of data units
$count = bin2hex(substr($block,$place,4));$place+=4;
if($intel==1) $count = intel2Moto($count);
$bytesofdata = $size*hexdec($count);
-
if($bytesofdata<=0) {
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
$value = substr($block,$place,4);$place+=4;
-
if($bytesofdata<=4) {
$data = $value;
} else {
diff --git a/modules/exif/lib/makers/fujifilm.php b/modules/exif/lib/makers/fujifilm.php
index a88e51c3..a1f2f416 100644
--- a/modules/exif/lib/makers/fujifilm.php
+++ b/modules/exif/lib/makers/fujifilm.php
@@ -44,7 +44,6 @@ function lookup_Fujifilm_tag($tag) {
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;
@@ -66,22 +65,14 @@ function formatFujifilmData($type,$tag,$intel,$data) {
} else if($type=="URATIONAL" || $type=="SRATIONAL") {
- $data = bin2hex($data);
- if($intel==1) $data = 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;
+ $data = unRational($data,$type,$intel);
if($tag=="1011") { //FlashStrength
$data=$data." EV";
}
} else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") {
- $data = bin2hex($data);
- if($intel==1) $data = intel2Moto($data);
- $data=hexdec($data);
+ $data =rational($data,$type,$intel);
if($tag=="1001") { //Sharpness
if($data == 1) $data = (string) t("Soft");
diff --git a/modules/exif/lib/makers/gps.php b/modules/exif/lib/makers/gps.php
index 9a6ab137..462aae68 100644
--- a/modules/exif/lib/makers/gps.php
+++ b/modules/exif/lib/makers/gps.php
@@ -73,102 +73,65 @@ function lookup_GPS_tag($tag) {
}
//=================
-// Formats a rational number
-//====================================================================
-function GPSRational($data, $intel) {
-
- if($intel==1) $top = hexdec(substr($data,8,8)); //intel stores them bottom-top
- else $top = hexdec(substr($data,0,8)); //motorola stores them top-bottom
-
- if($intel==1) $bottom = hexdec(substr($data,0,8)); //intel stores them bottom-top
- else $bottom = hexdec(substr($data,8,8)); //motorola stores them top-bottom
-
- if($bottom!=0) $data=$top/$bottom;
- else if($top==0) $data = 0;
- else $data=$top."/".$bottom;
-
- return $data;
-}
-//=================
// Formats Data for the data type
//====================================================================
function formatGPSData($type,$tag,$intel,$data) {
if($type=="ASCII") {
- if($tag=="0001" || $tag=="0003"){ // Latitude Reference, Longitude Reference
- $data = ($data{1} == $data{2} && $data{1} == $data{3}) ? $data{0} : $data;
- }
-
+ if($tag=="0001" || $tag=="0003"){ // Latitude Reference, Longitude Reference
+ $data = ($data{1} == $data{2} && $data{1} == $data{3}) ? $data{0} : $data;
+ }
+
} else if($type=="URATIONAL" || $type=="SRATIONAL") {
- $data = bin2hex($data);
- if($intel==1) $data = intel2Moto($data);
-
- if($intel==1) $top = hexdec(substr($data,8,8)); //intel stores them bottom-top
- else $top = hexdec(substr($data,0,8)); //motorola stores them top-bottom
-
- if($intel==1) $bottom = hexdec(substr($data,0,8)); //intel stores them bottom-top
- else $bottom = hexdec(substr($data,8,8)); //motorola stores them top-bottom
-
- if($type=="SRATIONAL" && $top>2147483647) $top = $top - 4294967296; //this makes the number signed instead of unsigned
-
- if($tag=="0002" || $tag=="0004") { //Latitude, Longitude
-
- if($intel==1){
- $seconds = GPSRational(substr($data,0,16),$intel);
- $hour = GPSRational(substr($data,32,16),$intel);
- } else {
- $hour= GPSRational(substr($data,0,16),$intel);
- $seconds = GPSRational(substr($data,32,16),$intel);
+ if($tag=="0002" || $tag=="0004" || $tag=='0007') { //Latitude, Longitude, Time
+ $datum = array();
+ for ($i=0;$i<strlen($data);$i=$i+8) {
+ array_push($datum,substr($data, $i, 8));
+ }
+ $hour = unRational($datum[0],$type,$intel);
+ $minutes = unRational($datum[1],$type,$intel);
+ $seconds = unRational($datum[2],$type,$intel);
+ if($tag=="0007") { //Time
+ $data = $hour.":".$minutes.":".$seconds;
+ } else {
+ $data = $hour+$minutes/60+$seconds/3600;
}
- $minutes = GPSRational(substr($data,16,16),$intel);
-
- $data = $hour+$minutes/60+$seconds/3600;
- } else if($tag=="0007") { //Time
- $seconds = GPSRational(substr($data,0,16),$intel);
- $minutes = GPSRational(substr($data,16,16),$intel);
- $hour = GPSRational(substr($data,32,16),$intel);
-
- $data = $hour.":".$minutes.":".$seconds;
} else {
- if($bottom!=0) $data=$top/$bottom;
- else if($top==0) $data = 0;
- else $data=$top."/".$bottom;
-
- if($tag=="0006"){
- $data .= 'm';
- }
+ $data = unRational($data,$type,$intel);
+
+ if($tag=="0006"){
+ $data .= 'm';
+ }
}
} else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") {
- $data = bin2hex($data);
- if($intel==1) $data = intel2Moto($data);
- $data=hexdec($data);
-
-
+ $data = rational($data,$type,$intel);
+
+
} else if($type=="UNDEFINED") {
-
-
-
+
+
+
} else if($type=="UBYTE") {
$data = bin2hex($data);
if($intel==1) $num = intel2Moto($data);
if($tag=="0000") { // VersionID
- $data = hexdec(substr($data,0,2)) .
+ $data = hexdec(substr($data,0,2)) .
".". hexdec(substr($data,2,2)) .
".". hexdec(substr($data,4,2)) .
".". hexdec(substr($data,6,2));
- } else if($tag=="0005"){ // Altitude Reference
- if($data == "00000000"){ $data = 'Above Sea Level'; }
- else if($data == "01000000"){ $data = 'Below Sea Level'; }
- }
-
+ } else if($tag=="0005"){ // Altitude Reference
+ if($data == "00000000"){ $data = '+'; }
+ else if($data == "01000000"){ $data = '-'; }
+ }
+
} else {
$data = bin2hex($data);
if($intel==1) $data = intel2Moto($data);
}
-
+
return $data;
}
@@ -220,21 +183,26 @@ function parseGPS($block,&$result,$offset,$seek, $globalOffset) {
//4 byte value or pointer to value if larger than 4 bytes
$value = substr($block,$place,4);$place+=4;
-
if($bytesofdata<=4) {
$data = $value;
} else {
- $value = bin2hex($value);
- if($intel==1) $value = 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) {
- $data = fread($seek, $bytesofdata);
- } else if($v==-1) {
+ if (strpos('unknown',$tag_name) !== false || $bytesofdata > 1024) {
$result['Errors'] = $result['Errors']++;
+ $data = '';
+ $type = 'ASCII';
+ } else {
+ $value = bin2hex($value);
+ if($intel==1) $value = 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) {
+ $data = fread($seek, $bytesofdata);
+ } else {
+ $result['Errors'] = $result['Errors']++;
+ $data = '';
+ $type = 'ASCII';
+ }
}
}
-
if($result['VerboseOutput']==1) {
$result['GPS'][$tag_name] = formatGPSData($type,$tag,$intel,$data);
$result['GPS'][$tag_name."_Verbose"]['RawData'] = bin2hex($data);
diff --git a/modules/exif/lib/makers/nikon.php b/modules/exif/lib/makers/nikon.php
index ebc2af7c..d2fff9a2 100644
--- a/modules/exif/lib/makers/nikon.php
+++ b/modules/exif/lib/makers/nikon.php
@@ -57,8 +57,32 @@ function lookup_Nikon_tag($tag,$model) {
case "0008": $tag = "FlashSetting";break;
case "0009": $tag = "FlashMode";break;
case "000b": $tag = "WhiteBalanceFine";break;
+ case "000c": $tag = "WB_RBLevels";break;
+ case "000d": $tag = "ProgramShift";break;
+ case "000e": $tag = "ExposureDifference";break;
case "000f": $tag = "ISOSelection";break;
- case "0013": $tag = "ISOSelection2";break;
+ case "0010": $tag = "DataDump";break;
+ case "0011": $tag = "NikonPreview";break;
+ case "0012": $tag = "FlashExposureComp";break;
+ case "0013": $tag = "ISOSetting2";break;
+ case "0014": $tag = "ColorBalanceA";break;
+ case "0016": $tag = "ImageBoundary";break;
+ case "0017": $tag = "FlashExposureComp";break;
+ case "0018": $tag = "FlashExposureBracketValue";break;
+ case "0019": $tag = "ExposureBracketValue";break;
+ case "001a": $tag = "ImageProcessing";break;
+ case "001b": $tag = "CropHiSpeed";break;
+ case "001c": $tag = "ExposureTuning";break;
+ case "001d": $tag = "SerialNumber";break;
+ case "001e": $tag = "ColorSpace";break;
+ case "001f": $tag = "VRInfo";break;
+ case "0020": $tag = "ImageAuthentication";break;
+ case "0022": $tag = "ActiveD-Lighting";break;
+ case "0023": $tag = "PictureControl";break;
+ case "0024": $tag = "WorldTime";break;
+ case "0025": $tag = "ISOInfo";break;
+ case "002a": $tag = "VignetteControl";break;
+ case "002b": $tag = "DistortInfo";break;
case "0080": $tag = "ImageAdjustment";break;
case "0081": $tag = "ToneCompensation";break;
case "0082": $tag = "Adapter";break;
@@ -68,11 +92,16 @@ function lookup_Nikon_tag($tag,$model) {
case "0086": $tag = "DigitalZoom";break;
case "0087": $tag = "FlashUsed";break;
case "0088": $tag = "AFFocusPosition";break;
+ case "0089": $tag = "ShootingMode";break;
+ case "008b": $tag = "LensFStops";break;
+ case "008c": $tag = "ContrastCurve";break;
case "008d": $tag = "ColorMode";break;
case "0090": $tag = "LightType";break;
+ case "0092": $tag = "HueAdjustment";break;
+ case "0093": $tag = "NEFCompression";break;
case "0094": $tag = "Saturation";break;
case "0095": $tag = "NoiseReduction";break;
- case "0010": $tag = "DataDump";break;
+ case "009a": $tag = "SensorPixelSize";break;
default: $tag = "unknown:".$tag;break;
}
@@ -81,120 +110,172 @@ function lookup_Nikon_tag($tag,$model) {
return $tag;
}
+
//=================
// Formats Data for the data type
//====================================================================
function formatNikonData($type,$tag,$intel,$model,$data) {
-
- if($type=="ASCII") {
-
-
- } else if($type=="URATIONAL" || $type=="SRATIONAL") {
- $data = bin2hex($data);
- if($intel==1) $data = 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($tag=="000a" && $model==0) { //DigitalZoom
- $data=$data."x";
- }
- } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") {
- $data = bin2hex($data);
- if($intel==1) $data = intel2Moto($data);
- $data=hexdec($data);
-
- if($tag=="0003" && $model==0) { //Quality
- if($data == 1) $data = (string) t("VGA Basic");
- else if($data == 2) $data = (string) t("VGA Normal");
- else if($data == 3) $data = (string) t("VGA Fine");
- else if($data == 4) $data = (string) t("SXGA Basic");
- else if($data == 5) $data = (string) t("SXGA Normal");
- else if($data == 6) $data = (string) t("SXGA Fine");
- else $data = (string) t("Unknown").": ".$data;
- }
- if($tag=="0004" && $model==0) { //Color
- if($data == 1) $data = (string) t("Color");
- else if($data == 2) $data = (string) t("Monochrome");
- else $data = (string) t("Unknown").": ".$data;
- }
- if($tag=="0005" && $model==0) { //Image Adjustment
- if($data == 0) $data = (string) t("Normal");
- else if($data == 1) $data = (string) t("Bright+");
- else if($data == 2) $data = (string) t("Bright-");
- else if($data == 3) $data = (string) t("Contrast+");
- else if($data == 4) $data = (string) t("Contrast-");
- else $data = (string) t("Unknown").": ".$data;
- }
- 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 = (string) t("Unknown").": ".$data;
- }
- if($tag=="0007" && $model==0) { //White Balance
- if($data == 0) $data = (string) t("Auto");
- else if($data == 1) $data = (string) t("Preset");
- else if($data == 2) $data = (string) t("Daylight");
- else if($data == 3) $data = (string) t("Incandescense");
- else if($data == 4) $data = (string) t("Flourescence");
- else if($data == 5) $data = (string) t("Cloudy");
- else if($data == 6) $data = (string) t("SpeedLight");
- else $data = (string) t("Unknown").": ".$data;
- }
- if($tag=="000b" && $model==0) { //Converter
- if($data == 0) $data = (string) t("None");
- else if($data == 1) $data = (string) t("Fisheye");
- else $data = (string) t("Unknown").": ".$data;
- }
- } else if($type=="UNDEFINED") {
-
- if($tag=="0001" && $model==1) { //Unknown (Version?)
- $data=$data/100;
- }
- if($tag=="0088" && $model==1) { //AF Focus Position
- $temp = (string) t("Center");
+ switch ($type) {
+ case "ASCII":
+ break; // do nothing!
+ case "URATIONAL":
+ case"SRATIONAL":
+ switch ($tag) {
+ case '0084': // LensInfo
+ $minFL = unRational(substr($data,0,8),$type,$intel);
+ $maxFL = unRational(substr($data,8,8),$type,$intel);
+ $minSP = unRational(substr($data,16,8),$type,$intel);
+ $maxSP = unRational(substr($data,24,8),$type,$intel);
+ if ($minFL == $maxFL) {
+ $data = sprintf('%0.0f f/%0.0f',$minFL,$minSP);
+ } elseif ($minSP == $maxSP) {
+ $data = sprintf('%0.0f-%0.0fmm f/%0.1f',$minFL,$maxFL,$minSP);
+ } else {
+ $data = sprintf('%0.0f-%0.0fmm f/%0.1f-%0.1f',$minFL,$maxFL,$minSP,$maxSP);
+ }
+ break;
+ case "0085":
+ if ($model==1) $data=unRational($data,$type,$intel)." m"; //ManualFocusDistance
+ break;
+ case "0086":
+ if ($model==1) $data=unRational($data,$type,$intel)."x"; //DigitalZoom
+ break;
+ case "000a":
+ if ($model==0) $data=unRational($data,$type,$intel)."x"; //DigitalZoom
+ break;
+ default:
+ $data=unRational($data,$type,$intel);
+ break;
+ }
+ break;
+ case "USHORT":
+ case $type=="SSHORT":
+ case $type=="ULONG":
+ case $type=="SLONG":
+ case $type=="FLOAT":
+ case $type=="DOUBLE":
+ $data = rational($data,$type,$intel);
+ switch ($tag) {
+ case "0003":
+ if ($model==0) { //Quality
+ switch ($data) {
+ case 1: $data = (string) t("VGA Basic"); break;
+ case 2: $data = (string) t("VGA Normal"); break;
+ case 3: $data = (string) t("VGA Fine"); break;
+ case 4: $data = (string) t("SXGA Basic"); break;
+ case 5: $data = (string) t("SXGA Normal"); break;
+ case 6: $data = (string) t("SXGA Fine"); break;
+ default: $data = (string) t("Unknown").": ".$data; break;
+ }
+ }
+ break;
+ case "0004":
+ if ($model==0) { //Color
+ switch ($data) {
+ case 1: $data = (string) t("Color"); break;
+ case 2: $data = (string) t("Monochrome"); break;
+ default: $data = (string) t("Unknown").": ".$data; break;
+ }
+ }
+ break;
+ case "0005":
+ if ($model==0) { //Image Adjustment
+ switch ($data) {
+ case 0: $data = (string) t("Normal"); break;
+ case 1: $data = (string) t("Bright+"); break;
+ case 2: $data = (string) t("Bright-"); break;
+ case 3: $data = (string) t("Contrast+"); break;
+ case 4: $data = (string) t("Contrast-"); break;
+ default: $data = (string) t("Unknown").": ".$data; break;
+ }
+ }
+ break;
+ case "0006":
+ if ($model==0) { //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 = (string) t("Unknown").": ".$data; break;
+ }
+ }
+ break;
+ case "0007":
+ if ($model==0) { //White Balance
+ switch ($data) {
+ case 0: $data = (string) t("Auto"); break;
+ case 1: $data = (string) t("Preset"); break;
+ case 2: $data = (string) t("Daylight"); break;
+ case 3: $data = (string) t("Incandescence"); break;
+ case 4: $data = (string) t("Fluorescence"); break;
+ case 5: $data = (string) t("Cloudy"); break;
+ case 6: $data = (string) t("SpeedLight"); break;
+ default: $data = (string) t("Unknown").": ".$data; break;
+ }
+ }
+ break;
+ case "000b":
+ if ($model==0) { //Converter
+ switch ($data) {
+ case 0: $data = (string) t("None"); break;
+ case 1: $data = (string) t("Fisheye"); break;
+ default: $data = (string) t("Unknown").": ".$data; break;
+ }
+ }
+ break;
+ }
+ break;
+ case "UNDEFINED":
+ switch ($tag) {
+ case "0001":
+ if ($model==1) $data=$data/100; break; //Unknown (Version?)
+ break;
+ case "0088":
+ if ($model==1) { //AF Focus Position
+ $temp = (string) t("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;
+ }
+ break;
+ }
+ break;
+ default:
$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;
- }
-
- } else {
- $data = bin2hex($data);
- if($intel==1) $data = intel2Moto($data);
-
- if($tag=="0083" && $model==1) { //Lens Type
- $data = hexdec(substr($data,0,2));
- if($data == 0) $data = (string) t("AF non D");
- else if($data == 1) $data = (string) t("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 = (string) t("Unknown").": ".$data;
- }
- if($tag=="0087" && $model==1) { //Flash type
- $data = hexdec(substr($data,0,2));
- if($data == 0) $data = (string) t("Did Not Fire");
- else if($data == 4) $data = (string) t("Unknown");
- else if($data == 7) $data = (string) t("External");
- else if($data == 9) $data = (string) t("On Camera");
- else $data = (string) t("Unknown").": ".$data;
- }
+ if($intel==1) $data = intel2Moto($data);
+ switch ($tag) {
+ case "0083":
+ if ($model==1) { //Lens Type
+ $data = hexdec(substr($data,0,2));
+ switch ($data) {
+ case 0: $data = (string) t("AF non D"); break;
+ case 1: $data = (string) t("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;
+ case 14: $data = "AF-D G VR"; break;
+ default: $data = (string) t("Unknown").": ".$data; break;
+ }
+ }
+ break;
+ case "0087":
+ if ($model==1) { //Flash type
+ $data = hexdec(substr($data,0,2));
+ if($data == 0) $data = (string) t("Did Not Fire");
+ else if($data == 4) $data = (string) t("Unknown");
+ else if($data == 7) $data = (string) t("External");
+ else if($data == 9) $data = (string) t("On Camera");
+ else $data = (string) t("Unknown").": ".$data;
+ }
+ break;
+ }
+ break;
}
-
return $data;
}
diff --git a/modules/exif/lib/makers/olympus.php b/modules/exif/lib/makers/olympus.php
index 17334bd8..3382fc79 100644
--- a/modules/exif/lib/makers/olympus.php
+++ b/modules/exif/lib/makers/olympus.php
@@ -57,24 +57,17 @@ function formatOlympusData($type,$tag,$intel,$data) {
if($type=="ASCII") {
} else if($type=="URATIONAL" || $type=="SRATIONAL") {
- $data = bin2hex($data);
+ $data = unRational($data,$type,$intel);
if($intel==1) $data = 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($tag=="0205") { //Unknown2
- $data=$top."/".$bottom;
+
}
} else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") {
- $data = bin2hex($data);
- if($intel==1) $data = intel2Moto($data);
- $data=hexdec($data);
+ $data = rational($data,$type,$intel);
if($tag=="0201") { //JPEGQuality
if($data == 1) $data = "SQ";
diff --git a/modules/exif/lib/makers/panasonic.php b/modules/exif/lib/makers/panasonic.php
index d82d374d..47a05996 100644
--- a/modules/exif/lib/makers/panasonic.php
+++ b/modules/exif/lib/makers/panasonic.php
@@ -85,18 +85,10 @@ function formatPanasonicData($type,$tag,$intel,$data) {
}
} else if($type=="URATIONAL" || $type=="SRATIONAL") {
- $data = bin2hex($data);
- if($intel==1) $data = 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;
+ $data = unRational($data,$type,$intel);
} else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") {
- $data = bin2hex($data);
- if($intel==1) $data = intel2Moto($data);
- $data=hexdec($data);
+ $data = rational($data,$type,$intel);
if($tag=="0001") { //Image Quality
if($data == 2) $data = (string) t("High");
diff --git a/modules/exif/lib/makers/sanyo.php b/modules/exif/lib/makers/sanyo.php
index 661741dd..3eef201e 100644
--- a/modules/exif/lib/makers/sanyo.php
+++ b/modules/exif/lib/makers/sanyo.php
@@ -54,19 +54,10 @@ function formatSanyoData($type,$tag,$intel,$data) {
} else if($type=="URATIONAL" || $type=="SRATIONAL") {
- $data = bin2hex($data);
- if($intel==1) $data = 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;
-
+ $data = unRational($data,$type,$intel);
} else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") {
- $data = bin2hex($data);
- if($intel==1) $data = intel2Moto($data);
- $data=hexdec($data);
+ $data = rational($data,$type,$intel);
if($tag=="0200") { //SpecialMode
if($data == 0) $data = (string) t("Normal");
diff --git a/modules/gallery/helpers/gallery_block.php b/modules/gallery/helpers/gallery_block.php
index 08ce21b7..cb28cbcd 100644
--- a/modules/gallery/helpers/gallery_block.php
+++ b/modules/gallery/helpers/gallery_block.php
@@ -70,9 +70,9 @@ class gallery_block_Core {
$block->css_id = "g-platform";
$block->title = t("Platform information");
$block->content = new View("admin_block_platform.html");
- if (@is_readable("/proc/loadavg")) {
+ if (@is_readable("/proc/loadavg") && $first_line = current(@file("/proc/loadavg"))) {
$block->content->load_average =
- join(" ", array_slice(explode(" ", current(file("/proc/loadavg"))), 0, 3));
+ join(" ", array_slice(explode(" ", $first_line), 0, 3));
} else {
$block->content->load_average = t("Unavailable");
}
diff --git a/modules/gallery/helpers/gallery_event.php b/modules/gallery/helpers/gallery_event.php
index 89ad6a4c..ae7131ae 100644
--- a/modules/gallery/helpers/gallery_event.php
+++ b/modules/gallery/helpers/gallery_event.php
@@ -242,7 +242,7 @@ class gallery_event_Core {
$csrf = access::csrf_token();
$theme_item = $theme->item();
$page_type = $theme->page_type();
- if ($item->is_photo() && graphics::can("rotate")) {
+ if ($can_edit && $item->is_photo() && graphics::can("rotate")) {
$options_menu
->append(
Menu::factory("ajax_link")