LibGame  v0.4.0
The LG Game Engine - Copyright (C) 2024-2025 ETMSoftware
lg_textures.h
1 /*
2  * LibGame - Copyright (C) Emmanuel Thomas-Maurin 2011-2025
3  * All rights reserved
4  */
5 
6 #ifndef LG_TEXTURES_H
7 #define LG_TEXTURES_H
8 
9 #define LG_TEX_PATH_MAX_LEN (128 - 1)
10 
11 #define LG_FIRST_NODE_TEX_ID 500001
12 #define LG_INVALID_TEX_ID 500002
13 
14 #define LG_TEX_TYPE_UNKNOWN (-1)
15 
16 #define LG_MAX_TEX_UNITS 256
17 
18 #define LG_CUBEMAP_FACES_NUM 6
19 
20 #define LG_TEX_SIG "LG_Texture"
21 #define LG_TEX_SIG_LEN 10
22 
23 typedef struct __attribute__((packed)) {
24  uint8_t sig[8]; /* {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a} */
25  uint8_t padding1[8];
26  uint32_t width; /* Big-endian */
27  uint32_t height; /* Big-endian */
28 } PNG_Header;
29 
30 /* TODO: specify if mipmaps were generated ? */
31 typedef enum {
32  LG_TC_UNCOMPRESSED, /* Never with mipmaps */
33  LG_TC_DXT1,
34  LG_TC_DXT3,
35  LG_TC_ASTC, /* TODO: specify block size ? */
36  LG_TC_ETC1,
37  LG_TC_UNKNOWN
38 } lg_tc_format;
39 
40 /*
41  * Actually a texture node in textures doubly-linked list
42  */
43 typedef struct LG_Texture LG_Texture;
44 
45 struct LG_Texture {
46  uint32_t id; /* Texture 'handle', set to LG_INVALID_TEX_ID if not valid */
47  int32_t unit; /* GL_TEXTURE0 -> GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1 */
48  int type; /* GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP (so far ...) */
49  int w;
50  int h;
51  int tc_format; /* lg_tc_format enum */
52  char path[LG_TEX_PATH_MAX_LEN + 1];
53  LG_Texture *prev;
54  LG_Texture *next;
55  uint8_t sig[LG_TEX_SIG_LEN]; /* Not NULL-terminated */
56 };
57 
59 
60 LG_Texture *lg_texture_new_from_data(lg_tc_format, int, const char *, void *, void **, size_t, int, int, int);
61 
62 LG_Texture *lg_texture_new_from_file(int, const char *);
63 
64 SDL_Surface *lg_sdl_surf_from_file(const char *, int, int);
65 
66 void *lg_compressed_texdata_from_file(const char *, lg_tc_format *, size_t *, int *, int *, int *);
67 
68 zboolean lg_test_file_extension(const char *, const char*);
69 
70 int lg_get_png_dims(const char *, int *, int *);
71 /*
72  * === Doubly-linked list ops ===
73  */
74 zboolean is_lg_tex(LG_Texture *);
75 
77 
79 
81 
83 
85 
87 
89 
90 void lg_texture_info(const LG_Texture *);
91 
92 void lg_texture_info_all();
93 
94 void lg_texture_list_all();
95 /*
96  * Other stuff
97  */
98 zboolean lg_read_pixels_from_screen(void *, Rec2Di);
99 
100 zboolean lg_write_pixels_to_screen(void *, const Rec2Di *);
101 
102 void lg_texture_unbind();
103 
104 void lg_tex_units_info();
105 
106 unsigned int lg_get_active_tex();
107 
108 void lg_active_tex_info();
109 
110 void lg_free_sdl_surf(SDL_Surface *);
111 
112 int lg_surf_depth(SDL_Surface *);
113 
115 
116 #endif /* LG_TEXTURES_H */
lg_get_active_tex
unsigned int lg_get_active_tex()
Definition: lg_textures.c:1123
lg_info_out_read_framebuffer
void lg_info_out_read_framebuffer()
Definition: lg_textures.c:1166
lg_compressed_texdata_from_file
void * lg_compressed_texdata_from_file(const char *path, lg_tc_format *tc_format, size_t *size, int *w, int *h, int *n_mipmaps)
Definition: lg_textures.c:571
lg_texture_new_from_data
LG_Texture * lg_texture_new_from_data(lg_tc_format tc_format, int tex_type, const char *path, void *data, void **cubemap_data, size_t size, int w, int h, int n_mipmaps)
Definition: lg_textures.c:127
lg_texture_count_nodes
int lg_texture_count_nodes()
Definition: lg_textures.c:900
lg_tex_units_info
void lg_tex_units_info()
Definition: lg_textures.c:1108
lg_texture_info_all
void lg_texture_info_all()
Definition: lg_textures.c:971
lg_surf_depth
int lg_surf_depth(SDL_Surface *surf)
Definition: lg_textures.c:1158
lg_texture_new_from_file
LG_Texture * lg_texture_new_from_file(int tex_type, const char *path)
Definition: lg_textures.c:299
lg_texture_find_by_id
LG_Texture * lg_texture_find_by_id(uint32_t id)
Definition: lg_textures.c:880
lg_read_pixels_from_screen
zboolean lg_read_pixels_from_screen(void *pixels, Rec2Di r)
Definition: lg_textures.c:1009
lg_test_file_extension
zboolean lg_test_file_extension(const char *path, const char *ext)
Definition: lg_textures.c:594
lg_texture_info
void lg_texture_info(const LG_Texture *tex)
Definition: lg_textures.c:962
lg_texture_unbind
void lg_texture_unbind(LG_Texture *tex)
Definition: lg_textures.c:1095
lg_sdl_surf_from_file
SDL_Surface * lg_sdl_surf_from_file(const char *path, int scale_x, int scale_y)
Definition: lg_textures.c:467
lg_write_pixels_to_screen
zboolean lg_write_pixels_to_screen(void *pixels, const Rec2Di *dest)
Definition: lg_textures.c:1037
lg_active_tex_info
void lg_active_tex_info()
Definition: lg_textures.c:1135
lg_texture_remove_all
void lg_texture_remove_all()
Definition: lg_textures.c:830
is_lg_tex
zboolean is_lg_tex(LG_Texture *node)
Definition: lg_textures.c:686
LG_Texture
Definition: lg_textures.h:45
lg_texture_last
LG_Texture * lg_texture_last(LG_Texture *node)
Definition: lg_textures.c:863
PNG_Header
Definition: lg_textures.h:23
lg_init_textures_module
void lg_init_textures_module()
Definition: lg_textures.c:88
lg_texture_list_all
void lg_texture_list_all()
Definition: lg_textures.c:986
lg_texture_count_gl_tex
int lg_texture_count_gl_tex()
Definition: lg_textures.c:919
lg_free_sdl_surf
void lg_free_sdl_surf(SDL_Surface *surf)
Definition: lg_textures.c:1145
lg_texture_first
LG_Texture * lg_texture_first(LG_Texture *node)
Definition: lg_textures.c:846
lg_get_png_dims
int lg_get_png_dims(const char *path, int *w, int *h)
Definition: lg_textures.c:608
lg_texture_remove
void lg_texture_remove(LG_Texture *node)
Definition: lg_textures.c:803
Rec2Di
Definition: lg_gr_func.h:49