| #include "BitmapFont.h" |
#include "BitmapFont.h" |
| |
|
| |
int BitmapFont::getWidth() const { return width; } |
| |
int BitmapFont::getHeight() const { return height; } |
| |
int BitmapFont::getSize() const { return width*height; } |
| |
int BitmapFont::getPixelSize() const { return pixels.size(); } |
| |
pixel BitmapFont::getPixelAt(int index) const { return pixels[index]; } |
| |
BitmapFont::BitmapFont(){} |
| |
BitmapFont::BitmapFont(const BitmapFont& b){ |
| |
width=b.width; |
| |
height=b.height; |
| |
bitmap=b.bitmap; |
| |
pixels=b.pixels; |
| |
} |
| |
BitmapFont::BitmapFont(int w,int h) :width(w),height(h),bitmap(w*h,false){ |
| |
} |
| |
BitmapFont::BitmapFont(int w,int h,const std::vector<pixel> &pxls) |
| |
:width(w),height(h),bitmap(w*h,false),pixels(pxls){ |
| |
std::vector<pixel>::iterator it; |
| |
for(it=pixels.begin();it!=pixels.end();it++){ |
| |
int x=it->first, y=it->second; |
| |
assert(0<= x && x<width && 0<=y && y<height); |
| |
bitmap[y*width+x]=true; |
| |
} |
| |
} |
| |
// 暗黙のうちに幅が4ビットの倍数だと仮定している。 |
| |
BitmapFont::BitmapFont(int w,int h,const std::string& hex) :width(w),height(h),bitmap(){ |
| |
for(std::string::const_iterator it=hex.begin();it!=hex.end();it++){ |
| |
std::string s; |
| |
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(std::pair<int,int>(x,y)); |
| |
} |
| |
bool BitmapFont::get(int x, int y) const{ |
| |
if(x<0 || x>=width || y<0 || y>=height){ |
| |
return false; |
| |
} |
| |
return bitmap[y*width+x]; |
| |
} |
| |
int BitmapFont::getIndex(const pixel &px) const{ |
| |
std::vector<pixel>::const_iterator it=find(pixels.begin(),pixels.end(),px); |
| |
if(it!=pixels.end()){ |
| |
return it-pixels.begin(); |
| |
} |
| |
return -1; |
| |
} |
| ostream& operator<<(ostream &os,const BitmapFont &bf){ |
ostream& operator<<(ostream &os,const BitmapFont &bf){ |
| |
#if 0 |
| os << "width= " << bf.getWidth() <<",height=" << bf.getHeight() <<"\n"; |
os << "width= " << bf.getWidth() <<",height=" << bf.getHeight() <<"\n"; |
| |
#endif |
| for(int y=0;y<bf.getHeight();y++){ |
for(int y=0;y<bf.getHeight();y++){ |
| for(int x=0;x<bf.getWidth();x++){ |
for(int x=0;x<bf.getWidth();x++){ |
| if(bf.get(x,y)) cout << '@'; |
if(bf.get(x,y)) os << '@'; |
| else cout << '.'; |
else os << '.'; |
| } |
} |
| cout << "\n"; |
os << "\n"; |
| } |
} |
| return cout; |
#if 0 |
| |
vector<pixel>::iterator it; |
| |
for(it=bf.pixels.begin();it!=bf.pixels.end();it++) |
| |
os << '(' << (*it).first << ',' << (*it).second << ')'; |
| |
os << "\n"; |
| |
#endif |
| |
return os; |
| } |
} |