static CSTR_rast ed_end_word(CSTR_rast cs,uchar *str,uchar *word_len) { CSTR_rast c=cs; CSTR_rast_attr attr; int16_t i; RecVersions vers; CSTR_GetCollection(c,&vers); *str++ = vers.Alt[0].Code; i=1; do{ c=CSTR_GetNext(c); CSTR_GetCollection(c,&vers); *str++ = vers.Alt[0].Code; CSTR_GetAttr(c,&attr); i++; }while( c && !memchr(right_limit_word,vers.Alt[0].Code,sizeof(right_limit_word)) && !(attr.flg&CSTR_f_fict) && i<MAX_LEN_WORD-1); c=c ? c : CSTR_GetLastRaster(CSTR_GetRasterLine(cs)); if( i ) { i--; str--; } *str='\0'; *word_len = (uchar)i; return c; }
///////////////////////////////////////////////////////////////////////////// // CheckLineForFilling Bool CheckLineForFilling( CSTR_line* Comingline ) { CSTR_line line; CSTR_rast rast; RecVersions vers; CSTR_rast_attr rast_attr; line = *Comingline; rast = CSTR_GetFirstRaster( line ); // I фикт. растр rast = CSTR_GetNextRaster( rast , CSTR_f_all ); while( rast ) { CSTR_GetCollection( rast,&vers ); CSTR_GetAttr( rast,&rast_attr ); if((rast_attr.flg&CSTR_f_dust) || (rast_attr.flg&CSTR_f_fict ) ||//Дусты и ((rast_attr.flg&CSTR_f_space) && (!vers.Alt[0].Code || vers.Alt[0].Code == 0x1e || vers.Alt[0].Code == 0x1f))) //полупробелы выкидываем. goto next_raster; return TRUE; next_raster: rast = CSTR_GetNextRaster( rast , CSTR_f_all ); } return FALSE; }
Bool32 p2_msk_inc(CSTR_rast rst) { #ifdef _USE_MSK_ uchar prob=0, name, lim, code; RecRaster rc; RecVersions ver; int32_t i; if(!HndTabInc ) return 0; if(language!=PUMA_LANG_RUSSIAN && language!=PUMA_LANG_RUSENG ) return 0; CSTR_GetImage(rst,(uchar*)&rc,CSTR_TYPE_IMAGE_RS); if( !rc.lnPixHeight || !rc.lnPixWidth ) return 0; MSKSetAlphabet ( alphabet ); CSTR_GetCollection(rst,&ver); ver.lnAltCnt=2; ver.lnAltMax=REC_MAX_VERS; name = ver.Alt[0].Code; ver.Alt[0].Code=(uchar)to_upper((uchar)name); ver.Alt[0].Prob=255; ver.Alt[1].Code=(uchar)to_lower((uchar)name); ver.Alt[1].Prob=255; if( name=='0' ) { ver.Alt[1].Code=(uchar)'О'; ver.Alt[2].Code=(uchar)'Ѓ'; ver.Alt[2].Prob=255; ver.lnAltCnt=3; } if( name=='3' ) { ver.Alt[1].Code=(uchar)'З'; ver.Alt[2].Code=(uchar)'І'; ver.Alt[2].Prob=255; ver.lnAltCnt=3; } if( !MSKRecogCharExpPuma( HndTabInc, &rc, &ver,1 ) ) return 0; if( !ver.lnAltCnt ) return 0; for(prob=0, i=0;i<ver.lnAltCnt;i++) { if( prob<ver.Alt[i].Prob) { prob=ver.Alt[i].Prob ; code=ver.Alt[i].Code; } } lim = MIN_MSK_PROB; if( strchr(similar_letters,code) ) lim = MIN_MSK_PROB_SIM; return (prob>lim); #else return FALSE; #endif }
static CSTR_rast ed_next_word(CSTR_rast cs) { CSTR_rast c=cs; CSTR_rast_attr attr; RecVersions vers; CSTR_GetAttr(c,&attr); if( attr.flg==CSTR_f_fict && attr.col==0x7fff ) return (CSTR_rast)0; // last rast do{ c=CSTR_GetNext(c); CSTR_GetAttr(c,&attr); CSTR_GetCollection(c,&vers); }while( c && memchr(left_limit_word,vers.Alt[0].Code,sizeof(left_limit_word)) && !(attr.flg&CSTR_f_fict) ); return (attr.flg&CSTR_f_fict)?(CSTR_rast)0:c; }
///////////////////////////////////////////////////////////////////////////// // CFString::ExtractWordsFromString void CFString::ExtractWordsFromString( CSTR_line* Comingline , PageElementCount* Count) { CSTR_rast_attr rast_attr; CSTR_rast rast; RecVersions vers; CSTR_line line; CSTR_attr line_attr; CWord* CurrentWord; const char* SeparatorsWord=" "; const char* result=NULL; int16_t FlagWord; Bool FlagString,FlagCapDrop; line = *Comingline; FlagWord = 0; FlagString = FALSE; FlagCapDrop = FALSE; CSTR_GetLineAttr( line , &line_attr ); if(line_attr.Flags & CSTR_STR_CapDrop) //буквица - см. первая буква в сказках FlagCapDrop = TRUE; SetRect(&m_rectBaseLine, line_attr.bs1, line_attr.bs2, line_attr.bs3, line_attr.bs4); //don't used now SetRect(&m_rectString, line_attr.col - TemplateOffset.x, line_attr.row - TemplateOffset.y, line_attr.col - TemplateOffset.x + line_attr.wid, line_attr.row - TemplateOffset.y + line_attr.hei); #ifdef alDebug //obsolete option { RECT rect; SetRect(&rect,line_attr.col, line_attr.row, line_attr.col + line_attr.wid, line_attr.row + line_attr.hei); pInputArray->push_back(rect); } #endif rast = CSTR_GetFirstRaster( line ); // I фикт. растр rast = CSTR_GetNextRaster( rast , CSTR_f_all ); while( rast ) { CSTR_GetCollection( rast,&vers ); CSTR_GetAttr( rast,&rast_attr ); //#define NEG_HALF_SPACE 0x1e //#define POS_HALF_SPACE 0x1f //#define REGULAR_SPACE 0x20 if((rast_attr.flg&CSTR_f_dust) || (rast_attr.flg&CSTR_f_fict ) ||//Дусты и ((rast_attr.flg&CSTR_f_space) && (!vers.Alt[0].Code || vers.Alt[0].Code == 0x1e || vers.Alt[0].Code == 0x1f)))//полупробелы выкидываем. goto next_raster; FlagString = TRUE; result = strchr( SeparatorsWord, vers.Alt[0].Code ); if( FlagWord ){ // word openly if(result) // word is broken FlagWord =0; else{ // word lasts assert( CurrentWord ); CurrentWord->AddLetter2Word( &rast , Count ,&FlagCapDrop ); } } else{ // expect new word if(!result){ // beginning word ++m_wWordsCount; ++Count->Words; FlagWord = 1; m_arWords.push_back( new CWord() ); CurrentWord = m_arWords[m_wWordsCount-1]; assert( CurrentWord ); if(rast_attr.font_spec == CSTR_fs_courier) CurrentWord->m_wFontNumber = rast_attr.font & 0xFC; else CurrentWord->m_wFontNumber = rast_attr.font; CurrentWord->m_wFontPointSize = rast_attr.keg; CurrentWord->AddLetter2Word( &rast , Count ,&FlagCapDrop ); if(FlagCapDrop){ CurrentWord->m_wFontPointSize = 14; FlagCapDrop = FALSE; FlagWord = 0; } } } next_raster: rast = CSTR_GetNextRaster( rast , CSTR_f_all ); } if(FlagString == FALSE) Count->Strings--; }