/* GNU Ocrad - Optical Character Recognition program Copyright (C) 2003-2019 Antonio Diaz Diaz. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include "common.h" #include "rectangle.h" #include "segment.h" #include "ucs.h" #include "bitmap.h" #include "blob.h" #include "character.h" #include "profile.h" #include "feats.h" // Recognizes 3 blob characters. // %ÄËÏÖÜäëïöüÿ÷ // void Character::recognize13( const Charset & charset, const Rectangle & charbox ) { const Blob & b1 = blob( 0 ); const Blob & b2 = blob( 1 ); const Blob & b3 = blob( 2 ); // lower blob Character c( new Blob( b3 ) ); int code = 0; c.recognize1( charset, charbox ); if( c.guesses() ) { if( c.maybe('.') || ( c.height() < 2 * c.width() && c.maybe(',') && 2 * b3.area() >= b3.size() ) ) { if( b1.bottom() <= b2.top() && b2.bottom() <= b3.top() ) { if( b2.width() >= 2 * b2.height() ) code = UCS::DIV; } else if( b1.top() < b3.top() && b2.top() < b3.top() ) code = '%'; } else if( std::max( b1.width(), b2.width() ) < b3.width() && Ocrad::similar( b1.height(), b2.height(), 20, 2 ) && 2 * std::max( b1.height(), b2.height() ) < b3.height() ) code = UCS::compose( c.guess( 0 ).code, ':' ); else if( c.maybe('o') ) { if( ( b1.hcenter() < b2.hcenter() && b1.holes() == 1 && !b2.holes() ) || ( b2.hcenter() < b1.hcenter() && b2.holes() == 1 && !b1.holes() ) ) code = '%'; } } if( charset.only( Charset::ascii ) ) { if( code == UCS::DIV ) code = '%'; else code = UCS::base_letter( code ); } if( code ) add_guess( code, 0 ); }