aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/utils/helpers/bmp.hpp
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2016-10-17 10:42:02 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2016-10-17 10:42:02 +0300
commitb42c52475d6e86f6ae0ed01f502bd0b611974578 (patch)
tree30f4777c39f7d07aed6a85209a03bc8af44a415d /utils/helpers/bmp.hpp
parentfix compiler warnings (diff)
downloadaes-tools-b42c52475d6e86f6ae0ed01f502bd0b611974578.tar.gz
aes-tools-b42c52475d6e86f6ae0ed01f502bd0b611974578.zip
utils: code dedupe
Diffstat (limited to '')
-rw-r--r--utils/helpers/bmp.hpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/utils/helpers/bmp.hpp b/utils/helpers/bmp.hpp
new file mode 100644
index 0000000..dc3cdac
--- /dev/null
+++ b/utils/helpers/bmp.hpp
@@ -0,0 +1,51 @@
+// Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com>
+// This file is part of the "AES tools" project.
+// For details, see https://github.com/egor-tensin/aes-tools.
+// Distributed under the MIT License.
+
+#include <Windows.h>
+
+#include <cstddef>
+#include <cstring>
+
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace bmp
+{
+ class BmpFile
+ {
+ public:
+ BmpFile(std::vector<char>&& buffer)
+ : buffer{std::move(buffer)}
+ , header_size{extract_pixels_offset()}
+ { }
+
+ const void* get_buffer() const { return buffer.data(); }
+
+ std::size_t get_size() const { return buffer.size(); }
+
+ std::size_t get_header_size() const { return header_size; }
+
+ const void* get_pixels() const { return buffer.data() + get_header_size(); }
+
+ std::size_t get_pixels_size() const { return get_size() - get_header_size(); }
+
+ void replace_pixels(std::vector<unsigned char>&& pixels)
+ {
+ buffer.resize(get_header_size() + pixels.size());
+ std::memcpy(buffer.data() + get_header_size(), pixels.data(), pixels.size());
+ }
+
+ private:
+ std::size_t extract_pixels_offset() const
+ {
+ const auto header = reinterpret_cast<const BITMAPFILEHEADER*>(get_buffer());
+ return header->bfOffBits;
+ }
+
+ std::vector<char> buffer;
+ std::size_t header_size;
+ };
+}