aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/utils/helpers
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--utils/helpers/bmp.hpp51
-rw-r--r--utils/helpers/file.hpp18
2 files changed, 66 insertions, 3 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;
+ };
+}
diff --git a/utils/helpers/file.hpp b/utils/helpers/file.hpp
index a327c35..febe98f 100644
--- a/utils/helpers/file.hpp
+++ b/utils/helpers/file.hpp
@@ -3,10 +3,12 @@
// For details, see https://github.com/egor-tensin/aes-tools.
// Distributed under the MIT License.
+#include <cassert>
#include <cstddef>
#include <fstream>
#include <iterator>
+#include <limits>
#include <string>
#include <vector>
@@ -17,7 +19,9 @@ namespace file
std::ifstream ifs;
ifs.exceptions(std::ifstream::badbit | std::ifstream::failbit);
ifs.open(path, std::ifstream::binary | std::ifstream::ate);
- return ifs.tellg();
+ const auto size = static_cast<std::streamoff>(ifs.tellg());
+ assert(size <= static_cast<std::streamoff>(std::numeric_limits<std::size_t>::max()));
+ return static_cast<std::size_t>(size);
}
inline std::vector<char> read_file(const std::string& path)
@@ -38,11 +42,19 @@ namespace file
inline void write_file(
const std::string& path,
- const std::vector<unsigned char>& src)
+ const void* buffer,
+ const std::size_t size)
{
std::ofstream ofs;
ofs.exceptions(std::ofstream::badbit | std::ofstream::failbit);
ofs.open(path, std::ofstream::binary);
- ofs.write(reinterpret_cast<const char*>(src.data()), src.size());
+ ofs.write(reinterpret_cast<const char*>(buffer), size);
+ }
+
+ inline void write_file(
+ const std::string& path,
+ const std::vector<unsigned char>& src)
+ {
+ write_file(path, src.data(), src.size());
}
}