From 126cba16cf6b3400ac5c612aa39d0ce418023e02 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 14 May 2024 18:26:02 +0200 Subject: [PATCH] DIRECTOR: Factored out XPFloat reading --- engines/director/lingo/lingo-bytecode.cpp | 6 +----- engines/director/util.cpp | 12 ++++++++++++ engines/director/util.h | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp index b341e87f3f0..452aef9d4fb 100644 --- a/engines/director/lingo/lingo-bytecode.cpp +++ b/engines/director/lingo/lingo-bytecode.cpp @@ -22,7 +22,6 @@ #include "common/config-manager.h" #include "common/file.h" #include "common/substream.h" -#include "common/xpfloat.h" #include "director/director.h" #include "director/cast.h" @@ -1242,10 +1241,7 @@ ScriptContext *LingoCompiler::compileLingoV4(Common::SeekableReadStreamEndian &s // Floats are stored as an "80 bit IEEE Standard 754 floating // point number (Standard Apple Numeric Environment [SANE] data type // Extended). - uint16 signAndExponent = READ_BE_UINT16(&constsStore[pointer]); - uint64 mantissa = READ_BE_UINT64(&constsStore[pointer+2]); - - constant.u.f = Common::XPFloat(signAndExponent, mantissa).toDouble(Common::XPFloat::kSemanticsSANE); + constant.u.f = readAppleFloat80(&constsStore[pointer]); } else if (length == 8) { constant.u.f = READ_BE_FLOAT64(&constsStore[pointer]); } else { diff --git a/engines/director/util.cpp b/engines/director/util.cpp index cab1244f49e..1d43798e6c4 100644 --- a/engines/director/util.cpp +++ b/engines/director/util.cpp @@ -26,6 +26,7 @@ #include "common/punycode.h" #include "common/str-array.h" #include "common/tokenizer.h" +#include "common/xpfloat.h" #include "common/compression/deflate.h" #include "director/types.h" @@ -1650,4 +1651,15 @@ void DirectorEngine::delayMillis(uint32 delay) { _system->delayMillis(delay); } +double readAppleFloat80(byte *ptr) { + // Floats in an "80 bit IEEE Standard 754 floating + // point number (Standard Apple Numeric Environment [SANE] data type + // Extended). + + uint16 signAndExponent = READ_BE_UINT16(&ptr[0]); + uint64 mantissa = READ_BE_UINT64(&ptr[2]); + + return Common::XPFloat(signAndExponent, mantissa).toDouble(Common::XPFloat::kSemanticsSANE); +} + } // End of namespace Director diff --git a/engines/director/util.h b/engines/director/util.h index a9cb0d2a6bb..59f4f8d8e91 100644 --- a/engines/director/util.h +++ b/engines/director/util.h @@ -70,6 +70,8 @@ Common::Path dumpFactoryName(const char *prefix, const char *name, const char *e bool isButtonSprite(SpriteType spriteType); +double readAppleFloat80(byte *ptr); + class RandomState { public: uint32 _seed;