#include "image.h" #include enum { Empty = DWhite }; int isempty(Memimage *mem, Point p) { if(!ptinrect(p, mem->r) || BGLONG(byteaddr(mem, p)) == Empty) return 1; return 0; } void usage(void) { fprint(2, "usage: %s\n", argv0); exits("usage"); } void main(int argc, char **argv) { Memimage *srcmem, *dstmem; int y, x; uchar *src, *dst; ARGBEGIN { default: usage(); } ARGEND memimageinit(); if((srcmem = readmemimage(0)) == nil) sysfatal("read image: %r"); if(srcmem->chan != RGBA32) sysfatal("not RGBA32"); if((dstmem = allocmemimage(srcmem->r, srcmem->chan)) == nil) sysfatal("alloc dstmem: %r"); for(y = srcmem->r.min.y; y < srcmem->r.max.y; y++) { for(x = srcmem->r.min.x; x < srcmem->r.max.x; x++) { src = byteaddr(srcmem, Pt(x, y)); dst = byteaddr(dstmem, Pt(x, y)); BPLONG(dst, Empty); if(BGLONG(src) == Empty) continue; if(isempty(srcmem, Pt(x-1, y))) BPLONG(dst, DRed); if(isempty(srcmem, Pt(x+1, y))) BPLONG(dst, DBlue); if(isempty(srcmem, Pt(x, y-1))) BPLONG(dst, DGreen); if(isempty(srcmem, Pt(x, y+1))) BPLONG(dst, DYellow); } } if(writememimage(1, dstmem) < 0) sysfatal("write image: %r"); exits(nil); }