Created
July 11, 2011 14:43
-
-
Save dtinth/1075994 to your computer and use it in GitHub Desktop.
HLP Hackathon : Image Flipping
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <math.h> | |
#include <stdint.h> | |
#include <algorithm> | |
union operation_t { | |
uint8_t opcode; | |
uint32_t hash; | |
}; | |
int main() { | |
FILE *fp = fopen("file783", "rb"); | |
int size; | |
{ | |
int filesize, allpixels, pixels; | |
fseek(fp, 0, SEEK_END); | |
filesize = ftell(fp); | |
fseek(fp, 0, SEEK_SET); | |
allpixels = filesize / 4; | |
pixels = allpixels / 2; | |
size = sqrt(pixels); | |
} | |
uint32_t data[2][size][size]; | |
operation_t ops[size][size]; | |
{ | |
for (int i = 0; i < size; i ++) { | |
for (int j = 0; j < size; j ++) { | |
fread(&data[0][i][j], sizeof(int32_t), 1, fp); | |
} | |
} | |
} | |
#define APPLY for(int i = 0; i < size; i ++) for(int j = 0; j < size; j ++) data[0][i][j] = data[1][i][j]; | |
{ | |
for (int zi = 0; zi < size; zi ++) { | |
for (int zj = 0; zj < size; zj ++) { | |
fread(&ops[zi][zj], sizeof(ops[zi][zj]), 1, fp); | |
} | |
} | |
} | |
{ | |
for (int zi = 0; zi < size; zi ++) { | |
for (int zj = 0; zj < size; zj ++) { | |
operation_t pixel = ops[zi][zj]; | |
uint8_t op = pixel.opcode >> 5; | |
if (op == 1) { | |
// flip vertical | |
printf("flipv\n"); | |
for (int i = 0; i < size; i ++) { | |
for (int j = 0; j < size; j ++) { | |
data[1][i][j] = data[0][size - i - 1][j]; | |
} | |
} | |
APPLY; | |
} else if (op == 2) { | |
// flip horizontal | |
printf("fliph\n"); | |
for (int i = 0; i < size; i ++) { | |
for (int j = 0; j < size; j ++) { | |
data[1][i][j] = data[0][i][size - j - 1]; | |
} | |
} | |
APPLY; | |
} else if (op == 3) { | |
// flip d topright bottomleft | |
printf("fliptr\n"); | |
for (int i = 0; i < size; i ++) { | |
for (int j = 0; j < size; j ++) { | |
data[1][i][j] = data[0][j][i]; | |
} | |
} | |
APPLY; | |
} else if (op == 4) { | |
// flip d topleft bottomright | |
printf("flipbl\n"); | |
for (int i = 0; i < size; i ++) { | |
for (int j = 0; j < size; j ++) { | |
data[1][i][j] = data[0][size - j - 1][size - i - 1]; | |
} | |
} | |
APPLY; | |
} else if (op == 5) { | |
// swap pixel | |
for (int i = zi; i < size; i ++) { | |
for (int j = i == zi ? zj + 1 : 0; j < size; j ++) { | |
if (ops[i][j].hash == pixel.hash) { | |
ops[i][j].opcode = 0; | |
std::swap(data[0][zi][zj], data[0][i][j]); | |
printf("found, swap pixel\n"); | |
break; | |
} | |
} | |
} | |
} else if (op == 6) { | |
// swap row | |
for (int i = zi; i < size; i ++) { | |
for (int j = i == zi ? zj + 1 : 0; j < size; j ++) { | |
if (ops[i][j].hash == pixel.hash) { | |
ops[i][j].opcode = 0; | |
for (int col = 0; col < size; col ++) { | |
std::swap(data[0][zi][col], data[0][i][col]); | |
} | |
printf("found, swap row\n"); | |
break; | |
} | |
} | |
} | |
} else if (op == 7) { | |
// swap column | |
for (int i = zi; i < size; i ++) { | |
for (int j = i == zi ? zj + 1 : 0; j < size; j ++) { | |
if (ops[i][j].hash == pixel.hash) { | |
ops[i][j].opcode = 0; | |
for (int row = 0; row < size; row ++) { | |
std::swap(data[0][row][zj], data[0][row][j]); | |
} | |
printf("found, swap col\n"); | |
break; | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
{ | |
FILE *fo = fopen("output.bin", "wb"); | |
for (int i = 0; i < size; i ++) { | |
for (int j = 0; j < size; j ++) { | |
fwrite(&data[0][i][j], sizeof(int32_t), 1, fo); | |
} | |
} | |
fclose(fo); | |
} | |
fclose(fp); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment