1 /* 2 * Copyright 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <ui/HdrCapabilities.h> 18 19 namespace android { 20 21 #if defined(__clang__) 22 #pragma clang diagnostic push 23 #pragma clang diagnostic ignored "-Wundefined-reinterpret-cast" 24 #endif 25 getFlattenedSize() const26size_t HdrCapabilities::getFlattenedSize() const { 27 return sizeof(mMaxLuminance) + 28 sizeof(mMaxAverageLuminance) + 29 sizeof(mMinLuminance) + 30 sizeof(int32_t) + 31 mSupportedHdrTypes.size() * sizeof(ui::Hdr); 32 } 33 flatten(void * buffer,size_t size) const34status_t HdrCapabilities::flatten(void* buffer, size_t size) const { 35 36 if (size < getFlattenedSize()) { 37 return NO_MEMORY; 38 } 39 40 int32_t* const buf = static_cast<int32_t*>(buffer); 41 reinterpret_cast<float&>(buf[0]) = mMaxLuminance; 42 reinterpret_cast<float&>(buf[1]) = mMaxAverageLuminance; 43 reinterpret_cast<float&>(buf[2]) = mMinLuminance; 44 buf[3] = static_cast<int32_t>(mSupportedHdrTypes.size()); 45 for (size_t i = 0, c = mSupportedHdrTypes.size(); i < c; ++i) { 46 buf[4 + i] = static_cast<int32_t>(mSupportedHdrTypes[i]); 47 } 48 return NO_ERROR; 49 } 50 unflatten(void const * buffer,size_t size)51status_t HdrCapabilities::unflatten(void const* buffer, size_t size) { 52 53 size_t minSize = sizeof(mMaxLuminance) + 54 sizeof(mMaxAverageLuminance) + 55 sizeof(mMinLuminance) + 56 sizeof(int32_t); 57 58 if (size < minSize) { 59 return NO_MEMORY; 60 } 61 62 int32_t const * const buf = static_cast<int32_t const *>(buffer); 63 const size_t itemCount = size_t(buf[3]); 64 65 // check the buffer is large enough 66 if (size < minSize + itemCount * sizeof(int32_t)) { 67 return BAD_VALUE; 68 } 69 70 mMaxLuminance = reinterpret_cast<float const&>(buf[0]); 71 mMaxAverageLuminance = reinterpret_cast<float const&>(buf[1]); 72 mMinLuminance = reinterpret_cast<float const&>(buf[2]); 73 if (itemCount) { 74 mSupportedHdrTypes.resize(itemCount); 75 for (size_t i = 0; i < itemCount; ++i) { 76 mSupportedHdrTypes[i] = static_cast<ui::Hdr>(buf[4 + i]); 77 } 78 } 79 return NO_ERROR; 80 } 81 82 #if defined(__clang__) 83 #pragma clang diagnostic pop 84 #endif 85 86 } // namespace android 87