diff options
author | Pin <wf6DJd8a3xSSCZbn@protonmail.com> | 2021-11-11 00:50:08 -0500 |
---|---|---|
committer | Pin <wf6DJd8a3xSSCZbn@protonmail.com> | 2021-11-11 00:50:08 -0500 |
commit | b8600c17d54a13eac8c734d0cb75e37ba0260e45 (patch) | |
tree | d4d292d092b4cdbcf64f17c4ee606e336a32c7df | |
parent | 7caca5e7e6fa81087537f0c1f9582b1d8b118073 (diff) |
filter updates
-rw-r--r-- | cmd/pspng.c | 125 |
1 files changed, 99 insertions, 26 deletions
diff --git a/cmd/pspng.c b/cmd/pspng.c index 59c8699..0a632e0 100644 --- a/cmd/pspng.c +++ b/cmd/pspng.c @@ -8,6 +8,7 @@ #include <sodium.h> #include <getopt.h> #include <pthread.h> +#include <math.h> #include "crc_util.h" #include "CRCLib.h" #include "pspng.h" @@ -70,11 +71,74 @@ int update_file_crc(unsigned char *addr, unsigned long offset , unsigned int crc return 0; } -static void random_window_bit_change(unsigned char *data, int width, int rounds, int color_range, size_t length, size_t offset) { +static unsigned char* create_raw_pixel_values(unsigned char *data, int width, int color_range, size_t length) { + // Generating twice the size we migth need + length = length * 2; + //length = 500000; + unsigned char* raw_data = calloc(length, sizeof(unsigned char*)); + size_t filter_chunk_byte = 0; + + for(size_t i = 0; i < length; i++) { + filter_chunk_byte = i - (i % ((width * color_range) + 1)); + // Grabbing raw pixel data + if(data[filter_chunk_byte] == 0) { + // Filter: None + raw_data[i] = data[i]; + } else if(data[filter_chunk_byte] == 1) { + // Filter: Sub + if ((i % ((width * color_range) + 1)) == 0) { + // Setting filter type + raw_data[i] = data[i]; + } else if ((i - filter_chunk_byte) <= color_range) { + // Setting initial color_range byte + raw_data[i] = data[i]; + } else { + // Setting remaining bytes + raw_data[i] = data[i] + raw_data[i - color_range]; + } + + } else if(data[filter_chunk_byte] == 3) { + // Filter: Average + if((i % ((width * color_range) + 1)) == 0) { + // Setting filter type + raw_data[i] = data[i]; + } else { + // Setting remaining bytes + if(filter_chunk_byte == 0) { + // If no scanline is present before current + if((i - filter_chunk_byte) <= color_range) { + // If no pixel present before current + raw_data[i] = data[i] + floor((0 + 0) / 2); + } else { + // If pixel present before current + raw_data[i] = data[i] + floor((data[i - color_range] + 0) / 2); + } + + } else { + // Scanline is present before current + if((i - filter_chunk_byte) <= color_range) { + // If no pixel present before current + raw_data[i] = data[i] + floor((0 + raw_data[i - ((width * color_range) + 1)]) / 2); + } else { + // If pixel present before current + raw_data[i] = data[i] + floor((raw_data[i - color_range] + raw_data[i - ((width * color_range) + 1)]) / 2); + } + } + } + + } else { + // Filter: Error Unsupported + printf("Exiting due to unsupported filter type\n"); + exit(EXIT_FAILURE); + } + } + + return raw_data; +} + +static void random_window_bit_change(unsigned char *data, unsigned char *raw_data, int width, int rounds, int color_range, size_t length, size_t offset) { size_t random_num = 0; size_t filter_chunk_byte = 0; - size_t change_num = 0; - long prior_chuck_check = 0; for (int i = 0; i < rounds; i++) { random_num = 0; do { @@ -93,17 +157,21 @@ static void random_window_bit_change(unsigned char *data, int width, int rounds, // Sub Filter Type Change if(data[random_num] == 255) { data[random_num]--; - change_num = 1; + raw_data[random_num]--; } else { data[random_num]++; - change_num = -1; + raw_data[random_num]++; + } + // Fixing Next Pixel in Scanline + if(!(random_num+3 > (filter_chunk_byte + (width * color_range) + 1))){ + data[random_num+color_range] = raw_data[random_num+color_range] - raw_data[random_num]; } - // Starting after random change - for(int j = 1; j < 2; j++) { - data[random_num+(color_range * j)] = (data[random_num+(color_range * j)] + change_num) % 256; + // Checking Next Scanline type + if(data[filter_chunk_byte+((width * color_range) + 1)] == 3){ + data[random_num+((width * color_range)+1)] = raw_data[random_num+((width * color_range)+1)] - floor((raw_data[random_num+((width * color_range)+1)-color_range] + raw_data[random_num]) / 2); } } else if(data[filter_chunk_byte] == 2) { - printf("2\n"); + // Add Support if(data[random_num] == 255) { data[random_num]--; } else { @@ -111,21 +179,23 @@ static void random_window_bit_change(unsigned char *data, int width, int rounds, } } else if(data[filter_chunk_byte] == 3) { // Average Filter Type Change - //printf("HEE: %d\n", data[(filter_chunk_byte - (width * color_range))-1]); - prior_chuck_check = filter_chunk_byte; - do { - //printf("C: %d\n", data[prior_chuck_check]); - prior_chuck_check = (prior_chuck_check - (width * color_range)-1); - //printf("CH: %ld\n", prior_chuck_check); - } while(prior_chuck_check >= 0); - - if(data[random_num] == 255) { - data[random_num]--; + if(raw_data[random_num] == 255) { + raw_data[random_num]--; } else { - data[random_num]++; + raw_data[random_num]++; + } + // Update Current Pixel + data[random_num] = raw_data[random_num] - floor((raw_data[random_num-color_range] + raw_data[random_num-((width * color_range) + 1)]) / 2); + // Fixing Next Pixel in Scanline + if(!(random_num+color_range > (filter_chunk_byte + (width * color_range) + 1))){ + data[random_num+color_range] = raw_data[random_num+color_range] - floor((raw_data[random_num] + raw_data[random_num-((width * color_range)+ 1)+color_range]) / 2); + } + // Checking Next Scanline type + if(data[filter_chunk_byte+((width * color_range) + 1)] == 3){ + data[random_num+((width * color_range)+1)] = raw_data[random_num+((width * color_range)+1)] - floor((raw_data[random_num+((width * color_range)+1)-color_range] + raw_data[random_num]) / 2); } } else if(data[filter_chunk_byte] == 4) { - printf("4\n"); + // Add Support if(data[random_num] == 255) { data[random_num]--; } else { @@ -182,9 +252,11 @@ static int verify_crc_chunks(unsigned char *data, size_t data_length, int crc_de static int crc_embed_data(unsigned char *data, unsigned int data_length, int bit_width, int color_range, unsigned int sliding_window, char message, size_t offset , size_t iteration) { unsigned char *check_data; + unsigned char *raw_data; size_t check_data_length = 0; - - random_window_bit_change(data, bit_width, 2, color_range, sliding_window, offset); + + raw_data = create_raw_pixel_values(data, bit_width, color_range, sliding_window); + random_window_bit_change(data, raw_data, bit_width, 1, color_range, sliding_window, offset); // Compressing data for test zlib_compress_data(data, data_length, &check_data, &check_data_length); @@ -197,6 +269,7 @@ static int crc_embed_data(unsigned char *data, unsigned int data_length, int bit return 0; } free(check_data); + free(raw_data); return 1; } @@ -215,8 +288,8 @@ void *random_data_change_thread_call(void *w) { } else { data->data_len = data->uncom_data_len; } - if(data->uncom_data_len > 16000) { - data->win_size = 9000 + (9000 * data->cur_iteration); + if(data->uncom_data_len > 36000) { + data->win_size = 36000 + (36000 * data->cur_iteration); } else { data->win_size = data->uncom_data_len; } @@ -260,7 +333,7 @@ size_t generate_offset(unsigned char *data, size_t data_len, size_t iteration) { void random_data_change(unsigned char *color_data, unsigned char *width, size_t length, char *message) { int searching = 1; - int core_count = 24; + int core_count = 28; unsigned int sliding_window = 0; unsigned int compress_data_length = 0; // Needs to be turned into a variable |