Sfoglia il codice sorgente

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

tags/v0.99.beta14
Sam Hocevar sam 20 anni fa
parent
commit
4fad734207
1 ha cambiato i file con 28 aggiunte e 30 eliminazioni
  1. +28
    -30
      src/bitmap.c

+ 28
- 30
src/bitmap.c Vedi File

@@ -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 */


Caricamento…
Annulla
Salva