From 8251696239ba2bb74c348a2726fab85a275ebd11 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sat, 26 May 2007 11:25:55 +0000 Subject: [PATCH] add spinner --- lib/gdi/grc.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++-- lib/gdi/grc.h | 8 +++++++ main/enigma.cpp | 1 + 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index f108a179..e5cab87e 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; @@ -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() @@ -752,10 +755,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 +780,52 @@ 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++; + + 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)); + } +} + +void gDC::setSpinner(eRect pos) +{ + ASSERT(m_pixmap); + ASSERT(m_pixmap->surface); + m_spinner_saved = new gPixmap(pos.size(), m_pixmap->surface->bpp); + m_spinner_pos = pos; +} + DEFINE_REF(gDC); eAutoInitPtr init_grc(eAutoInitNumbers::graphic, "gRC"); diff --git a/lib/gdi/grc.h b/lib/gdi/grc.h index 9f32e911..adc1d3be 100644 --- a/lib/gdi/grc.h +++ b/lib/gdi/grc.h @@ -270,6 +270,9 @@ protected: std::stack m_clip_stack; gRegion m_current_clip; + ePtr m_spinner_saved; + eRect m_spinner_pos; + public: virtual void exec(gOpcode *opcode); gDC(gPixmap *pixmap); @@ -280,6 +283,11 @@ public: gRGB getRGB(gColor col); virtual eSize size() { return m_pixmap->size(); } virtual int islocked() { return 0; } + + void enableSpinner(); + void disableSpinner(); + void incrementSpinner(); + void setSpinner(eRect pos); }; #endif diff --git a/main/enigma.cpp b/main/enigma.cpp index 4af7ca03..45c0c7b3 100644 --- a/main/enigma.cpp +++ b/main/enigma.cpp @@ -190,6 +190,7 @@ int main(int argc, char **argv) dsk.setRedrawTask(main); dsk_lcd.setRedrawTask(main); + my_dc->setSpinner(eRect(100, 100, 120, 40)); gRC::getInstance()->setSpinnerDC(my_dc); eRCInput::getInstance()->keyEvent.connect(slot(keyEvent)); -- 2.30.2