Compare commits
	
		
			2 Commits
		
	
	
		
			c6dd294bc0
			...
			a8-alt-sol
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9752ef451f | |||
| 42cb09f3bd | 
| @@ -75,30 +75,36 @@ void destroyDiskQueue(DiskQueue *queue) { | ||||
| 	free(queue); | ||||
| } | ||||
|  | ||||
| int calcDistance(int position, int destination) { | ||||
| 	if (position > destination) { | ||||
| 		return destination + (9999 + 1 - position); | ||||
| 	} else { | ||||
| 		return destination - position; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| DiskRequest* findClosest(DiskQueue *queue, int position, double time) { | ||||
| 	DiskRequest *current = queue->head; | ||||
| 	DiskRequest *closest = NULL; | ||||
| 	DiskRequest *next = NULL; | ||||
| 	DiskRequest *first = NULL; | ||||
| 	while (current != NULL) { | ||||
| 		if (current->time <= time) { // Filter out requests that haven't come in yet | ||||
| 			if (closest == NULL) { // If there is no closest yet, set it to the current | ||||
| 				closest = current; | ||||
| 			if (first == NULL) { | ||||
| 				first = current; | ||||
| 			} else { | ||||
| 				int closestDistance = calcDistance(position, closest->position); // Distance from the closest to the current position, negative means down (bad) | ||||
| 				int currentDistance = calcDistance(position, current->position); // Distance from the current to the current position, negative means down (bad | ||||
| 				if (currentDistance < closestDistance) { // If the current is closer than the closest | ||||
| 					closest = current; | ||||
| 				if (current->position < first->position) { | ||||
| 					first = current; | ||||
| 				} | ||||
| 			} | ||||
| 			int currentDistance = current->position - position; // Distance from the current to the current position, negative means down (bad) | ||||
| 			if (currentDistance > 0) { // If the current is up | ||||
| 				if (next == NULL) { // If there is no next yet, set it to the current | ||||
| 					next = current; | ||||
| 				} else { | ||||
| 					int nextDistance = next->position - position; // Distance from the next to the current position, negative means down (bad) | ||||
| 					if (currentDistance < nextDistance) { // If the current is closer than the next | ||||
| 						next = current; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		current = current->next; | ||||
| 	} | ||||
| 	return closest; | ||||
| } | ||||
| 	// If we didn't find a request that is above the current position, return the first as a fallback | ||||
| 	if (next == NULL) { | ||||
| 		return first; | ||||
| 	} | ||||
| 	return next; | ||||
| } | ||||
|   | ||||
| @@ -26,5 +26,3 @@ DiskRequest *dequeue(DiskQueue *queue); | ||||
| DiskRequest *findClosest(DiskQueue *queue, int position, double time); | ||||
|  | ||||
| void destroyDiskQueue(DiskQueue *queue); | ||||
|  | ||||
| int calcDistance(int position, int destination); | ||||
|   | ||||
| @@ -92,4 +92,4 @@ int main(int argc, char **argv) { | ||||
| 	destroyDiskQueue(queue); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| } | ||||
|   | ||||
							
								
								
									
										8
									
								
								Assignment9/.idea/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								Assignment9/.idea/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,8 +0,0 @@ | ||||
| # Default ignored files | ||||
| /shelf/ | ||||
| /workspace.xml | ||||
| # Editor-based HTTP Client requests | ||||
| /httpRequests/ | ||||
| # Datasource local storage ignored files | ||||
| /dataSources/ | ||||
| /dataSources.local.xml | ||||
							
								
								
									
										2
									
								
								Assignment9/.idea/Assignment9.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								Assignment9/.idea/Assignment9.iml
									
									
									
										generated
									
									
									
								
							| @@ -1,2 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <module classpath="CMake" type="CPP_MODULE" version="4" /> | ||||
							
								
								
									
										8
									
								
								Assignment9/.idea/cmake.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Assignment9/.idea/cmake.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,8 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="CMakeSharedSettings"> | ||||
|     <configurations> | ||||
|       <configuration PROFILE_NAME="Debug" ENABLED="true" GENERATION_DIR="build" CONFIG_NAME="Debug" /> | ||||
|     </configurations> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										4
									
								
								Assignment9/.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								Assignment9/.idea/misc.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,4 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" /> | ||||
| </project> | ||||
							
								
								
									
										8
									
								
								Assignment9/.idea/modules.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Assignment9/.idea/modules.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,8 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="ProjectModuleManager"> | ||||
|     <modules> | ||||
|       <module fileurl="file://$PROJECT_DIR$/.idea/Assignment9.iml" filepath="$PROJECT_DIR$/.idea/Assignment9.iml" /> | ||||
|     </modules> | ||||
|   </component> | ||||
| </project> | ||||
| @@ -1,8 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="All CTest" type="CTestRunConfiguration" factoryName="CTestRun" PROGRAM_PARAMS="--extra-verbose" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$CMakeCurrentLocalGenerationDir$" PASS_PARENT_ENVS_2="true" CONFIG_NAME="Debug" RUN_PATH="$CTestCurrentExecutableName$" EXPLICIT_BUILD_TARGET_NAME="all" TEST_MODE="PATTERN"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|       <option name="BeforeTestRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
| @@ -1,7 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Assignment9" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test1.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test1.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,7 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test1" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="../tests/test1.png" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test2.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test2.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,7 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test2" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="../tests/test2.png" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test3.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test3.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,7 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test3" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="../tests/test3.png" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test4.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test4.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,7 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test4" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="../tests/test4.png" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										10
									
								
								Assignment9/.idea/runConfigurations/Test_All.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										10
									
								
								Assignment9/.idea/runConfigurations/Test_All.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,10 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test All" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|       <option name="RunConfigurationTask" enabled="false" run_configuration_name="Test1" run_configuration_type="CMakeRunConfiguration" /> | ||||
|       <option name="RunConfigurationTask" enabled="true" run_configuration_name="Test3" run_configuration_type="CMakeRunConfiguration" /> | ||||
|       <option name="RunConfigurationTask" enabled="true" run_configuration_name="Test4" run_configuration_type="CMakeRunConfiguration" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										8
									
								
								Assignment9/.idea/runConfigurations/images.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Assignment9/.idea/runConfigurations/images.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,8 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="images" type="CTestRunConfiguration" factoryName="CTestRun" PROGRAM_PARAMS="--extra-verbose" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$CMakeCurrentLocalGenerationDir$" PASS_PARENT_ENVS_2="true" CONFIG_NAME="Debug" RUN_PATH="$CTestCurrentExecutableName$" EXPLICIT_BUILD_TARGET_NAME="all" TEST_METHOD="images" TEST_MODE="SUITE_TEST"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|       <option name="BeforeTestRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										8
									
								
								Assignment9/.idea/runConfigurations/output.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Assignment9/.idea/runConfigurations/output.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,8 +0,0 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="output" type="CTestRunConfiguration" factoryName="CTestRun" PROGRAM_PARAMS="--extra-verbose" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$CMakeCurrentLocalGenerationDir$" PASS_PARENT_ENVS_2="true" CONFIG_NAME="Debug" RUN_PATH="$CTestCurrentExecutableName$" EXPLICIT_BUILD_TARGET_NAME="all" TEST_METHOD="output" TEST_MODE="SUITE_TEST"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|       <option name="BeforeTestRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										6
									
								
								Assignment9/.idea/vcs.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Assignment9/.idea/vcs.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="VcsDirectoryMappings"> | ||||
|     <mapping directory="$PROJECT_DIR$/.." vcs="Git" /> | ||||
|   </component> | ||||
| </project> | ||||
| @@ -1,10 +0,0 @@ | ||||
| cmake_minimum_required(VERSION 3.20) | ||||
| project(Assignment9 C) | ||||
| set(CMAKE_C_STANDARD 99) | ||||
| add_executable(Assignment9 src/main.c | ||||
|         src/png.c | ||||
|         src/png.h) | ||||
|  | ||||
| enable_testing() | ||||
| add_test(NAME output COMMAND test_text.sh WORKING_DIRECTORY ../tests) | ||||
| add_test(NAME images COMMAND test_images.sh WORKING_DIRECTORY ../tests) | ||||
										
											Binary file not shown.
										
									
								
							| @@ -1,68 +0,0 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <arpa/inet.h> | ||||
| // FILE format is: 'header', then 2023 skipped bytes, then the number of interest | ||||
| #define OURINT 1426915328 | ||||
| #define OFFSETTODATA 2023 | ||||
|  | ||||
| int writeToFile(){ | ||||
|  | ||||
|     FILE* fp = fopen("toReadLater.txt","w+"); | ||||
| 	char c = 'h'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'e'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'a'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'd'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'e'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'r'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     unsigned int buf = OFFSETTODATA; | ||||
|     fwrite(&buf, sizeof(int), 1, fp); | ||||
|     fseek(fp, OFFSETTODATA, SEEK_CUR); | ||||
|  | ||||
|     buf = OURINT; | ||||
|     fwrite(&buf, sizeof(int), 1, fp); | ||||
|     fclose(fp); | ||||
| } | ||||
|  | ||||
| int readFromFile(){ | ||||
| 	FILE *fp = fopen("toReadLater.txt", "r+"); | ||||
| 	fseek(fp, 6 , SEEK_SET); | ||||
| 	int skip = 0; | ||||
| 	fread(&skip, sizeof(int), 1, fp); | ||||
|     // NOTE, in HW, the size of the section is a value in  | ||||
|     // Big-Endian format, it will actually need conversion | ||||
| 	fseek(fp, skip, SEEK_CUR); | ||||
| 	unsigned int qBe = 0; | ||||
| 	unsigned int qLe = 0; | ||||
| 	int i; | ||||
| 	unsigned char *c = (char *)(&qBe); | ||||
| 	unsigned char *d = (char *)(&qLe); | ||||
| 	for (i = 0; i < 4; i++) | ||||
| 	{ | ||||
| 		c[i] = getc(fp); | ||||
| 		printf("Byte %i: %i %x\n",i, c[i], c[i]); | ||||
| 	} | ||||
|  | ||||
|     for (i = 0; i < 4; i++) | ||||
| 	{ | ||||
| 		d[4-i-1] = c[i]; | ||||
| 	} | ||||
|  | ||||
|     printf("Translated using swapping the bytes order: %i\n", qLe); | ||||
| 	qLe = ntohl(qBe); | ||||
|     printf("Translated using ntohl: %i\n", qLe); | ||||
|     fclose(fp); | ||||
| } | ||||
| int main (int argc, char** argv){ | ||||
|     unsigned int wantToRead; | ||||
| 	writeToFile(); | ||||
| 	printf("Sizeof (int) is:%li\n", sizeof(unsigned int)); | ||||
| 	readFromFile(); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
										
											Binary file not shown.
										
									
								
							| @@ -1,50 +0,0 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <limits.h> | ||||
| #include <string.h> | ||||
| #include <stdbool.h> | ||||
| #include "png.h" | ||||
|  | ||||
| int main(int argc, char *argv[]) { | ||||
| 	// Error handling | ||||
| 	if (argc != 2) { | ||||
| 		printf("Usage: %s <png file>\n", argv[0]); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} | ||||
| 	if (strlen(argv[1]) > PATH_MAX) { | ||||
| 		printf("Path too long\n"); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} | ||||
| 	// Read file | ||||
| 	char *path = argv[1]; | ||||
| 	char *png_buffer = load_file(path); | ||||
| 	if (!is_png(png_buffer)) { | ||||
| 		printf("It's not a PNG file\n"); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} else { | ||||
| 		printf("It's a PNG file\n"); | ||||
| 	} | ||||
| 	png_chunk **chunks = get_png_chunks(png_buffer); | ||||
| 	free(png_buffer); | ||||
| 	// Done with buffer, as chunks are a structured way to access the data | ||||
| 	// Iterate over chunks to display info and "decrypt" IDAT chunks | ||||
| 	int size = get_number_of_chunks(chunks); | ||||
| 	for (int i = 0; i < size; i++) { | ||||
| 		// Check if header is IDAT or IEND | ||||
| 		bool is_idat = memcmp(chunks[i]->type, "IDAT", 4) == 0; | ||||
| 		bool is_iend = memcmp(chunks[i]->type, "IEND", 4) == 0; | ||||
| 		if (is_idat || is_iend) { | ||||
| 			printf("Found %.4s\n", chunks[i]->type); | ||||
| 			if (is_idat) { | ||||
| 				xor_data(chunks[i]); | ||||
| 			} | ||||
| 		} else { | ||||
| 			printf("Found unknown: %.4s\n", chunks[i]->type); | ||||
| 		} | ||||
| 		printf("Chunk size is:%d\n", chunks[i]->length); | ||||
| 	} | ||||
| 	// Write file and free memory | ||||
| 	write_png_chunks(path, chunks); | ||||
| 	destroy_chunks(chunks); | ||||
| 	return EXIT_SUCCESS; | ||||
| } | ||||
| @@ -1,159 +0,0 @@ | ||||
| /* | ||||
|  * Copyright Notice | ||||
|  * ---------------- | ||||
|  * Copyright © 1998, 1999 by: Glenn Randers-Pehrson | ||||
|  * This specification is a modification of the PNG 1.0 specification. It is being | ||||
|  * provided by the copyright holder under the provisions of the 1996 MIT copyright and license: | ||||
|  * Copyright © 1996 by: Massachusetts Institute of Technology (MIT) | ||||
|  * This W3C specification is being provided by the copyright holders under | ||||
|  * the following license. By obtaining, using and/or copying this specification, you | ||||
|  * agree that you have read, understood, and will comply with the following terms | ||||
|  * and conditions: | ||||
|  * Permission to use, copy, and distribute this specification for any purpose | ||||
|  * and without fee or royalty is hereby granted, provided that the full text of | ||||
|  * this NOTICE appears on ALL copies of the specification or portions thereof, | ||||
|  * including modifications, that you make. | ||||
|  * THIS SPECIFICATION IS PROVIDED ”AS IS,” AND COPYRIGHT HOLD-ERS | ||||
|  * MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR | ||||
|  * IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, COPYRIGHT | ||||
|  * HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY | ||||
|  * OR FITNESS FOR ANY PARTICULAR PURPOSE OR | ||||
|  * THAT THE USE OF THE SPECIFICATION WILL NOT INFRINGE ANY | ||||
|  * THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER | ||||
|  * RIGHTS. COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY | ||||
|  * USE OF THIS SPECIFICATION. | ||||
|  * The name and trademarks of copyright holders may NOT be used in | ||||
|  * advertising or publicity pertaining to the specification without specific, written | ||||
|  * prior permission. Title to copyright in this specification and any associated | ||||
|  * documentation will at all times remain with copyright holders. | ||||
|  */ | ||||
|  | ||||
| #include <arpa/inet.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <stdbool.h> | ||||
| #include "png.h" | ||||
|  | ||||
| FILE *get_file(char *path) { | ||||
| 	FILE *fp = fopen(path, "rb"); | ||||
| 	if (fp == NULL) { | ||||
| 		perror("fopen"); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} | ||||
| 	return fp; | ||||
| } | ||||
|  | ||||
| char *load_file(char *path) { | ||||
| 	FILE *fp = get_file(path); | ||||
| 	fseek(fp, 0, SEEK_END); | ||||
| 	long size = ftell(fp); | ||||
| 	rewind(fp); | ||||
| 	char *buffer = malloc(size); | ||||
| 	if (buffer == NULL) { | ||||
| 		perror("malloc"); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} | ||||
| 	fread(buffer, 1, size, fp); | ||||
| 	fclose(fp); | ||||
| 	return buffer; | ||||
| } | ||||
|  | ||||
| int is_png(char *buffer) { | ||||
| 	return memcmp(buffer, PNG_SIGNATURE, PNG_SIGNATURE_SIZE) == 0; | ||||
| } | ||||
|  | ||||
| png_chunk *get_png_chunk(char *buffer, unsigned int offset) { | ||||
| 	png_chunk *chunk = malloc(sizeof(png_chunk)); | ||||
| 	if (chunk == NULL) { | ||||
| 		perror("malloc"); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} | ||||
| 	memcpy(&chunk->length, buffer + offset + 0, 4); | ||||
| 	// Convert length to host byte order because PNG lengths is in network byte order/Big Endian | ||||
| 	chunk->length = ntohl(chunk->length); | ||||
| 	memcpy(&chunk->type, buffer + offset + 4, 4); | ||||
| 	chunk->data = malloc(chunk->length); | ||||
| 	if (chunk->data == NULL) { | ||||
| 		perror("malloc"); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} | ||||
| 	memcpy(chunk->data, buffer + offset + 8, chunk->length); | ||||
| 	memcpy(&chunk->crc, buffer + offset + 8 + chunk->length, 4); | ||||
| 	return chunk; | ||||
| } | ||||
|  | ||||
| png_chunk **get_png_chunks(char *buffer) { | ||||
| 	png_chunk **chunks = malloc(sizeof(png_chunk *)); | ||||
| 	if (chunks == NULL) { | ||||
| 		perror("malloc"); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} | ||||
| 	// Running offset of the buffer | ||||
| 	unsigned int offset = PNG_SIGNATURE_SIZE; | ||||
| 	// Index of the current chunk | ||||
| 	int i = 0; | ||||
| 	while (true) { | ||||
| 		chunks[i] = get_png_chunk(buffer, offset); | ||||
| 		// 12 = 4 (length) + 4 (type) + 4 (crc) | ||||
| 		offset += 12 + chunks[i]->length; | ||||
| 		if (memcmp(chunks[i]->type, "IEND", 4) == 0) { | ||||
| 			break; | ||||
| 		} | ||||
| 		i++; | ||||
| 		// Add one because realloc is 1-indexed when multiplying by sizeof | ||||
| 		png_chunk **err_check = realloc(chunks, sizeof(png_chunk *) * (i + 1)); | ||||
| 		if (err_check == NULL) { | ||||
| 			destroy_chunks(chunks); | ||||
| 			perror("realloc"); | ||||
| 			exit(EXIT_FAILURE); | ||||
| 		} | ||||
| 		chunks = err_check; | ||||
| 	} | ||||
| 	return chunks; | ||||
| } | ||||
|  | ||||
| int get_number_of_chunks(png_chunk **chunks) { | ||||
| 	int i = 0; | ||||
| 	while (memcmp(chunks[i]->type, "IEND", 4) != 0) { | ||||
| 		i++; | ||||
| 	} | ||||
| 	// Add one for the IEND chunk | ||||
| 	return ++i; | ||||
| } | ||||
|  | ||||
| void xor_data(png_chunk *chunk) { | ||||
| 	for (int i = 0; i < chunk->length; i++) { | ||||
| 		chunk->data[i] ^= KEY; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void destroy_chunks(png_chunk **chunks) { | ||||
| 	unsigned int size = get_number_of_chunks(chunks); | ||||
| 	for (int i = 0; i < size; i++) { | ||||
| 		free(chunks[i]->data); | ||||
| 		free(chunks[i]); | ||||
| 	} | ||||
| 	free(chunks); | ||||
| } | ||||
|  | ||||
| void write_png_chunks(char *path, png_chunk **chunks) { | ||||
| 	FILE *fp = fopen(path, "wb"); | ||||
| 	if (fp == NULL) { | ||||
| 		perror("fopen"); | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	} | ||||
| 	fwrite(PNG_SIGNATURE, PNG_SIGNATURE_SIZE, 1, fp); | ||||
| 	unsigned int size = get_number_of_chunks(chunks); | ||||
| 	for (int i = 0; i < size; i++) { | ||||
| 		// Convert length to network byte order for writing | ||||
| 		chunks[i]->length = htonl(chunks[i]->length); | ||||
| 		fwrite(&chunks[i]->length, 4, 1, fp); | ||||
| 		fwrite(chunks[i]->type, 4, 1, fp); | ||||
| 		// Convert back so we can accurately use it to write the length of the data | ||||
| 		chunks[i]->length = ntohl(chunks[i]->length); | ||||
| 		fwrite(chunks[i]->data, chunks[i]->length, 1, fp); | ||||
| 		fwrite(&chunks[i]->crc, 4, 1, fp); | ||||
| 	} | ||||
| 	fclose(fp); | ||||
| } | ||||
| @@ -1,75 +0,0 @@ | ||||
| /* | ||||
|  * Copyright Notice | ||||
|  * ---------------- | ||||
|  * Copyright © 1998, 1999 by: Glenn Randers-Pehrson | ||||
|  * This specification is a modification of the PNG 1.0 specification. It is being | ||||
|  * provided by the copyright holder under the provisions of the 1996 MIT copyright and license: | ||||
|  * Copyright © 1996 by: Massachusetts Institute of Technology (MIT) | ||||
|  * This W3C specification is being provided by the copyright holders under | ||||
|  * the following license. By obtaining, using and/or copying this specification, you | ||||
|  * agree that you have read, understood, and will comply with the following terms | ||||
|  * and conditions: | ||||
|  * Permission to use, copy, and distribute this specification for any purpose | ||||
|  * and without fee or royalty is hereby granted, provided that the full text of | ||||
|  * this NOTICE appears on ALL copies of the specification or portions thereof, | ||||
|  * including modifications, that you make. | ||||
|  * THIS SPECIFICATION IS PROVIDED ”AS IS,” AND COPYRIGHT HOLD-ERS | ||||
|  * MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR | ||||
|  * IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, COPYRIGHT | ||||
|  * HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY | ||||
|  * OR FITNESS FOR ANY PARTICULAR PURPOSE OR | ||||
|  * THAT THE USE OF THE SPECIFICATION WILL NOT INFRINGE ANY | ||||
|  * THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER | ||||
|  * RIGHTS. COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY | ||||
|  * USE OF THIS SPECIFICATION. | ||||
|  * The name and trademarks of copyright holders may NOT be used in | ||||
|  * advertising or publicity pertaining to the specification without specific, written | ||||
|  * prior permission. Title to copyright in this specification and any associated | ||||
|  * documentation will at all times remain with copyright holders. | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| // Needed for uint types | ||||
| #include <arpa/inet.h> | ||||
|  | ||||
| // http://www.libpng.org/pub/png/spec/1.2/PNG-Rationale.html#R.PNG-file-signature | ||||
| #define PNG_SIGNATURE "\211PNG\r\n\032\n" | ||||
| #define PNG_SIGNATURE_SIZE 8 | ||||
|  | ||||
| // The key used to "encrypt/decrypt" the PNG chunks | ||||
| #define KEY 42 | ||||
|  | ||||
| typedef struct png_chunk { | ||||
| 	uint32_t length; | ||||
| 	char type[4]; | ||||
| 	char *data; | ||||
| 	uint32_t crc; | ||||
| } png_chunk; | ||||
|  | ||||
| // Get FILE from path | ||||
| int get_fd(char *path); | ||||
|  | ||||
| // Store file in heap memory | ||||
| char *load_file(char *path); | ||||
|  | ||||
| // Check if file is a PNG | ||||
| int is_png(char *buffer); | ||||
|  | ||||
| // Get PNG chunk | ||||
| png_chunk *get_png_chunk(char *buffer, unsigned int offset); | ||||
|  | ||||
| // Get all PNG chunks | ||||
| png_chunk **get_png_chunks(char *buffer); | ||||
|  | ||||
| // Get number of chunks | ||||
| int get_number_of_chunks(png_chunk **chunks); | ||||
|  | ||||
| // XOR chunk with key | ||||
| void xor_data(png_chunk *chunk); | ||||
|  | ||||
| // Destroy all chunks | ||||
| void destroy_chunks(png_chunk **chunks); | ||||
|  | ||||
| // Write PNG chunks to file | ||||
| void write_png_chunks(char *path, png_chunk **chunks); | ||||
| @@ -1,13 +0,0 @@ | ||||
| It's a PNG file | ||||
| Found unknown: IHDR | ||||
| Chunk size is:13 | ||||
| Found unknown: sRGB | ||||
| Chunk size is:1 | ||||
| Found unknown: gAMA | ||||
| Chunk size is:4 | ||||
| Found unknown: pHYs | ||||
| Chunk size is:9 | ||||
| Found IDAT | ||||
| Chunk size is:18944 | ||||
| Found IEND | ||||
| Chunk size is:0 | ||||
| @@ -1 +0,0 @@ | ||||
| It's not a PNG file | ||||
| @@ -1,249 +0,0 @@ | ||||
| It's a PNG file | ||||
| Found unknown: IHDR | ||||
| Chunk size is:13 | ||||
| Found unknown: sRGB | ||||
| Chunk size is:1 | ||||
| Found unknown: gAMA | ||||
| Chunk size is:4 | ||||
| Found unknown: pHYs | ||||
| Chunk size is:9 | ||||
| Found unknown: tEXt | ||||
| Chunk size is:15 | ||||
| Found unknown: tIME | ||||
| Chunk size is:7 | ||||
| Found unknown: tEXt | ||||
| Chunk size is:32 | ||||
| Found unknown: tEXt | ||||
| Chunk size is:33 | ||||
| Found IDAT | ||||
| Chunk size is:65310 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:17176 | ||||
| Found IEND | ||||
| Chunk size is:0 | ||||
| @@ -1,317 +0,0 @@ | ||||
| It's a PNG file | ||||
| Found unknown: IHDR | ||||
| Chunk size is:13 | ||||
| Found unknown: sRGB | ||||
| Chunk size is:1 | ||||
| Found unknown: gAMA | ||||
| Chunk size is:4 | ||||
| Found unknown: pHYs | ||||
| Chunk size is:9 | ||||
| Found unknown: tEXt | ||||
| Chunk size is:15 | ||||
| Found unknown: tIME | ||||
| Chunk size is:7 | ||||
| Found unknown: tEXt | ||||
| Chunk size is:32 | ||||
| Found unknown: tEXt | ||||
| Chunk size is:33 | ||||
| Found IDAT | ||||
| Chunk size is:65310 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:65524 | ||||
| Found IDAT | ||||
| Chunk size is:53390 | ||||
| Found IEND | ||||
| Chunk size is:0 | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 19 KiB | 
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 7.1 MiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 9.3 MiB | 
| @@ -1,22 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| # Executable path | ||||
| EXECUTABLE=../build/Assignment9 | ||||
|  | ||||
|  | ||||
| test_reverse() { | ||||
|     start=$(date +%s) | ||||
|     cp "$1" in.png | ||||
|     cp in.png out.png | ||||
|     $EXECUTABLE out.png > /dev/null | ||||
|     $EXECUTABLE out.png > /dev/null | ||||
|     diff in.png out.png | ||||
|     rm in.png out.png | ||||
|     end=$(date +%s) | ||||
|     echo "Test $1 took $((end - start)) seconds" | ||||
| } | ||||
|  | ||||
| test_reverse test1.png | ||||
| # test_reverse test2.png # This png is invalid, so it will fail | ||||
| test_reverse test3.png | ||||
| test_reverse test4.png | ||||
| @@ -1,18 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| EXECUTABLE=../build/Assignment9 | ||||
|  | ||||
| # Test the text output | ||||
| $EXECUTABLE test1.png | diff output1.txt - | ||||
| $EXECUTABLE test2.png | diff output2.txt - | ||||
| $EXECUTABLE test3.png | diff output3.txt - | ||||
| $EXECUTABLE test4.png | diff output4.txt - | ||||
|  | ||||
|  | ||||
| # Reverse the images | ||||
| $EXECUTABLE test1.png > /dev/null | ||||
| $EXECUTABLE test2.png > /dev/null | ||||
| $EXECUTABLE test3.png > /dev/null | ||||
| $EXECUTABLE test4.png > /dev/null | ||||
|  | ||||
| echo "If there is no diff output, then the test passed." | ||||
		Reference in New Issue
	
	Block a user