mirror of
https://github.com/ocornut/imgui.git
synced 2025-02-22 13:19:56 +01:00
Added LoadTextureFromMemory() for OpenGL example.
parent
324375d6a4
commit
7111f09124
@ -113,16 +113,17 @@ We will here use [stb_image.h](https://github.com/nothings/stb/blob/master/stb_i
|
|||||||
|
|
||||||
Add at the top of one of your source file:
|
Add at the top of one of your source file:
|
||||||
```cpp
|
```cpp
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
#define STB_IMAGE_IMPLEMENTATION
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
#include "stb_image.h"
|
#include "stb_image.h"
|
||||||
|
|
||||||
// Simple helper function to load an image into a OpenGL texture with common settings
|
// Simple helper function to load an image into a OpenGL texture with common settings
|
||||||
bool LoadTextureFromFile(const char* filename, GLuint* out_texture, int* out_width, int* out_height)
|
bool LoadTextureFromMemory(const void* data, size_t data_size, GLuint* out_texture, int* out_width, int* out_height)
|
||||||
{
|
{
|
||||||
// Load from file
|
// Load from file
|
||||||
int image_width = 0;
|
int image_width = 0;
|
||||||
int image_height = 0;
|
int image_height = 0;
|
||||||
unsigned char* image_data = stbi_load(filename, &image_width, &image_height, NULL, 4);
|
unsigned char* image_data = stbi_load_from_memory((const unsigned char*)data, (int)data_size, &image_width, &image_height, NULL, 4);
|
||||||
if (image_data == NULL)
|
if (image_data == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -134,13 +135,9 @@ bool LoadTextureFromFile(const char* filename, GLuint* out_texture, int* out_wid
|
|||||||
// Setup filtering parameters for display
|
// Setup filtering parameters for display
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // This is required on WebGL for non power-of-two textures
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Same
|
|
||||||
|
|
||||||
// Upload pixels into texture
|
// Upload pixels into texture
|
||||||
#if defined(GL_UNPACK_ROW_LENGTH) && !defined(__EMSCRIPTEN__)
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
#endif
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
|
||||||
stbi_image_free(image_data);
|
stbi_image_free(image_data);
|
||||||
|
|
||||||
@ -150,6 +147,24 @@ bool LoadTextureFromFile(const char* filename, GLuint* out_texture, int* out_wid
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open and read a file, then forward to LoadTextureFromMemory()
|
||||||
|
bool LoadTextureFromFile(const char* file_name, GLuint* out_texture, int* out_width, int* out_height)
|
||||||
|
{
|
||||||
|
FILE* f = fopen(file_name, "rb");
|
||||||
|
if (f == NULL)
|
||||||
|
return false;
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
size_t file_size = (size_t)ftell(f);
|
||||||
|
if (file_size == -1)
|
||||||
|
return false;
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
void* file_data = IM_ALLOC(file_size);
|
||||||
|
fread(file_data, 1, file_size, f);
|
||||||
|
bool ret = LoadTextureFromMemory(file_data, file_size, out_texture, out_width, out_height);
|
||||||
|
IM_FREE(file_data);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Load our texture after initializing OpenGL loader (for example after `glewInit()`):
|
Load our texture after initializing OpenGL loader (for example after `glewInit()`):
|
||||||
@ -926,7 +941,7 @@ RemoveTexture(&my_texture);
|
|||||||
|
|
||||||
If instead of loading from a file you would like to load from memory, you can call `stbi_load_from_memory()` instead of `stbi_load()`.
|
If instead of loading from a file you would like to load from memory, you can call `stbi_load_from_memory()` instead of `stbi_load()`.
|
||||||
All `LoadTextureFromFile()` function could be reworked to call `LoadTextureFromMemory()` which contains most of the code.
|
All `LoadTextureFromFile()` function could be reworked to call `LoadTextureFromMemory()` which contains most of the code.
|
||||||
See our implementation of `LoadTextureFromFile()` for DX11 and DX12 examples.
|
See our implementation of `LoadTextureFromFile()` for OpenGL, DX11 and DX12 examples.
|
||||||
|
|
||||||
##### [Return to Index](#index)
|
##### [Return to Index](#index)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user