X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/5a585807121575a50ac7ecc47276336f24188377..5e0d91a196bfe872d04d676e5f6c2d5940786be0:/lib/gdi/grc.cpp diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index f108a179..76c02d2d 100644 --- a/lib/gdi/grc.cpp +++ b/lib/gdi/grc.cpp @@ -106,6 +106,9 @@ void *gRC::thread() #endif if ( rp != wp ) { + /* make sure the spinner is not displayed when we something is painted */ + disableSpinner(); + gOpcode o(queue[rp++]); if ( rp == MAXSIZE ) rp=0; @@ -146,7 +149,7 @@ void *gRC::thread() if (m_spinner_enabled) timeout.tv_nsec += 100*1000*1000; else - timeout.tv_nsec += 500*1000*1000; + timeout.tv_sec += 2; /* yes, this is required. */ if (timeout.tv_nsec > 1000*1000*1000) @@ -200,11 +203,11 @@ void gRC::enableSpinner() return; } - m_spinner_enabled = 1; - gOpcode o; o.opcode = m_spinner_enabled ? gOpcode::incrementSpinner : gOpcode::enableSpinner; m_spinner_dc->exec(&o); + m_spinner_enabled = 1; + } void gRC::disableSpinner() @@ -569,14 +572,17 @@ void gPainter::end() gDC::gDC() { + m_spinner_pic = 0; } gDC::gDC(gPixmap *pixmap): m_pixmap(pixmap) { + m_spinner_pic = 0; } gDC::~gDC() { + delete[] m_spinner_pic; } void gDC::exec(gOpcode *o) @@ -752,10 +758,13 @@ void gDC::exec(gOpcode *o) case gOpcode::flush: break; case gOpcode::enableSpinner: + enableSpinner(); break; case gOpcode::disableSpinner: + disableSpinner(); break; case gOpcode::incrementSpinner: + incrementSpinner(); break; default: eFatal("illegal opcode %d. expect memory leak!", o->opcode); @@ -774,6 +783,76 @@ gRGB gDC::getRGB(gColor col) return m_pixmap->surface->clut.data[col]; } +void gDC::enableSpinner() +{ + ASSERT(m_spinner_saved); + + /* save the background to restore it later. We need to negative position because we want to blit from the middle of the screen. */ + m_spinner_saved->blit(*m_pixmap, -m_spinner_pos.topLeft(), gRegion(eRect(ePoint(0, 0), m_spinner_saved->size())), 0); + + incrementSpinner(); +} + +void gDC::disableSpinner() +{ + ASSERT(m_spinner_saved); + + /* restore background */ + m_pixmap->blit(*m_spinner_saved, m_spinner_pos.topLeft(), gRegion(m_spinner_pos), 0); +} + +void gDC::incrementSpinner() +{ + ASSERT(m_spinner_saved); + + static int blub; + blub++; + +#if 0 + int i; + + for (i = 0; i < 5; ++i) + { + int x = i * 20 + m_spinner_pos.left(); + int y = m_spinner_pos.top(); + + int col = ((blub - i) * 30) % 256; + + m_pixmap->fill(eRect(x, y, 10, 10), gRGB(col, col, col)); + } +#endif + + m_spinner_temp->blit(*m_spinner_saved, ePoint(0, 0), eRect(ePoint(0, 0), m_spinner_pos.size())); + + if (m_spinner_pic[m_spinner_i]) + m_spinner_temp->blit(*m_spinner_pic[m_spinner_i], ePoint(0, 0), eRect(ePoint(0, 0), m_spinner_pos.size()), gPixmap::blitAlphaTest); + + m_pixmap->blit(*m_spinner_temp, m_spinner_pos.topLeft(), gRegion(m_spinner_pos), 0); + m_spinner_i++; + m_spinner_i %= m_spinner_num; +} + +void gDC::setSpinner(eRect pos, ePtr *pic, int len) +{ + ASSERT(m_pixmap); + ASSERT(m_pixmap->surface); + m_spinner_saved = new gPixmap(pos.size(), m_pixmap->surface->bpp); + m_spinner_temp = new gPixmap(pos.size(), m_pixmap->surface->bpp); + m_spinner_pos = pos; + + m_spinner_i = 0; + m_spinner_num = len; + + int i; + if (m_spinner_pic) + delete[] m_spinner_pic; + + m_spinner_pic = new ePtr[len]; + + for (i = 0; i < len; ++i) + m_spinner_pic[i] = pic[i]; +} + DEFINE_REF(gDC); eAutoInitPtr init_grc(eAutoInitNumbers::graphic, "gRC");