Support turbo2.
[vuplus_dvbapp] / lib / gdi / grc.cpp
index 5ef6833..643e144 100644 (file)
@@ -3,6 +3,9 @@
 #include <lib/gdi/font.h>
 #include <lib/base/init.h>
 #include <lib/base/init_num.h>
+#ifdef USE_LIBVUGLES2
+#include <vuplus_gles.h>
+#endif
 
 #ifndef SYNC_PAINT
 void *gRC::thread_wrapper(void *ptr)
@@ -94,6 +97,12 @@ void gRC::submit(const gOpcode &o)
 void *gRC::thread()
 {
        int need_notify = 0;
+#ifdef USE_LIBVUGLES2
+       if (gles_open()) {
+               gles_state_open();
+               gles_viewport(720, 576, 720 * 4);
+       }
+#endif
 #ifndef SYNC_PAINT
        while (1)
        {
@@ -164,7 +173,13 @@ void *gRC::thread()
                                if (pthread_cond_timedwait(&cond, &mutex, &timeout) == ETIMEDOUT)
                                {
                                        if (eApp && !eApp->isIdle())
-                                               idle = 0;
+                                       {
+                                               int idle_count = eApp->idleCount();
+                                               if (idle_count == m_prev_idle_count)
+                                                       idle = 0;
+                                               else
+                                                       m_prev_idle_count = idle_count;
+                                       }
                                }
 
                                if (!idle)
@@ -179,6 +194,10 @@ void *gRC::thread()
 #endif
                }
        }
+#ifdef USE_LIBVUGLES2
+       gles_state_close();
+       gles_close();
+#endif
 #ifndef SYNC_PAINT
        pthread_exit(0);
 #endif
@@ -312,7 +331,7 @@ void gPainter::setFont(gFont *font)
        m_rc->submit(o);
 }
 
-void gPainter::renderText(const eRect &pos, const std::string &string, int flags)
+void gPainter::renderText(const eRect &pos, const std::string &string, int flags, gRGB bordercolor, int border)
 {
        if ( m_dc->islocked() )
                return;
@@ -323,6 +342,8 @@ void gPainter::renderText(const eRect &pos, const std::string &string, int flags
        o.parm.renderText->area = pos;
        o.parm.renderText->text = string.empty()?0:strdup(string.c_str());
        o.parm.renderText->flags = flags;
+       o.parm.renderText->border = border;
+       o.parm.renderText->bordercolor = bordercolor;
        m_rc->submit(o);
 }
 
@@ -330,6 +351,7 @@ void gPainter::renderPara(eTextPara *para, ePoint offset)
 {
        if ( m_dc->islocked() )
                return;
+       ASSERT(para);
        gOpcode o;
        o.opcode=gOpcode::renderPara;
        o.dc = m_dc.grabRef();
@@ -409,6 +431,7 @@ void gPainter::setPalette(gRGB *colors, int start, int len)
 {
        if ( m_dc->islocked() )
                return;
+       ASSERT(colors);
        gOpcode o;
        o.opcode=gOpcode::setPalette;
        o.dc = m_dc.grabRef();
@@ -434,6 +457,7 @@ void gPainter::mergePalette(gPixmap *target)
 {
        if ( m_dc->islocked() )
                return;
+       ASSERT(target);
        gOpcode o;
        o.opcode = gOpcode::mergePalette;
        o.dc = m_dc.grabRef();
@@ -569,7 +593,7 @@ void gPainter::setCompositing(gCompositingData *comp)
        m_rc->submit(o);
 }
 
-void gPainter::end()
+void gPainter::flush()
 {
        if ( m_dc->islocked() )
                return;
@@ -579,6 +603,78 @@ void gPainter::end()
        m_rc->submit(o);
 }
 
+void gPainter::end()
+{
+       if ( m_dc->islocked() )
+               return;
+}
+
+void gPainter::sendShow(ePoint point, eSize size)
+{
+       if ( m_dc->islocked() )
+               return;
+       gOpcode o;
+       o.opcode=gOpcode::sendShow;
+       o.dc = m_dc.grabRef();
+       o.parm.setShowHideInfo = new gOpcode::para::psetShowHideInfo;
+       o.parm.setShowHideInfo->point = point;
+       o.parm.setShowHideInfo->size = size;
+       m_rc->submit(o);
+}
+
+void gPainter::sendHide(ePoint point, eSize size)
+{
+       if ( m_dc->islocked() )
+               return;
+       gOpcode o;
+       o.opcode=gOpcode::sendHide;
+       o.dc = m_dc.grabRef();
+       o.parm.setShowHideInfo = new gOpcode::para::psetShowHideInfo;
+       o.parm.setShowHideInfo->point = point;
+       o.parm.setShowHideInfo->size = size;
+       m_rc->submit(o);
+}
+
+#ifdef USE_LIBVUGLES2
+void gPainter::sendShowItem(long dir, ePoint point, eSize size)
+{
+       if ( m_dc->islocked() )
+               return;
+       gOpcode o;
+       o.opcode=gOpcode::sendShowItem;
+       o.dc = m_dc.grabRef();
+       o.parm.setShowItemInfo = new gOpcode::para::psetShowItemInfo;
+       o.parm.setShowItemInfo->dir = dir;
+       o.parm.setShowItemInfo->point = point;
+       o.parm.setShowItemInfo->size = size;
+       m_rc->submit(o);
+}
+
+void gPainter::setFlush(bool val)
+{
+       if ( m_dc->islocked() )
+               return;
+       gOpcode o;
+       o.opcode=gOpcode::setFlush;
+       o.dc = m_dc.grabRef();
+       o.parm.setFlush = new gOpcode::para::psetFlush;
+       o.parm.setFlush->enable = val;
+       m_rc->submit(o);
+}
+
+void gPainter::setView(eSize size)
+{
+       if ( m_dc->islocked() )
+               return;
+       gOpcode o;
+       o.opcode=gOpcode::setView;
+       o.dc = m_dc.grabRef();
+       o.parm.setViewInfo = new gOpcode::para::psetViewInfo;
+       o.parm.setViewInfo->size = size;
+       m_rc->submit(o);
+}
+#endif
+
 gDC::gDC()
 {
        m_spinner_pic = 0;
@@ -594,7 +690,7 @@ gDC::~gDC()
        delete[] m_spinner_pic;
 }
 
-void gDC::exec(gOpcode *o)
+void gDC::exec(const gOpcode *o)
 {
        switch (o->opcode)
        {
@@ -631,7 +727,7 @@ void gDC::exec(gOpcode *o)
                int flags = o->parm.renderText->flags;
                ASSERT(m_current_font);
                para->setFont(m_current_font);
-               para->renderString(o->parm.renderText->text, (flags & gPainter::RT_WRAP) ? RS_WRAP : 0);
+               para->renderString(o->parm.renderText->text, (flags & gPainter::RT_WRAP) ? RS_WRAP : 0, o->parm.renderText->border);
                if (o->parm.renderText->text)
                        free(o->parm.renderText->text);
                if (flags & gPainter::RT_HALIGN_RIGHT)
@@ -650,8 +746,14 @@ void gDC::exec(gOpcode *o)
                        int correction = vcentered_top - bbox.top();
                        offset += ePoint(0, correction);
                }
-               
-               para->blit(*this, offset, m_background_color_rgb, m_foreground_color_rgb);
+
+               if (o->parm.renderText->border)
+               {
+                       para->blit(*this, offset, m_background_color_rgb, o->parm.renderText->bordercolor, true);
+                       para->blit(*this, offset, o->parm.renderText->bordercolor, m_foreground_color_rgb);
+               }
+               else
+                       para->blit(*this, offset, m_background_color_rgb, m_foreground_color_rgb);
                delete o->parm.renderText;
                break;
        }
@@ -766,6 +868,18 @@ void gDC::exec(gOpcode *o)
                break;
        case gOpcode::flush:
                break;
+       case gOpcode::sendShow:
+               break;
+       case gOpcode::sendHide:
+               break;
+#ifdef USE_LIBVUGLES2
+       case gOpcode::sendShowItem:
+               break;
+       case gOpcode::setFlush:
+               break;
+       case gOpcode::setView:
+               break;
+#endif
        case gOpcode::enableSpinner:
                enableSpinner();
                break;