[wadalabfont-kit] / jis2prim / Matchers.h  

View of /jis2prim/Matchers.h

Parent Directory | Revision Log
Revision: 1.4 - (download) (as text) (annotate)
Tue Aug 6 06:30:43 2002 UTC (22 years, 3 months ago) by ktanaka
Branch: MAIN
Changes since 1.3: +73 -24 lines
*** empty log message ***
#ifndef _MATCHERS_H
#define _MATCHERS_H

#include <vector>
#include <set>
/* Matchters */
#include "PatMatch.h"
#include "BitmapFont.h"

class MatchResult {
  friend ostream& operator<<(ostream &os,const MatchResult &mr);
 protected:
  int x,y;
  PatMatch pm;
  int penalty;
 public:
  MatchResult(int xx, int yy,const PatMatch& p,int penalty) :x(xx),y(yy),pm(p),penalty(penalty){}
  std::vector<pixel> getPixels() const {
    return pm.getPixels(x,y);
  }
};

class Matchers {
  friend ostream& operator<<(ostream &os,const Matchers &mt);
 protected:
  std::vector<PatMatch> pm;
 public:
  Matchers(){
    pm.push_back(PatMatch(3,3,
			  "..."
			  ".@@"
			  "...",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,Start,1,1,0,0))
			  .add(SimpleAssumption(HidariMask,End,1,1,180,0))));
    pm.push_back(PatMatch(3,3,
			  "..."
			  "@@@"
			  "...",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,Mid,1,1,0,0))
			  .add(SimpleAssumption(HidariMask,Mid,1,1,180,1))));
    pm.push_back(PatMatch(4,3,
			  "...?"
			  "@@@@"
			  ".@@.",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,Mid,1.5,1,0,0))
			  .add(SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),JointStart,1.5,1,270,2))));
    pm.push_back(PatMatch(5,3,
			  ".@@.."
			  "@@@@@"
			  ".....",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,Mid,1.5,1,0,0))
			  .add(SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),JointEnd,1.5,1,270,2))));
    pm.push_back(PatMatch(5,4,
			  "....?"
			  ".@@.."
			  "@@@@."
			  "?...?",
			  SimpleAssumption(YokoMask,End,3,2,0,2)));
    pm.push_back(PatMatch(4,2,
			  ".@@."
			  ".@@.",
			  SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),JointStart,1.5,1,270,2)));
    pm.push_back(PatMatch(5,2,
			  "..@@."
			  ".@@..",
			  SimpleAssumption((PtypeMask)(TatehidariMask|HidariMask),JointStart,2,0.5,225,1.7)));
    pm.push_back(PatMatch(4,2,
			  "?*@*"
			  "*@*?",
			  SimpleAssumption((PtypeMask)(TatehidariMask|HidariMask),JointStart,1.5,0.5,225,1)));
    pm.push_back(PatMatch(4,3,
			  "?*@*"
			  "*@@*"
			  "*@*?",
			  SimpleAssumption((PtypeMask)(TatehidariMask|HidariMask),JointStart,1.5,0.5,225,1)));
    pm.push_back(PatMatch(4,3,
			  ".@@."
			  "@@@@"
			  ".@@.",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,Mid,1.5,1,0,0))
			  .add(SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),Mid,1.5,1,270,2))));
    pm.push_back(PatMatch(5,3,
			  "..@@."
			  "@@@@@"
			  ".@@..",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,Mid,2,1,0,0))
			  .add(SimpleAssumption((PtypeMask)(TatehidariMask|HidariMask),Mid,2,1,250,2))));
    pm.push_back(PatMatch(4,4,
			  "?.??"
			  ".@.."
			  ".@@@"
			  "?@?.",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,JointStart,1.5,2,0,0))
			  .add(SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),JointStart,1.5,2,270,2))));
    pm.push_back(PatMatch(5,3,
			  "?...?"
			  ".@@@."
			  ".@@.?",
			  SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),Start,1.5,0.5,270,2)));
    pm.push_back(PatMatch(5,4,
			  "*@@*?"
			  "?.@@."
			  "?.@@."
			  "??..?",
			  SimpleAssumption(TenMask,End,2.5,2.5,300,2)));
    pm.push_back(PatMatch(4,3,
			  "*.??"
			  "*@*?"
			  "?*@*",
			  SimpleAssumption(TenMask,Start,1,1,315,1)));
    pm.push_back(PatMatch(4,4,
			  ".@@."
			  ".@@@"
			  ".@@."
			  "....",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,JointStart,1.5,2,0,0))
			  .add(SimpleAssumption(TateMask,JointEnd,1.5,1,270,2))));
    pm.push_back(PatMatch(4,5,
			  ".@@."
			  ".@@@"
			  ".@@."
			  ".@@."
			  "....",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,JointStart,1.5,2,0,0))
			  .add(SimpleAssumption(TateMask,JointEnd,1.5,1,270,2))));
    pm.push_back(PatMatch(4,4,
			  ".@@."
			  "@@@."
			  ".@@."
			  "....",
			  Assumption()
			  .add(SimpleAssumption(YokoMask,JointEnd,1.5,2,0,0))
			  .add(SimpleAssumption(TateMask,JointEnd,1.5,1,270,2))));
  }
  std::vector<MatchResult> findMatch(const BitmapFont& bf) const{
    std::vector<MatchResult> mr;
    std::vector<PatMatch>::const_iterator it;
    for(it=pm.begin();it!=pm.end();it++)
      for(int y= -1; y<bf.getHeight(); y++)
	for(int x= -1;x<bf.getWidth();x++){
	  int penalty=it->matchPenalty(bf,x,y);
	  if(penalty>=0)
	    mr.push_back(MatchResult(x,y,*it,penalty));
	}
    return mr;
  }
  std::vector<pixel> notCovered(const BitmapFont& bf) const{
    std::vector<MatchResult> mr=findMatch(bf);
    std::vector<std::set<int> > pixel2match(bf.getSize());
    std::vector<std::set<int> > match2pixel(mr.size());
    std::vector<MatchResult>::iterator it;
    for(it=mr.begin();it!=mr.end();it++){
      int n= it-mr.begin();
      std::vector<pixel> ps=(*it).getPixels();
      std::vector<pixel>::iterator ips;
      for(ips=ps.begin();ips!=ps.end();ips++){
	int m=bf.getIndex(*ips);
	std::cout << '(' << ips->first << ',' << ips->second << ")\n";
	assert(m != -1);
	match2pixel[n].insert(m);
	pixel2match[m].insert(n);
      }
    }
    std::vector<pixel> ret;
    for(int i=0;i<bf.getPixelSize();i++){
      if(pixel2match[i].empty()) {
	ret.push_back(bf.getPixelAt(i));
      }
    }
    return ret;
  }
};
ostream& operator<<(ostream &os,const Matchers &mt){
  os << "Matchers(";
  std::vector<PatMatch>::const_iterator it;
  for(it=mt.pm.begin();it!=mt.pm.end();it++){
    os << *it << ','; 
  }
  os << ')';
  return os;
}
ostream& operator<<(ostream &os,const MatchResult &mr){
  os << "MatchResult(" << mr.x << "," << mr.y << "," << mr.pm 
     << "," << mr.penalty << ")";
  return os;
}
#endif /* _MATCHERS_H */

ktanaka

Powered by ViewCVS 1.0-dev

ViewCVS and CVS Help