*** empty log message ***
#ifndef _BITMAP_FONT_H #define _BITMAP_FONT_H #include <vector> #include <string> #include <algorithm> #include <cassert> typedef std::pair<int,int> pixel; class BitmapFont{ friend std::ostream& operator<<(std::ostream &os,const BitmapFont &bf); private: int width, height; std::vector<bool> bitmap; std::vector<pixel> pixels; public: int getWidth() const { return width; } int getHeight() const { return height; } int getSize() const { return width*height; } int getPixelSize() const { return pixels.size(); } pixel getPixelAt(int index) const { return pixels[index]; } BitmapFont(){} BitmapFont(const BitmapFont& b){ width=b.width; height=b.height; bitmap=b.bitmap; pixels=b.pixels; } BitmapFont(int w,int h) :width(w),height(h),bitmap(w*h,false){ } 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(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 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) const{ std::vector<pixel>::const_iterator it=find(pixels.begin(),pixels.end(),px); if(it!=pixels.end()){ return it-pixels.begin(); } return -1; } }; #endif /* _BITMAP_FONT_H */
ktanaka Powered by ViewCVS 1.0-dev |
ViewCVS and CVS Help |