diff options
author | 2017-02-06 16:34:41 -0800 | |
---|---|---|
committer | 2017-02-08 23:51:42 +0000 | |
commit | e1f5e6fd7ad07778fa4381059852a94567d77dfc (patch) | |
tree | d21543bb6ac6bc38fd6ed4668a8d1a894e7846f1 /libs/ui/HdrCapabilities.cpp | |
parent | ebdddc9a3ea71b409f04e0d51eef69682a5542f8 (diff) |
Break dependency of libui on libbinder
the dependency existed only because of
HdrCapabilities, which inherited from
Parcelable, instead of LightFlatenable<>.
An added benefit is that HdrCapabilities isn’t
virtual anymore.
Also, since the dtor is not trivial, move it to
the cpp, to avoid inlining.
Fix-up includes.
Test: built and booted device
Change-Id: Iaf9c4ef9dcc5cb28b29f79d9f7d8f21800223eb8
Diffstat (limited to 'libs/ui/HdrCapabilities.cpp')
-rw-r--r-- | libs/ui/HdrCapabilities.cpp | 90 |
1 files changed, 61 insertions, 29 deletions
diff --git a/libs/ui/HdrCapabilities.cpp b/libs/ui/HdrCapabilities.cpp index 511f68ab4c..39adc5e929 100644 --- a/libs/ui/HdrCapabilities.cpp +++ b/libs/ui/HdrCapabilities.cpp @@ -16,44 +16,76 @@ #include <ui/HdrCapabilities.h> -#include <binder/Parcel.h> - namespace android { -status_t HdrCapabilities::writeToParcel(Parcel* parcel) const -{ - status_t result = parcel->writeInt32Vector(mSupportedHdrTypes); - if (result != OK) { - return result; - } - result = parcel->writeFloat(mMaxLuminance); - if (result != OK) { - return result; +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundefined-reinterpret-cast" +#endif + +HdrCapabilities::~HdrCapabilities() = default; +HdrCapabilities::HdrCapabilities(HdrCapabilities&& other) = default; +HdrCapabilities& HdrCapabilities::operator=(HdrCapabilities&& other) = default; + + +size_t HdrCapabilities::getFlattenedSize() const { + return sizeof(mMaxLuminance) + + sizeof(mMaxAverageLuminance) + + sizeof(mMinLuminance) + + sizeof(int32_t) + + mSupportedHdrTypes.size() * sizeof(int32_t); +} + +status_t HdrCapabilities::flatten(void* buffer, size_t size) const { + + if (size < getFlattenedSize()) { + return NO_MEMORY; } - result = parcel->writeFloat(mMaxAverageLuminance); - if (result != OK) { - return result; + + int32_t* const buf = static_cast<int32_t*>(buffer); + reinterpret_cast<float&>(buf[0]) = mMaxLuminance; + reinterpret_cast<float&>(buf[1]) = mMaxAverageLuminance; + reinterpret_cast<float&>(buf[2]) = mMinLuminance; + buf[3] = static_cast<int32_t>(mSupportedHdrTypes.size()); + for (size_t i = 0, c = mSupportedHdrTypes.size(); i < c; ++i) { + buf[4 + i] = mSupportedHdrTypes[i]; } - result = parcel->writeFloat(mMinLuminance); - return result; + return NO_ERROR; } -status_t HdrCapabilities::readFromParcel(const Parcel* parcel) -{ - status_t result = parcel->readInt32Vector(&mSupportedHdrTypes); - if (result != OK) { - return result; +status_t HdrCapabilities::unflatten(void const* buffer, size_t size) { + + size_t minSize = sizeof(mMaxLuminance) + + sizeof(mMaxAverageLuminance) + + sizeof(mMinLuminance) + + sizeof(int32_t); + + if (size < minSize) { + return NO_MEMORY; } - result = parcel->readFloat(&mMaxLuminance); - if (result != OK) { - return result; + + int32_t const * const buf = static_cast<int32_t const *>(buffer); + const size_t itemCount = size_t(buf[3]); + + // check the buffer is large enough + if (size < minSize + itemCount * sizeof(int32_t)) { + return BAD_VALUE; } - result = parcel->readFloat(&mMaxAverageLuminance); - if (result != OK) { - return result; + + mMaxLuminance = reinterpret_cast<float const&>(buf[0]); + mMaxAverageLuminance = reinterpret_cast<float const&>(buf[1]); + mMinLuminance = reinterpret_cast<float const&>(buf[2]); + if (itemCount) { + mSupportedHdrTypes.reserve(itemCount); + for (size_t i = 0; i < itemCount; ++i) { + mSupportedHdrTypes[i] = buf[4 + i]; + } } - result = parcel->readFloat(&mMinLuminance); - return result; + return NO_ERROR; } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + } // namespace android |