#include "xf.h" #define LOC_ARGS int ix __attribute__((__unused__)), \ int iy __attribute__((__unused__)), \ int sx __attribute__((__unused__)), \ int sy __attribute__((__unused__)) #define SIZE_ARGS int x __attribute__((__unused__)), \ int y __attribute__((__unused__)) static int xf_loc__x(LOC_ARGS) { return(ix); } static int xf_loc__y(LOC_ARGS) { return(iy); } static int xf_loc_nx(LOC_ARGS) { return(sx-1-ix); } static int xf_loc_ny(LOC_ARGS) { return(sy-1-iy); } static int xf_sx(SIZE_ARGS) { return(x); } static int xf_sy(SIZE_ARGS) { return(y); } #undef LOC_ARGS #undef SIZE_ARGS const XF xfs[8] = { [XF_NIL] = { XF_NIL, &xf_sx, &xf_sy, &xf_loc__x, &xf_loc__y }, [XF_R_CW] = { XF_R_CW, &xf_sy, &xf_sx, &xf_loc__y, &xf_loc_nx }, [XF_R_CCW] = { XF_R_CCW, &xf_sy, &xf_sx, &xf_loc_ny, &xf_loc__x }, [XF_R_180] = { XF_R_180, &xf_sx, &xf_sy, &xf_loc_nx, &xf_loc_ny }, [XF_MIRROR_Y] = { XF_MIRROR_Y, &xf_sx, &xf_sy, &xf_loc__x, &xf_loc_ny }, [XF_MIRROR_X] = { XF_MIRROR_X, &xf_sx, &xf_sy, &xf_loc_nx, &xf_loc__y }, [XF_MIRROR_XY] = { XF_MIRROR_XY, &xf_sy, &xf_sx, &xf_loc__y, &xf_loc__x }, [XF_MIRROR_XMY] = { XF_MIRROR_XMY, &xf_sy, &xf_sx, &xf_loc_ny, &xf_loc_nx } }; const int xfcompose[8][8] = { [XF_NIL] = { [XF_NIL] = XF_NIL, [XF_R_CW] = XF_R_CW, [XF_R_CCW] = XF_R_CCW, [XF_R_180] = XF_R_180, [XF_MIRROR_X] = XF_MIRROR_X, [XF_MIRROR_Y] = XF_MIRROR_Y, [XF_MIRROR_XY] = XF_MIRROR_XY, [XF_MIRROR_XMY] = XF_MIRROR_XMY }, [XF_R_CW] = { [XF_NIL] = XF_R_CW, [XF_R_CW] = XF_R_180, [XF_R_CCW] = XF_NIL, [XF_R_180] = XF_R_CCW, [XF_MIRROR_X] = XF_MIRROR_XY, [XF_MIRROR_Y] = XF_MIRROR_XMY, [XF_MIRROR_XY] = XF_MIRROR_Y, [XF_MIRROR_XMY] = XF_MIRROR_X }, [XF_R_CCW] = { [XF_NIL] = XF_R_CCW, [XF_R_CW] = XF_NIL, [XF_R_CCW] = XF_R_180, [XF_R_180] = XF_R_CW, [XF_MIRROR_X] = XF_MIRROR_XMY, [XF_MIRROR_Y] = XF_MIRROR_XY, [XF_MIRROR_XY] = XF_MIRROR_X, [XF_MIRROR_XMY] = XF_MIRROR_Y }, [XF_R_180] = { [XF_NIL] = XF_R_180, [XF_R_CW] = XF_R_CCW, [XF_R_CCW] = XF_R_CW, [XF_R_180] = XF_NIL, [XF_MIRROR_X] = XF_MIRROR_Y, [XF_MIRROR_Y] = XF_MIRROR_X, [XF_MIRROR_XY] = XF_MIRROR_XMY, [XF_MIRROR_XMY] = XF_MIRROR_XY }, [XF_MIRROR_X] = { [XF_NIL] = XF_MIRROR_X, [XF_R_CW] = XF_MIRROR_XMY, [XF_R_CCW] = XF_MIRROR_XY, [XF_R_180] = XF_MIRROR_Y, [XF_MIRROR_X] = XF_NIL, [XF_MIRROR_Y] = XF_R_180, [XF_MIRROR_XY] = XF_R_CCW, [XF_MIRROR_XMY] = XF_R_CW }, [XF_MIRROR_Y] = { [XF_NIL] = XF_MIRROR_Y, [XF_R_CW] = XF_MIRROR_XY, [XF_R_CCW] = XF_MIRROR_XMY, [XF_R_180] = XF_MIRROR_X, [XF_MIRROR_X] = XF_R_180, [XF_MIRROR_Y] = XF_NIL, [XF_MIRROR_XY] = XF_R_CW, [XF_MIRROR_XMY] = XF_R_CCW }, [XF_MIRROR_XY] = { [XF_NIL] = XF_MIRROR_XY, [XF_R_CW] = XF_MIRROR_X, [XF_R_CCW] = XF_MIRROR_Y, [XF_R_180] = XF_MIRROR_XMY, [XF_MIRROR_X] = XF_R_CW, [XF_MIRROR_Y] = XF_R_CCW, [XF_MIRROR_XY] = XF_NIL, [XF_MIRROR_XMY] = XF_R_180 }, [XF_MIRROR_XMY] = { [XF_NIL] = XF_MIRROR_XMY, [XF_R_CW] = XF_MIRROR_Y, [XF_R_CCW] = XF_MIRROR_X, [XF_R_180] = XF_MIRROR_XY, [XF_MIRROR_X] = XF_R_CCW, [XF_MIRROR_Y] = XF_R_CW, [XF_MIRROR_XY] = XF_R_180, [XF_MIRROR_XMY] = XF_NIL } };