X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/3bad22d5566624804a73b3791980bab2d84c8266..dba614edd2aad3c17e244914eaef3809d8300cb1:/lib/gdi/grc.cpp diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index 46181d32..a63aef92 100644 --- a/lib/gdi/grc.cpp +++ b/lib/gdi/grc.cpp @@ -1,5 +1,5 @@ // for debugging use: - #define SYNC_PAINT +// #define SYNC_PAINT #include #ifndef SYNC_PAINT #include @@ -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 ®ion) +{ + 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; @@ -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); } @@ -326,15 +340,31 @@ void gDC::exec(gOpcode *o) case gOpcode::renderText: { ePtr para = new eTextPara(o->parm.renderText->area); + 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, 0); + + if (o->parm.renderText->flags & gPainter::RT_HALIGN_RIGHT) + para->realign(eTextPara::dirRight); + else if (o->parm.renderText->flags & gPainter::RT_HALIGN_CENTER) + para->realign(eTextPara::dirCenter); + else if (o->parm.renderText->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 +378,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,7 +393,7 @@ void gDC::exec(gOpcode *o) case gOpcode::blit: { gRegion clip; - if (!o->parm.blit->clip.isValid()) + if (!o->parm.blit->clip.valid()) { clip.intersect(gRegion(o->parm.blit->clip), clip); } else