patch by Pieter Grimmerink: use ext3 largefile option only for disks > 4G
[enigma2.git] / lib / gdi / fb.cpp
index 5d8959011a3343d4d4258ceec6f5c83fb96812e0..8e8221c395e28b5dfe020dc0aedff7cd8c6a9602 100644 (file)
 #define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
 #endif
 
 #define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
 #endif
 
+#ifndef FBIO_BLIT
+#define FBIO_SET_MANUAL_BLIT _IOW('F', 0x21, __u8)
+#define FBIO_BLIT 0x22
+#endif
 
 fbClass *fbClass::instance;
 
 
 fbClass *fbClass::instance;
 
@@ -23,6 +27,7 @@ fbClass *fbClass::getInstance()
 
 fbClass::fbClass(const char *fb)
 {
 
 fbClass::fbClass(const char *fb)
 {
+       m_manual_blit=-1;
        instance=this;
        locked=0;
        available=0;
        instance=this;
        locked=0;
        available=0;
@@ -39,6 +44,8 @@ fbClass::fbClass(const char *fb)
                perror(fb);
                goto nolfb;
        }
                perror(fb);
                goto nolfb;
        }
+
+
        if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo)<0)
        {
                perror("FBIOGET_VSCREENINFO");
        if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo)<0)
        {
                perror("FBIOGET_VSCREENINFO");
@@ -64,6 +71,8 @@ fbClass::fbClass(const char *fb)
        }
 
        showConsole(0);
        }
 
        showConsole(0);
+
+       enableManualBlit();
        return;
 nolfb:
        lfb=0;
        return;
 nolfb:
        lfb=0;
@@ -146,6 +155,14 @@ int fbClass::waitVSync()
        return ioctl(fd, FBIO_WAITFORVSYNC, &c);
 }
 
        return ioctl(fd, FBIO_WAITFORVSYNC, &c);
 }
 
+void fbClass::blit()
+{
+       if (m_manual_blit == 1) {
+               if (ioctl(fd, FBIO_BLIT) < 0)
+                       perror("FBIO_BLIT");
+       }
+}
+
 fbClass::~fbClass()
 {
        if (available)
 fbClass::~fbClass()
 {
        if (available)
@@ -153,6 +170,7 @@ fbClass::~fbClass()
        if (lfb)
                munmap(lfb, available);
        showConsole(1);
        if (lfb)
                munmap(lfb, available);
        showConsole(1);
+       disableManualBlit();
 }
 
 int fbClass::PutCMAP()
 }
 
 int fbClass::PutCMAP()
@@ -164,7 +182,13 @@ int fbClass::lock()
 {
        if (locked)
                return -1;
 {
        if (locked)
                return -1;
-       locked=1;
+       if (m_manual_blit == 1)
+       {
+               locked = 2;
+               disableManualBlit();
+       }
+       else
+               locked = 1;
        return fd;
 }
 
        return fd;
 }
 
@@ -172,7 +196,28 @@ void fbClass::unlock()
 {
        if (!locked)
                return;
 {
        if (!locked)
                return;
+       if (locked == 2)  // re-enable manualBlit
+               enableManualBlit();
        locked=0;
        SetMode(xRes, yRes, bpp);
        PutCMAP();
 }
        locked=0;
        SetMode(xRes, yRes, bpp);
        PutCMAP();
 }
+
+void fbClass::enableManualBlit()
+{
+       unsigned char tmp = 1;
+       if (ioctl(fd,FBIO_SET_MANUAL_BLIT, &tmp)<0)
+               perror("FBIO_SET_MANUAL_BLIT");
+       else
+               m_manual_blit = 1;
+}
+
+void fbClass::disableManualBlit()
+{
+       unsigned char tmp = 0;
+       if (ioctl(fd,FBIO_SET_MANUAL_BLIT, &tmp)<0) 
+               perror("FBIO_SET_MANUAL_BLIT");
+       else
+               m_manual_blit = 0;
+}
+