Skip to content

Instantly share code, notes, and snippets.

@dtinth
Created July 11, 2011 14:43
Show Gist options
  • Save dtinth/1075994 to your computer and use it in GitHub Desktop.
Save dtinth/1075994 to your computer and use it in GitHub Desktop.
HLP Hackathon : Image Flipping
#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