aboutsummaryrefslogtreecommitdiffstats
path: root/yage/base/imageloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'yage/base/imageloader.cpp')
-rw-r--r--yage/base/imageloader.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/yage/base/imageloader.cpp b/yage/base/imageloader.cpp
new file mode 100644
index 00000000..0d7d5df9
--- /dev/null
+++ b/yage/base/imageloader.cpp
@@ -0,0 +1,57 @@
+/* ----------------------------------------------------------------------------
+ * imageloader.cpp
+ *
+ * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com> -- MIT License
+ * See file LICENSE for more details
+ * ----------------------------------------------------------------------------
+ */
+
+#include <yage/base/imageloader.h>
+#include <yage/base/iomanager.h>
+#include <yage/base/picopng.h>
+
+#include <stdexcept>
+
+namespace yage
+{
+
+Texture ImageLoader::loadPng(const std::string &file_path)
+{
+ std::vector<unsigned char> in;
+ std::vector<unsigned char> out;
+ unsigned long width, height;
+
+ if (!IoManager::readFileToBuffer(file_path, in)) {
+ throw std::runtime_error("Failed to load '" + file_path +
+ "' to buffer");
+ }
+
+ int error_code = decodePNG(out, width, height, &in[0], in.size());
+ if (error_code != 0) {
+ throw std::runtime_error("Failed to load '" + file_path +
+ "' to png with error code" +
+ std::to_string(error_code));
+ }
+
+ Texture texture{0, (int)width, (int)height};
+
+ glGenTextures(1, &texture.id);
+
+ glBindTexture(GL_TEXTURE_2D, texture.id);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, &out[0]);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+
+ glGenerateMipmap(GL_TEXTURE_2D);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ return texture;
+}
+
+} // namespace yage