diff --git a/src/panasonicmn_int.cpp b/src/panasonicmn_int.cpp index 617c5d20..a95fa10b 100644 --- a/src/panasonicmn_int.cpp +++ b/src/panasonicmn_int.cpp @@ -691,17 +691,15 @@ namespace Exiv2 { std::ostream& PanasonicMakerNote::printAccelerometer(std::ostream& os, const Value& value, const ExifData*) { - // value is stored as unsigned int, but should be readed as signed int, so manually convert it - int i = value.toLong(); - i = i - ((i & 0x8000) >> 15) * 0xffff; + // value is stored as unsigned int, but should be read as int16_t. + const int16_t i = static_cast(value.toLong()); return os << i; } // PanasonicMakerNote::printAccelerometer std::ostream& PanasonicMakerNote::printRollAngle(std::ostream& os, const Value& value, const ExifData*) { - // roll angle is stored as signed int, but tag states to be unsigned int - int i = value.toLong(); - i = i - ((i & 0x8000) >> 15) * 0xffff; + // value is stored as unsigned int, but should be read as int16_t. + const int16_t i = static_cast(value.toLong()); std::ostringstream oss; oss.copyfmt(os); os << std::fixed << std::setprecision(1) << i / 10.0; @@ -712,10 +710,8 @@ namespace Exiv2 { std::ostream& PanasonicMakerNote::printPitchAngle(std::ostream& os, const Value& value, const ExifData*) { - // pitch angle is stored as signed int, but tag states to be unsigned int - // change sign to be compatible with ExifTool: positive is upwards - int i = value.toLong(); - i = i - ((i & 0x8000) >> 15) * 0xffff; + // value is stored as unsigned int, but should be read as int16_t. + const int16_t i = static_cast(value.toLong()); std::ostringstream oss; oss.copyfmt(os); os << std::fixed << std::setprecision(1) << -i / 10.0; diff --git a/tests/bugfixes/github/test_issue_2006.py b/tests/bugfixes/github/test_issue_2006.py index 3a67e86c..46b00bd5 100644 --- a/tests/bugfixes/github/test_issue_2006.py +++ b/tests/bugfixes/github/test_issue_2006.py @@ -16,6 +16,6 @@ class PanasonicMakerPrintAccelerometerIntOverflow(metaclass=CaseMeta): Exif.Image.DNGPrivateData 0x2020 32 80 97 110 97 115 111 110 105 99 32 32 32 0 32 32 255 32 32 32 32 32 255 255 255 32 255 255 198 52 32 32 0 Exif.MakerNote.Offset Long 1 48 Exif.MakerNote.ByteOrder Ascii 3 MM -Exif.Panasonic.AccelerometerY SLong 4 2147483425 +Exif.Panasonic.AccelerometerY SLong 4 -224 """] retval = [0]