mirror of
				https://github.com/eledio-devices/thirdparty-miniz.git
				synced 2025-10-31 00:32:38 +01:00 
			
		
		
		
	Separate the into multiple files similar to the vogl zip64 version of the library.
If anyone wants to have a minified version of if a script could be written to do this automatically.
This commit is contained in:
		
							
								
								
									
										105
									
								
								examples/example1.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								examples/example1.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| // example1.c - Demonstrates miniz.c's compress() and uncompress() functions (same as zlib's). | ||||
| // Public domain, May 15 2011, Rich Geldreich, richgel99@gmail.com. See "unlicense" statement at the end of tinfl.c. | ||||
| #include <stdio.h> | ||||
| #include "miniz.h" | ||||
| typedef unsigned char uint8; | ||||
| typedef unsigned short uint16; | ||||
| typedef unsigned int uint; | ||||
|  | ||||
| // The string to compress. | ||||
| static const char *s_pStr = "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \ | ||||
|   "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \ | ||||
|   "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \ | ||||
|   "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \ | ||||
|   "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \ | ||||
|   "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \ | ||||
|   "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson."; | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|   uint step = 0; | ||||
|   int cmp_status; | ||||
|   uLong src_len = (uLong)strlen(s_pStr); | ||||
|   uLong cmp_len = compressBound(src_len); | ||||
|   uLong uncomp_len = src_len; | ||||
|   uint8 *pCmp, *pUncomp; | ||||
|   uint total_succeeded = 0; | ||||
|   (void)argc, (void)argv; | ||||
|  | ||||
|   printf("miniz.c version: %s\n", MZ_VERSION); | ||||
|  | ||||
|   do | ||||
|   { | ||||
|     // Allocate buffers to hold compressed and uncompressed data. | ||||
|     pCmp = (mz_uint8 *)malloc((size_t)cmp_len); | ||||
|     pUncomp = (mz_uint8 *)malloc((size_t)src_len); | ||||
|     if ((!pCmp) || (!pUncomp)) | ||||
|     { | ||||
|       printf("Out of memory!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|     } | ||||
|  | ||||
|     // Compress the string. | ||||
|     cmp_status = compress(pCmp, &cmp_len, (const unsigned char *)s_pStr, src_len); | ||||
|     if (cmp_status != Z_OK) | ||||
|     { | ||||
|       printf("compress() failed!\n"); | ||||
|       free(pCmp); | ||||
|       free(pUncomp); | ||||
|       return EXIT_FAILURE; | ||||
|     } | ||||
|  | ||||
|     printf("Compressed from %u to %u bytes\n", (mz_uint32)src_len, (mz_uint32)cmp_len); | ||||
|  | ||||
|     if (step) | ||||
|     { | ||||
|       // Purposely corrupt the compressed data if fuzzy testing (this is a very crude fuzzy test). | ||||
|       uint n = 1 + (rand() % 3); | ||||
|       while (n--) | ||||
|       { | ||||
|         uint i = rand() % cmp_len; | ||||
|         pCmp[i] ^= (rand() & 0xFF); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     // Decompress. | ||||
|     cmp_status = uncompress(pUncomp, &uncomp_len, pCmp, cmp_len); | ||||
|     total_succeeded += (cmp_status == Z_OK); | ||||
|  | ||||
|     if (step) | ||||
|     { | ||||
|       printf("Simple fuzzy test: step %u total_succeeded: %u\n", step, total_succeeded); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       if (cmp_status != Z_OK) | ||||
|       { | ||||
|         printf("uncompress failed!\n"); | ||||
|         free(pCmp); | ||||
|         free(pUncomp); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|  | ||||
|       printf("Decompressed from %u to %u bytes\n", (mz_uint32)cmp_len, (mz_uint32)uncomp_len); | ||||
|  | ||||
|       // Ensure uncompress() returned the expected data. | ||||
|       if ((uncomp_len != src_len) || (memcmp(pUncomp, s_pStr, (size_t)src_len))) | ||||
|       { | ||||
|         printf("Decompression failed!\n"); | ||||
|         free(pCmp); | ||||
|         free(pUncomp); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     free(pCmp); | ||||
|     free(pUncomp); | ||||
|  | ||||
|     step++; | ||||
|  | ||||
|     // Keep on fuzzy testing if there's a non-empty command line. | ||||
|   } while (argc >= 2); | ||||
|  | ||||
|   printf("Success.\n"); | ||||
|   return EXIT_SUCCESS; | ||||
| } | ||||
							
								
								
									
										164
									
								
								examples/example2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								examples/example2.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| // example2.c - Simple demonstration of miniz.c's ZIP archive API's. | ||||
| // Note this test deletes the test archive file "__mz_example2_test__.zip" in the current directory, then creates a new one with test data. | ||||
| // Public domain, May 15 2011, Rich Geldreich, richgel99@gmail.com. See "unlicense" statement at the end of tinfl.c. | ||||
|  | ||||
| #if defined(__GNUC__) | ||||
|   // Ensure we get the 64-bit variants of the CRT's file I/O calls | ||||
|   #ifndef _FILE_OFFSET_BITS | ||||
|     #define _FILE_OFFSET_BITS 64 | ||||
|   #endif | ||||
|   #ifndef _LARGEFILE64_SOURCE | ||||
|     #define _LARGEFILE64_SOURCE 1 | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include "miniz_zip.h" | ||||
|  | ||||
| typedef unsigned char uint8; | ||||
| typedef unsigned short uint16; | ||||
| typedef unsigned int uint; | ||||
|  | ||||
| // The string to compress. | ||||
| static const char *s_pTest_str = | ||||
|   "MISSION CONTROL I wouldn't worry too much about the computer. First of all, there is still a chance that he is right, despite your tests, and" \ | ||||
|   "if it should happen again, we suggest eliminating this possibility by allowing the unit to remain in place and seeing whether or not it" \ | ||||
|   "actually fails. If the computer should turn out to be wrong, the situation is still not alarming. The type of obsessional error he may be" \ | ||||
|   "guilty of is not unknown among the latest generation of HAL 9000 computers. It has almost always revolved around a single detail, such as" \ | ||||
|   "the one you have described, and it has never interfered with the integrity or reliability of the computer's performance in other areas." \ | ||||
|   "No one is certain of the cause of this kind of malfunctioning. It may be over-programming, but it could also be any number of reasons. In any" \ | ||||
|   "event, it is somewhat analogous to human neurotic behavior. Does this answer your query?  Zero-five-three-Zero, MC, transmission concluded."; | ||||
|  | ||||
| static const char *s_pComment = "This is a comment"; | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|   int i, sort_iter; | ||||
|   mz_bool status; | ||||
|   size_t uncomp_size; | ||||
|   mz_zip_archive zip_archive; | ||||
|   void *p; | ||||
|   const int N = 50; | ||||
|   char data[2048]; | ||||
|   char archive_filename[64]; | ||||
|   static const char *s_Test_archive_filename = "__mz_example2_test__.zip"; | ||||
|  | ||||
|   assert((strlen(s_pTest_str) + 64) < sizeof(data)); | ||||
|  | ||||
|   printf("miniz.c version: %s\n", MZ_VERSION); | ||||
|  | ||||
|   (void)argc, (void)argv; | ||||
|  | ||||
|   // Delete the test archive, so it doesn't keep growing as we run this test | ||||
|   remove(s_Test_archive_filename); | ||||
|  | ||||
|   // Append a bunch of text files to the test archive | ||||
|   for (i = (N - 1); i >= 0; --i) | ||||
|   { | ||||
|     sprintf(archive_filename, "%u.txt", i); | ||||
|     sprintf(data, "%u %s %u", (N - 1) - i, s_pTest_str, i); | ||||
|  | ||||
|     // Add a new file to the archive. Note this is an IN-PLACE operation, so if it fails your archive is probably hosed (its central directory may not be complete) but it should be recoverable using zip -F or -FF. So use caution with this guy. | ||||
|     // A more robust way to add a file to an archive would be to read it into memory, perform the operation, then write a new archive out to a temp file and then delete/rename the files. | ||||
|     // Or, write a new archive to disk to a temp file, then delete/rename the files. For this test this API is fine. | ||||
|     status = mz_zip_add_mem_to_archive_file_in_place(s_Test_archive_filename, archive_filename, data, strlen(data) + 1, s_pComment, (uint16)strlen(s_pComment), MZ_BEST_COMPRESSION); | ||||
|     if (!status) | ||||
|     { | ||||
|       printf("mz_zip_add_mem_to_archive_file_in_place failed!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // Add a directory entry for testing | ||||
|   status = mz_zip_add_mem_to_archive_file_in_place(s_Test_archive_filename, "directory/", NULL, 0, "no comment", (uint16)strlen("no comment"), MZ_BEST_COMPRESSION); | ||||
|   if (!status) | ||||
|   { | ||||
|     printf("mz_zip_add_mem_to_archive_file_in_place failed!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   // Now try to open the archive. | ||||
|   memset(&zip_archive, 0, sizeof(zip_archive)); | ||||
|  | ||||
|   status = mz_zip_reader_init_file(&zip_archive, s_Test_archive_filename, 0); | ||||
|   if (!status) | ||||
|   { | ||||
|     printf("mz_zip_reader_init_file() failed!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   // Get and print information about each file in the archive. | ||||
|   for (i = 0; i < (int)mz_zip_reader_get_num_files(&zip_archive); i++) | ||||
|   { | ||||
|     mz_zip_archive_file_stat file_stat; | ||||
|     if (!mz_zip_reader_file_stat(&zip_archive, i, &file_stat)) | ||||
|     { | ||||
|        printf("mz_zip_reader_file_stat() failed!\n"); | ||||
|        mz_zip_reader_end(&zip_archive); | ||||
|        return EXIT_FAILURE; | ||||
|     } | ||||
|  | ||||
|     printf("Filename: \"%s\", Comment: \"%s\", Uncompressed size: %u, Compressed size: %u, Is Dir: %u\n", file_stat.m_filename, file_stat.m_comment, (uint)file_stat.m_uncomp_size, (uint)file_stat.m_comp_size, mz_zip_reader_is_file_a_directory(&zip_archive, i)); | ||||
|  | ||||
|     if (!strcmp(file_stat.m_filename, "directory/")) | ||||
|     { | ||||
|       if (!mz_zip_reader_is_file_a_directory(&zip_archive, i)) | ||||
|       { | ||||
|         printf("mz_zip_reader_is_file_a_directory() didn't return the expected results!\n"); | ||||
|         mz_zip_reader_end(&zip_archive); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // Close the archive, freeing any resources it was using | ||||
|   mz_zip_reader_end(&zip_archive); | ||||
|  | ||||
|   // Now verify the compressed data | ||||
|   for (sort_iter = 0; sort_iter < 2; sort_iter++) | ||||
|   { | ||||
|     memset(&zip_archive, 0, sizeof(zip_archive)); | ||||
|     status = mz_zip_reader_init_file(&zip_archive, s_Test_archive_filename, sort_iter ? MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY : 0); | ||||
|     if (!status) | ||||
|     { | ||||
|       printf("mz_zip_reader_init_file() failed!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|     } | ||||
|  | ||||
|     for (i = 0; i < N; i++) | ||||
|     { | ||||
|       sprintf(archive_filename, "%u.txt", i); | ||||
|       sprintf(data, "%u %s %u", (N - 1) - i, s_pTest_str, i); | ||||
|  | ||||
|       // Try to extract all the files to the heap. | ||||
|       p = mz_zip_reader_extract_file_to_heap(&zip_archive, archive_filename, &uncomp_size, 0); | ||||
|       if (!p) | ||||
|       { | ||||
|         printf("mz_zip_reader_extract_file_to_heap() failed!\n"); | ||||
|         mz_zip_reader_end(&zip_archive); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|  | ||||
|       // Make sure the extraction really succeeded. | ||||
|       if ((uncomp_size != (strlen(data) + 1)) || (memcmp(p, data, strlen(data)))) | ||||
|       { | ||||
|         printf("mz_zip_reader_extract_file_to_heap() failed to extract the proper data\n"); | ||||
|         mz_free(p); | ||||
|         mz_zip_reader_end(&zip_archive); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|  | ||||
|       printf("Successfully extracted file \"%s\", size %u\n", archive_filename, (uint)uncomp_size); | ||||
|       printf("File data: \"%s\"\n", (const char *)p); | ||||
|  | ||||
|       // We're done. | ||||
|       mz_free(p); | ||||
|     } | ||||
|  | ||||
|     // Close the archive, freeing any resources it was using | ||||
|     mz_zip_reader_end(&zip_archive); | ||||
|   } | ||||
|  | ||||
|   printf("Success.\n"); | ||||
|   return EXIT_SUCCESS; | ||||
| } | ||||
							
								
								
									
										269
									
								
								examples/example3.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										269
									
								
								examples/example3.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,269 @@ | ||||
| // example3.c - Demonstrates how to use miniz.c's deflate() and inflate() functions for simple file compression. | ||||
| // Public domain, May 15 2011, Rich Geldreich, richgel99@gmail.com. See "unlicense" statement at the end of tinfl.c. | ||||
| // For simplicity, this example is limited to files smaller than 4GB, but this is not a limitation of miniz.c. | ||||
| #include <stdio.h> | ||||
| #include <limits.h> | ||||
| #include "miniz.h" | ||||
|  | ||||
| typedef unsigned char uint8; | ||||
| typedef unsigned short uint16; | ||||
| typedef unsigned int uint; | ||||
|  | ||||
| #define my_max(a,b) (((a) > (b)) ? (a) : (b)) | ||||
| #define my_min(a,b) (((a) < (b)) ? (a) : (b)) | ||||
|  | ||||
| #define BUF_SIZE (1024 * 1024) | ||||
| static uint8 s_inbuf[BUF_SIZE]; | ||||
| static uint8 s_outbuf[BUF_SIZE]; | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|   const char *pMode; | ||||
|   FILE *pInfile, *pOutfile; | ||||
|   uint infile_size; | ||||
|   int level = Z_BEST_COMPRESSION; | ||||
|   z_stream stream; | ||||
|   int p = 1; | ||||
|   const char *pSrc_filename; | ||||
|   const char *pDst_filename; | ||||
|   long file_loc; | ||||
|  | ||||
|   printf("miniz.c version: %s\n", MZ_VERSION); | ||||
|  | ||||
|   if (argc < 4) | ||||
|   { | ||||
|     printf("Usage: example3 [options] [mode:c or d] infile outfile\n"); | ||||
|     printf("\nModes:\n"); | ||||
|     printf("c - Compresses file infile to a zlib stream in file outfile\n"); | ||||
|     printf("d - Decompress zlib stream in file infile to file outfile\n"); | ||||
|     printf("\nOptions:\n"); | ||||
|     printf("-l[0-10] - Compression level, higher values are slower.\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   while ((p < argc) && (argv[p][0] == '-')) | ||||
|   { | ||||
|     switch (argv[p][1]) | ||||
|     { | ||||
|       case 'l': | ||||
|       { | ||||
|         level = atoi(&argv[1][2]); | ||||
|         if ((level < 0) || (level > 10)) | ||||
|         { | ||||
|           printf("Invalid level!\n"); | ||||
|           return EXIT_FAILURE; | ||||
|         } | ||||
|         break; | ||||
|       } | ||||
|       default: | ||||
|       { | ||||
|         printf("Invalid option: %s\n", argv[p]); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|     } | ||||
|     p++; | ||||
|   } | ||||
|  | ||||
|   if ((argc - p) < 3) | ||||
|   { | ||||
|     printf("Must specify mode, input filename, and output filename after options!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|   else if ((argc - p) > 3) | ||||
|   { | ||||
|     printf("Too many filenames!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   pMode = argv[p++]; | ||||
|   if (!strchr("cCdD", pMode[0])) | ||||
|   { | ||||
|     printf("Invalid mode!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   pSrc_filename = argv[p++]; | ||||
|   pDst_filename = argv[p++]; | ||||
|  | ||||
|   printf("Mode: %c, Level: %u\nInput File: \"%s\"\nOutput File: \"%s\"\n", pMode[0], level, pSrc_filename, pDst_filename); | ||||
|  | ||||
|   // Open input file. | ||||
|   pInfile = fopen(pSrc_filename, "rb"); | ||||
|   if (!pInfile) | ||||
|   { | ||||
|     printf("Failed opening input file!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   // Determine input file's size. | ||||
|   fseek(pInfile, 0, SEEK_END); | ||||
|   file_loc = ftell(pInfile); | ||||
|   fseek(pInfile, 0, SEEK_SET); | ||||
|  | ||||
|   if ((file_loc < 0) || (file_loc > INT_MAX)) | ||||
|   { | ||||
|      // This is not a limitation of miniz or tinfl, but this example. | ||||
|      printf("File is too large to be processed by this example.\n"); | ||||
|      return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   infile_size = (uint)file_loc; | ||||
|  | ||||
|   // Open output file. | ||||
|   pOutfile = fopen(pDst_filename, "wb"); | ||||
|   if (!pOutfile) | ||||
|   { | ||||
|     printf("Failed opening output file!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   printf("Input file size: %u\n", infile_size); | ||||
|  | ||||
|   // Init the z_stream | ||||
|   memset(&stream, 0, sizeof(stream)); | ||||
|   stream.next_in = s_inbuf; | ||||
|   stream.avail_in = 0; | ||||
|   stream.next_out = s_outbuf; | ||||
|   stream.avail_out = BUF_SIZE; | ||||
|  | ||||
|   if ((pMode[0] == 'c') || (pMode[0] == 'C')) | ||||
|   { | ||||
|     // Compression. | ||||
|     uint infile_remaining = infile_size; | ||||
|  | ||||
|     if (deflateInit(&stream, level) != Z_OK) | ||||
|     { | ||||
|       printf("deflateInit() failed!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|     } | ||||
|  | ||||
|     for ( ; ; ) | ||||
|     { | ||||
|       int status; | ||||
|       if (!stream.avail_in) | ||||
|       { | ||||
|         // Input buffer is empty, so read more bytes from input file. | ||||
|         uint n = my_min(BUF_SIZE, infile_remaining); | ||||
|  | ||||
|         if (fread(s_inbuf, 1, n, pInfile) != n) | ||||
|         { | ||||
|           printf("Failed reading from input file!\n"); | ||||
|           return EXIT_FAILURE; | ||||
|         } | ||||
|  | ||||
|         stream.next_in = s_inbuf; | ||||
|         stream.avail_in = n; | ||||
|  | ||||
|         infile_remaining -= n; | ||||
|         //printf("Input bytes remaining: %u\n", infile_remaining); | ||||
|       } | ||||
|  | ||||
|       status = deflate(&stream, infile_remaining ? Z_NO_FLUSH : Z_FINISH); | ||||
|  | ||||
|       if ((status == Z_STREAM_END) || (!stream.avail_out)) | ||||
|       { | ||||
|         // Output buffer is full, or compression is done, so write buffer to output file. | ||||
|         uint n = BUF_SIZE - stream.avail_out; | ||||
|         if (fwrite(s_outbuf, 1, n, pOutfile) != n) | ||||
|         { | ||||
|           printf("Failed writing to output file!\n"); | ||||
|           return EXIT_FAILURE; | ||||
|         } | ||||
|         stream.next_out = s_outbuf; | ||||
|         stream.avail_out = BUF_SIZE; | ||||
|       } | ||||
|  | ||||
|       if (status == Z_STREAM_END) | ||||
|         break; | ||||
|       else if (status != Z_OK) | ||||
|       { | ||||
|         printf("deflate() failed with status %i!\n", status); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (deflateEnd(&stream) != Z_OK) | ||||
|     { | ||||
|       printf("deflateEnd() failed!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|     } | ||||
|   } | ||||
|   else if ((pMode[0] == 'd') || (pMode[0] == 'D')) | ||||
|   { | ||||
|     // Decompression. | ||||
|     uint infile_remaining = infile_size; | ||||
|  | ||||
|     if (inflateInit(&stream)) | ||||
|     { | ||||
|       printf("inflateInit() failed!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|     } | ||||
|  | ||||
|     for ( ; ; ) | ||||
|     { | ||||
|       int status; | ||||
|       if (!stream.avail_in) | ||||
|       { | ||||
|         // Input buffer is empty, so read more bytes from input file. | ||||
|         uint n = my_min(BUF_SIZE, infile_remaining); | ||||
|  | ||||
|         if (fread(s_inbuf, 1, n, pInfile) != n) | ||||
|         { | ||||
|           printf("Failed reading from input file!\n"); | ||||
|           return EXIT_FAILURE; | ||||
|         } | ||||
|  | ||||
|         stream.next_in = s_inbuf; | ||||
|         stream.avail_in = n; | ||||
|  | ||||
|         infile_remaining -= n; | ||||
|       } | ||||
|  | ||||
|       status = inflate(&stream, Z_SYNC_FLUSH); | ||||
|  | ||||
|       if ((status == Z_STREAM_END) || (!stream.avail_out)) | ||||
|       { | ||||
|         // Output buffer is full, or decompression is done, so write buffer to output file. | ||||
|         uint n = BUF_SIZE - stream.avail_out; | ||||
|         if (fwrite(s_outbuf, 1, n, pOutfile) != n) | ||||
|         { | ||||
|           printf("Failed writing to output file!\n"); | ||||
|           return EXIT_FAILURE; | ||||
|         } | ||||
|         stream.next_out = s_outbuf; | ||||
|         stream.avail_out = BUF_SIZE; | ||||
|       } | ||||
|  | ||||
|       if (status == Z_STREAM_END) | ||||
|         break; | ||||
|       else if (status != Z_OK) | ||||
|       { | ||||
|         printf("inflate() failed with status %i!\n", status); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (inflateEnd(&stream) != Z_OK) | ||||
|     { | ||||
|       printf("inflateEnd() failed!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|     } | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     printf("Invalid mode!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   fclose(pInfile); | ||||
|   if (EOF == fclose(pOutfile)) | ||||
|   { | ||||
|     printf("Failed writing to output file!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   printf("Total input bytes: %u\n", (mz_uint32)stream.total_in); | ||||
|   printf("Total output bytes: %u\n", (mz_uint32)stream.total_out); | ||||
|   printf("Success.\n"); | ||||
|   return EXIT_SUCCESS; | ||||
| } | ||||
							
								
								
									
										102
									
								
								examples/example4.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								examples/example4.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| // example4.c - Uses tinfl.c to decompress a zlib stream in memory to an output file | ||||
| // Public domain, May 15 2011, Rich Geldreich, richgel99@gmail.com. See "unlicense" statement at the end of tinfl.c. | ||||
| #include "miniz_tinfl.h" | ||||
| #include <stdio.h> | ||||
| #include <limits.h> | ||||
|  | ||||
| typedef unsigned char uint8; | ||||
| typedef unsigned short uint16; | ||||
| typedef unsigned int uint; | ||||
|  | ||||
| #define my_max(a,b) (((a) > (b)) ? (a) : (b)) | ||||
| #define my_min(a,b) (((a) < (b)) ? (a) : (b)) | ||||
|  | ||||
| static int tinfl_put_buf_func(const void* pBuf, int len, void *pUser) | ||||
| { | ||||
|   return len == (int)fwrite(pBuf, 1, len, (FILE*)pUser); | ||||
| } | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|   int status; | ||||
|   FILE *pInfile, *pOutfile; | ||||
|   uint infile_size, outfile_size; | ||||
|   size_t in_buf_size; | ||||
|   uint8 *pCmp_data; | ||||
|   long file_loc; | ||||
|  | ||||
|   if (argc != 3) | ||||
|   { | ||||
|     printf("Usage: example4 infile outfile\n"); | ||||
|     printf("Decompresses zlib stream in file infile to file outfile.\n"); | ||||
|     printf("Input file must be able to fit entirely in memory.\n"); | ||||
|     printf("example3 can be used to create compressed zlib streams.\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   // Open input file. | ||||
|   pInfile = fopen(argv[1], "rb"); | ||||
|   if (!pInfile) | ||||
|   { | ||||
|     printf("Failed opening input file!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   // Determine input file's size. | ||||
|   fseek(pInfile, 0, SEEK_END); | ||||
|   file_loc = ftell(pInfile); | ||||
|   fseek(pInfile, 0, SEEK_SET); | ||||
|  | ||||
|   if ((file_loc < 0) || (file_loc > INT_MAX)) | ||||
|   { | ||||
|      // This is not a limitation of miniz or tinfl, but this example. | ||||
|      printf("File is too large to be processed by this example.\n"); | ||||
|      return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   infile_size = (uint)file_loc; | ||||
|  | ||||
|   pCmp_data = (uint8 *)malloc(infile_size); | ||||
|   if (!pCmp_data) | ||||
|   { | ||||
|     printf("Out of memory!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|   if (fread(pCmp_data, 1, infile_size, pInfile) != infile_size) | ||||
|   { | ||||
|     printf("Failed reading input file!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   // Open output file. | ||||
|   pOutfile = fopen(argv[2], "wb"); | ||||
|   if (!pOutfile) | ||||
|   { | ||||
|     printf("Failed opening output file!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   printf("Input file size: %u\n", infile_size); | ||||
|  | ||||
|   in_buf_size = infile_size; | ||||
|   status = tinfl_decompress_mem_to_callback(pCmp_data, &in_buf_size, tinfl_put_buf_func, pOutfile, TINFL_FLAG_PARSE_ZLIB_HEADER); | ||||
|   if (!status) | ||||
|   { | ||||
|     printf("tinfl_decompress_mem_to_callback() failed with status %i!\n", status); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   outfile_size = ftell(pOutfile); | ||||
|  | ||||
|   fclose(pInfile); | ||||
|   if (EOF == fclose(pOutfile)) | ||||
|   { | ||||
|     printf("Failed writing to output file!\n"); | ||||
|     return EXIT_FAILURE; | ||||
|   } | ||||
|  | ||||
|   printf("Total input bytes: %u\n", (uint)in_buf_size); | ||||
|   printf("Total output bytes: %u\n", outfile_size); | ||||
|   printf("Success.\n"); | ||||
|   return EXIT_SUCCESS; | ||||
| } | ||||
							
								
								
									
										327
									
								
								examples/example5.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										327
									
								
								examples/example5.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,327 @@ | ||||
| // example5.c - Demonstrates how to use miniz.c's low-level tdefl_compress() and tinfl_inflate() API's for simple file to file compression/decompression. | ||||
| // The low-level API's are the fastest, make no use of dynamic memory allocation, and are the most flexible functions exposed by miniz.c. | ||||
| // Public domain, April 11 2012, Rich Geldreich, richgel99@gmail.com. See "unlicense" statement at the end of tinfl.c. | ||||
| // For simplicity, this example is limited to files smaller than 4GB, but this is not a limitation of miniz.c. | ||||
|  | ||||
| // Purposely disable a whole bunch of stuff this low-level example doesn't use. | ||||
| #define MINIZ_NO_STDIO | ||||
| #define MINIZ_NO_ARCHIVE_APIS | ||||
| #define MINIZ_NO_TIME | ||||
| #define MINIZ_NO_ZLIB_APIS | ||||
| #define MINIZ_NO_MALLOC | ||||
| #include "miniz.h" | ||||
|  | ||||
| // Now include stdio.h because this test uses fopen(), etc. (but we still don't want miniz.c's stdio stuff, for testing). | ||||
| #include <stdio.h> | ||||
| #include <limits.h> | ||||
|  | ||||
| typedef unsigned char uint8; | ||||
| typedef unsigned short uint16; | ||||
| typedef unsigned int uint; | ||||
|  | ||||
| #define my_max(a,b) (((a) > (b)) ? (a) : (b)) | ||||
| #define my_min(a,b) (((a) < (b)) ? (a) : (b)) | ||||
|  | ||||
| // IN_BUF_SIZE is the size of the file read buffer. | ||||
| // IN_BUF_SIZE must be >= 1 | ||||
| #define IN_BUF_SIZE (1024*512) | ||||
| static uint8 s_inbuf[IN_BUF_SIZE]; | ||||
|  | ||||
| // COMP_OUT_BUF_SIZE is the size of the output buffer used during compression. | ||||
| // COMP_OUT_BUF_SIZE must be >= 1 and <= OUT_BUF_SIZE | ||||
| #define COMP_OUT_BUF_SIZE (1024*512) | ||||
|  | ||||
| // OUT_BUF_SIZE is the size of the output buffer used during decompression. | ||||
| // OUT_BUF_SIZE must be a power of 2 >= TINFL_LZ_DICT_SIZE (because the low-level decompressor not only writes, but reads from the output buffer as it decompresses) | ||||
| //#define OUT_BUF_SIZE (TINFL_LZ_DICT_SIZE) | ||||
| #define OUT_BUF_SIZE (1024*512) | ||||
| static uint8 s_outbuf[OUT_BUF_SIZE]; | ||||
|  | ||||
| // tdefl_compressor contains all the state needed by the low-level compressor so it's a pretty big struct (~300k). | ||||
| // This example makes it a global vs. putting it on the stack, of course in real-world usage you'll probably malloc() or new it. | ||||
| tdefl_compressor g_deflator; | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|    const char *pMode; | ||||
|    FILE *pInfile, *pOutfile; | ||||
|    uint infile_size; | ||||
|    int level = 9; | ||||
|    int p = 1; | ||||
|    const char *pSrc_filename; | ||||
|    const char *pDst_filename; | ||||
|    const void *next_in = s_inbuf; | ||||
|    size_t avail_in = 0; | ||||
|    void *next_out = s_outbuf; | ||||
|    size_t avail_out = OUT_BUF_SIZE; | ||||
|    size_t total_in = 0, total_out = 0; | ||||
|    long file_loc; | ||||
|  | ||||
|    assert(COMP_OUT_BUF_SIZE <= OUT_BUF_SIZE); | ||||
|  | ||||
|    printf("miniz.c example5 (demonstrates tinfl/tdefl)\n"); | ||||
|  | ||||
|    if (argc < 4) | ||||
|    { | ||||
|       printf("File to file compression/decompression using the low-level tinfl/tdefl API's.\n"); | ||||
|       printf("Usage: example5 [options] [mode:c or d] infile outfile\n"); | ||||
|       printf("\nModes:\n"); | ||||
|       printf("c - Compresses file infile to a zlib stream in file outfile\n"); | ||||
|       printf("d - Decompress zlib stream in file infile to file outfile\n"); | ||||
|       printf("\nOptions:\n"); | ||||
|       printf("-l[0-10] - Compression level, higher values are slower, 0 is none.\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|  | ||||
|    while ((p < argc) && (argv[p][0] == '-')) | ||||
|    { | ||||
|       switch (argv[p][1]) | ||||
|       { | ||||
|          case 'l': | ||||
|          { | ||||
|             level = atoi(&argv[1][2]); | ||||
|             if ((level < 0) || (level > 10)) | ||||
|             { | ||||
|                printf("Invalid level!\n"); | ||||
|                return EXIT_FAILURE; | ||||
|             } | ||||
|             break; | ||||
|          } | ||||
|          default: | ||||
|          { | ||||
|             printf("Invalid option: %s\n", argv[p]); | ||||
|             return EXIT_FAILURE; | ||||
|          } | ||||
|       } | ||||
|       p++; | ||||
|    } | ||||
|  | ||||
|    if ((argc - p) < 3) | ||||
|    { | ||||
|       printf("Must specify mode, input filename, and output filename after options!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|    else if ((argc - p) > 3) | ||||
|    { | ||||
|       printf("Too many filenames!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|  | ||||
|    pMode = argv[p++]; | ||||
|    if (!strchr("cCdD", pMode[0])) | ||||
|    { | ||||
|       printf("Invalid mode!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|  | ||||
|    pSrc_filename = argv[p++]; | ||||
|    pDst_filename = argv[p++]; | ||||
|  | ||||
|    printf("Mode: %c, Level: %u\nInput File: \"%s\"\nOutput File: \"%s\"\n", pMode[0], level, pSrc_filename, pDst_filename); | ||||
|  | ||||
|    // Open input file. | ||||
|    pInfile = fopen(pSrc_filename, "rb"); | ||||
|    if (!pInfile) | ||||
|    { | ||||
|       printf("Failed opening input file!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|  | ||||
|    // Determine input file's size. | ||||
|    fseek(pInfile, 0, SEEK_END); | ||||
|    file_loc = ftell(pInfile); | ||||
|    fseek(pInfile, 0, SEEK_SET); | ||||
|  | ||||
|    if ((file_loc < 0) || (file_loc > INT_MAX)) | ||||
|    { | ||||
|       // This is not a limitation of miniz or tinfl, but this example. | ||||
|       printf("File is too large to be processed by this example.\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|  | ||||
|    infile_size = (uint)file_loc; | ||||
|  | ||||
|    // Open output file. | ||||
|    pOutfile = fopen(pDst_filename, "wb"); | ||||
|    if (!pOutfile) | ||||
|    { | ||||
|       printf("Failed opening output file!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|  | ||||
|    printf("Input file size: %u\n", infile_size); | ||||
|  | ||||
|    if ((pMode[0] == 'c') || (pMode[0] == 'C')) | ||||
|    { | ||||
|       // The number of dictionary probes to use at each compression level (0-10). 0=implies fastest/minimal possible probing. | ||||
|       static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32,  16, 32, 128, 256,  512, 768, 1500 }; | ||||
|  | ||||
|       tdefl_status status; | ||||
|       uint infile_remaining = infile_size; | ||||
|  | ||||
|       // create tdefl() compatible flags (we have to compose the low-level flags ourselves, or use tdefl_create_comp_flags_from_zip_params() but that means MINIZ_NO_ZLIB_APIS can't be defined). | ||||
|       mz_uint comp_flags = TDEFL_WRITE_ZLIB_HEADER | s_tdefl_num_probes[MZ_MIN(10, level)] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0); | ||||
|       if (!level) | ||||
|          comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS; | ||||
|  | ||||
|       // Initialize the low-level compressor. | ||||
|       status = tdefl_init(&g_deflator, NULL, NULL, comp_flags); | ||||
|       if (status != TDEFL_STATUS_OKAY) | ||||
|       { | ||||
|          printf("tdefl_init() failed!\n"); | ||||
|          return EXIT_FAILURE; | ||||
|       } | ||||
|  | ||||
|       avail_out = COMP_OUT_BUF_SIZE; | ||||
|  | ||||
|       // Compression. | ||||
|       for ( ; ; ) | ||||
|       { | ||||
|          size_t in_bytes, out_bytes; | ||||
|  | ||||
|          if (!avail_in) | ||||
|          { | ||||
|             // Input buffer is empty, so read more bytes from input file. | ||||
|             uint n = my_min(IN_BUF_SIZE, infile_remaining); | ||||
|  | ||||
|             if (fread(s_inbuf, 1, n, pInfile) != n) | ||||
|             { | ||||
|                printf("Failed reading from input file!\n"); | ||||
|                return EXIT_FAILURE; | ||||
|             } | ||||
|  | ||||
|             next_in = s_inbuf; | ||||
|             avail_in = n; | ||||
|  | ||||
|             infile_remaining -= n; | ||||
|             //printf("Input bytes remaining: %u\n", infile_remaining); | ||||
|          } | ||||
|  | ||||
|          in_bytes = avail_in; | ||||
|          out_bytes = avail_out; | ||||
|          // Compress as much of the input as possible (or all of it) to the output buffer. | ||||
|          status = tdefl_compress(&g_deflator, next_in, &in_bytes, next_out, &out_bytes, infile_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH); | ||||
|  | ||||
|          next_in = (const char *)next_in + in_bytes; | ||||
|          avail_in -= in_bytes; | ||||
|          total_in += in_bytes; | ||||
|  | ||||
|          next_out = (char *)next_out + out_bytes; | ||||
|          avail_out -= out_bytes; | ||||
|          total_out += out_bytes; | ||||
|  | ||||
|          if ((status != TDEFL_STATUS_OKAY) || (!avail_out)) | ||||
|          { | ||||
|             // Output buffer is full, or compression is done or failed, so write buffer to output file. | ||||
|             uint n = COMP_OUT_BUF_SIZE - (uint)avail_out; | ||||
|             if (fwrite(s_outbuf, 1, n, pOutfile) != n) | ||||
|             { | ||||
|                printf("Failed writing to output file!\n"); | ||||
|                return EXIT_FAILURE; | ||||
|             } | ||||
|             next_out = s_outbuf; | ||||
|             avail_out = COMP_OUT_BUF_SIZE; | ||||
|          } | ||||
|  | ||||
|          if (status == TDEFL_STATUS_DONE) | ||||
|          { | ||||
|             // Compression completed successfully. | ||||
|             break; | ||||
|          } | ||||
|          else if (status != TDEFL_STATUS_OKAY) | ||||
|          { | ||||
|             // Compression somehow failed. | ||||
|             printf("tdefl_compress() failed with status %i!\n", status); | ||||
|             return EXIT_FAILURE; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|    else if ((pMode[0] == 'd') || (pMode[0] == 'D')) | ||||
|    { | ||||
|       // Decompression. | ||||
|       uint infile_remaining = infile_size; | ||||
|  | ||||
|       tinfl_decompressor inflator; | ||||
|       tinfl_init(&inflator); | ||||
|  | ||||
|       for ( ; ; ) | ||||
|       { | ||||
|          size_t in_bytes, out_bytes; | ||||
|          tinfl_status status; | ||||
|          if (!avail_in) | ||||
|          { | ||||
|             // Input buffer is empty, so read more bytes from input file. | ||||
|             uint n = my_min(IN_BUF_SIZE, infile_remaining); | ||||
|  | ||||
|             if (fread(s_inbuf, 1, n, pInfile) != n) | ||||
|             { | ||||
|                printf("Failed reading from input file!\n"); | ||||
|                return EXIT_FAILURE; | ||||
|             } | ||||
|  | ||||
|             next_in = s_inbuf; | ||||
|             avail_in = n; | ||||
|  | ||||
|             infile_remaining -= n; | ||||
|          } | ||||
|  | ||||
|          in_bytes = avail_in; | ||||
|          out_bytes = avail_out; | ||||
|          status = tinfl_decompress(&inflator, (const mz_uint8 *)next_in, &in_bytes, s_outbuf, (mz_uint8 *)next_out, &out_bytes, (infile_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0) | TINFL_FLAG_PARSE_ZLIB_HEADER); | ||||
|  | ||||
|          avail_in -= in_bytes; | ||||
|          next_in = (const mz_uint8 *)next_in + in_bytes; | ||||
|          total_in += in_bytes; | ||||
|  | ||||
|          avail_out -= out_bytes; | ||||
|          next_out = (mz_uint8 *)next_out + out_bytes; | ||||
|          total_out += out_bytes; | ||||
|  | ||||
|          if ((status <= TINFL_STATUS_DONE) || (!avail_out)) | ||||
|          { | ||||
|             // Output buffer is full, or decompression is done, so write buffer to output file. | ||||
|             uint n = OUT_BUF_SIZE - (uint)avail_out; | ||||
|             if (fwrite(s_outbuf, 1, n, pOutfile) != n) | ||||
|             { | ||||
|                printf("Failed writing to output file!\n"); | ||||
|                return EXIT_FAILURE; | ||||
|             } | ||||
|             next_out = s_outbuf; | ||||
|             avail_out = OUT_BUF_SIZE; | ||||
|          } | ||||
|  | ||||
|          // If status is <= TINFL_STATUS_DONE then either decompression is done or something went wrong. | ||||
|          if (status <= TINFL_STATUS_DONE) | ||||
|          { | ||||
|             if (status == TINFL_STATUS_DONE) | ||||
|             { | ||||
|                // Decompression completed successfully. | ||||
|                break; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                // Decompression failed. | ||||
|                printf("tinfl_decompress() failed with status %i!\n", status); | ||||
|                return EXIT_FAILURE; | ||||
|             } | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|       printf("Invalid mode!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|  | ||||
|    fclose(pInfile); | ||||
|    if (EOF == fclose(pOutfile)) | ||||
|    { | ||||
|       printf("Failed writing to output file!\n"); | ||||
|       return EXIT_FAILURE; | ||||
|    } | ||||
|  | ||||
|    printf("Total input bytes: %u\n", (mz_uint32)total_in); | ||||
|    printf("Total output bytes: %u\n", (mz_uint32)total_out); | ||||
|    printf("Success.\n"); | ||||
|    return EXIT_SUCCESS; | ||||
| } | ||||
							
								
								
									
										162
									
								
								examples/example6.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								examples/example6.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,162 @@ | ||||
| // example6.c - Demonstrates how to miniz's PNG writer func | ||||
| // Public domain, April 11 2012, Rich Geldreich, richgel99@gmail.com. See "unlicense" statement at the end of tinfl.c. | ||||
| // Mandlebrot set code from http://rosettacode.org/wiki/Mandelbrot_set#C | ||||
| // Must link this example against libm on Linux. | ||||
|  | ||||
| // Purposely disable a whole bunch of stuff this low-level example doesn't use. | ||||
| #define MINIZ_NO_STDIO | ||||
| #define MINIZ_NO_TIME | ||||
| #define MINIZ_NO_ZLIB_APIS | ||||
| #include "miniz.h" | ||||
|  | ||||
| // Now include stdio.h because this test uses fopen(), etc. (but we still don't want miniz.c's stdio stuff, for testing). | ||||
| #include <stdio.h> | ||||
| #include <limits.h> | ||||
| #include <math.h> | ||||
|  | ||||
| typedef unsigned char uint8; | ||||
| typedef unsigned short uint16; | ||||
| typedef unsigned int uint; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   uint8 r, g, b; | ||||
| } rgb_t; | ||||
|  | ||||
| static void hsv_to_rgb(int hue, int min, int max, rgb_t *p) | ||||
| { | ||||
|   const int invert = 0; | ||||
|   const int saturation = 1; | ||||
|   const int color_rotate = 0; | ||||
|  | ||||
|   if (min == max) max = min + 1; | ||||
|   if (invert) hue = max - (hue - min); | ||||
|   if (!saturation) { | ||||
|     p->r = p->g = p->b = 255 * (max - hue) / (max - min); | ||||
|     return; | ||||
|   } | ||||
|   double h = fmod(color_rotate + 1e-4 + 4.0 * (hue - min) / (max - min), 6); | ||||
|   double c = 255.0f * saturation; | ||||
|   double X = c * (1 - fabs(fmod(h, 2) - 1)); | ||||
|  | ||||
|   p->r = p->g = p->b = 0; | ||||
|  | ||||
|   switch((int)h) { | ||||
|   case 0: p->r = c; p->g = X; return; | ||||
|   case 1:	p->r = X; p->g = c; return; | ||||
|   case 2: p->g = c; p->b = X; return; | ||||
|   case 3: p->g = X; p->b = c; return; | ||||
|   case 4: p->r = X; p->b = c; return; | ||||
|   default:p->r = c; p->b = X; | ||||
|   } | ||||
| } | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|   (void)argc, (void)argv; | ||||
|  | ||||
|   // Image resolution | ||||
|   const int iXmax = 4096; | ||||
|   const int iYmax = 4096; | ||||
|  | ||||
|   // Output filename | ||||
|   static const char *pFilename = "mandelbrot.png"; | ||||
|  | ||||
|   int iX, iY; | ||||
|   const double CxMin = -2.5; | ||||
|   const double CxMax = 1.5; | ||||
|   const double CyMin = -2.0; | ||||
|   const double CyMax = 2.0; | ||||
|  | ||||
|   double PixelWidth = (CxMax - CxMin) / iXmax; | ||||
|   double PixelHeight = (CyMax - CyMin) / iYmax; | ||||
|  | ||||
|   // Z=Zx+Zy*i  ;   Z0 = 0 | ||||
|   double Zx, Zy; | ||||
|   double Zx2, Zy2; // Zx2=Zx*Zx;  Zy2=Zy*Zy | ||||
|  | ||||
|   int Iteration; | ||||
|   const int IterationMax = 200; | ||||
|  | ||||
|   // bail-out value , radius of circle | ||||
|   const double EscapeRadius = 2; | ||||
|   double ER2=EscapeRadius * EscapeRadius; | ||||
|  | ||||
|   uint8 *pImage = (uint8 *)malloc(iXmax * 3 * iYmax); | ||||
|  | ||||
|   // world ( double) coordinate = parameter plane | ||||
|   double Cx,Cy; | ||||
|  | ||||
|   int MinIter = 9999, MaxIter = 0; | ||||
|  | ||||
|   for(iY = 0; iY < iYmax; iY++) | ||||
|   { | ||||
|     Cy = CyMin + iY * PixelHeight; | ||||
|     if (fabs(Cy) < PixelHeight/2) | ||||
|       Cy = 0.0; // Main antenna | ||||
|  | ||||
|     for(iX = 0; iX < iXmax; iX++) | ||||
|     { | ||||
|       uint8 *color = pImage + (iX * 3) + (iY * iXmax * 3); | ||||
|  | ||||
|       Cx = CxMin + iX * PixelWidth; | ||||
|  | ||||
|       // initial value of orbit = critical point Z= 0 | ||||
|       Zx = 0.0; | ||||
|       Zy = 0.0; | ||||
|       Zx2 = Zx * Zx; | ||||
|       Zy2 = Zy * Zy; | ||||
|  | ||||
|       for (Iteration=0;Iteration<IterationMax && ((Zx2+Zy2)<ER2);Iteration++) | ||||
|       { | ||||
|         Zy = 2 * Zx * Zy + Cy; | ||||
|         Zx =Zx2 - Zy2 + Cx; | ||||
|         Zx2 = Zx * Zx; | ||||
|         Zy2 = Zy * Zy; | ||||
|       }; | ||||
|  | ||||
|       color[0] = (uint8)Iteration; | ||||
|       color[1] = (uint8)Iteration >> 8; | ||||
|       color[2] = 0; | ||||
|  | ||||
|       if (Iteration < MinIter) | ||||
|         MinIter = Iteration; | ||||
|       if (Iteration > MaxIter) | ||||
|         MaxIter = Iteration; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   for(iY = 0; iY < iYmax; iY++) | ||||
|   { | ||||
|     for(iX = 0; iX < iXmax; iX++) | ||||
|     { | ||||
|       uint8 *color = (uint8 *)(pImage + (iX * 3) + (iY * iXmax * 3)); | ||||
|  | ||||
|       uint Iterations = color[0] | (color[1] << 8U); | ||||
|  | ||||
|       hsv_to_rgb(Iterations, MinIter, MaxIter, (rgb_t *)color); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // Now write the PNG image. | ||||
|   { | ||||
|     size_t png_data_size = 0; | ||||
|     void *pPNG_data = tdefl_write_image_to_png_file_in_memory_ex(pImage, iXmax, iYmax, 3, &png_data_size, 6, MZ_FALSE); | ||||
|     if (!pPNG_data) | ||||
|       fprintf(stderr, "tdefl_write_image_to_png_file_in_memory_ex() failed!\n"); | ||||
|     else | ||||
|     { | ||||
|       FILE *pFile = fopen(pFilename, "wb"); | ||||
|       fwrite(pPNG_data, 1, png_data_size, pFile); | ||||
|       fclose(pFile); | ||||
|       printf("Wrote %s\n", pFilename); | ||||
|     } | ||||
|  | ||||
|     // mz_free() is by default just an alias to free() internally, but if you've overridden miniz's allocation funcs you'll probably need to call mz_free(). | ||||
|     mz_free(pPNG_data); | ||||
|   } | ||||
|  | ||||
|   free(pImage); | ||||
|  | ||||
|   return EXIT_SUCCESS; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user