| 
				
				
				
				 | 
			
			 | 
			
			@ -1,4 +1,4 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			/* stb_image - v2.20 - public domain image loader - http://nothings.org/stb | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			/* stb_image - v2.22 - public domain image loader - http://nothings.org/stb | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                                  no warranty implied; use at your own risk | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   Do this: | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -48,6 +48,8 @@ LICENSE | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			RECENT REVISION HISTORY: | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      2.22  (2019-03-04) gif fixes, fix warnings | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      2.21  (2019-02-25) fix typo in comment | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      2.19  (2018-02-11) fix warning | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      2.18  (2018-01-30) fix warnings | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -168,7 +170,7 @@ RECENT REVISION HISTORY: | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//   If compiling for Windows and you wish to use Unicode filenames, compile | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//   with | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//       #define STBI_WINDOWS_UTF8 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//   and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//   and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//   Windows wchar_t filenames to utf8. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// =========================================================================== | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -338,11 +340,13 @@ typedef unsigned short stbi_us; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			extern "C" { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#ifndef STBIDEF | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#ifdef STB_IMAGE_STATIC | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#define STBIDEF static | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#define STBIDEF extern | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			////////////////////////////////////////////////////////////////////////////// | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1181,7 +1185,7 @@ STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, bufferlen, NULL, NULL); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, p">(int) bufferlen, NULL, NULL); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -3658,7 +3662,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      int k; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      unsigned int i,j; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      stbi_uc *output; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      stbi_uc *coutput[4]; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      stbi__resample res_comp[4]; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -6411,18 +6415,22 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   // on first frame, any non-written pixels get the background colour (non-transparent) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   first_frame = 0;  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   if (g->out == 0) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      if (!stbi__gif_header(s, g, comp,0))     return 0; // stbi__g_failure_reason set by stbi__gif_header | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h);  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      g->history = (stbi_uc *) stbi__malloc(g->w * g->h);  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      if (g->out == 0)                      return stbi__errpuc("outofmem", "Out of memory"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			         return stbi__errpuc("too large", "GIF image is too large"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      pcount = g->w * g->h; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      g->out = (stbi_uc *) stbi__malloc(4 * pcount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      g->background = (stbi_uc *) stbi__malloc(4 * pcount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      g->history = (stbi_uc *) stbi__malloc(pcount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      if (!g->out || !g->background || !g->history) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			         return stbi__errpuc("outofmem", "Out of memory"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      // image is treated as "transparent" at the start - ie, nothing overwrites the current background;  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      // background colour is only used for pixels that are not rendered first frame, after that "background" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      // color refers to the color that was there the previous frame.  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      memset( g->out, 0x00, 4 * g->w * g->h );  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      memset( g->background, 0x00, 4 * g->w * g->h ); // state of the background (starts transparent) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      memset( g->history, 0x00, g->w * g->h );        // pixels that were affected previous frame | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      memset(g->out, 0x00, 4 * pcount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      memset(g->history, 0x00, pcount);        // pixels that were affected previous frame | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      first_frame = 1;  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   } else { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      // second frame - how do we dispoase of the previous one? | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -6483,6 +6491,13 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            g->cur_x   = g->start_x; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            g->cur_y   = g->start_y; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // if the width of the specified rectangle is 0, that means | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // we may not see *any* pixels or the image is malformed; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // to make sure this is caught, move the current y down to | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // max_y (which is what out_gif_code checks). | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (w == 0) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			               g->cur_y = g->max_y; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            g->lflags = stbi__get8(s); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (g->lflags & 0x40) { | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -6502,7 +6517,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			               return stbi__errpuc("missing color table", "Corrupt GIF");             | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			             | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            o = stbi__process_gif_raster(s, g); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (n">o == NULL) return NULL; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (o">!o) return NULL; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // if this was the first frame,  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            pcount = g->w * g->h;  | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -6642,6 +6657,9 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      // can be done for multiple frames.  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      if (req_comp && req_comp != 4) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			         u = stbi__convert_format(u, 4, req_comp, g.w, g.h); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   } else if (g.out) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      // if there was an error and we allocated an image buffer, free it! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			      STBI_FREE(g.out); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			   // free buffers needed for multiple frame loading;  | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |