#include #include #include //#include #define HEADER_FORMAT "#N canvas 0 0 %d %d 10;\n" #define OUT_HEADER(w, h) fprintf(stdout, HEADER_FORMAT, w, h) #define CNV_FORMAT "#X obj %d %d cnv 1 %d %d empty empty empty 20 12 0 14 %d -1 0;\n" #define OUT_PIXEL(x, y, w, h, col) fprintf(stdout, CNV_FORMAT, x, y, w, h, col) #define OUT_PIXEL_pix(p) OUT_PIXEL(p->x, p->y, p->w, p->h, p->color) #define C6bit(b) ((b>>2)&0x3F) #define RGB(r, g, b) ((-1)-(C6bit(r)<<12)-(C6bit(g)<<6)-(C6bit(b))) #define TRANSPARENT_COLOR (-262144) // WHITE typedef struct _pix { int x; int y; int w; int h; int color; struct _pix* next; } pix; typedef struct _line { pix* head; struct _line* next; } line; line image; void optimize(pix* pix_head); int main(int argc, char **argv) { if(argc < 2) { fprintf(stderr, "Please specify a PPM image!\n"); return 1; } FILE *fp = fopen(argv[1], "rb"); if(!fp) { fprintf(stderr, "Cannot open file: %s!\n", argv[1]); return 1; } char magic; int x,y,w,h,r,g,b,maxval,magicn; fscanf(fp, "%c%d\n%d %d\n%d\n", &magic, &magicn, &w, &h, &maxval); // WARNING: ppm must be stripped from commnets! // expect program (or system) crash otherwise! fprintf(stderr, "Found %c%d image %dx%d (%d values)\n", magic, magicn, w, h, maxval); OUT_HEADER(w, h); line* pline = ℑ pix* ppix = 0L; for(y=0; ynext = (line*)malloc(sizeof(line)); pline = pline->next; ppix = pline->head = (pix*)malloc(sizeof(pix)); for(x=0; xnext = (pix*)malloc(sizeof(pix)); ppix = ppix->next; ppix->w = 1; ppix->h = 1; ppix->color = RGB(r*255/maxval,g*255/maxval,b*255/maxval); ppix->x = x*2; ppix->y = y*2; } } for(pline = ℑ pline->next != 0L; ) { pline = pline->next; // stupid one-axis optimization made by me 8] // I should research for a better 2d-shape optimization algo optimize(pline->head); for(ppix = pline->head; ppix->next != 0L; ) { ppix = ppix->next; if(ppix->color != TRANSPARENT_COLOR) OUT_PIXEL_pix(ppix); } } return 0; } void optimize(pix* pix_head) { pix* ppix = pix_head->next; pix* temp1 = 0L; while(ppix && ppix->next) { if(ppix->color == ppix->next->color) { temp1 = ppix->next->next; free(ppix->next); ppix->next = temp1; temp1 = 0L; ppix->w += 2; } else { ppix = ppix->next; } } }