diff options
Diffstat (limited to 'xbmc/guilib/XBTF.cpp')
-rw-r--r-- | xbmc/guilib/XBTF.cpp | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/xbmc/guilib/XBTF.cpp b/xbmc/guilib/XBTF.cpp new file mode 100644 index 0000000..aa095cc --- /dev/null +++ b/xbmc/guilib/XBTF.cpp @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "XBTF.h" + +#include <cstring> +#include <utility> + +CXBTFFrame::CXBTFFrame() +{ + m_width = 0; + m_height = 0; + m_packedSize = 0; + m_unpackedSize = 0; + m_offset = 0; + m_format = XB_FMT_UNKNOWN; + m_duration = 0; +} + +uint32_t CXBTFFrame::GetWidth() const +{ + return m_width; +} + +void CXBTFFrame::SetWidth(uint32_t width) +{ + m_width = width; +} + +uint32_t CXBTFFrame::GetHeight() const +{ + return m_height; +} + +void CXBTFFrame::SetHeight(uint32_t height) +{ + m_height = height; +} + +uint64_t CXBTFFrame::GetPackedSize() const +{ + return m_packedSize; +} + +void CXBTFFrame::SetPackedSize(uint64_t size) +{ + m_packedSize = size; +} + +bool CXBTFFrame::IsPacked() const +{ + return m_unpackedSize != m_packedSize; +} + +bool CXBTFFrame::HasAlpha() const +{ + return (m_format & XB_FMT_OPAQUE) == 0; +} + +uint64_t CXBTFFrame::GetUnpackedSize() const +{ + return m_unpackedSize; +} + +void CXBTFFrame::SetUnpackedSize(uint64_t size) +{ + m_unpackedSize = size; +} + +void CXBTFFrame::SetFormat(uint32_t format) +{ + m_format = format; +} + +uint32_t CXBTFFrame::GetFormat(bool raw) const +{ + return raw ? m_format : (m_format & XB_FMT_MASK); +} + +uint64_t CXBTFFrame::GetOffset() const +{ + return m_offset; +} + +void CXBTFFrame::SetOffset(uint64_t offset) +{ + m_offset = offset; +} + +uint32_t CXBTFFrame::GetDuration() const +{ + return m_duration; +} + +void CXBTFFrame::SetDuration(uint32_t duration) +{ + m_duration = duration; +} + +uint64_t CXBTFFrame::GetHeaderSize() const +{ + uint64_t result = + sizeof(m_width) + + sizeof(m_height) + + sizeof(m_format) + + sizeof(m_packedSize) + + sizeof(m_unpackedSize) + + sizeof(m_offset) + + sizeof(m_duration); + + return result; +} + +CXBTFFile::CXBTFFile() + : m_path(), + m_frames() +{ } + +const std::string& CXBTFFile::GetPath() const +{ + return m_path; +} + +void CXBTFFile::SetPath(const std::string& path) +{ + m_path = path; +} + +uint32_t CXBTFFile::GetLoop() const +{ + return m_loop; +} + +void CXBTFFile::SetLoop(uint32_t loop) +{ + m_loop = loop; +} + +const std::vector<CXBTFFrame>& CXBTFFile::GetFrames() const +{ + return m_frames; +} + +std::vector<CXBTFFrame>& CXBTFFile::GetFrames() +{ + return m_frames; +} + +uint64_t CXBTFFile::GetPackedSize() const +{ + uint64_t size = 0; + for (const auto& frame : m_frames) + size += frame.GetPackedSize(); + + return size; +} + +uint64_t CXBTFFile::GetUnpackedSize() const +{ + uint64_t size = 0; + for (const auto& frame : m_frames) + size += frame.GetUnpackedSize(); + + return size; +} + +uint64_t CXBTFFile::GetHeaderSize() const +{ + uint64_t result = + MaximumPathLength + + sizeof(m_loop) + + sizeof(uint32_t); /* Number of frames */ + + for (const auto& frame : m_frames) + result += frame.GetHeaderSize(); + + return result; +} + +uint64_t CXBTFBase::GetHeaderSize() const +{ + uint64_t result = XBTF_MAGIC.size() + XBTF_VERSION.size() + + sizeof(uint32_t) /* number of files */; + + for (const auto& file : m_files) + result += file.second.GetHeaderSize(); + + return result; +} + +bool CXBTFBase::Exists(const std::string& name) const +{ + CXBTFFile dummy; + return Get(name, dummy); +} + +bool CXBTFBase::Get(const std::string& name, CXBTFFile& file) const +{ + const auto& iter = m_files.find(name); + if (iter == m_files.end()) + return false; + + file = iter->second; + return true; +} + +std::vector<CXBTFFile> CXBTFBase::GetFiles() const +{ + std::vector<CXBTFFile> files; + files.reserve(m_files.size()); + + for (const auto& file : m_files) + files.push_back(file.second); + + return files; +} + +void CXBTFBase::AddFile(const CXBTFFile& file) +{ + m_files.insert(std::make_pair(file.GetPath(), file)); +} + +void CXBTFBase::UpdateFile(const CXBTFFile& file) +{ + auto&& it = m_files.find(file.GetPath()); + if (it == m_files.end()) + return; + + it->second = file; +} |