Переглянути джерело

* src/bitmap.c: dark background works again, except with floyd-steinberg.

tags/v0.99.beta14
Sam Hocevar sam 20 роки тому
джерело
коміт
d558d7d475
1 змінених файлів з 52 додано та 32 видалено
  1. +52
    -32
      src/bitmap.c

+ 52
- 32
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)
{


Завантаження…
Відмінити
Зберегти