fix memleak
[enigma2.git] / lib / gdi / gpixmap.cpp
index 1d2a4e395e92f69ec6f158000f908c6be7c4fb80..96a3e9b0ac4d4af2529333814a7c00b96ebf71a0 100644 (file)
@@ -74,15 +74,8 @@ gSurfaceSystem::gSurfaceSystem(eSize size, int _bpp)
                bypp=(bpp+7)/8;
        }
        stride=x*bypp;
-       if (bpp==8)
-       {
-               clut.colors=256;
-               clut.data=new gRGB[clut.colors];
-       } else
-       {
-               clut.colors=0;
-               clut.data=0;
-       }
+       clut.colors=0;
+       clut.data=0;
        data=malloc(x*y*bypp);
 }
 
@@ -105,7 +98,7 @@ void gPixmap::unlock()
 
 void gPixmap::fill(const gRegion &region, const gColor &color)
 {
-       int i;
+       unsigned int i;
        for (i=0; i<region.rects.size(); ++i)
        {
                const eRect &area = region.rects[i];
@@ -137,23 +130,23 @@ void gPixmap::fill(const gRegion &region, const gColor &color)
 
 void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag)
 {
-       for (int i=0; i<clip.rects.size(); ++i)
+       for (unsigned int i=0; i<clip.rects.size(); ++i)
        {
-               eRect area=eRect(pos, src.getSize());
+               eRect area=eRect(pos, src.size());
                area&=clip.rects[i];
-               area&=eRect(ePoint(0, 0), getSize());
+               area&=eRect(ePoint(0, 0), size());
                if ((area.width()<0) || (area.height()<0))
                        continue;
 
                eRect srcarea=area;
                srcarea.moveBy(-pos.x(), -pos.y());
-
+               
                if ((surface->bpp == 8) && (src.surface->bpp==8))
                {
                        __u8 *srcptr=(__u8*)src.surface->data;
                        __u8 *dstptr=(__u8*)surface->data;
        
-                       srcptr+=srcarea.left()*surface->bypp+srcarea.top()*src.surface->stride;
+                       srcptr+=srcarea.left()*src.surface->bypp+srcarea.top()*src.surface->stride;
                        dstptr+=area.left()*surface->bypp+area.top()*surface->stride;
                        for (int y=0; y<area.height(); y++)
                        {
@@ -193,7 +186,7 @@ void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag
                                pal[i]^=0xFF000000;
                        }
        
-                       srcptr+=srcarea.left()*surface->bypp+srcarea.top()*src.surface->stride;
+                       srcptr+=srcarea.left()*src.surface->bypp+srcarea.top()*src.surface->stride;
                        dstptr+=area.left()*surface->bypp+area.top()*surface->stride;
                        for (int y=0; y<area.height(); y++)
                        {
@@ -231,8 +224,10 @@ void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag
 
 void gPixmap::mergePalette(const gPixmap &target)
 {
+       eDebug("merge palette! %p %p", surface, target.surface);
        if ((!surface->clut.colors) || (!target.surface->clut.colors))
                return;
+#if 0
        gColor *lookup=new gColor[surface->clut.colors];
 
        for (int i=0; i<surface->clut.colors; i++)
@@ -253,6 +248,7 @@ void gPixmap::mergePalette(const gPixmap &target)
        }
        
        delete [] lookup;
+#endif
 }
 
 static inline int sgn(int a)
@@ -267,11 +263,27 @@ static inline int sgn(int a)
 
 void gPixmap::line(const gRegion &clip, ePoint start, ePoint dst, gColor color)
 {
-       __u8 *srf = (__u8*)surface->data;
+       __u8 *srf8 = 0;
+       __u32 *srf32 = 0; 
        int stride = surface->stride;
        
        if (clip.rects.empty())
                return;
+               
+       __u32 col;
+       if (surface->bpp == 8)
+       {
+               srf8 = (__u8*)surface->data;
+       } else if (surface->bpp == 32)
+       {
+               srf32 = (__u32*)surface->data;
+               
+               if (surface->clut.data && color < surface->clut.colors)
+                       col=(surface->clut.data[color].a<<24)|(surface->clut.data[color].r<<16)|(surface->clut.data[color].g<<8)|(surface->clut.data[color].b);
+               else
+                       col=0x10101*color;
+               col^=0xFF000000;                        
+       }
        
        int xa = start.x(), ya = start.y(), xb = dst.x(), yb = dst.y();
        int dx, dy, x, y, s1, s2, e, temp, swap, i;
@@ -290,6 +302,7 @@ void gPixmap::line(const gRegion &clip, ePoint start, ePoint dst, gColor color)
        } else
                swap=0;
        e = 2*dy-dx;
+       
        int lasthit = 0;
        for(i=1; i<=dx; i++)
        {
@@ -326,7 +339,11 @@ void gPixmap::line(const gRegion &clip, ePoint start, ePoint dst, gColor color)
                        } while (!clip.rects[a].contains(x, y));
                        lasthit = a;
                }
-               srf[y * stride + x] = color;
+               
+               if (srf8)
+                       srf8[y * stride + x] = color;
+               if (srf32)
+                       srf32[y * stride/4 + x] = col;
 fail:
                while (e>=0)
                {
@@ -364,6 +381,8 @@ gColor gPalette::findColor(const gRGB &rgb) const
                ttd+=td;
                if (ttd>=difference)
                        continue;
+               if (!ttd)
+                       return t;
                difference=ttd;
                best_choice=t;
        }