ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
stb_image.c
Go to the documentation of this file.
1#define STB_IMAGE_IMPLEMENTATION
2
3#include "stb_image.h"
4
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9typedef struct gif_result_t {
10 int delay;
11 unsigned char *data;
14
15STBIDEF int stbi_is_animated_gif( char const * filename ) {
16
17 FILE *f;
18 stbi__context s;
19 int result = 0;
20
21 memset( &s, 0, sizeof(stbi__context) );
22
23 if (!(f = stbi__fopen(filename, "rb")))
24 return 0;
25
26 stbi__start_file(&s, f);
27
28 if (stbi__gif_test(&s)) {
29
30 int c;
31 stbi__gif g;
32 unsigned char *ignored;
33
34 memset( &g, 0, sizeof(stbi__gif) );
35
36 int frames = 0;
37 int maxDelay = 0;
38 while (stbi__gif_load_next(&s, &g, &c, 4, ignored))
39 {
40 if ( g.delay > 0 ) {
41 maxDelay = g.delay;
42 }
43 ++frames;
44 }
45
46 if ( ( frames > 1 ) && ( maxDelay > 0 ) ) {
47 result = 1;
48 } else {
49 result = 0;
50 }
51 }
52
53 fclose(f);
54 return result;
55
56}
57
58STBIDEF unsigned char *stbi_xload(char const *filename, int *x, int *y, int *frames)
59{
60 FILE *f;
61 stbi__context s;
62 unsigned char *result = 0;
63
64 memset( &s, 0, sizeof(stbi__context) );
65
66 if (!(f = stbi__fopen(filename, "rb")))
67 return stbi__errpuc("can't fopen", "Unable to open file");
68
69 stbi__start_file(&s, f);
70
71 if (stbi__gif_test(&s))
72 {
73 int c;
74 stbi__gif g;
75 gif_result head;
76 gif_result *prev = 0, *gr = &head;
77 unsigned char *ignored;
78
79 memset(&g, 0, sizeof(g));
80 memset(&head, 0, sizeof(head));
81
82 *frames = 0;
83
84 while (gr->data = stbi__gif_load_next(&s, &g, &c, 4, ignored))
85 {
86
87 if (gr->data == (unsigned char*)&s)
88 {
89 gr->data = 0;
90 break;
91 }
92
93 unsigned char * ptr = gr->data;
94
95 if ( ptr ) {
96 gr->data = malloc( g.w * g.h * 4 );
97
98 memset( gr->data, 0, g.w * g.h * 4 );
99
100 memcpy( gr->data, ptr, g.w * g.h * 4 );
101 }
102
103 if (prev) prev->next = gr;
104 gr->delay = g.delay;
105 prev = gr;
106 gr = (gif_result*) stbi__malloc(sizeof(gif_result));
107 memset(gr, 0, sizeof(gif_result));
108 ++(*frames);
109 }
110
111 // STBI_FREE(g.out);
112
113 // if (gr != &head)
114 // STBI_FREE(gr);
115
116 if (*frames > 0)
117 {
118 *x = g.w;
119 *y = g.h;
120 }
121
122 result = head.data;
123
124 if (*frames > 1)
125 {
126 unsigned int size = 4 * g.w * g.h;
127 unsigned char *p = 0;
128
129 result = (unsigned char*)stbi__malloc(*frames * (size + 2));
130 gr = &head;
131 p = result;
132
133 while (gr)
134 {
135 prev = gr;
136 memcpy(p, gr->data, size);
137 p += size;
138 *p++ = gr->delay & 0xFF;
139 *p++ = (gr->delay & 0xFF00) >> 8;
140 gr = gr->next;
141
142 // STBI_FREE(prev->data);
143 if (prev != &head) STBI_FREE(prev);
144 }
145 }
146 }
147 else
148 {
149 result = NULL;
150 }
151
152 fclose(f);
153 return result;
154}
155
156#ifdef __cplusplus
157}
158#endif
int size
Definition _optimizer.c:678
int frames(Environment *_environment, char *_image)
Emit code for FRAMES(...).
Definition frames.c:160
STBIDEF unsigned char * stbi_xload(char const *filename, int *x, int *y, int *frames)
Definition stb_image.c:58
struct gif_result_t gif_result
STBIDEF int stbi_is_animated_gif(char const *filename)
Definition stb_image.c:15
#define STBIDEF
Definition stb_image.h:367
struct gif_result_t * next
Definition stb_image.c:12
unsigned char * data
Definition stb_image.c:11
void * malloc(YYSIZE_T)