rotor turning with measure input power is now working
[enigma2.git] / lib / gdi / grc.cpp
index 137e92d..756ed9b 100644 (file)
@@ -1,5 +1,5 @@
 // for debugging use:
- #define SYNC_PAINT
+#define SYNC_PAINT
 #include <unistd.h>
 #ifndef SYNC_PAINT
 #include <pthread.h>
@@ -116,6 +116,28 @@ void gPainter::setForegroundColor(const gColor &color)
        m_rc->submit(o);
 }
 
+void gPainter::setBackgroundColor(const gRGB &color)
+{
+       gOpcode o;
+       o.opcode = gOpcode::setBackgroundColorRGB;
+       o.dc = m_dc.grabRef();
+       o.parm.setColorRGB = new gOpcode::para::psetColorRGB;
+       o.parm.setColorRGB->color = color;
+       
+       m_rc->submit(o);
+}
+
+void gPainter::setForegroundColor(const gRGB &color)
+{
+       gOpcode o;
+       o.opcode = gOpcode::setForegroundColorRGB;
+       o.dc = m_dc.grabRef();
+       o.parm.setColorRGB = new gOpcode::para::psetColorRGB;
+       o.parm.setColorRGB->color = color;
+       
+       m_rc->submit(o);
+}
+
 void gPainter::setFont(gFont *font)
 {
        gOpcode o;
@@ -188,7 +210,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();
@@ -218,12 +240,19 @@ void gPainter::setPalette(gRGB *colors, int start, int len)
        m_rc->submit(o);
 }
 
+void gPainter::setPalette(gPixmap *source)
+{
+       ASSERT(source);
+       setPalette(source->surface->clut.data, source->surface->clut.start, source->surface->clut.colors);
+}
+
 void gPainter::mergePalette(gPixmap *target)
 {
        gOpcode o;
-       o.opcode=gOpcode::mergePalette;
+       o.opcode = gOpcode::mergePalette;
        o.dc = m_dc.grabRef();
        target->AddRef();
+       o.parm.mergePalette = new gOpcode::para::pmergePalette;
        o.parm.mergePalette->target = target;
        m_rc->submit(o);
 }
@@ -302,6 +331,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()
@@ -332,6 +365,14 @@ void gDC::exec(gOpcode *o)
                m_foreground_color = o->parm.setColor->color;
                delete o->parm.setColor;
                break;
+       case gOpcode::setBackgroundColorRGB:
+               m_background_color = m_pixmap->surface->clut.findColor(o->parm.setColorRGB->color);
+               delete o->parm.setColorRGB;
+               break;
+       case gOpcode::setForegroundColorRGB:
+               m_foreground_color = m_pixmap->surface->clut.findColor(o->parm.setColorRGB->color);
+               delete o->parm.setColorRGB;
+               break;
        case gOpcode::setFont:
                m_current_font = o->parm.setFont->font;
                o->parm.setFont->font->Release();
@@ -340,15 +381,16 @@ 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, 0);
+               para->renderString(o->parm.renderText->text, (flags & gPainter::RT_WRAP) ? RS_WRAP : 0);
                
-               if (o->parm.renderText->flags & gPainter::RT_HALIGN_RIGHT)
+               if (flags & gPainter::RT_HALIGN_RIGHT)
                        para->realign(eTextPara::dirRight);
-               else if (o->parm.renderText->flags & gPainter::RT_HALIGN_CENTER)
+               else if (flags & gPainter::RT_HALIGN_CENTER)
                        para->realign(eTextPara::dirCenter);
-               else if (o->parm.renderText->flags & gPainter::RT_HALIGN_BLOCK)
+               else if (flags & gPainter::RT_HALIGN_BLOCK)
                        para->realign(eTextPara::dirBlock);
                
                ePoint offset = m_current_offset;
@@ -393,11 +435,17 @@ void gDC::exec(gOpcode *o)
        case gOpcode::blit:
        {
                gRegion clip;
-               if (!o->parm.blit->clip.valid())
+                               // 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);
+                       o->parm.blit->clip.moveBy(m_current_offset);
+                       clip.intersect(gRegion(o->parm.blit->clip), m_current_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,12 +464,10 @@ void gDC::exec(gOpcode *o)
                delete o->parm.setPalette;
                break;
        case gOpcode::mergePalette:
-#if 0
-               pixmap->mergePalette(*o->parm.blit->pixmap);
-               o->parm.blit->pixmap->unlock();
-               delete o->parm.blit;
-#endif
-               break;
+               m_pixmap->mergePalette(*o->parm.mergePalette->target);
+               o->parm.mergePalette->target->Release();
+               delete o->parm.mergePalette;
+               break; 
        case gOpcode::line:
        {
                ePoint start = o->parm.line->start + m_current_offset, end = o->parm.line->end + m_current_offset;
@@ -437,7 +483,7 @@ void gDC::exec(gOpcode *o)
                break;
        case gOpcode::setClip:
                o->parm.clip->region.moveBy(m_current_offset);
-               m_current_clip = o->parm.clip->region & eRect(ePoint(0, 0), m_pixmap->getSize());
+               m_current_clip = o->parm.clip->region & eRect(ePoint(0, 0), m_pixmap->size());
                delete o->parm.clip;
                break;
        case gOpcode::popClip:
@@ -454,6 +500,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);
        }