| @@ -568,7 +568,6 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| for(y = y1 > 0 ? y1 : 0; y <= y2 && y <= (int)_caca_height; y++) | |||
| { | |||
| int remain_r = 0, remain_g = 0, remain_b = 0; | |||
| int remain_r_next = 0, remain_g_next = 0, remain_b_next = 0; | |||
| for(x = x1 > 0 ? x1 : 0, _init_dither(y); | |||
| x <= x2 && x <= (int)_caca_width; | |||
| @@ -578,6 +577,7 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| int ch = 0, distmin; | |||
| int r, g, b, a, fg_r = 0, fg_g = 0, fg_b = 0, bg_r, bg_g, bg_b; | |||
| int fromx, fromy, tox, toy, myx, myy, dots, dist; | |||
| int error[3]; | |||
| enum caca_color outfg = 0, outbg = 0; | |||
| char outch; | |||
| @@ -641,12 +641,6 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| r += remain_r; | |||
| g += remain_g; | |||
| b += remain_b; | |||
| r += remain_r_next; | |||
| g += remain_g_next; | |||
| b += remain_b_next; | |||
| remain_r_next = fs_r[x+1]; | |||
| remain_g_next = fs_g[x+1]; | |||
| remain_b_next = fs_b[x+1]; | |||
| } | |||
| else | |||
| { | |||
| @@ -710,14 +704,17 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| } | |||
| } | |||
| outch = density_chars[4 * ch]; | |||
| if(_caca_dithering == CACA_DITHERING_FSTEIN) | |||
| { | |||
| error[0] = r - (fg_r * ch + bg_r * ((2*DCHMAX-1) - ch)) / (2*DCHMAX-1); | |||
| error[1] = g - (fg_g * ch + bg_g * ((2*DCHMAX-1) - ch)) / (2*DCHMAX-1); | |||
| error[2] = b - (fg_b * ch + bg_b * ((2*DCHMAX-1) - ch)) / (2*DCHMAX-1); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| int lum = r; | |||
| if(g > lum) | |||
| lum = g; | |||
| if(b > lum) | |||
| lum = b; | |||
| int lum = r; if(g > lum) lum = g; if(b > lum) lum = b; | |||
| outfg = outbg; | |||
| outbg = CACA_COLOR_BLACK; | |||
| @@ -727,28 +724,29 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, | |||
| else if(ch > (int)(DCHMAX - 1)) | |||
| ch = DCHMAX - 1; | |||
| outch = density_chars[4 * ch]; | |||
| if(_caca_dithering == CACA_DITHERING_FSTEIN) | |||
| { | |||
| error[0] = r - bg_r * ch / (DCHMAX-1); | |||
| error[1] = g - bg_g * ch / (DCHMAX-1); | |||
| error[2] = b - bg_b * ch / (DCHMAX-1); | |||
| } | |||
| } | |||
| if(_caca_dithering == CACA_DITHERING_FSTEIN) | |||
| { | |||
| remain_r = r - (fg_r * ch + bg_r * ((2*DCHMAX-1) - ch)) / (2*DCHMAX-1); | |||
| remain_g = g - (fg_g * ch + bg_g * ((2*DCHMAX-1) - ch)) / (2*DCHMAX-1); | |||
| remain_b = b - (fg_b * ch + bg_b * ((2*DCHMAX-1) - ch)) / (2*DCHMAX-1); | |||
| remain_r_next = fs_r[x+1]; | |||
| remain_g_next = fs_g[x+1]; | |||
| remain_b_next = fs_b[x+1]; | |||
| fs_r[x-1] += 3 * remain_r / 16; | |||
| fs_g[x-1] += 3 * remain_g / 16; | |||
| fs_b[x-1] += 3 * remain_b / 16; | |||
| fs_r[x] = 5 * remain_r / 16; | |||
| fs_g[x] = 5 * remain_g / 16; | |||
| fs_b[x] = 5 * remain_b / 16; | |||
| fs_r[x+1] = 1 * remain_r / 16; | |||
| fs_g[x+1] = 1 * remain_g / 16; | |||
| fs_b[x+1] = 1 * remain_b / 16; | |||
| remain_r = 7 * remain_r / 16; | |||
| remain_g = 7 * remain_g / 16; | |||
| remain_b = 7 * remain_b / 16; | |||
| remain_r = fs_r[x+1] + 7 * error[0] / 16; | |||
| remain_g = fs_g[x+1] + 7 * error[1] / 16; | |||
| remain_b = fs_b[x+1] + 7 * error[2] / 16; | |||
| fs_r[x-1] += 3 * error[0] / 16; | |||
| fs_g[x-1] += 3 * error[1] / 16; | |||
| fs_b[x-1] += 3 * error[2] / 16; | |||
| fs_r[x] = 5 * error[0] / 16; | |||
| fs_g[x] = 5 * error[1] / 16; | |||
| fs_b[x] = 5 * error[2] / 16; | |||
| fs_r[x+1] = 1 * error[0] / 16; | |||
| fs_g[x+1] = 1 * error[1] / 16; | |||
| fs_b[x+1] = 1 * error[2] / 16; | |||
| } | |||
| /* Now output the character */ | |||