double size of renderbuffer
[enigma2.git] / lib / gdi / grc.cpp
index 35626a9357b44be96e86063ab6d0a9c3077717e7..736630a87b912fd85aa043fb36bc6e8748d93e02 100644 (file)
@@ -1,10 +1,4 @@
-// for debugging use:
-// #define SYNC_PAINT
 #include <unistd.h>
-#ifndef SYNC_PAINT
-#include <pthread.h>
-#endif
-
 #include <lib/gdi/grc.h>
 #include <lib/gdi/font.h>
 #include <lib/base/init.h>
@@ -69,6 +63,7 @@ void gRC::submit(const gOpcode &o)
                if ( tmp == rp )
                {
 #ifndef SYNC_PAINT
+                       pthread_cond_signal(&cond);  // wakeup gdi thread
                        pthread_mutex_unlock(&mutex);
 #else
                        thread();
@@ -121,7 +116,11 @@ void *gRC::thread()
                        else if (o.opcode==gOpcode::notify)
                                need_notify = 1;
                        else
+                       {
                                o.dc->exec(&o);
+                               // o.dc is a gDC* filled with grabref... so we must release it here
+                               o.dc->Release();
+                       }
                }
                else
                {
@@ -131,7 +130,8 @@ void *gRC::thread()
                                m_notify_pump.send(1);
                        }
 #ifndef SYNC_PAINT
-                       pthread_cond_wait(&cond, &mutex);
+                       while(rp == wp)
+                               pthread_cond_wait(&cond, &mutex);
                        pthread_mutex_unlock(&mutex);
 #endif
                }
@@ -242,7 +242,7 @@ void gPainter::renderText(const eRect &pos, const std::string &string, int flags
        o.dc = m_dc.grabRef();
        o.parm.renderText = new gOpcode::para::prenderText;
        o.parm.renderText->area = pos;
-       o.parm.renderText->text = string;
+       o.parm.renderText->text = string.empty()?0:strdup(string.c_str());
        o.parm.renderText->flags = flags;
        m_rc->submit(o);
 }
@@ -512,18 +512,24 @@ void gDC::exec(gOpcode *o)
        {
        case gOpcode::setBackgroundColor:
                m_background_color = o->parm.setColor->color;
+               m_background_color_rgb = getRGB(m_background_color);
                delete o->parm.setColor;
                break;
        case gOpcode::setForegroundColor:
                m_foreground_color = o->parm.setColor->color;
+               m_background_color_rgb = getRGB(m_foreground_color);
                delete o->parm.setColor;
                break;
        case gOpcode::setBackgroundColorRGB:
-               m_background_color = m_pixmap->surface->clut.findColor(o->parm.setColorRGB->color);
+               if (m_pixmap->needClut())
+                       m_background_color = m_pixmap->surface->clut.findColor(o->parm.setColorRGB->color);
+               m_background_color_rgb = o->parm.setColorRGB->color;
                delete o->parm.setColorRGB;
                break;
        case gOpcode::setForegroundColorRGB:
-               m_foreground_color = m_pixmap->surface->clut.findColor(o->parm.setColorRGB->color);
+               if (m_pixmap->needClut())
+                       m_foreground_color = m_pixmap->surface->clut.findColor(o->parm.setColorRGB->color);
+               m_foreground_color_rgb = o->parm.setColorRGB->color;
                delete o->parm.setColorRGB;
                break;
        case gOpcode::setFont:
@@ -538,7 +544,8 @@ void gDC::exec(gOpcode *o)
                assert(m_current_font);
                para->setFont(m_current_font);
                para->renderString(o->parm.renderText->text, (flags & gPainter::RT_WRAP) ? RS_WRAP : 0);
-               
+               if (o->parm.renderText->text)
+                       free(o->parm.renderText->text);
                if (flags & gPainter::RT_HALIGN_RIGHT)
                        para->realign(eTextPara::dirRight);
                else if (flags & gPainter::RT_HALIGN_CENTER)
@@ -555,13 +562,14 @@ void gDC::exec(gOpcode *o)
                        int correction = vcentered_top - bbox.top();
                        offset += ePoint(0, correction);
                }
-               para->blit(*this, offset, getRGB(m_background_color), getRGB(m_foreground_color));
+               
+               para->blit(*this, offset, m_background_color_rgb, m_foreground_color_rgb);
                delete o->parm.renderText;
                break;
        }
        case gOpcode::renderPara:
        {
-               o->parm.renderPara->textpara->blit(*this, o->parm.renderPara->offset + m_current_offset, getRGB(m_background_color), getRGB(m_foreground_color));
+               o->parm.renderPara->textpara->blit(*this, o->parm.renderPara->offset + m_current_offset, m_background_color_rgb, m_foreground_color_rgb);
                o->parm.renderPara->textpara->Release();
                delete o->parm.renderPara;
                break;
@@ -571,7 +579,10 @@ void gDC::exec(gOpcode *o)
                eRect area = o->parm.fill->area;
                area.moveBy(m_current_offset);
                gRegion clip = m_current_clip & area;
-               m_pixmap->fill(clip, m_foreground_color);
+               if (m_pixmap->needClut())
+                       m_pixmap->fill(clip, m_foreground_color);
+               else
+                       m_pixmap->fill(clip, m_foreground_color_rgb);
                delete o->parm.fill;
                break;
        }
@@ -579,12 +590,18 @@ void gDC::exec(gOpcode *o)
        {
                o->parm.fillRegion->region.moveBy(m_current_offset);
                gRegion clip = m_current_clip & o->parm.fillRegion->region;
-               m_pixmap->fill(clip, m_foreground_color);
+               if (m_pixmap->needClut())
+                       m_pixmap->fill(clip, m_foreground_color);
+               else
+                       m_pixmap->fill(clip, m_foreground_color_rgb);
                delete o->parm.fillRegion;
                break;
        }
        case gOpcode::clear:
-               m_pixmap->fill(m_current_clip, m_background_color);
+               if (m_pixmap->needClut())
+                       m_pixmap->fill(m_current_clip, m_background_color);
+               else
+                       m_pixmap->fill(m_current_clip, m_background_color_rgb);
                delete o->parm.fill;
                break;
        case gOpcode::blit: