From 34db640250ef96d59059f28eacc65a7c7adba006 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 5 Jul 2009 18:57:25 +0100 Subject: [PATCH] split out find_aa_density --- pctb/structure.c | 60 ++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/pctb/structure.c b/pctb/structure.c index f0de5fa..1045d19 100644 --- a/pctb/structure.c +++ b/pctb/structure.c @@ -464,6 +464,39 @@ void read_screenshots(void) { progress_log("read %d screenshots.",npages); } +static double find_aa_density(const RgbImage *ri, Point p, long background, + long foreground, int fg_extra) { + Rgb here= ri_rgb(ri, p.x, p.y); + + double alpha[3], alpha_mean=0; + int i; + for (i=0; i<3; i++) { + unsigned char here_chan= here >> (i*8); + unsigned char bg_chan= background >> (i*8); + unsigned char fg_chan= foreground >> (i*8); + double alpha_chan= + ((double)here_chan - (double)bg_chan) / + ((fg_chan + fg_extra) - (double)bg_chan); + alpha[i]= alpha_chan; + alpha_mean += alpha_chan * (1/3.0); + } + + 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, + MRGB(here);MRGB(background);MRGB(foreground);MI(fg_extra); + MF(alpha_min); MI(i);MF(alpha[i]);MF(alpha_max) ); + + MUST( 0 <= alpha_mean && + (fg_extra ? alpha_mean < 0.999 : alpha_mean >= 1.0), + MRGB(here);MRGB(background);MRGB(foreground);MI(fg_extra); + MF(alpha_mean); MF(alpha[0]);MF(alpha[1]);MF(alpha[2]); ); + + return alpha_mean; +} + static void find_commodity(int offset, Rect *rr) { /* rr->tl.x==-1 if offset out of range */ rr->tl.y= commbasey - offset*comminty; @@ -524,32 +557,9 @@ static void find_table_entry(Rect commod, int colno, Rect *cell) { int monochrome= 1; FOR_P_RECT(p,*cell) { - Rgb here= ri_rgb(ri, p.x, p.y); - double alpha[3], alpha_mean=0; - int i; - for (i=0; i<3; i++) { - unsigned char here_chan= here >> (i*8); - unsigned char bg_chan= background >> (i*8); - unsigned char fg_chan= foreground >> (i*8); - double alpha_chan= - ((double)here_chan - (double)bg_chan) / - ((fg_chan + fg_extra) - (double)bg_chan); - alpha[i]= alpha_chan; - alpha_mean += alpha_chan * (1/3.0); - } + double alpha= find_aa_density(ri,p,background,foreground,fg_extra); - 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 < 0.999, - MRGB(here);MRGB(background);MRGB(foreground); - MF(alpha_mean); MF(alpha[0]);MF(alpha[1]);MF(alpha[2]); ); - int here_int= floor((AAMAXVAL+1)*alpha_mean); + int here_int= floor((AAMAXVAL+1)*alpha); assert(here_int <= AAMAXVAL); if (!(here_int==0 || here_int==AAMAXVAL)) monochrome=0; cim->d[p.y * cim->w + p.x]= '0' + here_int; -- 2.30.2