X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/54b9e2790954b623c99823ab64782d4e39c128bf..0fc6d5202a304e9521159340a1fc0fa98b344b37:/lib/gdi/gpixmap.cpp diff --git a/lib/gdi/gpixmap.cpp b/lib/gdi/gpixmap.cpp index a551984f..96b599be 100644 --- a/lib/gdi/gpixmap.cpp +++ b/lib/gdi/gpixmap.cpp @@ -106,7 +106,7 @@ gSurface::gSurface(eSize size, int _bpp, int accel) clut.data = 0; if (!data) - data = malloc(y * stride); + data = new unsigned char [y * stride]; type = 1; } @@ -118,9 +118,9 @@ gSurface::~gSurface() if (data_phys) gAccel::getInstance()->accelFree(data_phys); else - free(data); + delete [] (unsigned char*)data; - delete[] clut.data; + delete [] clut.data; } } @@ -175,6 +175,38 @@ void gPixmap::fill(const gRegion ®ion, const gColor &color) } } +void gPixmap::fill(const gRegion ®ion, const gRGB &color) +{ + unsigned int i; + for (i=0; ibpp == 32) + { + __u32 col; + + col = color.argb(); + col^=0xFF000000; + + if (surface->data_phys && gAccel::getInstance()) + if (!gAccel::getInstance()->fill(surface, area, col)) + continue; + + for (int y=area.top(); ydata)+y*surface->stride+area.left()*surface->bypp); + int x=area.width(); + while (x--) + *dst++=col; + } + } else + eWarning("couldn't rgbfill %d bpp", surface->bpp); + } +} + void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag) { for (unsigned int i=0; idata_phys && src.surface->data_phys) && (gAccel::getInstance())) if (!gAccel::getInstance()->blit(surface, src.surface, area.topLeft(), srcarea, flag)) continue; + flag &= ~ blitAlphaBlend; if ((surface->bpp == 8) && (src.surface->bpp==8)) { @@ -308,7 +342,7 @@ void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag // use duff's device here! while (width--) { - if (!*src) + if (!(pal[*src]&0x80000000)) { src++; dst++; @@ -377,7 +411,7 @@ void gPixmap::line(const gRegion &clip, ePoint start, ePoint dst, gColor color) if (clip.rects.empty()) return; - __u32 col; + __u32 col = 0; if (surface->bpp == 8) { srf8 = (__u8*)surface->data; @@ -436,7 +470,7 @@ void gPixmap::line(const gRegion &clip, ePoint start, ePoint dst, gColor color) do { ++a; - if (a == clip.rects.size()) + if ((unsigned int)a == clip.rects.size()) a = 0; if (a == lasthit) { @@ -468,6 +502,10 @@ fail: gColor gPalette::findColor(const gRGB &rgb) const { + /* grayscale? */ + if (!data) + return (rgb.r + rgb.g + rgb.b) / 3; + int difference=1<<30, best_choice=0; for (int t=0; t