diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-06-18 19:09:36 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-06-18 19:09:36 +0000 |
| commit | ae3bc8673d79edecb8fcb918d83db011535b0955 (patch) | |
| tree | 3218d825b0856692ff4c795edf734a27a9dcb5dd | |
| parent | f44dfc20f4ed708d67603f767a976c1168393627 (diff) | |
| download | enigma2-ae3bc8673d79edecb8fcb918d83db011535b0955.tar.gz enigma2-ae3bc8673d79edecb8fcb918d83db011535b0955.zip | |
hopefully fix frequently segfaults
| -rw-r--r-- | lib/gdi/font.cpp | 21 | ||||
| -rw-r--r-- | lib/gdi/font.h | 2 | ||||
| -rw-r--r-- | lib/gdi/grc.cpp | 5 | ||||
| -rw-r--r-- | lib/gdi/grc.h | 2 | ||||
| -rw-r--r-- | lib/gui/einput.cpp | 2 | ||||
| -rw-r--r-- | lib/gui/elabel.cpp | 4 | ||||
| -rw-r--r-- | lib/service/listboxservice.cpp | 2 |
7 files changed, 20 insertions, 18 deletions
diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp index 2ff5fbf7..f7c1bca5 100644 --- a/lib/gdi/font.cpp +++ b/lib/gdi/font.cpp @@ -443,7 +443,7 @@ void eTextPara::setFont(Font *fnt, Font *replacement) void shape (std::vector<unsigned long> &string, const std::vector<unsigned long> &text); -int eTextPara::renderString(const std::string &string, int rflags) +int eTextPara::renderString(const char *string, int rflags) { singleLock s(ftlock); @@ -467,11 +467,12 @@ int eTextPara::renderString(const std::string &string, int rflags) } std::vector<unsigned long> uc_string, uc_visual; - uc_string.reserve(string.length()); + if (string) + uc_string.reserve(strlen(string)); - std::string::const_iterator p(string.begin()); + const char *p = string; - while(p != string.end()) + while(p) { unsigned int unicode=(unsigned char)*p++; @@ -481,28 +482,28 @@ int eTextPara::renderString(const std::string &string, int rflags) { unicode&=0x1F; unicode<<=6; - if (p != string.end()) + if (p) unicode|=(*p++)&0x3F; } else if ((unicode & 0xF0)==0xE0) // three bytes { unicode&=0x0F; unicode<<=6; - if (p != string.end()) + if (p) unicode|=(*p++)&0x3F; unicode<<=6; - if (p != string.end()) + if (p) unicode|=(*p++)&0x3F; } else if ((unicode & 0xF8)==0xF0) // four bytes { unicode&=0x07; unicode<<=6; - if (p != string.end()) + if (p) unicode|=(*p++)&0x3F; unicode<<=6; - if (p != string.end()) + if (p) unicode|=(*p++)&0x3F; unicode<<=6; - if (p != string.end()) + if (p) unicode|=(*p++)&0x3F; } } diff --git a/lib/gdi/font.h b/lib/gdi/font.h index b8983914..6cc238d7 100644 --- a/lib/gdi/font.h +++ b/lib/gdi/font.h @@ -126,7 +126,7 @@ public: static void forceReplacementGlyph(int unicode) { forced_replaces.insert(unicode); } void setFont(const gFont *font); - int renderString(const std::string &string, int flags=0); + int renderString(const char *string, int flags=0); void clear(); diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index 274d221b..ef75aace 100644 --- a/lib/gdi/grc.cpp +++ b/lib/gdi/grc.cpp @@ -237,7 +237,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); } @@ -539,7 +539,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) diff --git a/lib/gdi/grc.h b/lib/gdi/grc.h index 58371e79..11355504 100644 --- a/lib/gdi/grc.h +++ b/lib/gdi/grc.h @@ -78,7 +78,7 @@ struct gOpcode struct prenderText { eRect area; - std::string text; + char *text; int flags; } *renderText; diff --git a/lib/gui/einput.cpp b/lib/gui/einput.cpp index 62a77c5d..30dc3f02 100644 --- a/lib/gui/einput.cpp +++ b/lib/gui/einput.cpp @@ -55,7 +55,7 @@ int eInput::event(int event, void *data, void *data2) eDebug("cursor is %d", cursor); para->setFont(m_font); - para->renderString(text, 0); + para->renderString(text.empty()?0:text.c_str(), 0); int glyphs = para->size(); if (m_have_focus) diff --git a/lib/gui/elabel.cpp b/lib/gui/elabel.cpp index 591b725a..5c8e0b77 100644 --- a/lib/gui/elabel.cpp +++ b/lib/gui/elabel.cpp @@ -36,7 +36,7 @@ int eLabel::event(int event, void *data, void *data2) style->setStyle(painter, eWindowStyle::styleLabel); ePtr<eTextPara> para = new eTextPara(eRect(0, 0, size().width(), size().height())); para->setFont(m_font); - para->renderString(m_text, 0); + para->renderString(m_text.empty()?0:m_text.c_str(), 0); para->realign(eTextPara::dirLeft); int glyphs = para->size(); @@ -185,7 +185,7 @@ eSize eLabel::calculateSize() ePtr<eTextPara> p = new eTextPara(eRect(0, 0, size().width(), size().height())); p->setFont(m_font); - p->renderString(m_text, RS_WRAP); + p->renderString(m_text.empty()?0:m_text.c_str(), RS_WRAP); eRect bbox = p->getBoundBox(); return bbox.size(); diff --git a/lib/service/listboxservice.cpp b/lib/service/listboxservice.cpp index 0b7b7308..284776fd 100644 --- a/lib/service/listboxservice.cpp +++ b/lib/service/listboxservice.cpp @@ -427,7 +427,7 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const eTextPara *para = new eTextPara(tmp); para->setFont(m_element_font[e]); - para->renderString(text); + para->renderString(text.c_str()); if (e == celServiceName) { |
