- fixed blit in gRC
[enigma2.git] / lib / gdi / grc.cpp
index 46181d3256daf9a393072ff6a2151ff75151dbb5..3b5476a2ba85df4b51e7621f2a70d2708fc4ce2c 100644 (file)
@@ -1,5 +1,5 @@
 // for debugging use:
- #define SYNC_PAINT
+// #define SYNC_PAINT
 #include <unistd.h>
 #ifndef SYNC_PAINT
 #include <pthread.h>
@@ -45,9 +45,11 @@ gRC::~gRC()
        gOpcode o;
        o.opcode=gOpcode::shutdown;
        submit(o);
+#ifndef SYNC_PAINT
        eDebug("waiting for gRC thread shutdown");
        pthread_join(the_thread, 0);
        eDebug("gRC thread has finished");
+#endif
 }
 
 void *gRC::thread()
@@ -162,6 +164,17 @@ void gPainter::fill(const eRect &area)
        m_rc->submit(o);
 }
 
+void gPainter::fill(const gRegion &region)
+{
+       gOpcode o;
+       o.opcode=gOpcode::fillRegion;
+
+       o.dc = m_dc.grabRef();
+       o.parm.fillRegion = new gOpcode::para::pfillRegion;
+       o.parm.fillRegion->region = region;
+       m_rc->submit(o);
+}
+
 void gPainter::clear()
 {
        gOpcode o;
@@ -175,7 +188,7 @@ void gPainter::clear()
 void gPainter::blit(gPixmap *pixmap, ePoint pos, const eRect &clip, int flags)
 {
        gOpcode o;
-
+       
        o.opcode=gOpcode::blit;
        o.dc = m_dc.grabRef();
        pixmap->AddRef();
@@ -254,6 +267,7 @@ void gPainter::resetOffset()
        o.opcode=gOpcode::setOffset;
        o.dc = m_dc.grabRef();
        o.parm.setOffset = new gOpcode::para::psetOffset;
+       o.parm.setOffset->rel = 0;
        o.parm.setOffset->value = ePoint(0, 0);
        m_rc->submit(o);
 }
@@ -288,6 +302,10 @@ void gPainter::clippop()
 
 void gPainter::flush()
 {
+       gOpcode o;
+       o.opcode = gOpcode::flush;
+       o.dc = m_dc.grabRef();
+       m_rc->submit(o);
 }
 
 void gPainter::end()
@@ -326,15 +344,32 @@ void gDC::exec(gOpcode *o)
        case gOpcode::renderText:
        {
                ePtr<eTextPara> para = new eTextPara(o->parm.renderText->area);
+               int flags = o->parm.renderText->flags;
+               assert(m_current_font);
                para->setFont(m_current_font);
-               para->renderString(o->parm.renderText->text, o->parm.renderText->flags);
-               para->blit(*this, ePoint(0, 0), getRGB(m_foreground_color), getRGB(m_background_color));
+               para->renderString(o->parm.renderText->text, (flags & gPainter::RT_WRAP) ? RS_WRAP : 0);
+               
+               if (flags & gPainter::RT_HALIGN_RIGHT)
+                       para->realign(eTextPara::dirRight);
+               else if (flags & gPainter::RT_HALIGN_CENTER)
+                       para->realign(eTextPara::dirCenter);
+               else if (flags & gPainter::RT_HALIGN_BLOCK)
+                       para->realign(eTextPara::dirBlock);
+               
+               ePoint offset = m_current_offset;
+               
+               if (o->parm.renderText->flags & gPainter::RT_VALIGN_CENTER)
+               {
+                       eRect bbox = para->getBoundBox();
+                       offset += ePoint(0, (o->parm.renderText->area.height() - bbox.height()) / 2);
+               }
+               para->blit(*this, offset, getRGB(m_background_color), getRGB(m_foreground_color));
                delete o->parm.renderText;
                break;
        }
        case gOpcode::renderPara:
        {
-               o->parm.renderPara->textpara->blit(*this, o->parm.renderPara->offset, getRGB(m_foreground_color), getRGB(m_background_color));
+               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->Release();
                delete o->parm.renderPara;
                break;
@@ -348,6 +383,14 @@ void gDC::exec(gOpcode *o)
                delete o->parm.fill;
                break;
        }
+       case gOpcode::fillRegion:
+       {
+               o->parm.fillRegion->region.moveBy(m_current_offset);
+               gRegion clip = m_current_clip & o->parm.fillRegion->region;
+               m_pixmap->fill(clip, m_foreground_color);
+               delete o->parm.fillRegion;
+               break;
+       }
        case gOpcode::clear:
                m_pixmap->fill(m_current_clip, m_background_color);
                delete o->parm.fill;
@@ -355,11 +398,16 @@ void gDC::exec(gOpcode *o)
        case gOpcode::blit:
        {
                gRegion clip;
-               if (!o->parm.blit->clip.isValid())
+                               // this code should be checked again but i'm too tired now
+               
+               o->parm.blit->position += m_current_offset;
+               
+               if (o->parm.blit->clip.valid())
                {
                        clip.intersect(gRegion(o->parm.blit->clip), clip);
                } else
                        clip = m_current_clip;
+               
                m_pixmap->blit(*o->parm.blit->pixmap, o->parm.blit->position, clip, o->parm.blit->flags);
                o->parm.blit->pixmap->Release();
                delete o->parm.blit;
@@ -416,6 +464,8 @@ void gDC::exec(gOpcode *o)
                        m_current_offset  = o->parm.setOffset->value;
                delete o->parm.setOffset;
                break;
+       case gOpcode::flush:
+               break;
        default:
                eFatal("illegal opcode %d. expect memory leak!", o->opcode);
        }