diff --git a/src/bitmap.c b/src/bitmap.c index 8c7ffdf..d27bfe1 100644 --- a/src/bitmap.c +++ b/src/bitmap.c @@ -92,8 +92,8 @@ static int rgb_palette[] = 0x7ff, 0x0, 0x0, 0x7ff, 0x0, 0x7ff, 0x7ff, 0x7ff, 0x0, - 0x7ff, 0x7ff, 0x7ff, - 0x3ff, 0x3ff, 0x3ff, + 0xaaa, 0xaaa, 0xaaa, + 0x555, 0x555, 0x555, 0x000, 0x000, 0xfff, 0x000, 0xfff, 0x000, 0x000, 0xfff, 0xfff, @@ -576,7 +576,7 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, { unsigned int i; int ch = 0, distmin; - int r, g, b, a, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b; + 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; enum caca_color outfg = 0, outbg = 0; @@ -672,42 +672,62 @@ void caca_draw_bitmap(int x1, int y1, int x2, int y2, bg_g = rgb_palette[outbg * 3 + 1]; bg_b = rgb_palette[outbg * 3 + 2]; - distmin = INT_MAX; - for(i = 0; i < 16; i++) + if(_caca_background == CACA_BACKGROUND_SOLID) { - if(i == outbg) - continue; - dist = sq(r - rgb_palette[i * 3]) - + sq(g - rgb_palette[i * 3 + 1]) - + sq(b - rgb_palette[i * 3 + 2]); - dist *= rgb_weight[i]; - if(dist < distmin) + distmin = INT_MAX; + for(i = 0; i < 16; i++) { - outfg = i; - distmin = dist; + if(i == outbg) + continue; + dist = sq(r - rgb_palette[i * 3]) + + sq(g - rgb_palette[i * 3 + 1]) + + sq(b - rgb_palette[i * 3 + 2]); + dist *= rgb_weight[i]; + if(dist < distmin) + { + outfg = i; + distmin = dist; + } } - } - fg_r = rgb_palette[outfg * 3]; - fg_g = rgb_palette[outfg * 3 + 1]; - fg_b = rgb_palette[outfg * 3 + 2]; - - distmin = INT_MAX; - for(i = 0; i < DCHMAX - 1; i++) - { - int newr = i * fg_r + ((2*DCHMAX-1) - i) * bg_r; - int newg = i * fg_g + ((2*DCHMAX-1) - i) * bg_g; - int newb = i * fg_b + ((2*DCHMAX-1) - i) * bg_b; - dist = abs(r * (2*DCHMAX-1) - newr) - + abs(g * (2*DCHMAX-1) - newg) - + abs(b * (2*DCHMAX-1) - newb); + fg_r = rgb_palette[outfg * 3]; + fg_g = rgb_palette[outfg * 3 + 1]; + fg_b = rgb_palette[outfg * 3 + 2]; - if(dist < distmin) + distmin = INT_MAX; + for(i = 0; i < DCHMAX - 1; i++) { - ch = i; - distmin = dist; + int newr = i * fg_r + ((2*DCHMAX-1) - i) * bg_r; + int newg = i * fg_g + ((2*DCHMAX-1) - i) * bg_g; + int newb = i * fg_b + ((2*DCHMAX-1) - i) * bg_b; + dist = abs(r * (2*DCHMAX-1) - newr) + + abs(g * (2*DCHMAX-1) - newg) + + abs(b * (2*DCHMAX-1) - newb); + + if(dist < distmin) + { + ch = i; + distmin = dist; + } } + outch = density_chars[4 * ch]; + } + else + { + int lum = r; + if(g > lum) + lum = g; + if(b > lum) + lum = b; + outfg = outbg; + outbg = CACA_COLOR_BLACK; + + ch = lum * DCHMAX / 0x1000; + if(ch < 0) + ch = 0; + else if(ch > (int)(DCHMAX - 1)) + ch = DCHMAX - 1; + outch = density_chars[4 * ch]; } - outch = density_chars[4 * ch]; if(_caca_dithering == CACA_DITHERING_FSTEIN) {