00001 00002 00003 00004 #ifndef GOSU_ROTFLIP_HPP 00005 #define GOSU_ROTFLIP_HPP 00006 00007 namespace Gosu 00008 { 00009 enum RotFlipName 00010 { 00011 rfDefault, 00012 rfRotate90, 00013 rfRotate180, 00014 rfRotate270, 00015 00016 rfFlipX, 00017 rfRotate90FlipX, 00018 rfRotate180FlipX, 00019 rfRotate270FlipX, 00020 00021 rfFlipY = rfRotate180FlipX, 00022 rfRotate90FlipY = rfRotate270FlipX, 00023 rfRotate180FlipY = rfFlipX, 00024 rfRotate270FlipY = rfRotate90FlipX, 00025 00026 rfFlipXRotate90 = rfRotate270FlipX, 00027 rfFlipXRotate180 = rfRotate180FlipX, 00028 rfFlipXRotate270 = rfRotate90FlipX, 00029 00030 rfFlipYRotate90 = rfRotate90FlipX, 00031 rfFlipYRotate180 = rfFlipX, 00032 rfFlipYRotate270 = rfRotate270FlipX 00033 }; 00034 00035 class RotFlip 00036 { 00037 RotFlipName name_; 00038 00039 typedef RotFlipName TransTable[8]; 00040 static const TransTable flipXTable, flipYTable, rotate90Table, 00041 rotate180Table, rotate270Table; 00042 00043 typedef unsigned CornerTable[8][4]; 00044 static const CornerTable mapCornerTable, realCornerTable; 00045 00046 public: 00047 RotFlip(RotFlipName name = rfDefault) 00048 : name_(name) 00049 { 00050 } 00051 00052 RotFlipName name() const 00053 { 00054 return name_; 00055 } 00056 00057 void flipX() 00058 { 00059 name_ = flipXTable[name_]; 00060 } 00061 00062 void flipY() 00063 { 00064 name_ = flipYTable[name_]; 00065 } 00066 00067 void rotate90() 00068 { 00069 name_ = rotate90Table[name_]; 00070 } 00071 00072 void rotate180() 00073 { 00074 name_ = rotate180Table[name_]; 00075 } 00076 00077 void rotate270() 00078 { 00079 name_ = rotate270Table[name_]; 00080 } 00081 00082 bool flipped() const 00083 { 00084 return name_ >= rfFlipX; 00085 } 00086 00087 bool rotated() const 00088 { 00089 return name_ % 2 == 1; 00090 } 00091 00092 unsigned mapCorner(unsigned n) const 00093 { 00094 return mapCornerTable[name_][n]; 00095 } 00096 00097 unsigned realCorner(unsigned n) const 00098 { 00099 return realCornerTable[name_][n]; 00100 } 00101 }; 00102 00103 inline bool operator==(RotFlip a, RotFlip b) 00104 { 00105 return a.name() == b.name(); 00106 } 00107 00108 inline bool operator!=(RotFlip a, RotFlip b) 00109 { 00110 return a.name() != b.name(); 00111 } 00112 00113 void applyToPoint(RotFlip rotFlip, int& x, int& y, int max); 00114 } 00115 00116 #endif