diff options
author | chai <chaifix@163.com> | 2018-05-29 12:39:52 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-05-29 12:39:52 +0800 |
commit | e024e5a23c4f5c8e8fb02e7b03c8e9265ac6c1ef (patch) | |
tree | a19511ccb880db2f7dd99778efc956435474a518 /src/libjin/render/image.cpp | |
parent | 2add73bb54ce9376ffcd44ffd929049d3c430628 (diff) |
Image改为工厂
Diffstat (limited to 'src/libjin/render/image.cpp')
-rw-r--r-- | src/libjin/render/image.cpp | 69 |
1 files changed, 31 insertions, 38 deletions
diff --git a/src/libjin/render/image.cpp b/src/libjin/render/image.cpp index 7955aa2..564b54e 100644 --- a/src/libjin/render/image.cpp +++ b/src/libjin/render/image.cpp @@ -1,3 +1,4 @@ +#include <fstream> #include "image.h" #include "3rdparty/stb/stb_image.h" #include "../utils/utils.h" @@ -8,16 +9,40 @@ namespace jin namespace render { - Image::Image(const char* file) - : Drawable(), pixels(0) + Image* Image::createImage(const char* file) + { + std::ifstream fs; + fs.open(file, std::ios::binary); + Image* img = nullptr; + if (fs.is_open()) + { + fs.seekg(0, std::ios::end); + int size = fs.tellg(); + fs.seekg(0, std::ios::beg); + char* buffer = (char*)malloc(size); + memset(buffer, 0, size); + fs.read(buffer, size); + img = createImage(buffer, size); + free(buffer); + } + fs.close(); + return img; + } + + Image* Image::createImage(const void* mem, size_t size) { - loadf(file); + Image* img = new Image(); + if(!img->loadb(mem, size)) + { + delete img; + img = nullptr; + } + return img; } - Image::Image(const char* buffer, size_t size) + Image::Image() : Drawable(), pixels(0) { - loadb(buffer, size); } Image::~Image() @@ -34,39 +59,7 @@ namespace render return pixels[x + y * width]; } - bool Image::loadf(const char* f) - { - unsigned char* imageData = stbi_load(f, &width, &height, NULL, STBI_rgb_alpha); - if (imageData == 0) return false; - pixels = (color*)imageData; - - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, - height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); - - // set render vertices - Drawable::setVertices( - new float [DRAWABLE_V_SIZE] { - 0, 0, - 0, (float)height, - (float)width, (float)height, - (float)width, 0, - }, - new float [DRAWABLE_V_SIZE] { - 0, 0, - 0, 1, - 1, 1, - 1, 0 - } - ); - - return true; - } - - bool Image::loadb(const char* b, size_t size) + bool Image::loadb(const void* b, size_t size) { // ʹstbi_load_from_memory unsigned char* imageData = stbi_load_from_memory((unsigned char *)b, size, &width, &height, NULL, STBI_rgb_alpha); |