| #include <vector> |
#include <vector> |
| #include <string> |
#include <string> |
| #include <algorithm> |
#include <algorithm> |
| |
#include <cassert> |
| |
|
| typedef pair<int,int> pixel; |
typedef std::pair<int,int> pixel; |
| |
|
| class BitmapFont{ |
class BitmapFont{ |
| friend ostream& operator<<(ostream &os,const BitmapFont &bf); |
friend std::ostream& operator<<(std::ostream &os,const BitmapFont &bf); |
| private: |
private: |
| int width, height; |
int width, height; |
| vector<bool> bitmap; |
std::vector<bool> bitmap; |
| vector<pixel> pixels; |
std::vector<pixel> pixels; |
| public: |
public: |
| int getWidth() const { return width; } |
int getWidth() const; |
| int getHeight() const { return height; } |
int getHeight() const; |
| BitmapFont(){} |
int getSize() const; |
| BitmapFont(const BitmapFont& b){ |
int getPixelSize() const; |
| width=b.width; |
pixel getPixelAt(int index) const; |
| height=b.height; |
BitmapFont(); |
| bitmap=b.bitmap; |
BitmapFont(const BitmapFont& b); |
| pixels=b.pixels; |
BitmapFont(int w,int h); |
| } |
BitmapFont(int w,int h,const std::vector<pixel> &pxls); |
| BitmapFont(int w,int h) :width(w),height(h),bitmap(w*h,false){ |
|
| } |
|
| // 暗黙のうちに幅が4ビットの倍数だと仮定している。 |
// 暗黙のうちに幅が4ビットの倍数だと仮定している。 |
| BitmapFont(int w,int h,const string& hex) :width(w),height(h),bitmap(){ |
BitmapFont(int w,int h,const std::string& hex); |
| for(string::const_iterator it=hex.begin();it!=hex.end();it++){ |
bool get(int x, int y) const; |
| string s; |
int getIndex(const pixel &px) const; |
| s+= *it; |
|
| long val=strtol(s.c_str(),0,16); |
|
| assert(val>=0 && val<16); |
|
| for(int i=0;i<4;i++){ |
|
| bool pixel=false; |
|
| if((val&(1<<(3-i)))!=0){ |
|
| pixel=true; |
|
| } |
|
| bitmap.push_back(pixel); |
|
| } |
|
| } |
|
| for(int y=0;y<height;y++) |
|
| for(int x=0;x<width;x++) |
|
| if(get(x,y)) |
|
| pixels.push_back(pair<int,int>(x,y)); |
|
| } |
|
| bool get(int x, int y) const{ |
|
| if(x<0 || x>=width || y<0 || y>=height){ |
|
| return false; |
|
| } |
|
| return bitmap[y*width+x]; |
|
| } |
|
| int getIndex(const pixel &px){ |
|
| vector<pixel>::iterator it=find(pixels.begin(),pixels.end(),px); |
|
| if(it!=pixels.end()){ |
|
| return it-pixels.begin(); |
|
| } |
|
| return -1; |
|
| } |
|
| }; |
}; |
| #endif /* _BITMAP_FONT_H */ |
#endif /* _BITMAP_FONT_H */ |