display spinner after 2 seconds, not 500ms.
[enigma2.git] / lib / gdi / gpixmap.cpp
index e44ee0fa4997a67330ba17f4448b01930b91c0a8..d0eff03f00f40d7f5a937f5e2a3bd9b6471346dc 100644 (file)
@@ -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 &region, const gColor &color)
        }
 }
 
+void gPixmap::fill(const gRegion &region, const gRGB &color)
+{
+       unsigned int i;
+       for (i=0; i<region.rects.size(); ++i)
+       {
+               const eRect &area = region.rects[i];
+               if ((area.height()<=0) || (area.width()<=0))
+                       continue;
+
+               if (surface->bpp == 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(); y<area.bottom(); y++)
+                       {
+                               __u32 *dst=(__u32*)(((__u8*)surface->data)+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; i<clip.rects.size(); ++i)
@@ -310,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==0x01)
+                                               if (!(pal[*src]&0x80000000))
                                                {
                                                        src++;
                                                        dst++;
@@ -329,7 +361,7 @@ void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag
                                dstptr+=surface->stride;
                        }
                } else
-                       eFatal("cannot blit %dbpp from %dbpp", surface->bpp, src.surface->bpp);
+                       eWarning("cannot blit %dbpp from %dbpp", surface->bpp, src.surface->bpp);
        }
 }
 
@@ -506,13 +538,17 @@ DEFINE_REF(gPixmap);
 
 gPixmap::~gPixmap()
 {
+       if (must_delete_surface)
+               delete surface;
 }
 
-gPixmap::gPixmap(gSurface *surface): surface(surface)
+gPixmap::gPixmap(gSurface *surface)
+       :surface(surface), must_delete_surface(false)
 {
 }
 
 gPixmap::gPixmap(eSize size, int bpp, int accel)
+       :must_delete_surface(true)
 {
        surface = new gSurface(size, bpp, accel);
 }