X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/6e072aff91b3a8d4e0f880c661f4c41a594e6c8a..225c99450eab2aba7aa0e8ea3d2ff73da2910d46:/lib/gdi/grc.cpp diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index 35626a93..736630a8 100644 --- a/lib/gdi/grc.cpp +++ b/lib/gdi/grc.cpp @@ -1,10 +1,4 @@ -// for debugging use: -// #define SYNC_PAINT #include -#ifndef SYNC_PAINT -#include -#endif - #include #include #include @@ -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: