aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-06-18 19:09:36 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-06-18 19:09:36 +0000
commitae3bc8673d79edecb8fcb918d83db011535b0955 (patch)
tree3218d825b0856692ff4c795edf734a27a9dcb5dd
parentf44dfc20f4ed708d67603f767a976c1168393627 (diff)
downloadenigma2-ae3bc8673d79edecb8fcb918d83db011535b0955.tar.gz
enigma2-ae3bc8673d79edecb8fcb918d83db011535b0955.zip
hopefully fix frequently segfaults
-rw-r--r--lib/gdi/font.cpp21
-rw-r--r--lib/gdi/font.h2
-rw-r--r--lib/gdi/grc.cpp5
-rw-r--r--lib/gdi/grc.h2
-rw-r--r--lib/gui/einput.cpp2
-rw-r--r--lib/gui/elabel.cpp4
-rw-r--r--lib/service/listboxservice.cpp2
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)
{