| #include "image_io/base/byte_buffer.h" |
| |
| #include <utility> |
| |
| namespace photos_editing_formats { |
| namespace image_io { |
| |
| using std::string; |
| using std::unique_ptr; |
| |
| /// @param byte_data The byte data to write to the buffer at pos. |
| /// @param pos The location in a buffer to write the byte data to. |
| /// @return The number of bytes written to the buffer at pos. |
| static size_t WriteBytes(const ByteData& byte_data, Byte* pos) { |
| size_t byte_count = byte_data.GetByteCount(); |
| if (!byte_count) { |
| return 0; |
| } |
| if (byte_data.GetType() == ByteData::kHex) { |
| const string& value = byte_data.GetValue(); |
| for (size_t index = 0; index < byte_count; ++index) { |
| if (!ByteData::Hex2Byte(value[2 * index], value[2 * index + 1], pos++)) { |
| return 0; |
| } |
| } |
| } else { |
| memcpy(pos, byte_data.GetValue().c_str(), byte_count); |
| } |
| return byte_count; |
| } |
| |
| ByteBuffer::ByteBuffer(size_t size, std::unique_ptr<Byte[]> buffer) |
| : buffer_(std::move(buffer)), size_(size) { |
| if (!buffer_) { |
| size_ = 0; |
| } |
| if (!size_) { |
| buffer_.reset(); |
| } |
| } |
| |
| ByteBuffer::ByteBuffer(const std::vector<ByteData>& byte_data_vector) { |
| size_ = 0; |
| for (const auto& byte_data : byte_data_vector) { |
| size_ += byte_data.GetByteCount(); |
| } |
| if (!size_) { |
| return; |
| } |
| // Note that within google3, std::make_unique is not available, and clangtidy |
| // says use absl::make_unique. This library attempts to minimize the number of |
| // dependencies on google3, hence the no lint on the next line. |
| buffer_.reset(new Byte[size_]); // NOLINT |
| Byte* pos = buffer_.get(); |
| for (const auto& byte_data : byte_data_vector) { |
| size_t bytes_written = WriteBytes(byte_data, pos); |
| if (bytes_written == 0 && byte_data.GetByteCount() != 0) { |
| size_ = 0; |
| buffer_.reset(nullptr); |
| } |
| pos += bytes_written; |
| } |
| } |
| |
| bool ByteBuffer::SetBigEndianValue(size_t location, std::uint16_t value) { |
| if (location + 1 >= size_) { |
| return false; |
| } |
| buffer_[location] = static_cast<Byte>(value >> 8); |
| buffer_[location + 1] = static_cast<Byte>(value & 0xFF); |
| return true; |
| } |
| |
| Byte* ByteBuffer::Release() { |
| size_ = 0; |
| return buffer_.release(); |
| } |
| |
| } // namespace image_io |
| } // namespace photos_editing_formats |