#include #include "text-flags.h" #define DIV (TEXTFLAG_XF & ~(TEXTFLAG_XF-1)) #if TEXTFLAG_XF & (TEXTFLAG_XF + DIV) #error "TEXTFLAG_XF is not a contiguous set of bits" #endif #define NIL (TEXTFLAG_XF_NONE/DIV) #define FL_X (TEXTFLAG_XF_FLIP_X/DIV) #define FL_Y (TEXTFLAG_XF_FLIP_Y/DIV) #define R180 (TEXTFLAG_XF_ROT180/DIV) #define XY (TEXTFLAG_XF_FLIP_XY/DIV) #define CCW (TEXTFLAG_XF_ROT_CW/DIV) #define CW (TEXTFLAG_XF_ROT_CCW/DIV) #define XMY (TEXTFLAG_XF_FLIP_XMY/DIV) /* compose[1st][2nd] */ static unsigned int compose[8][8] = { { NIL, FL_X, FL_Y, R180, XY, CCW, CW, XMY }, { FL_X, NIL, R180, FL_Y, CCW, XY, XMY, CW }, { FL_Y, R180, NIL, FL_X, CW, XMY, XY, CCW }, { R180, FL_Y, FL_X, NIL, XMY, CW, CCW, XY }, { XY, CW, CCW, XMY, NIL, FL_Y, FL_X, R180 }, { CCW, XMY, XY, CW, FL_X, R180, NIL, FL_Y }, { CW, XY, XMY, CCW, FL_Y, NIL, R180, FL_X }, { XMY, CCW, CW, XY, R180, FL_X, FL_Y, NIL } }; static unsigned int invert[8] = { NIL, FL_X, FL_Y, R180, XY, CW, CCW, XMY }; unsigned int textflag_xf_compose(unsigned int a, unsigned int b) { return(compose[(a&TEXTFLAG_XF)/DIV][(b&TEXTFLAG_XF)/DIV]*DIV); } unsigned int textflag_xf_invert(unsigned int xf) { return(invert[(xf&TEXTFLAG_XF)/DIV]*DIV); } unsigned int textflag_xf_sx(unsigned int xf, unsigned int sx, unsigned int sy) { switch (xf & TEXTFLAG_XF) { case TEXTFLAG_XF_NONE: case TEXTFLAG_XF_FLIP_X: case TEXTFLAG_XF_FLIP_Y: case TEXTFLAG_XF_ROT180: return(sx); break; case TEXTFLAG_XF_FLIP_XY: case TEXTFLAG_XF_ROT_CW: case TEXTFLAG_XF_ROT_CCW: case TEXTFLAG_XF_FLIP_XMY: return(sy); break; } abort(); } unsigned int textflag_xf_sy(unsigned int xf, unsigned int sx, unsigned int sy) { switch (xf & TEXTFLAG_XF) { case TEXTFLAG_XF_NONE: case TEXTFLAG_XF_FLIP_X: case TEXTFLAG_XF_FLIP_Y: case TEXTFLAG_XF_ROT180: return(sy); break; case TEXTFLAG_XF_FLIP_XY: case TEXTFLAG_XF_ROT_CW: case TEXTFLAG_XF_ROT_CCW: case TEXTFLAG_XF_FLIP_XMY: return(sx); break; } abort(); } int textflag_xf_x(unsigned int xf, int ix, int iy, unsigned int sx, unsigned int sy) { switch (xf & TEXTFLAG_XF) { case TEXTFLAG_XF_NONE: case TEXTFLAG_XF_FLIP_Y: return(ix); break; case TEXTFLAG_XF_FLIP_X: case TEXTFLAG_XF_ROT180: return(((int)sx)-1-ix); break; case TEXTFLAG_XF_FLIP_XY: case TEXTFLAG_XF_ROT_CCW: return(iy); break; case TEXTFLAG_XF_ROT_CW: case TEXTFLAG_XF_FLIP_XMY: return(((int)sy)-1-iy); break; } abort(); } int textflag_xf_y(unsigned int xf, int ix, int iy, unsigned int sx, unsigned int sy) { switch (xf & TEXTFLAG_XF) { case TEXTFLAG_XF_NONE: case TEXTFLAG_XF_FLIP_X: return(iy); break; case TEXTFLAG_XF_FLIP_Y: case TEXTFLAG_XF_ROT180: return(((int)sy)-1-iy); break; case TEXTFLAG_XF_FLIP_XY: case TEXTFLAG_XF_ROT_CW: return(ix); break; case TEXTFLAG_XF_ROT_CCW: case TEXTFLAG_XF_FLIP_XMY: return(((int)sx)-1-ix); break; } abort(); }