Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vdr] Re: non-transparent osd skin



On Mon, 2004-10-18 at 13:43 +0200, Klaus Schmidinger wrote: 
> Torgeir Veimo wrote:
> > 
> > I think it could be implemented as a mod for vdr's osd itself so 
> > that it does the dithering as a step after rendering just
> > before being displayed. 
> 
> What _exactly_ is it that you have to do special here?
> The OSD is basically just a bitmap where each byte corresponds
> to a color from a palette. I'm afraid I don't understand what
> that "non-transparent" stuff is about. Can you please elaborate?

The idea is to make a pass over the complete osd bitmap which replaces
every pixel which has non-zero transparency with either the colour (but
with zero transparency), or completely transparent, depending on the
coordinate of the pixel. 

void dither(cOsd *osd, int x1, int y1, int x2, int y2) {
  if (x2 < x1) { int tmp = x1; x1 = x2; x2 = tmp; }
  if (y2 < y1) { int tmp = y1; y1 = y2; y2 = tmp; }
  for (int y = y1; y <= y2; y++)
    for (int x = x1; x <= x2; x++) 
      if (/* colour at x,y is transparent*/) {
        if ((x % 2 == 1 && y % 2 == 1) || x % 2 == 0 && y % 2 == 0)
          osd->DrawPixel(x, y, /* colour with opacity=255, or black */);
        else
          osd->DrawPixel(x, y, x, y, clrTransparent);
      }
}



-- 
Torgeir Veimo <torgeir@pobox.com>





Home | Main Index | Thread Index