aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/render/image.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-05-29 12:39:52 +0800
committerchai <chaifix@163.com>2018-05-29 12:39:52 +0800
commite024e5a23c4f5c8e8fb02e7b03c8e9265ac6c1ef (patch)
treea19511ccb880db2f7dd99778efc956435474a518 /src/libjin/render/image.cpp
parent2add73bb54ce9376ffcd44ffd929049d3c430628 (diff)
Image改为工厂
Diffstat (limited to 'src/libjin/render/image.cpp')
-rw-r--r--src/libjin/render/image.cpp69
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);