"Unable to figure out contents of YPP client display.\n"
"Please check the following:\n"
" * YPP client is showing commodity listing screen\n"
- " * YPP client has antialiased text turned off (Ye / Options / General)\n"
" * YPP client window is on top (we try to raise it but your window\n"
" manager might have prevented that from succeeding)\n"
" * Your X display is 24bpp (NB some VNC servers use 16bpp by default)\n"
SET_ONCE(text_h, comminty - 1);
if (max_relevant_y_r)
SET_ONCE(*max_relevant_y_r, mainr.br.y + 10);
+
+ MUST( text_h <= OCR_MAX_H, MI(text_h) );
}
void check_correct_commodities(void) {
const RgbImage *ri= cim->rgb;
Rgb background= ri_rgb(ri, cell->br.x, cell->br.y);
- long bg_count=0, white_count=0, black_count=0;
+ long bg_count=0, light_count=0, dark_count=0;
Point p;
FOR_P_RECT(p,*cell) {
Rgb here= ri_rgb(ri, p.x, p.y);
if (here == background) bg_count++;
- else if (here == 0) black_count++;
- else if (here == 0xffffffU) white_count++;
+ else if (here < background) dark_count++;
+ else if (here > background) light_count++;
}
long total_count= RECT_W(*cell) * RECT_H(*cell);
- MUST( bg_count > 8*total_count / 10,
- MR(*cell);MIL(bg_count);MIL(white_count);MIL(black_count) );
+ MUST( bg_count > total_count / 2,
+ MR(*cell);MIL(total_count);MIL(bg_count);
+ MIL(light_count);MIL(dark_count) );
if (bg_count == total_count)
return;
- MUST( !!black_count != !!white_count,
- MR(*cell);MIL(bg_count);MIL(white_count);MIL(black_count) );
+ MUST( !!dark_count != !!light_count,
+ MR(*cell);MIL(total_count);MIL(bg_count);
+ MIL(light_count);MIL(dark_count) );
- debugf("TABLEENTRY col=%d %d,%d..%d,%d bg=%ld white=%ld black=%ld\n",
+ debugf("TABLEENTRY col=%d %d,%d..%d,%d bg=%ld light=%ld dark=%ld\n",
colno, cell->tl.x,cell->tl.y, cell->br.x,cell->br.y,
- bg_count, white_count, black_count);
+ bg_count, light_count, dark_count);
- Rgb foreground= white_count ? 0xffffffU : 0;
+ Rgb foreground;
+ double fg_extra;
+ if (light_count) {
+ foreground= 0xffffffU;
+ fg_extra= +1;
+ } else {
+ foreground= 0;
+ fg_extra= -1;
+ }
int monochrome= 1;
FOR_P_RECT(p,*cell) {
unsigned char bg_chan= background >> (i*8);
unsigned char fg_chan= foreground >> (i*8);
double alpha_chan=
- ((double)here_chan - (double)bg_chan) /
- ((double)fg_chan - (double)bg_chan);
+ ((double)here_chan - (double)bg_chan) /
+ ((fg_chan + fg_extra) - (double)bg_chan);
alpha[i]= alpha_chan;
- alpha_mean += alpha_chan / 3;
+ alpha_mean += alpha_chan * (1/3.0);
}
- double alpha_min = alpha_mean - 0.13;
- double alpha_max = alpha_mean + 0.13;
+ double thresh= 1.5/AAMAXVAL;
+ double alpha_min= alpha_mean - thresh;
+ double alpha_max= alpha_mean + thresh;
for (i=0; i<3; i++)
MUST( alpha_min <= alpha[i] && alpha[i] <= alpha_max,
MI(i);MRGB(here);MRGB(background);MRGB(foreground);
MF(alpha_min);MF(alpha[i]);MF(alpha_max) );
- MUST( 0 <= alpha_mean && alpha_mean <= 1,
+ MUST( 0 <= alpha_mean && alpha_mean < 0.999,
MRGB(here);MRGB(background);MRGB(foreground);
- MF(alpha_mean) );
- int here_int= 7*alpha_mean;
- if (!(here_int==0 || here_int==7)) monochrome=0;
+ MF(alpha_mean); MF(alpha[0]);MF(alpha[1]);MF(alpha[2]); );
+ int here_int= floor((AAMAXVAL+1)*alpha_mean);
+ assert(here_int <= AAMAXVAL);
+ if (!(here_int==0 || here_int==AAMAXVAL)) monochrome=0;
cim->d[p.y * cim->w + p.x]= '0' + here_int;
}
- debug_rect("cell07", colno, *cell);
+ debug_rect("cell0M", colno, *cell);
require_rectangle_r(*cell, "0123456789", __LINE__);
}
Pixcol cols[w+1];
int x,y;
for (x=0; x<w; x++) {
- Pixcol cx, rv;
- for (y=0, cx=0, rv=1; y<text_h; y++, rv<<=1) {
+ FILLZERO(cols[x]);
+ for (y=0; y<text_h; y++) {
Point here= { x+r.tl.x, y+r.tl.y };
int pixel= get_p(here);
- switch (pixel) {
- case ' ': break;
- case '0': break;
- case '7': cx |= rv; break;
- default:
- MUST(!"wrong pixel",
- MC(pixel);MP(here);MSB(ocr_celltype_name(ct));MR(r); );
- }
+ if (pixel==' ') pixel= '0';
+ MUST( pixel >= '0' && pixel <= '0'+AAMAXVAL,
+ MC(pixel);MP(here);MSB(ocr_celltype_name(ct));MR(r); );
+ pixcol_p_add(&cols[x], y, pixel-'0');
}
- cols[x]= cx;
}
- cols[w]= 0;
+ FILLZERO(cols[w]);
results= ocr(rd,ct,w,cols);
for (res=results; res->s; res++)